diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3809fce --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +**/.DS_Store +**/EGG-INFO +**/*.pyc +**/.ipynb_checkpoints/ +.idea +.tools +.venv/** +docs/_build +build +dist +results +wft4galaxy.egg-info +wft4galaxy/wft4galaxy.properties diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..8045880 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,46 @@ +sudo: required + +language: python + +python: + - "2.7" + - "3.6" + +services: + - docker + + +env: + global: + - GALAXY_CONFIG_MASTER_API_KEY=HSNiugRFvgT574F43jZ7N9F3 + - GALAXY_NETWORK=galaxy + - GALAXY_ADDRESS=172.18.0.22 + - GALAXY_PORT=80 + - GALAXY_DOCKER_HOST=127.0.0.1 + - GALAXY_URL=http://${GALAXY_DOCKER_HOST}:${GALAXY_PORT} + - GALAXY_CONTAINER_NAME=galaxy-server + - GALAXY_USERNAME=wft4galaxy + - GALAXY_USER_PASSWORD=wft4galaxy-tester + - GALAXY_USER_EMAIL=wft4galaxy@wft.it + + +before_install: +- pip install -r requirements.txt +- docker network create --driver bridge --subnet=172.18.0.0/16 ${GALAXY_NETWORK} +- utils/docker/start-galaxy.sh --debug --master-api-key ${GALAXY_CONFIG_MASTER_API_KEY} --network ${GALAXY_NETWORK} --ip ${GALAXY_ADDRESS} --port ${GALAXY_PORT} --docker-host ${GALAXY_DOCKER_HOST} --container-name ${GALAXY_CONTAINER_NAME} +- utils/docker/create-galaxy-user.py --debug --server ${GALAXY_URL} --api-key ${GALAXY_CONFIG_MASTER_API_KEY} ${GALAXY_USERNAME} ${GALAXY_USER_PASSWORD} ${GALAXY_USER_EMAIL} --with-api-key + +install: +- python setup.py install + +script: +- GALAXY_API_KEY=$(cat "wft4galaxy.id") +- tests/comparators/run_all +- wft4galaxy -f examples/change_case/workflow-test.yml --server ${GALAXY_URL} --api-key ${GALAXY_API_KEY} +- export GALAXY_URL=http://${GALAXY_ADDRESS} # use the address of the Galaxy container within the Docker network +- branch=${TRAVIS_PULL_REQUEST_BRANCH:-${TRAVIS_BRANCH}} +- tests/docker/run-all.sh --branch ${branch} --server ${GALAXY_URL} --api-key ${GALAXY_API_KEY} --network ${GALAXY_NETWORK} + + +after_script: +- docker rm -f ${GALAXY_CONTAINER_NAME} \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..bb61559 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,175 @@ +Copyright (c) 2016-2017 CRS4 + +Licensed under the Academic Free License version 3.0 + + 1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free, + non-exclusive, sublicensable license, for the duration of the copyright, to + do the following: + + a) to reproduce the Original Work in copies, either alone or as part of a + collective work; + + b) to translate, adapt, alter, transform, modify, or arrange the Original + Work, thereby creating derivative works ("Derivative Works") based upon + the Original Work; + + c) to distribute or communicate copies of the Original Work and Derivative + Works to the public, under any license of your choice that does not + contradict the terms and conditions, including Licensor's reserved + rights and remedies, in this Academic Free License; + + d) to perform the Original Work publicly; and + + e) to display the Original Work publicly. + + 2) Grant of Patent License. Licensor grants You a worldwide, royalty-free, + non-exclusive, sublicensable license, under patent claims owned or + controlled by the Licensor that are embodied in the Original Work as + furnished by the Licensor, for the duration of the patents, to make, use, + sell, offer for sale, have made, and import the Original Work and + Derivative Works. + + 3) Grant of Source Code License. The term "Source Code" means the preferred + form of the Original Work for making modifications to it and all available + documentation describing how to modify the Original Work. Licensor agrees + to provide a machine-readable copy of the Source Code of the Original Work + along with each copy of the Original Work that Licensor distributes. + Licensor reserves the right to satisfy this obligation by placing a + machine-readable copy of the Source Code in an information repository + reasonably calculated to permit inexpensive and convenient access by You + for as long as Licensor continues to distribute the Original Work. + + 4) Exclusions From License Grant. Neither the names of Licensor, nor the + names of any contributors to the Original Work, nor any of their + trademarks or service marks, may be used to endorse or promote products + derived from this Original Work without express prior permission of the + Licensor. Except as expressly stated herein, nothing in this License + grants any license to Licensor's trademarks, copyrights, patents, trade + secrets or any other intellectual property. No patent license is granted + to make, use, sell, offer for sale, have made, or import embodiments of + any patent claims other than the licensed claims defined in Section 2. + No license is granted to the trademarks of Licensor even if such marks + are included in the Original Work. Nothing in this License shall be + interpreted to prohibit Licensor from licensing under terms different + from this License any Original Work that Licensor otherwise would have a + right to license. + + 5) External Deployment. The term "External Deployment" means the use, + distribution, or communication of the Original Work or Derivative Works + in any way such that the Original Work or Derivative Works may be used by + anyone other than You, whether those works are distributed or + communicated to those persons or made available as an application + intended for use over a network. As an express condition for the grants + of license hereunder, You must treat any External Deployment by You of + the Original Work or a Derivative Work as a distribution under + section 1(c). + + 6) Attribution Rights. You must retain, in the Source Code of any Derivative + Works that You create, all copyright, patent, or trademark notices from + the Source Code of the Original Work, as well as any notices of licensing + and any descriptive text identified therein as an "Attribution Notice." + You must cause the Source Code for any Derivative Works that You create + to carry a prominent Attribution Notice reasonably calculated to inform + recipients that You have modified the Original Work. + + 7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that + the copyright in and to the Original Work and the patent rights granted + herein by Licensor are owned by the Licensor or are sublicensed to You + under the terms of this License with the permission of the contributor(s) + of those copyrights and patent rights. Except as expressly stated in the + immediately preceding sentence, the Original Work is provided under this + License on an "AS IS" BASIS and WITHOUT WARRANTY, either express or + implied, including, without limitation, the warranties of + non-infringement, merchantability or fitness for a particular purpose. + THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. This + DISCLAIMER OF WARRANTY constitutes an essential part of this License. + No license to the Original Work is granted by this License except under + this disclaimer. + + 8) Limitation of Liability. Under no circumstances and under no legal + theory, whether in tort (including negligence), contract, or otherwise, + shall the Licensor be liable to anyone for any indirect, special, + incidental, or consequential damages of any character arising as a result + of this License or the use of the Original Work including, without + limitation, damages for loss of goodwill, work stoppage, computer failure + or malfunction, or any and all other commercial damages or losses. This + limitation of liability shall not apply to the extent applicable law + prohibits such limitation. + + 9) Acceptance and Termination. If, at any time, You expressly assented to + this License, that assent indicates your clear and irrevocable acceptance + of this License and all of its terms and conditions. If You distribute or + communicate copies of the Original Work or a Derivative Work, You must + make a reasonable effort under the circumstances to obtain the express + assent of recipients to the terms of this License. This License + conditions your rights to undertake the activities listed in Section 1, + including your right to create Derivative Works based upon the Original + Work, and doing so without honoring these terms and conditions is + prohibited by copyright law and international treaty. Nothing in this + License is intended to affect copyright exceptions and limitations + (including "fair use" or "fair dealing"). This License shall terminate + immediately and You may no longer exercise any of the rights granted to + You by this License upon your failure to honor the conditions in + Section 1(c). + +10) Termination for Patent Action. This License shall terminate + automatically and You may no longer exercise any of the rights granted + to You by this License as of the date You commence an action, including + a cross-claim or counterclaim, against Licensor or any licensee alleging + that the Original Work infringes a patent. This termination provision + shall not apply for an action alleging patent infringement by + combinations of the Original Work with other software or hardware. + +11) Jurisdiction, Venue and Governing Law. Any action or suit relating to + this License may be brought only in the courts of a jurisdiction wherein + the Licensor resides or in which Licensor conducts its primary business, + and under the laws of that jurisdiction excluding its conflict-of-law + provisions. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. Any + use of the Original Work outside the scope of this License or after its + termination shall be subject to the requirements and penalties of + copyright or patent law in the appropriate jurisdiction. This section + shall survive the termination of this License. + +12) Attorneys' Fees. In any action to enforce the terms of this License or + seeking damages relating thereto, the prevailing party shall be entitled + to recover its costs and expenses, including, without limitation, + reasonable attorneys' fees and costs incurred in connection with such + action, including any appeal of such action. This section shall survive + the termination of this License. + +13) Miscellaneous. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. + +14) Definition of "You" in This License. "You" throughout this License, + whether in upper or lower case, means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with you. For purposes of this + definition, "control" means (i) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + +15) Right to Use. You may use the Original Work in all ways not otherwise + restricted or conditioned by this License or by law, and Licensor + promises not to interfere with or be responsible for such uses by You. + +16) Modification of This License. This License is Copyright © 2005 Lawrence + Rosen. Permission is granted to copy, distribute, or communicate this + License without modification. Nothing in this License permits You to + modify this License as applied to the Original Work or to Derivative + Works. However, You may modify the text of this License and copy, + distribute or communicate your modified version (the "Modified + License") and apply it to other original works of authorship subject to + the following conditions: (i) You may not indicate in any way that your + Modified License is the "Academic Free License" or "AFL" and you may not + use those names in the name of your Modified License; (ii) You must + replace the notice specified in the first paragraph above with the + notice "Licensed under " or with a notice + of your own that is not confusingly similar to the notice in this + License; and (iii) You may not claim that your original works are open + source software unless your Modified License has been approved by Open + Source Initiative (OSI) and You comply with its license review and + certification process. diff --git a/README.md b/README.md index e69de29..1c14077 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,74 @@ +# wft4galaxy:
Workflow Tester for Galaxy + +[![Build Status](https://travis-ci.org/phnmnl/wft4galaxy.svg?branch=master)](https://travis-ci.org/phnmnl/wft4galaxy) + +## Description +**wft4galaxy** is a Python module which allows to automate the running of Galaxy workflow tests. It can be used either as local Python library or a Docker image running inside a Docker container. + +## Installation + +Basically, to install **wft4galaxy** as a local Python library, you need to follow the two speps below: + + 1. clone the github repository: + + ```bash + git clone https://github.com/phnmnl/wft4galaxy + ``` + + 2. install the module using the usual setup script: + + ```bash + cd wft4galaxy + python setup.py install + ``` + +> **Notice**. If you are using a Linux based system, like *Ubuntu*, you probably need to install the two libraries **`python-lxml`** and **`libyaml-dev`** as a further *prerequisite*. + + +Alternatively, you can use **wft4galaxy** with Docker (see [Docker-based Installation](http://wft4galaxy.readthedocs.io/installation.html#id2)). + +## Usage Instructions + +If you have installed **wft4galaxy** as native Python library, you can launch it from your terminal: + +``` bash +wft4galaxy [options] +``` + +The the main available options are: + +```bash +usage: wft4galaxy [-h] [--server GALAXY_URL] [--api-key GALAXY_API_KEY] + [-f FILE] [--enable-logger] [--debug] [--disable-cleanup] + [--output-format {text,xunit}] [--xunit-file FILE_PATH] [-o PATH] + [test [test ...]] + +positional arguments: + test Workflow Test Name + +optional arguments: + -h, --help show this help message and exit + --server GALAXY_URL Galaxy server URL + --api-key GALAXY_API_KEY Galaxy server API KEY + -f FILE, --file FILE YAML configuration file of workflow tests (default is workflow-test-suite.yml) + --enable-logger Enable log messages + --debug Enable debug mode + --disable-cleanup Disable cleanup + --output-format {text,xunit} Choose output type + --xunit-file FILE_PATH Set the path of the xUnit report file (absolute or relative to the output folder) + -o PATH, --output PATH Path of the output folder +``` + +As an example, you can run tests defined in your ``workflow-test-suite.yml`` definition file by typing: + +```bash +wft4galaxy +``` + +Alternatively, you can run one or more tests (e.g., ``change_case``) in your definition file specifying their names: + +```bash + wft4galaxy change_case + ``` + +See [documentation](http://wft4galaxy.readthedocs.io/) for more details. diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..021d254 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,225 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " epub3 to make an epub3" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + @echo " dummy to check syntax errors of document sources" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Prova.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Prova.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Prova" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Prova" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: epub3 +epub3: + $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 + @echo + @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." + +.PHONY: dummy +dummy: + $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy + @echo + @echo "Build finished. Dummy builder generates no files." diff --git a/docs/api.rst b/docs/api.rst new file mode 100644 index 0000000..78a2474 --- /dev/null +++ b/docs/api.rst @@ -0,0 +1,45 @@ +.. _api: + +################################################### +:mod:`wft4galaxy` --- WorkflowTester for Galaxy API +################################################### + +.. + . . automodule : : wft4galaxy + :members: + +================ +Core Classes +================ + +WorkflowTestCase +---------------- +.. autoclass:: wft4galaxy.core.WorkflowTestCase + :members: + + +WorkflowTestSuite +----------------- +.. autoclass:: wft4galaxy.core.WorkflowTestSuite + :members: + + +Base comparator function +------------------------ +.. autofunction:: wft4galaxy.comparators.base_comparator + + + +================= +Bioblend Wrappers +================= + +Workflow +----------------------- +.. autoclass:: wft4galaxy.wrapper.Workflow + :members: + +History +----------------------- +.. autoclass:: wft4galaxy.wrapper.History + :members: diff --git a/docs/ci-tools-integration.rst b/docs/ci-tools-integration.rst new file mode 100644 index 0000000..8a6d461 --- /dev/null +++ b/docs/ci-tools-integration.rst @@ -0,0 +1,42 @@ +.. _ci_tools_integration: + +========================= +Integration with CI tools +========================= + +``wft4galaxy`` can be easily integrated with `Continous Integration` (CI) tools like `Jenkins `_. + +A typical approach is to create a repository (e.g., Git) to host your workflow and its tests, which can be defined as ``wft4galaxy`` tests. +More specifically, ,the repository needs to include: + + 1. the `test definition file`, containing the definition all workflow tests (see :ref:`config_file` for more information); + 2. every resource referenced in the definition file above, such as input and expected output datasets. + +Finally, for proper continuous integration you should configure your CI tool: + + (a) to be notified every time a changes are committed to your workflow repository; + (b) to start wft4galaxy tests automatically. + +How do this in practice depends on the specific CI tool you choose. However, in principle you'll need to configure your tool to launch ``wft4galaxy`` to run the tests defined for your workflows. + +.. note:: Remember that to run wft4galaxy from your CI tool you have three alternatives: + + 1. **wft4galaxy** script, if wft4galaxy is installed and accessible from your CI tool's execution environment or if you install wft4galaxy as a step in your CI testing script; + 2. **wft4galaxy-docker** script, which can be downloaded on the fly and used to run wft4galaxy tests within a Docker container (in this case, your CI tool must support Docker); + 3. **direct docker usage** (see :ref:`notebooks/6_direct_docker_usage.ipynb` for an example). + + +Jenkins Integration +=================== + +To configure a Jenkins project to use `wft4galaxy` to test workflows hosted on +Github, follow this procedure. + + 1. Create a new `free style software project`; + 2. Set your Git repository in the project box; + 3. Set Git as your `Source Code Management` and then the URL of your Git repository; + 4. Check the box `Build when a change is pushed to Github`; + 5. Add a new `Execute Shell` build step; + 6. From the `Execute Shell` box call the ``wft4galaxy`` tool to run your workflow tests (see note above); + 7. Save the configuration of your Jenkins project; + 8. Set the proper `Webhook` in your GitHub repository to notify the Jenkins instance when a change happens (i.e., in `Webhooks & Services > Jenkins plugin` put the URL of your Jenkins instance). diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..b09371a --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,430 @@ +# -*- coding: utf-8 -*- +# +# wft4galaxy documentation build configuration file, created by +# sphinx-quickstart on Tue Nov 1 17:50:34 2016. +# + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) +import os +import sys + +# update PYTHONPATH +sys.path.insert(0, os.path.abspath('..')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.doctest', + 'sphinx.ext.coverage', + 'sphinx.ext.mathjax', + 'sphinx.ext.viewcode', + 'nbsphinx', + 'sphinx.ext.mathjax' +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The encoding of source files. +# +# source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'wft4galaxy' +copyright = u'2016, CRS4' +author = u'Marco Enrico Piras, Luca Pireddu' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'0.1' +# The full version, including alpha/beta/rc tags. +release = u'0.1' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# +# today = '' +# +# Else, today_fmt is used as the format for a strftime call. +# +# today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', '**.ipynb_checkpoints'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +# +# default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +# +# add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +# +# add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +# +# show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +# modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +# keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +# html_theme_path = [] + +# The name for this set of Sphinx documents. +# " v documentation" by default. +# +# html_title = u'Prova v0.1' + +# A shorter title for the navigation bar. Default is the same as html_title. +# +# html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# +# html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# +# html_favicon = None + +# 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'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +# +# html_extra_path = [] + +# If not None, a 'Last updated on:' timestamp is inserted at every page +# bottom, using the given strftime format. +# The empty string is equivalent to '%b %d, %Y'. +# +# html_last_updated_fmt = None + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +# +# html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# +# html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# +# html_additional_pages = {} + +# If false, no module index is generated. +# +# html_domain_indices = True + +# If false, no index is generated. +# +# html_use_index = True + +# If true, the index is split into individual pages for each letter. +# +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +# +# html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +# +# html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +# +# html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# +# html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' +# +# html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# 'ja' uses this config value. +# 'zh' user can custom change `jieba` dictionary path. +# +# html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +# +# html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'wft4galaxy_doc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'wft4galaxy.tex', u'wft4galaxy Documentation', + u'', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# +# latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# +# latex_use_parts = False + +# If true, show page references after internal links. +# +# latex_show_pagerefs = False + +# If true, show URL addresses after external links. +# +# latex_show_urls = False + +# Documents to append as an appendix to all manuals. +# +# latex_appendices = [] + +# It false, will not define \strong, \code, itleref, \crossref ... but only +# \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added +# packages. +# +# latex_keep_old_macro_names = True + +# If false, no module index is generated. +# +# latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'wft4galaxy', u'wft4galaxy Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +# +# man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'wft4galaxy', u'wft4galaxy Documentation', + author, '', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +# +# texinfo_appendices = [] + +# If false, no module index is generated. +# +# texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +# +# texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +# +# texinfo_no_detailmenu = False + + +# -- Options for Epub output ---------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project +epub_author = author +epub_publisher = author +epub_copyright = copyright + +# The basename for the epub file. It defaults to the project name. +# epub_basename = project + +# The HTML theme for the epub output. Since the default themes are not +# optimized for small screen space, using the same theme for HTML and epub +# output is usually not wise. This defaults to 'epub', a theme designed to save +# visual space. +# +# epub_theme = 'epub' + +# The language of the text. It defaults to the language option +# or 'en' if the language is not set. +# +# epub_language = '' + +# The scheme of the identifier. Typical schemes are ISBN or URL. +# epub_scheme = '' + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A tuple containing the cover image and cover page html template filenames. +# +# epub_cover = () + +# A sequence of (type, uri, title) tuples for the guide element of content.opf. +# +# epub_guide = () + +# HTML files that should be inserted before the pages created by sphinx. +# The format is a list of tuples containing the path and title. +# +# epub_pre_files = [] + +# HTML files that should be inserted after the pages created by sphinx. +# The format is a list of tuples containing the path and title. +# +# epub_post_files = [] + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + +# The depth of the table of contents in toc.ncx. +# +# epub_tocdepth = 3 + +# Allow duplicate toc entries. +# +# epub_tocdup = True + +# Choose between 'default' and 'includehidden'. +# +# epub_tocscope = 'default' + +# Fix unsupported image types using the Pillow. +# +# epub_fix_images = False + +# Scale large images. +# +# epub_max_image_width = 0 + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +# +# epub_show_urls = 'inline' + +# If false, no index is generated. +# +# epub_use_index = True + +autodoc_member_order = 'bysource' +# autoclass_content = 'init' diff --git a/docs/docker.rst b/docs/docker.rst new file mode 100644 index 0000000..030a8f6 --- /dev/null +++ b/docs/docker.rst @@ -0,0 +1,206 @@ +.. _docker: + +===================== +Dockerized wft4galaxy +===================== + +**wft4galaxy** can also run within a Docker container, without installation. + +To simplify the usage of the Docker images by command line, we provide a simple script mainly intended to allow users \ +to interact with the dockerized version of the tool as if it was “native”, i.e., like a locally installed wft4galaxy. +This script is called **wft4galaxy-docker**. + +**wft4galaxy-docker** supports different options; type ``wft4galaxy-docker --help`` to see all them: + +.. code-block:: bash + :name: wft4galaxy-docker-help + :caption: wft4galaxy-docker --help + + usage: wft4galaxy-docker [-h] [--registry REGISTRY] [--repository REPO] + [--version VERSION] [--image IMAGE] + [--os {alpine,ubuntu}] [--skip-update] + [--server SERVER] [--api-key API_KEY] [--port PORT] + [--volume VOLUME] [--debug] + {jupyter,runtest,generate-test,ipython,generate-template,bash} + ... + + optional arguments: + -h, --help show this help message and exit + --registry REGISTRY Alternative Docker registry (default is "DockerHub") + --repository REPO Alternative Docker repository containing the "wft4galaxy" Docker image (default is "crs4") + --version VERSION Alternative version of the "wft4galaxy" Docker image(default is "latest") + --image IMAGE Alternative "wft4galaxy" Docker image name specified as NAME:TAG + --os {alpine,ubuntu} Base OS of the Docker image (default is "alpine" and it is ignored when the "--image" option is specified) + --skip-update Skip the update of the "wft4galaxy" Docker image and use the local version if it is available + --server SERVER Galaxy server URL + --api-key API_KEY Galaxy server API KEY + --port PORT Docker port to expose + --volume VOLUME Docker volume to mount + --debug Enable debug mode + + Container entrypoint: + Available entrypoints for the 'wft4galaxy' Docker image. + + {jupyter,runtest,generate-test,ipython,generate-template,bash} + Choose one of the following options: + jupyter Execute the "Jupyter" server as entrypoint + runtest Execute the "wft4galaxy" tool as entrypoint (default) + generate-test Execute the "generate-test" wizard command as entrypoint + ipython Execute the "Ipython" shell as entrypoint + generate-template Execute the "generate-template" wizard command as entrypoint + bash Execute the "Bash" shell as entrypoint + + + +**Which Galaxy?** + +You specify which Galaxy instance ``wft4galaxy-docker`` should use by setting these two environment variables \ +which are automagically injected on Docker containers: + +.. code-block:: bash + + GALAXY_URL Galaxy URL + GALAXY_API_KEY User API key + +You can override this behaviour from the command line with these switches: + +.. code-block:: bash + + --server SERVER Galaxy server URL + --api-key API_KEY Galaxy server API KEY + + +----------- +Basic Usage +----------- + +As a first basic use case, \ +you can use ``wft4galaxy-docker`` to launch your Galaxy workflow tests just as you would with the ``wft4galaxy`` script \ +provided by native installation of **wft4galaxy** (see ":ref:`installation`" section). +This corresponds to launch ``wft4galaxy-docker`` with the argument ``runtest``, which is its default execution mode. + +Thus, you can run all the tests defined in a workflow test suite definition file, \ +like ``examples/workflow-testsuite-conf.yml`` (see ":ref:`notebooks/1_define_test_suite.ipynb`" and \ +":ref:`test_definition_file`" for more details), by simply typing: + + +.. code-block:: bash + :name: wft4galaxy-docker-runtest + + wft4galaxy-docker runtest -f examples/workflow-testsuite-conf.yml + + +Being the default command, `runtest` can be omitted: + +.. code-block:: bash + :name: wft4galaxy-docker-runtest-omitted + + wft4galaxy-docker -f examples/workflow-testsuite-conf.yml + + +That is, the same syntax supported by the ``wft4galaxy`` script (see ":ref:`notebooks/0_basic_usage.ipynb`"). + +The other basic two use cases for ``wft4galaxy-docker`` deal with the *wizard* feature \ +that wft4galaxy provides (see :ref:`wizard_tool`). For example, you can generate a test-suite template folder: + +.. code-block:: bash + :name: wft4galaxy-docker-generate-template + + wft4galaxy-docker -o MyTestSuite generate-template + + +or generate a test from a Galaxy history: + +.. code-block:: bash + :name: wft4galaxy-docker-generate-test + + wft4galaxy-docker -o MyTestSuite generate-test MyHistoryName + + + +----------------------------- +Development Usage +----------------------------- + +The ``wft4galaxy-docker`` script also provides several advanced usage commands mainly intended for development purposes. +They provide you a development environment with wft4galaxy already installed, configured and +ready to use running within a Docker container, where you can interact with wft4galaxy +either via its main `wft4galaxy` command (see :ref:`notebooks/0_basic_usage.ipynb`) +or programmatically, using its API (see :ref:`api`). + +Specifically, the dockerized development environments are: + +=========================== ============================= +Environment wft4galaxy-docker CMD +=========================== ============================= +BASH shell ``wft4galaxy-docker bash`` +ipython interpreter ``wft4galaxy-docker ipython`` +jupyter notebook server ``wft4galaxy-docker jupyter`` +=========================== ============================= + + +.. note:: The default port of the jupyter notebook server is **9876**: \ + use ``--web-port`` to change it. + + + +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Customized container instances +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +**wft4galaxy-docker** allows to customize your running container set-up with a Docker-like syntax: + +=========================== ================================================ +mount a volume ``-volume myhost-folder:/container-host-folder`` +expose a port ``--port 8888:80`` +=========================== ================================================ + + +^^^^^^^^^^^^^^^^^^ +Customized images +^^^^^^^^^^^^^^^^^^ + +The wft4galaxy Docker images officially supported are based on Alpine and Ubuntu Linux. +The two versions are equivalent since they have the same set of packages installed. +But the ``alpine`` linux version is used by default due to its smaller size (~250 MB), +about the half of the equivalent based on ubuntu (~548.3 MB). +You can use the option ``--os [alpine|ubuntu]`` to choose which use. + + +You can also build your custom Docker image and tell ``wft4galaxy-docker`` how to pull it by using the options: + +.. code-block:: bash + + --registry REGISTRY Alternative Docker registry (default is "DockerHub") + --repository REPO Alternative Docker repository containing the "wft4galaxy" Docker image (default is "crs4") + --version VERSION Alternative version of the "wft4galaxy" Docker image(default is "latest") + --image IMAGE Alternative "wft4galaxy" Docker image name specified as NAME:TAG + + +.. note:: When you launch ``wft4galaxy-docker``, by default it tries to pull the latest version \ + of Docker image it requires. To avoid this behaviour we can launch it with the option ``--skip-update`` \ + which forces the use of your local available version of the required Docker image. + + + +------------------- +Direct Docker Usage +------------------- + +For a direct Docker usage the following syntax holds: + +.. code-block:: bash + + docker run -it --rm [DOCKER_OPTIONS] crs4/wft4galaxy[-develop]:[image-version-tag] \ + [ENTRYPOINT_OPTIONS] + +.. note:: When using ``docker`` directly you will need to explicitly mount the volumes that are required \ + to read the configuration file of your suite and to write results. + + +.. toctree:: + :hidden: + + Example + +You can find an example :ref:`here `. diff --git a/docs/examples b/docs/examples new file mode 120000 index 0000000..a6573af --- /dev/null +++ b/docs/examples @@ -0,0 +1 @@ +../examples \ No newline at end of file diff --git a/docs/images/ChangeCaseInputDataset copy.png b/docs/images/ChangeCaseInputDataset copy.png new file mode 100644 index 0000000..0135721 Binary files /dev/null and b/docs/images/ChangeCaseInputDataset copy.png differ diff --git a/docs/images/ChangeCaseInputDataset.png b/docs/images/ChangeCaseInputDataset.png new file mode 100644 index 0000000..7dc6b8d Binary files /dev/null and b/docs/images/ChangeCaseInputDataset.png differ diff --git a/docs/images/ChangeCaseOutputDataset copy.png b/docs/images/ChangeCaseOutputDataset copy.png new file mode 100644 index 0000000..430b9b7 Binary files /dev/null and b/docs/images/ChangeCaseOutputDataset copy.png differ diff --git a/docs/images/ChangeCaseOutputDataset.png b/docs/images/ChangeCaseOutputDataset.png new file mode 100644 index 0000000..b5b41d0 Binary files /dev/null and b/docs/images/ChangeCaseOutputDataset.png differ diff --git a/docs/images/ChangeCaseWorkflow copy.png b/docs/images/ChangeCaseWorkflow copy.png new file mode 100644 index 0000000..7be6963 Binary files /dev/null and b/docs/images/ChangeCaseWorkflow copy.png differ diff --git a/docs/images/ChangeCaseWorkflow.png b/docs/images/ChangeCaseWorkflow.png new file mode 100644 index 0000000..7d3e39d Binary files /dev/null and b/docs/images/ChangeCaseWorkflow.png differ diff --git a/docs/images/History.png b/docs/images/History.png new file mode 100644 index 0000000..4d418ea Binary files /dev/null and b/docs/images/History.png differ diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..27c32f3 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,53 @@ +.. wft4galaxy documentation index + +====================================== +Welcome to wft4galaxy's documentation! +====================================== + +**wft4galaxy** is a Python module to automatically run Galaxy workflow tests. + +* Run it as a command-line tool or use it programmatically as a Python module. +* Install it locally or in a Docker container -- Docker image and helper scripts already provided. + +Continue reading to find installation and usage instructions. + +Table of Contents (TOC) +======================= + +.. toctree:: + :maxdepth: 2 + :caption: Getting started + :glob: + + Installation + Run a test suite + Dockerized Usage + + +.. toctree:: + :maxdepth: 2 + :caption: Tutorial + :glob: + + Define a test-suite from a Workflow + Define a test-suite from a History + Programmatic Usage + + +.. toctree:: + :maxdepth: 2 + :caption: Resources + :glob: + + Wizard Tool + TestSuite Definition file reference + Integration with CI tools + wft4galaxy API + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/installation.rst b/docs/installation.rst new file mode 100644 index 0000000..bb4b33b --- /dev/null +++ b/docs/installation.rst @@ -0,0 +1,72 @@ +.. _installation: + +============ +Installation +============ + +To install **wft4galaxy** as native Python library, you have to: + +1. clone the corresponding github repository: + +.. code-block:: bash + + git clone https://github.com/phnmnl/wft4galaxy + +2. install the package from source code using the usual Python ``setup.py``: + +.. code-block:: bash + + python setup.py install [--user] + +.. note:: Use the option ``--user`` to install the module only for the current user. + +.. warning:: If are using a linux base system (like *Ubuntu*), probably you need to install \ + the ``python-lxml`` and ``libyaml-dev`` packages as a further requirement. + +.. note:: If want to use wft4galaxy with Docker, you can skip the two steps above: see :ref:`docker` for more details. + + +As a final step, you need to get an **API KEY** from your Galaxy instance, which can be done +from the *'User'* menu of the web Galaxy interface. This API KEY, together with the URL of your Galaxy instance +(i.e., ``http://192.168.64.2:30700``), must be provided to wft4galaxy in order for it to connect +to and communicate with that server. This can be done either passing them as parameters to the command line script +(see CLI options :ref:`notebooks/1_run_suite_from_cli.ipynb`) and to the the main API endpoints +(see :ref:`programmatic_usage`) or setting them as environment variables; i.e.: + +.. code-block:: bash + + export GALAXY_URL="" + export GALAXY_API_KEY="" + + +Docker-based Installation +++++++++++++++++++++++++++++ + +**wft4galaxy** can also run within a Docker container, without installation. + +To simplify the usage of the Docker images by command line, we provide a simple script mainly intended +to allow users to interact with the dockerized version of the tool as if it was "native", +i.e., like a locally installed ``wft4galaxy``. This script is called ``wft4galaxy-docker``. + +Installation +------------ + +To install ``wft4galaxy-docker`` so that it is available system-wide, you can use +the following command which will download and install the script to +``/usr/local/bin``: + +.. code-block:: bash + + curl -s https://raw.githubusercontent.com/phnmnl/wft4galaxy/master/utils/docker/install.sh | bash + +If your ``PATH`` includes ``/usr/local/bin`` you will have the ``wft4galaxy-docker`` script +immediately available from your terminal. Alternatively, you can install the ``wft4galaxy-docker`` script +in any other folder of your system by simply appending the string ``/dev/stdin `` +to the line above, replacing ``TARGET_FOLDER`` with the folder you want to use for installation. +For example, if you want to install the script to your current directory, cut and paste the following line to your terminal: + +.. code-block:: bash + + curl -s https://raw.githubusercontent.com/phnmnl/wft4galaxy/master/utils/docker/install.sh | bash /dev/stdin . + +Then, type ``./wft4galaxy-docker`` to launch from your current path. diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..1f4c7d5 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,281 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. epub3 to make an epub3 + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + echo. coverage to run coverage check of the documentation if enabled + echo. dummy to check syntax errors of document sources + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +REM Check if sphinx-build is available and fallback to Python version if any +%SPHINXBUILD% 1>NUL 2>NUL +if errorlevel 9009 goto sphinx_python +goto sphinx_ok + +:sphinx_python + +set SPHINXBUILD=python -m sphinx.__init__ +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +:sphinx_ok + + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Prova.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Prova.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "epub3" ( + %SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3 + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub3 file is in %BUILDDIR%/epub3. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "coverage" ( + %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage + if errorlevel 1 exit /b 1 + echo. + echo.Testing of coverage in the sources finished, look at the ^ +results in %BUILDDIR%/coverage/python.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +if "%1" == "dummy" ( + %SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. Dummy builder generates no files. + goto end +) + +:end diff --git a/docs/notebooks/0_basic_usage.ipynb b/docs/notebooks/0_basic_usage.ipynb new file mode 100644 index 0000000..9a08dc1 --- /dev/null +++ b/docs/notebooks/0_basic_usage.ipynb @@ -0,0 +1,223 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "# Run a test suite" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Given **wft4galaxy** installed as native Python library (see [Installation](installation.html)) and \n", + "a well formed workflow test suite definition file (we use [\"examples/change_case/workflow-test.yml\"](../examples/change_case/workflow-test.yml) as example; see [Define a test suite from a Workflow](1_define_test_suite.html) and [\"Test Definition file reference\"](test_definition_file.html) for more details) you can run your tests by simply typing:\n", + "\n", + "\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Workflow Test: 'change_case' ... ok\n", + "\n", + "----------------------------------------------------------------------\n", + "Ran 1 test in 12.294s\n", + "\n", + "OK\n" + ] + } + ], + "source": [ + "wft4galaxy -f ../examples/change_case/workflow-test.yml" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that if the name of your *test-definition-file* is ``workflow-test-suite.yml`` and it is in your current working directory, you can ommit the option ``-f <...>`` and run the test above by simply typing ``wft4galaxy`` from your current path." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "As you can see in the call [1] above, the default behaviour of the **wft4galaxy** tool is to run tests with a minimal output, showing the executed tests and which of them succeeded or failed. To display more information about the test execution you can enable logs, using one of the following options:\n", + "\n", + " --enable-logger Enable INFO level logs \n", + " --debug Show more details using DEBUG level logs" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2017-03-29 16:54:57,414 [wft4galaxy] [ INFO] Configuration: \n", + "Workflow Test: 'change_case' ... 2017-03-29 16:54:58,434 [wft4galaxy] [ INFO] Create a history '_WorkflowTestHistory_ad44de7a-148f-11e7-a76d-a8667f33b7fc' (id: '84ffe6fca6c4fbda')\n", + "2017-03-29 16:54:59,798 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Change Case (imported from API)' (id: f3a63b25ef201245) running ...\n", + "2017-03-29 16:55:04,081 [wft4galaxy] [ INFO] waiting for datasets\n", + "2017-03-29 16:55:04,304 [wft4galaxy] [ INFO] 6e7233e069aad1a7: new\n", + "2017-03-29 16:55:06,861 [wft4galaxy] [ INFO] 6e7233e069aad1a7: queued\n", + "2017-03-29 16:55:07,608 [wft4galaxy] [ INFO] 6e7233e069aad1a7: ok\n", + "2017-03-29 16:55:08,113 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Change Case (imported from API)' (id: f3a63b25ef201245) executed\n", + "2017-03-29 16:55:08,114 [wft4galaxy] [ INFO] Checking test output: ...\n", + "2017-03-29 16:55:08,309 [wft4galaxy] [ INFO] Checking test output: DONE\n", + "ok\n", + "\n", + "----------------------------------------------------------------------\n", + "Ran 1 test in 11.289s\n", + "\n", + "OK\n" + ] + } + ], + "source": [ + "wft4galaxy -f ../examples/change_case/workflow-test.yml --enable-logger" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another useful option to deeply inspect the output of a test execution (especially when failed) is ``--disable-cleanup``, which tells wft4galaxy to not clean all intermediate files produced during its execution. All of them (logs and workflow output datasets) are stored in the ``./results`` output folder, but you can set your preferred target folder with the option ``-o `` (short form of ``--output ``)." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2017-03-29 17:38:56,728 [wft4galaxy] [ INFO] Configuration: \n", + "Workflow Test: 'change_case' ... 2017-03-29 17:38:57,567 [wft4galaxy] [ INFO] Create a history '_WorkflowTestHistory_d26878f8-1495-11e7-95a7-a8667f33b7fc' (id: u'6ee95371d25d237b')\n", + "2017-03-29 17:38:58,910 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Change Case (imported from API)' (id: 7ca8f1b7f24e5a2d) running ...\n", + "2017-03-29 17:39:03,114 [wft4galaxy] [ INFO] waiting for datasets\n", + "2017-03-29 17:39:03,501 [wft4galaxy] [ INFO] c389501033f7c311: new\n", + "2017-03-29 17:39:04,420 [wft4galaxy] [ INFO] c389501033f7c311: queued\n", + "2017-03-29 17:39:05,506 [wft4galaxy] [ INFO] c389501033f7c311: queued\n", + "2017-03-29 17:39:06,229 [wft4galaxy] [ INFO] c389501033f7c311: running\n", + "2017-03-29 17:39:06,864 [wft4galaxy] [ INFO] c389501033f7c311: running\n", + "2017-03-29 17:39:07,806 [wft4galaxy] [ INFO] c389501033f7c311: ok\n", + "2017-03-29 17:39:08,309 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Change Case (imported from API)' (id: 7ca8f1b7f24e5a2d) executed\n", + "2017-03-29 17:39:08,309 [wft4galaxy] [ INFO] Checking test output: ...\n", + "2017-03-29 17:39:08,442 [wft4galaxy] [ INFO] Checking test output: DONE\n", + "ok\n", + "\n", + "----------------------------------------------------------------------\n", + "Ran 1 test in 11.714s\n", + "\n", + "OK\n" + ] + } + ], + "source": [ + "wft4galaxy -f ../examples/change_case/workflow-test.yml --enable-logger -o change_case_results --disable-cleanup" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The resulting ``change_case_results`` folder will contain:\n", + "\n", + " 1) test-suite level logs (i.e., a global log file for the test suite):" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "change_case_results/20170329@171841.log\tchange_case_results/20170329@173856.log\n" + ] + } + ], + "source": [ + "ls change_case_results/*.log" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + " 2) test-case level logs and output datasets (i.e., a log file specific for the test case and the datasets generated as output during the workflow execution):" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20170329@173857.log\tOutputText\n" + ] + } + ], + "source": [ + "ls change_case_results/change_case" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/notebooks/1_define_test_suite.ipynb b/docs/notebooks/1_define_test_suite.ipynb new file mode 100644 index 0000000..34dcde4 --- /dev/null +++ b/docs/notebooks/1_define_test_suite.ipynb @@ -0,0 +1,287 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "# Define a test-suite from a Workflow" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "This first example shows how to configure a **wft4galaxy** workflow test for Galaxy." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Main steps:\n", + "\n", + "1. prepare the Galaxy workflow to test: check workflow consistency and export it from Galaxy as a **.ga** file;\n", + "2. choose its **input datasets** and generate its **expected output files**;\n", + "3. write a workflow test **configuration file**;\n", + "4. launch wft4galaxy to execute the test." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "As an example, we consider the workflow **change_case** whose files are in the folder `examples/change_case`:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "expected_output\t\tworkflow-test.yml\r\n", + "input\t\t\tworkflow.ga\r\n" + ] + } + ], + "source": [ + "SUITE_FOLDER=\"../examples/change_case\"\n", + "cd ${SUITE_FOLDER}\n", + "ls" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "## 1. Workflow preparation" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Consider the following simple workflow **''ChangeCase''** which simply changes (to upper) the case of an input text by using only one Galaxy text transformation tool: the *ChangeCase* tool." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "
![wf-changecase-workflow](../images/ChangeCaseWorkflow.png \"Workflow ChangeCase\")
\n", + "
**Figure 1.** Workflow *\"ChangeCase\"*
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "As Fig. 1 shows, the workflow has one input and one output. To test it, both the input and the output must be uniquely identified. Typically, Galaxy identifies them using **Names** and **Labels**, respectively. For our sample workflow, the identifiers are:\n", + "\n", + "* Name **\"InputText\"** for the input (Fig. 2);\n", + "* Label **\"OutputText\"** for the output (Fig. 3)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "
\n", + "
\n", + "
![wf-changecase-inputdataset](../images/ChangeCaseInputDataset.png \"Workflow “Input Dataset“\")
\n", + "
**Figure 2.** Workflow input: *\"Input Dataset\"*
\n", + "
\n", + "
\n", + "
![wf-changecase-outputdataset](../images/ChangeCaseOutputDataset.png \"Workflow “Output Dataset“\")
\n", + "
**Figure 3.** Workflow output: *\"output1\"*
\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Satisfied that both input and outputs are uniquely identified, we can download the Galaxy workflow definition, i.e., the **.ga** file. To obtain the .ga file you have to select your workflow from the *Workflows* menu of the Galaxy web interface, click *Share or Download* and finally click the button *Download*.\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "## 2. Choose inputs and expected outputs" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "As input for this workflow, we can use any text file (e.g., `examples/change_case/input.txt`) and, as expected output, a file containing the same text but in upper case (e.g., `examples/change_case/expected_output.txt`)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "## 3. Define the workflow test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "The code below defines a simple test for our sample workflow. It's in the file `workflows-test.yml`:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "```yaml\n", + "workflows:\n", + " # workflow test \"change case\"\n", + " change_case:\n", + " file: \"workflow.ga\"\n", + " inputs:\n", + " InputText: \"input\"\n", + " expected:\n", + " OutputText: \"expected_output\"\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "See the Section \"Test Definition File\" of the documentation for more details about the legal test definition syntax." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "## 4. Execute the defined test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "The only mandatory argument to run the test is the definition file, which can be specified using the option `-f | --file`:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\r\n", + "2016-11-11 15:48:55,150 INFO: Configuration: {'galaxy_url': 'http://192.168.64.8:30700', 'enable_logger': True, 'galaxy_api_key': '4b86f51252b5f220012b3e259d0877f9', 'enable_debug': False, 'disable_cleanup': False, 'output_folder': 'results', 'workflows': {'change_case': WorkflowTestConfig: name=change_case, file=workflow.ga, inputs=[InputText], expected_outputs=[OutputText]}, 'disable_assertions': False, 'logger_level': 20}\r\n", + "Workflow Test: 'change_case' ... 2016-11-11 15:48:55,806 INFO: Create a history '_WorkflowTestHistory_f84791bd-a81d-11e6-abed-a45e60c4fc6b' (id: u'9fc1c2078b8ee907')\r\n", + "2016-11-11 15:48:57,601 INFO: Workflow '_WorkflowTest_Change Case (imported from API)' (id: 52d6bdfafedbb5e5) running ...\r\n", + "2016-11-11 15:49:05,914 INFO: Workflow '_WorkflowTest_Change Case (imported from API)' (id: 52d6bdfafedbb5e5) executed\r\n", + "2016-11-11 15:49:05,916 INFO: Checking test output: ...\r\n", + "2016-11-11 15:49:05,964 INFO: Checking test output: DONE\r\n", + "ok\r\n", + "\r\n", + "----------------------------------------------------------------------\r\n", + "Ran 1 test in 11.152s\r\n", + "\r\n", + "OK\r\n" + ] + } + ], + "source": [ + "wft4galaxy -f \"workflow-test.yml\" --enable-logger \\\n", + " --server http://192.168.64.8:30700 --api-key 4b86f51252b5f220012b3e259d0877f9" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/docs/notebooks/2_define_test_suite_from_history.ipynb b/docs/notebooks/2_define_test_suite_from_history.ipynb new file mode 100644 index 0000000..d0e5d3c --- /dev/null +++ b/docs/notebooks/2_define_test_suite_from_history.ipynb @@ -0,0 +1,273 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "# Define a test-suite from a History" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "This example shows how to **wft4galaxy wizard tool** for automatically generate a workflow test suite from a Galaxy history (see also [Wizard Tool](wizard-tool.html))." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Suppose you have the Galaxy history shown in **Figure 1** obtained by running the *Fluxomics Stationary* workflow (you can find it in ``examples/fluxomics_stationary``). The first five datasets are inputs, while the remaining are obtained by running the workflow." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "
\n", + "
\n", + "
![wf-history](../images/History.png \"Workflow “History“\")
\n", + "
**Figure 1.** History: \"_WorkflowTestHistory_21b96e0a-130b-11e7-8958-a45e60c4fc6b\"
\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you are somehow confident that the outputs above are exactly what you should obtain running the workflow running the workflow on the first five inputs, then you can use them as *expected output* for defining a workflow test case. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "That described above is exactly the scenario where the **wft4galaxy-wizard** tool can help you from automatically generate a test case. Knowing that the history name is *_WorkflowTestHistory_21b96e0a-130b-11e7-8958-a45e60c4fc6b* you can obtain such a test case by simply typing:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2017-03-30 04:10:01,139 [wft4galaxy] [ INFO] Loading Galaxy history info ...\n", + "2017-03-30 04:10:05,962 [wft4galaxy] [ INFO] Selected history: _WorkflowTestHistory_21b96e0a-130b-11e7-8958-a45e60c4fc6b (id: u'0a248a1f62a0cc04')\n", + "2017-03-30 04:10:05,962 [wft4galaxy] [ INFO] Loading history 0a248a1f62a0cc04 info\n", + "2017-03-30 04:10:06,285 [wft4galaxy] [ INFO] Processing history info...\n", + "2017-03-30 04:10:07,719 [wft4galaxy] [ INFO] Processing dataset 2fdbd5c5858e78fb ... \n", + "2017-03-30 04:10:07,836 [wft4galaxy] [ INFO] Process dataset 2fdbd5c5858e78fb: done \n", + "2017-03-30 04:10:07,836 [wft4galaxy] [ INFO] Processing dataset c385e49b9fe1853c ... \n", + "2017-03-30 04:10:08,025 [wft4galaxy] [ INFO] Process dataset c385e49b9fe1853c: done \n", + "2017-03-30 04:10:08,025 [wft4galaxy] [ INFO] Processing dataset f7bb1edd6b95db62 ... \n", + "2017-03-30 04:10:08,141 [wft4galaxy] [ INFO] Process dataset f7bb1edd6b95db62: done \n", + "2017-03-30 04:10:08,141 [wft4galaxy] [ INFO] Processing dataset 52e496b945151ee8 ... \n", + "2017-03-30 04:10:08,257 [wft4galaxy] [ INFO] Process dataset 52e496b945151ee8: done \n", + "2017-03-30 04:10:08,257 [wft4galaxy] [ INFO] Processing dataset b887d74393f85b6d ... \n", + "2017-03-30 04:10:08,444 [wft4galaxy] [ INFO] Process dataset b887d74393f85b6d: done \n", + "2017-03-30 04:10:08,444 [wft4galaxy] [ INFO] Processing dataset f0f309c56aff0025 ... \n", + "2017-03-30 04:10:08,561 [wft4galaxy] [ INFO] Process dataset f0f309c56aff0025: done \n", + "2017-03-30 04:10:08,561 [wft4galaxy] [ INFO] Processing dataset 36ddb788a0f14eb3 ... \n", + "2017-03-30 04:10:08,679 [wft4galaxy] [ INFO] Process dataset 36ddb788a0f14eb3: done \n", + "2017-03-30 04:10:08,679 [wft4galaxy] [ INFO] Processing dataset 72ad249754f05d26 ... \n", + "2017-03-30 04:10:08,806 [wft4galaxy] [ INFO] Process dataset 72ad249754f05d26: done \n", + "2017-03-30 04:10:08,806 [wft4galaxy] [ INFO] Processing dataset eafb646da3b7aac5 ... \n", + "2017-03-30 04:10:08,806 [wft4galaxy] [ INFO] Process dataset eafb646da3b7aac5: done \n", + "2017-03-30 04:10:08,807 [wft4galaxy] [ INFO] Processing dataset 42a2c611109e5ed3 ... \n", + "2017-03-30 04:10:08,807 [wft4galaxy] [ INFO] Process dataset 42a2c611109e5ed3: done \n", + "2017-03-30 04:10:08,807 [wft4galaxy] [ INFO] Processing extra info...\n", + "2017-03-30 04:10:08,914 [wft4galaxy] [ INFO] Processing extra info: done\n", + "2017-03-30 04:10:08,914 [wft4galaxy] [ INFO] History info processing: done\n", + "2017-03-30 04:10:08,914 [wft4galaxy] [ INFO] Extracting Workflow from history...\n", + "2017-03-30 04:10:08,940 [wft4galaxy] [ INFO] Saving workflow to file...\n", + "2017-03-30 04:10:08,943 [wft4galaxy] [ INFO] Saving workflow to file: done\n", + "2017-03-30 04:10:08,943 [wft4galaxy] [ INFO] Extracting Workflow from history: done\n", + "2017-03-30 04:10:08,944 [wft4galaxy] [ INFO] Downloading input datasets...\n", + "2017-03-30 04:10:09,729 [wft4galaxy] [ INFO] Downloading input datasets: done\n", + "2017-03-30 04:10:09,729 [wft4galaxy] [ INFO] Downloading output datasets...\n", + "2017-03-30 04:10:09,850 [wft4galaxy] [ INFO] Downloading output datasets: done\n", + "2017-03-30 04:10:09,852 [wft4galaxy] [ INFO] Saving workflow test definition ...\n", + "2017-03-30 04:10:09,888 [wft4galaxy] [ INFO] Saving workflow test definition: done\n" + ] + } + ], + "source": [ + "wft4galaxy-wizard -o MyTestSuite generate-test _WorkflowTestHistory_21b96e0a-130b-11e7-8958-a45e60c4fc6b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The wizard tool collects all history info which are useful to generate a test case. In particular, it extracts the workflow executed to generate the history and produces its definition file, i.e., the `.ga` definition file. Then, it downloads all history datasets to generate the test case and creates a new folder called ``MyTestSuite`` with the following structure:\n", + "\n", + " \\ MyTestSuite\n", + " | -- workflow-test-suite.yml\n", + " | -- workflow.ga\n", + " + -- inputs\n", + " | | constraints.csv\n", + " | | exchanged_file.csv\n", + " | | sbml_model.csv\n", + " | | tracing_model.csv\n", + " | | wd.zip\n", + " + -- expected\n", + " | | best_fit_fluxes.csv\n", + " | | best_fit_label.csv\n", + " | | constrained_sbml_model.xml" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "expected\t\tworkflow-test-suite.yml\n", + "inputs\t\t\tworkflow.ga\n" + ] + } + ], + "source": [ + "ls MyTestSuite" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "As you can see in the `workflow-test-suite.yml` file, datasets uploaded by users are mapped to test case `inputs`,\n", + "while datasets generated by the workflow execution are mapped to test case `expected-outputs`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "##########################################################################################\n", + "# Global settings\n", + "##########################################################################################\n", + "galaxy_url: \"http://192.168.8.105:30700\" # default is GALAXY_URL\n", + "galaxy_api_key: \"a4725a45123fd949d24878143801cd82\" # default is GALAXY_API_KEY\n", + "enable_debug: \"False\" # enable debug level\n", + "output_folder: \"results\" # path folder for outputs\n", + "\n", + "##########################################################################################\n", + "# Workflow tests\n", + "##########################################################################################\n", + "workflows:\n", + "\n", + " ########################################################################################\n", + " # workflow test case: \"workflow_test_case_1\"\n", + " ########################################################################################\n", + " workflow_test_case_1:\n", + "\n", + " # worflow definition file (i.e., `.ga`file)\n", + " file: \"workflow.ga\"\n", + "\n", + " # input section\n", + " #######################################################################################\n", + " inputs:\n", + " \n", + " # extended form\n", + " zipped_data:\n", + " file: \"inputs/wd.zip\"\n", + " type: \"zip\"\n", + " \n", + " # extended form\n", + " tracing_model:\n", + " file: \"inputs/tracing_model.csv\"\n", + " type: \"csv\"\n", + " \n", + " # extended form\n", + " sbml_model:\n", + " file: \"inputs/sbml_model.sbml\"\n", + " type: \"xml\"\n", + " \n", + " # extended form\n", + " inputExchange:\n", + " file: \"inputs/exchanged_file.csv\"\n", + " type: \"csv\"\n", + " \n", + " # extended form\n", + " constraints:\n", + " file: \"inputs/constraints.csv\"\n", + " type: \"csv\"\n", + " \n", + " # expected outputs\n", + " #######################################################################################\n", + " expected:\n", + " \n", + " # extended form\n", + " constrained_sbml_model:\n", + " file: \"expected/constrained_sbml_model.xml\"\n", + " comparator: \"filecmp.cmp\"\n", + "\n", + " # extended form\n", + " best_fit_fluxes:\n", + " file: \"expected/best_fit_fluxes.csv\"\n", + " comparator: \"filecmp.cmp\"\n", + " \n", + " # extended form\n", + " best_fit_label:\n", + " file: \"expected/best_fit_label.csv\"\n", + " comparator: \"filecmp.cmp\"\n", + " \n" + ] + } + ], + "source": [ + "cat MyTestSuite/workflow-test-suite.yml" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/notebooks/2_run_test_suite.ipynb b/docs/notebooks/2_run_test_suite.ipynb new file mode 100644 index 0000000..4d801ad --- /dev/null +++ b/docs/notebooks/2_run_test_suite.ipynb @@ -0,0 +1,582 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "# Run a test suite programmatically" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "See the folder *example*:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "EXAMPLES_FOLDER = \"../examples\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "... where you can find the following files:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['change_case',\n", + " 'fluxomics_stationary',\n", + " 'multivariate',\n", + " 'sacurine',\n", + " 'workflow-test-suite-full.yml',\n", + " 'workflow-test-suite-min.yml',\n", + " 'workflow-test-suite.yml',\n", + " 'workflows.json']" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import os, pprint\n", + "[f for f in os.listdir(EXAMPLES_FOLDER) if not f.startswith('.')]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "To run a test suite you need test suite **definition file** (see [here](../test-definition-file.html) for more details) like ``workflow-test-suite-min.yml`` that you can find in ``EXAMPLES_FOLDER``:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "suite_conf_filename = os.path.join(EXAMPLES_FOLDER, \"workflow-test-suite-min.yml\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "The content of the definition file is:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"enable_logger\": false, \n", + " \"workflows\": {\n", + " \"change_case\": {\n", + " \"expected\": {\n", + " \"OutputText\": \"change_case/expected_output\"\n", + " }, \n", + " \"inputs\": {\n", + " \"InputText\": \"change_case/input\"\n", + " }, \n", + " \"file\": \"change_case/workflow.ga\"\n", + " }, \n", + " \"multivariate\": {\n", + " \"expected\": {\n", + " \"variableMetadata_out\": \"multivariate/variableMetadata_out\", \n", + " \"sampleMetadata_out\": \"multivariate/sampleMetadata_out\"\n", + " }, \n", + " \"inputs\": {\n", + " \"DataMatrix\": \"multivariate/dataMatrix.tsv\", \n", + " \"SampleMetadata\": \"multivariate/sampleMetadata.tsv\", \n", + " \"VariableMetadata\": \"multivariate/variableMetadata.tsv\"\n", + " }, \n", + " \"params\": {\n", + " \"3\": {\n", + " \"predI\": \"1\", \n", + " \"respC\": \"gender\", \n", + " \"orthoI\": \"NA\", \n", + " \"testL\": \"FALSE\"\n", + " }\n", + " }, \n", + " \"file\": \"multivariate/workflow.ga\"\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "import yaml, json\n", + "with open(suite_conf_filename, \"r\") as fp:\n", + " data = yaml.load(fp)\n", + " print(json.dumps(data, indent=4))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "To run a test suite programmatically, you need an instance of ``wft4galaxy.core.WorkflowTestSuite`` which mantains the configuration of the whole test suite. You can directly instantiate that starting from the test definition file above (cell [4]) by means of the class function ``load`` (steps [5-6]):" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "from wft4galaxy.core import WorkflowTestSuite" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "suite = WorkflowTestSuite.load(suite_conf_filename)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "The property ``workflows_test`` of the suite configuration object contains a dictionary which maps the name of the workflow test to its configuration (step [7]). Notice that the configuration of a workflow test is wrapped by a ``wft4galaxy.core.WorkflowTestCase`` instance (step[8]). " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "change_case ==> WorkflowTestConfig: name=change_case, file=change_case/workflow.ga, inputs=[InputText], expected_outputs=[OutputText]\n", + "\n", + "multivariate ==> WorkflowTestConfig: name=multivariate, file=multivariate/workflow.ga, inputs=[DataMatrix,SampleMetadata,VariableMetadata], expected_outputs=[variableMetadata_out,sampleMetadata_out]\n", + "\n" + ] + } + ], + "source": [ + "for wft_name, wft_config in suite.workflow_tests.items():\n", + " print(\"{0} ==> {1}\\n\".format(wft_name, wft_config))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Now, having the suite definition loaded, we can run the test suite, by calling the ``run`` method of the suite instance (step [9]) and collect their results:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Workflow Test: 'change_case' ... 2017-03-30 11:48:34,390 [wft4galaxy] [ INFO] Create a history '_WorkflowTestHistory_0a12a39e-152e-11e7-875d-a45e60c4fc6b' (id: u'0aab0e4c25198ad8')\n", + "2017-03-30 11:48:35,583 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Change Case (imported from API)' (id: 0aab0e4c25198ad8) running ...\n", + "2017-03-30 11:48:37,457 [wft4galaxy] [ INFO] waiting for datasets\n", + "2017-03-30 11:48:40,115 [wft4galaxy] [ INFO] 5148364840389881: new\n", + "2017-03-30 11:48:41,313 [wft4galaxy] [ INFO] 5148364840389881: queued\n", + "2017-03-30 11:48:42,371 [wft4galaxy] [ INFO] 5148364840389881: queued\n", + "2017-03-30 11:48:43,015 [wft4galaxy] [ INFO] 5148364840389881: running\n", + "2017-03-30 11:48:43,734 [wft4galaxy] [ INFO] 5148364840389881: running\n", + "2017-03-30 11:48:44,614 [wft4galaxy] [ INFO] 5148364840389881: running\n", + "2017-03-30 11:48:45,510 [wft4galaxy] [ INFO] 5148364840389881: ok\n", + "2017-03-30 11:48:46,011 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Change Case (imported from API)' (id: 0aab0e4c25198ad8) executed\n", + "2017-03-30 11:48:46,013 [wft4galaxy] [ INFO] Checking test output: ...\n", + "2017-03-30 11:48:46,146 [wft4galaxy] [ INFO] Checking test output: DONE\n", + "ok\n", + "Workflow Test: 'multivariate' ... 2017-03-30 11:48:47,557 [wft4galaxy] [ INFO] Create a history '_WorkflowTestHistory_11e13235-152e-11e7-9e12-a45e60c4fc6b' (id: u'32ff5cf1b96c1df7')\n", + "2017-03-30 11:48:58,185 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Multivariate (imported from API)' (id: 32ff5cf1b96c1df7) running ...\n", + "2017-03-30 11:49:03,892 [wft4galaxy] [ INFO] waiting for datasets\n", + "2017-03-30 11:49:04,361 [wft4galaxy] [ INFO] 2d0caaef345630d8: queued\n", + "2017-03-30 11:49:04,738 [wft4galaxy] [ INFO] 72e7b234f232ef23: queued\n", + "2017-03-30 11:49:04,879 [wft4galaxy] [ INFO] dbc510811ab4034e: queued\n", + "2017-03-30 11:49:05,351 [wft4galaxy] [ INFO] b7e089dc153354a5: queued\n", + "2017-03-30 11:49:05,980 [wft4galaxy] [ INFO] 2d0caaef345630d8: queued\n", + "2017-03-30 11:49:06,270 [wft4galaxy] [ INFO] 72e7b234f232ef23: queued\n", + "2017-03-30 11:49:06,598 [wft4galaxy] [ INFO] dbc510811ab4034e: queued\n", + "2017-03-30 11:49:06,741 [wft4galaxy] [ INFO] b7e089dc153354a5: queued\n", + "2017-03-30 11:49:07,383 [wft4galaxy] [ INFO] 2d0caaef345630d8: queued\n", + "2017-03-30 11:49:07,610 [wft4galaxy] [ INFO] 72e7b234f232ef23: queued\n", + "2017-03-30 11:49:07,756 [wft4galaxy] [ INFO] dbc510811ab4034e: queued\n", + "2017-03-30 11:49:07,905 [wft4galaxy] [ INFO] b7e089dc153354a5: queued\n", + "2017-03-30 11:49:08,558 [wft4galaxy] [ INFO] 2d0caaef345630d8: queued\n", + "2017-03-30 11:49:08,709 [wft4galaxy] [ INFO] 72e7b234f232ef23: queued\n", + "2017-03-30 11:49:08,871 [wft4galaxy] [ INFO] dbc510811ab4034e: queued\n", + "2017-03-30 11:49:08,990 [wft4galaxy] [ INFO] b7e089dc153354a5: queued\n", + "2017-03-30 11:49:09,729 [wft4galaxy] [ INFO] 2d0caaef345630d8: queued\n", + "2017-03-30 11:49:10,058 [wft4galaxy] [ INFO] 72e7b234f232ef23: queued\n", + "2017-03-30 11:49:10,316 [wft4galaxy] [ INFO] dbc510811ab4034e: queued\n", + "2017-03-30 11:49:10,561 [wft4galaxy] [ INFO] b7e089dc153354a5: queued\n", + "2017-03-30 11:49:11,336 [wft4galaxy] [ INFO] 2d0caaef345630d8: ok\n", + "2017-03-30 11:49:11,467 [wft4galaxy] [ INFO] 72e7b234f232ef23: ok\n", + "2017-03-30 11:49:11,608 [wft4galaxy] [ INFO] dbc510811ab4034e: ok\n", + "2017-03-30 11:49:11,762 [wft4galaxy] [ INFO] b7e089dc153354a5: ok\n", + "2017-03-30 11:49:12,268 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Multivariate (imported from API)' (id: 32ff5cf1b96c1df7) executed\n", + "2017-03-30 11:49:12,271 [wft4galaxy] [ INFO] Checking test output: ...\n", + "2017-03-30 11:49:12,470 [wft4galaxy] [ INFO] Checking test output: DONE\n", + "ok\n", + "\n", + "----------------------------------------------------------------------\n", + "Ran 2 tests in 39.369s\n", + "\n", + "OK\n" + ] + } + ], + "source": [ + "test_results = suite.run(enable_logger=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "``test_results`` is a list of instances of ``WorkflowTestResult``, a class which contains several information about an executed workflow, like its ID (dynamically generated when the test starts), the workflow definition and the results of the comparator function for each step (step[9]):" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test 0a12a39e-152e-11e7-875d-a45e60c4fc6b:\n", + "\t - workflow: [_WorkflowTest_Change Case (imported from API)] \n", + "\t - results: {u'OutputText': True}\n", + "Test 11e13235-152e-11e7-9e12-a45e60c4fc6b:\n", + "\t - workflow: [_WorkflowTest_Multivariate (imported from API)] \n", + "\t - results: {u'variableMetadata_out': True, u'sampleMetadata_out': True}\n" + ] + } + ], + "source": [ + "for r in test_results:\n", + " print(\"Test %s:\\n\\t - workflow: [%s] \\n\\t - results: %r\" % (r.test_id, r.workflow.name, r.results))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Given a ``WorkflowTestResult`` instance:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "a_result = test_results[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "the list of available methods for inspecting the results of the workflow test are:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on WorkflowTestResult in module wft4galaxy.core object:\n", + "\n", + "class WorkflowTestResult(__builtin__.object)\n", + " | Class for representing the result of a workflow test.\n", + " | \n", + " | Methods defined here:\n", + " | \n", + " | __init__(self, test_id, workflow, inputs, outputs, output_history, expected_outputs, missing_tools, results, output_file_map, output_folder='results', errors=None)\n", + " | \n", + " | __repr__(self)\n", + " | \n", + " | __str__(self)\n", + " | \n", + " | check_output(self, output)\n", + " | Assert whether the actual `output` is equal to the expected accordingly\n", + " | to its associated `comparator` function.\n", + " | \n", + " | :type output: str or dict\n", + " | :param output: output name\n", + " | \n", + " | :rtype: bool\n", + " | :return: ``True`` if the test is passed; ``False`` otherwise.\n", + " | \n", + " | check_outputs(self)\n", + " | Return a map of pairs :, where is ``True``\n", + " | if the actual `OUTPUT_NAME` is equal to the expected accordingly\n", + " | to its associated `comparator` function.\n", + " | \n", + " | :rtype: dict\n", + " | :return: map of output results\n", + " | \n", + " | failed(self)\n", + " | Assert whether the test is failed.\n", + " | \n", + " | :rtype: bool\n", + " | :return: ``True`` if the test is failed; ``False`` otherwise.\n", + " | \n", + " | passed(self)\n", + " | Assert whether the test is passed.\n", + " | \n", + " | :rtype: bool\n", + " | :return: ``True`` if the test is passed; ``False`` otherwise.\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data descriptors defined here:\n", + " | \n", + " | __dict__\n", + " | dictionary for instance variables (if defined)\n", + " | \n", + " | __weakref__\n", + " | list of weak references to the object (if defined)\n", + "\n" + ] + } + ], + "source": [ + "help(a_result)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "For example, you can extract the list of tested outputs:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Outputs: [u'OutputText']\n" + ] + } + ], + "source": [ + "print \"Outputs: \", a_result.results.keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "... or explicitly check if the test is globally passed or failed (all actual outputs are equal to the expected):" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(True, False)" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a_result.passed(), a_result.failed()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "... or check whether a specific actual output is equal or not to the expected one:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a_result.check_output(\"OutputText\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/docs/notebooks/3_run_single_workflow_test.ipynb b/docs/notebooks/3_run_single_workflow_test.ipynb new file mode 100644 index 0000000..8e2c488 --- /dev/null +++ b/docs/notebooks/3_run_single_workflow_test.ipynb @@ -0,0 +1,397 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "# Run a single test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "See the folder *example*:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "EXAMPLES_FOLDER = \"../examples\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "... where you can find the following files:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['change_case',\n", + " 'fluxomics_stationary',\n", + " 'multivariate',\n", + " 'sacurine',\n", + " 'workflow-test-suite-full.yml',\n", + " 'workflow-test-suite-min.yml',\n", + " 'workflow-test-suite.yml',\n", + " 'workflows.json']" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import os, pprint\n", + "[f for f in os.listdir(EXAMPLES_FOLDER) if not f.startswith('.')]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Consider the **definition file** ``workflow-test-suite-min.yml`` (steps[3-4]), which contains the two workflow tests named ``change_case`` and ``multivariate`` respectively:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "suite_conf_filename = os.path.join(EXAMPLES_FOLDER, \"workflow-test-suite-min.yml\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"enable_logger\": false, \n", + " \"workflows\": {\n", + " \"change_case\": {\n", + " \"expected\": {\n", + " \"OutputText\": \"change_case/expected_output\"\n", + " }, \n", + " \"inputs\": {\n", + " \"InputText\": \"change_case/input\"\n", + " }, \n", + " \"file\": \"change_case/workflow.ga\"\n", + " }, \n", + " \"multivariate\": {\n", + " \"expected\": {\n", + " \"variableMetadata_out\": \"multivariate/variableMetadata_out\", \n", + " \"sampleMetadata_out\": \"multivariate/sampleMetadata_out\"\n", + " }, \n", + " \"inputs\": {\n", + " \"DataMatrix\": \"multivariate/dataMatrix.tsv\", \n", + " \"SampleMetadata\": \"multivariate/sampleMetadata.tsv\", \n", + " \"VariableMetadata\": \"multivariate/variableMetadata.tsv\"\n", + " }, \n", + " \"params\": {\n", + " \"3\": {\n", + " \"predI\": \"1\", \n", + " \"respC\": \"gender\", \n", + " \"orthoI\": \"NA\", \n", + " \"testL\": \"FALSE\"\n", + " }\n", + " }, \n", + " \"file\": \"multivariate/workflow.ga\"\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "import yaml, json\n", + "with open(suite_conf_filename, \"r\") as fp:\n", + " data = yaml.load(fp)\n", + " print(json.dumps(data, indent=4))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Similar to that in respect of test suite (example [2](2_run_test_suite.ipynb)), we need to load the test configuration within a Python object. The class specialized for prepresenting a test configuration in ``wft4galaxy`` is ``wft4galaxy.core.WorkflowTestCase`` (step [5]):" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "from wft4galaxy.core import WorkflowTestCase" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "source": [ + "We can create the class instance using the its static ``load`` method:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "test_case = WorkflowTestCase.load(suite_conf_filename, workflow_test_name=\"change_case\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Having the ``test_case`` object, we can simply run the test that it represents by calling its ``run`` method:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-03-30 13:50:18,052 [wft4galaxy] [ INFO] Create a history '_WorkflowTestHistory_0b688d4c-153f-11e7-87e4-a45e60c4fc6b' (id: u'd3a4d6a5256f2d9a')\n", + "2017-03-30 13:50:19,480 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Change Case (imported from API)' (id: d3a4d6a5256f2d9a) running ...\n", + "2017-03-30 13:50:24,497 [wft4galaxy] [ INFO] waiting for datasets\n", + "2017-03-30 13:50:24,777 [wft4galaxy] [ INFO] f711c56f400864d1: new\n", + "2017-03-30 13:50:25,697 [wft4galaxy] [ INFO] f711c56f400864d1: new\n", + "2017-03-30 13:50:28,410 [wft4galaxy] [ INFO] f711c56f400864d1: queued\n", + "2017-03-30 13:50:29,249 [wft4galaxy] [ INFO] f711c56f400864d1: ok\n", + "2017-03-30 13:50:29,754 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Change Case (imported from API)' (id: d3a4d6a5256f2d9a) executed\n", + "2017-03-30 13:50:29,758 [wft4galaxy] [ INFO] Checking test output: ...\n", + "2017-03-30 13:50:29,920 [wft4galaxy] [ INFO] Checking test output: DONE\n" + ] + } + ], + "source": [ + "test_result = test_case.run(enable_logger=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "``test_result`` is an instance of ``WorkflowTestResult``, a class which contains several information about an executed workflow, like its ID (dynamically generated when the test starts), the workflow definition and the results of the comparator function for each step:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test 0b688d4c-153f-11e7-87e4-a45e60c4fc6b:\n", + "\t - workflow: [_WorkflowTest_Change Case (imported from API)] \n", + "\t - results: {u'OutputText': True}\n" + ] + } + ], + "source": [ + "print(\"Test %s:\\n\\t - workflow: [%s] \\n\\t - results: %r\" % \\\n", + " (test_result.test_id, test_result.workflow.name, test_result.results))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "For example, you can extract the list of tested outputs:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Outputs: [u'OutputText']\n" + ] + } + ], + "source": [ + "print \"Outputs: \", test_result.results.keys()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "... or explicitly check if the test is globally passed or failed (all actual outputs are equal to the expected):" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(True, False)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_result.passed(), test_result.failed()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "... or check whether a specific actual output is equal or not to the expected one:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_result.check_output(\"OutputText\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/docs/notebooks/4_config_single_workflow_test.ipynb b/docs/notebooks/4_config_single_workflow_test.ipynb new file mode 100644 index 0000000..6fa3fd4 --- /dev/null +++ b/docs/notebooks/4_config_single_workflow_test.ipynb @@ -0,0 +1,483 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "# Define a single test" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "See the folder *example*:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "EXAMPLES_FOLDER = \"../examples\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "... where you can find the following files:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['change_case',\n", + " 'fluxomics_stationary',\n", + " 'multivariate',\n", + " 'sacurine',\n", + " 'workflow-test-suite-full.yml',\n", + " 'workflow-test-suite-min.yml',\n", + " 'workflow-test-suite.yml',\n", + " 'workflows.json']" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import os, pprint\n", + "[f for f in os.listdir(EXAMPLES_FOLDER) if not f.startswith('.')]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Consider the **definition file** ``workflow-test-suite-min.yml`` (steps[3-4]), which contains the two workflow tests named ``change_case`` and ``multivariate`` respectively:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "suite_conf_filename = os.path.join(EXAMPLES_FOLDER, \"workflow-test-suite-min.yml\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"enable_logger\": false, \n", + " \"workflows\": {\n", + " \"change_case\": {\n", + " \"expected\": {\n", + " \"OutputText\": \"change_case/expected_output\"\n", + " }, \n", + " \"inputs\": {\n", + " \"InputText\": \"change_case/input\"\n", + " }, \n", + " \"file\": \"change_case/workflow.ga\"\n", + " }, \n", + " \"multivariate\": {\n", + " \"expected\": {\n", + " \"variableMetadata_out\": \"multivariate/variableMetadata_out\", \n", + " \"sampleMetadata_out\": \"multivariate/sampleMetadata_out\"\n", + " }, \n", + " \"inputs\": {\n", + " \"DataMatrix\": \"multivariate/dataMatrix.tsv\", \n", + " \"SampleMetadata\": \"multivariate/sampleMetadata.tsv\", \n", + " \"VariableMetadata\": \"multivariate/variableMetadata.tsv\"\n", + " }, \n", + " \"params\": {\n", + " \"3\": {\n", + " \"predI\": \"1\", \n", + " \"respC\": \"gender\", \n", + " \"orthoI\": \"NA\", \n", + " \"testL\": \"FALSE\"\n", + " }\n", + " }, \n", + " \"file\": \"multivariate/workflow.ga\"\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "import json, yaml\n", + "with open(suite_conf_filename, \"r\") as fp:\n", + " data = yaml.load(fp)\n", + " print(json.dumps(data, indent=4))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "... and focus on the first example ``change_case``:" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "
![wf-changecase-workflow](../images/ChangeCaseWorkflow.png \"Workflow ChangeCase\")
\n", + "
**Figure 1.** Workflow *\"ChangeCase\"*
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "As Fig. 1 shows, the workflow has one input and one output. To test it, both the input and the output must be uniquely identified. Typically, Galaxy identifies them using **Names** and **Labels**, respectively. For our sample workflow, the identifiers are:\n", + "\n", + "* Name **\"InputText\"** for the input (Fig. 2);\n", + "* Label **\"OutputText\"** for the output (Fig. 3)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "
\n", + "
\n", + "
![wf-changecase-inputdataset](../images/ChangeCaseInputDataset.png \"Workflow “Input Dataset“\")
\n", + "
**Figure 2.** Workflow input: *\"Input Dataset\"*
\n", + "
\n", + "
\n", + "
![wf-changecase-outputdataset](../images/ChangeCaseOutputDataset.png \"Workflow “Output Dataset“\")
\n", + "
**Figure 3.** Workflow output: *\"output1\"*
\n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "You can programmatically inpect the Galaxy workflow definition by means of the ``Workflow`` class, which allows you to see which are the workflow inputs and outputs (steps[5-8]):" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "from wft4galaxy.wrapper import Workflow" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "wf = Workflow.load(os.path.join(EXAMPLES_FOLDER, \"change_case/workflow.ga\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "- InputText \n" + ] + } + ], + "source": [ + "wf.show_inputs()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'1': OutputText\n" + ] + } + ], + "source": [ + " wf.show_outputs()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Steps 9-13 define a ``WorkflowTestCase`` instance programmatically:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "from wft4galaxy.core import WorkflowTestCase" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "# prepare the workflow definition file name\n", + "base_path = os.path.join(EXAMPLES_FOLDER, \"change_case\")\n", + "workflow_filename = \"workflow.ga\"" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "# prepare test inputs\n", + "inputs = {\"InputText\": {\"file\": \"input\"}}" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "# prepare test outputs\n", + "expected_outputs = {\"OutputText\": {\"file\": \"expected_output\"}}" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "# create test case instance\n", + "test_case = WorkflowTestCase(base_path=base_path, \n", + " workflow_filename=workflow_filename, \n", + " inputs=inputs, expected_outputs=expected_outputs)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "You can now run your test case and inspect the results of its execution (steps [14-16]), as described in \"[Run a single test](3_run_single_workflow_test.html)\":" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2017-03-30 14:53:38,244 [wft4galaxy] [ INFO] Create a history '_WorkflowTestHistory_e46ecb26-1547-11e7-8812-a45e60c4fc6b' (id: u'795b4cb2a2107ba7')\n", + "2017-03-30 14:53:40,120 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Change Case (imported from API)' (id: 795b4cb2a2107ba7) running ...\n", + "2017-03-30 14:53:45,298 [wft4galaxy] [ INFO] waiting for datasets\n", + "2017-03-30 14:53:45,690 [wft4galaxy] [ INFO] 44015a2f24f1f430: queued\n", + "2017-03-30 14:53:46,639 [wft4galaxy] [ INFO] 44015a2f24f1f430: queued\n", + "2017-03-30 14:53:47,330 [wft4galaxy] [ INFO] 44015a2f24f1f430: running\n", + "2017-03-30 14:53:48,075 [wft4galaxy] [ INFO] 44015a2f24f1f430: running\n", + "2017-03-30 14:53:49,025 [wft4galaxy] [ INFO] 44015a2f24f1f430: running\n", + "2017-03-30 14:53:49,660 [wft4galaxy] [ INFO] 44015a2f24f1f430: ok\n", + "2017-03-30 14:53:50,165 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Change Case (imported from API)' (id: 795b4cb2a2107ba7) executed\n", + "2017-03-30 14:53:50,168 [wft4galaxy] [ INFO] Checking test output: ...\n", + "2017-03-30 14:53:50,341 [wft4galaxy] [ INFO] Checking test output: DONE\n" + ] + } + ], + "source": [ + "test_result = test_case.run(enable_logger=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test e46ecb26-1547-11e7-8812-a45e60c4fc6b:\n", + "\t - workflow: [_WorkflowTest_Change Case (imported from API)] \n", + "\t - results: {u'OutputText': True}\n" + ] + } + ], + "source": [ + "print(\"Test %s:\\n\\t - workflow: [%s] \\n\\t - results: %r\" % \\\n", + " (test_result.test_id, test_result.workflow.name, test_result.results))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_result.check_output(\"OutputText\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/docs/notebooks/5_config_workflow_test_suite.ipynb b/docs/notebooks/5_config_workflow_test_suite.ipynb new file mode 100644 index 0000000..d8af68e --- /dev/null +++ b/docs/notebooks/5_config_workflow_test_suite.ipynb @@ -0,0 +1,373 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "# Define a test suite" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "See the folder *example*:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "EXAMPLES_FOLDER = \"../examples\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "... where you can find the following files:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['change_case',\n", + " 'fluxomics_stationary',\n", + " 'multivariate',\n", + " 'sacurine',\n", + " 'workflow-test-suite-full.yml',\n", + " 'workflow-test-suite-min.yml',\n", + " 'workflow-test-suite.yml',\n", + " 'workflows.json']" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import os, pprint\n", + "[f for f in os.listdir(EXAMPLES_FOLDER) if not f.startswith('.')]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Consider the **definition file** ``workflow-test-suite-min.yml`` (steps[3-4]), which contains the two workflow tests named ``change_case`` and ``multivariate`` respectively:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "suite_conf_filename = os.path.join(EXAMPLES_FOLDER, \"workflow-test-suite-min.yml\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"enable_logger\": false, \n", + " \"workflows\": {\n", + " \"change_case\": {\n", + " \"expected\": {\n", + " \"OutputText\": \"change_case/expected_output\"\n", + " }, \n", + " \"inputs\": {\n", + " \"InputText\": \"change_case/input\"\n", + " }, \n", + " \"file\": \"change_case/workflow.ga\"\n", + " }, \n", + " \"multivariate\": {\n", + " \"expected\": {\n", + " \"variableMetadata_out\": \"multivariate/variableMetadata_out\", \n", + " \"sampleMetadata_out\": \"multivariate/sampleMetadata_out\"\n", + " }, \n", + " \"inputs\": {\n", + " \"DataMatrix\": \"multivariate/dataMatrix.tsv\", \n", + " \"SampleMetadata\": \"multivariate/sampleMetadata.tsv\", \n", + " \"VariableMetadata\": \"multivariate/variableMetadata.tsv\"\n", + " }, \n", + " \"params\": {\n", + " \"3\": {\n", + " \"predI\": \"1\", \n", + " \"respC\": \"gender\", \n", + " \"orthoI\": \"NA\", \n", + " \"testL\": \"FALSE\"\n", + " }\n", + " }, \n", + " \"file\": \"multivariate/workflow.ga\"\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "import yaml, json\n", + "with open(suite_conf_filename, \"r\") as fp:\n", + " data = yaml.load(fp)\n", + " print(json.dumps(data, indent=4))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "Suppose that you have two ``WorkflowTestCase`` instances (we load them in steps[5-6] from a definition file, but you can define them programmatically as described in \"[Define a single test case](4_config_single_workflow_test.html)\"):" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "from wft4galaxy.core import WorkflowTestCase" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "wft1 = WorkflowTestCase.load(suite_conf_filename, \"change_case\")\n", + "wft2 = WorkflowTestCase.load(suite_conf_filename, \"multivariate\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "To programmatically create test suite you need to create an instance of the ``WorkflowTestSuite`` class:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "from wft4galaxy.core import WorkflowTestSuite\n", + "suite = WorkflowTestSuite()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "source": [ + "and register the ``WorkflowTestSuite`` instances to the suite instance:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "suite.add_workflow_test(wft1)\n", + "suite.add_workflow_test(wft2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can now run your test suite and inspect the results of its execution (steps [9-10]), as described in \"[Run a test suite](2_run_test_suite.html)\":" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Workflow Test: 'change_case' ... 2017-03-30 15:08:02,477 [wft4galaxy] [ INFO] Create a history '_WorkflowTestHistory_e79f068a-1549-11e7-823b-a45e60c4fc6b' (id: u'c8a1d1385ed48f8d')\n", + "2017-03-30 15:08:03,756 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Change Case (imported from API)' (id: c8a1d1385ed48f8d) running ...\n", + "2017-03-30 15:08:06,367 [wft4galaxy] [ INFO] waiting for datasets\n", + "2017-03-30 15:08:06,559 [wft4galaxy] [ INFO] 53fb5c5113d9beb7: new\n", + "2017-03-30 15:08:07,502 [wft4galaxy] [ INFO] 53fb5c5113d9beb7: new\n", + "2017-03-30 15:08:08,239 [wft4galaxy] [ INFO] 53fb5c5113d9beb7: new\n", + "2017-03-30 15:08:08,900 [wft4galaxy] [ INFO] 53fb5c5113d9beb7: new\n", + "2017-03-30 15:08:09,830 [wft4galaxy] [ INFO] 53fb5c5113d9beb7: new\n", + "2017-03-30 15:08:10,476 [wft4galaxy] [ INFO] 53fb5c5113d9beb7: new\n", + "2017-03-30 15:08:11,386 [wft4galaxy] [ INFO] 53fb5c5113d9beb7: queued\n", + "2017-03-30 15:08:12,103 [wft4galaxy] [ INFO] 53fb5c5113d9beb7: running\n", + "2017-03-30 15:08:12,807 [wft4galaxy] [ INFO] 53fb5c5113d9beb7: running\n", + "2017-03-30 15:08:13,638 [wft4galaxy] [ INFO] 53fb5c5113d9beb7: running\n", + "2017-03-30 15:08:14,357 [wft4galaxy] [ INFO] 53fb5c5113d9beb7: running\n", + "2017-03-30 15:08:15,365 [wft4galaxy] [ INFO] 53fb5c5113d9beb7: ok\n", + "2017-03-30 15:08:15,872 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Change Case (imported from API)' (id: c8a1d1385ed48f8d) executed\n", + "2017-03-30 15:08:15,875 [wft4galaxy] [ INFO] Checking test output: ...\n", + "2017-03-30 15:08:16,054 [wft4galaxy] [ INFO] Checking test output: DONE\n", + "ok\n", + "Workflow Test: 'multivariate' ... 2017-03-30 15:08:17,738 [wft4galaxy] [ INFO] Create a history '_WorkflowTestHistory_f08acdb0-1549-11e7-bf2e-a45e60c4fc6b' (id: u'2d190d7d262b60f4')\n", + "2017-03-30 15:08:30,657 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Multivariate (imported from API)' (id: 2d190d7d262b60f4) running ...\n", + "2017-03-30 15:08:39,075 [wft4galaxy] [ INFO] waiting for datasets\n", + "2017-03-30 15:08:39,483 [wft4galaxy] [ INFO] b425b2361a02d64e: queued\n", + "2017-03-30 15:08:39,970 [wft4galaxy] [ INFO] eff20c5ba6bf6f87: queued\n", + "2017-03-30 15:08:40,455 [wft4galaxy] [ INFO] 77efbec71a7e1a47: queued\n", + "2017-03-30 15:08:40,781 [wft4galaxy] [ INFO] ea3d97b57366b47f: queued\n", + "2017-03-30 15:08:41,453 [wft4galaxy] [ INFO] b425b2361a02d64e: queued\n", + "2017-03-30 15:08:41,952 [wft4galaxy] [ INFO] eff20c5ba6bf6f87: queued\n", + "2017-03-30 15:08:42,266 [wft4galaxy] [ INFO] 77efbec71a7e1a47: queued\n", + "2017-03-30 15:08:42,443 [wft4galaxy] [ INFO] ea3d97b57366b47f: queued\n", + "2017-03-30 15:08:43,290 [wft4galaxy] [ INFO] b425b2361a02d64e: queued\n", + "2017-03-30 15:08:43,526 [wft4galaxy] [ INFO] eff20c5ba6bf6f87: queued\n", + "2017-03-30 15:08:43,788 [wft4galaxy] [ INFO] 77efbec71a7e1a47: queued\n", + "2017-03-30 15:08:44,030 [wft4galaxy] [ INFO] ea3d97b57366b47f: queued\n", + "2017-03-30 15:08:44,678 [wft4galaxy] [ INFO] b425b2361a02d64e: queued\n", + "2017-03-30 15:08:45,228 [wft4galaxy] [ INFO] eff20c5ba6bf6f87: queued\n", + "2017-03-30 15:08:45,440 [wft4galaxy] [ INFO] 77efbec71a7e1a47: queued\n", + "2017-03-30 15:08:45,629 [wft4galaxy] [ INFO] ea3d97b57366b47f: queued\n", + "2017-03-30 15:08:46,418 [wft4galaxy] [ INFO] b425b2361a02d64e: queued\n", + "2017-03-30 15:08:46,848 [wft4galaxy] [ INFO] eff20c5ba6bf6f87: queued\n", + "2017-03-30 15:08:47,146 [wft4galaxy] [ INFO] 77efbec71a7e1a47: ok\n", + "2017-03-30 15:08:47,662 [wft4galaxy] [ INFO] ea3d97b57366b47f: ok\n", + "2017-03-30 15:08:48,312 [wft4galaxy] [ INFO] b425b2361a02d64e: ok\n", + "2017-03-30 15:08:48,485 [wft4galaxy] [ INFO] eff20c5ba6bf6f87: ok\n", + "2017-03-30 15:08:48,986 [wft4galaxy] [ INFO] Workflow '_WorkflowTest_Multivariate (imported from API)' (id: 2d190d7d262b60f4) executed\n", + "2017-03-30 15:08:48,989 [wft4galaxy] [ INFO] Checking test output: ...\n", + "2017-03-30 15:08:49,187 [wft4galaxy] [ INFO] Checking test output: DONE\n", + "ok\n", + "\n", + "----------------------------------------------------------------------\n", + "Ran 2 tests in 48.039s\n", + "\n", + "OK\n" + ] + } + ], + "source": [ + "test_results = suite.run(enable_logger=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test e79f068a-1549-11e7-823b-a45e60c4fc6b:\n", + "\t - workflow: [_WorkflowTest_Change Case (imported from API)] \n", + "\t - results: {u'OutputText': True}\n", + "Test f08acdb0-1549-11e7-bf2e-a45e60c4fc6b:\n", + "\t - workflow: [_WorkflowTest_Multivariate (imported from API)] \n", + "\t - results: {u'variableMetadata_out': True, u'sampleMetadata_out': True}\n" + ] + } + ], + "source": [ + "for r in test_results:\n", + " print(\"Test %s:\\n\\t - workflow: [%s] \\n\\t - results: %r\" % (r.test_id, r.workflow.name, r.results))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/docs/notebooks/6_direct_docker_usage.ipynb b/docs/notebooks/6_direct_docker_usage.ipynb new file mode 100644 index 0000000..c5747fa --- /dev/null +++ b/docs/notebooks/6_direct_docker_usage.ipynb @@ -0,0 +1,86 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Direct Docker Usage" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2016-11-12 13:25:18,992 INFO: Configuration: {'galaxy_url': None, 'enable_logger': True, 'galaxy_api_key': None, 'enable_debug': False, 'disable_cleanup': False, 'output_folder': '/data_output', 'workflows': {'change_case': WorkflowTestConfig: name=change_case, file=workflow.ga, inputs=[InputText], expected_outputs=[OutputText]}, 'disable_assertions': False, 'logger_level': 20}\r\n", + "Workflow Test: 'change_case' ... 2016-11-12 13:25:19,721 INFO: Create a history '_WorkflowTestHistory_74db7ef5-a8db-11e6-96ae-0242ac110002' (id: u'8f9e5986e31a6d36')\r\n", + "2016-11-12 13:25:21,666 INFO: Workflow '_WorkflowTest_Change Case (imported from API)' (id: 6d2d4099ead26222) running ...\r\n", + "2016-11-12 13:25:29,477 INFO: Workflow '_WorkflowTest_Change Case (imported from API)' (id: 6d2d4099ead26222) executed\r\n", + "2016-11-12 13:25:29,482 INFO: Checking test output: ...\r\n", + "2016-11-12 13:25:29,623 INFO: Checking test output: DONE\r\n", + "ok\r\n", + "\r\n", + "----------------------------------------------------------------------\r\n", + "Ran 1 test in 11.003s\r\n", + "\r\n", + "OK\r\n" + ] + } + ], + "source": [ + "# Galaxy settings\n", + "GALAXY_SERVER=${GALAXY_URL}\n", + "GALAXY_API_KEY=${GALAXY_API_KEY}\n", + "\n", + "# set the working dir: path must be absolute as Docker requirement\n", + "WORKSPACE=\"$(pwd)/..\" #${WORKSPACE:-$(pwd)}\n", + "\n", + "# absolute path of your test definition and test data\n", + "LOCAL_INPUT_FOLDER=\"${WORKSPACE}/examples/change_case\"\n", + "LOCAL_OUTPUT_FOLDER=\"${WORKSPACE}/results\"\n", + "\n", + "# test definition file relative the $LOCAL_INPUT_FOLDER\n", + "TEST_DEFINITION_FILENAME=\"workflow-test.yml\" \n", + "\n", + "# test to be executed\n", + "TESTS=\"change_case\"\n", + "\n", + "# Docker settings\n", + "DOCKER_IMAGE=\"crs4/wft4galaxy\"\n", + "DOCKER_INPUT_FOLDER=\"/data_input\"\n", + "DOCKER_OUTPUT_FOLDER=\"/data_output\"\n", + "DOCKER_CONFIG_FILE=\"${DOCKER_INPUT_FOLDER}/${TEST_DEFINITION_FILENAME}\"\n", + "\n", + "# run test\n", + "docker run -i --rm \\\n", + " -v \"${LOCAL_INPUT_FOLDER}\":${DOCKER_INPUT_FOLDER} \\\n", + " -v \"${LOCAL_OUTPUT_FOLDER}\":${DOCKER_OUTPUT_FOLDER} \\\n", + " ${DOCKER_IMAGE} \\\n", + " --server ${GALAXY_SERVER} --api-key ${GALAXY_API_KEY} \\\n", + " -f ${DOCKER_CONFIG_FILE} \\\n", + " -o ${DOCKER_OUTPUT_FOLDER} ${TESTS}" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/docs/notebooks2sphinx b/docs/notebooks2sphinx new file mode 100755 index 0000000..7ea72df --- /dev/null +++ b/docs/notebooks2sphinx @@ -0,0 +1,13 @@ +#!/bin/bash + +echo "Converting ipython notebooks to .rst" + +TUTORIAL_IPYNB="tutorial/" +TUTORIAL_RST="../docs/_tutorial/" + +notebooks=($(ls ${TUTORIAL_IPYNB})) +for notebook in "${notebooks[@]}" +do + echo "Converting notebook '${notebook}...'" + ipython nbconvert ${TUTORIAL_IPYNB}/${notebook} --to rst --output-dir=${TUTORIAL_RST} +done \ No newline at end of file diff --git a/docs/programmatic-usage.rst b/docs/programmatic-usage.rst new file mode 100644 index 0000000..e62987a --- /dev/null +++ b/docs/programmatic-usage.rst @@ -0,0 +1,17 @@ +.. _programmatic_usage: + +================== +Programmatic Usage +================== + +In this section we will see how to use **wft4galaxy** programmatically, which can be useful to integrate it with other third party tools. + +.. toctree:: + :maxdepth: 3 + :caption: Examples + :glob: + + Run a test suite + Run a single test + Define a single test + Define a test suite diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..8db93d4 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,3 @@ +nbsphinx +ipykernel +sphinx_rtd_theme \ No newline at end of file diff --git a/docs/test-definition-file.rst b/docs/test-definition-file.rst new file mode 100644 index 0000000..621069f --- /dev/null +++ b/docs/test-definition-file.rst @@ -0,0 +1,168 @@ +.. _test_definition_file: + +================================ +Test Definition File Reference +================================ + +wft4galaxy supports defining tests in both YAML and JSON formats. + + +As an example, consider the following YAML test definition file: + +.. code-block:: YAML + + ## Galaxy server settings + ########################################################################################### + # galaxy_url: "http://192.168.64.8:30700" # default is GALAXY_URL + # galaxy_api_key: "4b86f51252b5f220012b3e259d0877f9" # default is GALAXY_API_KEY + ########################################################################################### + enable_logger: False + output_folder: "results" + + # workflow tests + workflows: + # workflow test "change case" + change_case: + file: "change_case/workflow.ga" + inputs: + "Input Dataset": "change_case/input" + #file: "change_case/input" + expected: + output1: + file: "change_case/expected_output_1" + comparator: "filecmp.cmp" + output2: "change_case/expected_output_2" + + # workflow test "sacurine" + sacurine: + file: "sacurine/workflow.ga" + params: + 3: + "orthoI": "NA" + "predI": "1" + "respC": "gender" + "testL": "FALSE" + inputs: + "DataMatrix": "sacurine/input/dataMatrix.tsv" + "SampleMetadata": "sacurine/input/sampleMetadata.tsv" + "VariableMetadata": "sacurine/input/variableMetadata.tsv" + expected: + Univariate_variableMetadata: "sacurine/expected/Univariate_variableMetadata.tsv" + Multivariate_sampleMetadata: "sacurine/expected/Multivariate_sampleMetadata.tsv" + Multivariate_variableMetadata: "sacurine/expected/Multivariate_variableMetadata.tsv" + Biosigner_variableMetadata: "sacurine/expected/Biosigner_variableMetadata.tsv" + +The definition has two main parts: + +1. **global configuration**, where global settings are defined; +2. **workflow configuration**, which contains workflow-specific settings. + + +Global settings +--------------- + +* ``galaxy_url`` and ``galaxy_api``: Galaxy instance and credentials to run the workflows. +* ``output_folder``, if test outputs are to be saved. +* ``logging_level``: one of ``INFO`` and ``DEBUG`` (default is ``INFO``). +* ``base_path``: path with respect to which the relative file paths are specified -- for + datasets, workflow files, etc. (see note). + +Workflow settings +----------------- + +* ``base_path``: overrides global ``base_path``, if specified (see note). +* ``file``: workflow file definition (.ga file). +* ``inputs``: input files for the workflow. More details below. +* ``expected``: output files expected from the workflow in the case of correct + execution. More details below. + + +Base path +~~~~~~~~~ + +The ``base_path`` is used to locate every relative path specified in a workflow +test configuration (i.e., .ga files, input datasets, expected_output datasets). + + +It can be set at two levels: + +1. **global base_path**: specifies the base path for all workflow tests; +2. **test base_path**: specifies the base path for all files defined within the workflow test + +.. note:: If you provide a path starting with ``/`` it is considered absolute and the ``base_path`` setting will not affect it. + +The only exception to this logic is for the output directory, which is created +relative to the ``base_path`` if the location is specified in the test +definition (see the ``output_folder`` key) or, if the ``-o`` command line option +is used, in the path specified by the user. + + +Specifying workflow inputs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Inputs are specified as a dictionary "Galaxy dataset name" -> file. Here's an +example: + + +.. code-block:: YAML + + inputs: + "DataMatrix": "sacurine/input/dataMatrix.tsv" + +In the example, the Galaxy workflow has an input dataset with the label +"DataMatrix." We're specifying that the file ``sacurine/input/dataMatrix.tsv`` +should be used for that input. + +The relative path is interpreted relative to the `Base path`_. + +By default Galaxy automatically detects the type of the input dataset by its file extension. +If you need to specify the type of the input dataset you can use the following extended syntax: + +.. code-block:: YAML + + inputs: + DataMatrix: + file: "sacurine/input/dataMatrix.tsv" + type: "tsv" + + +Specifying workflow outputs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Outputs are also specified as a dictionary that has the Galaxy output name as the key. +The associated value can be the path to a file, so that ``wft4galaxy`` will +require that the output dataset generated from the workflow exactly matches the +contents of the file. Here's an example: + +.. code-block:: YAML + + expected: + Univariate_variableMetadata: "sacurine/expected/Univariate_variableMetadata.tsv" + + +On the other hand, if required, the comparison operation can be customized +files. In this case, the ``expected`` looks more like this: + +.. code-block:: YAML + + expected: + Univariate_variableMetadata: + file: "sacurine/expected/Univariate_variableMetadata.bin" + comparator: "filecmp.cmp" + +The name of the output dataset is still the key the key. In this case, however, +the value is another dictionary that requires the ``file`` key, to specify the +data file, and the ``comparator`` key, to specify the comparator function. + +Comparator function +++++++++++++++++++++++ + +The comparator function is expected to be a function that accepts two paths as +arguments and is in a Python module that can be imported by ``wft4galaxy`` (so +mind your ``PYTHONPATH``!!). So, for example, ``filecmp.cmp`` roughly +translates to: + +.. code-block:: Python + + import filecmp + return filecmp.cmp(expected_file_path, generated_file_path) diff --git a/docs/wizard-tool.rst b/docs/wizard-tool.rst new file mode 100644 index 0000000..8a903f2 --- /dev/null +++ b/docs/wizard-tool.rst @@ -0,0 +1,114 @@ +.. _wizard_tool: + +=========== +Wizard Tool +=========== + + +**wft4galaxy** supports users on the creation of their workflow test cases by means of a *"wizard"* functionality \ +which can be called by typing ``wft4galaxy-wizard`` after installation (see :ref:`installation`) \ +or using Docker (see :ref:`docker`). + +It provides users with two main features: + +1. **a test suite template generator,** which simply creates a template of workflow test suite definition file \ + (see :ref:`test_definition_file`) within a directory reasonable structured for containing a test suite \ + (see :ref:`TestSuiteDirectoryStructure` below); +2. **a test suite generator,** which automatically generates a test suite from an existing Galaxy history. + + +Type ``wft4galaxy-wizard --help`` to see its main options and arguments: + +.. code-block:: bash + :caption: wft4galaxy-wizard help + :name: wft4galaxy-wizard-command + + usage: wft4galaxy-wizard [-h] [--debug] [--server GALAXY_URL] + [--api-key GALAXY_API_KEY] [-o OUTPUT_FOLDER] + [-f FILE] + {generate-test,generate-template} ... + + optional arguments: + -h, --help show this help message and exit + --debug Enable debug mode + --server GALAXY_URL Galaxy server URL (default $GALAXY_URL) + --api-key GALAXY_API_KEY + Galaxy server API KEY (default $GALAXY_API_KEY) + -o OUTPUT_FOLDER, --output OUTPUT_FOLDER + absolute path of the output folder (default is "test- + config") + -f FILE, --file FILE YAML configuration file of workflow tests (default is + "workflow-test-suite.yml") + + command: + + {generate-test,generate-template} + Wizard tool command: [generate-test | generate- + template] + generate-test Generate a test definition file from a history + generate-template Generate a test definition template + + + +As with other wft4galaxy features, the options ``--server`` and ``--api-key`` override the two environment variable +which define the Galaxy instance to use, respectively `GALAXY_URL` and `GALAXY_API_KEY`. + + +Generate Template +----------------- + +A test suite template directory can be generate by typing: + +.. code-block:: bash + :name: test-suite-template-generator + + wft4galaxy-wizard generate-template [-f ] [-o ] + +The former option `-f ` allows you to customize the filename containing the test suite definition \ +(the default filename is `workflow-test-suite.yml`), while the later overrides the default name of the output folder, \ +which is `test-config`. A part from the actual files (workflow definition `.ga` file and datasets), \ +its structure looks like shown in :ref:`TestSuiteDirectoryStructure`. + + +Generate TestSuite from a history +--------------------------------- + +The main purpose is to allow users to automatically generate a workflow test case from a history. +Given a history name, the wizard tool collects all history info which are useful to generate a test case. + +In particular, it extracts the workflow executed to generate the history and produces its definition file, i.e., the `.ga` definition file. Then, it downloads all history datasets to generate the test case: + +- datasets uploaded by users are mapped to test case `inputs` ; +- datasets generated by the workflow execution are mapped to test case `expected-outputs`. + +Finally, a workflow test definition file is generated. + +The typical directory structure of the resulting test case is: + +.. code-block:: md + :caption: TestSuite Directory Structure + :name: TestSuiteDirectoryStructure + + \ + | -- workflow-test-suite.yml + | -- workflow.ga + + -- inputs + | | -- . + | ... + + -- expected + | | -- . + | ... + +To generate a test case from your Galaxy history, type: + +.. code-block:: bash + :name: generate-test-cmd + + wft4galaxy-wizard -o generate-test + + +.. note:: + + The mandatory parameter `HISTORY_NAME` selects the history to be used for generating the test case. \ + If more than one history matches that name, the wizard asks for choosing one of them, \ + displaying their creation time. \ No newline at end of file diff --git a/examples/change_case/expected_output b/examples/change_case/expected_output new file mode 100644 index 0000000..7ad51dc --- /dev/null +++ b/examples/change_case/expected_output @@ -0,0 +1,2862 @@ +THE PROJECT GUTENBERG EBOOK OF THE GREAT TAXICAB ROBBERY, BY JAMES H. COLLINS + +THIS EBOOK IS FOR THE USE OF ANYONE ANYWHERE IN THE UNITED STATES AND MOST +OTHER PARTS OF THE WORLD AT NO COST AND WITH ALMOST NO RESTRICTIONS +WHATSOEVER. YOU MAY COPY IT, GIVE IT AWAY OR RE-USE IT UNDER THE TERMS OF +THE PROJECT GUTENBERG LICENSE INCLUDED WITH THIS EBOOK OR ONLINE AT +WWW.GUTENBERG.ORG. IF YOU ARE NOT LOCATED IN THE UNITED STATES, YOU'LL HAVE +TO CHECK THE LAWS OF THE COUNTRY WHERE YOU ARE LOCATED BEFORE USING THIS EBOOK. + +TITLE: THE GREAT TAXICAB ROBBERY + A TRUE DETECTIVE STORY + +AUTHOR: JAMES H. COLLINS + +RELEASE DATE: SEPTEMBER 25, 2016 [EBOOK #53145] + +LANGUAGE: ENGLISH + +CHARACTER SET ENCODING: UTF-8 + +*** START OF THIS PROJECT GUTENBERG EBOOK THE GREAT TAXICAB ROBBERY *** + + + + +PRODUCED BY ELLINORA AND THE ONLINE DISTRIBUTED PROOFREADING +TEAM AT HTTP://WWW.PGDP.NET (THIS FILE WAS PRODUCED FROM +IMAGES GENEROUSLY MADE AVAILABLE BY THE INTERNET ARCHIVE) + + + + + + + TRANSCRIBER’S NOTE + + OBVIOUS SPELLING AND PUNCTUATION ERRORS HAVE BEEN CORRECTED. + + SPELLING VARIATIONS HAVE BEEN KEPT AS IN THE ORIGINAL. + + ITALIC TEXT IS INDICATED BY UNDERSCORES SURROUNDING THE _ITALIC TEXT_. + + SMALL CAPITALS IN THE ORIGINAL HAVE BEEN CONVERTED TO ALL CAPS. + +------------------------------------------------------------------------ + + + + + THE GREAT + TAXICAB ROBBERY + +------------------------------------------------------------------------ + +[ILLUSTRATION: + + RHINELANDER WALDO + COMMISSIONER OF POLICE, NEW YORK CITY +] + +------------------------------------------------------------------------ + + + + + THE GREAT + TAXICAB ROBBERY + + _A TRUE DETECTIVE STORY_ + + BY + JAMES H. COLLINS + + WRITTEN FROM RECORDS AND PERSONAL ACCOUNTS + OF THE CASE FURNISHED BY THE NEW + YORK POLICE DEPARTMENT + + + NEW YORK + JOHN LANE COMPANY + MCMXII + +------------------------------------------------------------------------ + + + + + COPYRIGHT, 1912, BY + JOHN LANE COMPANY + +------------------------------------------------------------------------ + + + + + THIS BOOK HAS SOMETHING TO SAY ABOUT PRACTICAL + RESULTS OF WISER POLICE ADMINISTRATION IN NEW + YORK. IT IS RESPECTFULLY DEDICATED TO + + HON. WILLIAM J. GAYNOR + + MAYOR OF NEW YORK CITY + + THE OFFICIAL WHO TOOK THE INITIATIVE IN IMPROVING + CONDITIONS + +------------------------------------------------------------------------ + + + + + PREFACE + + +THERE ARE SEVERAL REASONS FOR THIS LITTLE BOOK, BUT THE BEST OF ALL IS +THE MAIN REASON—THAT IT IS A CRACKING GOOD STORY, AND RIGHT OUT OF LIFE. +THE CHARACTERS WILL BE FOUND INTERESTING, AND THEY ARE REAL PEOPLE, +EVERY ONE OF THEM. THE INCIDENTS ARE FULL OF ACTION AND COLOR. THE PLOT +HAS MYSTERY, SURPRISE, INTERPLAY OF MIND AND MOTIVE—HAD A NOVELIST +INVENTED IT, THE READER MIGHT DECLARE IT IMPROBABLE. THIS IS THE KIND OF +STORY THAT IS FUNDAMENTAL—THE KIND MR. CHESTERTON SAYS IS SO NECESSARY +TO PLAIN PEOPLE THAT, WHEN WRITERS DO NOT HAPPEN TO WRITE IT, PLAIN +PEOPLE INVENT IT FOR THEMSELVES IN THE FORM OF FOLK-LORE. + +BUT APART FROM THE STORY INTEREST THERE ARE OTHER REASONS. + +WHEN THE NEW YORK POLICE DEPARTMENT HAD RUN DOWN ALL THE THREADS OF THE +PLOT, AND ACCOUNTED FOR MOST OF THE CHARACTERS BY LOCKING THEM UP, THEY +HAD BECOME SO ABSORBED IN THE STORY THEMSELVES, AS A STORY, THAT THEY +THOUGHT THE PUBLIC WOULD ENJOY FOLLOWING IT FROM THE INSIDE. + +WHILE THE CRIME WAS BEING DEALT WITH, THE POLICE WERE SUBJECTED TO +PRETTY SEVERE CRITICISM. THEY FELT THAT THE FACTS WOULD MAKE IT CLEAR +THAT THEY KNEW THEIR TRADE AND HAD BEEN WORKING AT IT DILIGENTLY. + +THE STORY GIVES AN INSIGHT INTO REAL POLICE METHODS. THESE ARE VERY +DIFFERENT FROM THE METHODS OF THE FICTION DETECTIVE, AND ALSO FROM THE +AVERAGE CITIZEN’S IDEA OF POLICE WORK. THEY OUGHT TO BE BETTER KNOWN. +WHEN THE PUBLIC UNDERSTANDS THAT THERE IS NOTHING SECRET, TYRANNICAL OR +DANGEROUS IN GOOD POLICE PRACTICE, AND THAT OUR LAWS SAFEGUARD EVEN THE +GUILTY AGAINST ABUSES, THERE WILL BE HELPFUL PUBLIC OPINION BEHIND +OFFICERS OF THE LAW, AND WE SHALL HAVE A HIGHER DEGREE OF ORDER AND +SECURITY. + +THE DIRECTING MIND IN THIS CASE WAS THAT OF COMMISSIONER GEORGE +DOUGHERTY, EXECUTIVE HEAD OF THE DETECTIVES OF THE NEW YORK POLICE +DEPARTMENT. THOUSANDS OF CLEAN, AMBITIOUS YOUNG FELLOWS ARE CONSTANTLY +PUTTING ON THE POLICEMAN’S UNIFORM ALL OVER THE COUNTRY, AND RISING TO +PLACES AS DETECTIVES AND OFFICIALS. THE MANUFACTURER OR MERCHANT MAY +FIND HIMSELF IN THE POLICE COMMISSIONER’S CHAIR. EVEN THE SUBURBANITE, +WITH HIS BUNDLES, MAY BE, OUT AT LONESOMEHURST, A MEMBER OF THE VILLAGE +COUNCIL, AND THUS RESPONSIBLE FOR THE SUPERVISION OF A POLICE FORCE +THAT, THOUGH IT BE ONLY TWO PATROLMEN AND A CHIEF, IS IMPORTANT IN ITS +PLACE. SO IN WRITING THE STORY THERE HAS BEEN AN EFFORT TO SHOW HOW A +FIRST-RATE MAN LIKE COMMISSIONER DOUGHERTY WORKS. HIS METHODS ARE PLAIN +BUSINESS METHODS. MOST OF HIS LIFE HE HAS EARNED HIS LIVING FOLLOWING +THE POLICEMAN’S TRADE AS A COMMERCIAL BUSINESS. WHAT HE DID IN A CASE OF +THIS KIND, AND HOW, AND WHY, ARE MATTERS OF GENERAL INTEREST AND +IMPORTANCE. + +FINALLY, THE STORY THROWS SOME USEFUL LIGHT ON CRIMINALS. IT SHOWS THE +CUNNING OF THE UNDERWORLD, AND ALSO ITS LIMITATIONS. TO FREE THE +LAW-ABIDING MIND OF ROMANTIC NOTIONS ABOUT THE CRIMINAL, AND SHOW HIM AS +HE IS, IS HIGHLY IMPORTANT IN THE PREVENTION OF CRIME. + +------------------------------------------------------------------------ + + + + + LIST OF ILLUSTRATIONS + + + FACING + PAGE + + RHINELANDER WALDO, COMMISSIONER OF + POLICE, NEW YORK CITY + + _FRONTISPIECE_ + + GEORGE S. DOUGHERTY, SECOND DEPUTY 20 + POLICE COMMISSIONER + + EDWARD P. HUGHES, INSPECTOR IN COMMAND 40 + OF DETECTIVE BUREAU, AND DOMINICK G. + RILEY, LIEUTENANT AND AIDE TO + COMMISSIONER DOUGHERTY + + GENO MONTANI, EDDIE KINSMAN, GENE 60 + SPLAINE, “SCOTTY THE LAMB” AND JOHN + MOLLOY + + JAMES PASQUALE, BOB DELIO, JESS 80 + ALBRAZZO, AND MATTEO ARBRANO + + “SCOTTY” RECEIVES FINAL INSTRUCTIONS 110 + + “THE BRIGANDS” “STICK-UP” THE HOLD-UP 126 + MEN FOR THEIRS + +------------------------------------------------------------------------ + + + + + THE CAST + + + GENO MONTANI, A TAXICAB PROPRIETOR. + WILBUR SMITH, AN ELDERLY BANK TELLER. + FRANK WARDLE, A SEVENTEEN-YEAR-OLD BANK OFFICE BOY. + EDDIE KINSMAN, ALIAS “COLLINS,” ALIAS “EDDIE THE BOOB,” A HOLD-UP MAN. + BILLY KELLER, ALIAS “DUTCH,” A HOLD-UP MAN. + GENE SPLAINE, A HOLD-UP MAN. + “SCOTTY THE LAMB,” A THIEVES’ HELPER, OR “STALL.” + JOE PHILADELPHIA, ALIAS “THE KID,” A RUNNER FOR THIEVES, OR “LOBBYGOW.” + JAMES PASQUALE, ALIAS “JIMMY THE PUSH,” KEEPER OF SHADY RESORTS KNOWN + AS “208” AND “233.” + BOB DEILIO, PARTNER OF “JIMMY THE PUSH.” + JESS ALBRAZZO, A MIDDLEMAN, FORMERLY KEEPER OF THE ARCH CAFé, PAL OF + MONTANI, “JIMMY THE PUSH” AND BOB DEILIO. + MATTEO ARBRANO, } + PAULI GONZALES, } THE “THREE BRIGANDS.” + CHARLES CAVAGNARO, } + “KING DODO,” A BOWERY CHARACTER. + RHINELANDER WALDO, POLICE COMMISSIONER OF NEW YORK. + GEORGE S. DOUGHERTY, SECOND DEPUTY POLICE COMMISSIONER, EXECUTIVE HEAD + OF DETECTIVES. + INSPECTOR EDWARD P. HUGHES, IN COMMAND OF DETECTIVE BUREAU. + POLICE LIEUTENANT DOMINICK G. RILEY, AIDE OF COMMISSIONER DOUGHERTY’S + STAFF. + DETECTIVE SERGT JOHN J. O’CONNELL, OFFICIAL STENOGRAPHER. + THE DETECTIVES ON “PLANTS,” “TRAILING,” “SURROUNDING,” “ARRESTING,” + ETC.: + + JOHN P. BARRON, EDWARD BOYLE, FRANK CAMPBELL, JAMES DALTON, JAMES J. + FINAN, JOHN W. FINN, JOSEPH A. DALY, DANIEL W. CLARE, JOHN GAYNOR, + ANTHONY GRIECO, JOHN P. GRIFFITH, DANIEL F. HALLIHAN, EDWARD LENNON, + HENRY MUGGE, RICHARD OLIVER, GUSTAVUS J. RILEY, JAMES F. SHEVLIN, + JOSEPH TONER, GEORGE TROJAN, JAMES A. WATSON. + + “SWEDE ANNIE,” KINSMAN’S SWEETHEART. + MYRTLE HORN, A PAL OF ANNIE. + ROSE LEVY, A NEWCOMER IN THOMPSON STREET, JESS ALBRAZZO’S GIRL. + MRS. ISABELLA GOODWIN, A POLICE MATRON. + MRS. SULLIVAN, KEEPER OF A WEST SIDE ROOMING HOUSE. + “JOSIE,” A LADY OF THE LEVEE DISTRICT, CHICAGO. + + DETECTIVES, POLICEMEN, INFORMANTS, WITNESSES, DENIZENS OF THE + UNDERWORLD, NEWSPAPER REPORTERS, TRAINMEN, TICKET SELLERS, ETC., + ETC. + + * * * * * + + PLACE—CHIEFLY IN NEW YORK, WITH SCENES IN CHICAGO, ALBANY, MEMPHIS, + BOSTON AND MONTREAL. + + TIME—FEBRUARY AND MARCH, 1912. + +------------------------------------------------------------------------ + + + + + THE + GREAT TAXICAB ROBBERY + + + + + CHAPTER I + WHAT THE PUBLIC HEARD ABOUT THE CRIME + + +ON THURSDAY, FEBRUARY 15, 1912, THE NEW YORK EVENING PAPERS HAD A +STARTLING NEWS STORY. + +BETWEEN TEN AND ELEVEN O’CLOCK THAT MORNING TWO MESSENGERS WERE SENT IN +A TAXICAB FROM THE EAST RIVER NATIONAL BANK, AT BROADWAY AND THIRD +STREET, TO DRAW $25,000 IN CURRENCY FROM THE PRODUCE EXCHANGE NATIONAL +BANK, AT BROADWAY AND BEAVER STREET, IN THE DOWNTOWN FINANCIAL DISTRICT, +AND BRING IT UPTOWN. THIS TRANSFER OF MONEY HAD BEEN MADE SEVERAL TIMES +A WEEK FOR SO LONG A PERIOD WITHOUT DANGER OR LOSS THAT THE MESSENGERS +WERE UNARMED. ONE OF THEM, WILBUR F. SMITH, WAS AN OLD MAN WHO HAD BEEN +IN THE SERVICE OF THE BANK THIRTY-FIVE YEARS, AND THE OTHER WAS A MERE +BOY, NAMED WARDLE, SEVENTEEN YEARS OLD. THE TAXICAB MAN, AN ITALIAN +NAMED GENO MONTANI, SEEMED ALMOST A TRUSTED EMPLOYEE, TOO, FOR HE +OPERATED TWO CABS FROM A STAND NEAR THE BANK, AND WAS FREQUENTLY CALLED +UPON FOR SUCH TRIPS. + +WHILE THE CAB WAS RETURNING UPTOWN THROUGH CHURCH STREET WITH THE MONEY, +FIVE MEN SUDDENLY CLOSED IN UPON IT. ACCORDING TO THE CHAUFFEUR’S STORY, +A SIXTH MAN FORCED HIM TO SLACKEN SPEED BY STUMBLING IN FRONT OF THE +VEHICLE. IMMEDIATELY TWO MEN ON EACH SIDE OF THE CAB OPENED THE DOORS. +TWO ASSAILANTS WERE BOOSTED IN AND QUICKLY BEAT THE MESSENGERS INTO +INSENSIBILITY, WHILE THEIR TWO HELPERS RAN ALONG ON THE SIDEWALK. THE +FIFTH MAN CLIMBED ONTO THE SEAT BESIDE THE CHAUFFEUR, HELD A REVOLVER TO +HIS RIBS, AND ORDERED HIM TO DRIVE FAST ON PERIL OF HIS LIFE. THIS +FELLOW SEEMED TO BE FAMILIAR WITH AUTOMOBILES, AND THREATENED THE DRIVER +WHEN HE TRIED TO SLACKEN SPEED. THAT IS A BUSY PART OF THE CITY. YET +NOBODY ON THE SIDEWALKS SEEMED TO NOTICE ANYTHING OUT OF THE ORDINARY. +THE CAB DODGED VEHICLES, GOING AT HIGH SPEED FOR SEVERAL BLOCKS. AT PARK +PLACE AND CHURCH STREET, AFTER A TRIP OF ELEVEN BLOCKS, AT A BUSY +CORNER, THE CHAUFFEUR WAS ORDERED TO STOP THE CAB, AND THE THREE ROBBERS +GOT DOWN, CARRYING THE $25,000 IN A LEATHER BAG, RAN QUICKLY TO A BLACK +AUTOMOBILE WITHOUT A LICENSE NUMBER WHICH WAS WAITING FOR THEM, AND IN A +FEW MOMENTS WERE GONE. + +THAT WAS THE SUBSTANCE OF THE STORY. + +INFORMATION CAME CHIEFLY FROM THE CHAUFFEUR, BECAUSE THE TWO BANK +EMPLOYEES HAD BEEN ATTACKED SO SUDDENLY AND VICIOUSLY THAT THEY LOST +CONSCIOUSNESS IN A MOMENT. WHEN THE CHAUFFEUR LOOKED INSIDE HIS CAB +AFTER THE CRIME, HE SAID, HE SAW THEM BOTH LYING SENSELESS AND BLEEDING. +THEY COULD GIVE NO DESCRIPTION OF THE ASSAILANTS. EYE-WITNESSES WERE +FOUND WHO HAD SEEN MEN LOITERING IN THE NEIGHBORHOOD WHERE THE CAB WAS +BOARDED SHORTLY BEFORE THE CRIME, BUT THEIR DESCRIPTIONS WERE NOT VERY +USEFUL. + +THAT NIGHT THE NEW YORK EVENING PAPERS PUBLISHED ACCOUNTS OF THE CRIME +UNDER GREAT BLACK HEADLINES, AND ON THE FOLLOWING MORNING EVERY NEWS +ITEM OF A CRIMINAL NATURE WAS GROUPED IN THE SAME PART OF THE PAPERS TO +PROVE THAT THE CITY HAD ENTERED ONE OF ITS SENSATIONAL “WAVES OF CRIME.” +AND FOR MORE THAN A WEEK THE PUBLIC READ CRITICISM AND DENUNCIATION OF +THE POLICE FORCE. + +IT WAS CHARGED THAT THE POLICE HAD BECOME “DEMORALIZED,” AND VARIOUS +CHANGES OF ADMINISTRATIVE POLICY INTRODUCED INTO THE DEPARTMENT WITHIN +THE PAST EIGHT MONTHS WERE BLINDLY DENOUNCED. + +THE MOST IMPORTANT OF THESE CHANGES WAS THAT DEVISED BY MAYOR GAYNOR. +EIGHT OR TEN YEARS AGO, EVERY UNIFORMED POLICEMAN IN NEW YORK CARRIED A +CLUB, AND OFTEN USED IT FREELY IN DEFENDING HIMSELF WHILE MAKING +ARRESTS. ABUSES LED TO THE ABOLITION OF THIS MEANS OF DEFENSE EXCEPT FOR +OFFICERS PATROLLING THE STREETS AT NIGHT. THERE WERE STILL UNDOUBTED +ABUSES, HOWEVER, AND WHEN MAYOR GAYNOR CAME INTO OFFICE, BRINGING +WELL-THOUGHT-OUT OPINIONS OF POLICE ADMINISTRATION FROM HIS EXPERIENCE +AS A MAGISTRATE ON THE BENCH, HE TOOK A DETERMINED STAND FOR MORE HUMANE +METHODS OF MAKING ARRESTS, AND STRICT HOLDING OF EVERY POLICEMAN TO THE +LETTER OF THE LAWS. EVERY CASE OF CLUBBING WAS PROSECUTED, THE PLAIN +LEGAL RIGHTS OF CITIZENS OR CRIMINALS UPHELD, AND THE POLICE DEPARTMENT +BEGAN TEACHING ITS MEN NEW WAYS OF DEFENDING THEMSELVES BY SKILLFUL +HOLDS IN WRESTLING WHEREBY PRISONERS MAY BE HANDLED EFFECTUALLY AND +WITHOUT DOING THEM HARM. SENTIMENT AGAINST THE USE OF THE CLUB BEGAN TO +GROW IN THE POLICE DEPARTMENT ITSELF, IT BEING RECOGNIZED THAT CLUBBING +WAS AN UNSKILLFUL MEANS OF DEFENSE, AND THAT SPECIAL ATHLETIC DEVICES +WERE MORE WORKMANLIKE. + +NOW, HOWEVER, THE NEWSPAPERS PUBLISHED EVERY CHANCE OPINION OF +DISCHARGED, RETIRED AND ANONYMOUS POLICE OFFICERS WHO OBJECTED TO THE +NEW REGULATIONS. IT WAS ALLEGED THAT CRIMINALS HAD GOT OUT OF BOUNDS +BECAUSE POLICEMEN NO LONGER DARED CLUB THEM INTO GOOD BEHAVIOR, AND THE +EDITORS, WITHOUT PAYING MUCH ATTENTION TO THE MANY GOOD POINTS OF THE +NEW REGULATIONS, OR TRYING TO UNDERSTAND THE MERITS OF A SETTLED POLICY +APPLIED TO AN ORGANIZATION OF MORE THAN TEN THOUSAND MEN, SET UP A CRY +FOR THE PRESUMABLY “GOOD OLD DAYS” OF INSPECTOR SO-AND-SO AND CHIEF +THIS-AND-THAT, WHEN EVERY KNOWN CRIMINAL WAS PROMPTLY STRUCK OVER THE +HEAD ON SIGHT AND THEREBY TAUGHT TO KNOW HIS PLACE. IF THE FILES OF NEW +YORK JOURNALS FOR THOSE DAYS FOLLOWING THE ROBBERY ARE EXAMINED THEY +WILL REVEAL A CURIOUS EXHIBITION OF PLEADING FOR OFFICIAL LAWLESSNESS +AND AUTOCRACY. + +------------------------------------------------------------------------ + +[ILLUSTRATION: + + GEORGE S. DOUGHERTY + SECOND DEPUTY POLICE COMMISSIONER +] + +------------------------------------------------------------------------ + +ANOTHER POINT OF CRITICISM CENTERED ON A NEW METHOD ADOPTED IN THE +DISTRIBUTION OF THE DETECTIVE FORCE. THIS COMPRISES MORE THAN FIVE +HUNDRED MEN. FOR YEARS THEY WERE ALL REQUIRED TO REPORT AT POLICE +HEADQUARTERS EVERY DAY, COMING FROM DISTANT PRECINCTS, AND HAD AN +OPPORTUNITY TO SEE WHATEVER PROFESSIONAL CRIMINALS WERE UNDER ARREST. +THEN THEY WENT BACK TO DIFFERENT PRECINCTS TO WORK. THIS TOOK TOO MUCH +TIME, IT WAS FOUND, AND THE OLD-FASHIONED “LINE-UP” OF CRIMINALS WAS +CHIEFLY A SPECTACLE, THE SAME OFFENDERS DROPPING INTO THE HANDS OF THE +POLICE WITH MORE OR LESS REGULARITY. SO DETECTIVES WERE RE-DISTRIBUTED +ON A PLAN THAT ATTACHES A PROPER NUMBER OF PLAIN-CLOTHES POLICEMEN TO +EACH PRECINCT, ACCORDING TO ITS NEEDS, AND IN THOSE PRECINCTS THE MEN +LIVE AND BECOME ACQUAINTED WITH LOCAL CRIMINALS. MANY OF THEM WORK IN +SECTIONS WHERE THEY WERE BORN, AND DETECTIVES SPEAKING FOREIGN LANGUAGES +ARE ASSIGNED TO FOREIGN QUARTERS. + +THE NEWSPAPERS CHARGED THAT RED-TAPE HAD BROUGHT THE POLICE DEPARTMENT +TO SUCH A LOW STATE THAT YOUNG DETECTIVES HAD NO IDEA WHAT A REAL +CRIMINAL LOOKED LIKE, AND URGED THE RESTORATION OF THE OLD SYSTEM, WITH +ITS PICTURESQUE “LINE-UP.” + +IN THE DAYS OF INSPECTOR BYRNES, WHEN PRACTICALLY ALL THE BANKING OF THE +CITY WAS DONE AROUND WALL STREET, THE POLICE ESTABLISHED A “DEAD LINE” +BEYOND WHICH CRIMINALS WERE SUPPOSED NOT TO OPERATE. IN ITS DAY, THE +“DEAD LINE” WAS REAL ENOUGH, UNDOUBTEDLY. BUT IT WAS NOT NECESSARILY AN +IDEAL POLICE MEASURE, AND THE GROWTH OF THE CITY HAS LONG MADE IT A MERE +MEMORY, LIVING ONLY IN NEWSPAPER TRADITION. TO-DAY, BANKING EXTENDS AS +FAR NORTH AS CENTRAL PARK, AND MILLIONS UPON MILLIONS OF DOLLARS ARE +BEING CARRIED ABOUT DAILY BY PEOPLE OF EVERY SORT. DESPITE THE FACT THAT +THE LAST LOSS OF MONEY FROM A NEW YORK BANK THROUGH PROFESSIONAL +CRIMINALS (APART FROM FRAUD AND FORGERY) DATED BACK SOME FIFTEEN OR +EIGHTEEN YEARS, THE NEWSPAPERS SEEMED TO AGREE THAT LIFE AND PROPERTY +WERE NO LONGER SAFE IN THE CITY BECAUSE THIS PURELY MYTHICAL “DEAD LINE” +HAD BEEN DISREGARDED BY THE ROBBERS. + +THERE WAS OTHER COMMENT OF THE SAME CHARACTER, AND IT HAD AN IMMEDIATE +AND GRIEVOUS EFFECT. + +ON THE DAY AFTER THE ROBBERY A CHANCE REMARK ABOUT A SAFE IN AN EAST +SIDE BANK, COUPLED WITH THE GENERAL EXCITEMENT, LED TO A RUN OF ITS +DEPOSITORS, CHIEFLY PEOPLE OF FOREIGN BIRTH. THE BANK WAS SOLVENT, AND +THE RUN WAS UNDOUBTEDLY STIMULATED BY GOSSIP STARTED BY CRIMINALS FOR +THEIR OWN ENDS. BUT THE FRIGHTENED DEPOSITORS INSISTED ON DRAWING OUT +THEIR MONEY, AND EXPOSING THEMSELVES TO DANGER OF ROBBERY AND ASSAULT. +THE SITUATION WAS MET BY CAREFUL POLICE CO-OPERATION. + +ABOUT SIX MONTHS BEFORE THE TAXICAB ROBBERY, THE NEW YORK LEGISLATURE +PUT INTO FORCE A MEASURE KNOWN AS THE “SULLIVAN LAW,” PROVIDING +PENALTIES FOR THE CARRYING OF PISTOLS AND CONCEALED WEAPONS. THIS IS +UNQUESTIONABLY A WISE MEASURE FUNDAMENTALLY, AND ONE THAT WAS BADLY +NEEDED FOR POLICE ADMINISTRATION AND PUBLIC SAFETY. IT IS PERHAPS OPEN +TO CERTAIN MODIFICATIONS, TO BE MADE AS ACTUAL CONDITIONS ARE +ENCOUNTERED IN PRACTICAL WORKING OF THE LAW. NEWSPAPER OPINION DREW A +CONNECTION BETWEEN THIS LAW AND THE “WAVE OF CRIME,” AND ITS REPEAL WAS +URGED, SO THAT EVERY CITIZEN MIGHT ARM HIMSELF AS HE PLEASED. HUNDREDS +OF PERSONS WHO HAD FELT SAFE IN GOING ABOUT THEIR BUSINESS UNARMED NOW +APPLIED FOR PERMITS TO CARRY PISTOLS. + +FORTUNATELY, A SENSATION DOES NOT LAST LONG IN NEW YORK. + +THOUGH THE POLICE DEPARTMENT FELT THIS CRITICISM KEENLY, AND WAS +HAMPERED BY IT, PRESSURE BEGAN TO SLACKEN IN ABOUT A WEEK. OTHER +SENSATIONS CAME ALONG. THERE WAS NOTHING TO PUBLISH ABOUT THE TAXICAB +CASE, AS POLICE INFORMATION WAS WITHHELD FOR GOOD OFFICIAL REASONS. +PRESENTLY THE TOWN VENTURED TO JOKE ABOUT THE CASE. AT AN ELABORATE +PUBLIC DINNER ONE NIGHT, AMONG OTHER TOPICAL EFFECTS, A DUMMY TAXICAB +SUDDENLY SCOOTED OUT BEFORE THE GUESTS, HELD UP A DUMMY POLICE +COMMISSIONER, TOOK HIS WATCH, AND SCOOTED AWAY AGAIN. THE DINERS +LAUGHED, AND THAT WAS FAIRLY REPRESENTATIVE OF THE TOWN, WHICH WAS NOW +READY TO HAVE ITS JOKE ABOUT THE CRIME, TOO. HAD THERE NEVER BEEN ANY +FURTHER ACTION BY THE POLICE, THE CASE WOULD HAVE QUIETLY DROPPED OUT OF +SIGHT. BUT FORTUNATELY THERE WAS POLICE ACTION, AND WITH THAT WE SHALL +NOW DEAL. + +------------------------------------------------------------------------ + + + + + CHAPTER II + HOW THE CRIME WAS HANDLED BY THE POLICE—ON THE TRAIL + + +NOW, LET US FOLLOW THE POLICE STORY. WE WILL BEGIN AT THE VERY +BEGINNING, WATCH THE INCIDENTS AND CHARACTER UNFOLD, AND GIVE QUITE A +LITTLE ATTENTION TO THE TECHNICAL METHODS BY WHICH RESULTS WERE ARRIVED +AT. FOR THE STORY IS A STUDY IN CLEAN, STRAIGHTFORWARD DETECTIVE WORK, +AND THAT WORK OUGHT TO BE BETTER KNOWN BY THE PUBLIC, SO THAT +INTELLIGENT PUBLIC OPINION MAY BACK UP HONEST POLICE EFFORT. + +THE STORY STARTS WITH A BURLY, GENIAL MAN, SITTING IN A BIG OFFICE AT +POLICE HEADQUARTERS. THE OFFICE IS THAT OF THE SECOND DEPUTY POLICE +COMMISSIONER, AND THE MAN IS THE COMMISSIONER HIMSELF, GEORGE S. +DOUGHERTY. + +COMMISSIONER DOUGHERTY DOMINATES THE STORY. THE TAXICAB ROBBERS WERE +CAUGHT BY HIS METHODS, PLANS AND SUPERVISION, BACKED BY THE SPLENDID +TEAM WORK OF THE MEN UNDER HIM. HIS OWN SOURCES OF INFORMATION SUPPLIED +THE CLUES, AND HIS PERSONAL SKILL IN EXAMINING CRIMINALS BROUGHT OUT THE +CONFESSIONS THAT SAVED THE CITY THE EXPENSE OF TRIALS WITH ALL BUT ONE +OFFENDER. IT IS FAR FROM THE WRITER’S WISH TO INDULGE IN HERO-WORSHIP, +HOWEVER, SO THESE DETAILS WILL APPEAR IN THEIR PROPER PLACE IN THE +NARRATIVE. + +GEORGE DOUGHERTY HAS HAD NEARLY TWENTY-FIVE YEARS’ EXPERIENCE IN +CRIMINAL WORK IN NEW YORK, AND OVER THE WHOLE COUNTRY. UNTIL HIS +APPOINTMENT BY MAYOR GAYNOR IN MAY, 1911, HE WAS CONNECTED WITH THE +PINKERTON ORGANIZATION. BANK AND FINANCIAL CRIMES HAVE LONG BEEN HIS +SPECIALTY, SO THE TAXICAB CASE FELL RIGHT INTO HIS OWN PROVINCE. HE +KNOWS THE WAYS OF FORGERS, BANK SNEAKS, SWINDLERS, BURGLARS AND +“YEGGMEN,” AND IS PERSONALLY ACQUAINTED WITH MOST OF THE CRIMINALS IN +THOSE LINES IN AND OUT OF PRISON. HE HAS ALSO HAD MUCH TO DO WITH +PROTECTING THE CROWDS AT RACES, BALL GAMES, AERONAUTIC MEETINGS AND +OTHER BIG GATHERINGS. AS EXECUTIVE HEAD OF THE DETECTIVE BUREAU, FIVE +HUNDRED PLAIN-CLOTHES POLICEMEN SCATTERED OVER GREATER NEW YORK COVER +ALL CRIMES OF A LOCAL AND ROUTINE NATURE, AND ARE SUBJECT TO HIS CALL +WHEN A SPECIAL CASE LIKE THE TAXICAB ROBBERY COMES UP FOR HIS PERSONAL +ATTENTION. + +ON AN ORDINARILY QUIET MORNING AT POLICE HEADQUARTERS, THERE WILL BE A +STEADY STREAM OF PEOPLE PASSING INTO DOUGHERTY’S OFFICE. SEVERAL +ASSISTANTS GUARD THE DOORS LEADING FROM TWO ANTE-ROOMS, AND MARSHAL THE +VISITORS. NOW A GROUP OF DETECTIVES ENTERS AND HEARS A TALK ON METHODS. +THEN TWO DETECTIVES COME IN, MAKE A REPORT AND RECEIVE FURTHER +INSTRUCTIONS. THEN THERE WILL BE AN INTERRUPTION, PERHAPS, WHILE AN +ASSISTANT SOOTHES AND SENDS AWAY A CRANK WHO OCCASIONALLY TURNS UP WITH +A PURELY IMAGINARY AFFAIR OF HIS OWN, AND TWO MORE DETECTIVES PASS IN +ACCOMPANIED BY A MAN AND A WOMAN WHO LOOK JUST LIKE THE PEOPLE ONE SEES +DINING AT A FASHIONABLE UPTOWN RESTAURANT. THE WOMAN’S FURS ARE +MAGNIFICENT, AND HER HAT A COSTLY FIFTH AVENUE CREATION. + +“A COUPLE OF TAXPAYERS?” SPECULATES THE GROUP OF REPORTERS, WAITING +OUTSIDE TO GET A STATEMENT ABOUT SOME IMPORTANT CASE. + +“TWO OF THE CLEVEREST CHECK SWINDLERS IN THE COUNTRY,” CORRECTS A +DETECTIVE, AND PRESENTLY THE REPORTERS ARE CALLED IN, AND DOUGHERTY +RECITES NAMES, DATES AND FACTS CONNECTED WITH THE GANG TO WHICH THESE +PROSPEROUS “TAXPAYERS” BELONG, GAZING REFLECTIVELY OUT OF THE WINDOW AS +DETAILS COME BACK IN MEMORY, AND CHUCKLING WITH THE DELIGHTED +JOURNALISTS AS THE PITHY SLANG AND PROFESSIONAL NAMES OF THE UNDERWORLD +ARE JOTTED DOWN ON THEIR PADS. THEY FIRE A SCATTERING VOLLEY OF +QUESTIONS AT HIM AND DEPART, AND THEN HIS SECRETARY ANNOUNCES THAT THE +SALOON-KEEPER WHO KNOWS A GOOD DEAL ABOUT THE BLIND PUPPY CAFé CASE IS +OUTSIDE, BUT REFUSES TO TALK TO THE POLICE AT ALL. + +“HULLO!” IS THE COMMISSIONER’S OFF-HAND GREETING AS THE CAUTIOUS +SALOON-KEEPER COMES IN, AND IN TWO MINUTES THE LATTER IS ANSWERING +QUESTIONS FREELY. + +“WHY, SAY!” HE EXCLAIMS, “I’LL TELL _YOU_ ANYTHING.” + +THEN A HUMBLE LITTLE WOMAN IN A CHEAP HAT AND A LONG CLOAK IS BROUGHT +IN. FOR MORE THAN AN HOUR SHE HAS BEEN WAITING OUTSIDE, WITH HER EYES +FIXED PATIENTLY ON THE DOOR LEADING TO THE INNER OFFICE. + +“STAND THERE,” SAYS THE COMMISSIONER, WITH GRUFF KINDNESS, AND HE MAKES +A FORMAL STATEMENT ABOUT HER HUSBAND, WHO HAS BEEN ARRESTED WITH A +CRIMINAL GANG, AND IS PRETTY CERTAIN TO GO TO PRISON. HE TELLS HER WHAT +HAS BEEN DONE IN THE CASE, AND WHAT WILL FOLLOW, AND THE LITTLE WOMAN +LISTENS MUTELY. WHEN HE FINISHES, HER EYES FILL WITH TEARS. BUT SHE +MAKES NO REPLY, NOR ANY SOUND. THE COMMISSIONER WINKS FAST AS HE LOOKS +OUT OF THE WINDOW AGAIN, AND THEN SAYS, SYMPATHETICALLY: + +“THAT’S THE BEST THAT CAN BE DONE. BUT DON’T YOU WORRY. COME IN AND SEE +ME AGAIN. KEEP IN TOUCH WITH ME, AND DON’T WORRY YOURSELF. COME IN AND +TALK WITH ME—COME IN TO-MORROW.” AND SHE BRAVELY WIPES HER EYES AND GOES +OUT WITH HER TROUBLE. + +THE PROCESSION CONTINUES. + +POLICE CAPTAINS AND DETECTIVES IN SQUADS, PRISONERS AND WITNESSES IN +TWOS AND THREES, NEWSPAPER MEN IN CORPS AND SINGLY, AND OCCASIONALLY A +CAUTIOUS GENTLEMAN WHO WANTS TO SEE THE COMMISSIONER ALONE, AND IS +ANXIOUS THAT NOBODY SAY ANYTHING ABOUT THIS VISIT TO POLICE +HEADQUARTERS—FOR HE IS AN INFORMANT. + + + _THE FIRST ALARM_ + +THE TAXICAB ROBBERY TOOK PLACE ON A QUIET MORNING LIKE THIS. + +SUDDENLY, AROUND ELEVEN O’CLOCK ON THURSDAY, FEBRUARY 15, A BRIEF +MESSAGE COMES FROM THE SECOND PRECINCT, STATING THAT A ROBBERY HAS BEEN +COMMITTED IN THE FINANCIAL DISTRICT. A LITTLE LATER THERE IS A FULLER +REPORT OVER POLICE WIRES. THE DETAILS ARE FEW, AS WILL BE SEEN BY THE +GENERAL ALARM THAT PRESENTLY GOES OUT OVER THE CITY: + + _POLICE DEPARTMENT, CITY OF NEW YORK_, + + FEBRUARY 15, 1912. + + TO ALL, ALL BOROUGHS—NOTIFY THE PATROL PLATOON IMMEDIATELY. + + ARREST FOR ASSAULT AND ROBBERY THREE MEN: + + NO. 1, ABOUT 35 YEARS, FIVE FEET EIGHT OR NINE INCHES IN HEIGHT, + 160 OR 170 POUNDS, SMALL STUBBY DARK MUSTACHE, DARK COMPLEXION, + MEDIUM BUILD, DARK SUIT AND CAP, NO OVERCOAT. + + NO. 2, ABOUT 35 YEARS, FIVE FEET TEN INCHES IN HEIGHT, SLENDER + BUILD, DARK HAIR, POSSIBLY SMOOTH SHAVEN, LIGHT BROWN SUIT, NO + OVERCOAT, WORE A CAP. + + NO DESCRIPTION OF NO. 3. + + STOLE $25,000 IN FIVE AND TEN DOLLAR BILLS, CONTAINED IN A BROWN + LEATHER TELESCOPE BAG, 24 INCHES LONG, 16 INCHES SQUARE, FROM + TWO BANK MESSENGERS IN A TAXICAB ABOUT 11 THIS A. M., AT PARK + PLACE AND CHURCH STREET, AND ESCAPED IN A FIVE OR SEVEN-SEATED + BLACK TOURING CAR, TOP UP. LOOK OUT FOR THIS CAR, BAG AND + OCCUPANTS ON STREETS, AT FERRY ENTRANCES, BRIDGE TERMINALS, + RAILROAD STATIONS. INQUIRE AT ALL GARAGES, AUTOMOBILE STANDS, + STABLES, ETC. + + IF FOUND, NOTIFY DETECTIVE BUREAU. + +BEFORE NOON, THE COMMISSIONER HAS POSTPONED APPOINTMENTS, ASSIGNED +ROUTINE BUSINESS, AND IS ENGAGED IN AN INVESTIGATION THAT WILL KEEP HIM +BUSY UNTIL THAT MORNING, TWELVE DAYS LATER, WHEN THE FIRST ARRESTS ARE +MADE, AND THE CASE IS, IN POLICE PARLANCE, “BROKEN.” + +WHERE DO THE POLICE BEGIN IN SUCH A CRIME? WHAT DO THEY START WITH WHEN +THERE IS APPARENTLY SO LITTLE TO WORK UPON? + +IN SPITE OF THE WIDE POPULAR INTEREST IN POLICE AND CRIMINAL MATTERS, +THE AVERAGE CITIZEN HAS NO VERY CLEAR IDEA. EVEN THE NEWSPAPER REPORTER, +FOLLOWING POLICE ACTIVITIES EVERY DAY, IS NOT WELL INFORMED IN TECHNICAL +DETAILS. SOME INFORMATION IS NECESSARILY WITHHELD FROM HIM, AND HE IS A +BUSY YOUNG MAN, WITH HIS OWN TECHNICAL VIEWPOINT, WORKING HARD TO GET +HIS OWN KIND OF INFORMATION. + +THIS LACK OF KNOWLEDGE LEADS TO A FEELING OF MYSTERY, HELPLESSNESS AND +TERROR AFTER A SENSATIONAL CRIME, AND TO CRITICISM OF THE POLICE. THEY +ARE AT WORK, SKILLFULLY, HONESTLY, DILIGENTLY. BUT RESULTS TAKE TIME. IT +WOULD DO LITTLE GOOD TO MAKE ARRESTS WITHOUT EVIDENCE. THE CITIZEN’S +SYMPATHIES ARE AROUSED BY BRUTAL LAWLESSNESS, AND HE URGES THAT SOMEBODY +BE CAUGHT AND PUNISHED. IF RESULTS ARE NOT AT ONCE APPARENT, HE JUMPS TO +THE CONCLUSION THAT THE POLICE ARE “DEMORALIZED.” HE WOULD BE STARTLED +IF HE COULD SEE HOW QUICKLY AND PERSISTENTLY THE UNDERWORLD TAKES STEPS +TO STRENGTHEN HIM IN THAT CONCLUSION, AND USE HIM TO DISCREDIT THE +POLICE. + +SIXTY DETECTIVES ARE IMMEDIATELY CALLED INTO THE CASE. FIVE OF THEM GO +DOWN TO THE SCENE OF THE ROBBERY, WITH ORDERS TO WORK THERE UNTIL +FURTHER NOTICE. THEY MAKE A THOROUGH SEARCH OF THE NEIGHBORHOOD, +FOLLOWING THE ROUTE TAKEN BY MONTANI’S TAXICAB, AND QUESTIONING +MERCHANTS, NEWSDEALERS, PORTERS, TRUCKMEN AND OTHER PERSONS LIKELY TO +HAVE INFORMATION AS EYE-WITNESSES. THEY GO THROUGH THE STREETS THAT MAY +HAVE BEEN TAKEN BY THE ESCAPING ROBBERS, AND WORK OVER THE WHOLE GROUND. +THIS SEARCH THROUGH ONE OF THE BUSIEST SECTIONS OF NEW YORK IN A BUSY +HOUR, AMID THE EXCITEMENT CREATED BY THE CRIME, MAY APPEAR LIKE HOPELESS +BUSINESS. BUT, AS WILL BE SEEN PRESENTLY, IT YIELDS IMPORTANT RESULTS. +OTHER DETECTIVES SEARCH GARAGES FOR THE BLACK AUTOMOBILE WITHOUT A +LICENSE NUMBER IN WHICH THE ROBBERS ARE REPORTED TO HAVE GOT AWAY. FOUR +UNIFORMED POLICEMEN ON BEATS ALONG THE ROUTE TAKEN BY THE TAXICAB ARE +QUESTIONED. OTHER DETAILED INQUIRIES OF THE SAME NATURE ARE STARTED. + +BUT THE MOST IMPORTANT WORK OF THE FIRST DAY CENTERS AT POLICE +HEADQUARTERS, WHERE A CONFERENCE IS HELD BY COMMISSIONER DOUGHERTY AND +HIS ASSISTANTS, AND IN THE EXAMINATION OF MONTANI, THE TAXICAB DRIVER. + +STRIP ALL THE LABELS OFF A SUIT OF CLOTHES AND LAY IT BEFORE A COMMITTEE +OF TAILORS. IN A FEW MOMENTS CERTAIN POINTS WOULD BE AGREED UPON. IT MAY +BE A NEW SUIT, OR AN OLD ONE, A FINE PIECE OF TAILORING, OR A CHEAP +HAND-ME-DOWN. THE COMMITTEE COULD OFTEN IDENTIFY THE CHEAP SUIT AND TELL +THE NAME OF ITS MANUFACTURER, WHILE WITH A SEVENTY-FIVE-DOLLAR SUIT IT +MIGHT BE POSSIBLE TO DETERMINE THE MAKER’S NAME. THIS HOLDS TRUE OF MANY +OTHER LINES OF WORK, AND IT IS PARTICULARLY TRUE OF CRIMINAL +INVESTIGATION. + +WHO CUT AND MADE THAT SUIT OF CLOTHES? + +THE CONFERENCE SAT DOWN TO DETERMINE THIS, JUDGING THE ROBBERY STRICTLY +AS A PIECE OF WORKMANSHIP. NAMES OF KNOWN BANK CRIMINALS WERE BROUGHT +UP, ONE BY ONE, AND DETAILS GONE OVER. IT SOON BECAME CLEAR THAT NONE OF +THE MEN IDENTIFIED WITH BANK CRIME WERE LIKELY TO HAVE THE BRAINS, SKILL +OR ORGANIZATION TO PLAN AND EXECUTE SO COMPLICATED A ROBBERY. + +THE CRIMINALS HAD KNOWN THE HABITS OF THE BANK IN CONVEYING CASH UPTOWN. +THEY KNEW THE ROUTE, AND WERE AWARE THAT THE GUARD WAS ONLY AN ELDERLY +MAN AND A SEVENTEEN-YEAR-OLD BOY, BOTH UNARMED. THEY HAD BOARDED THE CAB +AT THE BEST POINT, AND EVIDENTLY MADE ARRANGEMENTS FOR STOPPING IT. +THERE WAS TEAM WORK IN EVERY DETAIL. IT SHOWED MARKED INSIGHT, FOR +INSTANCE, TO PROVIDE ADDITIONAL MEN TO BOOST EACH ASSAILANT IN AT THE +DOORS. FOR YOUNG WARDLE, THE BANK EMPLOYEE, HAD MADE A PLUCKY ATTEMPT TO +SHOVE HIS ROBBER OUT AND SHUT THE DOOR, AND MIGHT HAVE SUCCEEDED HAD +THERE NOT BEEN AN OUTSIDE MAN. ROBBERIES ARE COMMITTED UNDER EXCITING +CONDITIONS. THEY SOMETIMES FAIL BECAUSE CRIMINALS BALK. THAT OUTSIDE MAN +WAS THERE NOT ONLY TO HELP HIS “SLUGGER” INTO THE CAB, BUT TO _FORCE_ +HIM IN IF HE SHRANK, AND MAKE CERTAIN HE DID HIS WORK. WHOEVER PLANNED +SUCH DETAILS, IT WAS AGREED AT THE CONFERENCE, POSSESSED MORE CUNNING +THAN THE ORDINARY BANK CRIMINAL. + + + _MONTANI IS EXAMINED._ + +WHEN MONTANI, THE TAXICAB DRIVER, ARRIVED AT POLICE HEADQUARTERS, HE WAS +WILLING TO TALK, AND SEEMED ANXIOUS TO HELP THE POLICE IN EVERY WAY. HE +KNEW SUSPICION MIGHT BE DIRECTED TOWARD HIMSELF, BUT DID NOT RESENT +THAT. HE TALKED LIKE A MAN CONFIDENT OF THE TRUTH OF HIS STORY, AND +CERTAIN THAT HE WOULD BE FOUND BLAMELESS. + +MONTANI IS AN ITALIAN, FROM THE NORTHERN PART OF ITALY, ABOUT 30 YEARS +OLD, FIVE FEET SIX INCHES HIGH, RATHER STOUT AND THICK-SET, WITH VERY +DARK COMPLEXION. THE STRIKING FEATURE OF HIS COUNTENANCE, HIS LARGE, +INTELLIGENT BROWN EYES. COMMISSIONER DOUGHERTY FOUND HIMSELF THINKING OF +NAPOLEON IN CONNECTION WITH MONTANI. + +THE FIRST EXAMINATION LASTED ALL AFTERNOON, MONTANI GOING OUT TO LUNCH +WITH THE COMMISSIONER. HUNDREDS OF QUESTIONS WERE ASKED BEARING ON THE +ROBBERY, THE APPEARANCE OF THE CRIMINALS, AND MONTANI’S PAST AND +PERSONAL AFFAIRS. THE STORY WAS GONE OVER AGAIN AND AGAIN, AND DIFFERENT +QUESTIONERS RELIEVED EACH OTHER. YET THE TAXICAB MAN NEVER LOST HIS +TEMPER OR PATIENCE, AND DID NOT CONTRADICT HIMSELF IN ANY IMPORTANT +PARTICULAR. + +MONTANI HAD BEEN IN THIS COUNTRY SINCE THE AGE OF TWELVE, IT APPEARED, +HAD A WIFE AND TWO CHILDREN, AND WAS THE OWNER OF TWO TAXICABS OPERATED +FROM A STAND AT A HOTEL NEAR THE BANK, WHOSE MONEY HE REGULARLY CARRIED. +HE HAD OWNED THREE CABS, BUT LOST ONE THROUGH BUSINESS REVERSES. IN +FACT, HE HAD PASSED THROUGH MONEY TROUBLES, AND HIS STORY EXCITED +SYMPATHY. STARTING ORIGINALLY AS A TRUCKMAN FOR A SALVAGE COMPANY, HIS +AMBITION AND INTELLIGENCE HAD WON HIM SUCH CONFIDENCE THAT THIS COMPANY +LENT HIM MONEY TO SET UP TRUCKING FOR HIMSELF. STILL MORE AMBITIOUS, HE +HAD BECOME A TAXICAB PROPRIETOR. THROUGH THE TRICKERY OF AN ILL-CHOSEN +PARTNER, HOWEVER, HE HAS LOST SOME OF HIS SAVINGS. HE SEEMED A LITTLE +BITTER ABOUT THIS, AND IT WAS A CIRCUMSTANCE NOT LIKELY TO ESCAPE AN +EXPERT POLICE EXAMINER, FOR THE LOSS OF MONEY THROUGH FRAUD, COUPLED +WITH TEMPTATION, IS OFTEN THE STARTING POINT IN CRIME. THE ITALIAN’S +FORMER EMPLOYERS SPOKE HIGHLY OF HIS CHARACTER WHEN QUESTIONED BY +DETECTIVES. HE GAVE THE NAMES OF CHAUFFEURS WHO HAD WORKED FOR HIM +LATELY, AND OF BUSINESS PEOPLE WHO KNEW HIM, AND CAREFUL INVESTIGATION +FAILED TO DISCLOSE ANY SUSPICIOUS CIRCUMSTANCES. MONTANI QUITE WON THE +NEWSPAPER MEN—SO MUCH SO THAT, WHEN HE WAS DISCHARGED IN COURT A FEW +DAYS LATER FOR APPARENT LACK OF EVIDENCE, THE NEWSPAPERS CRITICISED THE +POLICE FOR HAVING HELD HIM AT ALL. + +AND YET, BEFORE THAT FIRST NIGHT, MONTANI HIMSELF, LARGELY THROUGH +SIMPLE ANSWERS TO QUESTIONS, HAD BECOME SO INVOLVED THAT THERE WAS +GROUND FOR HOLDING HIM UNDER ARREST. + +------------------------------------------------------------------------ + +[ILLUSTRATION: + + EDWARD P. HUGHES + INSPECTOR IN COMMAND OF DETECTIVE BUREAU +] + +[ILLUSTRATION: + + DOMINICK G. RILEY + LIEUTENANT AND AIDE TO COMMISSIONER DOUGHERTY +] + +------------------------------------------------------------------------ + +IN THE QUESTIONS AND CROSS-QUESTIONS, THE CHECKS AND COUNTER-CHECKS OF A +SKILLFUL EXAMINER, THERE ARE POSSIBILITIES LITTLE SUSPECTED BY THOSE NOT +FAMILIAR WITH THAT KIND OF WORK. + +MONTANI HAD SLOWED DOWN HIS CAB AT THE POINT WHERE THE ROBBERS BOARDED +IT. HE SAID THAT AN OLD MAN HAD SUDDENLY GOT IN FRONT, AND HE HAD +SLACKENED SPEED TO AVOID RUNNING OVER HIM. BUT DETECTIVES ALONG THE +ROUTE FOUND EYE-WITNESSES WHO HAD SEEN THE ROBBERS BOARD THE CAB, AND +WHO COULD TESTIFY THAT THERE HAD BEEN NOBODY IN FRONT OF THE VEHICLE. + +BOTH OF HIS CABS HAD STOOD IN LINE NEAR THE BANK THAT MORNING, THE ONE +DRIVEN BY HIMSELF BEING SECOND, AND THE OTHER, IN CHARGE OF AN EMPLOYEE, +WAS FIRST. WHEN THE CALL CAME FROM THE BANK, MONTANI ANSWERED IT HIMSELF +OUT OF HIS TURN, SENDING THE OTHER CAB UPTOWN, AS HE EXPLAINED, TO HAVE +SOME TIRES VULCANIZED. BUT IT WAS NOT A GOOD EXPLANATION. + +HE SAID THAT AS SOON AS THE ROBBERS LEFT HIS CAB HE HAD RAISED A CRY FOR +HELP. BUT EYE-WITNESSES WERE FOUND WHO DENIED THIS. + +INSTEAD OF RUNNING NORTH AFTER THE ROBBERS’ AUTOMOBILE WHEN HE HAD TAKEN +A POLICEMAN ABOARD HIS CAB, HE RAN SOUTH, AWAY FROM IT. THIS ACTION, HE +MAINTAINED, WAS TAKEN UNDER ORDERS FROM THE POLICEMAN. BUT THE LATTER +DENIED THAT. + +HE WAS NOT ABLE TO EXPLAIN HOW THE ROBBERS HAD KNOWN WHERE TO POST THEIR +AUTOMOBILE SO IT WOULD BE WAITING AT THE SPOT WHERE THEY FINISHED THEIR +WORK. + +INTEREST CENTERED IN THIS MYSTERIOUS BLACK AUTOMOBILE WITHOUT A LICENSE +NUMBER. FOR, THOUGH MONTANI WAS AN EXPERIENCED CHAUFFEUR, AND HIS +REPLIES TO OTHER QUESTIONS SHOWED THAT HE HAD SEEN BOTH THE REAR AND THE +SIDE OF THAT CAR, HE WAS UNABLE TO TELL ITS MAKE. + +MEANWHILE, IT WAS LEARNED THAT THREE MEN HAD HURRIEDLY BOARDED AN +ELEVATED TRAIN NEAR THE SCENE OF THE ROBBERY SHORTLY AFTER, NOT WAITING +FOR CHANGE FROM A QUARTER. THE TICKET-SELLER WAS UNABLE TO DESCRIBE +THEM, BUT CONNECTED THEM WITH THE ROBBERY WHEN HE HEARD ABOUT IT. + +MONTANI WAS HELD IN THE CUSTODY OF THE COMMISSIONER THAT NIGHT, TO BE +PUT THROUGH FURTHER EXAMINATION IN THE MORNING. BUT LONG BEFORE MORNING +THE POLICE WERE WORKING ON AN ENTIRELY NEW DEVELOPMENT. + + + _THE FIRST DIRECT CLUE_ + +THE LAW-ABIDING CITIZEN GOES AROUND NEW YORK WITH LITTLE KNOWLEDGE OF +THE CROWDING UNDERWORLD ALL ABOUT HIM. IT IS PERHAPS JUST AS WELL THAT +HE KNOWS NOTHING OF THE LIVES AND MORALS OF HUNDREDS OF PEOPLE WHO ELBOW +HIM ON THE STREETS, SIT BESIDE HIM IN THE CARS, AND SCRUTINIZE HIM WITH +A STRICTLY PROFESSIONAL EYE IN MANY PLACES. + +NOR HAS HE ANY CLEAR CONCEPTION OF THE RELATIONS THAT A GOOD POLICE +OFFICER MAINTAINS WITH MEMBERS OF THIS UNDERWORLD. IT IS A WORLD JUST AS +COMPLETE AS THAT OF BUSINESS OR SOCIETY, HOWEVER, AND MUCH OF THE TIME +OF A DETECTIVE OR POLICE OFFICIAL IS SPENT KEEPING TRACK OF PEOPLE IN +IT, FORMING ACQUAINTANCES AND CONNECTIONS IN VARIOUS WAYS, AND +ESTABLISHING THE ORGANIZATION OF INFORMANTS THAT WILL HELP IN THE +DETECTION AND PREVENTION OF CRIME. A GOOD DETECTIVE IS LIKE A GOOD +SALESMAN—HE KEEPS TRACK OF HIS “TRADE.” + +SHORTLY AFTER MIDNIGHT OF THE FIRST DAY, COMMISSIONER DOUGHERTY RECEIVED +A MESSAGE OVER THE TELEPHONE THAT SENT HIM UPTOWN TO MEET AN INFORMANT. +AT TWO O’CLOCK IN THE MORNING OF FRIDAY, FEBRUARY 16, HE AND THIS PERSON +HAD A TALK AT A FASHIONABLE UPTOWN HOTEL. INDEED, MOST OF THE MEETINGS +WITH INFORMANTS DURING THIS CASE WERE HELD AT TWO WELL-KNOWN HOTELS, +PERHAPS THE LAST PLACES IN THE CITY THAT ANYBODY WOULD CONNECT WITH SUCH +CONFERENCES. + +INFORMANTS ARE NOT ALWAYS RIGHT, NOR ALWAYS POSSESSED OF USEFUL +INFORMATION. BUT THIS ONE HAD THE FIRST REAL CLUE. + +ON THE AFTERNOON OF THE ROBBERY, IT WAS LEARNED, A FELLOW KNOWN AS +“EDDIE COLLINS” HAD COME TO HIS ROOMING HOUSE, ON THE LOWER WEST SIDE, +TOLD A WOMAN WITH WHOM HE LIVED, KNOWN AS “SWEDE ANNIE,” TO PACK UP AND +BE READY TO LEAVE THE CITY IN A HURRY, AND PRESENTLY DISAPPEARED WITH +HER. HE WAS ALSO REPORTED TO HAVE A LARGE ROLL OF MONEY. WITH A ROUGH +ESTIMATE OF THE SIZE OF THIS ROLL, GIVEN BY THE INFORMANT, AND A DUMMY +ROLL OF “STAGE MONEY” MADE UP FOR THE PURPOSE, THE POLICE WERE ABLE TO +JUDGE THAT COLLINS MUST HAVE HAD BETWEEN $3,000 AND $5,000. THAT WOULD +HAVE BEEN HIS PROBABLE SHARE IN A DIVISION OF THE STOLEN CURRENCY AMONG +FIVE MEN. + +THE HOUSE WHERE COLLINS HAD LIVED WAS KEPT BY A MRS. SULLIVAN. STEPS +WERE AT ONCE TAKEN TO “SURROUND” THIS WOMAN, AS THE OPERATION IS KNOWN +TECHNICALLY. FOR BEFORE A POSSIBLE SOURCE OF INFORMATION LIKE MRS. +SULLIVAN IS FOLLOWED UP, IT IS NECESSARY TO KNOW SOMETHING ABOUT IT. THE +PERSON IN QUESTION MAY BE CRIMINAL, OR IN LEAGUE WITH THE UNDERWORLD. ON +THE OTHER HAND, HE OR SHE MAY BE QUITE INNOCENT, AND WILLING TO AID THE +POLICE. THE “SURROUND” IS AN INTERESTING OPERATION. IT IS OFTEN MADE +WITHOUT THE KNOWLEDGE OF THE PERSON INVESTIGATED. IN MANY CASES IT TAKES +TIME. + +MRS. SULLIVAN CAME THROUGH THE ORDEAL HANDSOMELY. + +SHE PROVED TO BE A WHOLESOME, HARD-WORKING LANDLADY, KEEPING A HOUSE +THAT SHELTERED OCCASIONAL SUSPICIOUS CHARACTERS, BUT ENTIRELY HONEST +HERSELF. SHE WAS NOT ONLY ABLE TO FURNISH INFORMATION ABOUT HER LATE +LODGERS, BUT WILLING. + +“SURE, IT’S A GOOD DEAL I KNOW ABOUT THAT COLLINS, AS HE CALLS HIMSELF,” +SHE SAID, “AND MIGHTY LITTLE THAT’S GOOD.” + +IT SEEMS THAT ABOUT TWO WEEKS PREVIOUSLY COLLINS HAD OFFERED TO PAY THE +LANDLADY IF SHE WOULD APPEAR IN A BROOKLYN COURT AND TESTIFY TO THE GOOD +CHARACTER OF A CRIMINAL NAMED MOLLOY, WHO WAS BEING HELD FOR TRIAL ON A +CHARGE OF ROBBERY. + +“THEY’RE PAYING FIFTEEN TO TWENTY DOLLARS FOR ‘CHARACTER’ WITNESSES,” +SAID HER LODGER. + +“AND DO YOU THINK I’D TAKE THE STAND AND PERJURE MYSELF SWEARING FOR A +MAN I NEVER HEARD OF?” ASKED THE INDIGNANT LANDLADY. + +“OH, THAT’S NOTHING TO SOME OF THE THINGS WE DO,” WAS THE REPLY. + +SEVERAL DAYS LATER, WHILE SHE WAS PUTTING SOME LAUNDRY INTO COLLINS’ +BUREAU DRAWER THE LANDLADY CAUGHT SIGHT OF TWO NEW BLACKJACKS. SHE ASKED +COLLINS WHAT HE WAS DOING WITH SUCH WEAPONS. + +“AW, WE USE THEM IN OUR BUSINESS,” HE SAID. THEN, WITH THE CONFIDENCE +OFTEN BRED IN CRIMINALS BY SUCCESS, HE TOLD HER HE KNEW A GANG THAT WAS +PLANNING TO ROB A TAXICAB THAT CARRIED MONEY UPTOWN TO A BANK EVERY +WEEK. MRS. SULLIVAN QUESTIONED HIM AS TO DETAILS, AND HE ASSURED HER IT +WOULD BE AN EASY JOB. + +“FOR WE’VE GOT IT ALL FIXED WITH THE CHAUFFEUR,” HE SAID. + +AT THAT POINT, HOWEVER, LIKE MANY AN HONEST PERSON WHO MIGHT AID THE +POLICE WITH INFORMATION, MRS. SULLIVAN LET THE MATTER DROP OUT OF HER +MIND. IT IS A SIMPLE THING TO MAIL A LETTER OR TELEPHONE TO POLICE +HEADQUARTERS, GIVING SUCH INFORMATION, AND THE EXPERIENCE OF THE +DETECTIVE BUREAU IS SUCH THAT THE INFORMATION CAN BE INVESTIGATED +WITHOUT INVOLVING INNOCENT PERSONS. BUT PERHAPS MRS. SULLIVAN CONCLUDED +THAT, IN A BIG CITY LIKE NEW YORK, IT IS WELL FOR PEOPLE TO KEEP THEIR +MOUTHS SHUT. OR MAYBE SHE DECIDED THAT COLLINS WAS MERELY BOASTING. + +ON FRIDAY, LESS THAN TWENTY-FOUR HOURS AFTER THE ROBBERY, A “NETWORK +INVESTIGATION” WAS BEGUN. + +SIXTY DETECTIVES SEARCHED THAT PART OF THE CITY WHERE COLLINS AND ANNIE +HAD LIVED, SEEKING FURTHER INFORMATION. PHOTOGRAPH GALLERIES AND OTHER +PLACES WERE INVESTIGATED ON THE CHANCE OF FINDING PICTURES. DENIZENS OF +THE UNDERWORLD WERE TALKED WITH CASUALLY. PROFESSIONAL CRIMINALS, +PROSTITUTES, DIVE-KEEPERS, RECEIVERS OF STOLEN GOODS AND OTHER SHADY +CHARACTERS WERE BROUGHT BEFORE COMMISSIONER DOUGHERTY IN COUPLES AND +HALF-DOZENS FOR QUICK CROSS-EXAMINATION. BY SATURDAY EVENING THE POLICE +HAD SOME HIGHLY IMPORTANT INFORMATION. + +IT WAS LEARNED THAT ANNIE HAD BEEN SEEN GOING AWAY ON THE AFTERNOON OF +THE ROBBERY IN A TAXICAB, ACCOMPANIED BY TWO MEN, ONE OF WHOM WAS +COLLINS, AND THE OTHER UNKNOWN. GOOD DESCRIPTIONS WERE SECURED OF ANNIE +AND HER SWEETHEART, ESPECIALLY OF HER HAT, WHICH WAS A CHEAP AFFAIR, BUT +CONSPICUOUS BY REASON OF A ROW OF LITTLE RED ROSES. IT WAS ALSO +DISCOVERED THAT COLLINS HAD BEEN A BOXER, THAT HE HAILED FROM BOSTON, +AND THAT HIS REAL NAME WAS EDDIE KINSMAN. FINALLY, THE POLICE SECURED +TWO PHOTOGRAPHS, ONE AN INDIFFERENT PICTURE OF KINSMAN, AND THE OTHER AN +EXCELLENT PORTRAIT OF ANNIE. THESE WERE QUICKLY PUT THROUGH THE +DEPARTMENT’S PHOTOGRAPH GALLERY, WHERE THERE ARE FACILITIES FOR MAKING +DUPLICATES IN A HURRY, AND MORE THAN A HUNDRED COPIES WERE SOON READY +FOR WORK WHICH WILL BE DESCRIBED IN ITS PROPER PLACE. + +THE TRAIL NOW SEEMED TO LEAD TO BOSTON. AT ALL EVENTS, FURTHER +INFORMATION WAS TO BE SECURED THERE. AND HERE CAME IN A LITTLE +REFINEMENT IMPARTED BY COMMISSIONER DOUGHERTY’S EXPERIENCE WITH THE +PINKERTON FORCES. FOR WHERE THIS PRIVATE DETECTIVE ORGANIZATION WORKS +UNHAMPERED OVER THE WHOLE COUNTRY, THE OFFICIAL POLICE FORCES IN MOST +CITIES CONFINE THEIR SEARCHES TO THEIR OWN TERRITORY. WHEN IT IS +BELIEVED THAT CRIMINALS HAVE LEFT TOWN, AS IN THIS CASE, A GENERAL +DESCRIPTION IS TELEGRAPHED TO OTHER CITIES. DOUGHERTY’S METHOD, HOWEVER, +IS ALWAYS TO SEND A MAN FROM HIS OWN STAFF, WITH DETAILED INSTRUCTIONS. +THERE ARE NO LOCAL BOUNDARIES FOR HIM. + +LATE ON SATURDAY NIGHT INSPECTOR HUGHES, OF THE DETECTIVE BUREAU, +SLIPPED OUT OF HEADQUARTERS WITH DETECTIVE O’CONNELL, AND TOOK A TRAIN +FOR BOSTON. THEIR DEPARTURE WAS KEPT STRICTLY SECRET. THEY BID GOOD +NIGHT TO ASSOCIATES, SAYING THAT THEY EXPECTED TO BE UP AND AT WORK +AGAIN EARLY NEXT MORNING, AND UNTIL THEIR RETURN ON MONDAY EVERYBODY WHO +ASKED FOR THE INSPECTOR WAS TOLD THAT “HE IS USUALLY AROUND THE BUILDING +SOMEWHERE.” + + + _MONTANI POINTS OUT “KING DODO”_ + +ALL THROUGH FRIDAY AND SATURDAY, WHILE THE NETWORK INVESTIGATION WAS +GOING ON, COMMISSIONER DOUGHERTY CONTINUED HIS EXAMINATION OF MONTANI. + +SOME IMPORTANT INFORMATION AGAINST HIM NOW CAME FROM OUTSIDE. + +IT DEVELOPED THAT MONTANI HAD BEEN INVOLVED SEVERAL MONTHS BEFORE IN AN +INSURANCE CASE, CLAIMING INDEMNITY FOR A BURNED AUTOMOBILE UNDER A +POLICY. HE HAD PRESENTED, AS PART OF ITS VALUE, A BILL FOR REPAIRS +AMOUNTING TO $1,348. THE INSURANCE COMPANY, HOWEVER, HAD FOUND THAT THIS +BILL WAS FRAUDULENT, THAT THE REPAIRS HAD NEVER BEEN MADE, AND HAD +OBTAINED A STATEMENT TO THAT EFFECT FROM THE ITALIAN CHAUFFEUR. OUT OF +PITY FOR HIS WIFE AND TWO CHILDREN THE CASE WAS NOT PRESSED AGAINST HIM. +NOW THAT HE WAS INVOLVED IN ANOTHER CRIME, HOWEVER, THE INSURANCE PEOPLE +CAME FORWARD AND LAID THE FACTS BEFORE THE POLICE. + +OF COURSE, MONTANI KNEW NOTHING ABOUT THIS NEW DEVELOPMENT. + +FOR TWO DAYS THE CHAUFFEUR WAS QUESTIONED AT INTERVALS, AND THE INQUIRY +CENTERED CHIEFLY ON THE KNOTTY POINTS IN HIS STORY OF THE CRIME. HE WAS +PARTICULARLY PRESSED FOR BETTER EXPLANATIONS OF THE SLACKENING OF HIS +CAB WHEN THE ROBBERS BOARDED IT, BUT STUCK TO HIS ORIGINAL STATEMENT +ABOUT A MAN GETTING IN FRONT OF THE VEHICLE. HE DESCRIBED THIS PERSON AS +AN OLD MAN, AND SAID HE MUST HAVE BEEN IN LEAGUE WITH THE CRIMINALS. AS +THE POLICE HAD GOOD EVIDENCE THAT THERE HAD BEEN NOBODY IN FRONT OF THE +TAXICAB, HOWEVER, THIS POINT WAS RETURNED TO AGAIN AND AGAIN, AND TOWARD +NIGHT ON SATURDAY, FEBRUARY 17, THE LITTLE CHAUFFEUR BEGAN TO FEEL THE +STRAIN. + +ON HIS WAY TO SUPPER THAT EVENING WITH MEN FROM THE DETECTIVE BUREAU, +MONTANI WAS TAKEN THROUGH THE BOWERY. SUDDENLY HE STOPPED, DRAMATICALLY, +AND EXCLAIMED: + +“THERE! THAT IS THE OLD MAN WHO GOT IN FRONT OF MY CAB!” + +HIS FINGER INDICATED A BOWERY CHARACTER AS TYPICAL AS ANYTHING EVER SEEN +IN MELODRAMA—A RAGGED LITTLE OLD FIGURE WITH AN AMAZING SET OF WHISKERS, +ENGAGED IN PICKING UP CIGAR BUTTS ALONG THE GUTTERS. HE WAS IMMEDIATELY +TAKEN TO HEADQUARTERS. + +NO DETAIL OF HIS WORK INTERESTS COMMISSIONER DOUGHERTY MORE KEENLY THAN +HIS STUDY OF THE MANY PICTURESQUE CHARACTERS WHO TURN UP AS AN IMPORTANT +CASE UNFOLDS. HE HAS A READY APPRECIATION OF EVERYBODY WHO APPEARS, FROM +THE SOCIETY LADY WHO LOST HER JEWELS TO THE TYPICAL BOWERY LOAFER. HE IS +AS READY TO LOOK AT FACTS FROM A CRIMINAL’S POINT OF VIEW AS THAT OF AN +HONEST MAN. HE HAS OFTEN GONE HALF ACROSS THE COUNTRY TO GET ACQUAINTED +WITH A GOOD BURGLAR, AND IN THIS WARM HUMAN INTEREST LIES THE BASIS OF +HIS SKILL AS AN EXAMINER OF SUSPECTS. THESE DETAILS ARE SET DOWN, NOT IN +GLORIFICATION OF DOUGHERTY, BUT FOR THE GUIDANCE OF EVERY POLICE OFFICER +INTERESTED IN HIS METHODS. + +THE MOMENT DOUGHERTY LAID EYES ON THIS NEW CHARACTER, WITH HIS +MAGNIFICENT WHISKERS, HE GAVE HIM A NICKNAME. + +“KING DODO!” SAID THE COMMISSIONER, AND THAT BY THAT NAME HE WAS KNOWN +IN SO FAR AS HE FIGURED IN THE CASE AT ALL. “KING DODO” PROVED TO BE +ENTIRELY INNOCENT, AND NOTHING MORE THAN THE VICTIM OF A CHANCE MOVE OF +MONTANI’S, WHO EVIDENTLY THOUGHT THAT HE OUGHT TO PRODUCE SOMETHING +TANGIBLE TO BACK UP HIS ASSERTION THAT THE CAB HAD BEEN INTERCEPTED BY +AN OLD MAN. “KING DODO” ESTABLISHED A PERFECT ALIBI, PROVING THAT HE HAD +BEEN ELSEWHERE AT THE TIME OF THE ROBBERY, AND AFTER BEING QUESTIONED +AND THE TRUTH OF HIS STORY ESTABLISHED, HE WAS RELEASED, THERE BEING NO +REASON FOR HOLDING HIM. + +“I FEEL SAFE,” SAID THE COMMISSIONER SOLEMNLY, “IN PAROLING YOU ON YOUR +OWN RESPONSIBILITY, TO APPEAR AGAIN IF WANTED.” + +THAT MAY HAVE BEEN A HEAVIER RESPONSIBILITY THAN HAD BEEN PUT ON HIS +SHOULDERS IN YEARS. BUT HE ROSE TO IT. TWO DAYS LATER A DECENTLY +DRESSED, CLEAN SHAVEN, ELDERLY GENTLEMAN CAME IN AND ASKED FOR THE +COMMISSIONER. HE WAS “ALL DOLLED UP,” IN POLICE PARLANCE, AND LOOKED +LIKE A RETIRED SMALL SHOPKEEPER. THE STAFF DID NOT RECOGNIZE HIM FOR A +MOMENT. BUT IT WAS “KING DODO,” DOING HIS BEST TO FILL THE PART OF A +MINOR FIGURE IN THE GREAT TAXICAB MYSTERY. THERE BEING NOTHING FOR HIM +TO DO, HE DROPPED BACK INTO PRIVATE LIFE. + +ON HIS SUNDAY VISIT TO BOSTON INSPECTOR HUGHES TALKED WITH CHIEF +INSPECTOR WATTS OF THAT CITY, LEARNED WHERE KINSMAN LIVED, AND THAT HIS +FAMILY WAS A RESPECTABLE ONE; FOUND A BRIGHT PATROLMAN NAMED DORSEY WHO +KNEW KINSMAN, AND GAVE MORE INFORMATION ABOUT HIS PERSONAL APPEARANCE, +HABITS AND CAREER AS A BOXER, DESERTION FROM THE NAVY, AND SO FORTH, AND +MADE ARRANGEMENTS TO HAVE THE KINSMAN HOME WATCHED SO THAT NEWS OF HIS +RETURN WOULD BE SECURED IMMEDIATELY. IT WAS CLEAR THAT KINSMAN HAD NOT +RETURNED TO BOSTON. + + + _DISCOVERY OF KINSMAN’S TRAIL_ + +AS SOON AS INSPECTOR HUGHES RETURNED FROM BOSTON, ON MONDAY MORNING, THE +COMMISSIONER TOOK STEPS TO QUESTION THE CREWS OF EVERY TRAIN THAT HAD +LEFT NEW YORK SINCE ONE P. M. ON THE DAY OF THE ROBBERY. + +JUST THE OTHER AFTERNOON THE WRITER SAT WITH A SQUAD OF YOUNG DETECTIVES +AT POLICE HEADQUARTERS AND HEARD A TALK ON METHODS GIVEN BY DOUGHERTY, +AND ONE POINT CLEARLY BROUGHT OUT WAS THE USEFULNESS TO THE +THIEF-CATCHER OF ROUTINE INFORMATION. + +HE BEGAN BY RELATING AN AMUSING INCIDENT. SOME DAYS BEFORE A DETECTIVE +HAD TURNED UP AT HEADQUARTERS FOR INSTRUCTION, AND NAïVELY ASKED THE +COMMISSIONER TO LEND HIM A PENCIL AND A SLIP OF PAPER, SO HE COULD MAKE +SOME NOTES. ANOTHER DETECTIVE WAS FOUND WHO HAD ONLY A HAZY IDEA OF THE +LOCATION OF NEW YORK’S TELEPHONE EXCHANGES. TAKING THESE AS HIS TEXT, +THE COMMISSIONER EXPLAINED THE VALUE TO EVERY POLICE OFFICER OF WHAT +MIGHT BE CALLED “TIME-TABLE” INFORMATION—KNOWING THE DEPOTS AND FERRIES, +WHAT ROADS RUN OUT OF THEM, THE CITIES REACHED, THE NUMBER AND CHARACTER +OF TRAINS, THE GENERAL METHODS OF DISPATCHING TRAINS, AND SO FORTH. THE +COMMISSIONER HIMSELF IS AS WELL INFORMED ON SUCH MATTERS AS ANY RAILROAD +MAN, AND THOROUGHLY FAMILIAR WITH ROUTINE METHODS IN MANY OTHER LINES OF +WORK AND BUSINESS. HOW SUCH KNOWLEDGE CAN BE EMPLOYED WAS SHOWN BY THE +NEXT MOVE IN THE TAXICAB CASE. + +DETECTIVES WERE SENT TO EVERY RAILROAD TERMINAL TO SECURE LISTS OF +TRAINS, LEARN THE NAMES OF THE CREWS, AND MAKE OUT SCHEDULES OF THE TIME +WHEN EACH CREW WOULD BE BACK IN THE CITY. THEN EACH MAN WAS FOUND AND +CAREFULLY QUESTIONED. HIS MEMORY COULD BE HELPED BY PICTURES OF KINSMAN +AND ANNIE, AND BY INTIMATE DETAILS OF PERSONAL APPEARANCE AND MANNER. + +THE SEARCH BORE FRUIT, THOUGH IT TOOK TIME. + +ON WEDNESDAY DETECTIVE WATSON, WHO WAS A RAILROAD ENGINEER BEFORE HE +JOINED THE POLICE, FOUND THAT TRAIN NO. 13 ON THE NEW YORK CENTRAL HAD +TAKEN ON THREE PASSENGERS ANSWERING THE DESCRIPTIONS ON THE AFTERNOON OF +THE ROBBERY. THEY HAD BOARDED THE TRAIN AT PEEKSKILL, THE TOWN TO WHICH, +AS IT WAS SUBSEQUENTLY LEARNED, THEY HAD RIDDEN IN A TAXICAB. THE +CONDUCTOR’S ATTENTION HAD BEEN DRAWN TO ANNIE BY HER SMOKING A CIGARETTE +ON THE SLY IN THE TOILET OF THE DAY COACH. HE REMEMBERED HER HIGH CHEEK +BONES, AND THE BLACK VELVET HAT WITH ITS LITTLE ROSES, AND THE ATHLETIC +BUILD OF HER MEN COMPANIONS, WHO BOTH APPEARED TO BE BOXERS. IT WAS ALSO +ESTABLISHED THAT THE TRIO HAD GONE TO ALBANY, FOR ONE OF THE TRAINMEN +DISTINCTLY REMEMBERED HELPING ANNIE DOWN AT THAT STATION. + + + _“PLANT 21” IS ESTABLISHED_ + +MONDAY, FEBRUARY 19, WAS AN IMPORTANT DAY IN MORE WAYS THAN ONE. + +WHILE THE TRAIN INVESTIGATION WAS GOING ON, IT WAS LEARNED THAT A WOMAN +KNOWN AS “MYRTLE HORN,” AN INTIMATE OF ANNIE’S, HAD MOVED TO A LOWER +WEST SIDE ROOMING HOUSE, TAKING ANNIE’S TRUNK WITH HER, AS THOUGH ANNIE +EXPECTED TO RETURN TO THE CITY. AFTER A PRELIMINARY SURVEY, THIS HOUSE +WAS VISITED BY COMMISSIONER DOUGHERTY IN PERSON. HE EXPLAINED THAT HE +WAS A CONTRACTOR, ABOUT TO BUILD A SECTION OF THE NEW SUBWAY, AND THAT +HE WAS LOOKING FOR A QUIET ROOM AT A REASONABLE PRICE WHERE HE MIGHT +HAVE SOME OF THE COMFORTS OF HOME. AFTER A LITTLE TALK WITH THE LANDLADY +IT BECAME CLEAR THAT SHE WAS HONEST AND TRUSTWORTHY, WITH NO INFORMATION +OF THE NEW LODGER WHO HAD TAKEN HER FRONT ROOM IN THE BASEMENT. +ARRANGEMENTS WERE QUICKLY MADE TO PUT THIS HOUSE, INSIDE AND OUTSIDE, +UNDER CONSTANT SURVEILLANCE. + +------------------------------------------------------------------------ + +[ILLUSTRATION: GENE SPLAINE] + +[ILLUSTRATION: EDDIE KINSMAN] + +[ILLUSTRATION: GENO MONTANI] + +[ILLUSTRATION: “SCOTTY THE LAMB”] + +[ILLUSTRATION: JOHN MOLLOY] + +------------------------------------------------------------------------ + +ALONG IN THE EVENING MRS. ISABELLA GOODWIN, A POLICE MATRON, WAS +INSTALLED THERE. THE COMMISSIONER BROUGHT HER, AND CARRIED HER BUNDLE. +THE LANDLADY AND THE MATRON HAD NEVER SEEN EACH OTHER IN THEIR LIVES, +BUT KISSED OSTENTATIOUSLY, AND MADE CONSIDERABLE FUSS ON THE CHANCE OF +BEING OVERHEARD. MRS. GOODWIN WAS “PLANTED” AS THE LANDLADY’S “SISTER,” +WHO HAD COME FROM MONTREAL TO LIVE WITH HER AND HELP IN THE HOUSEWORK +UNTIL SHE COULD FIND A POSITION IN NEW YORK. THE COMMISSIONER GRUMBLED A +LITTLE ABOUT HER STINGINESS IN REFUSING TO PAY AN EXPRESSMAN TO BRING +HER BUNDLE, AND THEN TOOK HIS DEPARTURE, EXPLAINING THAT THE TRAIN HAD +BEEN LATE, AND THE BABY WAS NOT WELL, AND HIS WIFE, AGGIE, WOULD BE +WORRIED ABOUT HIM, AND SO FORTH. MRS. GOODWIN ESTABLISHED HERSELF IN A +ROOM AT THE REAR OF THE BASEMENT, HANDY TO THAT OCCUPIED BY MYRTLE HORN, +AND KEPT HER EYES AND EARS OPEN AS SHE WENT ABOUT THE HOUSEWORK, +SLIPPING OUT TO REPORT WHEN SHE HAD ANY INFORMATION, AND RECEIVING +INSTRUCTIONS. + +OUTSIDE SURVEILLANCE ON THIS HOUSE WAS CONDUCTED FROM AN EMPTY STORE +ACROSS THE STREET. ARRANGEMENTS FOR THE USE OF SUCH PROPERTY ARE USUALLY +MADE BY THE POLICE WITHOUT DIFFICULTY, THOUGH OCCASIONALLY A +CLOSE-FISTED OWNER EXPECTS RENT. BLINDS WERE PUT UP OVER THE WINDOWS, +PEEP-HOLES MADE, AND A FEW HAMMERS PROVIDED, WITH SOME NAILS AND BOARDS. +THEN SIX OF THE BEST “SHADOW MEN” IN THE DETECTIVE BUREAU WERE STATIONED +THERE. THEY MADE A LITTLE NOISE OCCASIONALLY, IN “GETTING THE STORE +READY FOR A BIG FIRM MOVING UP FROM DOWNTOWN,” AND WATCHED THE HOUSE DAY +AND NIGHT. WHENEVER MYRTLE WENT OUT SHE WAS FOLLOWED. IF SHE HAD +VISITORS, THEY WERE INVESTIGATED. THIS STORE WAS KNOWN BY THE CODE TERM +OF “PLANT 21,” SO THAT REPORTS COULD BE SENT WITHOUT DISCLOSING POLICE +INFORMATION. + + + _MONTANI GOES FREE_ + +ON MONDAY, TOO, MONTANI WAS ARRAIGNED IN COURT, AND DISCHARGED FOR WHAT +APPEARED TO BE LACK OF ANY EVIDENCE AGAINST HIM. + +AT THIS POINT THE COMMISSIONER TOOK THE LIBERTY OF FOOLING THE NEWSPAPER +MEN FOR THE GOOD OF HIS CASE. + +NEWSPAPER CRITICISM FOR THREE DAYS HAD BEEN PARTICULARLY SEVERE. EDITORS +MADE MANY CHARGES, AND WERE FERTILE IN SUGGESTIONS AS WHAT OUGHT TO BE +DONE TO REORGANIZE THE PRESUMABLY “DEMORALIZED” POLICE DEPARTMENT. THE +PRESENT WRITER FEELS CONFIDENT, HOWEVER, THAT A CAREFUL SEARCH OF THE +FILES FOR THOSE DAYS WILL DISCLOSE HARDLY ANY SUGGESTIONS LIKELY TO BE +AT ALL HELPFUL TO PUBLIC SERVANTS IN THE DISCHARGE OF DUTY. MANY +QUESTIONS WITH NO REAL BEARING ON THE CASE HAD BEEN BROUGHT UP BY THE +JOURNALISTS, AND THE COMMISSIONER, WHO WAS PATIENT IN ANSWERING THE +NEWSPAPER MEN, BEGAN TO BE A LITTLE TIRED. + +ON SUNDAY NIGHT HIS BIG OFFICE WAS FILLED WITH REPORTERS. THEY SAT ABOUT +EVERYWHERE. HE HAD ADMITTED THEM BECAUSE HE WANTED THEM TO SEE THAT HE +WAS WORKING. FROM TIME TO TIME THEY QUIZZED HIM IN THIS FASHION: + +“IS IT TRUE THAT YOU AND COMMISSIONER WALDO HAVE QUARRELLED?” + +“IS WALDO GOING TO RESIGN?” + +“DO YOU FAVOR THE SULLIVAN LAW AGAINST PISTOLS?” + +“WILL THE ‘DEAD LINE’ BE MAINTAINED NOW?” + +“HADN’T THE DAILY ‘LINE UP’ OF CRIMINALS OUGHT TO BE RESTORED SO THAT +DETECTIVES WILL KNOW CROOKS WHEN THEY SEE THEM?” + +“HASN’T MAYOR GAYNOR TIED THE HANDS OF THE POLICE?” + +AND SO FORTH, AND SO FORTH, AND SO FORTH. + +SUDDENLY, ON SUNDAY NIGHT, DOUGHERTY TURNED AND READ THE NEWSPAPER MEN A +LECTURE. HE SAID THAT HE WANTED THEM TO UNDERSTAND THAT HE WAS NO SPRING +CHICKEN AT HIS BUSINESS, THAT HE WAS WORKING EIGHTEEN HOURS A DAY, AND +THAT HE KNEW HE WOULD SHOW RESULTS IF THE PEOPLE WOULD ONLY BE PATIENT, +AND GIVE HIM TIME. HIS ONLY RECOMMENDATION IN THE WAY OF NEW LAWS OR +REFORMS WAS FOR A STATUTE THAT WOULD ENABLE THE POLICE TO PUT KNOWN +CRIMINALS, WITHOUT OCCUPATION OR VISIBLE MEANS OF SUPPORT, AT WORK +MENDING ROADS. HE OUTLINED A PLAN WHICH, RATHER STRANGELY, DID NOT GET +ANY ATTENTION IN THE NEWSPAPERS AT ALL. HIS IDEA OF DEALING WITH IDLE +CRIMINALS, HE SAID, WAS TO HAVE A CART, WITH COMMISSARY AND SLEEPING +QUARTERS FOR TWELVE MEN. AS SOON AS TWELVE IDLE CRIMINALS WITH RECORDS +HAD BEEN SENTENCED, THEY WOULD PULL THIS CART OUT OF TOWN THEMSELVES, +UNDER GUARD, AND GO TO WORK REPAIRING ROADS. IF THAT PLAN WERE ADOPTED, +NEW YORK WOULD NOT ONLY BE AS FREE FROM CRIMINALS AS THE DISTRICT OF +COLUMBIA, WHERE A SIMILAR MEASURE IS ENFORCED, BUT THE ROADS ALL AROUND +THE CITY WOULD BE SO WELL CARED FOR THAT THEY COULD BE USED AS +ROLLER-SKATING RINKS. + +THE NEWSPAPERS NEXT MORNING WERE QUITE CERTAIN THAT COMMISSIONERS WALDO +AND DOUGHERTY HAD QUARRELLED, AND WHEN THE JOURNALISTS WENT DOWN TO +REPORT MONTANI’S EXAMINATION IN COURT THEY WERE DECIDEDLY PARTIAL TO THE +TAXICAB MAN. + +DOUGHERTY HAD TOLD THE NEWSPAPER MEN BEFOREHAND THAT HE HAD EVIDENCE +ENOUGH TO HAVE MONTANI HELD FOR TRIAL. HE HAD MADE VERY POSITIVE +STATEMENTS ABOUT THIS. MONTANI WOULD BE ARRAIGNED, HE PREDICTED, AND IF +DISCHARGED ON ONE COUNT, WOULD BE IMMEDIATELY ARRESTED ON SOMETHING +ELSE. IF HE WAS DISCHARGED ON THAT, HE WOULD STILL BE ARRAIGNED ON +FURTHER CHARGES. + +IT NEEDS NO VERY BRILLIANT IMAGINATION, THEREFORE, TO PICTURE THE EFFECT +UPON THE NEWSPAPERS WHEN MONTANI, AFTER BEING ARRAIGNED ON THE DOUBTFUL +POINTS IN HIS OWN ACCOUNT OF THE CRIME, AND THOSE NOT TOO VIGOROUSLY +PRESSED, WAS DISCHARGED, WITH COMMENT BY THE COURT UPON THE FLIMSINESS +OF THE POLICE CASE. THERE WAS ONE STRIKING DISCREPANCY IN THE EVIDENCE +PRESENTED AT THAT EXAMINATION WHICH, IF PRESSED, SHOULD HAVE RESULTED IN +THE HOLDING OF MONTANI FOR TRIAL. HE STILL INSISTED THAT HE HAD STOPPED +HIS CAB BECAUSE AN OLD MAN HAD GOT IN FRONT OF IT, BUT THIS WAS DENIED +BY A WITNESS. THAT POINT WAS PERMITTED TO PASS BY LIEUTENANT RILEY, WHO +APPEARED FOR THE POLICE. MONTANI COULD HAVE BEEN RE-ARRESTED ON CHARGES +BASED UPON HIS ATTEMPT TO DEFRAUD THE INSURANCE COMPANY. BUT HE WAS +PERMITTED TO GO FREE. THAT COURSE HAD BEEN DECIDED ON AT POLICE +HEADQUARTERS AFTER SOME DIFFERENCE OF OPINION. + +THE NEWSPAPERS WERE NOW MORE PESSIMISTIC THAN EVER IN THEIR COMMENT. +THEY CONTRASTED THIS OUTCOME WITH DOUGHERTY’S PROMISES THAT THE +CHAUFFEUR WOULD BE RE-ARRESTED. IT WAS TAKEN AS A CONFESSION OF POLICE +INCOMPETENCY AND BEWILDERMENT—WHICH, AS WILL BE SEEN IN ITS PROPER +PLACE, WAS VERY USEFUL IN ITS WAY. MONTANI WENT FREE, AND WAS JUBILANT, +CALLING ON THE COMMISSIONER NEXT MORNING TO THANK HIM. BUT FROM THE +MOMENT HE LEFT COURT UNTIL HE WAS ARRESTED AGAIN THE ITALIAN CHAUFFEUR +NEVER GOT OUT OF SIGHT OF THE POLICE DEPARTMENT. + + + _WHAT DEVELOPED ON A BUSY TUESDAY_ + +IT WAS ON THE DAY AFTER MONTANI’S RELEASE THAT COMMISSIONER DOUGHERTY +BEGAN TO UNCOVER MORE INTERESTING CHARACTERS IN THE TAXICAB DRAMA. + +BIT BY BIT, THROUGH POINTS SUPPLIED BY INFORMANTS AND PERSONS WHO HAD +COME IN CONTACT WITH HIM IN VARIOUS WAYS, A VERY GOOD WORKING KNOWLEDGE +OF THE FUGITIVE KINSMAN WAS PIECED TOGETHER. IT APPEARED THAT HE HAD +COME TO NEW YORK THE PREVIOUS SUMMER, FROM BOSTON, AND AFTER A BRIEF +CAREER AS A BOXER, HAD GONE TO WORK IN A SIXTH AVENUE RESORT KNOWN AS +THE “NUTSHELL CAFé,” WHERE HE WAS A WAITER. AMONG HIS ASSOCIATES THERE +HAD BEEN TWO CHARACTERS WHO INVITED FURTHER INQUIRY. + +THE FIRST OF THESE WAS A FELLOW CALLED “GENE,” DESCRIBED AS HAVING A +“PARROT NOSE,” AND A CRIMINAL RECORD. HE HAD BEEN A CLOSE PAL OF +KINSMAN, AND HAD ALSO INTRODUCED ANOTHER INTIMATE, A WILY LITTLE ITALIAN +CALLED “JESS,” WHO HAD FORMERLY OWNED A THIEVES’ RESORT WHICH HE CALLED +THE “ARCH CAFé.” A GOOD DESCRIPTION OF JESS WAS SECURED. + +THERE WAS SOME DELAY WHILE THE COMMISSIONER “SURROUNDED” THIS +LAST-MENTIONED RESORT TO FIND OUT IF IT WAS A PLACE WHERE ANY +INFORMATION MIGHT BE OBTAINED OPENLY. THE QUESTION WAS DECIDED IN THE +NEGATIVE. SO A PLAIN-CLOTHES MAN WAS QUIETLY “PLANTED” THERE TO PICK UP +INFORMATION. + +WHEN A CRIMINAL IS ARRESTED (OR “FALLS”) IT IS CUSTOMARY IN THE +UNDERWORLD TO RAISE A FUND FOR HIS DEFENSE. THE ARCH CAFé WAS A CENTER +FOR THE DEPOSIT OF SUCH “FALL MONEY.” IT WAS LEARNED THAT A HUNDRED +DOLLARS HAD BEEN RAISED FOR THE DEFENSE OF A MAN NAMED CLARKE, ALIAS +“MOLLOY,” UNDER ARREST IN BROOKLYN FOR ROBBERY. THIS WAS THE SAME MOLLOY +TO WHOSE FINE CHARACTER KINSMAN HAD ASKED HIS LANDLADY TO SWEAR IN +COURT. THE ITALIAN NAMED JESS HAD TAKEN CHARGE OF MOLLOY’S DEFENSE FUND, +BUT SQUANDERED IT IN A SPREE. LATER, MAKING IT GOOD, HE HAD SENT IT OVER +TO MOLLOY’S RELIEF BY KINSMAN’S PAL, “DUTCH,” AND AN ITALIAN KNOWN AS +“MATTEO.” + +DISTRICT INSPECTORS OF POLICE WERE THEN CALLED UPON TO FIND A DETECTIVE +WHO KNEW JESS, AND AN ITALIAN PLAIN-CLOTHES MAN, ANTONY GRIECO, WHO HAD +GROWN UP IN THAT PART OF NEW YORK WHERE JESS HAD KEPT A CAFé, AND WHO +KNEW THE LATTER WELL, WAS DETAILED WITH ANOTHER DETECTIVE TO LOOK HIM UP +AND KEEP HIM UNDER SURVEILLANCE. THEY FOUND THAT JESS, WHOSE LAST NAME +WAS ALBRAZZO, HAD HEADQUARTERS IN A TOUGH RESORT IN THOMPSON STREET, +KEPT BY AN ITALIAN NAMED JAMES PASQUALLE, BETTER KNOWN AS “JIMMIE THE +PUSH.” FROM THAT TIME JESS WAS KEPT “ON TAP,” TO AWAIT FURTHER +DEVELOPMENTS. + +THEN THE COMMISSIONER UNDERTOOK TO FIND OUT MORE ABOUT THE CHARACTER +CALLED “GENE.” WORKING IN NEW YORK, AS WAITERS AND BARTENDERS, WERE MANY +MEMBERS OF A CRIMINAL BAND KNOWN AS THE “FORTY THIEVES OF BOSTON.” THE +COMMISSIONER CALLED IN ALL OF THEM THAT HE COULD FIND, AND SOUNDED EACH +FOR INFORMATION ABOUT THIS “GENE.” AFTER THE TIME OF DAY HAD BEEN +PASSED, THE TALK WOULD TURN ON MEMBERS OF THE BAND AND CRIMINALS IN +GENERAL, AND AFTER CURIOSITY HAD BEEN EXCITED, “GENE” WOULD BE REFERRED +TO CASUALLY. IF THE PARTY INTERVIEWED SAID HE KNEW “GENE,” THE +COMMISSIONER WOULD PROBABLY BE SCEPTICAL, ASK HIS LAST NAME, PRESS FOR +DETAILS OF APPEARANCE AND HABITS, AND THEN PASS TO SOME OTHER SUBJECT. + +IT WAS FOUND THAT “GENE’S” LAST NAME WAS SPLAINE, THAT HE HAD SERVED A +TERM IN PRISON IN BOSTON AS A BOY, AND THAT, BY HIS GENERAL DESCRIPTION, +HE MUST BE THE THIRD FUGITIVE ACCOMPANYING KINSMAN AND ANNIE. WHEN +DETECTIVE WATSON GOT BETTER DESCRIPTIONS OF THE THIRD MAN AT ALBANY, AND +COMPARISONS WERE MADE WITH SOURCES OF INFORMATION IN NEW YORK, IT BECAME +PRACTICALLY CERTAIN THAT GENE SPLAINE WAS WITH KINSMAN. + + + _ANNIE SHOWS AT “PLANT 21”_ + +IT WAS ON THIS DAY, TOO (TUESDAY, FEBRUARY 20), THAT “SWEDE ANNIE” +SUDDENLY STEPPED INTO POLICE VIEW, _WEARING A NEW HAT_. SHE TURNED UP +QUIETLY AT THE HOUSE WHERE MYRTLE HORN HAD MOVED WITH HER TRUNK, AND +BEGAN LIVING IN THE FRONT BASEMENT ROOM. MATRON GOODWIN AND “PLANT 21” +IMMEDIATELY REPORTED HER PRESENCE, AND FROM THAT TIME THE SHADOW MEN +ACROSS THE STREET HAD SOMETHING TO DO BESIDES DRIVING NAILS. FOR +WHENEVER ANNIE OR MYRTLE WENT OUT OF THE HOUSE THEY WERE FOLLOWED. + +SHADOWING IS A HIGHLY INTERESTING KIND OF POLICE WORK, AT WHICH SOME MEN +HAVE EXCEPTIONAL ABILITY. + +THE GENERAL CONCEPTION IS THAT OF A DETECTIVE FOLLOWING CLOSELY BEHIND +THE SUSPECTED PERSON, WITH HIS EYES GLUED TO HIM, AND CAUTIOUSLY +CROUCHING BEHIND LAMP-POSTS AND TREES WHEN THE VICTIM TURNS SUDDENLY. +BUT THAT IS FAR FROM THE REAL THING. THE WORK IS DONE IN WAYS ALTOGETHER +DIFFERENT. SHADOW MEN OPERATE IN PAIRS, AS A RULE, AND KEEP TRACK OF +THEIR PARTY FROM VANTAGE POINTS NOT LIKELY TO BE SUSPECTED. THEY DRESS +ACCORDING TO THE CHARACTER OF THE CASE, ALWAYS IN QUIET CLOTHES, CHANGED +DAILY, AND WITH ABSOLUTELY NO COLORS THAT WILL ATTRACT ATTENTION OR LEAD +TO RECOGNITION THROUGH THE MEMORY. THEY KNOW HOW TO FOLLOW WHEN THE +PERSON UNDER SURVEILLANCE RIDES IN CABS, CARS OR TRAINS, TO COVER THE +DIFFERENT EXITS FROM A BUILDING INTO WHICH HE OR SHE MAY HAVE GONE, AND +TO LOITER SEVERAL HOURS AROUND A GIVEN NEIGHBORHOOD, IF NEED BE, WITHOUT +ATTRACTING THE ATTENTION OF HONEST CITIZENS. + +THIS WORK IS DONE BY SHIFTS. THE OPERATORS RELIEVE EACH OTHER ALMOST AS +REGULARLY AS OFFICE EMPLOYEES, NO MATTER HOW FAR THE TRAIL MAY HAVE +TAKEN THEM. THEY ARE IN CONSTANT TOUCH WITH HEADQUARTERS FOR THE PURPOSE +OF MAKING REPORTS AND RECEIVING INSTRUCTIONS. + +IN THIS BRANCH OF DETECTIVE WORK, AS IN MANY OTHERS, THE CHIEF REQUISITE +IS RESOURCEFULNESS. THE DETECTIVE OF FACT WEARS LITTLE DISGUISE APART +FROM CLOTHES THAT FIT THE SURROUNDINGS HE MOVES IN. BUT HE HAS AN +INSTANT KNACK AT ACCOUNTING FOR HIMSELF AS A NORMAL CHARACTER WHO HAS +HAPPENED QUITE NATURALLY INTO THE SCENE. READY WITS DO THE TRICK—NOT +FALSE WHISKERS. THUS IT CAME ABOUT THAT WHENEVER ANNIE AND MYRTLE WERE +HUNGRY, AND SAT DOWN IN A RESTAURANT, WHAT THEY SAID WAS NOTED BY A +COUPLE OF FELLOWS AT ANOTHER TABLE, WHO QUICKLY MADE A PARTY OF THE +CHANCE PATRONS THEY FOUND THERE, DISCUSSING WAGES OR THE SUFFRAGETTES. +OR IF ANNIE USED THE TELEPHONE IN A DRUG STORE, A POLITE YOUNG MAN +TURNING OVER THE DIRECTORY SAID TO HER, “GO AHEAD, LADY—I’M IN NO +HURRY,” AND LISTENED. + +AT THE SAME TIME, MATRON GOODWIN WAS REPORTING CONVERSATION FROM INSIDE +THE HOUSE. IT APPEARED THAT KINSMAN HAD SENT ANNIE BACK TO THE CITY +AFTER BUYING HER A NEW HAT AND GIVING HER $125. HE PROMISED TO WRITE +SOON, BUT DID NOT TELL HER WHERE HE WAS GOING. TOWARD THE END OF THE +WEEK, AS NO LETTER ARRIVED, ANNIE BEGAN WORRYING, AND WAS TALKATIVE. SHE +FEARED THAT EDDIE NO LONGER LOVED HER. SHE REPROACHED HERSELF FOR +LETTING HIM GO WITHOUT TAKING HER ALONG, AND SPOKE OF SETTING OUT TO +FIND HIM. + + + _THE TRAIL IS TAKEN UP_ + +IT WAS NOW WEDNESDAY, FEBRUARY 21, AND ALL THE CAREFUL DETAIL WORK BEGAN +TO COME TOGETHER. + +IT WAS THIS DAY THAT DETECTIVE WATSON FOUND THE CREW OF TRAIN NO. 13, ON +THE NEW YORK CENTRAL, WHICH HAD TAKEN KINSMAN, ANNIE AND SPLAINE ABOARD +AT PEEKSKILL THE AFTERNOON OF THE ROBBERY AFTER THEY HAD RIDDEN OUT OF +NEW YORK IN A TAXICAB TO AVOID POSSIBLE POLICE SURVEILLANCE AT THE +RAILROAD STATIONS. COMMISSIONER DOUGHERTY DISPATCHED WATSON TO PEEKSKILL +AND ALBANY WITH THOROUGH INSTRUCTIONS. HIS MOTTO IN WORKING OUT A CASE +IS, “SUPERVISION IS HALF THE BATTLE.” + +“WHEN YOU GET TO ALBANY,” HE SAID, “GO TO THAT BIG HAT STORE ON BROADWAY +NEAR THE STATION. I’LL BET THAT’S WHERE ANNIE’S NEW HAT WAS BOUGHT—THEY +SELL THE BEST MILLINERY IN THE COUNTRY OUTSIDE OF NEW YORK.” + +NOTHING IMPORTANT WAS LEARNED AT PEEKSKILL, BUT AT ALBANY, SURE ENOUGH, +DETECTIVE WATSON FOUND THE SALESWOMAN RIGHT IN “THAT BIG HAT STORE” WHO +HAD SOLD THE NEW HAT, AND SECURED ANNIE’S DISCARDED HEADGEAR. THE NEW +HAT HAD COST TWENTY-FIVE DOLLARS. THE OLD ONE LOOKED AS THOUGH IT MIGHT +HAVE COST NINETY-FIVE CENTS—A “DIVISION STREET SPECIAL.” ITS BLACK +VELVET WAS OF THE CHEAPEST GRADE, THE FAMOUS LITTLE RED ROSES PROVED TO +BE, ON CLOSE INSPECTION, NOTHING MORE THAN LITTLE LOOPS OF PINK COTTON +CLOTH, AND THE GENERAL STATE OF THE HAT INDICATED THAT IT WAS ABOUT TIME +ANNIE HAD A NEW ONE. THIS INTERESTING “BONNET,” HOWEVER, SEEMED JUST +THEN MORE HANDSOME THAN ANY COSTLY ARTICLE OF MILLINERY EVER SMUGGLED +OVER FROM PARIS. IT WAS IMMEDIATELY SENT TO NEW YORK BY EXPRESS, WITH A +COPY OF THE SALES SLIP COVERING THE PURCHASE. THE SALESWOMAN WAS ABLE TO +ADD ONE OR TWO DETAILS OF DESCRIPTION, AND REMEMBERED HOW, AFTER THE +WOMAN HAD SELECTED A HAT, THE TWO MEN HAD JOKED ABOUT WHO WAS TO PAY FOR +IT. + +“SHE’S YOUR GIRL,” SAID SPLAINE, AND SO KINSMAN HAD PAID THE BILL WITH +FIVE FIVE-DOLLAR BILLS. + +NOTHING COULD BE LEARNED AS TO THE DIRECTION IN WHICH THE TWO MEN MEANT +TO TRAVEL. DETECTIVE WATSON NOW BEGAN A SEARCH AMONG TRAIN CREWS RUNNING +OUT OF ALBANY, AND COMMISSIONER DOUGHERTY, IN NEW YORK, GOT THE ALBANY +TICKET-SELLERS BY LONG-DISTANCE TELEPHONE. HIS KNOWLEDGE OF HOW RAILROAD +TICKETS ARE SOLD, ACCOUNTED FOR, TAKEN UP, CANCELLED AND CHECKED BY THE +AUDITING DEPARTMENT MADE IT POSSIBLE TO SIFT MATTERS DOWN TO THE +STRONGEST KIND OF PROBABILITY. AFTER CONSIDERABLE TELEPHONING, AIDED BY +DETECTIVE WATSON ON THE SPOT, IT WAS DETERMINED THAT KINSMAN AND SPLAINE +HAD BEEN THE PURCHASERS OF TWO CONSECUTIVELY NUMBERED TICKETS FOR +CHICAGO SOLD TOGETHER ON FRIDAY MORNING, TWENTY-FOUR HOURS AFTER THE +ROBBERY, AND THAT THEY HAD GONE WEST ON TRAIN NO. 3, LEAVING ALBANY AT +12:10 P. M. THEIR TICKETS WERE AVAILABLE FOR THAT TRAIN, AND THE +CONCLUSION WAS STRENGTHENED BY CALCULATING ANNIE’S MOVEMENTS. FOR IT WAS +FOUND THAT SHE HAD COME BACK TO NEW YORK THE SAME DAY, BETWEEN FOUR AND +FIVE IN THE AFTERNOON. SHE HAD KEPT OUT OF SIGHT UNTIL SHE APPEARED AT +MYRTLE HORN’S LODGING AND WAS REPORTED BY MATRON GOODWIN AND “PLANT 21” +ON TUESDAY. BUT SHE MUST HAVE TAKEN A TRAIN FROM ALBANY ABOUT THE TIME +THAT THE MEN WERE STARTING FOR CHICAGO, REACHING NEW YORK AT 3:45 P. M. + +COMMISSIONER DOUGHERTY FELT THAT THE CHANCES OF FINDING HIS MEN IN +CHICAGO WERE SO GOOD THAT, WITHOUT WASTING TIME IN AN INVESTIGATION OF +THE CREW OF TRAIN NO. 3, HE PUT DETECTIVES DALY AND CLARE ABOARD A +CHICAGO TRAIN THAT SAME NIGHT. KINSMAN AND SPLAINE WOULD BOTH FIND +CONGENIAL COMPANY AMONG THE PUGILISTS IN CHICAGO. + +THESE DETECTIVES WERE GIVEN NAMES TO CONCEAL THEIR IDENTITY, AND ORDERED +TO REPORT UNDER THE CODE TERM OF “ORANGE GROWERS” TO ELIMINATE ALL +FLAVOR OF POLICE BUSINESS. THEY RECEIVED DETAILED INSTRUCTIONS ABOUT +WHERE TO GO AND WHAT TO DO. AGAIN THE COMMISSIONER COVERED THE TRAIL +WHEN IT LED OUT OF NEW YORK BY SENDING CAPABLE ASSISTANTS, INSTEAD OF +MERELY WIRING THE POLICE IN OTHER CITIES. BEFORE THE “ORANGE GROWERS” +DEPARTED, THE “BOSS” GAVE THEM A LITTLE TALK ABOUT EXPENSES. + +THE DETECTIVE ATTACHED TO A MUNICIPAL POLICE FORCE IS VERY OFTEN +HAMPERED BY FEAR OF MAKING UNUSUAL EXPENDITURES. ACCOUNTING ROUTINE IS +STRICT. TELEGRAMS ARE OFTEN LIMITED TO THE MINIMUM OF TEN WORDS WHERE A +HUNDRED ARE NEEDED TO SEND A WORKING DESCRIPTION OR REPORT. THE +LONG-DISTANCE TELEPHONE IS USED AS A LUXURY, AND IN MANY INSTANCES WHERE +THE PLAIN-CLOTHES MAN CAN GET VALUABLE INFORMATION THROUGH AN INFORMANT +HE PAYS THE SHOT OUT OF HIS OWN POCKET BECAUSE THERE IS NO OTHER WAY OF +PAYING IT, AND TRUSTS TO THE CHANCE THAT THIS PRIVATE INVESTMENT OUT OF +HIS SALARY WILL HELP HIM “BREAK” A KNOTTY CASE. + +COMMISSIONER DOUGHERTY TOLD THE “ORANGE GROWERS” THAT THEY WOULD BE KEPT +ON THIS TRAIL IF IT LED ALL AROUND THE WORLD. THEY MUST NOT CONSIDER +EXPENDITURE WHEN THERE WAS VITAL INFORMATION TO PUT ON THE WIRE. HE +EXPECTED THEM TO TURN TO THE LONG-DISTANCE TELEPHONE WHENEVER THEY +NEEDED NEW INSTRUCTIONS IN A HURRY. BRIEFLY, HE TOOK THE BLINDERS AND +SHACKLES OFF THEM, AND SENT THEM OUT TO DO GOOD WORK, AND THE OUTCOME +JUSTIFIED THIS FAR-SIGHTEDNESS. + +------------------------------------------------------------------------ + +[ILLUSTRATION: JESS ALBRAZZO] + +[ILLUSTRATION: MATTEO ARBRANO] + +[ILLUSTRATION: JAMES PASQUALE] + +[ILLUSTRATION: BOB DELIO] + +------------------------------------------------------------------------ + +AT THAT PERIOD OF THE WINTER TRAINS WERE DELAYED EVERYWHERE BY STORMS, +SO THE “ORANGE GROWERS” HAD OPPORTUNITIES TO MAKE INQUIRIES AT STATIONS +AND RAILROAD RESTAURANTS ALL ALONG THE LINE TO BUFFALO. THEY WERE IN +SEARCH OF THEIR “BROTHER,” WHO WAS DESCRIBED IN TERMS OF KINSMAN’S +PERSONAL APPEARANCE, AND WAS SUPPOSED TO BE ON HIS WAY SOMEWHERE WITH +ANOTHER MAN. AT SYRACUSE AN OBSERVANT WAITRESS REMEMBERED THEIR +“BROTHER” DISTINCTLY, HAVING SERVED BOTH THE MEN WHEN THEIR TRAIN +STOPPED FOR SUPPER. FINALLY, THE TWO “ORANGE GROWERS” GOT SNOWED UP IN +MICHIGAN FOR A TIME, AND THERE WE WILL LEAVE THEM FOR THE PRESENT. + + + _MONTANI QUIZZED ONCE MORE_ + +BY THURSDAY MANY LOOSE ENDS OF THE CASE WERE BEING BROUGHT TOGETHER SO +EFFECTUALLY THAT THE OUTLOOK SEEMED EXCEEDINGLY BRIGHT. + +BUT ONLY TO THE EXECUTIVE CIRCLE IN DOUGHERTY’S OFFICE. + +OUTSIDE, ALL WAS DARK. NEWSPAPER CRITICISM HAD BECOME MORE CAUSTIC THAN +EVER, AND THE PUBLIC, AFTER THE INGRAINED HABIT OF NEW YORK, WAS TURNING +ITS ATTENTION TO FRESHER NEWS SENSATIONS. + +AT A BIG ANNUAL DINNER OF POLICE OFFICIALS HELD THAT EVENING, FEBRUARY +22, THE ATMOSPHERE OF GLOOM RESTING UPON THE DEPARTMENT WAS MOST +TANGIBLE. THE FOURTEEN HUNDRED GUESTS, WHO WERE CHIEFLY POLICE +INSPECTORS, CAPTAINS AND LIEUTENANTS, FELT THAT A STIGMA LAY UPON THE +SERVICE WITH WHICH THEY WERE IDENTIFIED. THEY HAD NO MEANS OF KNOWING, +OF COURSE, THAT ONE WEEK FROM THAT NIGHT THE GLOOM WOULD HAVE LIFTED, +CRITICISM BE TURNED TO PRAISE, AND THAT POLICEMEN GENERALLY WOULD BE, AS +A WITTY LIEUTENANT PUT IT, “BACK TO OUR OFFICIAL STANDING AGAIN—WHICH +NEVER WAS SO VERY HIGH.” + +MONTANI HAD CALLED AT POLICE HEADQUARTERS REPEATEDLY, ACCOMPANIED BY HIS +UNSEEN SHADOWERS. HE PROFESSED TO BE ANXIOUS TO FURNISH FURTHER +INFORMATION, IF IT LAY IN HIS POWER, AND THE COMMISSIONER CHATTED WITH +HIM CORDIALLY, LEADING HIM TO BELIEVE THAT HE NO LONGER RESTED UNDER THE +SLIGHTEST SUSPICION. + +ON FRIDAY DOUGHERTY MADE AN INTERESTING EFFORT TO “BREAK” MONTANI. + +HE NOW HAD A MINUTE PHYSICAL DESCRIPTION OF KINSMAN, AS WELL AS TWO +PHOTOGRAPHS OF HIM. THE CHAUFFEUR WAS ASKED TO DESCRIBE ONCE MORE THE +MAN WHO HAD SAT UPON THE CAB SEAT WITH HIM. THE QUESTIONS WENT OVER +DETAILS FROM HEAD TO FOOT, AND WERE PROMPTED BY DETAILS OF KINSMAN’S +REAL APPEARANCE. + +MONTANI SAID THE MAN HAD LARGE BROWN EYES, WHICH WAS TRUE. + +HE REMEMBERED THAT HE HAD TALKED WITH A GOOD AMERICAN ACCENT, AND USED +WORDS NOT COMMON TO THE CRIMINAL, WHICH WAS ALSO MORE OR LESS TRUE. + +HE SUDDENLY RECALLED A GOLD-FILLED TOOTH IN THE ROBBER’S UPPER +RIGHT-HAND JAW, A POINT ALREADY FURNISHED BY INFORMANTS. + +IN FACT, AS THIS NEW EXAMINATION WENT ON, IT BECAME CLEAR TO THE +COMMISSIONER THAT MONTANI WAS ACTUALLY DESCRIBING KINSMAN, CHANGING ONLY +ONE DETAIL. HE SAID THAT THE ROBBER HAD HAD A DARK MUSTACHE, WHILE IT +WAS CERTAIN THAT KINSMAN HAD BEEN SMOOTH-SHAVEN. + +SUDDENLY THE COMMISSIONER TRIED WHAT IS KNOWN AS A “SHOT.” + +THE EXAMINER IN SUCH AN INQUIRY IS OFTEN IN POSSESSION OF INCRIMINATING +EVIDENCE. INSTEAD OF PRODUCING IT BLUNTLY AS EVIDENCE, HOWEVER, HE WILL +PERHAPS LET IT SLIP OUT BIT BY BIT, AS THOUGH BY AWKWARDNESS, MEANWHILE +MAINTAINING AN APPEARANCE OF ABSOLUTE CONFIDENCE IN THE SUSPECT’S +INTEGRITY. A CLASSIC EXAMPLE OF THIS DEVICE IS FOUND IN THE RUSSIAN +WRITER DOSTOIEFFSKY’S “CRIME AND PUNISHMENT.” THE SKILLFUL “SHOT” IS +USUALLY FAR MORE DISCONCERTING THAN EVIDENCE PRODUCED OPENLY TO +OVERWHELM. FOR THE SUSPECT ASSUMES THAT THE EXAMINER REALLY KNOWS +NOTHING, AND HAS MERELY BLUNDERED. SO HE IS ON HIS GUARD OUTWARDLY. BUT +HE ALSO WORRIES INWARDLY, AND THIS TRYING CONFLICT BETWEEN INNER DOUBT +AND THE NEED FOR KEEPING UP OUTER CALM WILL OFTEN BREAK HIM DOWN +COMPLETELY. + +DOUGHERTY’S “SHOT” WAS A PHOTOGRAPH OF KINSMAN. + +BY PRE-ARRANGEMENT AN ASSISTANT CAME INTO THE OFFICE AND BEGAN TURNING +OVER SOME PAPERS ON THE COMMISSIONER’S DESK. THE PHOTO OF KINSMAN POPPED +OUT WHERE MONTANI COULD SEE IT PLAINLY, AND THEN WAS HURRIEDLY PUT OUT +OF SIGHT AGAIN. THE COMMISSIONER SCOLDED HIS ASSISTANT, AND THE LATTER +STOOD SHAMEFACED AND SILENT. + +BUT IN THIS INSTANCE THE DEVICE FAILED. + +MONTANI NOT ONLY BETRAYED NO INTEREST IN KINSMAN’S PICTURE, BUT TOOK THE +AWKWARD ASSISTANT’S PART, AND ASKED THE COMMISSIONER NOT TO SCOLD HIM. + +MONTANI HAD PLANNED HIS CRIME, FITTED THE PLAN WITH MEN, LAID OUT EVERY +DETAIL IN HIS MIND, AND ARRANGED HIS STORY BEFOREHAND. HE EXPECTED TO BE +ARRESTED, AND SAID SO. HE ADMITTED THAT THERE WERE INCONSISTENCIES IN +HIS STORY, BUT HOPED TO CLEAR THEM UP. HE HAD DISCUSSED THE CRIME WITH +JESS AND DUTCH, AND HAD NOT BEEN SEEN IN THE COMPANY OF THE OTHER +CRIMINALS. SO, HAVING SETTLED ON HIS STORY, MONTANI STUCK TO IT WITHOUT +VARIATION UNDER EVERY FORM OF PRESSURE. OTHERS FORGOT WHAT THEY HAD +ARRANGED AS THEIR DEFENSE, OR DEPARTED FROM IT, OR BROKE DOWN AND +CONFESSED. BUT NOT MONTANI. HE ALONE WENT TO TRIAL, AND STUCK TO HIS +STORY UNTIL THE END. + + + _THE “ORANGE GROWERS” IN CHICAGO_ + +WHEN DALY AND CLARE, THE TWO NEW YORK DETECTIVES WORKING AS THE “ORANGE +GROWERS,” ARRIVED IN CHICAGO, THEY WENT TO POLICE HEADQUARTERS IN THAT +CITY, MADE INQUIRIES ABOUT KINSMAN AND SPLAINE, AND SECURED THE AID OF +CHICAGO DETECTIVES. THEN THEY PUT UP AT A HOTEL WHERE, BY ARRANGEMENTS +WITH THE HOUSE DETECTIVE, THEY OCCUPIED A ROOM ON THE SECOND FLOOR HANDY +TO A LITTLE-USED STAIRWAY LEADING TO A SIDE STREET, WHICH WOULD MAKE IT +EASY TO SLIP IN AND OUT WITHOUT GOING THROUGH THE LOBBY. ON THE TRIP +FROM NEW YORK BOTH OF THEM HAD NEGLECTED SHAVING, AND DALY WAS AN +ESPECIALLY TOUGH-LOOKING CITIZEN, FOR HIS BEARD GROWS OUT STIFF AND +BRISTLY, WITH BLACK AND RED INTERMIXED, AND A LITTLE GREEN TO HELP THE +GENERAL EFFECT. WITH SUITS OF OLD CLOTHES AND SWEATERS THEY WERE SO +LITTLE LIKE THEIR OFFICIAL SELVES THAT FOR SEVERAL DAYS, THOUGH THEY +WENT RATHER FREELY AROUND RESORTS FREQUENTED BY CROOKS WHO KNEW THEM IN +NEW YORK, THEY WERE NOT RECOGNIZED. + +THE “ORANGE GROWERS” NOW BECAME A PAIR OF HARDENED “YEGGMEN,” OR BANK +ROBBERS, AND FOR THREE DAYS WERE BUSY VISITING THIEVES’ HAUNTS ALL OVER +THE CITY, FROM THE LEVEE DISTRICT TO THE STOCKYARDS. IT WAS FOUND THAT +KINSMAN AND SPLAINE HAD PUT UP AT A HIGH-CLASS BOARDING HOUSE IN A +FASHIONABLE RESIDENCE SECTION. KINSMAN SEEMED TO BE DOUBTFUL ABOUT THE +IMPRESSION SPLAINE MIGHT MAKE THERE, THOUGH IN THE OPINION OF THE POLICE +SPLAINE WAS BY FAR THE MORE INTELLIGENT OF THE PAIR. SO HE TOOK THE +LANDLADY ASIDE AND ASKED HER, PRIVATELY, IF SHE HAD OBJECTIONS TO A +PRIZE-FIGHTER IN HER HOUSE. THE LANDLADY REPLIED, “WHY, NO! IF HE IS A +GENTLEMAN—MANY PRIZE-FIGHTERS ARE JUST LIKE OTHER PEOPLE!” THEREUPON, +KINSMAN UNDERTOOK THAT SPLAINE SHOULD BEHAVE HIMSELF. HE ALSO WANTED TO +KNOW IF VALUABLES WERE SAFE THERE, AND THE ASTONISHED LANDLADY ASSURED +HIM THAT HER HOUSE WAS LIKE A HOME, THAT THE GUESTS WERE LIKE ONE BIG +FAMILY AND SELDOM LOCKED THEIR DOORS, AND THAT MR. SMITH, WELL KNOWN AS +AN OFFICER IN ONE OF THE LEADING BANKS, HAD LIVED THERE FOR YEARS. + +THE PAIR HAD SPENT CONSIDERABLE TIME IN CRIMINAL HAUNTS, BUT HAD NOW +DISAPPEARED. KINSMAN, AS IT WAS LEARNED LATER, HAD RETURNED TO NEW YORK. +SPLAINE WAS APPARENTLY IN CHICAGO STILL, SPENDING HIS MONEY, BUT THE TWO +“ORANGE GROWERS” SEEMED NEVER TO CATCH UP WITH HIM. THEIR MAN HAD ALWAYS +GONE AROUND THE CORNER WITHIN THE PAST HOUR. + +FINALLY THEY PLANNED A RUSE WITH THE AID OF TWO CHICAGO DETECTIVES. +SPLAINE HAD BEEN INTIMATE WITH A CERTAIN WOMAN OF THE UNDERWORLD, KNOWN +AS “JOSIE.” CLARE WENT TO HER, REPRESENTED HIMSELF AS A “STICK-UP MAN,” +SAID HE AND HIS PARTNER WERE AFTER THAT GUY WITH ALL THE MONEY AND +DIAMONDS, MEANING SPLAINE, AND THAT THEY MEANT TO ROB HIM. IF JOSIE +WORKED WITH THEM, LIKE A GOOD GIRL, SHE WOULD COME IN FOR HER THIRD OF +THE PLUNDER. + +JOSIE PROFESSED IGNORANCE. SHE WAS SURE, SO HELP HER MIKE, CROSS HER +HEART, THAT SHE KNEW NOTHING ABOUT NO GENT WITH ANY MONEY OR DIAMONDS—NO +SUCH A PARTY HAD BEEN NEAR THE HOUSE IN MONTHS, WORSE LUCK. CLARE ARGUED +AWHILE WITH NO RESULTS, AND THEN SAID HE WOULD COME BACK A LITTLE LATER +AND BRING HIS PAL. THEN DALY WAS INTRODUCED TO JOSIE AS THE EXTREMELY +UNDESIRABLE CITIZEN WHO WOULD DO THE STRONG-ARM WORK. BUT JOSIE STILL +INSISTED THAT SHE HAD NO IDEA WHAT THEY WERE TALKING ABOUT. + +THEY WENT OUT, AND WITHIN A FEW MINUTES THE TWO CHICAGO DETECTIVES, +DEMPSEY AND MCFARLAND, KNOWN BY JOSIE AS OFFICERS, CAME IN, DESCRIBED +THE DISGUISED CLARE AND DALY AS TWO OF THE MOST DESPERATE “YEGGMEN” IN +THE COUNTRY, SAID THAT THEY HAD WARRANTS FOR THEM, AND ASKED IF THEY HAD +BEEN SEEN. JOSIE CROSSED HER HEART AGAIN, AND SAID THAT THERE HAD BEEN +NOBODY AROUND THERE ALL EVENING—BELIEVE HER, IT WAS LIKE LIVING THE +SIMPLE LIFE, AND IF THINGS KEPT ON BEIN’ SO QUIET SHE’D BLOW THE TOWN +AND GO BACK TO KEOKUK. + +THEN, ENTER THE TWO “ORANGE GROWERS” ONCE MORE, TO BE WARNED BY THE FAIR +JOSIE. + +“SAY, THE BULLS ARE AFTER YOU BOYS, AN’ YOU BETTER PULL YOUR FREIGHT, +‘CAUSE IF YOU STAY AROUND HERE THEY’RE GOIN’ TO _GET_ YOU.” + +“AW, HELL!” WAS THE REPLY, “WE’D JUST AS LIEVE KILL A COP OR ANYBODY +ELSE. WE STICK IN THIS HOUSE TILL YOU TELL US WHERE WE CAN REACH THAT +GUY WITH THE MONEY AND THE DIAMONDS—UNDERSTAND?” + +THEN JOSIE BROKE DOWN, AND TOLD THEM SPLAINE HAD BEEN THERE EARLY IN THE +EVENING, BUT HAD GONE AWAY TO TAKE A TRAIN OUT OF TOWN. SHE DID NOT KNOW +THE RAILROAD, AND URGED THEM TO LEAVE. THIS WAS EVIDENTLY THE TRUTH, SO +THEY HURRIED TO POLICE HEADQUARTERS, TELEGRAPHED DESCRIPTIONS TO OTHER +CITIES WITH A REQUEST THAT ARRIVING TRAINS BE WATCHED, AND WENT TO BED +TO GET A LITTLE SLEEP, SO THAT THEY COULD BE AT WORK EARLY THE NEXT +MORNING. + +BUT IN THE MORNING WORD CAME FROM THE MEMPHIS POLICE THAT SPLAINE HAD +BEEN ARRESTED THERE ON ALIGHTING FROM A TRAIN, AND THEY THEREUPON +NOTIFIED NEW YORK, WENT TO MEMPHIS, SECURED SPLAINE ON EXTRADITION +PAPERS, AND BROUGHT HIM BACK TO THE METROPOLIS. + + + _THE TRAPS ARE SPRUNG_ + +ON SATURDAY AFTERNOON, FEBRUARY 24, WHILE MOST OF THE ENERGY OF THE +DETECTIVE BUREAU WAS CENTERED ON THE TAXICAB CASE, A BRUTAL MURDER WAS +COMMITTED IN BROOKLYN. + +WORD CAME THAT A FLATBUSH MERCHANT HAD BEEN FOUND DEAD IN HIS STORE, +SHOT BY UNKNOWN CRIMINALS WHOSE MOTIVE WAS ROBBERY. THEY HAD TAKEN HIS +WATCH AND FIVE SAFETY RAZORS. + +INSPECTOR HUGHES WAS SENT TO THE SCENE OF THE CRIME, AND COMMISSIONER +DOUGHERTY QUICKLY FOLLOWED. THE MURDER OCCURRED ABOUT ONE P. M. BY SIX +O’CLOCK THE SAME DAY THE NUMBER OF THE WATCH HAD BEEN LEARNED THROUGH A +CANVASS OF JEWELERS IN THE NEIGHBORHOOD, IT BEING ON RECORD BY ONE OF +THEM WHO HAD REPAIRED IT, AND THE WATCH AND TWO OF THE SAFETY RAZORS HAD +BEEN FOUND IN PAWNSHOPS. DESCRIPTIONS OF THE MURDERERS WERE OBTAINED, +AND BY THREE O’CLOCK SUNDAY, THE FOLLOWING DAY, THEIR IDENTITY HAD BEEN +ESTABLISHED. WITHIN THIRTY HOURS AFTER THE CRIME THESE MEN HAD BEEN +ARRESTED, POSITIVELY IDENTIFIED AS THE PAWNERS OF THE STOLEN ARTICLES, +AND COMPLETELY TIED UP IN THEIR OWN STATEMENTS. + +AT HALF-PAST NINE SUNDAY NIGHT, WHILE THE COMMISSIONER, INSPECTOR HUGHES +AND CAPTAIN COUGHLIN, IN CHARGE OF BROOKLYN DETECTIVES, AND LIEUTENANT +RILEY WERE WINDING UP THEIR WORK ON THIS MURDER CASE, WORD SUDDENLY CAME +OVER THE TELEPHONE TO COMMISSIONER DOUGHERTY FROM AN INFORMANT THAT +EDDIE KINSMAN HAD BEEN SEEN IN NEW YORK WITH “SWEDE ANNIE,” AND THAT HE +WAS ACCOMPANIED BY AN UNKNOWN MAN, WEARING A RED NECKTIE, SUPPOSED TO BE +GENE SPLAINE. AT THE SAME TIME MATRON GOODWIN, STATIONED INSIDE ANNIE’S +LODGINGS, TELEPHONED THAT SHE HAD INFORMATION INDICATING THAT KINSMAN +HAD RETURNED TO THE CITY. + +WHEN THE COMMISSIONER MOTORED OVER TO NEW YORK, HE FOUND HIS MEN +COVERING A HOTEL ON THIRD AVENUE, NOT FAR FROM 42D STREET. KINSMAN AND +ANNIE WERE INSIDE. + +THE COMMISSIONER HURRIED TO THE 18TH PRECINCT POLICE STATION AND SENT +OUT A CALL FOR TWENTY-FIVE DETECTIVES. TEAM WORK ON THE CASE HAD +DEVELOPED TO SUCH A DEGREE BY THIS TIME THAT, THOUGH THE MEN CAME FROM +MANY STATIONS, THEY WERE ALL ON HAND IN RECORD TIME, A MATTER OF TWENTY +OR THIRTY MINUTES. THEN A SQUAD OF THESE PLAIN-CLOTHES MEN WAS SENT TO +WATCH EVERY RAILROAD STATION AND FERRY HOUSE, EACH ACCOMPANIED BY ONE OF +THE MEN FROM “PLANT 21,” FAMILIAR WITH ANNIE FROM HAVING FOLLOWED HER +MOVEMENTS FOR A WEEK. SURVEILLANCE ON THE HOTEL WAS STRENGTHENED, AND +STEPS TAKEN TO ASCERTAIN WHETHER THE UNKNOWN MAN IN THE RED TIE WAS +REALLY SPLAINE. + +WHILE MAKING THESE ARRANGEMENTS, A CURIOUS INCIDENT OCCURRED, SHOWING +HOW SMALL IS NEW YORK, AFTER ALL, WITH ITS FIVE MILLION PEOPLE. AS +DOUGHERTY SAT IN THE 18TH PRECINCT STATION, DETECTIVE REIN BROUGHT IN A +PRISONER ARRESTED FOR SHOOTING A CITIZEN. HE WAS DRUNK AND EXTREMELY +DISAGREEABLE, AND GAVE HIS NAME AS “STEIGEL,” LIVING AT 98 THIRD AVENUE. +SOMETHING IN THIS ADDRESS ECHOED TO SOMETHING IN DOUGHERTY’S MEMORY—A +KEEN ONE FOR NAMES, DATES, ADDRESSES AND FACTS GENERALLY. HE +INVESTIGATED FURTHER, AND FOUND THAT THIS PRISONER WAS NO OTHER THAN THE +CRIMINAL MOLLOY, WHOSE URGENT NEED OF “CHARACTER WITNESSES” HAD PLAYED +SO IMPORTANT A PART IN FURNISHING THE FIRST INFORMATION IN THE TAXICAB +CASE. + +BY SOME MISCHANCE, THESE OPERATIONS CAME TO THE EARS OF THE NEWSPAPER +MEN. WORD WENT ABOUT, BEGINNING IN BROOKLYN, THAT IMPORTANT ARRESTS WERE +TO BE MADE. THE REPORTERS FOLLOWED THE COMMISSIONER IN A CROWD WHEN HE +REFUSED TO MAKE A STATEMENT. THEY NOT ONLY HAMPERED THE WORK, BUT +GREATLY ENDANGERED THE OUTCOME. ON THE FOLLOWING DAY, MONDAY, THE PAPERS +PUBLISHED INFORMATION ABOUT THE POLICE ACTIVITIES OF THE NIGHT BEFORE. +THE HAZARD HERE MAY BE APPRECIATED WHEN THE READER IS TOLD THAT KINSMAN +HAD BEEN A PERSISTENT READER OF NEWSPAPERS FROM THE DAY OF THE ROBBERY, +AND THAT IT WAS LARGELY THE PESSIMISTIC NEWSPAPER COMMENT UPON MONTANI’S +RELEASE IN COURT THAT LED HIM TO RETURN TO NEW YORK. DECEIVED BY THE +NEWSPAPER CHORUS OF “POLICE DEMORALIZATION,” AND THE EASY WAY IN WHICH +MONTANI HAD GOT FREE, HE CONCLUDED THAT THE TAXICAB INVESTIGATION HAD +BEEN GIVEN UP AS HOPELESS. + +KINSMAN WAS ARRESTED IN THE GRAND CENTRAL STATION AT HALF-PAST ELEVEN +MONDAY MORNING, WITH SWEDE ANNIE AND THE UNKNOWN IN THE RED TIE. THEY +WERE ABOUT TO SET OUT FOR BOSTON. + +THERE WERE SOME AMUSING CIRCUMSTANCES IN THE ARREST. + +KINSMAN’S IMMUNITY OVER NIGHT, AND POLICE PRECAUTION IN DEFERRING THE +ARREST UNTIL THE LAST MOMENT, ON THE CHANCE THAT OTHER PERSONS WOULD +JOIN THE PARTY, GAVE HIM A FALSE CONFIDENCE. HE AFTERWARD ADMITTED THAT +IDEAS OF A “PINCH” AT THAT TIME WERE FAR FROM HIS MIND. + +WHEN A CRIMINAL THOUGHT TO BE DANGEROUS IS TO BE ARRESTED IN A CROWDED +PLACE LIKE THE GRAND CENTRAL STATION, POLICE OFFICERS OPERATE BY METHODS +THAT PREVENT A STRUGGLE. AS TWO DETECTIVES CLOSED IN ON THE PARTY, +KINSMAN WATCHED ONE OF THEM OUT OF THE CORNER OF HIS EYE. WHILE A WAITER +AT THE “NUTSHELL CAFé” HE HAD OFTEN THROWN OBJECTIONABLE GUESTS OUT ONTO +THE SIDEWALK. HE NOW FANCIED THAT ONE OF THE DETECTIVES RESEMBLED A MAN +HE HAD ONCE “BOUNCED,” AND WAS READY TO FIGHT IF ATTACKED. + +“I WAS JUST FOLDING IT UP,” HE SAID, REFERRING TO HIS FIST, “AND GETTING +READY TO LAND ON HIM WHEN ONE HAD ME FROM BEHIND AND THE OTHER IN FRONT. +THEN I KNEW THEY WERE COPS.” + +ANNIE WAS GORGEOUSLY DRESSED IN A NEW BLUE SUIT AND FINE FUR COAT, +BOUGHT OUT OF THE TAXICAB MONEY. THE UNKNOWN MAN PROVED TO BE KINSMAN’S +BROTHER, WHO HAD COME DOWN FROM BOSTON WITH HIM. KINSMAN HAD VISITED HIS +NATIVE CITY BEFORE RETURNING TO NEW YORK, BUT HAD ESCAPED THE POLICE NET +THERE BY STOPPING AT A HOTEL AND SENDING FOR HIS BROTHER. HE SENT A GRIP +HOME BY THIS BROTHER, AND IT WAS AFTERWARD FOUND TO CONTAIN THREE +PACKAGES OF BILLS OF $250 EACH IN THE ORIGINAL WRAPPERS OF THE BANK. + +AS SOON AS WORD OF THESE ARRESTS WAS TELEPHONED TO POLICE HEADQUARTERS, +THE OTHER TRAPS WERE SPRUNG. DETECTIVES BROUGHT IN MONTANI, JESS +ALBRAZZO AND MYRTLE HORN, THE LATTER, WITH ANNIE, BEING HELD AS +WITNESSES. + +------------------------------------------------------------------------ + + + + + CHAPTER III + HOW THE CRIME WAS HANDLED BY THE POLICE—THE CONFESSIONS + + +NOW BEGINS SOME OF THE MOST INTERESTING WORK CONNECTED WITH THE TAXICAB +CASE—THE EXAMINATION OF THE FIRST PRISONERS, WHICH LED TO CONFESSIONS, +THE IMPLICATION OF OTHER GUILTY PERSONS NOT YET UNDER ARREST, AND THE +VOLUNTARY PLEAS OF GUILTY IN COURT WHICH SAVED COSTLY TRIALS IN ALL BUT +MONTANI’S CASE. + +THIS SORT OF WORK IS FAMILIAR UNDER THE TERM OF “THIRD DEGREE.” IT IS +POPULARLY SUPPOSED TO BE ACCOMPANIED BY FORCE AND SOMETIMES +BRUTALITY—AND IN WRONG HANDS OFTEN IS. COMMISSIONER DOUGHERTY’S +EXPERIENCE WITH A COMMERCIAL DETECTIVE AGENCY, HOWEVER, HAS LED HIM TO +DEVELOP INTELLIGENT METHODS. THE COMMERCIAL DETECTIVE ORGANIZATION HAS +NONE OF THE AUTHORITY OF AN OFFICIAL POLICE FORCE, AND AT THE SAME TIME, +THROUGH ITS NATIONAL OPERATIONS AND THE GENERAL CHARACTER OF ITS WORK, +DEALS CHIEFLY WITH THE MOST ACCOMPLISHED CRIMINALS. THEREFORE, TACT AND +LEGAL SUBTILTY ARE DEPENDED UPON IN EXAMINING SUSPECTS, AND THE +COMMISSIONER LONG AGO LEARNED TO GET HIS RESULTS MAINLY BY STRAIGHT +QUESTION AND ANSWER. HE PUTS HIS OWN WITS AGAINST THOSE OF THE SUSPECT, +BACKED BY EXPERIENCE IN MANY OTHER CASES. HE HAS A PRACTICAL GRASP OF +CRIMINAL PSYCHOLOGY, AS WELL AS MANY INGENIOUS WAYS OF USING EVIDENCE TO +THE BEST PURPOSE, OVERWHELMING THE SUSPECT, AND BREAKING DOWN STOLIDITY +AND DECEPTION. DOUGHERTY IS NOT ONLY OPPOSED TO FORCE IN THE “THIRD +DEGREE,” BUT KNOWS THAT IT IS OF ABSOLUTELY NO USE. + +THE FIRST PRISONER EXAMINED WAS EDDIE KINSMAN. + +WHEN HE WAS BROUGHT TO POLICE HEADQUARTERS KINSMAN APPEARED TO BE +THOROUGHLY SATISFIED WITH HIMSELF, AND CONFIDENT THAT NO POLICEMAN WOULD +GET ANYTHING OUT OF _HIM_. HE PROVED TO BE A GOOD-LOOKING YOUNG FELLOW, +OF ATHLETIC BUILD, AND BY NO MEANS A FOOL. + +METHODS OF EXAMINATION ARE NEVER TWICE ALIKE, FOR THEY DEPEND UPON THE +CASE AND THE SUSPECT. AS A RULE, HOWEVER, WHEN THE CRIMINAL FIRST SITS +DOWN TO ANSWER COMMISSIONER DOUGHERTY HE IS ASTONISHED BY THAT +GENTLEMAN’S APPARENT LACK OF GUILE, AND IGNORANCE OF WORLDLY KNOWLEDGE. +WHEN DOUGHERTY COMPOSES HIMSELF FOR AN INQUIRY, HE IS RATHER A +HEAVY-LOOKING CITIZEN, NOT UNLIKE A COUNTRY MAGISTRATE, AND HIS FIRST +QUESTIONS, PUT FOR THE PURPOSE OF DETERMINING THE SUSPECT’S CHARACTER +AND PREVIOUS SURROUNDINGS, USUALLY RELATE TO BALD ROUTINE MATTERS, SUCH +AS NAME, AGE, RESIDENCE, EDUCATION, FAMILY, AND SO ON. + +“GEE!” THINKS THE SUSPECT, “THIS GUY IS THE BIGGEST LOBSTER I EVER GOT +UP AGAINST! I WONDER HOW HE EVER GOT TO BE A POLICE COMMISSIONER. HE +MUST HAVE A STRONG POLITICAL PULL.” + +KINSMAN WAS USHERED INTO A LARGE, QUIET OFFICE, WHERE THIS BUREAUCRATIC +OFFICIAL BEGAN BY ASKING HIS NAME, BIRTHPLACE AND OTHER DETAILS. + +“WILL YOU KINDLY STAND UP A MINUTE WHILE I GET YOUR HEIGHT?” ASKED THE +QUESTIONER, AND KINSMAN DID SO IN A PATRONIZING WAY. THEN THE +DULL-LOOKING GENTLEMAN TURNED BACK KINSMAN’S COAT AND LOOKED AT THE +LITTLE LABEL SEWED IN THE INSIDE POCKET. + +“I SEE THAT YOU HAVE BEEN IN CHICAGO RECENTLY,” HE OBSERVED. “THIS SUIT +WAS MADE BY A TAILOR THERE. YOU ORDERED IT FEBRUARY 17TH, TWO DAYS AFTER +THE ROBBERY.” + +HE LOOKED INTO KINSMAN’S HAT. + +“THAT WAS BOUGHT IN CHICAGO, TOO.” + +HE EXAMINED THE LABEL ON KINSMAN’S TIE. + +“THIS WAS ALSO BOUGHT IN CHICAGO.” + +HE TURNED UP THE LABEL AT THE BACK OF THE NECK OF THE NEW SILK +UNDERCLOTHES WORN BY THE PRISONER. + +“THOSE WERE BOUGHT IN STATE STREET, CHICAGO, AND FROM A VERY GOOD STORE, +TOO—I KNOW IT WELL.” + +KINSMAN NOW BEGAN TO BE PUGNACIOUS AND DEFIANT. + +“SEE HERE!” HE SAID, “YOU MUST TAKE ME FOR A BOOB.” + +“YES, I THINK YOU ARE A BOOB,” REPLIED THE COMMISSIONER. “YOU MIGHT AS +WELL HAVE MADE YOUR GETAWAY WITH A BRASS BAND AS TO TAKE SWEDE ANNIE +WITH YOU TO ALBANY, ATTRACTING ATTENTION ALL THE WAY, AND THEN SEND HER +BACK TO NEW YORK WITH A HUNDRED DOLLARS TO TELL THE POLICE WHERE YOU HAD +GONE.” + +SUDDENLY LIEUTENANT RILEY, PERSONAL AIDE, WALKED INTO THE COMMISSIONER’S +OFFICE CARRYING A CHEAP ARTICLE OF MILLINERY—A SHABBY BLACK VELVET HAT +WITH A ROW OF LITTLE RED ROSES ACROSS THE FRONT. COMMISSIONER DOUGHERTY +APPARENTLY GREW VERY ANGRY. + +“WHAT DO YOU MEAN BY BRINGING THAT THING IN HERE NOW?” HE EXCLAIMED. “I +AM NOT READY FOR THAT—TAKE IT AWAY.” + +THIS “SHOT” HAD BEEN PREVIOUSLY ARRANGED, OF COURSE, BUT RILEY PRETENDED +TO BE INJURED WHEN CALLED BY HIS SUPERIOR. + +“CRIPES!” EXCLAIMED KINSMAN. “ANNIE’S OLD HAT. HOW DID YOU GET THAT SO +QUICK?” + +“OH, THAT IS ONLY ONE THING WE’VE GOT ON YOU,” REPLIED THE COMMISSIONER. +“WE KNOW THAT YOU WENT TO PEEKSKILL IN A TAXICAB WITH ANNIE AND SPLAINE +ON THE AFTERNOON OF THE ROBBERY. WE KNOW THAT YOU TOOK TRAIN 13 TO +ALBANY, AND WHERE YOU STOPPED THAT NIGHT, AND WHERE YOU BOUGHT ANNIE’S +NEW HAT, AND HOW MUCH YOU PAID FOR IT, AND WHAT TRAIN YOU TOOK TO +CHICAGO FRIDAY NOON. SUPPOSE YOU TELL ME SOMETHING MORE ABOUT YOUR +MOVEMENTS?” + +KINSMAN BECAME SCORNFUL. + +“IF YOU KNOW ALL THAT,” HE SAID, “MAYBE YOU KNOW MORE ABOUT WHERE I WENT +AND WHAT I DID THAN I DO MYSELF. SO WHAT WOULD BE THE USE OF ME TELLING +_YOU_ ANYTHING?” + +WHILE CERTAIN PEOPLE WERE BEING FOUND OUTSIDE, THE COMMISSIONER WORKED +UPON THE PRISONER ALONG ANOTHER LINE. ENOUGH OF KINSMAN’S PERSONALITY +WAS NOW DISCLOSED TO SHOW THAT HE WAS VAIN AND EGOTISTICAL. THIS SIDE OF +HIS NATURE WAS THEREFORE FED WITH FLATTERY. HE WAS ASSURED THAT THE +TAXICAB ROBBERY HAD BEEN A WONDERFUL “STICK-UP.” EVERYBODY IN NEW YORK +HAD BEEN ASTONISHED. THE WHOLE COUNTRY WAS TALKING ABOUT IT, AND ABOUT +HIM. HE MUST BE AN AWFULLY BRIGHT, CUNNING FELLOW TO HAVE PLANNED AND +CARRIED OUT SUCH A PIECE OF CRIME. + +KINSMAN WARMED UP GENIALLY UNDER THIS ADMIRATION, AND SEEMED TO BE MORE +CONFIDENT THAN EVER THAT SO SHREWD A YOUNG MAN AS HIMSELF WOULD HAVE +LITTLE DIFFICULTY IN FOOLING THE POLICE. + +BUT PRESENTLY SELF-SATISFACTION WAS SUBJECTED TO SHOCK AFTER SHOCK. + +DETECTIVES WERE BRINGING IN MONTANI, MYRTLE HOYT, ROSE LEVY, MRS. +SULLIVAN, THE LANDLADY WITH WHOM KINSMAN HAD LIVED, AND HER HOUSEKEEPER. +JESS ALBRAZZO WAS UNDER ARREST. KINSMAN’S BROTHER WAS THERE FOR +EXAMINATION, AND INSPECTOR HUGHES AND LIEUTENANT RILEY WERE BRINGING IN +STARTLING INTELLIGENCE EVERY FEW MINUTES. + +THE HOUSEKEEPER WAS USHERED IN, AND TOLD HOW KINSMAN HAD GIVEN HER FIVE +DOLLARS FROM A HUGE ROLL OF BILLS BEFORE LEAVING FOR PEEKSKILL. + +COMMISSIONER WALDO CAME IN AND SAT WHILE MRS. SULLIVAN TOLD WHAT SHE +KNEW ABOUT HER LATE LODGER. + +KINSMAN’S BROTHER GAVE INFORMATION ABOUT THE FORMER’S MOVEMENTS FROM THE +TIME HE HAD ARRIVED IN BOSTON UNTIL HE BROUGHT HIM TO NEW YORK TO HAVE A +GOOD TIME, AND KINSMAN KNEW THAT AT THE HOME OF HIS PARENTS IN BOSTON +THE POLICE WOULD SURELY FIND MONEY IN THE ORIGINAL WRAPPERS OF THE BANK. + +THE PRISONER WAS PUT UNDER PRESSURE TO EXPLAIN HOW A MAN LIKE HIMSELF, +KNOWN TO BE WORKING AS A WAITER IN A CHEAP RESORT, COULD SUDDENLY HAVE +COME INTO POSSESSION OF SUCH SUMS. STATEMENTS FROM THE WOMEN IN THE CASE +HAD BEEN SECURED, AND WERE PRODUCED, AND FINALLY KINSMAN WAS BROUGHT TO +DETAILED ADMISSIONS, ONE BY ONE. HE AGREED THAT IT WAS TRUE HE HAD GONE +TO PEEKSKILL IN A TAXICAB WITH ANNIE AND SPLAINE, THAT HE HAD GONE TO +ALBANY, HAD BOUGHT ANNIE A HAT THERE, HAD GONE TO CHICAGO, AND SO FORTH. +OPPORTUNITIES WERE GIVEN HIM TO SEE MONTANI AND JESS, UNDER ARREST. +NOTHING BUT THE TRUTH WAS TOLD HIM, YET BY DEGREES HE WAS LED TO SEE +HIMSELF SURROUNDED ON ALL SIDES BY EVIDENCE AND CONFESSING ACCOMPLICES. +AT LAST HE BROKE DOWN COMPLETELY, HIS VAIN SELF-CONFIDENCE DESTROYED, +AND MADE A DETAILED CONFESSION. + +KINSMAN’S STORY BROUGHT UP FRESH CIRCUMSTANCES AND NEW ACTORS IN THE +TAXICAB CASE. + +HE TOLD HOW HE HAD COME TO NEW YORK NINE MONTHS BEFORE, TO HAVE A GOOD +TIME AND MAKE MONEY, AND HOW, AFTER GOING PENNILESS AND HUNGRY, AND +GETTING A FEW DOLLARS FOR TAKING PART IN A BOXING MATCH, HE HAD BECOME A +WAITER AT THE “NUTSHELL CAFé.” THERE HE SOON MADE THE ACQUAINTANCE OF +CRIMINALS, MEETING GENE SPLAINE, “DUTCH” KELLER, “JOE THE KID,” “SCOTTY +THE LAMB” AND OTHER CHARACTERS WHO WERE AFTERWARD TO ASSIST IN THE TAXI +ROBBERY. THERE HE ALSO MET “SWEDE ANNIE” AND BECAME HER SWEETHEART, AND +FINALLY, JESS ALBRAZZO, A DARK LITTLE ITALIAN WHO SEEMED TO EXERT MARKED +INFLUENCE OVER ALL THE OTHERS. IT WAS FROM JESS THAT KINSMAN FIRST HEARD +ABOUT THE PLAN TO ROB A TAXICAB CARRYING MONEY TO A BANK. THIS “SWELL +JOB” WAS DISCUSSED, AND JESS TOLD HIM HE HAD A FRIEND NAMED MONTANI WHO +CARRIED THE BANK’S CASH, AND WOULD COOPERATE IN STEALING IT. THE JOB +WOULD BE EASY, BECAUSE MONTANI WOULD RUN THE CAB THROUGH A SIDE STREET, +AND THE ONLY GUARD WAS AN OLD MAN AND A BOY, NEITHER OF THEM ARMED. + +ONE SUNDAY NIGHT, TWO WEEKS BEFORE THE CRIME, JESS TOOK KINSMAN AND +OTHER ACCOMPLICES OVER THE ROUTE, AFTER ALL HAD DRUNK THEMSELVES INTO +OPTIMISTIC MOOD, AND POINTED OUT THE BANK FROM WHICH THE MONEY WAS +DRAWN, THE STREETS THROUGH WHICH MONTANI WOULD RUN, THE PLACE WHERE THE +GANG COULD BOARD THE CAB, AND THE POINT AT WHICH THEY COULD LEAVE IT AND +ESCAPE UPTOWN. DETAILS WERE DISCUSSED. THERE WAS A DIFFERENCE OF OPINION +AS TO METHODS, AND THE PLOTTERS PARTED THAT NIGHT WITH THE UNDERSTANDING +THAT EACH WOULD SUBMIT HIS OWN IDEAS OF HOW THE ROBBERY COULD BE MOST +EFFECTIVELY AND SAFELY CARRIED OUT. EVENTUALLY THERE WAS A DEFINITE +AGREEMENT AS TO BOARDING THE CAB, PREVENTING AN OUTCRY, MAKING THE +GETAWAY AND SPLITTING UP THE MONEY. + +ACCORDING TO MONTANI’S INFORMATION, THE BANK MESSENGERS USUALLY CARRIED +BETWEEN $75,000 AND $100,000. WHEN THE DAY FOR THE ROBBERY HAD BEEN SET, +WORD SUDDENLY CAME THAT THERE WOULD NOT BE SO LARGE A SUM. THIS WAS +DISAPPOINTING, BUT THE GANG DECIDED TO PUT THEIR PROJECT THROUGH, +NEVERTHELESS. KINSMAN WAS BUSY AT THE CAFé, WHERE HE WORKED UNTIL FOUR +O’CLOCK ON THE MORNING OF FEBRUARY 15, AND “DUTCH” CALLED FOR HIM +SEVERAL TIMES, ASKING IF HE WAS GOING TO “LAY DOWN ON THE JOB.” FINALLY +KINSMAN GOT AWAY, WENT TO A ROOM IN A LODGING HOUSE TAKEN BY “DUTCH,” +AND FOUND THE GANG ALL THERE SMOKING AND DRINKING. AT FIVE O’CLOCK THEY +ALL WENT TO SLEEP. AT EIGHT EVERYBODY WAS AWAKENED. “DUTCH” AND SPLAINE +TOOK BLACKJACKS, AND OFFERED KINSMAN A REVOLVER, WHICH HE REFUSED, +SAYING HE COULD TAKE CARE OF HIMSELF WITH HIS HANDS, BEING A BOXER. +THERE WERE SIX IN THE PARTY—KINSMAN, “DUTCH,” SPLAINE, “JOE THE KID,” +JESS AND “SCOTTY THE LAMB,” WHOSE PART WAS TO STUMBLE IN FRONT OF +MONTANI’S CAB AT THE PLACE SELECTED FOR THE BOARDING, AND THUS GIVE THE +CHAUFFEUR A COLORABLE REASON FOR SLACKENING SPEED IF EYE-WITNESSES +AFTERWARD CALLED HIS HONESTY INTO QUESTION. THE GANG HAD BREAKFAST IN A +CHEAP RESTAURANT, STOPPED FOR A DRINK AT THE SALOON OF “JIMMIE THE PUSH” +IN THOMPSON STREET, WHERE THE BOOTY WAS TO BE DIVIDED, AND PROCEEDED +DOWNTOWN, AFTER PARTING WITH JESS. THE LATTER WAS THE ORGANIZER, AND +TOOK NO PART IN THE ROBBERY; AS HE EXPLAINED, HE WAS KNOWN AS A FRIEND +OF MONTANI’S, AND WANTED TO ARRANGE SO THAT HE COULD PROVE AN ALIBI IF +SUSPECTED, PROVING THAT HE HAD NOT BEEN NEAR THE SCENE OF THE CRIME WHEN +IT WAS COMMITTED. + +------------------------------------------------------------------------ + +[ILLUSTRATION: “SCOTTY” RECEIVES FINAL INSTRUCTIONS] + +------------------------------------------------------------------------ + +AT THAT SALOON THEY HAD MET A TRIO OF ITALIAN CRIMINALS KNOWN AS THE +“THREE BRIGANDS,” WHO SAID THEY WERE NOT TO TAKE PART IN THE ROBBERY, +BUT WOULD BE ON HAND TO SEE THAT IT WAS VIGOROUSLY PUT THROUGH. + +ARRIVED UPON THE GROUND, AT CHURCH STREET AND TRINITY PLACE, SPLAINE AND +KINSMAN WAITED ON THE WEST SIDE OF THE THOROUGHFARE, WHILE “DUTCH” AND +“JOE THE KID” STOOD ON THE OPPOSITE SIDE. “SCOTTY THE LAMB” POSTED +HIMSELF FIFTY FEET OFF. + +AS MONTANI’S CAB CAME SPEEDING ALONG, “DUTCH” RAISED HIS HAT AS A +SIGNAL. “SCOTTY THE LAMB” DID NOT HAVE TIME TO STEP IN FRONT OF THE +VEHICLE BEFORE IT SLACKENED, AND THE ROBBERS WERE ABOARD. “DUTCH” OPENED +ONE DOOR AND STRUCK THE OLD BANK TELLER, WILBUR SMITH, AND “JOE THE KID” +BOOSTED SPLAINE IN ON THE OTHER SIDE, WHERE HE ASSAULTED YOUNG WARDLE. +KINSMAN MOUNTED THE SEAT BESIDE MONTANI, AND THE LATTER PUT ON FULL +SPEED, TELLING KINSMAN TO POINT HIS FINGER AT HIS SIDE AS THOUGH HE HAD +A REVOLVER. THE CAB SLIPPED PAST TRUCKS AND DODGED PEDESTRIANS. KINSMAN +SAID HE SEEMED TO SEE POLICEMEN EVERYWHERE, AND WAS DAZED WHEN THE +VEHICLE STOPPED AT PARK PLACE AND CHURCH STREET. ALL THE CRIMINALS GOT +OFF THERE, “DUTCH” LUGGING THE BROWN BAG CONTAINING THE MONEY. SPLAINE +AND “DUTCH” WERE BOTH COVERED WITH THE BANK GUARDS’ BLOOD. TAKING +KINSMAN, THEY JUMPED ABOARD A STREET CAR. IT WAS CROWDED. SEVERAL +PASSENGERS NOTICED THE BLOODY MEN, BUT WERE TOLD THAT THERE HAD BEEN A +FIGHT, AND THE OCCURRENCE WAS NOT REPORTED TO THE POLICE. AFTER RIDING +TWO OR THREE BLOCKS THEY GOT OFF, BOARDED AN ELEVATED TRAIN, RODE TO +BLEEKER STREET, AND WENT TO A BACK ROOM IN “JIMMIE THE PUSH’S” SALOON, +WHERE THE MONEY WAS TO BE DIVIDED. HERE THEY FOUND JESS AND THE “THREE +BRIGANDS,” AND THE LATTER NOW SET UP A CLAIM FOR A SHARE IN THE BOOTY. +MATTEO, LEADER OF THE TRIO, PULLED OUT A REVOLVER, AND THERE WAS A +DISCUSSION. FINALLY THE BAG WAS OPENED, AND FOUND TO CONTAIN $25,000. +THERE WERE THREE PACKAGES OF $5,000 EACH AND ONE OF $10,000. MATTEO +GRABBED THE LATTER PACKAGE, SAYING THAT HIS GANG WAS TO GET $3,000 +APIECE, AND THAT THE ODD $1,000 WOULD GO FOR “FALL MONEY” TO GET MOLLOY +OUT OF JAIL IN BROOKLYN. THE ROBBERS THEN DIVIDED THE REMAINDER, JESS +TAKING $3,000 FOR HIMSELF AND ANOTHER $3,000 FOR MONTANI, SPLAINE +GETTING $3,000, KINSMAN $2,750, “JOE THE KID” $250 AND “SCOTTY THE LAMB” +NOTHING. KINSMAN THEN TOLD HOW HE HAD CALLED FOR SWEDE ANNIE, AND LEFT +TOWN IN A TAXICAB, GOING AS FAR AS PEEKSKILL, TO AVOID THE POLICE AT THE +GRAND CENTRAL STATION. + + + _JESS CONFESSES AND ASSISTS_ + +THE NEXT PRISONER EXAMINED WAS JESS ALBRAZZO, A DARK LITTLE ITALIAN, WHO +APPEARED TO BE SOMEWHAT IGNORANT. + +IN THIS EXAMINATION THE COMMISSIONER HAD AMPLE OUTSIDE PROOF, AND HE +ALSO EMPLOYED WHAT HE CALLS HIS “PSYCHOLOGICAL STUDY.” YEARS AGO, IN +DEALING WITH NEGRO SUSPECTS IN SOUTHERN CRIME, DOUGHERTY DEVISED A +LITTLE INSTRUMENT WHICH HE DUBBED HIS “LIE WATCH.” THIS WAS A DIAL WITH +A NEEDLE, HUNG ROUND THE SUSPECT’S NECK. IF THE LATTER TOLD THE TRUTH, +THE NEEDLE PRESUMABLY POINTED TO “TRUTH,” AND IF HE DIDN’T, IT POINTED +TO “LIE.” BEING OUT OF THE SUSPECT’S SIGHT, IT HAD A STRONG EFFECT. + +FROM THAT, DOUGHERTY WENT INTO STUDIES OF THE MENTAL STATES OF SUSPECTS +UNDER EXAMINATION, AND FOUND ROUGH PHYSIOLOGICAL INDICATIONS WHICH HE +USES AS A GUIDE TO THE INTEGRITY OF THE SUSPECT. INVESTIGATIONS OF +EUROPEAN CRIMINAL EXPERTS LIKE PROFESSOR HANS GROSS AMPLY DEMONSTRATE +THAT THERE IS A REAL SCIENTIFIC BASIS FOR SUCH METHODS. + +DOUGHERTY TOOK IT A LITTLE EASIER WITH JESS. THEY SAT DOWN, AND THE +COMMISSIONER WENT OVER THE ITALIAN’S MOVEMENTS FOR THE PAST FEW MONTHS, +SHOWING HIM HOW THOROUGHLY HE WAS IMPLICATED. JESS HAD WORKED FOR +MONTANI, AND BEEN INTIMATE WITH THE REST OF THE TAXICAB “MOB.” HE AND +MONTANI WERE CONFRONTED WITH EACH OTHER, AND POINTS BROUGHT OUT IN +KINSMAN’S CONFESSION WERE SKILLFULLY USED. + +AT ONE POINT IN THIS EXAMINATION THE COMMISSIONER ROSE FROM HIS DESK, +TOOK THE LOBE OF JESS’S EAR BETWEEN HIS THUMB AND FINGER, PINCHED IT +SLIGHTLY, LOOKED AT THE EAR CLOSELY, AND THEN WALKED OUT OF THE ROOM. + +JESS WAS ALL ON EDGE WITH CURIOSITY. + +“WHY DID HE PINCH MY EAR?” HE ASKED OF LIEUTENANT RILEY. + +“TO SEE IF YOU ARE TELLING THE TRUTH,” WAS THE ANSWER, AND IN A MOMENT +THE COMMISSIONER CAME BACK AND EXAMINED THAT EAR AGAIN. + +“YES, HE’S LYING,” HE DECLARED. “LOOK AT HIS EAR—CAN’T YOU SEE IT +YOURSELF?” OTHERS WERE INVITED TO LOOK AT JESS’S EAR, AND THE LITTLE +ITALIAN BECAME SO CURIOUS THAT HE ACTUALLY TRIED TO LOOK AROUND THE SIDE +OF HIS SKULL AND SEE HIS OWN EAR! + +THIS PSYCHOLOGICAL STUDY WAS BACKED UP WITH ABUNDANT PROOF THAT JESS HAD +NOT TOLD THE WHOLE TRUTH. PRESENTLY HE WEAKENED AND CONFESSED. HE TOLD +HOW HE HAD HANDED $2,000 IN A COLLAR BOX TO “JIMMIE THE PUSH” ON THE DAY +OF THE ROBBERY, WHICH WAS TO BE TAKEN TO A BOWERY BANK AND PUT IN A +SAFE-DEPOSIT VAULT FOR MONTANI. HE AGREED TO ACCOMPANY THE POLICE TO +JIMMIE’S PLACE IN THOMPSON STREET, AND LATE THAT EVENING A PARTY MADE UP +OF COMMISSIONER DOUGHERTY, INSPECTOR HUGHES AND LIEUTENANT RILEY WENT +THERE, TAKING JESS ALONG. + +“JIMMIE THE PUSH’S” PLACE IS ONE OF THE MOST PICTURESQUE THIEVES’ +RESORTS IN LOWER NEW YORK. + +“TYPICAL OF THE OLD VILLAGE,” AS DOUGHERTY PUTS IT. “IN FACT, THIS WHOLE +CASE HAS A STRONG FLAVOR OF THE LITTLE OLD VILLAGE OF NEW YORK.” + +JIMMIE WAS OUT WHEN THEY GOT THERE, BUT THIS SALOON WAS IN CHARGE OF THE +BIGGEST, SWARTHIEST ITALIAN BARTENDER IN TOWN, A TOUGH HERCULES WEIGHING +SOMEWHERE AROUND THREE HUNDRED POUNDS. THE ROOM WAS CROWDED WITH MOTLEY +CHARACTERS, DRINKING BEVERAGES KNOWN TO THE NEIGHBORHOOD AS “SHOCKS” AND +“HIGH HATS.” FOR THEIR EDIFICATION, A TRAMP MAGICIAN WAS TAKING COINS +OUT OF HIS EARS, HIS NOSE AND THE AIR. + +JESS WAS NOT KNOWN TO BE UNDER ARREST, AND IMMEDIATELY SENT A BOY CALLED +“REDDY” TO FETCH THE PROPRIETOR, WHO HAD KNOWN THE THREE POLICE OFFICERS +FOR YEARS. PRESENTLY REDDY CAME BACK AND SAID THAT JIMMIE WOULD COME IN +ABOUT HALF AN HOUR, AS HE WAS PLAYING CARDS AND HAD A FINE HAND. + +REDDY WAS SENT BACK TO IMPRESS UPON JIMMIE THAT JESS WANTED TO SEE HIM +RIGHT AWAY—IT WAS VERY IMPORTANT. IN ABOUT TWO MINUTES, JUST AS THE +COMMISSIONER HAD BOUGHT A “HIGH HAT” FOR EVERYBODY IN HIS PARTY, JIMMIE +APPEARED. HE WAS TOLD THAT JESS HAD GOT INTO TROUBLE IN CONNECTION WITH +THE TAXICAB ROBBERY, AND ASKED ABOUT THE MONEY IN THE SAFE DEPOSIT +VAULT. “JIMMIE THE PUSH,” WITH HIS PARTNER, BOB DEILIO, HAD BY THIS TIME +BEEN IMPLICATED THEMSELVES, FOR IT WAS CLEAR THAT THE MONEY HAD BEEN +DIVIDED IN THEIR RESORT, AND THAT PROBABLY THEY HAD TAKEN PART IN THE +PLANNING, AND THE DECIDEDLY ONE-SIDED DIVISION OF THE SPOILS. JIMMIE WAS +LED TO BELIEVE THAT HE DID NOT REST UNDER SUSPICION, HOWEVER, AND THAT +HE WAS ONLY ASKED TO AID THE POLICE. HE SAID JESS HAD HANDED HIM A +COLLAR BOX ON THE DAY OF THE ROBBERY, ASKING HIM TO PUT IT IN A VAULT IN +HIS OWN NAME, BUT THAT HE HAD HAD NO IDEA WHAT THE BOX CONTAINED, AND +HAD LEFT IT LYING BEHIND THE BAR FOR A COUPLE OF DAYS BEFORE HE GOT A +CHANCE TO GO TO THE BANK WITH IT. HE READILY PROMISED TO APPEAR AT +POLICE HEADQUARTERS THE FOLLOWING MORNING, BRING THE KEY TO THE SAFE +DEPOSIT BOX, AND HELP RECOVER THE MONEY. THEREUPON THE POLICE OFFICIALS +BADE HIM GOOD NIGHT AND WENT AWAY. BUT NO CHANCES WERE TAKEN ON “JIMMIE +THE PUSH.” FROM THAT MOMENT HE WAS SHADOWED. + +THAT MONDAY WAS A BUSY DAY IN MANY OTHER WAYS. + +DEVELOPMENTS CAME THICK AND FAST. + +KINSMAN’S HOME IN BOSTON WAS VISITED, AND $750 OF THE BANK MONEY +RECOVERED IN THE ORIGINAL WRAPPERS. IT HAD LAID IN HIS GRIP, UNKNOWN TO +THE HONEST KINSMAN FAMILY. + +SWEDE ANNIE, MYRTLE HORN AND A GIRL NAMED ROSE LEVY WERE EXAMINED, +QUICKLY BROKE DOWN, AND MADE TEARFUL STATEMENTS TO BE USED IN EVIDENCE. +THESE WOMEN WERE HELD ONLY AS WITNESSES, AND AS THE CASE CLEARED UP +AFTER A FEW DAYS’ DETENTION, WERE RELEASED. + +THE GIRL, ROSE LEVY, GREATLY ATTRACTED THE COMMISSIONER. SHE WAS ONLY +NINETEEN YEARS OLD, A MILD-MANNERED LITTLE JEWESS WITH JET BLACK HAIR +AND VERY REMARKABLE EYES. THE COMMISSIONER WENT INTO DETAILS OF HER +PERSONAL STORY. IT SEEMS THAT SHE HAD LEFT HER HOME IN BROOKLYN TWO +MONTHS BEFORE, AFTER A QUARREL WITH HER MOTHER, AND HAD COME TO NEW YORK +LOOKING FOR A POSITION. BUT SHE QUICKLY FELL INTO THE LOWER WORLD, +BECAME KNOWN AS JESS’S GIRL, AND WAS AMBITIOUS TO BE “ONE OF THE GANG.” +AFTER A FATHERLY TALK SHE WAS PERSUADED TO RETURN TO HER HOME AND LIVE A +DECENT LIFE. BUT WITHIN A WEEK SHE WAS BACK IN NEW YORK AGAIN, IN HER +OLD HAUNTS, TRYING TO RAISE MONEY TO HELP JESS, FOR WHOM, SHE TOLD THE +COMMISSIONER, SHE WOULD WILLINGLY WORK FOR THE REST OF HER DAYS. + +BEFORE VISITING JIMMIE’S SALOON THE COMMISSIONER CALLED UP THE “ORANGE +GROWERS” IN CHICAGO, HAD A LONG TALK WITH THEM, TOLD WHAT PROGRESS WAS +BEING MADE, AND PUT NEW LIFE INTO THEM. + + + _MORE MONEY RECOVERED_ + +TRUE TO HIS WORD, “JIMMIE THE PUSH” WALKED INTO POLICE HEADQUARTERS AT +NINE O’CLOCK TUESDAY MORNING, FEBRUARY 27, CLOSELY FOLLOWED BY HIS +UNSEEN SHADOWERS. HE PRODUCED THE KEY OF THE SAFE-DEPOSIT VAULT, AND +WENT WITH OFFICERS TO SEE THE MONEY RECOVERED. THERE WAS $2,000, AS JESS +HAD STATED, STILL IN THE WRAPPERS OF THE BANK. JIMMIE WAS STILL +PERMITTED TO GO FREE, UNDER THE IMPRESSION THAT HE HAD COME THROUGH THE +ORDEAL “CLEAN,” WHILE FRESH EVIDENCE WAS BEING OBTAINED AGAINST HIM. + +THAT MORNING THE COMMISSIONER ALSO TOOK KINSMAN DOWN OVER THE ROUTE OF +THE ROBBERY, TO HAVE HIM EXPLAIN IT IN HIS OWN WAY. THIS WAS DONE TO +STRENGTHEN THE CASE AGAINST MONTANI, AND UPSET HIS STORY IN COURT. + +THEN “SCOTTY THE LAMB” WAS LOCATED, ARRESTED, BROUGHT TO HEADQUARTERS +AND LED TO CONFESS. “SCOTTY THE LAMB” WAS IN SOME RESPECTS A PATHETIC +FIGURE IN THE CASE, AND ALSO A HUMOROUS ONE. HE HAD BEEN IN CHARGE OF +THE LUNCH KITCHEN AT THE ARCH CAFé WHEN JESS OWNED IT, AND LATER WORKED +AS A DISHWASHER IN A WASHINGTON SQUARE HOTEL. A SCOTCH YOUTH, FROM +GLASGOW, HE HAD BEEN IN THIS COUNTRY ABOUT FOUR YEARS, AND WHILE NO +CRIMINAL RECORD APPEARED AGAINST HIM, HE WAS PLAINLY IN THE COMPANY OF +THIEVES MOST OF THE TIME. ACCORDING TO HIS STATEMENT, HE HAD BEEN +PROMISED $25 FOR DOING SOME WORK FOR JESS, AND WITHOUT INQUIRING INTO +THE NATURE OF IT AT ALL, HAD SHOWN UP WITH THE GANG AND GONE ALONG TO DO +HIS MINOR PART OF A “STALL,” STUMBLING IN FRONT OF THE CAB. BUT BEFORE +HE COULD GET OUT INTO THE STREET, THE CAB HAD BEEN BOARDED. SO POOR +“SCOTTY THE LAMB,” WITHOUT A NICKEL FOR CARFARE, PLODDED ALL THE WAY +UPTOWN AGAIN TO THE SALOON WHERE THE MONEY WAS TO BE DIVIDED, AND GOT +NOTHING WHATEVER. HE WAS A CHEERFUL SOUL, HOWEVER, AND THE LIFE OF THE +PARTY WHEN THE GANG WAS LOCKED UP, CRACKING JOKES, AND TAKING THE VIEW +THAT, AS SENTENCES OUGHT TO BE PROPORTIONED TO THE AMOUNT OF MONEY EACH +MEMBER OF THE GANG HAD GOT IN THE DIVISION, AND HE HAD GOT NOTHING, HE +MIGHT BE LET OFF WITH SIX MONTHS’ IMPRISONMENT. + +“SCOTTY, HAVEN’T YOU GOT ANY OVERCOAT?” ASKED INSPECTOR HUGHES, +SYMPATHETICALLY, AS THEY WERE GOING TO COURT ONE BRISK MORNING. “DID YOU +_EVER_ HAVE AN OVERCOAT, SCOTTY?” + +“NO, SIR, I NEVER HAD AN OVERCOAT,” REPLIED SCOTTY, AND THEN AS HE +THOUGHT OF HIS PROSPECTS FOR GOING TO PRISON, ADDED DROLLY, “AND NOW I +DON’T EXPECT, SIR, THAT I EVER WILL!” + + + _THE FINE ITALIAN HAND_ + +THE NEXT STEP IN THE CASE WAS THAT OF ARRESTING “JIMMIE THE PUSH” AND +HIS PARTNER, BOB DEILIO. + +ANOTHER PHASE OF THE ROBBERY NOW BEGAN TO COME OUT PLAINLY. + +UP TO THE PRESENT TIME THE MAIN BURDEN OF PROOF POINTED TO THE FOUR +“HOLD-UP” MEN OF AMERICAN BIRTH AS THE CHIEF ACTORS IN THE CRIME. +MONTANI AND JESS, THE TWO ITALIANS, APPEARED TO BE ACCESSORIES. + +BUT AS THE TANGLED THREADS WERE UNRAVELLED, ONE BY ONE, IT WAS FOUND +THAT THE ITALIANS INVOLVED OUTNUMBERED THE AMERICAN THUGS, AND THAT +FURTHERMORE THEY HAD OUTWITTED THEM. + +WHEN BOB DEILIO WAS ARRESTED HE DREW $215 IN FIVE-DOLLAR BILLS OUT OF +HIS POCKET AND HANDED IT TO THE POLICE, ADMITTING THAT IT WAS PART OF +$5,500 OF THE STOLEN MONEY. THE REST, HE ASSERTED, HAD JUST BEEN PAID +FOR RENT OF THE TWO RESORTS OPERATED BY “JIMMIE THE PUSH” AND HIMSELF. + +JIMMIE AND BOB WERE TAKEN TO POLICE HEADQUARTERS AND EXAMINED, WITH JESS +PRESENT. COMMISSIONER DOUGHERTY PLAYED ONE AGAINST THE OTHER SO +SKILLFULLY, WITH CROSS-QUESTIONS AND COUNTER PRESSURE, THAT IN A LITTLE +WHILE EACH WAS EXCITEDLY TELLING TALES ON HIS TWO COMPANIONS WITH THE +DESPERATE HOPE OF CLEARING HIMSELF, AND DENUNCIATIONS FLEW BACK AND +FORTH AMONG THE TRIO AS EVIDENCE CAME OUT THAT WAS LIKELY TO SEND THEM +ALL TO PRISON. THEIR CONFESSIONS WERE OBTAINED, AND USED IN A NEW EFFORT +TO BREAK DOWN MONTANI. BUT THIS WAS WITHOUT RESULTS. THE LITTLE ITALIAN +CHAUFFEUR STILL STUCK DOGGEDLY TO HIS ORIGINAL STORY. + +FROM THESE NEW CONFESSIONS IT APPEARED THAT THE ITALIANS HAD PLANNED THE +CRIME, ENLISTED THE AMERICAN HOLD-UP MEN TO CARRY OUT THE DIRTY WORK, +AND LAID A COUNTER-PLOT FOR HOLDING THEM UP IN TURN WHEN THE MONEY WAS +DIVIDED. THE “THREE BRIGANDS” WERE OSTENSIBLY OFFERED A CHANCE TO TAKE +PART IN THE ACTUAL ROBBERY, BUT REFUSED ON THE PLEA THAT IT WOULD BE TOO +RISKY, AND THAT THEY DID NOT BELIEVE MONTANI COULD CARRY IT OUT +SUCCESSFULLY. ON THE MORNING OF THE CRIME THEY WALKED NORTH OVER THE +ROUTE. WHEN THEY MET THE TAXICAB COMING SOUTH, WITH A POLICEMAN ON THE +SEAT BESIDE MONTANI AND TWO UNCONSCIOUS BANK MESSENGERS INSIDE, THEY +KNEW THAT THE PROJECT HAD SUCCEEDED. SO THE “THREE BRIGANDS” HURRIED +UPTOWN TO “JIMMIE THE PUSH’S” SALOON. THEY GOT THERE SO QUICKLY THAT +THEY WERE AHEAD OF THE ROBBERS. JESS MADE A REHEARSED PROTEST WHEN THEY +INSISTED IN SHARING IN THE PLUNDER, BUT THE “THREE BRIGANDS” DREW +REVOLVERS, THREATENED TO MAKE A DISTURBANCE THAT WOULD BRING IN THE +POLICE, AND FINALLY HELPED THEMSELVES TO $10,000. WHEN THE THUGS WHO HAD +DONE THE ACTUAL WORK LEFT THE SALOON, THEY HAD ONLY $8,000 ALL TOLD. THE +ITALIANS, WHO HAD “PLAYED SAFE” AT EVERY POINT, HAD $17,000. + +------------------------------------------------------------------------ + +[ILLUSTRATION: “THE BRIGANDS” “STICK-UP” THE HOLD-UP MEN FOR THEIRS] + +------------------------------------------------------------------------ + + + _ONE OF THE BRIGANDS COMES IN_ + +THE ACTUAL WHEREABOUTS OF THE “THREE BRIGANDS” WAS NOT KNOWN TO THE +POLICE THEN. BUT THERE WERE CERTAIN CHANNELS THROUGH WHICH NEWS MIGHT +REACH AT LEAST ONE OF THEM. WORD WAS SENT THROUGH THOSE CHANNELS, +THEREFORE, THAT IT MIGHT BE BEST FOR THEM TO APPEAR AND GIVE AN ACCOUNT +OF THEMSELVES, AND ON FRIDAY, MARCH 1, JUST AT THE TIME SPLAINE HAD BEEN +BROUGHT BACK FROM MEMPHIS, THE LITTLE LEADER OF THE BRIGANDS, MATTEO +ARBRANO, AN UNDERSIZED ITALIAN WEARING SPECTACLES, WHO HAD CARRIED OUT +THE JOB OF ROBBING THE HOLD-UP MEN, SURRENDERED HIMSELF TO THE DISTRICT +ATTORNEY. + +ARBRANO SAID THAT HE HAD DIVIDED HIS $10,000 WITH HIS TWO COMPANIONS, +GONZALES AND CAVAQUERO, AND IMMEDIATELY LEFT NEW YORK, TAKING A STEAMER +FOR MEXICO BY WAY OF HAVANA. AT THE LATTER CITY HE STOPPED OVER NIGHT, +MET A WOMAN AND ACCOMPANIED HER TO A RESORT, WAS DRUGGED AND ROBBED OF +$2,700, AND WOKE ON THE PRADO WITH ONLY $100 LEFT, A SINGLE BILL THAT +HAD BEEN CONCEALED IN HIS SHOE. WITH THAT HE RETURNED TO NEW YORK. THE +STORY IS REGARDED BY THE POLICE AS MORE PICTURESQUE THAN CONVINCING. IT +IS PROBABLE THAT MATTEO’S SHARE OF THE PLUNDER, WITH THAT OF OTHER +ITALIANS INVOLVED, HAS BEEN CAREFULLY “PLANTED.” + +PAULI GONZALES, ANOTHER OF THE BRIGANDS, WAS TRACED TO VERA CRUZ, +MEXICO. IN THE PRESENT STATE OF THAT COUNTRY, HOWEVER, IT WAS FOUND +IMPOSSIBLE TO ARREST AND EXTRADITE HIM UPON THE EVIDENCE AT HAND. + +THREE OTHER PERSONS CONCERNED IN THE ROBBERY ARE STILL AT LARGE AT THIS +WRITING—“DUTCH” KELLER, “JOE THE KID,” AND AN “UNKNOWN” WHOSE IDENTITY +IS CONCEALED FOR POLICE REASONS. + +MONTANI PLEADED “NOT GUILTY,” AND STOOD TRIAL. AFTER TWO DAYS, EXACTLY A +MONTH AND A DAY SUBSEQUENT TO THE ROBBERY, HE WAS CONVICTED BY A JURY, +AND SENTENCED TO NOT LESS THAN TEN YEARS AND NOT MORE THAN EIGHTEEN +YEARS AND TWO MONTHS IN PRISON, WITH HARD LABOR. + +A WORD MUST BE SAID ABOUT THE PROMPT ACTION OF THE DISTRICT ATTORNEY’S +OFFICE IN THE TAXICAB CASE. WHERE CRIME HAS HAD SUCH PUBLICITY THERE IS +AN OPPORTUNITY TO MAKE A DEMONSTRATION OF GREAT VALUE BY PRESSING THE +PROSECUTIONS. IT WAS NOT LOST. UNDER ASSISTANT CHARLES C. NOTT, JR., +EVIDENCE WAS SUCCINCTLY LAID BEFORE JUDGES AND JURIES, THE TRIALS +FINISHED IN A MATTER OF HOURS, AND CONVICTIONS AND SENTENCES SECURED +WITHIN SIX WEEKS AFTER THE ROBBERY. FURTHERMORE, THE VARIOUS SENTENCES +WERE JUST, BEING CAREFULLY GRADED ACCORDING TO THE PART PLAYED BY EACH +OFFENDER, HIS CHARACTER AND PREVIOUS RECORD, AND HIS INDIVIDUAL EFFORT +IN FACILITATING JUSTICE. + +------------------------------------------------------------------------ + + _NAME_ _ARRESTED_ _PLEADED_ _SENTENCED_ _SENTENCE_ + + MONTANI, GENO FEB. 26,’12 FEB. 29,’12 MCH. 16,’12 NOT LESS THAN + 10 YRS. NOR + MORE THAN 18 + YRS. 2 MOS. + JUDGE + SEABURY. + + KINSMAN, EDW. FEB. 26,’12 MCH. 1,’12 APRIL 9,’12 NOT LESS THAN 3 + YRS. NOR MORE + THAN 6 YRS. + JUDGE CRAIN. + + SPLAINE, EUGENE MCH. 2,’12 MCH. 4,’12 MCH. 25,’12 NOT LESS THAN 7 + YRS. 6 MOS. + NOR MORE THAN + 14 YRS. 6 + MOS. JUDGE + SEABURY. + + DELIO, ROBERT FEB. 28,’12 MCH. 4,’12 MCH. 29,’12 NOT LESS THAN 2 + YRS. 6 MOS. + NOR MORE THAN + 4 YRS. 2 MOS. + JUDGE + SEABURY. + + PASQUALE, JAMES FEB. 28,’12 MCH. 4,’12 APRIL 8,’12 6 MOS. + (“JIMMIE THE PENITENT’RY. + PUSH”) JUDGE DAVIS. + + LAMB, JOSEPH FEB. 27,’12 MCH. 18,’12 MCH. 29,’12 INDETERMINATE + (“SCOTTY THE SENTENCE, + LAMB”) ELMIRA. JUDGE + SEABURY. + + ARBRANO, MATTEO MCH. 2,’12 APRIL 3,’12 2 TO 4 YEARS. + JUDGE DAVIS. + + ALBRAZZO, JESS MCH. 26,’12 MCH. 18,’12 3 TO 6 YEARS. + JUDGE DAVIS. + +------------------------------------------------------------------------ + + + + + FINAL + A WORD ABOUT THE NEW YORK POLICE + + +IT HAS BEEN THE WRITER’S GOOD FORTUNE TO LOOK INTO THE WORK OF BOTH THE +LONDON AND THE NEW YORK POLICEMEN RECENTLY, WITHIN THE SAME YEAR. + +A SOMEWHAT EMBARRASSING POINT AROSE. + +IN LONDON, THE “BOBBY” WAS ANXIOUS TO KNOW WHICH POLICE FORCE THE WRITER +CONSIDERED BEST. THE “BOBBY” GETS HIS IDEAS OF THE NEW YORK “COP” FROM +SUCH ACCOUNTS AS FILTER THROUGH THE CABLE DISPATCHES FROM OUR +NEWSPAPERS. HE HEARS CHIEFLY THE WORST, AND PICTURES THE “COP” AS A +LAWLESS INDIVIDUAL, WIELDING PISTOL AND CLUB INDISCRIMINATELY, WITH WHOM +IT IS NOT SAFE TO PASS A CIVIL WORD. SO, WHEN HE PUTS HIS LITTLE +QUESTION ABOUT THE RESPECTIVE MERITS OF THE TWO ORGANIZATIONS, HE +RESERVES THE RIGHT TO KEEP HIS OPINION THAT THE LONDON FORCE IS BEST +ANYWAY. + +IN NEW YORK, IT IS MUCH THE SAME. THE “COP” HAS HEARD JUST ENOUGH ABOUT +THE “BOBBY” TO REGARD HIM WITH MILD TOLERANCE. HE PICTURES HIM AS A +POLICEMAN SERVILE TO THE LAST DEGREE, THANKFULLY ACCEPTING SIXPENNY TIPS +FROM PEDESTRIANS, AND OCCUPIED CHIEFLY WITH UNARMED THIEVES AND HARMLESS +POLITICAL OFFENDERS. + +WHEN ONE HAS GOOD FRIENDS IN BOTH FORCES, THE QUESTION “WHICH DO YOU +THINK BEST?” IS TO BE MET WITH TACTFUL EVASIONS. AND THE MORE ONE THINKS +IT OVER, THE MORE IT BECOMES CLEAR THAT THERE IS REALLY LITTLE +DIFFERENCE AT BOTTOM. BOTH POLICE ORGANIZATIONS ARE MADE UP OF GOOD MEN, +FOLLOWING THE SAME TRADE ALONG THE SAME LINES, AND DEALING WITH ABOUT +THE SAME GENERAL CONDITIONS. + +THE LONDON “BOBBY,” HOWEVER, ENJOYS EXCELLENT LEADERSHIP, IS GOVERNED BY +A DEFINITE ADMINISTRATIVE POLICY, HAS THE BACKING OF THE COURTS, AND +THEREFORE COMES IN FOR A GENERAL PUBLIC GOOD WILL WHICH IS EXCEEDINGLY +USEFUL TO HIM IN THE PERFORMANCE OF DUTY. + +THE NEW YORK “COP” RATHER LACKS PUBLIC GOOD WILL. ADMINISTRATIVE POLICY +HAS NOT BEEN WELL DEFINED IN THE PAST. THE COURTS DO NOT ALWAYS ACCEPT +HIS EVIDENCE, MUCH LESS BACK HIM UP, AND HE HAS BEEN MADE THE SCAPEGOAT +FOR VARIOUS SHORTCOMINGS IN LEADERSHIP. + +BUT TO-DAY THE NEW YORK POLICEMAN IS WORKING ON AN ENTIRELY NEW BASIS. +BEFORE LONG HIS PUBLIC IS CERTAIN TO UNDERSTAND AND LIKE HIM AS +THOROUGHLY AS LONDON DOES ITS “BOBBY.” + +THE CHANGE BEGAN WITH MAYOR GAYNOR, WHO INSISTED THAT BOTH POLICEMAN AND +CITIZEN HAVE PLAIN LEGAL RIGHTS—UNTIL THE CITIZEN HAS COMMITTED A CRIME +THE POLICEMAN MAY NOT ARREST HIM. THE POLICEMAN HAS PLAIN RIGHTS—THE LAW +EMPOWERS HIM TO USE ALL NECESSARY FORCE IN MAKING ARRESTS IN GRAVE +CASES. BUT FORCE MUST NOT BE USED FOR MINOR OFFENSES. CONFUSION EXISTED +ON THESE POINTS TO SUCH A DEGREE THAT WHEN THE MAYOR BEGAN INSISTING +UPON THEM, MANY PEOPLE THOUGHT HE WAS PUTTING INTO EFFECT SOME OF HIS +PERSONAL WHIMS. BUT THEY ARE ALL IN THE STATUTE BOOKS, AND MANY OF THEM +WERE THERE BEFORE THE MAYOR WAS BORN, BECAUSE THEY ARE CONSTITUTIONAL. + +THE PRESENT POLICE COMMISSIONER, RHINELANDER WALDO, IS NOT ONLY +ADMINISTERING THE DEPARTMENT ALONG THE STRICT LEGAL LINE POINTED OUT BY +THE MAYOR, BUT IS EFFECTING IMPROVEMENTS OF ORGANIZATION AND METHOD THAT +MUST FAVORABLY ALTER THE WHOLE FUTURE OF THE SERVICE. + +COMMISSIONER WALDO IS A SOLDIER, WITH A RECORD OF SERVICE IN THE UNITED +STATES ARMY, AND THE ARMY’S FINE STANDARDS TO GUIDE HIM. + +IN SOME WAYS THE ADMINISTRATION OF THE NEW YORK POLICE DEPARTMENT IS A +SOLDIER’S JOB. IF THE TEN THOUSAND MEMBERS WERE MOBILIZED, THEY WOULD +MAKE QUITE AN IMPRESSIVE LITTLE STANDING ARMY, WITH EIGHT OR TEN FULL +REGIMENTS OF PATROLMEN, A BRIGADE OF CAVALRY, A SMALL TRANSPORT CORPS, A +LITTLE NAVY, AND SO FORTH. AS IN AN ARMY, TOO, THE MEN ARE ENLISTED, AND +MAY ONLY BE DISCHARGED FOR SERIOUS OFFENSES. IT IS A FORCE SCATTERED +OVER THREE HUNDRED SQUARE MILES OF TERRITORY. THE LEADER MUST BE +SKILLFUL IN LAYING DOWN REGULATIONS, AND HANDLING MEN IN THE MASS RATHER +THAN BY PERSONAL CONTACT. HE MUST DEFINE DUTY PLAINLY, HOLD EVERYBODY TO +IT, ELIMINATE DEPARTMENTAL POLITICS AND ABUSES. EVERY MAN, WHEREVER HE +IS STATIONED, MUST FEEL THAT THE GENERAL KNOWS HIS BUSINESS, THAT HE +LAYS DOWN REGULATIONS FOR GOOD REASONS, AND THAT DAY BY DAY HE IS TAKING +THE ORGANIZATION SOMEWHERE. + +FOR YEARS, EVERY POLICE COMMISSIONER HAS ASKED FOR MORE MEN TO KEEP PACE +WITH THE GROWING CITY. WHEN WALDO TOOK CHARGE HE ASKED, TOO. WHILE HE +WAS WAITING, HOWEVER, HE OVERHAULED THE ORGANIZATION AND GOT ONE +THOUSAND ADDITIONAL PATROLMEN BY CUTTING OFF MEN DETAILED FOR CLERICAL +AND OTHER SPECIAL DUTY. EVERY LARGE WORKING FORCE TENDS TO CREATE +SUPERFLUOUS ROUTINE WORK. THE USELESS ROUTINE WAS ELIMINATED BY BETTER +ACCOUNTING METHODS, AND THE MEN SENT BACK TO DO THE STREET DUTY FOR +WHICH THEY ORIGINALLY ENLISTED. + +THEN WALDO’S SYSTEM OF “FIXED POSTS” WAS INTRODUCED. COMPLAINTS THAT +POLICEMEN WERE HARD TO FIND AT NIGHT HAD BECOME COMMON. SO THE PLATOON +ON DUTY FROM 11 P. M. TO 7 A. M. WAS DISTRIBUTED BY A PLAN UNDER WHICH +THE MEN WORK IN PAIRS, ONE PATROLLING A GIVEN BEAT AND THE OTHER +STANDING ON A STREET INTERSECTION. EACH HOUR THEY CHANGE PLACES, OR +OFTENER IN SEVERE WEATHER. THE FIXED POSTS ARE ABOUT A THOUSAND FEET +APART ALL OVER MANHATTAN AND PARTS OF BROOKLYN. THE SYSTEM HAS BEEN +INDISCRIMINATELY CRITICISED, BUT PRODUCES ITS RESULTS. FIRE LOSSES WERE +CUT DOWN THE FIRST SIX MONTHS, NIGHT CRIME HAS DECREASED, AND MANY +NOTABLE ARRESTS ARE DUE TO THE FACT THAT POLICEMEN STAND ALL OVER TOWN +LIKE CHECKERS THROUGH THE NIGHT. THE EXPOSURE IS NO GREATER THAN THAT +ENDURED BY TRAFFIC MEN. THE MEN HAVE BETTER OPPORTUNITIES TO ADVANCE +THEMSELVES BY MAKING MERITORIOUS ARRESTS, AND THE COMMISSIONER KNOWS +THAT, AS CITIZENS SEE THE POLICE ON DUTY, NIGHT AFTER NIGHT, AND CRIME +DECREASES, THERE WILL BE A GROWING GOOD WILL FOR THE DEPARTMENT. + +THE DETECTIVE BUREAU HAS NOT ONLY BEEN REORGANIZED SO THAT PLAIN-CLOTHES +MEN ARE DISTRIBUTED OVER THE WHOLE CITY, BUT A NEW SPIRIT HAS BEEN +INTRODUCED. FORMERLY, WHEN THE PATROLMAN ROSE TO DETECTIVE RANK, HE FELT +THAT HE HAD “ARRIVED.” NO LONGER WEARING THE UNIFORM OR KEEPING +SCHEDULED HOURS, HE WAS IN DANGER OF GOING TO SLEEP. TO-DAY, HOWEVER, +THE DETECTIVE HAS, NOT A JOB, BUT AN OPPORTUNITY. HE MUST MAINTAIN HIS +RANK BY RESULTS, OR BE REDUCED. TO HELP HIM DO THIS, HE IS TAUGHT +METHODS IN THE SCHOOL FOR DETECTIVES. BUT HE KNOWS THAT HUNDREDS OF +AMBITIOUS MEN IN BRASS BUTTONS ARE WORKING TO ATTAIN THAT RANK. + +IN AN ORGANIZATION OF TEN THOUSAND MEN, IT WOULD BE STRANGE IF THERE +WERE NOT SOME INTRIGUING AND POLITICS. NEW YORK POLICEMEN ARE +EXCEPTIONALLY SHREWD, AND OCCASIONALLY THEY WILL TRY TO “PUT ONE OVER” +ON THE COMMISSIONER, GOING AROUND HIS AUTHORITY. BUT COMMISSIONER WALDO +HAS PROVED SINGULARLY RESOURCEFUL. HE MEETS SUCH AN EMERGENCY WITH THE +QUICKNESS, CERTAINTY AND IMPARTIALITY OF A NATURAL FORCE LIKE GRAVITY, +AND THE DEPARTMENT HAS FOUND IT OUT. + +HE HAS LAID OUT A CLEAR PATH FOR ADVANCEMENT ALL THROUGH THE DEPARTMENT. +THE NEWEST UNIFORMED PATROLMAN UNDERSTANDS THAT, FOR MERITORIOUS WORK, +HE WILL HAVE A CHANCE OF PROMOTION. IF HE MAKES A COMMENDABLE ARREST, HE +IS SENT TO THE DETECTIVE BUREAU, GIVEN INSTRUCTION, AND TRIED AT +DETECTIVE WORK. IF HE MAKES GOOD, HE STAYS. IF UNFITTED FOR +PLAIN-CLOTHES DUTY, HE HAS STILL HAD HIS CHANCE. WHAT IS JUST AS +IMPORTANT, THE DETECTIVE BUREAU HAS HAD A CHANCE TO SEE HIM. + +UNDER COMMISSIONER WALDO AND DEPUTY COMMISSIONER DOUGHERTY, THE +SO-CALLED “BLACK HAND” CRIMES AMONG ITALIANS HAVE BEEN CHECKED, AND WILL +BE STOPPED. MANY OF THESE CASES WERE TRACED TO SENSATIONAL REPORTING OF +ORDINARY QUARRELS AND ASSAULTS, AND OTHERS TO BUSINESS RIVALRIES. IN THE +SERIOUS CASES, ARRESTS HAVE BEEN MADE AND CONVICTIONS SECURED. + +ANOTHER WELL-KNOWN FORM OF LAW-BREAKING IN NEW YORK IS GAMBLING. THIS IS +PARTICULARLY DIFFICULT TO CHECK BECAUSE OF INGENUITY IN CONCEALING +EVIDENCE, DEVELOPED BY LONG EXPERIENCE ON THE PART OF THE LAW-BREAKERS, +AND ALSO THE STRONG POLITICAL ALLIANCES OF GAMBLING-HOUSE KEEPERS. BUT +AFTER SEVERAL EXPERIMENTS IN DEALING WITH IT, THE COMMISSIONER NOW FEELS +CONFIDENT THAT HE HAS A METHOD WHICH WILL RESULT IN THE SUPPRESSION OF +GAMBLING, AND THAT, AS HE SAYS, “WHEN YOU PUT A CRIMP INTO THINGS OF +THAT SORT THEY DON’T GENERALLY COME BACK.” + +IN OTHER DIRECTIONS RED TAPE HAS BEEN ABOLISHED AND ECONOMIES BROUGHT +ABOUT; THE WAY HAS BEEN OPENED FOR INDIVIDUAL MERIT IN ALL RANKS; STEPS +HAVE BEEN TAKEN TO DEVELOP AND TEACH BETTER METHODS; THE WORK OF THE +DEPARTMENT HAS BEEN BROUGHT CLOSER TO THE PUBLIC. THERE IS A NEW SPIRIT +IN THE NEW YORK POLICE DEPARTMENT TO-DAY—A SPIRIT CERTAIN TO DEVELOP THE +PUBLIC GOOD WILL AND APPRECIATION THAT IS SO NECESSARY TO THE BEST ORDER +OF PUBLIC SERVICE. + + * * * * * + + SOME INTERESTING FACTS ABOUT THE POLICE + DEPARTMENT OF THE CITY OF NEW YORK + +THE POLICE DEPARTMENT OF THE CITY OF NEW YORK IS MADE UP AS FOLLOWS: + + COMMISSIONER AND FOUR DEPUTY COMMISSIONERS + + 19 INSPECTORS + + 25 SURGEONS + + 95 CAPTAINS + + 624 LIEUTENANTS + + 586 SERGEANTS + + 8,585 PATROLMEN + + 191 DOORMEN + + 69 MATRONS + + 1 SUPERINTENDENT OF TELEGRAPH + + 2 ASSISTANT SUPERINTENDENTS OF TELEGRAPH + + 1 CHIEF LINEMAN + + 5 LINEMEN + + 2 BOILER INSPECTORS + + ------ + + 10,207 TOTAL UNIFORM FORCE + +OF THIS NUMBER, 500 ARE DETECTIVES IN CIVILIAN DRESS. + +IN ADDITION, THERE ARE OVER 247 CIVILIANS EMPLOYED IN CLERICAL CAPACITY. + +THERE ARE 6 AUTOMOBILES AND 161 OTHER VEHICLES, INCLUDING PATROL WAGONS, +USED BY THE DEPARTMENT. ALSO 679 HORSES FOR MOUNTED PATROLMEN. + +THE HARBOR SQUAD NUMBERS: 1 CAPTAIN, 7 LIEUTENANTS, 9 SERGEANTS, 36 +PATROLMEN, 2 DOORMEN, BESIDES CIVILIANS EMPLOYED AS ENGINEERS, FIREMEN, +OILERS, DECK-HANDS, ETC. + +IT IS PROVIDED WITH ONE VESSEL OF 235 TONS, FIVE LAUNCHES, TWO DORIES, +AND SIX BOATS. + +THESE BOATS PATROL ABOUT 340 MILES OF WATER FRONT. + + + + + +END OF PROJECT GUTENBERG'S THE GREAT TAXICAB ROBBERY, BY JAMES H. COLLINS + +*** END OF THIS PROJECT GUTENBERG EBOOK THE GREAT TAXICAB ROBBERY *** + +***** THIS FILE SHOULD BE NAMED 53145-0.TXT OR 53145-0.ZIP ***** +THIS AND ALL ASSOCIATED FILES OF VARIOUS FORMATS WILL BE FOUND IN: + HTTP://WWW.GUTENBERG.ORG/5/3/1/4/53145/ + +PRODUCED BY ELLINORA AND THE ONLINE DISTRIBUTED PROOFREADING +TEAM AT HTTP://WWW.PGDP.NET (THIS FILE WAS PRODUCED FROM +IMAGES GENEROUSLY MADE AVAILABLE BY THE INTERNET ARCHIVE) + +UPDATED EDITIONS WILL REPLACE THE PREVIOUS ONE--THE OLD EDITIONS WILL +BE RENAMED. + +CREATING THE WORKS FROM PRINT EDITIONS NOT PROTECTED BY U.S. COPYRIGHT +LAW MEANS THAT NO ONE OWNS A UNITED STATES COPYRIGHT IN THESE WORKS, +SO THE FOUNDATION (AND YOU!) CAN COPY AND DISTRIBUTE IT IN THE UNITED +STATES WITHOUT PERMISSION AND WITHOUT PAYING COPYRIGHT +ROYALTIES. SPECIAL RULES, SET FORTH IN THE GENERAL TERMS OF USE PART +OF THIS LICENSE, APPLY TO COPYING AND DISTRIBUTING PROJECT +GUTENBERG-TM ELECTRONIC WORKS TO PROTECT THE PROJECT GUTENBERG-TM +CONCEPT AND TRADEMARK. PROJECT GUTENBERG IS A REGISTERED TRADEMARK, +AND MAY NOT BE USED IF YOU CHARGE FOR THE EBOOKS, UNLESS YOU RECEIVE +SPECIFIC PERMISSION. IF YOU DO NOT CHARGE ANYTHING FOR COPIES OF THIS +EBOOK, COMPLYING WITH THE RULES IS VERY EASY. YOU MAY USE THIS EBOOK +FOR NEARLY ANY PURPOSE SUCH AS CREATION OF DERIVATIVE WORKS, REPORTS, +PERFORMANCES AND RESEARCH. THEY MAY BE MODIFIED AND PRINTED AND GIVEN +AWAY--YOU MAY DO PRACTICALLY ANYTHING IN THE UNITED STATES WITH EBOOKS +NOT PROTECTED BY U.S. COPYRIGHT LAW. REDISTRIBUTION IS SUBJECT TO THE +TRADEMARK LICENSE, ESPECIALLY COMMERCIAL REDISTRIBUTION. + +START: FULL LICENSE + +THE FULL PROJECT GUTENBERG LICENSE +PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK + +TO PROTECT THE PROJECT GUTENBERG-TM MISSION OF PROMOTING THE FREE +DISTRIBUTION OF ELECTRONIC WORKS, BY USING OR DISTRIBUTING THIS WORK +(OR ANY OTHER WORK ASSOCIATED IN ANY WAY WITH THE PHRASE "PROJECT +GUTENBERG"), YOU AGREE TO COMPLY WITH ALL THE TERMS OF THE FULL +PROJECT GUTENBERG-TM LICENSE AVAILABLE WITH THIS FILE OR ONLINE AT +WWW.GUTENBERG.ORG/LICENSE. + +SECTION 1. GENERAL TERMS OF USE AND REDISTRIBUTING PROJECT +GUTENBERG-TM ELECTRONIC WORKS + +1.A. BY READING OR USING ANY PART OF THIS PROJECT GUTENBERG-TM +ELECTRONIC WORK, YOU INDICATE THAT YOU HAVE READ, UNDERSTAND, AGREE TO +AND ACCEPT ALL THE TERMS OF THIS LICENSE AND INTELLECTUAL PROPERTY +(TRADEMARK/COPYRIGHT) AGREEMENT. IF YOU DO NOT AGREE TO ABIDE BY ALL +THE TERMS OF THIS AGREEMENT, YOU MUST CEASE USING AND RETURN OR +DESTROY ALL COPIES OF PROJECT GUTENBERG-TM ELECTRONIC WORKS IN YOUR +POSSESSION. IF YOU PAID A FEE FOR OBTAINING A COPY OF OR ACCESS TO A +PROJECT GUTENBERG-TM ELECTRONIC WORK AND YOU DO NOT AGREE TO BE BOUND +BY THE TERMS OF THIS AGREEMENT, YOU MAY OBTAIN A REFUND FROM THE +PERSON OR ENTITY TO WHOM YOU PAID THE FEE AS SET FORTH IN PARAGRAPH +1.E.8. + +1.B. "PROJECT GUTENBERG" IS A REGISTERED TRADEMARK. IT MAY ONLY BE +USED ON OR ASSOCIATED IN ANY WAY WITH AN ELECTRONIC WORK BY PEOPLE WHO +AGREE TO BE BOUND BY THE TERMS OF THIS AGREEMENT. THERE ARE A FEW +THINGS THAT YOU CAN DO WITH MOST PROJECT GUTENBERG-TM ELECTRONIC WORKS +EVEN WITHOUT COMPLYING WITH THE FULL TERMS OF THIS AGREEMENT. SEE +PARAGRAPH 1.C BELOW. THERE ARE A LOT OF THINGS YOU CAN DO WITH PROJECT +GUTENBERG-TM ELECTRONIC WORKS IF YOU FOLLOW THE TERMS OF THIS +AGREEMENT AND HELP PRESERVE FREE FUTURE ACCESS TO PROJECT GUTENBERG-TM +ELECTRONIC WORKS. SEE PARAGRAPH 1.E BELOW. + +1.C. THE PROJECT GUTENBERG LITERARY ARCHIVE FOUNDATION ("THE +FOUNDATION" OR PGLAF), OWNS A COMPILATION COPYRIGHT IN THE COLLECTION +OF PROJECT GUTENBERG-TM ELECTRONIC WORKS. NEARLY ALL THE INDIVIDUAL +WORKS IN THE COLLECTION ARE IN THE PUBLIC DOMAIN IN THE UNITED +STATES. IF AN INDIVIDUAL WORK IS UNPROTECTED BY COPYRIGHT LAW IN THE +UNITED STATES AND YOU ARE LOCATED IN THE UNITED STATES, WE DO NOT +CLAIM A RIGHT TO PREVENT YOU FROM COPYING, DISTRIBUTING, PERFORMING, +DISPLAYING OR CREATING DERIVATIVE WORKS BASED ON THE WORK AS LONG AS +ALL REFERENCES TO PROJECT GUTENBERG ARE REMOVED. OF COURSE, WE HOPE +THAT YOU WILL SUPPORT THE PROJECT GUTENBERG-TM MISSION OF PROMOTING +FREE ACCESS TO ELECTRONIC WORKS BY FREELY SHARING PROJECT GUTENBERG-TM +WORKS IN COMPLIANCE WITH THE TERMS OF THIS AGREEMENT FOR KEEPING THE +PROJECT GUTENBERG-TM NAME ASSOCIATED WITH THE WORK. YOU CAN EASILY +COMPLY WITH THE TERMS OF THIS AGREEMENT BY KEEPING THIS WORK IN THE +SAME FORMAT WITH ITS ATTACHED FULL PROJECT GUTENBERG-TM LICENSE WHEN +YOU SHARE IT WITHOUT CHARGE WITH OTHERS. + +1.D. THE COPYRIGHT LAWS OF THE PLACE WHERE YOU ARE LOCATED ALSO GOVERN +WHAT YOU CAN DO WITH THIS WORK. COPYRIGHT LAWS IN MOST COUNTRIES ARE +IN A CONSTANT STATE OF CHANGE. IF YOU ARE OUTSIDE THE UNITED STATES, +CHECK THE LAWS OF YOUR COUNTRY IN ADDITION TO THE TERMS OF THIS +AGREEMENT BEFORE DOWNLOADING, COPYING, DISPLAYING, PERFORMING, +DISTRIBUTING OR CREATING DERIVATIVE WORKS BASED ON THIS WORK OR ANY +OTHER PROJECT GUTENBERG-TM WORK. THE FOUNDATION MAKES NO +REPRESENTATIONS CONCERNING THE COPYRIGHT STATUS OF ANY WORK IN ANY +COUNTRY OUTSIDE THE UNITED STATES. + +1.E. UNLESS YOU HAVE REMOVED ALL REFERENCES TO PROJECT GUTENBERG: + +1.E.1. THE FOLLOWING SENTENCE, WITH ACTIVE LINKS TO, OR OTHER +IMMEDIATE ACCESS TO, THE FULL PROJECT GUTENBERG-TM LICENSE MUST APPEAR +PROMINENTLY WHENEVER ANY COPY OF A PROJECT GUTENBERG-TM WORK (ANY WORK +ON WHICH THE PHRASE "PROJECT GUTENBERG" APPEARS, OR WITH WHICH THE +PHRASE "PROJECT GUTENBERG" IS ASSOCIATED) IS ACCESSED, DISPLAYED, +PERFORMED, VIEWED, COPIED OR DISTRIBUTED: + + THIS EBOOK IS FOR THE USE OF ANYONE ANYWHERE IN THE UNITED STATES AND + MOST OTHER PARTS OF THE WORLD AT NO COST AND WITH ALMOST NO + RESTRICTIONS WHATSOEVER. YOU MAY COPY IT, GIVE IT AWAY OR RE-USE IT + UNDER THE TERMS OF THE PROJECT GUTENBERG LICENSE INCLUDED WITH THIS + EBOOK OR ONLINE AT WWW.GUTENBERG.ORG. IF YOU ARE NOT LOCATED IN THE + UNITED STATES, YOU'LL HAVE TO CHECK THE LAWS OF THE COUNTRY WHERE YOU + ARE LOCATED BEFORE USING THIS EBOOK. + +1.E.2. IF AN INDIVIDUAL PROJECT GUTENBERG-TM ELECTRONIC WORK IS +DERIVED FROM TEXTS NOT PROTECTED BY U.S. COPYRIGHT LAW (DOES NOT +CONTAIN A NOTICE INDICATING THAT IT IS POSTED WITH PERMISSION OF THE +COPYRIGHT HOLDER), THE WORK CAN BE COPIED AND DISTRIBUTED TO ANYONE IN +THE UNITED STATES WITHOUT PAYING ANY FEES OR CHARGES. IF YOU ARE +REDISTRIBUTING OR PROVIDING ACCESS TO A WORK WITH THE PHRASE "PROJECT +GUTENBERG" ASSOCIATED WITH OR APPEARING ON THE WORK, YOU MUST COMPLY +EITHER WITH THE REQUIREMENTS OF PARAGRAPHS 1.E.1 THROUGH 1.E.7 OR +OBTAIN PERMISSION FOR THE USE OF THE WORK AND THE PROJECT GUTENBERG-TM +TRADEMARK AS SET FORTH IN PARAGRAPHS 1.E.8 OR 1.E.9. + +1.E.3. IF AN INDIVIDUAL PROJECT GUTENBERG-TM ELECTRONIC WORK IS POSTED +WITH THE PERMISSION OF THE COPYRIGHT HOLDER, YOUR USE AND DISTRIBUTION +MUST COMPLY WITH BOTH PARAGRAPHS 1.E.1 THROUGH 1.E.7 AND ANY +ADDITIONAL TERMS IMPOSED BY THE COPYRIGHT HOLDER. ADDITIONAL TERMS +WILL BE LINKED TO THE PROJECT GUTENBERG-TM LICENSE FOR ALL WORKS +POSTED WITH THE PERMISSION OF THE COPYRIGHT HOLDER FOUND AT THE +BEGINNING OF THIS WORK. + +1.E.4. DO NOT UNLINK OR DETACH OR REMOVE THE FULL PROJECT GUTENBERG-TM +LICENSE TERMS FROM THIS WORK, OR ANY FILES CONTAINING A PART OF THIS +WORK OR ANY OTHER WORK ASSOCIATED WITH PROJECT GUTENBERG-TM. + +1.E.5. DO NOT COPY, DISPLAY, PERFORM, DISTRIBUTE OR REDISTRIBUTE THIS +ELECTRONIC WORK, OR ANY PART OF THIS ELECTRONIC WORK, WITHOUT +PROMINENTLY DISPLAYING THE SENTENCE SET FORTH IN PARAGRAPH 1.E.1 WITH +ACTIVE LINKS OR IMMEDIATE ACCESS TO THE FULL TERMS OF THE PROJECT +GUTENBERG-TM LICENSE. + +1.E.6. YOU MAY CONVERT TO AND DISTRIBUTE THIS WORK IN ANY BINARY, +COMPRESSED, MARKED UP, NONPROPRIETARY OR PROPRIETARY FORM, INCLUDING +ANY WORD PROCESSING OR HYPERTEXT FORM. HOWEVER, IF YOU PROVIDE ACCESS +TO OR DISTRIBUTE COPIES OF A PROJECT GUTENBERG-TM WORK IN A FORMAT +OTHER THAN "PLAIN VANILLA ASCII" OR OTHER FORMAT USED IN THE OFFICIAL +VERSION POSTED ON THE OFFICIAL PROJECT GUTENBERG-TM WEB SITE +(WWW.GUTENBERG.ORG), YOU MUST, AT NO ADDITIONAL COST, FEE OR EXPENSE +TO THE USER, PROVIDE A COPY, A MEANS OF EXPORTING A COPY, OR A MEANS +OF OBTAINING A COPY UPON REQUEST, OF THE WORK IN ITS ORIGINAL "PLAIN +VANILLA ASCII" OR OTHER FORM. ANY ALTERNATE FORMAT MUST INCLUDE THE +FULL PROJECT GUTENBERG-TM LICENSE AS SPECIFIED IN PARAGRAPH 1.E.1. + +1.E.7. DO NOT CHARGE A FEE FOR ACCESS TO, VIEWING, DISPLAYING, +PERFORMING, COPYING OR DISTRIBUTING ANY PROJECT GUTENBERG-TM WORKS +UNLESS YOU COMPLY WITH PARAGRAPH 1.E.8 OR 1.E.9. + +1.E.8. YOU MAY CHARGE A REASONABLE FEE FOR COPIES OF OR PROVIDING +ACCESS TO OR DISTRIBUTING PROJECT GUTENBERG-TM ELECTRONIC WORKS +PROVIDED THAT + +* YOU PAY A ROYALTY FEE OF 20% OF THE GROSS PROFITS YOU DERIVE FROM + THE USE OF PROJECT GUTENBERG-TM WORKS CALCULATED USING THE METHOD + YOU ALREADY USE TO CALCULATE YOUR APPLICABLE TAXES. THE FEE IS OWED + TO THE OWNER OF THE PROJECT GUTENBERG-TM TRADEMARK, BUT HE HAS + AGREED TO DONATE ROYALTIES UNDER THIS PARAGRAPH TO THE PROJECT + GUTENBERG LITERARY ARCHIVE FOUNDATION. ROYALTY PAYMENTS MUST BE PAID + WITHIN 60 DAYS FOLLOWING EACH DATE ON WHICH YOU PREPARE (OR ARE + LEGALLY REQUIRED TO PREPARE) YOUR PERIODIC TAX RETURNS. ROYALTY + PAYMENTS SHOULD BE CLEARLY MARKED AS SUCH AND SENT TO THE PROJECT + GUTENBERG LITERARY ARCHIVE FOUNDATION AT THE ADDRESS SPECIFIED IN + SECTION 4, "INFORMATION ABOUT DONATIONS TO THE PROJECT GUTENBERG + LITERARY ARCHIVE FOUNDATION." + +* YOU PROVIDE A FULL REFUND OF ANY MONEY PAID BY A USER WHO NOTIFIES + YOU IN WRITING (OR BY E-MAIL) WITHIN 30 DAYS OF RECEIPT THAT S/HE + DOES NOT AGREE TO THE TERMS OF THE FULL PROJECT GUTENBERG-TM + LICENSE. YOU MUST REQUIRE SUCH A USER TO RETURN OR DESTROY ALL + COPIES OF THE WORKS POSSESSED IN A PHYSICAL MEDIUM AND DISCONTINUE + ALL USE OF AND ALL ACCESS TO OTHER COPIES OF PROJECT GUTENBERG-TM + WORKS. + +* YOU PROVIDE, IN ACCORDANCE WITH PARAGRAPH 1.F.3, A FULL REFUND OF + ANY MONEY PAID FOR A WORK OR A REPLACEMENT COPY, IF A DEFECT IN THE + ELECTRONIC WORK IS DISCOVERED AND REPORTED TO YOU WITHIN 90 DAYS OF + RECEIPT OF THE WORK. + +* YOU COMPLY WITH ALL OTHER TERMS OF THIS AGREEMENT FOR FREE + DISTRIBUTION OF PROJECT GUTENBERG-TM WORKS. + +1.E.9. IF YOU WISH TO CHARGE A FEE OR DISTRIBUTE A PROJECT +GUTENBERG-TM ELECTRONIC WORK OR GROUP OF WORKS ON DIFFERENT TERMS THAN +ARE SET FORTH IN THIS AGREEMENT, YOU MUST OBTAIN PERMISSION IN WRITING +FROM BOTH THE PROJECT GUTENBERG LITERARY ARCHIVE FOUNDATION AND THE +PROJECT GUTENBERG TRADEMARK LLC, THE OWNER OF THE PROJECT GUTENBERG-TM +TRADEMARK. CONTACT THE FOUNDATION AS SET FORTH IN SECTION 3 BELOW. + +1.F. + +1.F.1. PROJECT GUTENBERG VOLUNTEERS AND EMPLOYEES EXPEND CONSIDERABLE +EFFORT TO IDENTIFY, DO COPYRIGHT RESEARCH ON, TRANSCRIBE AND PROOFREAD +WORKS NOT PROTECTED BY U.S. COPYRIGHT LAW IN CREATING THE PROJECT +GUTENBERG-TM COLLECTION. DESPITE THESE EFFORTS, PROJECT GUTENBERG-TM +ELECTRONIC WORKS, AND THE MEDIUM ON WHICH THEY MAY BE STORED, MAY +CONTAIN "DEFECTS," SUCH AS, BUT NOT LIMITED TO, INCOMPLETE, INACCURATE +OR CORRUPT DATA, TRANSCRIPTION ERRORS, A COPYRIGHT OR OTHER +INTELLECTUAL PROPERTY INFRINGEMENT, A DEFECTIVE OR DAMAGED DISK OR +OTHER MEDIUM, A COMPUTER VIRUS, OR COMPUTER CODES THAT DAMAGE OR +CANNOT BE READ BY YOUR EQUIPMENT. + +1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - EXCEPT FOR THE "RIGHT +OF REPLACEMENT OR REFUND" DESCRIBED IN PARAGRAPH 1.F.3, THE PROJECT +GUTENBERG LITERARY ARCHIVE FOUNDATION, THE OWNER OF THE PROJECT +GUTENBERG-TM TRADEMARK, AND ANY OTHER PARTY DISTRIBUTING A PROJECT +GUTENBERG-TM ELECTRONIC WORK UNDER THIS AGREEMENT, DISCLAIM ALL +LIABILITY TO YOU FOR DAMAGES, COSTS AND EXPENSES, INCLUDING LEGAL +FEES. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT +LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE +PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE THAT THE FOUNDATION, THE +TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE +LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR +INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH +DAMAGE. + +1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - IF YOU DISCOVER A +DEFECT IN THIS ELECTRONIC WORK WITHIN 90 DAYS OF RECEIVING IT, YOU CAN +RECEIVE A REFUND OF THE MONEY (IF ANY) YOU PAID FOR IT BY SENDING A +WRITTEN EXPLANATION TO THE PERSON YOU RECEIVED THE WORK FROM. IF YOU +RECEIVED THE WORK ON A PHYSICAL MEDIUM, YOU MUST RETURN THE MEDIUM +WITH YOUR WRITTEN EXPLANATION. THE PERSON OR ENTITY THAT PROVIDED YOU +WITH THE DEFECTIVE WORK MAY ELECT TO PROVIDE A REPLACEMENT COPY IN +LIEU OF A REFUND. IF YOU RECEIVED THE WORK ELECTRONICALLY, THE PERSON +OR ENTITY PROVIDING IT TO YOU MAY CHOOSE TO GIVE YOU A SECOND +OPPORTUNITY TO RECEIVE THE WORK ELECTRONICALLY IN LIEU OF A REFUND. IF +THE SECOND COPY IS ALSO DEFECTIVE, YOU MAY DEMAND A REFUND IN WRITING +WITHOUT FURTHER OPPORTUNITIES TO FIX THE PROBLEM. + +1.F.4. EXCEPT FOR THE LIMITED RIGHT OF REPLACEMENT OR REFUND SET FORTH +IN PARAGRAPH 1.F.3, THIS WORK IS PROVIDED TO YOU 'AS-IS', WITH NO +OTHER WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PURPOSE. + +1.F.5. SOME STATES DO NOT ALLOW DISCLAIMERS OF CERTAIN IMPLIED +WARRANTIES OR THE EXCLUSION OR LIMITATION OF CERTAIN TYPES OF +DAMAGES. IF ANY DISCLAIMER OR LIMITATION SET FORTH IN THIS AGREEMENT +VIOLATES THE LAW OF THE STATE APPLICABLE TO THIS AGREEMENT, THE +AGREEMENT SHALL BE INTERPRETED TO MAKE THE MAXIMUM DISCLAIMER OR +LIMITATION PERMITTED BY THE APPLICABLE STATE LAW. THE INVALIDITY OR +UNENFORCEABILITY OF ANY PROVISION OF THIS AGREEMENT SHALL NOT VOID THE +REMAINING PROVISIONS. + +1.F.6. INDEMNITY - YOU AGREE TO INDEMNIFY AND HOLD THE FOUNDATION, THE +TRADEMARK OWNER, ANY AGENT OR EMPLOYEE OF THE FOUNDATION, ANYONE +PROVIDING COPIES OF PROJECT GUTENBERG-TM ELECTRONIC WORKS IN +ACCORDANCE WITH THIS AGREEMENT, AND ANY VOLUNTEERS ASSOCIATED WITH THE +PRODUCTION, PROMOTION AND DISTRIBUTION OF PROJECT GUTENBERG-TM +ELECTRONIC WORKS, HARMLESS FROM ALL LIABILITY, COSTS AND EXPENSES, +INCLUDING LEGAL FEES, THAT ARISE DIRECTLY OR INDIRECTLY FROM ANY OF +THE FOLLOWING WHICH YOU DO OR CAUSE TO OCCUR: (A) DISTRIBUTION OF THIS +OR ANY PROJECT GUTENBERG-TM WORK, (B) ALTERATION, MODIFICATION, OR +ADDITIONS OR DELETIONS TO ANY PROJECT GUTENBERG-TM WORK, AND (C) ANY +DEFECT YOU CAUSE. + +SECTION 2. INFORMATION ABOUT THE MISSION OF PROJECT GUTENBERG-TM + +PROJECT GUTENBERG-TM IS SYNONYMOUS WITH THE FREE DISTRIBUTION OF +ELECTRONIC WORKS IN FORMATS READABLE BY THE WIDEST VARIETY OF +COMPUTERS INCLUDING OBSOLETE, OLD, MIDDLE-AGED AND NEW COMPUTERS. IT +EXISTS BECAUSE OF THE EFFORTS OF HUNDREDS OF VOLUNTEERS AND DONATIONS +FROM PEOPLE IN ALL WALKS OF LIFE. + +VOLUNTEERS AND FINANCIAL SUPPORT TO PROVIDE VOLUNTEERS WITH THE +ASSISTANCE THEY NEED ARE CRITICAL TO REACHING PROJECT GUTENBERG-TM'S +GOALS AND ENSURING THAT THE PROJECT GUTENBERG-TM COLLECTION WILL +REMAIN FREELY AVAILABLE FOR GENERATIONS TO COME. IN 2001, THE PROJECT +GUTENBERG LITERARY ARCHIVE FOUNDATION WAS CREATED TO PROVIDE A SECURE +AND PERMANENT FUTURE FOR PROJECT GUTENBERG-TM AND FUTURE +GENERATIONS. TO LEARN MORE ABOUT THE PROJECT GUTENBERG LITERARY +ARCHIVE FOUNDATION AND HOW YOUR EFFORTS AND DONATIONS CAN HELP, SEE +SECTIONS 3 AND 4 AND THE FOUNDATION INFORMATION PAGE AT +WWW.GUTENBERG.ORG + + + +SECTION 3. INFORMATION ABOUT THE PROJECT GUTENBERG LITERARY ARCHIVE FOUNDATION + +THE PROJECT GUTENBERG LITERARY ARCHIVE FOUNDATION IS A NON PROFIT +501(C)(3) EDUCATIONAL CORPORATION ORGANIZED UNDER THE LAWS OF THE +STATE OF MISSISSIPPI AND GRANTED TAX EXEMPT STATUS BY THE INTERNAL +REVENUE SERVICE. THE FOUNDATION'S EIN OR FEDERAL TAX IDENTIFICATION +NUMBER IS 64-6221541. CONTRIBUTIONS TO THE PROJECT GUTENBERG LITERARY +ARCHIVE FOUNDATION ARE TAX DEDUCTIBLE TO THE FULL EXTENT PERMITTED BY +U.S. FEDERAL LAWS AND YOUR STATE'S LAWS. + +THE FOUNDATION'S PRINCIPAL OFFICE IS IN FAIRBANKS, ALASKA, WITH THE +MAILING ADDRESS: PO BOX 750175, FAIRBANKS, AK 99775, BUT ITS +VOLUNTEERS AND EMPLOYEES ARE SCATTERED THROUGHOUT NUMEROUS +LOCATIONS. ITS BUSINESS OFFICE IS LOCATED AT 809 NORTH 1500 WEST, SALT +LAKE CITY, UT 84116, (801) 596-1887. EMAIL CONTACT LINKS AND UP TO +DATE CONTACT INFORMATION CAN BE FOUND AT THE FOUNDATION'S WEB SITE AND +OFFICIAL PAGE AT WWW.GUTENBERG.ORG/CONTACT + +FOR ADDITIONAL CONTACT INFORMATION: + + DR. GREGORY B. NEWBY + CHIEF EXECUTIVE AND DIRECTOR + GBNEWBY@PGLAF.ORG + +SECTION 4. INFORMATION ABOUT DONATIONS TO THE PROJECT GUTENBERG +LITERARY ARCHIVE FOUNDATION + +PROJECT GUTENBERG-TM DEPENDS UPON AND CANNOT SURVIVE WITHOUT WIDE +SPREAD PUBLIC SUPPORT AND DONATIONS TO CARRY OUT ITS MISSION OF +INCREASING THE NUMBER OF PUBLIC DOMAIN AND LICENSED WORKS THAT CAN BE +FREELY DISTRIBUTED IN MACHINE READABLE FORM ACCESSIBLE BY THE WIDEST +ARRAY OF EQUIPMENT INCLUDING OUTDATED EQUIPMENT. MANY SMALL DONATIONS +($1 TO $5,000) ARE PARTICULARLY IMPORTANT TO MAINTAINING TAX EXEMPT +STATUS WITH THE IRS. + +THE FOUNDATION IS COMMITTED TO COMPLYING WITH THE LAWS REGULATING +CHARITIES AND CHARITABLE DONATIONS IN ALL 50 STATES OF THE UNITED +STATES. COMPLIANCE REQUIREMENTS ARE NOT UNIFORM AND IT TAKES A +CONSIDERABLE EFFORT, MUCH PAPERWORK AND MANY FEES TO MEET AND KEEP UP +WITH THESE REQUIREMENTS. WE DO NOT SOLICIT DONATIONS IN LOCATIONS +WHERE WE HAVE NOT RECEIVED WRITTEN CONFIRMATION OF COMPLIANCE. TO SEND +DONATIONS OR DETERMINE THE STATUS OF COMPLIANCE FOR ANY PARTICULAR +STATE VISIT WWW.GUTENBERG.ORG/DONATE + +WHILE WE CANNOT AND DO NOT SOLICIT CONTRIBUTIONS FROM STATES WHERE WE +HAVE NOT MET THE SOLICITATION REQUIREMENTS, WE KNOW OF NO PROHIBITION +AGAINST ACCEPTING UNSOLICITED DONATIONS FROM DONORS IN SUCH STATES WHO +APPROACH US WITH OFFERS TO DONATE. + +INTERNATIONAL DONATIONS ARE GRATEFULLY ACCEPTED, BUT WE CANNOT MAKE +ANY STATEMENTS CONCERNING TAX TREATMENT OF DONATIONS RECEIVED FROM +OUTSIDE THE UNITED STATES. U.S. LAWS ALONE SWAMP OUR SMALL STAFF. + +PLEASE CHECK THE PROJECT GUTENBERG WEB PAGES FOR CURRENT DONATION +METHODS AND ADDRESSES. DONATIONS ARE ACCEPTED IN A NUMBER OF OTHER +WAYS INCLUDING CHECKS, ONLINE PAYMENTS AND CREDIT CARD DONATIONS. TO +DONATE, PLEASE VISIT: WWW.GUTENBERG.ORG/DONATE + +SECTION 5. GENERAL INFORMATION ABOUT PROJECT GUTENBERG-TM ELECTRONIC WORKS. + +PROFESSOR MICHAEL S. HART WAS THE ORIGINATOR OF THE PROJECT +GUTENBERG-TM CONCEPT OF A LIBRARY OF ELECTRONIC WORKS THAT COULD BE +FREELY SHARED WITH ANYONE. FOR FORTY YEARS, HE PRODUCED AND +DISTRIBUTED PROJECT GUTENBERG-TM EBOOKS WITH ONLY A LOOSE NETWORK OF +VOLUNTEER SUPPORT. + +PROJECT GUTENBERG-TM EBOOKS ARE OFTEN CREATED FROM SEVERAL PRINTED +EDITIONS, ALL OF WHICH ARE CONFIRMED AS NOT PROTECTED BY COPYRIGHT IN +THE U.S. UNLESS A COPYRIGHT NOTICE IS INCLUDED. THUS, WE DO NOT +NECESSARILY KEEP EBOOKS IN COMPLIANCE WITH ANY PARTICULAR PAPER +EDITION. + +MOST PEOPLE START AT OUR WEB SITE WHICH HAS THE MAIN PG SEARCH +FACILITY: WWW.GUTENBERG.ORG + +THIS WEB SITE INCLUDES INFORMATION ABOUT PROJECT GUTENBERG-TM, +INCLUDING HOW TO MAKE DONATIONS TO THE PROJECT GUTENBERG LITERARY +ARCHIVE FOUNDATION, HOW TO HELP PRODUCE OUR NEW EBOOKS, AND HOW TO +SUBSCRIBE TO OUR EMAIL NEWSLETTER TO HEAR ABOUT NEW EBOOKS. + diff --git a/examples/change_case/input b/examples/change_case/input new file mode 100644 index 0000000..4c41921 --- /dev/null +++ b/examples/change_case/input @@ -0,0 +1,2862 @@ +The Project Gutenberg EBook of The Great Taxicab Robbery, by James H. Collins + +This eBook is for the use of anyone anywhere in the United States and most +other parts of the world at no cost and with almost no restrictions +whatsoever. You may copy it, give it away or re-use it under the terms of +the Project Gutenberg License included with this eBook or online at +www.gutenberg.org. If you are not located in the United States, you'll have +to check the laws of the country where you are located before using this ebook. + +Title: The Great Taxicab Robbery + A True Detective Story + +Author: James H. Collins + +Release Date: September 25, 2016 [EBook #53145] + +Language: English + +Character set encoding: UTF-8 + +*** START OF THIS PROJECT GUTENBERG EBOOK THE GREAT TAXICAB ROBBERY *** + + + + +Produced by ellinora and The Online Distributed Proofreading +Team at http://www.pgdp.net (This file was produced from +images generously made available by The Internet Archive) + + + + + + + Transcriber’s Note + + Obvious spelling and punctuation errors have been corrected. + + Spelling variations have been kept as in the original. + + Italic text is indicated by underscores surrounding the _italic text_. + + Small capitals in the original have been converted to ALL CAPS. + +------------------------------------------------------------------------ + + + + + THE GREAT + TAXICAB ROBBERY + +------------------------------------------------------------------------ + +[Illustration: + + RHINELANDER WALDO + Commissioner of Police, New York City +] + +------------------------------------------------------------------------ + + + + + THE GREAT + TAXICAB ROBBERY + + _A True Detective Story_ + + BY + JAMES H. COLLINS + + WRITTEN FROM RECORDS AND PERSONAL ACCOUNTS + OF THE CASE FURNISHED BY THE NEW + YORK POLICE DEPARTMENT + + + NEW YORK + JOHN LANE COMPANY + MCMXII + +------------------------------------------------------------------------ + + + + + COPYRIGHT, 1912, BY + JOHN LANE COMPANY + +------------------------------------------------------------------------ + + + + + This book has something to say about practical + results of wiser police administration in New + York. It is respectfully dedicated to + + HON. WILLIAM J. GAYNOR + + MAYOR OF NEW YORK CITY + + the official who took the initiative in improving + conditions + +------------------------------------------------------------------------ + + + + + PREFACE + + +There are several reasons for this little book, but the best of all is +the main reason—that it is a cracking good story, and right out of life. +The characters will be found interesting, and they are real people, +every one of them. The incidents are full of action and color. The plot +has mystery, surprise, interplay of mind and motive—had a novelist +invented it, the reader might declare it improbable. This is the kind of +story that is fundamental—the kind Mr. Chesterton says is so necessary +to plain people that, when writers do not happen to write it, plain +people invent it for themselves in the form of folk-lore. + +But apart from the story interest there are other reasons. + +When the New York police department had run down all the threads of the +plot, and accounted for most of the characters by locking them up, they +had become so absorbed in the story themselves, as a story, that they +thought the public would enjoy following it from the inside. + +While the crime was being dealt with, the police were subjected to +pretty severe criticism. They felt that the facts would make it clear +that they knew their trade and had been working at it diligently. + +The story gives an insight into real police methods. These are very +different from the methods of the fiction detective, and also from the +average citizen’s idea of police work. They ought to be better known. +When the public understands that there is nothing secret, tyrannical or +dangerous in good police practice, and that our laws safeguard even the +guilty against abuses, there will be helpful public opinion behind +officers of the law, and we shall have a higher degree of order and +security. + +The directing mind in this case was that of Commissioner George +Dougherty, executive head of the detectives of the New York Police +Department. Thousands of clean, ambitious young fellows are constantly +putting on the policeman’s uniform all over the country, and rising to +places as detectives and officials. The manufacturer or merchant may +find himself in the police commissioner’s chair. Even the suburbanite, +with his bundles, may be, out at Lonesomehurst, a member of the village +council, and thus responsible for the supervision of a police force +that, though it be only two patrolmen and a chief, is important in its +place. So in writing the story there has been an effort to show how a +first-rate man like Commissioner Dougherty works. His methods are plain +business methods. Most of his life he has earned his living following +the policeman’s trade as a commercial business. What he did in a case of +this kind, and how, and why, are matters of general interest and +importance. + +Finally, the story throws some useful light on criminals. It shows the +cunning of the underworld, and also its limitations. To free the +law-abiding mind of romantic notions about the criminal, and show him as +he is, is highly important in the prevention of crime. + +------------------------------------------------------------------------ + + + + + LIST OF ILLUSTRATIONS + + + FACING + PAGE + + Rhinelander Waldo, Commissioner of + Police, New York City + + _Frontispiece_ + + George S. Dougherty, Second Deputy 20 + Police Commissioner + + Edward P. Hughes, Inspector in Command 40 + of Detective Bureau, and Dominick G. + Riley, Lieutenant and Aide to + Commissioner Dougherty + + Geno Montani, Eddie Kinsman, Gene 60 + Splaine, “Scotty the Lamb” and John + Molloy + + James Pasquale, Bob Delio, Jess 80 + Albrazzo, and Matteo Arbrano + + “Scotty” Receives Final Instructions 110 + + “The Brigands” “Stick-up” the Hold-up 126 + Men for Theirs + +------------------------------------------------------------------------ + + + + + THE CAST + + + GENO MONTANI, a taxicab proprietor. + WILBUR SMITH, an elderly bank teller. + FRANK WARDLE, a seventeen-year-old bank office boy. + EDDIE KINSMAN, alias “Collins,” alias “Eddie the Boob,” a hold-up man. + BILLY KELLER, alias “Dutch,” a hold-up man. + GENE SPLAINE, a hold-up man. + “SCOTTY THE LAMB,” a thieves’ helper, or “stall.” + JOE PHILADELPHIA, alias “The Kid,” a runner for thieves, or “lobbygow.” + JAMES PASQUALE, alias “Jimmy the Push,” keeper of shady resorts known + as “208” and “233.” + BOB DEILIO, partner of “Jimmy the Push.” + JESS ALBRAZZO, a middleman, formerly keeper of the Arch Café, pal of + Montani, “Jimmy the Push” and Bob Deilio. + MATTEO ARBRANO, } + PAULI GONZALES, } The “Three Brigands.” + CHARLES CAVAGNARO, } + “KING DODO,” a Bowery character. + RHINELANDER WALDO, Police Commissioner of New York. + GEORGE S. DOUGHERTY, Second Deputy Police Commissioner, executive head + of detectives. + INSPECTOR EDWARD P. HUGHES, in command of Detective Bureau. + POLICE LIEUTENANT DOMINICK G. RILEY, Aide of Commissioner Dougherty’s + staff. + DETECTIVE SERGT JOHN J. O’CONNELL, Official Stenographer. + THE DETECTIVES on “Plants,” “Trailing,” “Surrounding,” “Arresting,” + etc.: + + John P. Barron, Edward Boyle, Frank Campbell, James Dalton, James J. + Finan, John W. Finn, Joseph A. Daly, Daniel W. Clare, John Gaynor, + Anthony Grieco, John P. Griffith, Daniel F. Hallihan, Edward Lennon, + Henry Mugge, Richard Oliver, Gustavus J. Riley, James F. Shevlin, + Joseph Toner, George Trojan, James A. Watson. + + “SWEDE ANNIE,” Kinsman’s sweetheart. + MYRTLE HORN, a pal of Annie. + ROSE LEVY, a newcomer in Thompson street, Jess Albrazzo’s girl. + MRS. ISABELLA GOODWIN, a police matron. + MRS. SULLIVAN, keeper of a West Side rooming house. + “JOSIE,” a lady of the Levee district, Chicago. + + Detectives, policemen, informants, witnesses, denizens of the + underworld, newspaper reporters, trainmen, ticket sellers, etc., + etc. + + * * * * * + + PLACE—Chiefly in New York, with Scenes in Chicago, Albany, Memphis, + Boston and Montreal. + + TIME—February and March, 1912. + +------------------------------------------------------------------------ + + + + + The + Great Taxicab Robbery + + + + + CHAPTER I + WHAT THE PUBLIC HEARD ABOUT THE CRIME + + +On Thursday, February 15, 1912, the New York evening papers had a +startling news story. + +Between ten and eleven o’clock that morning two messengers were sent in +a taxicab from the East River National Bank, at Broadway and Third +street, to draw $25,000 in currency from the Produce Exchange National +Bank, at Broadway and Beaver street, in the downtown financial district, +and bring it uptown. This transfer of money had been made several times +a week for so long a period without danger or loss that the messengers +were unarmed. One of them, Wilbur F. Smith, was an old man who had been +in the service of the bank thirty-five years, and the other was a mere +boy, named Wardle, seventeen years old. The taxicab man, an Italian +named Geno Montani, seemed almost a trusted employee, too, for he +operated two cabs from a stand near the bank, and was frequently called +upon for such trips. + +While the cab was returning uptown through Church street with the money, +five men suddenly closed in upon it. According to the chauffeur’s story, +a sixth man forced him to slacken speed by stumbling in front of the +vehicle. Immediately two men on each side of the cab opened the doors. +Two assailants were boosted in and quickly beat the messengers into +insensibility, while their two helpers ran along on the sidewalk. The +fifth man climbed onto the seat beside the chauffeur, held a revolver to +his ribs, and ordered him to drive fast on peril of his life. This +fellow seemed to be familiar with automobiles, and threatened the driver +when he tried to slacken speed. That is a busy part of the city. Yet +nobody on the sidewalks seemed to notice anything out of the ordinary. +The cab dodged vehicles, going at high speed for several blocks. At Park +Place and Church street, after a trip of eleven blocks, at a busy +corner, the chauffeur was ordered to stop the cab, and the three robbers +got down, carrying the $25,000 in a leather bag, ran quickly to a black +automobile without a license number which was waiting for them, and in a +few moments were gone. + +That was the substance of the story. + +Information came chiefly from the chauffeur, because the two bank +employees had been attacked so suddenly and viciously that they lost +consciousness in a moment. When the chauffeur looked inside his cab +after the crime, he said, he saw them both lying senseless and bleeding. +They could give no description of the assailants. Eye-witnesses were +found who had seen men loitering in the neighborhood where the cab was +boarded shortly before the crime, but their descriptions were not very +useful. + +That night the New York evening papers published accounts of the crime +under great black headlines, and on the following morning every news +item of a criminal nature was grouped in the same part of the papers to +prove that the city had entered one of its sensational “waves of crime.” +And for more than a week the public read criticism and denunciation of +the police force. + +It was charged that the police had become “demoralized,” and various +changes of administrative policy introduced into the department within +the past eight months were blindly denounced. + +The most important of these changes was that devised by Mayor Gaynor. +Eight or ten years ago, every uniformed policeman in New York carried a +club, and often used it freely in defending himself while making +arrests. Abuses led to the abolition of this means of defense except for +officers patrolling the streets at night. There were still undoubted +abuses, however, and when Mayor Gaynor came into office, bringing +well-thought-out opinions of police administration from his experience +as a magistrate on the bench, he took a determined stand for more humane +methods of making arrests, and strict holding of every policeman to the +letter of the laws. Every case of clubbing was prosecuted, the plain +legal rights of citizens or criminals upheld, and the Police Department +began teaching its men new ways of defending themselves by skillful +holds in wrestling whereby prisoners may be handled effectually and +without doing them harm. Sentiment against the use of the club began to +grow in the Police Department itself, it being recognized that clubbing +was an unskillful means of defense, and that special athletic devices +were more workmanlike. + +Now, however, the newspapers published every chance opinion of +discharged, retired and anonymous police officers who objected to the +new regulations. It was alleged that criminals had got out of bounds +because policemen no longer dared club them into good behavior, and the +editors, without paying much attention to the many good points of the +new regulations, or trying to understand the merits of a settled policy +applied to an organization of more than ten thousand men, set up a cry +for the presumably “good old days” of Inspector So-and-So and Chief +This-and-That, when every known criminal was promptly struck over the +head on sight and thereby taught to know his place. If the files of New +York journals for those days following the robbery are examined they +will reveal a curious exhibition of pleading for official lawlessness +and autocracy. + +------------------------------------------------------------------------ + +[Illustration: + + GEORGE S. DOUGHERTY + Second Deputy Police Commissioner +] + +------------------------------------------------------------------------ + +Another point of criticism centered on a new method adopted in the +distribution of the detective force. This comprises more than five +hundred men. For years they were all required to report at Police +Headquarters every day, coming from distant precincts, and had an +opportunity to see whatever professional criminals were under arrest. +Then they went back to different precincts to work. This took too much +time, it was found, and the old-fashioned “line-up” of criminals was +chiefly a spectacle, the same offenders dropping into the hands of the +police with more or less regularity. So detectives were re-distributed +on a plan that attaches a proper number of plain-clothes policemen to +each precinct, according to its needs, and in those precincts the men +live and become acquainted with local criminals. Many of them work in +sections where they were born, and detectives speaking foreign languages +are assigned to foreign quarters. + +The newspapers charged that red-tape had brought the Police Department +to such a low state that young detectives had no idea what a real +criminal looked like, and urged the restoration of the old system, with +its picturesque “line-up.” + +In the days of Inspector Byrnes, when practically all the banking of the +city was done around Wall Street, the police established a “dead line” +beyond which criminals were supposed not to operate. In its day, the +“dead line” was real enough, undoubtedly. But it was not necessarily an +ideal police measure, and the growth of the city has long made it a mere +memory, living only in newspaper tradition. To-day, banking extends as +far north as Central Park, and millions upon millions of dollars are +being carried about daily by people of every sort. Despite the fact that +the last loss of money from a New York bank through professional +criminals (apart from fraud and forgery) dated back some fifteen or +eighteen years, the newspapers seemed to agree that life and property +were no longer safe in the city because this purely mythical “dead line” +had been disregarded by the robbers. + +There was other comment of the same character, and it had an immediate +and grievous effect. + +On the day after the robbery a chance remark about a safe in an East +Side bank, coupled with the general excitement, led to a run of its +depositors, chiefly people of foreign birth. The bank was solvent, and +the run was undoubtedly stimulated by gossip started by criminals for +their own ends. But the frightened depositors insisted on drawing out +their money, and exposing themselves to danger of robbery and assault. +The situation was met by careful police co-operation. + +About six months before the taxicab robbery, the New York legislature +put into force a measure known as the “Sullivan law,” providing +penalties for the carrying of pistols and concealed weapons. This is +unquestionably a wise measure fundamentally, and one that was badly +needed for police administration and public safety. It is perhaps open +to certain modifications, to be made as actual conditions are +encountered in practical working of the law. Newspaper opinion drew a +connection between this law and the “wave of crime,” and its repeal was +urged, so that every citizen might arm himself as he pleased. Hundreds +of persons who had felt safe in going about their business unarmed now +applied for permits to carry pistols. + +Fortunately, a sensation does not last long in New York. + +Though the Police Department felt this criticism keenly, and was +hampered by it, pressure began to slacken in about a week. Other +sensations came along. There was nothing to publish about the taxicab +case, as police information was withheld for good official reasons. +Presently the town ventured to joke about the case. At an elaborate +public dinner one night, among other topical effects, a dummy taxicab +suddenly scooted out before the guests, held up a dummy police +commissioner, took his watch, and scooted away again. The diners +laughed, and that was fairly representative of the town, which was now +ready to have its joke about the crime, too. Had there never been any +further action by the police, the case would have quietly dropped out of +sight. But fortunately there was police action, and with that we shall +now deal. + +------------------------------------------------------------------------ + + + + + CHAPTER II + HOW THE CRIME WAS HANDLED BY THE POLICE—ON THE TRAIL + + +Now, let us follow the police story. We will begin at the very +beginning, watch the incidents and character unfold, and give quite a +little attention to the technical methods by which results were arrived +at. For the story is a study in clean, straightforward detective work, +and that work ought to be better known by the public, so that +intelligent public opinion may back up honest police effort. + +The story starts with a burly, genial man, sitting in a big office at +Police Headquarters. The office is that of the Second Deputy Police +Commissioner, and the man is the Commissioner himself, George S. +Dougherty. + +Commissioner Dougherty dominates the story. The taxicab robbers were +caught by his methods, plans and supervision, backed by the splendid +team work of the men under him. His own sources of information supplied +the clues, and his personal skill in examining criminals brought out the +confessions that saved the city the expense of trials with all but one +offender. It is far from the writer’s wish to indulge in hero-worship, +however, so these details will appear in their proper place in the +narrative. + +George Dougherty has had nearly twenty-five years’ experience in +criminal work in New York, and over the whole country. Until his +appointment by Mayor Gaynor in May, 1911, he was connected with the +Pinkerton organization. Bank and financial crimes have long been his +specialty, so the taxicab case fell right into his own province. He +knows the ways of forgers, bank sneaks, swindlers, burglars and +“yeggmen,” and is personally acquainted with most of the criminals in +those lines in and out of prison. He has also had much to do with +protecting the crowds at races, ball games, aeronautic meetings and +other big gatherings. As executive head of the detective bureau, five +hundred plain-clothes policemen scattered over Greater New York cover +all crimes of a local and routine nature, and are subject to his call +when a special case like the taxicab robbery comes up for his personal +attention. + +On an ordinarily quiet morning at Police Headquarters, there will be a +steady stream of people passing into Dougherty’s office. Several +assistants guard the doors leading from two ante-rooms, and marshal the +visitors. Now a group of detectives enters and hears a talk on methods. +Then two detectives come in, make a report and receive further +instructions. Then there will be an interruption, perhaps, while an +assistant soothes and sends away a crank who occasionally turns up with +a purely imaginary affair of his own, and two more detectives pass in +accompanied by a man and a woman who look just like the people one sees +dining at a fashionable uptown restaurant. The woman’s furs are +magnificent, and her hat a costly Fifth avenue creation. + +“A couple of taxpayers?” speculates the group of reporters, waiting +outside to get a statement about some important case. + +“Two of the cleverest check swindlers in the country,” corrects a +detective, and presently the reporters are called in, and Dougherty +recites names, dates and facts connected with the gang to which these +prosperous “taxpayers” belong, gazing reflectively out of the window as +details come back in memory, and chuckling with the delighted +journalists as the pithy slang and professional names of the underworld +are jotted down on their pads. They fire a scattering volley of +questions at him and depart, and then his secretary announces that the +saloon-keeper who knows a good deal about the Blind Puppy Café case is +outside, but refuses to talk to the police at all. + +“Hullo!” is the Commissioner’s off-hand greeting as the cautious +saloon-keeper comes in, and in two minutes the latter is answering +questions freely. + +“Why, say!” he exclaims, “I’ll tell _you_ anything.” + +Then a humble little woman in a cheap hat and a long cloak is brought +in. For more than an hour she has been waiting outside, with her eyes +fixed patiently on the door leading to the inner office. + +“Stand there,” says the Commissioner, with gruff kindness, and he makes +a formal statement about her husband, who has been arrested with a +criminal gang, and is pretty certain to go to prison. He tells her what +has been done in the case, and what will follow, and the little woman +listens mutely. When he finishes, her eyes fill with tears. But she +makes no reply, nor any sound. The Commissioner winks fast as he looks +out of the window again, and then says, sympathetically: + +“That’s the best that can be done. But don’t you worry. Come in and see +me again. Keep in touch with me, and don’t worry yourself. Come in and +talk with me—come in to-morrow.” And she bravely wipes her eyes and goes +out with her trouble. + +The procession continues. + +Police captains and detectives in squads, prisoners and witnesses in +twos and threes, newspaper men in corps and singly, and occasionally a +cautious gentleman who wants to see the Commissioner alone, and is +anxious that nobody say anything about this visit to Police +Headquarters—for he is an informant. + + + _The First Alarm_ + +The taxicab robbery took place on a quiet morning like this. + +Suddenly, around eleven o’clock on Thursday, February 15, a brief +message comes from the second precinct, stating that a robbery has been +committed in the financial district. A little later there is a fuller +report over police wires. The details are few, as will be seen by the +general alarm that presently goes out over the city: + + _Police Department, City of New York_, + + February 15, 1912. + + To all, all Boroughs—notify the patrol platoon immediately. + + Arrest for assault and robbery three men: + + No. 1, about 35 years, five feet eight or nine inches in height, + 160 or 170 pounds, small stubby dark mustache, dark complexion, + medium build, dark suit and cap, no overcoat. + + No. 2, about 35 years, five feet ten inches in height, slender + build, dark hair, possibly smooth shaven, light brown suit, no + overcoat, wore a cap. + + No description of No. 3. + + Stole $25,000 in five and ten dollar bills, contained in a brown + leather telescope bag, 24 inches long, 16 inches square, from + two bank messengers in a taxicab about 11 this a. m., at Park + Place and Church Street, and escaped in a five or seven-seated + black touring car, top up. Look out for this car, bag and + occupants on streets, at ferry entrances, bridge terminals, + railroad stations. Inquire at all garages, automobile stands, + stables, etc. + + If found, notify Detective Bureau. + +Before noon, the Commissioner has postponed appointments, assigned +routine business, and is engaged in an investigation that will keep him +busy until that morning, twelve days later, when the first arrests are +made, and the case is, in police parlance, “broken.” + +Where do the police begin in such a crime? What do they start with when +there is apparently so little to work upon? + +In spite of the wide popular interest in police and criminal matters, +the average citizen has no very clear idea. Even the newspaper reporter, +following police activities every day, is not well informed in technical +details. Some information is necessarily withheld from him, and he is a +busy young man, with his own technical viewpoint, working hard to get +his own kind of information. + +This lack of knowledge leads to a feeling of mystery, helplessness and +terror after a sensational crime, and to criticism of the police. They +are at work, skillfully, honestly, diligently. But results take time. It +would do little good to make arrests without evidence. The citizen’s +sympathies are aroused by brutal lawlessness, and he urges that somebody +be caught and punished. If results are not at once apparent, he jumps to +the conclusion that the police are “demoralized.” He would be startled +if he could see how quickly and persistently the underworld takes steps +to strengthen him in that conclusion, and use him to discredit the +police. + +Sixty detectives are immediately called into the case. Five of them go +down to the scene of the robbery, with orders to work there until +further notice. They make a thorough search of the neighborhood, +following the route taken by Montani’s taxicab, and questioning +merchants, newsdealers, porters, truckmen and other persons likely to +have information as eye-witnesses. They go through the streets that may +have been taken by the escaping robbers, and work over the whole ground. +This search through one of the busiest sections of New York in a busy +hour, amid the excitement created by the crime, may appear like hopeless +business. But, as will be seen presently, it yields important results. +Other detectives search garages for the black automobile without a +license number in which the robbers are reported to have got away. Four +uniformed policemen on beats along the route taken by the taxicab are +questioned. Other detailed inquiries of the same nature are started. + +But the most important work of the first day centers at Police +Headquarters, where a conference is held by Commissioner Dougherty and +his assistants, and in the examination of Montani, the taxicab driver. + +Strip all the labels off a suit of clothes and lay it before a committee +of tailors. In a few moments certain points would be agreed upon. It may +be a new suit, or an old one, a fine piece of tailoring, or a cheap +hand-me-down. The committee could often identify the cheap suit and tell +the name of its manufacturer, while with a seventy-five-dollar suit it +might be possible to determine the maker’s name. This holds true of many +other lines of work, and it is particularly true of criminal +investigation. + +Who cut and made that suit of clothes? + +The conference sat down to determine this, judging the robbery strictly +as a piece of workmanship. Names of known bank criminals were brought +up, one by one, and details gone over. It soon became clear that none of +the men identified with bank crime were likely to have the brains, skill +or organization to plan and execute so complicated a robbery. + +The criminals had known the habits of the bank in conveying cash uptown. +They knew the route, and were aware that the guard was only an elderly +man and a seventeen-year-old boy, both unarmed. They had boarded the cab +at the best point, and evidently made arrangements for stopping it. +There was team work in every detail. It showed marked insight, for +instance, to provide additional men to boost each assailant in at the +doors. For young Wardle, the bank employee, had made a plucky attempt to +shove his robber out and shut the door, and might have succeeded had +there not been an outside man. Robberies are committed under exciting +conditions. They sometimes fail because criminals balk. That outside man +was there not only to help his “slugger” into the cab, but to _force_ +him in if he shrank, and make certain he did his work. Whoever planned +such details, it was agreed at the conference, possessed more cunning +than the ordinary bank criminal. + + + _Montani is Examined._ + +When Montani, the taxicab driver, arrived at Police Headquarters, he was +willing to talk, and seemed anxious to help the police in every way. He +knew suspicion might be directed toward himself, but did not resent +that. He talked like a man confident of the truth of his story, and +certain that he would be found blameless. + +Montani is an Italian, from the northern part of Italy, about 30 years +old, five feet six inches high, rather stout and thick-set, with very +dark complexion. The striking feature of his countenance, his large, +intelligent brown eyes. Commissioner Dougherty found himself thinking of +Napoleon in connection with Montani. + +The first examination lasted all afternoon, Montani going out to lunch +with the Commissioner. Hundreds of questions were asked bearing on the +robbery, the appearance of the criminals, and Montani’s past and +personal affairs. The story was gone over again and again, and different +questioners relieved each other. Yet the taxicab man never lost his +temper or patience, and did not contradict himself in any important +particular. + +Montani had been in this country since the age of twelve, it appeared, +had a wife and two children, and was the owner of two taxicabs operated +from a stand at a hotel near the bank, whose money he regularly carried. +He had owned three cabs, but lost one through business reverses. In +fact, he had passed through money troubles, and his story excited +sympathy. Starting originally as a truckman for a salvage company, his +ambition and intelligence had won him such confidence that this company +lent him money to set up trucking for himself. Still more ambitious, he +had become a taxicab proprietor. Through the trickery of an ill-chosen +partner, however, he has lost some of his savings. He seemed a little +bitter about this, and it was a circumstance not likely to escape an +expert police examiner, for the loss of money through fraud, coupled +with temptation, is often the starting point in crime. The Italian’s +former employers spoke highly of his character when questioned by +detectives. He gave the names of chauffeurs who had worked for him +lately, and of business people who knew him, and careful investigation +failed to disclose any suspicious circumstances. Montani quite won the +newspaper men—so much so that, when he was discharged in court a few +days later for apparent lack of evidence, the newspapers criticised the +police for having held him at all. + +And yet, before that first night, Montani himself, largely through +simple answers to questions, had become so involved that there was +ground for holding him under arrest. + +------------------------------------------------------------------------ + +[Illustration: + + EDWARD P. HUGHES + Inspector in Command of Detective Bureau +] + +[Illustration: + + DOMINICK G. RILEY + Lieutenant and Aide to Commissioner Dougherty +] + +------------------------------------------------------------------------ + +In the questions and cross-questions, the checks and counter-checks of a +skillful examiner, there are possibilities little suspected by those not +familiar with that kind of work. + +Montani had slowed down his cab at the point where the robbers boarded +it. He said that an old man had suddenly got in front, and he had +slackened speed to avoid running over him. But detectives along the +route found eye-witnesses who had seen the robbers board the cab, and +who could testify that there had been nobody in front of the vehicle. + +Both of his cabs had stood in line near the bank that morning, the one +driven by himself being second, and the other, in charge of an employee, +was first. When the call came from the bank, Montani answered it himself +out of his turn, sending the other cab uptown, as he explained, to have +some tires vulcanized. But it was not a good explanation. + +He said that as soon as the robbers left his cab he had raised a cry for +help. But eye-witnesses were found who denied this. + +Instead of running north after the robbers’ automobile when he had taken +a policeman aboard his cab, he ran south, away from it. This action, he +maintained, was taken under orders from the policeman. But the latter +denied that. + +He was not able to explain how the robbers had known where to post their +automobile so it would be waiting at the spot where they finished their +work. + +Interest centered in this mysterious black automobile without a license +number. For, though Montani was an experienced chauffeur, and his +replies to other questions showed that he had seen both the rear and the +side of that car, he was unable to tell its make. + +Meanwhile, it was learned that three men had hurriedly boarded an +elevated train near the scene of the robbery shortly after, not waiting +for change from a quarter. The ticket-seller was unable to describe +them, but connected them with the robbery when he heard about it. + +Montani was held in the custody of the Commissioner that night, to be +put through further examination in the morning. But long before morning +the police were working on an entirely new development. + + + _The First Direct Clue_ + +The law-abiding citizen goes around New York with little knowledge of +the crowding underworld all about him. It is perhaps just as well that +he knows nothing of the lives and morals of hundreds of people who elbow +him on the streets, sit beside him in the cars, and scrutinize him with +a strictly professional eye in many places. + +Nor has he any clear conception of the relations that a good police +officer maintains with members of this underworld. It is a world just as +complete as that of business or society, however, and much of the time +of a detective or police official is spent keeping track of people in +it, forming acquaintances and connections in various ways, and +establishing the organization of informants that will help in the +detection and prevention of crime. A good detective is like a good +salesman—he keeps track of his “trade.” + +Shortly after midnight of the first day, Commissioner Dougherty received +a message over the telephone that sent him uptown to meet an informant. +At two o’clock in the morning of Friday, February 16, he and this person +had a talk at a fashionable uptown hotel. Indeed, most of the meetings +with informants during this case were held at two well-known hotels, +perhaps the last places in the city that anybody would connect with such +conferences. + +Informants are not always right, nor always possessed of useful +information. But this one had the first real clue. + +On the afternoon of the robbery, it was learned, a fellow known as +“Eddie Collins” had come to his rooming house, on the lower West Side, +told a woman with whom he lived, known as “Swede Annie,” to pack up and +be ready to leave the city in a hurry, and presently disappeared with +her. He was also reported to have a large roll of money. With a rough +estimate of the size of this roll, given by the informant, and a dummy +roll of “stage money” made up for the purpose, the police were able to +judge that Collins must have had between $3,000 and $5,000. That would +have been his probable share in a division of the stolen currency among +five men. + +The house where Collins had lived was kept by a Mrs. Sullivan. Steps +were at once taken to “surround” this woman, as the operation is known +technically. For before a possible source of information like Mrs. +Sullivan is followed up, it is necessary to know something about it. The +person in question may be criminal, or in league with the underworld. On +the other hand, he or she may be quite innocent, and willing to aid the +police. The “surround” is an interesting operation. It is often made +without the knowledge of the person investigated. In many cases it takes +time. + +Mrs. Sullivan came through the ordeal handsomely. + +She proved to be a wholesome, hard-working landlady, keeping a house +that sheltered occasional suspicious characters, but entirely honest +herself. She was not only able to furnish information about her late +lodgers, but willing. + +“Sure, it’s a good deal I know about that Collins, as he calls himself,” +she said, “and mighty little that’s good.” + +It seems that about two weeks previously Collins had offered to pay the +landlady if she would appear in a Brooklyn court and testify to the good +character of a criminal named Molloy, who was being held for trial on a +charge of robbery. + +“They’re paying fifteen to twenty dollars for ‘character’ witnesses,” +said her lodger. + +“And do you think I’d take the stand and perjure myself swearing for a +man I never heard of?” asked the indignant landlady. + +“Oh, that’s nothing to some of the things we do,” was the reply. + +Several days later, while she was putting some laundry into Collins’ +bureau drawer the landlady caught sight of two new blackjacks. She asked +Collins what he was doing with such weapons. + +“Aw, we use them in our business,” he said. Then, with the confidence +often bred in criminals by success, he told her he knew a gang that was +planning to rob a taxicab that carried money uptown to a bank every +week. Mrs. Sullivan questioned him as to details, and he assured her it +would be an easy job. + +“For we’ve got it all fixed with the chauffeur,” he said. + +At that point, however, like many an honest person who might aid the +police with information, Mrs. Sullivan let the matter drop out of her +mind. It is a simple thing to mail a letter or telephone to Police +Headquarters, giving such information, and the experience of the +Detective Bureau is such that the information can be investigated +without involving innocent persons. But perhaps Mrs. Sullivan concluded +that, in a big city like New York, it is well for people to keep their +mouths shut. Or maybe she decided that Collins was merely boasting. + +On Friday, less than twenty-four hours after the robbery, a “network +investigation” was begun. + +Sixty detectives searched that part of the city where Collins and Annie +had lived, seeking further information. Photograph galleries and other +places were investigated on the chance of finding pictures. Denizens of +the underworld were talked with casually. Professional criminals, +prostitutes, dive-keepers, receivers of stolen goods and other shady +characters were brought before Commissioner Dougherty in couples and +half-dozens for quick cross-examination. By Saturday evening the police +had some highly important information. + +It was learned that Annie had been seen going away on the afternoon of +the robbery in a taxicab, accompanied by two men, one of whom was +Collins, and the other unknown. Good descriptions were secured of Annie +and her sweetheart, especially of her hat, which was a cheap affair, but +conspicuous by reason of a row of little red roses. It was also +discovered that Collins had been a boxer, that he hailed from Boston, +and that his real name was Eddie Kinsman. Finally, the police secured +two photographs, one an indifferent picture of Kinsman, and the other an +excellent portrait of Annie. These were quickly put through the +department’s photograph gallery, where there are facilities for making +duplicates in a hurry, and more than a hundred copies were soon ready +for work which will be described in its proper place. + +The trail now seemed to lead to Boston. At all events, further +information was to be secured there. And here came in a little +refinement imparted by Commissioner Dougherty’s experience with the +Pinkerton forces. For where this private detective organization works +unhampered over the whole country, the official police forces in most +cities confine their searches to their own territory. When it is +believed that criminals have left town, as in this case, a general +description is telegraphed to other cities. Dougherty’s method, however, +is always to send a man from his own staff, with detailed instructions. +There are no local boundaries for him. + +Late on Saturday night Inspector Hughes, of the Detective Bureau, +slipped out of headquarters with Detective O’Connell, and took a train +for Boston. Their departure was kept strictly secret. They bid good +night to associates, saying that they expected to be up and at work +again early next morning, and until their return on Monday everybody who +asked for the Inspector was told that “he is usually around the building +somewhere.” + + + _Montani Points Out “King Dodo”_ + +All through Friday and Saturday, while the network investigation was +going on, Commissioner Dougherty continued his examination of Montani. + +Some important information against him now came from outside. + +It developed that Montani had been involved several months before in an +insurance case, claiming indemnity for a burned automobile under a +policy. He had presented, as part of its value, a bill for repairs +amounting to $1,348. The insurance company, however, had found that this +bill was fraudulent, that the repairs had never been made, and had +obtained a statement to that effect from the Italian chauffeur. Out of +pity for his wife and two children the case was not pressed against him. +Now that he was involved in another crime, however, the insurance people +came forward and laid the facts before the police. + +Of course, Montani knew nothing about this new development. + +For two days the chauffeur was questioned at intervals, and the inquiry +centered chiefly on the knotty points in his story of the crime. He was +particularly pressed for better explanations of the slackening of his +cab when the robbers boarded it, but stuck to his original statement +about a man getting in front of the vehicle. He described this person as +an old man, and said he must have been in league with the criminals. As +the police had good evidence that there had been nobody in front of the +taxicab, however, this point was returned to again and again, and toward +night on Saturday, February 17, the little chauffeur began to feel the +strain. + +On his way to supper that evening with men from the Detective Bureau, +Montani was taken through the Bowery. Suddenly he stopped, dramatically, +and exclaimed: + +“There! That is the old man who got in front of my cab!” + +His finger indicated a Bowery character as typical as anything ever seen +in melodrama—a ragged little old figure with an amazing set of whiskers, +engaged in picking up cigar butts along the gutters. He was immediately +taken to headquarters. + +No detail of his work interests Commissioner Dougherty more keenly than +his study of the many picturesque characters who turn up as an important +case unfolds. He has a ready appreciation of everybody who appears, from +the society lady who lost her jewels to the typical Bowery loafer. He is +as ready to look at facts from a criminal’s point of view as that of an +honest man. He has often gone half across the country to get acquainted +with a good burglar, and in this warm human interest lies the basis of +his skill as an examiner of suspects. These details are set down, not in +glorification of Dougherty, but for the guidance of every police officer +interested in his methods. + +The moment Dougherty laid eyes on this new character, with his +magnificent whiskers, he gave him a nickname. + +“King Dodo!” said the Commissioner, and that by that name he was known +in so far as he figured in the case at all. “King Dodo” proved to be +entirely innocent, and nothing more than the victim of a chance move of +Montani’s, who evidently thought that he ought to produce something +tangible to back up his assertion that the cab had been intercepted by +an old man. “King Dodo” established a perfect alibi, proving that he had +been elsewhere at the time of the robbery, and after being questioned +and the truth of his story established, he was released, there being no +reason for holding him. + +“I feel safe,” said the Commissioner solemnly, “in paroling you on your +own responsibility, to appear again if wanted.” + +That may have been a heavier responsibility than had been put on his +shoulders in years. But he rose to it. Two days later a decently +dressed, clean shaven, elderly gentleman came in and asked for the +Commissioner. He was “all dolled up,” in police parlance, and looked +like a retired small shopkeeper. The staff did not recognize him for a +moment. But it was “King Dodo,” doing his best to fill the part of a +minor figure in the great taxicab mystery. There being nothing for him +to do, he dropped back into private life. + +On his Sunday visit to Boston Inspector Hughes talked with Chief +Inspector Watts of that city, learned where Kinsman lived, and that his +family was a respectable one; found a bright patrolman named Dorsey who +knew Kinsman, and gave more information about his personal appearance, +habits and career as a boxer, desertion from the Navy, and so forth, and +made arrangements to have the Kinsman home watched so that news of his +return would be secured immediately. It was clear that Kinsman had not +returned to Boston. + + + _Discovery of Kinsman’s Trail_ + +As soon as Inspector Hughes returned from Boston, on Monday morning, the +Commissioner took steps to question the crews of every train that had +left New York since one p. m. on the day of the robbery. + +Just the other afternoon the writer sat with a squad of young detectives +at Police Headquarters and heard a talk on methods given by Dougherty, +and one point clearly brought out was the usefulness to the +thief-catcher of routine information. + +He began by relating an amusing incident. Some days before a detective +had turned up at headquarters for instruction, and naïvely asked the +Commissioner to lend him a pencil and a slip of paper, so he could make +some notes. Another detective was found who had only a hazy idea of the +location of New York’s telephone exchanges. Taking these as his text, +the Commissioner explained the value to every police officer of what +might be called “time-table” information—knowing the depots and ferries, +what roads run out of them, the cities reached, the number and character +of trains, the general methods of dispatching trains, and so forth. The +Commissioner himself is as well informed on such matters as any railroad +man, and thoroughly familiar with routine methods in many other lines of +work and business. How such knowledge can be employed was shown by the +next move in the taxicab case. + +Detectives were sent to every railroad terminal to secure lists of +trains, learn the names of the crews, and make out schedules of the time +when each crew would be back in the city. Then each man was found and +carefully questioned. His memory could be helped by pictures of Kinsman +and Annie, and by intimate details of personal appearance and manner. + +The search bore fruit, though it took time. + +On Wednesday Detective Watson, who was a railroad engineer before he +joined the police, found that Train No. 13 on the New York Central had +taken on three passengers answering the descriptions on the afternoon of +the robbery. They had boarded the train at Peekskill, the town to which, +as it was subsequently learned, they had ridden in a taxicab. The +conductor’s attention had been drawn to Annie by her smoking a cigarette +on the sly in the toilet of the day coach. He remembered her high cheek +bones, and the black velvet hat with its little roses, and the athletic +build of her men companions, who both appeared to be boxers. It was also +established that the trio had gone to Albany, for one of the trainmen +distinctly remembered helping Annie down at that station. + + + _“Plant 21” Is Established_ + +Monday, February 19, was an important day in more ways than one. + +While the train investigation was going on, it was learned that a woman +known as “Myrtle Horn,” an intimate of Annie’s, had moved to a lower +West Side rooming house, taking Annie’s trunk with her, as though Annie +expected to return to the city. After a preliminary survey, this house +was visited by Commissioner Dougherty in person. He explained that he +was a contractor, about to build a section of the new subway, and that +he was looking for a quiet room at a reasonable price where he might +have some of the comforts of home. After a little talk with the landlady +it became clear that she was honest and trustworthy, with no information +of the new lodger who had taken her front room in the basement. +Arrangements were quickly made to put this house, inside and outside, +under constant surveillance. + +------------------------------------------------------------------------ + +[Illustration: GENE SPLAINE] + +[Illustration: EDDIE KINSMAN] + +[Illustration: GENO MONTANI] + +[Illustration: “SCOTTY THE LAMB”] + +[Illustration: JOHN MOLLOY] + +------------------------------------------------------------------------ + +Along in the evening Mrs. Isabella Goodwin, a police matron, was +installed there. The Commissioner brought her, and carried her bundle. +The landlady and the matron had never seen each other in their lives, +but kissed ostentatiously, and made considerable fuss on the chance of +being overheard. Mrs. Goodwin was “planted” as the landlady’s “sister,” +who had come from Montreal to live with her and help in the housework +until she could find a position in New York. The Commissioner grumbled a +little about her stinginess in refusing to pay an expressman to bring +her bundle, and then took his departure, explaining that the train had +been late, and the baby was not well, and his wife, Aggie, would be +worried about him, and so forth. Mrs. Goodwin established herself in a +room at the rear of the basement, handy to that occupied by Myrtle Horn, +and kept her eyes and ears open as she went about the housework, +slipping out to report when she had any information, and receiving +instructions. + +Outside surveillance on this house was conducted from an empty store +across the street. Arrangements for the use of such property are usually +made by the police without difficulty, though occasionally a +close-fisted owner expects rent. Blinds were put up over the windows, +peep-holes made, and a few hammers provided, with some nails and boards. +Then six of the best “shadow men” in the Detective Bureau were stationed +there. They made a little noise occasionally, in “getting the store +ready for a big firm moving up from downtown,” and watched the house day +and night. Whenever Myrtle went out she was followed. If she had +visitors, they were investigated. This store was known by the code term +of “Plant 21,” so that reports could be sent without disclosing police +information. + + + _Montani Goes Free_ + +On Monday, too, Montani was arraigned in court, and discharged for what +appeared to be lack of any evidence against him. + +At this point the Commissioner took the liberty of fooling the newspaper +men for the good of his case. + +Newspaper criticism for three days had been particularly severe. Editors +made many charges, and were fertile in suggestions as what ought to be +done to reorganize the presumably “demoralized” police department. The +present writer feels confident, however, that a careful search of the +files for those days will disclose hardly any suggestions likely to be +at all helpful to public servants in the discharge of duty. Many +questions with no real bearing on the case had been brought up by the +journalists, and the Commissioner, who was patient in answering the +newspaper men, began to be a little tired. + +On Sunday night his big office was filled with reporters. They sat about +everywhere. He had admitted them because he wanted them to see that he +was working. From time to time they quizzed him in this fashion: + +“Is it true that you and Commissioner Waldo have quarrelled?” + +“Is Waldo going to resign?” + +“Do you favor the Sullivan law against pistols?” + +“Will the ‘dead line’ be maintained now?” + +“Hadn’t the daily ‘line up’ of criminals ought to be restored so that +detectives will know crooks when they see them?” + +“Hasn’t Mayor Gaynor tied the hands of the police?” + +And so forth, and so forth, and so forth. + +Suddenly, on Sunday night, Dougherty turned and read the newspaper men a +lecture. He said that he wanted them to understand that he was no spring +chicken at his business, that he was working eighteen hours a day, and +that he knew he would show results if the people would only be patient, +and give him time. His only recommendation in the way of new laws or +reforms was for a statute that would enable the police to put known +criminals, without occupation or visible means of support, at work +mending roads. He outlined a plan which, rather strangely, did not get +any attention in the newspapers at all. His idea of dealing with idle +criminals, he said, was to have a cart, with commissary and sleeping +quarters for twelve men. As soon as twelve idle criminals with records +had been sentenced, they would pull this cart out of town themselves, +under guard, and go to work repairing roads. If that plan were adopted, +New York would not only be as free from criminals as the District of +Columbia, where a similar measure is enforced, but the roads all around +the city would be so well cared for that they could be used as +roller-skating rinks. + +The newspapers next morning were quite certain that Commissioners Waldo +and Dougherty had quarrelled, and when the journalists went down to +report Montani’s examination in court they were decidedly partial to the +taxicab man. + +Dougherty had told the newspaper men beforehand that he had evidence +enough to have Montani held for trial. He had made very positive +statements about this. Montani would be arraigned, he predicted, and if +discharged on one count, would be immediately arrested on something +else. If he was discharged on that, he would still be arraigned on +further charges. + +It needs no very brilliant imagination, therefore, to picture the effect +upon the newspapers when Montani, after being arraigned on the doubtful +points in his own account of the crime, and those not too vigorously +pressed, was discharged, with comment by the court upon the flimsiness +of the police case. There was one striking discrepancy in the evidence +presented at that examination which, if pressed, should have resulted in +the holding of Montani for trial. He still insisted that he had stopped +his cab because an old man had got in front of it, but this was denied +by a witness. That point was permitted to pass by Lieutenant Riley, who +appeared for the police. Montani could have been re-arrested on charges +based upon his attempt to defraud the insurance company. But he was +permitted to go free. That course had been decided on at Police +Headquarters after some difference of opinion. + +The newspapers were now more pessimistic than ever in their comment. +They contrasted this outcome with Dougherty’s promises that the +chauffeur would be re-arrested. It was taken as a confession of police +incompetency and bewilderment—which, as will be seen in its proper +place, was very useful in its way. Montani went free, and was jubilant, +calling on the Commissioner next morning to thank him. But from the +moment he left court until he was arrested again the Italian chauffeur +never got out of sight of the Police Department. + + + _What Developed on a Busy Tuesday_ + +It was on the day after Montani’s release that Commissioner Dougherty +began to uncover more interesting characters in the taxicab drama. + +Bit by bit, through points supplied by informants and persons who had +come in contact with him in various ways, a very good working knowledge +of the fugitive Kinsman was pieced together. It appeared that he had +come to New York the previous summer, from Boston, and after a brief +career as a boxer, had gone to work in a Sixth avenue resort known as +the “Nutshell Café,” where he was a waiter. Among his associates there +had been two characters who invited further inquiry. + +The first of these was a fellow called “Gene,” described as having a +“parrot nose,” and a criminal record. He had been a close pal of +Kinsman, and had also introduced another intimate, a wily little Italian +called “Jess,” who had formerly owned a thieves’ resort which he called +the “Arch Café.” A good description of Jess was secured. + +There was some delay while the Commissioner “surrounded” this +last-mentioned resort to find out if it was a place where any +information might be obtained openly. The question was decided in the +negative. So a plain-clothes man was quietly “planted” there to pick up +information. + +When a criminal is arrested (or “falls”) it is customary in the +underworld to raise a fund for his defense. The Arch Café was a center +for the deposit of such “fall money.” It was learned that a hundred +dollars had been raised for the defense of a man named Clarke, alias +“Molloy,” under arrest in Brooklyn for robbery. This was the same Molloy +to whose fine character Kinsman had asked his landlady to swear in +court. The Italian named Jess had taken charge of Molloy’s defense fund, +but squandered it in a spree. Later, making it good, he had sent it over +to Molloy’s relief by Kinsman’s pal, “Dutch,” and an Italian known as +“Matteo.” + +District inspectors of police were then called upon to find a detective +who knew Jess, and an Italian plain-clothes man, Antony Grieco, who had +grown up in that part of New York where Jess had kept a café, and who +knew the latter well, was detailed with another detective to look him up +and keep him under surveillance. They found that Jess, whose last name +was Albrazzo, had headquarters in a tough resort in Thompson street, +kept by an Italian named James Pasqualle, better known as “Jimmie the +Push.” From that time Jess was kept “on tap,” to await further +developments. + +Then the Commissioner undertook to find out more about the character +called “Gene.” Working in New York, as waiters and bartenders, were many +members of a criminal band known as the “Forty Thieves of Boston.” The +Commissioner called in all of them that he could find, and sounded each +for information about this “Gene.” After the time of day had been +passed, the talk would turn on members of the band and criminals in +general, and after curiosity had been excited, “Gene” would be referred +to casually. If the party interviewed said he knew “Gene,” the +Commissioner would probably be sceptical, ask his last name, press for +details of appearance and habits, and then pass to some other subject. + +It was found that “Gene’s” last name was Splaine, that he had served a +term in prison in Boston as a boy, and that, by his general description, +he must be the third fugitive accompanying Kinsman and Annie. When +Detective Watson got better descriptions of the third man at Albany, and +comparisons were made with sources of information in New York, it became +practically certain that Gene Splaine was with Kinsman. + + + _Annie Shows at “Plant 21”_ + +It was on this day, too (Tuesday, February 20), that “Swede Annie” +suddenly stepped into police view, _wearing a new hat_. She turned up +quietly at the house where Myrtle Horn had moved with her trunk, and +began living in the front basement room. Matron Goodwin and “Plant 21” +immediately reported her presence, and from that time the shadow men +across the street had something to do besides driving nails. For +whenever Annie or Myrtle went out of the house they were followed. + +Shadowing is a highly interesting kind of police work, at which some men +have exceptional ability. + +The general conception is that of a detective following closely behind +the suspected person, with his eyes glued to him, and cautiously +crouching behind lamp-posts and trees when the victim turns suddenly. +But that is far from the real thing. The work is done in ways altogether +different. Shadow men operate in pairs, as a rule, and keep track of +their party from vantage points not likely to be suspected. They dress +according to the character of the case, always in quiet clothes, changed +daily, and with absolutely no colors that will attract attention or lead +to recognition through the memory. They know how to follow when the +person under surveillance rides in cabs, cars or trains, to cover the +different exits from a building into which he or she may have gone, and +to loiter several hours around a given neighborhood, if need be, without +attracting the attention of honest citizens. + +This work is done by shifts. The operators relieve each other almost as +regularly as office employees, no matter how far the trail may have +taken them. They are in constant touch with headquarters for the purpose +of making reports and receiving instructions. + +In this branch of detective work, as in many others, the chief requisite +is resourcefulness. The detective of fact wears little disguise apart +from clothes that fit the surroundings he moves in. But he has an +instant knack at accounting for himself as a normal character who has +happened quite naturally into the scene. Ready wits do the trick—not +false whiskers. Thus it came about that whenever Annie and Myrtle were +hungry, and sat down in a restaurant, what they said was noted by a +couple of fellows at another table, who quickly made a party of the +chance patrons they found there, discussing wages or the suffragettes. +Or if Annie used the telephone in a drug store, a polite young man +turning over the directory said to her, “Go ahead, lady—I’m in no +hurry,” and listened. + +At the same time, Matron Goodwin was reporting conversation from inside +the house. It appeared that Kinsman had sent Annie back to the city +after buying her a new hat and giving her $125. He promised to write +soon, but did not tell her where he was going. Toward the end of the +week, as no letter arrived, Annie began worrying, and was talkative. She +feared that Eddie no longer loved her. She reproached herself for +letting him go without taking her along, and spoke of setting out to +find him. + + + _The Trail Is Taken Up_ + +It was now Wednesday, February 21, and all the careful detail work began +to come together. + +It was this day that Detective Watson found the crew of Train No. 13, on +the New York Central, which had taken Kinsman, Annie and Splaine aboard +at Peekskill the afternoon of the robbery after they had ridden out of +New York in a taxicab to avoid possible police surveillance at the +railroad stations. Commissioner Dougherty dispatched Watson to Peekskill +and Albany with thorough instructions. His motto in working out a case +is, “Supervision is half the battle.” + +“When you get to Albany,” he said, “go to that big hat store on Broadway +near the station. I’ll bet that’s where Annie’s new hat was bought—they +sell the best millinery in the country outside of New York.” + +Nothing important was learned at Peekskill, but at Albany, sure enough, +Detective Watson found the saleswoman right in “that big hat store” who +had sold the new hat, and secured Annie’s discarded headgear. The new +hat had cost twenty-five dollars. The old one looked as though it might +have cost ninety-five cents—a “Division Street Special.” Its black +velvet was of the cheapest grade, the famous little red roses proved to +be, on close inspection, nothing more than little loops of pink cotton +cloth, and the general state of the hat indicated that it was about time +Annie had a new one. This interesting “bonnet,” however, seemed just +then more handsome than any costly article of millinery ever smuggled +over from Paris. It was immediately sent to New York by express, with a +copy of the sales slip covering the purchase. The saleswoman was able to +add one or two details of description, and remembered how, after the +woman had selected a hat, the two men had joked about who was to pay for +it. + +“She’s your girl,” said Splaine, and so Kinsman had paid the bill with +five five-dollar bills. + +Nothing could be learned as to the direction in which the two men meant +to travel. Detective Watson now began a search among train crews running +out of Albany, and Commissioner Dougherty, in New York, got the Albany +ticket-sellers by long-distance telephone. His knowledge of how railroad +tickets are sold, accounted for, taken up, cancelled and checked by the +auditing department made it possible to sift matters down to the +strongest kind of probability. After considerable telephoning, aided by +Detective Watson on the spot, it was determined that Kinsman and Splaine +had been the purchasers of two consecutively numbered tickets for +Chicago sold together on Friday morning, twenty-four hours after the +robbery, and that they had gone west on Train No. 3, leaving Albany at +12:10 p. m. Their tickets were available for that train, and the +conclusion was strengthened by calculating Annie’s movements. For it was +found that she had come back to New York the same day, between four and +five in the afternoon. She had kept out of sight until she appeared at +Myrtle Horn’s lodging and was reported by Matron Goodwin and “Plant 21” +on Tuesday. But she must have taken a train from Albany about the time +that the men were starting for Chicago, reaching New York at 3:45 p. m. + +Commissioner Dougherty felt that the chances of finding his men in +Chicago were so good that, without wasting time in an investigation of +the crew of Train No. 3, he put Detectives Daly and Clare aboard a +Chicago train that same night. Kinsman and Splaine would both find +congenial company among the pugilists in Chicago. + +These detectives were given names to conceal their identity, and ordered +to report under the code term of “Orange Growers” to eliminate all +flavor of police business. They received detailed instructions about +where to go and what to do. Again the Commissioner covered the trail +when it led out of New York by sending capable assistants, instead of +merely wiring the police in other cities. Before the “Orange Growers” +departed, the “boss” gave them a little talk about expenses. + +The detective attached to a municipal police force is very often +hampered by fear of making unusual expenditures. Accounting routine is +strict. Telegrams are often limited to the minimum of ten words where a +hundred are needed to send a working description or report. The +long-distance telephone is used as a luxury, and in many instances where +the plain-clothes man can get valuable information through an informant +he pays the shot out of his own pocket because there is no other way of +paying it, and trusts to the chance that this private investment out of +his salary will help him “break” a knotty case. + +Commissioner Dougherty told the “Orange Growers” that they would be kept +on this trail if it led all around the world. They must not consider +expenditure when there was vital information to put on the wire. He +expected them to turn to the long-distance telephone whenever they +needed new instructions in a hurry. Briefly, he took the blinders and +shackles off them, and sent them out to do good work, and the outcome +justified this far-sightedness. + +------------------------------------------------------------------------ + +[Illustration: JESS ALBRAZZO] + +[Illustration: MATTEO ARBRANO] + +[Illustration: JAMES PASQUALE] + +[Illustration: BOB DELIO] + +------------------------------------------------------------------------ + +At that period of the winter trains were delayed everywhere by storms, +so the “Orange Growers” had opportunities to make inquiries at stations +and railroad restaurants all along the line to Buffalo. They were in +search of their “brother,” who was described in terms of Kinsman’s +personal appearance, and was supposed to be on his way somewhere with +another man. At Syracuse an observant waitress remembered their +“brother” distinctly, having served both the men when their train +stopped for supper. Finally, the two “Orange Growers” got snowed up in +Michigan for a time, and there we will leave them for the present. + + + _Montani Quizzed Once More_ + +By Thursday many loose ends of the case were being brought together so +effectually that the outlook seemed exceedingly bright. + +But only to the executive circle in Dougherty’s office. + +Outside, all was dark. Newspaper criticism had become more caustic than +ever, and the public, after the ingrained habit of New York, was turning +its attention to fresher news sensations. + +At a big annual dinner of police officials held that evening, February +22, the atmosphere of gloom resting upon the department was most +tangible. The fourteen hundred guests, who were chiefly police +inspectors, captains and lieutenants, felt that a stigma lay upon the +service with which they were identified. They had no means of knowing, +of course, that one week from that night the gloom would have lifted, +criticism be turned to praise, and that policemen generally would be, as +a witty lieutenant put it, “back to our official standing again—which +never was so very high.” + +Montani had called at Police Headquarters repeatedly, accompanied by his +unseen shadowers. He professed to be anxious to furnish further +information, if it lay in his power, and the Commissioner chatted with +him cordially, leading him to believe that he no longer rested under the +slightest suspicion. + +On Friday Dougherty made an interesting effort to “break” Montani. + +He now had a minute physical description of Kinsman, as well as two +photographs of him. The chauffeur was asked to describe once more the +man who had sat upon the cab seat with him. The questions went over +details from head to foot, and were prompted by details of Kinsman’s +real appearance. + +Montani said the man had large brown eyes, which was true. + +He remembered that he had talked with a good American accent, and used +words not common to the criminal, which was also more or less true. + +He suddenly recalled a gold-filled tooth in the robber’s upper +right-hand jaw, a point already furnished by informants. + +In fact, as this new examination went on, it became clear to the +Commissioner that Montani was actually describing Kinsman, changing only +one detail. He said that the robber had had a dark mustache, while it +was certain that Kinsman had been smooth-shaven. + +Suddenly the Commissioner tried what is known as a “shot.” + +The examiner in such an inquiry is often in possession of incriminating +evidence. Instead of producing it bluntly as evidence, however, he will +perhaps let it slip out bit by bit, as though by awkwardness, meanwhile +maintaining an appearance of absolute confidence in the suspect’s +integrity. A classic example of this device is found in the Russian +writer Dostoieffsky’s “Crime and Punishment.” The skillful “shot” is +usually far more disconcerting than evidence produced openly to +overwhelm. For the suspect assumes that the examiner really knows +nothing, and has merely blundered. So he is on his guard outwardly. But +he also worries inwardly, and this trying conflict between inner doubt +and the need for keeping up outer calm will often break him down +completely. + +Dougherty’s “shot” was a photograph of Kinsman. + +By pre-arrangement an assistant came into the office and began turning +over some papers on the Commissioner’s desk. The photo of Kinsman popped +out where Montani could see it plainly, and then was hurriedly put out +of sight again. The Commissioner scolded his assistant, and the latter +stood shamefaced and silent. + +But in this instance the device failed. + +Montani not only betrayed no interest in Kinsman’s picture, but took the +awkward assistant’s part, and asked the Commissioner not to scold him. + +Montani had planned his crime, fitted the plan with men, laid out every +detail in his mind, and arranged his story beforehand. He expected to be +arrested, and said so. He admitted that there were inconsistencies in +his story, but hoped to clear them up. He had discussed the crime with +Jess and Dutch, and had not been seen in the company of the other +criminals. So, having settled on his story, Montani stuck to it without +variation under every form of pressure. Others forgot what they had +arranged as their defense, or departed from it, or broke down and +confessed. But not Montani. He alone went to trial, and stuck to his +story until the end. + + + _The “Orange Growers” in Chicago_ + +When Daly and Clare, the two New York detectives working as the “Orange +Growers,” arrived in Chicago, they went to Police Headquarters in that +city, made inquiries about Kinsman and Splaine, and secured the aid of +Chicago detectives. Then they put up at a hotel where, by arrangements +with the house detective, they occupied a room on the second floor handy +to a little-used stairway leading to a side street, which would make it +easy to slip in and out without going through the lobby. On the trip +from New York both of them had neglected shaving, and Daly was an +especially tough-looking citizen, for his beard grows out stiff and +bristly, with black and red intermixed, and a little green to help the +general effect. With suits of old clothes and sweaters they were so +little like their official selves that for several days, though they +went rather freely around resorts frequented by crooks who knew them in +New York, they were not recognized. + +The “Orange Growers” now became a pair of hardened “yeggmen,” or bank +robbers, and for three days were busy visiting thieves’ haunts all over +the city, from the Levee district to the Stockyards. It was found that +Kinsman and Splaine had put up at a high-class boarding house in a +fashionable residence section. Kinsman seemed to be doubtful about the +impression Splaine might make there, though in the opinion of the police +Splaine was by far the more intelligent of the pair. So he took the +landlady aside and asked her, privately, if she had objections to a +prize-fighter in her house. The landlady replied, “Why, no! if he is a +gentleman—many prize-fighters are just like other people!” Thereupon, +Kinsman undertook that Splaine should behave himself. He also wanted to +know if valuables were safe there, and the astonished landlady assured +him that her house was like a home, that the guests were like one big +family and seldom locked their doors, and that Mr. Smith, well known as +an officer in one of the leading banks, had lived there for years. + +The pair had spent considerable time in criminal haunts, but had now +disappeared. Kinsman, as it was learned later, had returned to New York. +Splaine was apparently in Chicago still, spending his money, but the two +“Orange Growers” seemed never to catch up with him. Their man had always +gone around the corner within the past hour. + +Finally they planned a ruse with the aid of two Chicago detectives. +Splaine had been intimate with a certain woman of the underworld, known +as “Josie.” Clare went to her, represented himself as a “stick-up man,” +said he and his partner were after that guy with all the money and +diamonds, meaning Splaine, and that they meant to rob him. If Josie +worked with them, like a good girl, she would come in for her third of +the plunder. + +Josie professed ignorance. She was sure, so help her Mike, cross her +heart, that she knew nothing about no gent with any money or diamonds—no +such a party had been near the house in months, worse luck. Clare argued +awhile with no results, and then said he would come back a little later +and bring his pal. Then Daly was introduced to Josie as the extremely +undesirable citizen who would do the strong-arm work. But Josie still +insisted that she had no idea what they were talking about. + +They went out, and within a few minutes the two Chicago detectives, +Dempsey and McFarland, known by Josie as officers, came in, described +the disguised Clare and Daly as two of the most desperate “yeggmen” in +the country, said that they had warrants for them, and asked if they had +been seen. Josie crossed her heart again, and said that there had been +nobody around there all evening—believe her, it was like living the +simple life, and if things kept on bein’ so quiet she’d blow the town +and go back to Keokuk. + +Then, enter the two “Orange Growers” once more, to be warned by the fair +Josie. + +“Say, the bulls are after you boys, an’ you better pull your freight, +‘cause if you stay around here they’re goin’ to _get_ you.” + +“Aw, hell!” was the reply, “We’d just as lieve kill a cop or anybody +else. We stick in this house till you tell us where we can reach that +guy with the money and the diamonds—understand?” + +Then Josie broke down, and told them Splaine had been there early in the +evening, but had gone away to take a train out of town. She did not know +the railroad, and urged them to leave. This was evidently the truth, so +they hurried to Police Headquarters, telegraphed descriptions to other +cities with a request that arriving trains be watched, and went to bed +to get a little sleep, so that they could be at work early the next +morning. + +But in the morning word came from the Memphis Police that Splaine had +been arrested there on alighting from a train, and they thereupon +notified New York, went to Memphis, secured Splaine on extradition +papers, and brought him back to the metropolis. + + + _The Traps Are Sprung_ + +On Saturday afternoon, February 24, while most of the energy of the +Detective Bureau was centered on the taxicab case, a brutal murder was +committed in Brooklyn. + +Word came that a Flatbush merchant had been found dead in his store, +shot by unknown criminals whose motive was robbery. They had taken his +watch and five safety razors. + +Inspector Hughes was sent to the scene of the crime, and Commissioner +Dougherty quickly followed. The murder occurred about one p. m. By six +o’clock the same day the number of the watch had been learned through a +canvass of jewelers in the neighborhood, it being on record by one of +them who had repaired it, and the watch and two of the safety razors had +been found in pawnshops. Descriptions of the murderers were obtained, +and by three o’clock Sunday, the following day, their identity had been +established. Within thirty hours after the crime these men had been +arrested, positively identified as the pawners of the stolen articles, +and completely tied up in their own statements. + +At half-past nine Sunday night, while the Commissioner, Inspector Hughes +and Captain Coughlin, in charge of Brooklyn detectives, and Lieutenant +Riley were winding up their work on this murder case, word suddenly came +over the telephone to Commissioner Dougherty from an informant that +Eddie Kinsman had been seen in New York with “Swede Annie,” and that he +was accompanied by an unknown man, wearing a red necktie, supposed to be +Gene Splaine. At the same time Matron Goodwin, stationed inside Annie’s +lodgings, telephoned that she had information indicating that Kinsman +had returned to the city. + +When the Commissioner motored over to New York, he found his men +covering a hotel on Third avenue, not far from 42d street. Kinsman and +Annie were inside. + +The Commissioner hurried to the 18th precinct police station and sent +out a call for twenty-five detectives. Team work on the case had +developed to such a degree by this time that, though the men came from +many stations, they were all on hand in record time, a matter of twenty +or thirty minutes. Then a squad of these plain-clothes men was sent to +watch every railroad station and ferry house, each accompanied by one of +the men from “Plant 21,” familiar with Annie from having followed her +movements for a week. Surveillance on the hotel was strengthened, and +steps taken to ascertain whether the unknown man in the red tie was +really Splaine. + +While making these arrangements, a curious incident occurred, showing +how small is New York, after all, with its five million people. As +Dougherty sat in the 18th precinct station, Detective Rein brought in a +prisoner arrested for shooting a citizen. He was drunk and extremely +disagreeable, and gave his name as “Steigel,” living at 98 Third avenue. +Something in this address echoed to something in Dougherty’s memory—a +keen one for names, dates, addresses and facts generally. He +investigated further, and found that this prisoner was no other than the +criminal Molloy, whose urgent need of “character witnesses” had played +so important a part in furnishing the first information in the taxicab +case. + +By some mischance, these operations came to the ears of the newspaper +men. Word went about, beginning in Brooklyn, that important arrests were +to be made. The reporters followed the Commissioner in a crowd when he +refused to make a statement. They not only hampered the work, but +greatly endangered the outcome. On the following day, Monday, the papers +published information about the police activities of the night before. +The hazard here may be appreciated when the reader is told that Kinsman +had been a persistent reader of newspapers from the day of the robbery, +and that it was largely the pessimistic newspaper comment upon Montani’s +release in court that led him to return to New York. Deceived by the +newspaper chorus of “police demoralization,” and the easy way in which +Montani had got free, he concluded that the taxicab investigation had +been given up as hopeless. + +Kinsman was arrested in the Grand Central Station at half-past eleven +Monday morning, with Swede Annie and the unknown in the red tie. They +were about to set out for Boston. + +There were some amusing circumstances in the arrest. + +Kinsman’s immunity over night, and police precaution in deferring the +arrest until the last moment, on the chance that other persons would +join the party, gave him a false confidence. He afterward admitted that +ideas of a “pinch” at that time were far from his mind. + +When a criminal thought to be dangerous is to be arrested in a crowded +place like the Grand Central Station, police officers operate by methods +that prevent a struggle. As two detectives closed in on the party, +Kinsman watched one of them out of the corner of his eye. While a waiter +at the “Nutshell Café” he had often thrown objectionable guests out onto +the sidewalk. He now fancied that one of the detectives resembled a man +he had once “bounced,” and was ready to fight if attacked. + +“I was just folding it up,” he said, referring to his fist, “and getting +ready to land on him when one had me from behind and the other in front. +Then I knew they were cops.” + +Annie was gorgeously dressed in a new blue suit and fine fur coat, +bought out of the taxicab money. The unknown man proved to be Kinsman’s +brother, who had come down from Boston with him. Kinsman had visited his +native city before returning to New York, but had escaped the police net +there by stopping at a hotel and sending for his brother. He sent a grip +home by this brother, and it was afterward found to contain three +packages of bills of $250 each in the original wrappers of the bank. + +As soon as word of these arrests was telephoned to Police Headquarters, +the other traps were sprung. Detectives brought in Montani, Jess +Albrazzo and Myrtle Horn, the latter, with Annie, being held as +witnesses. + +------------------------------------------------------------------------ + + + + + CHAPTER III + HOW THE CRIME WAS HANDLED BY THE POLICE—THE CONFESSIONS + + +Now begins some of the most interesting work connected with the taxicab +case—the examination of the first prisoners, which led to confessions, +the implication of other guilty persons not yet under arrest, and the +voluntary pleas of guilty in court which saved costly trials in all but +Montani’s case. + +This sort of work is familiar under the term of “third degree.” It is +popularly supposed to be accompanied by force and sometimes +brutality—and in wrong hands often is. Commissioner Dougherty’s +experience with a commercial detective agency, however, has led him to +develop intelligent methods. The commercial detective organization has +none of the authority of an official police force, and at the same time, +through its national operations and the general character of its work, +deals chiefly with the most accomplished criminals. Therefore, tact and +legal subtilty are depended upon in examining suspects, and the +Commissioner long ago learned to get his results mainly by straight +question and answer. He puts his own wits against those of the suspect, +backed by experience in many other cases. He has a practical grasp of +criminal psychology, as well as many ingenious ways of using evidence to +the best purpose, overwhelming the suspect, and breaking down stolidity +and deception. Dougherty is not only opposed to force in the “third +degree,” but knows that it is of absolutely no use. + +The first prisoner examined was Eddie Kinsman. + +When he was brought to Police Headquarters Kinsman appeared to be +thoroughly satisfied with himself, and confident that no policeman would +get anything out of _him_. He proved to be a good-looking young fellow, +of athletic build, and by no means a fool. + +Methods of examination are never twice alike, for they depend upon the +case and the suspect. As a rule, however, when the criminal first sits +down to answer Commissioner Dougherty he is astonished by that +gentleman’s apparent lack of guile, and ignorance of worldly knowledge. +When Dougherty composes himself for an inquiry, he is rather a +heavy-looking citizen, not unlike a country magistrate, and his first +questions, put for the purpose of determining the suspect’s character +and previous surroundings, usually relate to bald routine matters, such +as name, age, residence, education, family, and so on. + +“Gee!” thinks the suspect, “This guy is the biggest lobster I ever got +up against! I wonder how he ever got to be a police commissioner. He +must have a strong political pull.” + +Kinsman was ushered into a large, quiet office, where this bureaucratic +official began by asking his name, birthplace and other details. + +“Will you kindly stand up a minute while I get your height?” asked the +questioner, and Kinsman did so in a patronizing way. Then the +dull-looking gentleman turned back Kinsman’s coat and looked at the +little label sewed in the inside pocket. + +“I see that you have been in Chicago recently,” he observed. “This suit +was made by a tailor there. You ordered it February 17th, two days after +the robbery.” + +He looked into Kinsman’s hat. + +“That was bought in Chicago, too.” + +He examined the label on Kinsman’s tie. + +“This was also bought in Chicago.” + +He turned up the label at the back of the neck of the new silk +underclothes worn by the prisoner. + +“Those were bought in State street, Chicago, and from a very good store, +too—I know it well.” + +Kinsman now began to be pugnacious and defiant. + +“See here!” he said, “You must take me for a boob.” + +“Yes, I think you are a boob,” replied the Commissioner. “You might as +well have made your getaway with a brass band as to take Swede Annie +with you to Albany, attracting attention all the way, and then send her +back to New York with a hundred dollars to tell the police where you had +gone.” + +Suddenly Lieutenant Riley, personal aide, walked into the Commissioner’s +office carrying a cheap article of millinery—a shabby black velvet hat +with a row of little red roses across the front. Commissioner Dougherty +apparently grew very angry. + +“What do you mean by bringing that thing in here now?” he exclaimed. “I +am not ready for that—take it away.” + +This “shot” had been previously arranged, of course, but Riley pretended +to be injured when called by his superior. + +“Cripes!” exclaimed Kinsman. “Annie’s old hat. How did you get that so +quick?” + +“Oh, that is only one thing we’ve got on you,” replied the Commissioner. +“We know that you went to Peekskill in a taxicab with Annie and Splaine +on the afternoon of the robbery. We know that you took Train 13 to +Albany, and where you stopped that night, and where you bought Annie’s +new hat, and how much you paid for it, and what train you took to +Chicago Friday noon. Suppose you tell me something more about your +movements?” + +Kinsman became scornful. + +“If you know all that,” he said, “maybe you know more about where I went +and what I did than I do myself. So what would be the use of me telling +_you_ anything?” + +While certain people were being found outside, the Commissioner worked +upon the prisoner along another line. Enough of Kinsman’s personality +was now disclosed to show that he was vain and egotistical. This side of +his nature was therefore fed with flattery. He was assured that the +taxicab robbery had been a wonderful “stick-up.” Everybody in New York +had been astonished. The whole country was talking about it, and about +him. He must be an awfully bright, cunning fellow to have planned and +carried out such a piece of crime. + +Kinsman warmed up genially under this admiration, and seemed to be more +confident than ever that so shrewd a young man as himself would have +little difficulty in fooling the police. + +But presently self-satisfaction was subjected to shock after shock. + +Detectives were bringing in Montani, Myrtle Hoyt, Rose Levy, Mrs. +Sullivan, the landlady with whom Kinsman had lived, and her housekeeper. +Jess Albrazzo was under arrest. Kinsman’s brother was there for +examination, and Inspector Hughes and Lieutenant Riley were bringing in +startling intelligence every few minutes. + +The housekeeper was ushered in, and told how Kinsman had given her five +dollars from a huge roll of bills before leaving for Peekskill. + +Commissioner Waldo came in and sat while Mrs. Sullivan told what she +knew about her late lodger. + +Kinsman’s brother gave information about the former’s movements from the +time he had arrived in Boston until he brought him to New York to have a +good time, and Kinsman knew that at the home of his parents in Boston +the police would surely find money in the original wrappers of the bank. + +The prisoner was put under pressure to explain how a man like himself, +known to be working as a waiter in a cheap resort, could suddenly have +come into possession of such sums. Statements from the women in the case +had been secured, and were produced, and finally Kinsman was brought to +detailed admissions, one by one. He agreed that it was true he had gone +to Peekskill in a taxicab with Annie and Splaine, that he had gone to +Albany, had bought Annie a hat there, had gone to Chicago, and so forth. +Opportunities were given him to see Montani and Jess, under arrest. +Nothing but the truth was told him, yet by degrees he was led to see +himself surrounded on all sides by evidence and confessing accomplices. +At last he broke down completely, his vain self-confidence destroyed, +and made a detailed confession. + +Kinsman’s story brought up fresh circumstances and new actors in the +taxicab case. + +He told how he had come to New York nine months before, to have a good +time and make money, and how, after going penniless and hungry, and +getting a few dollars for taking part in a boxing match, he had become a +waiter at the “Nutshell Café.” There he soon made the acquaintance of +criminals, meeting Gene Splaine, “Dutch” Keller, “Joe the Kid,” “Scotty +the Lamb” and other characters who were afterward to assist in the taxi +robbery. There he also met “Swede Annie” and became her sweetheart, and +finally, Jess Albrazzo, a dark little Italian who seemed to exert marked +influence over all the others. It was from Jess that Kinsman first heard +about the plan to rob a taxicab carrying money to a bank. This “swell +job” was discussed, and Jess told him he had a friend named Montani who +carried the bank’s cash, and would cooperate in stealing it. The job +would be easy, because Montani would run the cab through a side street, +and the only guard was an old man and a boy, neither of them armed. + +One Sunday night, two weeks before the crime, Jess took Kinsman and +other accomplices over the route, after all had drunk themselves into +optimistic mood, and pointed out the bank from which the money was +drawn, the streets through which Montani would run, the place where the +gang could board the cab, and the point at which they could leave it and +escape uptown. Details were discussed. There was a difference of opinion +as to methods, and the plotters parted that night with the understanding +that each would submit his own ideas of how the robbery could be most +effectively and safely carried out. Eventually there was a definite +agreement as to boarding the cab, preventing an outcry, making the +getaway and splitting up the money. + +According to Montani’s information, the bank messengers usually carried +between $75,000 and $100,000. When the day for the robbery had been set, +word suddenly came that there would not be so large a sum. This was +disappointing, but the gang decided to put their project through, +nevertheless. Kinsman was busy at the café, where he worked until four +o’clock on the morning of February 15, and “Dutch” called for him +several times, asking if he was going to “lay down on the job.” Finally +Kinsman got away, went to a room in a lodging house taken by “Dutch,” +and found the gang all there smoking and drinking. At five o’clock they +all went to sleep. At eight everybody was awakened. “Dutch” and Splaine +took blackjacks, and offered Kinsman a revolver, which he refused, +saying he could take care of himself with his hands, being a boxer. +There were six in the party—Kinsman, “Dutch,” Splaine, “Joe the Kid,” +Jess and “Scotty the Lamb,” whose part was to stumble in front of +Montani’s cab at the place selected for the boarding, and thus give the +chauffeur a colorable reason for slackening speed if eye-witnesses +afterward called his honesty into question. The gang had breakfast in a +cheap restaurant, stopped for a drink at the saloon of “Jimmie the Push” +in Thompson street, where the booty was to be divided, and proceeded +downtown, after parting with Jess. The latter was the organizer, and +took no part in the robbery; as he explained, he was known as a friend +of Montani’s, and wanted to arrange so that he could prove an alibi if +suspected, proving that he had not been near the scene of the crime when +it was committed. + +------------------------------------------------------------------------ + +[Illustration: “Scotty” Receives Final Instructions] + +------------------------------------------------------------------------ + +At that saloon they had met a trio of Italian criminals known as the +“Three Brigands,” who said they were not to take part in the robbery, +but would be on hand to see that it was vigorously put through. + +Arrived upon the ground, at Church street and Trinity Place, Splaine and +Kinsman waited on the west side of the thoroughfare, while “Dutch” and +“Joe the Kid” stood on the opposite side. “Scotty the Lamb” posted +himself fifty feet off. + +As Montani’s cab came speeding along, “Dutch” raised his hat as a +signal. “Scotty the Lamb” did not have time to step in front of the +vehicle before it slackened, and the robbers were aboard. “Dutch” opened +one door and struck the old bank teller, Wilbur Smith, and “Joe the Kid” +boosted Splaine in on the other side, where he assaulted young Wardle. +Kinsman mounted the seat beside Montani, and the latter put on full +speed, telling Kinsman to point his finger at his side as though he had +a revolver. The cab slipped past trucks and dodged pedestrians. Kinsman +said he seemed to see policemen everywhere, and was dazed when the +vehicle stopped at Park Place and Church street. All the criminals got +off there, “Dutch” lugging the brown bag containing the money. Splaine +and “Dutch” were both covered with the bank guards’ blood. Taking +Kinsman, they jumped aboard a street car. It was crowded. Several +passengers noticed the bloody men, but were told that there had been a +fight, and the occurrence was not reported to the police. After riding +two or three blocks they got off, boarded an elevated train, rode to +Bleeker street, and went to a back room in “Jimmie the Push’s” saloon, +where the money was to be divided. Here they found Jess and the “Three +Brigands,” and the latter now set up a claim for a share in the booty. +Matteo, leader of the trio, pulled out a revolver, and there was a +discussion. Finally the bag was opened, and found to contain $25,000. +There were three packages of $5,000 each and one of $10,000. Matteo +grabbed the latter package, saying that his gang was to get $3,000 +apiece, and that the odd $1,000 would go for “fall money” to get Molloy +out of jail in Brooklyn. The robbers then divided the remainder, Jess +taking $3,000 for himself and another $3,000 for Montani, Splaine +getting $3,000, Kinsman $2,750, “Joe the Kid” $250 and “Scotty the Lamb” +nothing. Kinsman then told how he had called for Swede Annie, and left +town in a taxicab, going as far as Peekskill, to avoid the police at the +Grand Central Station. + + + _Jess Confesses and Assists_ + +The next prisoner examined was Jess Albrazzo, a dark little Italian, who +appeared to be somewhat ignorant. + +In this examination the Commissioner had ample outside proof, and he +also employed what he calls his “psychological study.” Years ago, in +dealing with negro suspects in Southern crime, Dougherty devised a +little instrument which he dubbed his “lie watch.” This was a dial with +a needle, hung round the suspect’s neck. If the latter told the truth, +the needle presumably pointed to “Truth,” and if he didn’t, it pointed +to “Lie.” Being out of the suspect’s sight, it had a strong effect. + +From that, Dougherty went into studies of the mental states of suspects +under examination, and found rough physiological indications which he +uses as a guide to the integrity of the suspect. Investigations of +European criminal experts like Professor Hans Gross amply demonstrate +that there is a real scientific basis for such methods. + +Dougherty took it a little easier with Jess. They sat down, and the +Commissioner went over the Italian’s movements for the past few months, +showing him how thoroughly he was implicated. Jess had worked for +Montani, and been intimate with the rest of the taxicab “mob.” He and +Montani were confronted with each other, and points brought out in +Kinsman’s confession were skillfully used. + +At one point in this examination the Commissioner rose from his desk, +took the lobe of Jess’s ear between his thumb and finger, pinched it +slightly, looked at the ear closely, and then walked out of the room. + +Jess was all on edge with curiosity. + +“Why did he pinch my ear?” he asked of Lieutenant Riley. + +“To see if you are telling the truth,” was the answer, and in a moment +the Commissioner came back and examined that ear again. + +“Yes, he’s lying,” he declared. “Look at his ear—can’t you see it +yourself?” Others were invited to look at Jess’s ear, and the little +Italian became so curious that he actually tried to look around the side +of his skull and see his own ear! + +This psychological study was backed up with abundant proof that Jess had +not told the whole truth. Presently he weakened and confessed. He told +how he had handed $2,000 in a collar box to “Jimmie the Push” on the day +of the robbery, which was to be taken to a Bowery bank and put in a +safe-deposit vault for Montani. He agreed to accompany the police to +Jimmie’s place in Thompson street, and late that evening a party made up +of Commissioner Dougherty, Inspector Hughes and Lieutenant Riley went +there, taking Jess along. + +“Jimmie the Push’s” place is one of the most picturesque thieves’ +resorts in lower New York. + +“Typical of the old village,” as Dougherty puts it. “In fact, this whole +case has a strong flavor of the little old village of New York.” + +Jimmie was out when they got there, but this saloon was in charge of the +biggest, swarthiest Italian bartender in town, a tough Hercules weighing +somewhere around three hundred pounds. The room was crowded with motley +characters, drinking beverages known to the neighborhood as “shocks” and +“high hats.” For their edification, a tramp magician was taking coins +out of his ears, his nose and the air. + +Jess was not known to be under arrest, and immediately sent a boy called +“Reddy” to fetch the proprietor, who had known the three police officers +for years. Presently Reddy came back and said that Jimmie would come in +about half an hour, as he was playing cards and had a fine hand. + +Reddy was sent back to impress upon Jimmie that Jess wanted to see him +right away—it was very important. In about two minutes, just as the +Commissioner had bought a “high hat” for everybody in his party, Jimmie +appeared. He was told that Jess had got into trouble in connection with +the taxicab robbery, and asked about the money in the safe deposit +vault. “Jimmie the Push,” with his partner, Bob Deilio, had by this time +been implicated themselves, for it was clear that the money had been +divided in their resort, and that probably they had taken part in the +planning, and the decidedly one-sided division of the spoils. Jimmie was +led to believe that he did not rest under suspicion, however, and that +he was only asked to aid the police. He said Jess had handed him a +collar box on the day of the robbery, asking him to put it in a vault in +his own name, but that he had had no idea what the box contained, and +had left it lying behind the bar for a couple of days before he got a +chance to go to the bank with it. He readily promised to appear at +Police Headquarters the following morning, bring the key to the safe +deposit box, and help recover the money. Thereupon the police officials +bade him good night and went away. But no chances were taken on “Jimmie +the Push.” From that moment he was shadowed. + +That Monday was a busy day in many other ways. + +Developments came thick and fast. + +Kinsman’s home in Boston was visited, and $750 of the bank money +recovered in the original wrappers. It had laid in his grip, unknown to +the honest Kinsman family. + +Swede Annie, Myrtle Horn and a girl named Rose Levy were examined, +quickly broke down, and made tearful statements to be used in evidence. +These women were held only as witnesses, and as the case cleared up +after a few days’ detention, were released. + +The girl, Rose Levy, greatly attracted the Commissioner. She was only +nineteen years old, a mild-mannered little Jewess with jet black hair +and very remarkable eyes. The Commissioner went into details of her +personal story. It seems that she had left her home in Brooklyn two +months before, after a quarrel with her mother, and had come to New York +looking for a position. But she quickly fell into the lower world, +became known as Jess’s girl, and was ambitious to be “one of the gang.” +After a fatherly talk she was persuaded to return to her home and live a +decent life. But within a week she was back in New York again, in her +old haunts, trying to raise money to help Jess, for whom, she told the +Commissioner, she would willingly work for the rest of her days. + +Before visiting Jimmie’s saloon the Commissioner called up the “Orange +Growers” in Chicago, had a long talk with them, told what progress was +being made, and put new life into them. + + + _More Money Recovered_ + +True to his word, “Jimmie the Push” walked into Police Headquarters at +nine o’clock Tuesday morning, February 27, closely followed by his +unseen shadowers. He produced the key of the safe-deposit vault, and +went with officers to see the money recovered. There was $2,000, as Jess +had stated, still in the wrappers of the bank. Jimmie was still +permitted to go free, under the impression that he had come through the +ordeal “clean,” while fresh evidence was being obtained against him. + +That morning the Commissioner also took Kinsman down over the route of +the robbery, to have him explain it in his own way. This was done to +strengthen the case against Montani, and upset his story in court. + +Then “Scotty the Lamb” was located, arrested, brought to headquarters +and led to confess. “Scotty the Lamb” was in some respects a pathetic +figure in the case, and also a humorous one. He had been in charge of +the lunch kitchen at the Arch Café when Jess owned it, and later worked +as a dishwasher in a Washington Square hotel. A Scotch youth, from +Glasgow, he had been in this country about four years, and while no +criminal record appeared against him, he was plainly in the company of +thieves most of the time. According to his statement, he had been +promised $25 for doing some work for Jess, and without inquiring into +the nature of it at all, had shown up with the gang and gone along to do +his minor part of a “stall,” stumbling in front of the cab. But before +he could get out into the street, the cab had been boarded. So poor +“Scotty the Lamb,” without a nickel for carfare, plodded all the way +uptown again to the saloon where the money was to be divided, and got +nothing whatever. He was a cheerful soul, however, and the life of the +party when the gang was locked up, cracking jokes, and taking the view +that, as sentences ought to be proportioned to the amount of money each +member of the gang had got in the division, and he had got nothing, he +might be let off with six months’ imprisonment. + +“Scotty, haven’t you got any overcoat?” asked Inspector Hughes, +sympathetically, as they were going to court one brisk morning. “Did you +_ever_ have an overcoat, Scotty?” + +“No, sir, I never had an overcoat,” replied Scotty, and then as he +thought of his prospects for going to prison, added drolly, “And now I +don’t expect, sir, that I ever will!” + + + _The Fine Italian Hand_ + +The next step in the case was that of arresting “Jimmie the Push” and +his partner, Bob Deilio. + +Another phase of the robbery now began to come out plainly. + +Up to the present time the main burden of proof pointed to the four +“hold-up” men of American birth as the chief actors in the crime. +Montani and Jess, the two Italians, appeared to be accessories. + +But as the tangled threads were unravelled, one by one, it was found +that the Italians involved outnumbered the American thugs, and that +furthermore they had outwitted them. + +When Bob Deilio was arrested he drew $215 in five-dollar bills out of +his pocket and handed it to the police, admitting that it was part of +$5,500 of the stolen money. The rest, he asserted, had just been paid +for rent of the two resorts operated by “Jimmie the Push” and himself. + +Jimmie and Bob were taken to Police Headquarters and examined, with Jess +present. Commissioner Dougherty played one against the other so +skillfully, with cross-questions and counter pressure, that in a little +while each was excitedly telling tales on his two companions with the +desperate hope of clearing himself, and denunciations flew back and +forth among the trio as evidence came out that was likely to send them +all to prison. Their confessions were obtained, and used in a new effort +to break down Montani. But this was without results. The little Italian +chauffeur still stuck doggedly to his original story. + +From these new confessions it appeared that the Italians had planned the +crime, enlisted the American hold-up men to carry out the dirty work, +and laid a counter-plot for holding them up in turn when the money was +divided. The “Three Brigands” were ostensibly offered a chance to take +part in the actual robbery, but refused on the plea that it would be too +risky, and that they did not believe Montani could carry it out +successfully. On the morning of the crime they walked north over the +route. When they met the taxicab coming south, with a policeman on the +seat beside Montani and two unconscious bank messengers inside, they +knew that the project had succeeded. So the “Three Brigands” hurried +uptown to “Jimmie the Push’s” saloon. They got there so quickly that +they were ahead of the robbers. Jess made a rehearsed protest when they +insisted in sharing in the plunder, but the “Three Brigands” drew +revolvers, threatened to make a disturbance that would bring in the +police, and finally helped themselves to $10,000. When the thugs who had +done the actual work left the saloon, they had only $8,000 all told. The +Italians, who had “played safe” at every point, had $17,000. + +------------------------------------------------------------------------ + +[Illustration: “The Brigands” “Stick-up” the Hold-up Men for Theirs] + +------------------------------------------------------------------------ + + + _One of the Brigands Comes In_ + +The actual whereabouts of the “Three Brigands” was not known to the +police then. But there were certain channels through which news might +reach at least one of them. Word was sent through those channels, +therefore, that it might be best for them to appear and give an account +of themselves, and on Friday, March 1, just at the time Splaine had been +brought back from Memphis, the little leader of the brigands, Matteo +Arbrano, an undersized Italian wearing spectacles, who had carried out +the job of robbing the hold-up men, surrendered himself to the District +Attorney. + +Arbrano said that he had divided his $10,000 with his two companions, +Gonzales and Cavaquero, and immediately left New York, taking a steamer +for Mexico by way of Havana. At the latter city he stopped over night, +met a woman and accompanied her to a resort, was drugged and robbed of +$2,700, and woke on the Prado with only $100 left, a single bill that +had been concealed in his shoe. With that he returned to New York. The +story is regarded by the police as more picturesque than convincing. It +is probable that Matteo’s share of the plunder, with that of other +Italians involved, has been carefully “planted.” + +Pauli Gonzales, another of the brigands, was traced to Vera Cruz, +Mexico. In the present state of that country, however, it was found +impossible to arrest and extradite him upon the evidence at hand. + +Three other persons concerned in the robbery are still at large at this +writing—“Dutch” Keller, “Joe the Kid,” and an “unknown” whose identity +is concealed for police reasons. + +Montani pleaded “Not guilty,” and stood trial. After two days, exactly a +month and a day subsequent to the robbery, he was convicted by a jury, +and sentenced to not less than ten years and not more than eighteen +years and two months in prison, with hard labor. + +A word must be said about the prompt action of the District Attorney’s +office in the taxicab case. Where crime has had such publicity there is +an opportunity to make a demonstration of great value by pressing the +prosecutions. It was not lost. Under Assistant Charles C. Nott, Jr., +evidence was succinctly laid before judges and juries, the trials +finished in a matter of hours, and convictions and sentences secured +within six weeks after the robbery. Furthermore, the various sentences +were just, being carefully graded according to the part played by each +offender, his character and previous record, and his individual effort +in facilitating justice. + +------------------------------------------------------------------------ + + _Name_ _Arrested_ _Pleaded_ _Sentenced_ _Sentence_ + + MONTANI, GENO Feb. 26,’12 Feb. 29,’12 Mch. 16,’12 Not less than + 10 yrs. nor + more than 18 + yrs. 2 mos. + Judge + Seabury. + + KINSMAN, EDW. Feb. 26,’12 Mch. 1,’12 April 9,’12 Not less than 3 + yrs. nor more + than 6 yrs. + Judge Crain. + + SPLAINE, EUGENE Mch. 2,’12 Mch. 4,’12 Mch. 25,’12 Not less than 7 + yrs. 6 mos. + nor more than + 14 yrs. 6 + mos. Judge + Seabury. + + DELIO, ROBERT Feb. 28,’12 Mch. 4,’12 Mch. 29,’12 Not less than 2 + yrs. 6 mos. + nor more than + 4 yrs. 2 mos. + Judge + Seabury. + + PASQUALE, JAMES Feb. 28,’12 Mch. 4,’12 April 8,’12 6 mos. + (“Jimmie the Penitent’ry. + Push”) Judge Davis. + + LAMB, JOSEPH Feb. 27,’12 Mch. 18,’12 Mch. 29,’12 Indeterminate + (“Scotty the sentence, + Lamb”) Elmira. Judge + Seabury. + + ARBRANO, MATTEO Mch. 2,’12 April 3,’12 2 to 4 years. + Judge Davis. + + ALBRAZZO, JESS Mch. 26,’12 Mch. 18,’12 3 to 6 years. + Judge Davis. + +------------------------------------------------------------------------ + + + + + FINAL + A WORD ABOUT THE NEW YORK POLICE + + +It has been the writer’s good fortune to look into the work of both the +London and the New York policemen recently, within the same year. + +A somewhat embarrassing point arose. + +In London, the “bobby” was anxious to know which police force the writer +considered best. The “bobby” gets his ideas of the New York “cop” from +such accounts as filter through the cable dispatches from our +newspapers. He hears chiefly the worst, and pictures the “cop” as a +lawless individual, wielding pistol and club indiscriminately, with whom +it is not safe to pass a civil word. So, when he puts his little +question about the respective merits of the two organizations, he +reserves the right to keep his opinion that the London force is best +anyway. + +In New York, it is much the same. The “cop” has heard just enough about +the “bobby” to regard him with mild tolerance. He pictures him as a +policeman servile to the last degree, thankfully accepting sixpenny tips +from pedestrians, and occupied chiefly with unarmed thieves and harmless +political offenders. + +When one has good friends in both forces, the question “Which do you +think best?” is to be met with tactful evasions. And the more one thinks +it over, the more it becomes clear that there is really little +difference at bottom. Both police organizations are made up of good men, +following the same trade along the same lines, and dealing with about +the same general conditions. + +The London “bobby,” however, enjoys excellent leadership, is governed by +a definite administrative policy, has the backing of the courts, and +therefore comes in for a general public good will which is exceedingly +useful to him in the performance of duty. + +The New York “cop” rather lacks public good will. Administrative policy +has not been well defined in the past. The courts do not always accept +his evidence, much less back him up, and he has been made the scapegoat +for various shortcomings in leadership. + +But to-day the New York policeman is working on an entirely new basis. +Before long his public is certain to understand and like him as +thoroughly as London does its “bobby.” + +The change began with Mayor Gaynor, who insisted that both policeman and +citizen have plain legal rights—until the citizen has committed a crime +the policeman may not arrest him. The policeman has plain rights—the law +empowers him to use all necessary force in making arrests in grave +cases. But force must not be used for minor offenses. Confusion existed +on these points to such a degree that when the Mayor began insisting +upon them, many people thought he was putting into effect some of his +personal whims. But they are all in the statute books, and many of them +were there before the Mayor was born, because they are constitutional. + +The present Police Commissioner, Rhinelander Waldo, is not only +administering the department along the strict legal line pointed out by +the Mayor, but is effecting improvements of organization and method that +must favorably alter the whole future of the service. + +Commissioner Waldo is a soldier, with a record of service in the United +States Army, and the Army’s fine standards to guide him. + +In some ways the administration of the New York Police Department is a +soldier’s job. If the ten thousand members were mobilized, they would +make quite an impressive little standing army, with eight or ten full +regiments of patrolmen, a brigade of cavalry, a small transport corps, a +little navy, and so forth. As in an army, too, the men are enlisted, and +may only be discharged for serious offenses. It is a force scattered +over three hundred square miles of territory. The leader must be +skillful in laying down regulations, and handling men in the mass rather +than by personal contact. He must define duty plainly, hold everybody to +it, eliminate departmental politics and abuses. Every man, wherever he +is stationed, must feel that the general knows his business, that he +lays down regulations for good reasons, and that day by day he is taking +the organization somewhere. + +For years, every Police Commissioner has asked for more men to keep pace +with the growing city. When Waldo took charge he asked, too. While he +was waiting, however, he overhauled the organization and got one +thousand additional patrolmen by cutting off men detailed for clerical +and other special duty. Every large working force tends to create +superfluous routine work. The useless routine was eliminated by better +accounting methods, and the men sent back to do the street duty for +which they originally enlisted. + +Then Waldo’s system of “fixed posts” was introduced. Complaints that +policemen were hard to find at night had become common. So the platoon +on duty from 11 p. m. to 7 a. m. was distributed by a plan under which +the men work in pairs, one patrolling a given beat and the other +standing on a street intersection. Each hour they change places, or +oftener in severe weather. The fixed posts are about a thousand feet +apart all over Manhattan and parts of Brooklyn. The system has been +indiscriminately criticised, but produces its results. Fire losses were +cut down the first six months, night crime has decreased, and many +notable arrests are due to the fact that policemen stand all over town +like checkers through the night. The exposure is no greater than that +endured by traffic men. The men have better opportunities to advance +themselves by making meritorious arrests, and the Commissioner knows +that, as citizens see the police on duty, night after night, and crime +decreases, there will be a growing good will for the department. + +The Detective Bureau has not only been reorganized so that plain-clothes +men are distributed over the whole city, but a new spirit has been +introduced. Formerly, when the patrolman rose to detective rank, he felt +that he had “arrived.” No longer wearing the uniform or keeping +scheduled hours, he was in danger of going to sleep. To-day, however, +the detective has, not a job, but an opportunity. He must maintain his +rank by results, or be reduced. To help him do this, he is taught +methods in the school for detectives. But he knows that hundreds of +ambitious men in brass buttons are working to attain that rank. + +In an organization of ten thousand men, it would be strange if there +were not some intriguing and politics. New York policemen are +exceptionally shrewd, and occasionally they will try to “put one over” +on the Commissioner, going around his authority. But Commissioner Waldo +has proved singularly resourceful. He meets such an emergency with the +quickness, certainty and impartiality of a natural force like gravity, +and the department has found it out. + +He has laid out a clear path for advancement all through the department. +The newest uniformed patrolman understands that, for meritorious work, +he will have a chance of promotion. If he makes a commendable arrest, he +is sent to the Detective Bureau, given instruction, and tried at +detective work. If he makes good, he stays. If unfitted for +plain-clothes duty, he has still had his chance. What is just as +important, the Detective Bureau has had a chance to see him. + +Under Commissioner Waldo and Deputy Commissioner Dougherty, the +so-called “Black Hand” crimes among Italians have been checked, and will +be stopped. Many of these cases were traced to sensational reporting of +ordinary quarrels and assaults, and others to business rivalries. In the +serious cases, arrests have been made and convictions secured. + +Another well-known form of law-breaking in New York is gambling. This is +particularly difficult to check because of ingenuity in concealing +evidence, developed by long experience on the part of the law-breakers, +and also the strong political alliances of gambling-house keepers. But +after several experiments in dealing with it, the Commissioner now feels +confident that he has a method which will result in the suppression of +gambling, and that, as he says, “When you put a crimp into things of +that sort they don’t generally come back.” + +In other directions red tape has been abolished and economies brought +about; the way has been opened for individual merit in all ranks; steps +have been taken to develop and teach better methods; the work of the +department has been brought closer to the public. There is a new spirit +in the New York Police Department to-day—a spirit certain to develop the +public good will and appreciation that is so necessary to the best order +of public service. + + * * * * * + + SOME INTERESTING FACTS ABOUT THE POLICE + DEPARTMENT OF THE CITY OF NEW YORK + +The Police Department of the City of New York is made up as follows: + + Commissioner and four Deputy Commissioners + + 19 Inspectors + + 25 Surgeons + + 95 Captains + + 624 Lieutenants + + 586 Sergeants + + 8,585 Patrolmen + + 191 Doormen + + 69 Matrons + + 1 Superintendent of Telegraph + + 2 Assistant Superintendents of Telegraph + + 1 Chief Lineman + + 5 Linemen + + 2 Boiler Inspectors + + ------ + + 10,207 Total uniform force + +Of this number, 500 are detectives in civilian dress. + +In addition, there are over 247 civilians employed in clerical capacity. + +There are 6 automobiles and 161 other vehicles, including patrol wagons, +used by the Department. Also 679 horses for mounted patrolmen. + +The Harbor Squad numbers: 1 Captain, 7 Lieutenants, 9 Sergeants, 36 +Patrolmen, 2 Doormen, besides civilians employed as engineers, firemen, +oilers, deck-hands, etc. + +It is provided with one vessel of 235 tons, five launches, two dories, +and six boats. + +These boats patrol about 340 miles of water front. + + + + + +End of Project Gutenberg's The Great Taxicab Robbery, by James H. Collins + +*** END OF THIS PROJECT GUTENBERG EBOOK THE GREAT TAXICAB ROBBERY *** + +***** This file should be named 53145-0.txt or 53145-0.zip ***** +This and all associated files of various formats will be found in: + http://www.gutenberg.org/5/3/1/4/53145/ + +Produced by ellinora and The Online Distributed Proofreading +Team at http://www.pgdp.net (This file was produced from +images generously made available by The Internet Archive) + +Updated editions will replace the previous one--the old editions will +be renamed. + +Creating the works from print editions not protected by U.S. copyright +law means that no one owns a United States copyright in these works, +so the Foundation (and you!) can copy and distribute it in the United +States without permission and without paying copyright +royalties. Special rules, set forth in the General Terms of Use part +of this license, apply to copying and distributing Project +Gutenberg-tm electronic works to protect the PROJECT GUTENBERG-tm +concept and trademark. Project Gutenberg is a registered trademark, +and may not be used if you charge for the eBooks, unless you receive +specific permission. If you do not charge anything for copies of this +eBook, complying with the rules is very easy. You may use this eBook +for nearly any purpose such as creation of derivative works, reports, +performances and research. They may be modified and printed and given +away--you may do practically ANYTHING in the United States with eBooks +not protected by U.S. copyright law. Redistribution is subject to the +trademark license, especially commercial redistribution. + +START: FULL LICENSE + +THE FULL PROJECT GUTENBERG LICENSE +PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK + +To protect the Project Gutenberg-tm mission of promoting the free +distribution of electronic works, by using or distributing this work +(or any other work associated in any way with the phrase "Project +Gutenberg"), you agree to comply with all the terms of the Full +Project Gutenberg-tm License available with this file or online at +www.gutenberg.org/license. + +Section 1. General Terms of Use and Redistributing Project +Gutenberg-tm electronic works + +1.A. By reading or using any part of this Project Gutenberg-tm +electronic work, you indicate that you have read, understand, agree to +and accept all the terms of this license and intellectual property +(trademark/copyright) agreement. If you do not agree to abide by all +the terms of this agreement, you must cease using and return or +destroy all copies of Project Gutenberg-tm electronic works in your +possession. If you paid a fee for obtaining a copy of or access to a +Project Gutenberg-tm electronic work and you do not agree to be bound +by the terms of this agreement, you may obtain a refund from the +person or entity to whom you paid the fee as set forth in paragraph +1.E.8. + +1.B. "Project Gutenberg" is a registered trademark. It may only be +used on or associated in any way with an electronic work by people who +agree to be bound by the terms of this agreement. There are a few +things that you can do with most Project Gutenberg-tm electronic works +even without complying with the full terms of this agreement. See +paragraph 1.C below. There are a lot of things you can do with Project +Gutenberg-tm electronic works if you follow the terms of this +agreement and help preserve free future access to Project Gutenberg-tm +electronic works. See paragraph 1.E below. + +1.C. The Project Gutenberg Literary Archive Foundation ("the +Foundation" or PGLAF), owns a compilation copyright in the collection +of Project Gutenberg-tm electronic works. Nearly all the individual +works in the collection are in the public domain in the United +States. If an individual work is unprotected by copyright law in the +United States and you are located in the United States, we do not +claim a right to prevent you from copying, distributing, performing, +displaying or creating derivative works based on the work as long as +all references to Project Gutenberg are removed. Of course, we hope +that you will support the Project Gutenberg-tm mission of promoting +free access to electronic works by freely sharing Project Gutenberg-tm +works in compliance with the terms of this agreement for keeping the +Project Gutenberg-tm name associated with the work. You can easily +comply with the terms of this agreement by keeping this work in the +same format with its attached full Project Gutenberg-tm License when +you share it without charge with others. + +1.D. The copyright laws of the place where you are located also govern +what you can do with this work. Copyright laws in most countries are +in a constant state of change. If you are outside the United States, +check the laws of your country in addition to the terms of this +agreement before downloading, copying, displaying, performing, +distributing or creating derivative works based on this work or any +other Project Gutenberg-tm work. The Foundation makes no +representations concerning the copyright status of any work in any +country outside the United States. + +1.E. Unless you have removed all references to Project Gutenberg: + +1.E.1. The following sentence, with active links to, or other +immediate access to, the full Project Gutenberg-tm License must appear +prominently whenever any copy of a Project Gutenberg-tm work (any work +on which the phrase "Project Gutenberg" appears, or with which the +phrase "Project Gutenberg" is associated) is accessed, displayed, +performed, viewed, copied or distributed: + + This eBook is for the use of anyone anywhere in the United States and + most other parts of the world at no cost and with almost no + restrictions whatsoever. You may copy it, give it away or re-use it + under the terms of the Project Gutenberg License included with this + eBook or online at www.gutenberg.org. If you are not located in the + United States, you'll have to check the laws of the country where you + are located before using this ebook. + +1.E.2. If an individual Project Gutenberg-tm electronic work is +derived from texts not protected by U.S. copyright law (does not +contain a notice indicating that it is posted with permission of the +copyright holder), the work can be copied and distributed to anyone in +the United States without paying any fees or charges. If you are +redistributing or providing access to a work with the phrase "Project +Gutenberg" associated with or appearing on the work, you must comply +either with the requirements of paragraphs 1.E.1 through 1.E.7 or +obtain permission for the use of the work and the Project Gutenberg-tm +trademark as set forth in paragraphs 1.E.8 or 1.E.9. + +1.E.3. If an individual Project Gutenberg-tm electronic work is posted +with the permission of the copyright holder, your use and distribution +must comply with both paragraphs 1.E.1 through 1.E.7 and any +additional terms imposed by the copyright holder. Additional terms +will be linked to the Project Gutenberg-tm License for all works +posted with the permission of the copyright holder found at the +beginning of this work. + +1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm +License terms from this work, or any files containing a part of this +work or any other work associated with Project Gutenberg-tm. + +1.E.5. Do not copy, display, perform, distribute or redistribute this +electronic work, or any part of this electronic work, without +prominently displaying the sentence set forth in paragraph 1.E.1 with +active links or immediate access to the full terms of the Project +Gutenberg-tm License. + +1.E.6. You may convert to and distribute this work in any binary, +compressed, marked up, nonproprietary or proprietary form, including +any word processing or hypertext form. However, if you provide access +to or distribute copies of a Project Gutenberg-tm work in a format +other than "Plain Vanilla ASCII" or other format used in the official +version posted on the official Project Gutenberg-tm web site +(www.gutenberg.org), you must, at no additional cost, fee or expense +to the user, provide a copy, a means of exporting a copy, or a means +of obtaining a copy upon request, of the work in its original "Plain +Vanilla ASCII" or other form. Any alternate format must include the +full Project Gutenberg-tm License as specified in paragraph 1.E.1. + +1.E.7. Do not charge a fee for access to, viewing, displaying, +performing, copying or distributing any Project Gutenberg-tm works +unless you comply with paragraph 1.E.8 or 1.E.9. + +1.E.8. You may charge a reasonable fee for copies of or providing +access to or distributing Project Gutenberg-tm electronic works +provided that + +* You pay a royalty fee of 20% of the gross profits you derive from + the use of Project Gutenberg-tm works calculated using the method + you already use to calculate your applicable taxes. The fee is owed + to the owner of the Project Gutenberg-tm trademark, but he has + agreed to donate royalties under this paragraph to the Project + Gutenberg Literary Archive Foundation. Royalty payments must be paid + within 60 days following each date on which you prepare (or are + legally required to prepare) your periodic tax returns. Royalty + payments should be clearly marked as such and sent to the Project + Gutenberg Literary Archive Foundation at the address specified in + Section 4, "Information about donations to the Project Gutenberg + Literary Archive Foundation." + +* You provide a full refund of any money paid by a user who notifies + you in writing (or by e-mail) within 30 days of receipt that s/he + does not agree to the terms of the full Project Gutenberg-tm + License. You must require such a user to return or destroy all + copies of the works possessed in a physical medium and discontinue + all use of and all access to other copies of Project Gutenberg-tm + works. + +* You provide, in accordance with paragraph 1.F.3, a full refund of + any money paid for a work or a replacement copy, if a defect in the + electronic work is discovered and reported to you within 90 days of + receipt of the work. + +* You comply with all other terms of this agreement for free + distribution of Project Gutenberg-tm works. + +1.E.9. If you wish to charge a fee or distribute a Project +Gutenberg-tm electronic work or group of works on different terms than +are set forth in this agreement, you must obtain permission in writing +from both the Project Gutenberg Literary Archive Foundation and The +Project Gutenberg Trademark LLC, the owner of the Project Gutenberg-tm +trademark. Contact the Foundation as set forth in Section 3 below. + +1.F. + +1.F.1. Project Gutenberg volunteers and employees expend considerable +effort to identify, do copyright research on, transcribe and proofread +works not protected by U.S. copyright law in creating the Project +Gutenberg-tm collection. Despite these efforts, Project Gutenberg-tm +electronic works, and the medium on which they may be stored, may +contain "Defects," such as, but not limited to, incomplete, inaccurate +or corrupt data, transcription errors, a copyright or other +intellectual property infringement, a defective or damaged disk or +other medium, a computer virus, or computer codes that damage or +cannot be read by your equipment. + +1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the "Right +of Replacement or Refund" described in paragraph 1.F.3, the Project +Gutenberg Literary Archive Foundation, the owner of the Project +Gutenberg-tm trademark, and any other party distributing a Project +Gutenberg-tm electronic work under this agreement, disclaim all +liability to you for damages, costs and expenses, including legal +fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT +LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE +PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE THAT THE FOUNDATION, THE +TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE +LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR +INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH +DAMAGE. + +1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a +defect in this electronic work within 90 days of receiving it, you can +receive a refund of the money (if any) you paid for it by sending a +written explanation to the person you received the work from. If you +received the work on a physical medium, you must return the medium +with your written explanation. The person or entity that provided you +with the defective work may elect to provide a replacement copy in +lieu of a refund. If you received the work electronically, the person +or entity providing it to you may choose to give you a second +opportunity to receive the work electronically in lieu of a refund. If +the second copy is also defective, you may demand a refund in writing +without further opportunities to fix the problem. + +1.F.4. Except for the limited right of replacement or refund set forth +in paragraph 1.F.3, this work is provided to you 'AS-IS', WITH NO +OTHER WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PURPOSE. + +1.F.5. Some states do not allow disclaimers of certain implied +warranties or the exclusion or limitation of certain types of +damages. If any disclaimer or limitation set forth in this agreement +violates the law of the state applicable to this agreement, the +agreement shall be interpreted to make the maximum disclaimer or +limitation permitted by the applicable state law. The invalidity or +unenforceability of any provision of this agreement shall not void the +remaining provisions. + +1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the +trademark owner, any agent or employee of the Foundation, anyone +providing copies of Project Gutenberg-tm electronic works in +accordance with this agreement, and any volunteers associated with the +production, promotion and distribution of Project Gutenberg-tm +electronic works, harmless from all liability, costs and expenses, +including legal fees, that arise directly or indirectly from any of +the following which you do or cause to occur: (a) distribution of this +or any Project Gutenberg-tm work, (b) alteration, modification, or +additions or deletions to any Project Gutenberg-tm work, and (c) any +Defect you cause. + +Section 2. Information about the Mission of Project Gutenberg-tm + +Project Gutenberg-tm is synonymous with the free distribution of +electronic works in formats readable by the widest variety of +computers including obsolete, old, middle-aged and new computers. It +exists because of the efforts of hundreds of volunteers and donations +from people in all walks of life. + +Volunteers and financial support to provide volunteers with the +assistance they need are critical to reaching Project Gutenberg-tm's +goals and ensuring that the Project Gutenberg-tm collection will +remain freely available for generations to come. In 2001, the Project +Gutenberg Literary Archive Foundation was created to provide a secure +and permanent future for Project Gutenberg-tm and future +generations. To learn more about the Project Gutenberg Literary +Archive Foundation and how your efforts and donations can help, see +Sections 3 and 4 and the Foundation information page at +www.gutenberg.org + + + +Section 3. Information about the Project Gutenberg Literary Archive Foundation + +The Project Gutenberg Literary Archive Foundation is a non profit +501(c)(3) educational corporation organized under the laws of the +state of Mississippi and granted tax exempt status by the Internal +Revenue Service. The Foundation's EIN or federal tax identification +number is 64-6221541. Contributions to the Project Gutenberg Literary +Archive Foundation are tax deductible to the full extent permitted by +U.S. federal laws and your state's laws. + +The Foundation's principal office is in Fairbanks, Alaska, with the +mailing address: PO Box 750175, Fairbanks, AK 99775, but its +volunteers and employees are scattered throughout numerous +locations. Its business office is located at 809 North 1500 West, Salt +Lake City, UT 84116, (801) 596-1887. Email contact links and up to +date contact information can be found at the Foundation's web site and +official page at www.gutenberg.org/contact + +For additional contact information: + + Dr. Gregory B. Newby + Chief Executive and Director + gbnewby@pglaf.org + +Section 4. Information about Donations to the Project Gutenberg +Literary Archive Foundation + +Project Gutenberg-tm depends upon and cannot survive without wide +spread public support and donations to carry out its mission of +increasing the number of public domain and licensed works that can be +freely distributed in machine readable form accessible by the widest +array of equipment including outdated equipment. Many small donations +($1 to $5,000) are particularly important to maintaining tax exempt +status with the IRS. + +The Foundation is committed to complying with the laws regulating +charities and charitable donations in all 50 states of the United +States. Compliance requirements are not uniform and it takes a +considerable effort, much paperwork and many fees to meet and keep up +with these requirements. We do not solicit donations in locations +where we have not received written confirmation of compliance. To SEND +DONATIONS or determine the status of compliance for any particular +state visit www.gutenberg.org/donate + +While we cannot and do not solicit contributions from states where we +have not met the solicitation requirements, we know of no prohibition +against accepting unsolicited donations from donors in such states who +approach us with offers to donate. + +International donations are gratefully accepted, but we cannot make +any statements concerning tax treatment of donations received from +outside the United States. U.S. laws alone swamp our small staff. + +Please check the Project Gutenberg Web pages for current donation +methods and addresses. Donations are accepted in a number of other +ways including checks, online payments and credit card donations. To +donate, please visit: www.gutenberg.org/donate + +Section 5. General Information About Project Gutenberg-tm electronic works. + +Professor Michael S. Hart was the originator of the Project +Gutenberg-tm concept of a library of electronic works that could be +freely shared with anyone. For forty years, he produced and +distributed Project Gutenberg-tm eBooks with only a loose network of +volunteer support. + +Project Gutenberg-tm eBooks are often created from several printed +editions, all of which are confirmed as not protected by copyright in +the U.S. unless a copyright notice is included. Thus, we do not +necessarily keep eBooks in compliance with any particular paper +edition. + +Most people start at our Web site which has the main PG search +facility: www.gutenberg.org + +This Web site includes information about Project Gutenberg-tm, +including how to make donations to the Project Gutenberg Literary +Archive Foundation, how to help produce our new eBooks, and how to +subscribe to our email newsletter to hear about new eBooks. + diff --git a/examples/change_case/workflow-test.yml b/examples/change_case/workflow-test.yml new file mode 100644 index 0000000..c1cdb1b --- /dev/null +++ b/examples/change_case/workflow-test.yml @@ -0,0 +1,74 @@ +# +# This is a self-documenting example. +# +# For the full documentation see http://wft4galaxy.readthedocs.io/test-definition-file.html +# +# Remember that the wft4galaxy-wizard can generate test definitions automatically for you. +# http://wft4galaxy.readthedocs.io/wizard-tool.html + +########################################################################################## +# Global settings +# - These apply to all the tests defined in this file +########################################################################################## + +# galaxy_url -> URL of the Galaxy instance to be used. +# If unspecified, wft4galaxy will check the GALAXY_URL environment variable +# You can also specify the URL on the command line +#galaxy_url: "http://192.168.64.8:30700" +# +# API key: analogously to the URL, wft4galaxy can also get values from the GALAXY_API_KEY +# environment variable and from the command line +#galaxy_api_key: "4b86f51252b5f220012b3e259d0877f9" + +# The base_path is the directory with respect to which all other paths are evaluated. +# The default value is the directory that contains this file. +#base_path: . + +# Don't delete the workflow's output datasets (which are compared to the expected output). +# This way you can examine them yourself after executing the tests +#disable_cleanup: True + +# The path where the downloaded output datasets, logs and XUnit reports are written when they are enabled +#output_folder: "results"` + +# Enables wft4galaxy's logger, which results in additional console output about +# wft4galaxy's operations +#enable_logger: True + +# Enable to print yet more information +#enable_debug: True + +########################################################################################## +# Workflow tests +########################################################################################## +workflows: + # This is the "workflows" test suite. + # You can define multiple tests in this suite + # + # We define a test case called "change_case" + change_case: + # 'file' is the path to file defining the workflow to be tested. + # You can generate this file by exporting the workflow from Galaxy + file: "workflow.ga" + # The input datasets for the workflow. Specify them under "inputs:" + inputs: + # The lines consist of : ; the id is the *Name* field of the input + # box defined in the workflow. + InputText: "input" + ### You can also explicitly specify dataset type using an extended syntax ### + # : <-- the *Name* field of the input box defined in the workflow + # file: <-- the filename of the input dataset + # type: <-- the file format of the input dataset as specified by Galaxy (e.g., 'txt') + expected: + # Under 'expected' we have the workflow's expected output datasets + # Format -> Id: filename + # Get the output id from the output dataset's *Label* field as specified in the workflow + OutputText: "expected_output" + ### Using a custom comparator function: use the extended syntax ### + # OutputText: <- this is the output Label + # file: "expected_output.txt" <- path to file containing expected output + # comparator: "filecmp.cmp" <- comparator function to use + + +# There is a more extensive explanation on how to get input and output ids here: +# http://wft4galaxy.readthedocs.io/notebooks/1_define_test_suite.html#1.-Workflow-preparation diff --git a/examples/change_case/workflow.ga b/examples/change_case/workflow.ga new file mode 100644 index 0000000..2f00d1c --- /dev/null +++ b/examples/change_case/workflow.ga @@ -0,0 +1,92 @@ +{ + "a_galaxy_workflow": "true", + "annotation": "", + "format-version": "0.1", + "name": "Change Case", + "steps": { + "0": { + "annotation": "", + "content_id": null, + "id": 0, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "InputText" + } + ], + "label": null, + "name": "Input dataset", + "outputs": [], + "position": { + "left": 198, + "top": 107.5 + }, + "tool_errors": null, + "tool_id": null, + "tool_state": "{\"name\": \"InputText\"}", + "tool_version": null, + "type": "data_input", + "uuid": "00bd81ab-17f6-4722-98b6-3217a8144b9c", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "f980ba21-8dde-4504-9c76-068e17b23c73" + } + ] + }, + "1": { + "annotation": "", + "content_id": "ChangeCase", + "id": 1, + "input_connections": { + "input": { + "id": 0, + "output_name": "output" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool Change Case", + "name": "input" + } + ], + "label": null, + "name": "Change Case", + "outputs": [ + { + "name": "out_file1", + "type": "tabular" + } + ], + "position": { + "left": 438, + "top": 186.5 + }, + "post_job_actions": { + "RenameDatasetActionout_file1": { + "action_arguments": { + "newname": "OutputText" + }, + "action_type": "RenameDatasetAction", + "output_name": "out_file1" + } + }, + "tool_errors": null, + "tool_id": "ChangeCase", + "tool_state": "{\"__page__\": 0, \"casing\": \"\\\"up\\\"\", \"__rerun_remap_job_id__\": null, \"cols\": \"\\\"c1,c2\\\"\", \"delimiter\": \"\\\"TAB\\\"\", \"input\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\"}", + "tool_version": "1.0.0", + "type": "tool", + "uuid": "593beb9e-3ce8-4bc6-84c7-03ce625a6ebc", + "workflow_outputs": [ + { + "label": "OutputText", + "output_name": "out_file1", + "uuid": "9a060103-9bb9-4360-8a1e-410b5baf7e78" + } + ] + } + }, + "uuid": "29d5dd98-c529-433e-91ba-94bfa714da3f" +} \ No newline at end of file diff --git a/examples/fluxomics_stationary/constraints.csv b/examples/fluxomics_stationary/constraints.csv new file mode 100644 index 0000000..97a9a7b --- /dev/null +++ b/examples/fluxomics_stationary/constraints.csv @@ -0,0 +1,2 @@ +Reaction id,Lower bound,Upper bound,Objective coefficient,Reaction name +RlacEx,1,1,0,Exchange of Lactate diff --git a/examples/fluxomics_stationary/exchanged_file.csv b/examples/fluxomics_stationary/exchanged_file.csv new file mode 100644 index 0000000..e28bd8a --- /dev/null +++ b/examples/fluxomics_stationary/exchanged_file.csv @@ -0,0 +1,329 @@ +"Raw Data File","tracer molecule","labelled positions","abundance","Parameter Value[injection]","Parameter Value[Replicate]","Factor Value[Incubation time]","Metabolite name","CHEBI identifier","atomic positions to the parent molecule/metabolite name","Empirical formula derivatized molecule/fragment","m/z monitored","signal intensity","isotopologue","isotologue abundance relative concentration" +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",524,"",NA +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",268880,"Rib_13C0",82.651 +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",51823,"Rib_13C1",5.907 +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",37490,"Rib_13C2",8.533 +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",7381,"Rib_13C3",1.087 +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",7234,"Rib_13C4",1.779 +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",771,"Rib_13C5",0.043 +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",206,"",NA +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",932,"",NA +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",1179902,"Rib_13C0",82.872 +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",226332,"Rib_13C1",5.849 +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",163847,"Rib_13C2",8.523 +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",31919,"Rib_13C3",1.063 +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",30137,"Rib_13C4",1.681 +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",2751,"Rib_13C5",0.012 +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",873,"",NA +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",971,"",NA +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",1069286,"Rib_13C0",83.191 +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",203649,"Rib_13C1",5.76 +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",144834,"Rib_13C2",8.3 +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",29001,"Rib_13C3",1.099 +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",26841,"Rib_13C4",1.653 +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",2229,"Rib_13C5",-0.003 +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",575,"",NA +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",1110,"",NA +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",884720,"Rib_13C0",85.496 +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",158921,"Rib_13C1",5.016 +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",102387,"Rib_13C2",7.049 +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",20957,"Rib_13C3",1.008 +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",18820,"Rib_13C4",1.414 +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",1831,"Rib_13C5",0.018 +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",409,"",NA +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",1074,"",NA +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",1314620,"Rib_13C0",85.727 +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",231912,"Rib_13C1",4.761 +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",153365,"Rib_13C2",7.178 +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",30596,"Rib_13C3",0.968 +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",26741,"Rib_13C4",1.346 +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",2661,"Rib_13C5",0.02 +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",622,"",NA +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",896,"",NA +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",1208501,"Rib_13C0",85.68 +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",216171,"Rib_13C1",4.964 +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",139574,"Rib_13C2",7.055 +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",27329,"Rib_13C3",0.924 +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",24551,"Rib_13C4",1.348 +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",2598,"Rib_13C5",0.029 +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",696,"",NA +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",566,"",NA +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",413236,"Rib_13C0",85.631 +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",73551,"Rib_13C1",4.887 +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",47638,"Rib_13C2",7.04 +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",10322,"Rib_13C3",1.118 +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",8394,"Rib_13C4",1.33 +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",691,"Rib_13C5",-0.006 +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",136,"",NA +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",770,"",NA +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",616545,"Rib_13C0",85.482 +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",109939,"Rib_13C1",4.906 +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",72656,"Rib_13C2",7.234 +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",14300,"Rib_13C3",0.95 +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",13146,"Rib_13C4",1.422 +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",1191,"Rib_13C5",0.007 +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",362,"",NA +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",721,"",NA +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",771861,"Rib_13C0",85.555 +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",136381,"Rib_13C1",4.775 +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",91122,"Rib_13C2",7.273 +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",18142,"Rib_13C3",0.973 +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",16176,"Rib_13C4",1.392 +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",1733,"Rib_13C5",0.033 +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",537,"",NA +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",3137,"",NA +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",714380,"Rib_13C0",100.016 +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",85346,"Rib_13C1",-0.021 +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",14865,"Rib_13C2",-0.01 +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",1523,"Rib_13C3",0.008 +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",1267,"Rib_13C4",-0.009 +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",363,"Rib_13C5",0.015 +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",395,"",NA +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",3031,"",NA +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",669201,"Rib_13C0",99.766 +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",81441,"Rib_13C1",0.197 +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",14566,"Rib_13C2",0.055 +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",1093,"Rib_13C3",-0.047 +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",1349,"Rib_13C4",0.018 +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",325,"Rib_13C5",0.011 +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",198,"",NA +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",3176,"",NA +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",975103,"Rib_13C0",100.149 +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",115502,"Rib_13C1",-0.121 +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",19955,"Rib_13C2",-0.03 +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",2233,"Rib_13C3",0.026 +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",1767,"Rib_13C4",-0.006 +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",133,"Rib_13C5",-0.018 +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",237,"",0 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",2196,"",NA +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",2446098,"Glyc_13C0",65.619 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",399396,"Glyc_13C1",-0.422 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",1422059,"Glyc_13C2",33.243 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",196738,"Glyc_13C3",0.253 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",59646,"Glyc_13C4",1.114 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",7591,"Glyc_13C5",0.04 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",7395,"Glyc_13C6",0.152 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","335",127,"",NA +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",1620,"",NA +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",1769847,"Glyc_13C0",65.577 +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",293369,"Glyc_13C1",-0.268 +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",1027502,"Glyc_13C2",33.149 +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",142206,"Glyc_13C3",0.256 +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",42838,"Glyc_13C4",1.103 +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",5202,"Glyc_13C5",0.032 +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",5315,"Glyc_13C6",0.152 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",1843,"",NA +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",1911157,"Glyc_13C0",65.802 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",313581,"Glyc_13C1",-0.37 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",1101163,"Glyc_13C2",33.018 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",154077,"Glyc_13C3",0.309 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",45115,"Glyc_13C4",1.066 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",5435,"Glyc_13C5",0.03 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",5482,"Glyc_13C6",0.145 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",2513,"",NA +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",3363647,"Glyc_13C0",63.43 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",550138,"Glyc_13C1",-0.424 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",2156304,"Glyc_13C2",35.57 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",296382,"Glyc_13C3",0.229 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",81887,"Glyc_13C4",1.045 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",9870,"Glyc_13C5",0.031 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",8296,"Glyc_13C6",0.119 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",4438,"",NA +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",6759189,"Glyc_13C0",63.709 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",1087145,"Glyc_13C1",-0.585 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",4307168,"Glyc_13C2",35.536 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",584913,"Glyc_13C3",0.165 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",160139,"Glyc_13C4",1.022 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",19652,"Glyc_13C5",0.033 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",16704,"Glyc_13C6",0.119 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",3714,"",NA +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",4562771,"Glyc_13C0",63.546 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",741265,"Glyc_13C1",-0.489 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",2919742,"Glyc_13C2",35.582 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",397099,"Glyc_13C3",0.174 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",109987,"Glyc_13C4",1.04 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",12962,"Glyc_13C5",0.027 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",11290,"Glyc_13C6",0.12 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",3970,"",NA +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",5564173,"Glyc_13C0",64.435 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",907901,"Glyc_13C1",-0.438 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",3409599,"Glyc_13C2",34.483 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",468160,"Glyc_13C3",0.22 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",140652,"Glyc_13C4",1.133 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",17388,"Glyc_13C5",0.036 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",15014,"Glyc_13C6",0.132 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",3618,"",NA +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",6209370,"Glyc_13C0",64.378 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",1011002,"Glyc_13C1",-0.46 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",3814652,"Glyc_13C2",34.547 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",524055,"Glyc_13C3",0.223 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",158819,"Glyc_13C4",1.149 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",19339,"Glyc_13C5",0.033 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",16576,"Glyc_13C6",0.131 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",876,"",NA +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",1001508,"Glyc_13C0",64.188 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",167025,"Glyc_13C1",-0.221 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",616159,"Glyc_13C2",34.454 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",85239,"Glyc_13C3",0.26 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",25781,"Glyc_13C4",1.15 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",3266,"Glyc_13C5",0.041 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",2657,"Glyc_13C6",0.129 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",775,"",NA +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",672910,"Glyc_13C0",99.808 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",113154,"Glyc_13C1",0.33 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",20991,"Glyc_13C2",-0.064 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",1487,"Glyc_13C3",-0.062 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",309,"Glyc_13C4",-0.008 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",37,"Glyc_13C5",-0.004 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",7,"Glyc_13C6",0 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",880,"",NA +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",184642,"Glyc_13C0",100.257 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",29566,"Glyc_13C1",-0.44 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",5806,"Glyc_13C2",0.079 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",727,"Glyc_13C3",0.09 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",155,"Glyc_13C4",0.008 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",32,"Glyc_13C5",0.004 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",7,"Glyc_13C6",0.001 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",1410,"",NA +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",311944,"Glyc_13C0",100.264 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",49901,"Glyc_13C1",-0.455 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",9846,"Glyc_13C2",0.092 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",1202,"Glyc_13C3",0.081 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",271,"Glyc_13C4",0.012 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",62,"Glyc_13C5",0.006 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",7,"Glyc_13C6",0 +"LacHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",2741,"",NA +"LacHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",96907,"Lac_13C0",80.968 +"LacHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",11858,"Lac_13C1",0.342 +"LacHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",24967,"Lac_13C2",18.702 +"LacHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",2252,"Lac_13C3",-0.012 +"LacHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","332",250,"",NA +"LacHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",202879,"",NA +"LacHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",7670682,"Lac_13C0",80.997 +"LacHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",927486,"Lac_13C1",0.226 +"LacHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",1979804,"Lac_13C2",18.755 +"LacHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",181833,"Lac_13C3",0.023 +"LacHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",182821,"",NA +"LacHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",6937517,"Lac_13C0",80.949 +"LacHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",836095,"Lac_13C1",0.191 +"LacHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",1799598,"Lac_13C2",18.848 +"LacHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",164267,"Lac_13C3",0.012 +"LacHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",204750,"",NA +"LacHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",7885236,"Lac_13C0",81.146 +"LacHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",945811,"Lac_13C1",0.152 +"LacHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",2025378,"Lac_13C2",18.702 +"LacHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",183732,"Lac_13C3",0.001 +"LacHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",34865,"",NA +"LacHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",1300930,"Lac_13C0",80.721 +"LacHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",159805,"Lac_13C1",0.371 +"LacHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",339658,"Lac_13C2",18.907 +"LacHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",30783,"Lac_13C3",0.001 +"LacHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",151078,"",NA +"LacHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",5658032,"Lac_13C0",81.082 +"LacHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",686801,"Lac_13C1",0.268 +"LacHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",1448361,"Lac_13C2",18.606 +"LacHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",134706,"Lac_13C3",0.044 +"LacHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",9107,"",NA +"LacHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",363566,"Lac_13C0",81.77 +"LacHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",43608,"Lac_13C1",0.153 +"LacHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",93457,"Lac_13C2",18.893 +"LacHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",4388,"Lac_13C3",-0.816 +"LacHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",19872,"",NA +"LacHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",784950,"Lac_13C0",82.235 +"LacHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",93866,"Lac_13C1",0.115 +"LacHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",205189,"Lac_13C2",19.381 +"LacHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",0,"Lac_13C3",-1.731 +"LacNat1_01.CDF","","","","1","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",64602,"",NA +"LacNat1_01.CDF","","","","1","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",2407465,"Lac_13C0",100.017 +"LacNat1_01.CDF","","","","1","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",269129,"Lac_13C1",0.006 +"LacNat1_01.CDF","","","","1","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",35516,"Lac_13C2",-0.042 +"LacNat1_01.CDF","","","","1","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",4464,"Lac_13C3",0.019 +"LacNat1_02.CDF","","","","2","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",65253,"",NA +"LacNat1_02.CDF","","","","2","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",2423371,"Lac_13C0",99.983 +"LacNat1_02.CDF","","","","2","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",270675,"Lac_13C1",-0.006 +"LacNat1_02.CDF","","","","2","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",37803,"Lac_13C2",0.042 +"LacNat1_02.CDF","","","","2","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",3660,"Lac_13C3",-0.019 +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",15475,"",NA +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",1128384,"Glu_13C0",96.677 +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",110886,"Glu_13C1",2.295 +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",22658,"Glu_13C2",0.877 +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",2283,"Glu_13C3",0.09 +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",2714,"Glu_13C4",0.06 +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",1278,"",NA +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",5704,"",NA +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",472074,"Glu_13C0",99.034 +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",36071,"Glu_13C1",0.26 +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",7434,"Glu_13C2",0.618 +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",746,"Glu_13C3",0.067 +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",901,"Glu_13C4",0.021 +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",552,"",NA +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",5814,"",NA +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",469219,"Glu_13C0",99.037 +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",35839,"Glu_13C1",0.257 +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",7373,"Glu_13C2",0.615 +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",750,"Glu_13C3",0.069 +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",900,"Glu_13C4",0.022 +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",514,"",NA +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",5558,"",NA +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",433440,"Glu_13C0",99.062 +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",33099,"Glu_13C1",0.256 +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",6714,"Glu_13C2",0.594 +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",674,"Glu_13C3",0.066 +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",834,"Glu_13C4",0.023 +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",578,"",NA +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",5535,"",NA +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",421641,"Glu_13C0",99.068 +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",32170,"Glu_13C1",0.25 +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",6536,"Glu_13C2",0.595 +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",656,"Glu_13C3",0.066 +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",804,"Glu_13C4",0.021 +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",585,"",NA +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",6791,"",NA +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",561036,"Glu_13C0",99.082 +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",42759,"Glu_13C1",0.242 +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",8667,"Glu_13C2",0.591 +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",871,"Glu_13C3",0.066 +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",1061,"Glu_13C4",0.02 +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",653,"",NA +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",3333,"",NA +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",407706,"Glu_13C0",99.141 +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",30935,"Glu_13C1",0.21 +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",6120,"Glu_13C2",0.551 +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",614,"Glu_13C3",0.063 +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",838,"Glu_13C4",0.034 +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",715,"",NA +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",2718,"",NA +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",337411,"Glu_13C0",99.105 +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",25725,"Glu_13C1",0.245 +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",5086,"Glu_13C2",0.555 +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",499,"Glu_13C3",0.06 +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",691,"Glu_13C4",0.034 +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",497,"",NA +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",3456,"",NA +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",430150,"Glu_13C0",99.128 +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",32691,"Glu_13C1",0.222 +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",6473,"Glu_13C2",0.554 +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",641,"Glu_13C3",0.061 +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",880,"Glu_13C4",0.034 +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",655,"",NA +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",2039,"",NA +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",196294,"Glu_13C0",100.02 +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",14398,"Glu_13C1",-0.022 +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",1772,"Glu_13C2",-0.001 +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",114,"Glu_13C3",0.001 +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",323,"Glu_13C4",0.001 +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",280,"",NA +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",3722,"",NA +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",362166,"Glu_13C0",99.993 +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",26681,"Glu_13C1",0.009 +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",3272,"Glu_13C2",-0.002 +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",205,"Glu_13C3",0 +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",592,"Glu_13C4",0 +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",480,"",NA +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",4406,"",NA +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",433705,"Glu_13C0",99.997 +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",31919,"Glu_13C1",0.002 +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",3933,"Glu_13C2",0.002 +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",246,"Glu_13C3",0 +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",706,"Glu_13C4",0 +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",548,"",0 diff --git a/examples/fluxomics_stationary/expected_best_fit_fluxes.csv b/examples/fluxomics_stationary/expected_best_fit_fluxes.csv new file mode 100644 index 0000000..7e194e5 --- /dev/null +++ b/examples/fluxomics_stationary/expected_best_fit_fluxes.csv @@ -0,0 +1,20 @@ +ID,Name,Stoichiometry,Minimum,Maximum +Rbottom_Glc,Glyceraldehyde phosphate dehydrogenase,Gap --> Pep,0.8681,0.8682 +RextraPyr,extra pyruvate, --> Pyr,0.1318,0.1319 +Rfba,Aldolase,Fru16bp <=> Dhap + Gap,0.422867,0.422933 +Rglc6p_pdif,Difussion between Glucose 6-phosphate pools,Glc6p_a <=> Glc6p_b,0.445217,0.445283 +RglcEx,Glucose uptake, --> Glc,0.4348,0.4349 +RglycEx,Glycogen utilization, --> Glc6p_a,0.010317,0.010483 +Rhex1,Hexokinase,Glc --> Glc6p_a,0.4348,0.4349 +RlacEx,Lactate release,Lac --> ,1.0,1.0 +Rldh_l,L-lactate dehydrogenase,Pyr <=> Lac,1.0,1.0 +RoxPPP,Glucose 6-Phosphate dehydrogenase,Glc6p_b --> Rul5p,0.067,0.0671 +Rpfk,Phosphofructokinase,Fru6p --> Fru16bp,0.422867,0.422933 +Rpgi,Glucose-6-phosphate isomerase,Glc6p_b <=> Fru6p,0.378133,0.378267 +Rpyk,Pyruvate Kinase,Pep --> Pyr,0.8681,0.8682 +Rrpe,Ribulose 5 phosphate epimerase,Rul5p <=> Xyl5p,0.044667,0.044733 +Rrpi,Ribose phosphate isomerase,Rul5p <=> Rib5p,0.022333,0.022367 +Rtala,Transaldolase,Gap + Sed7p <=> E4p + Fru6p,0.022333,0.022367 +Rtkt1,Transketolase 1,Rib5p + Xyl5p <=> Gap + Sed7p,0.022333,0.022367 +Rtkt2,Transketolase 2,E4p + Xyl5p <=> Fru6p + Gap,0.022333,0.022367 +Rtpi,Triose-phosphate isomerase,Dhap <=> Gap,0.422867,0.422933 diff --git a/examples/fluxomics_stationary/expected_best_fit_label.csv b/examples/fluxomics_stationary/expected_best_fit_label.csv new file mode 100644 index 0000000..f67a078 --- /dev/null +++ b/examples/fluxomics_stationary/expected_best_fit_label.csv @@ -0,0 +1,35 @@ +Metabolite/s,Isotopologue,Simulated value,Experimental Mean,Experimental SD,Chi Square +Glycogen_C1-C6,m0,0.81,0.6428,0.0087,279.495 +Glycogen_C1-C6,m1,0.0,0.0006,0.0004,0.004 +Glycogen_C1-C6,m2,0.19,0.343,0.0099,233.923 +Glycogen_C1-C6,m3,0.0,0.0015,0.0003,0.022 +Glycogen_C1-C6,m4,-0.0,0.0108,0.0004,1.164 +Glycogen_C1-C6,m5,0.0,0.0003,0.0,0.001 +Glycogen_C1-C6,m6,0.0,0.0013,0.0001,0.018 + +Glycogen_C1-C6,m1/Sm,0.0,0.0017,0.001 +Glycogen_C1-C6,m2/Sm,1.0,0.9601,0.0278 +Glycogen_C1-C6,m3/Sm,0.0,0.0041,0.001 +Glycogen_C1-C6,m4/Sm,-0.0,0.0302,0.0012 +Glycogen_C1-C6,m5/Sm,0.0,0.0008,0.0001 +Glycogen_C1-C6,m6/Sm,0.0,0.0037,0.0004 + +Lactate_C1-C3,m0,0.985,0.8132,0.0048,295.103 +Lactate_C1-C3,m1,0.0094,0.0022,0.0006,0.529 +Lactate_C1-C3,m2,0.0056,0.1888,0.0018,335.813 +Lactate_C1-C3,m3,0.0,0.0001,0.0001,0.0 + + +D-Ribose_C1-C5,m0,0.847,0.847,0.0127,0.0 +D-Ribose_C1-C5,m1,0.1433,0.052,0.0045,83.338 +D-Ribose_C1-C5,m2,0.0091,0.0758,0.0062,44.439 +D-Ribose_C1-C5,m3,0.0005,0.0102,0.0005,0.935 +D-Ribose_C1-C5,m4,0.0,0.0149,0.0016,2.195 +D-Ribose_C1-C5,m5,0.0,0.0002,0.0,0.0 + +D-Ribose_C1-C5,m1/Sm,0.9367,0.34,0.0294 +D-Ribose_C1-C5,m2/Sm,0.0595,0.4951,0.0405 +D-Ribose_C1-C5,m3/Sm,0.0035,0.0667,0.0031 +D-Ribose_C1-C5,m4/Sm,0.0002,0.097,0.0101 +D-Ribose_C1-C5,m5/Sm,0.0,0.0012,0.0002 + diff --git a/examples/fluxomics_stationary/midcor_res.csv b/examples/fluxomics_stationary/midcor_res.csv new file mode 100644 index 0000000..b3145ac --- /dev/null +++ b/examples/fluxomics_stationary/midcor_res.csv @@ -0,0 +1,329 @@ +"Raw Data File","tracer molecule","labelled positions","abundance","Parameter Value[injection]","Parameter Value[Replicate]","Factor Value[Incubation time]","Metabolite name","CHEBI identifier","atomic positions to the parent molecule/metabolite name","Empirical formula derivatized molecule/fragment","m/z monitored","signal intensity","isotopologue","isotologue abundance relative concentration" +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",524,"",NA +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",268880,"Rib_13C0",82.651 +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",51823,"Rib_13C1",5.907 +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",37490,"Rib_13C2",8.533 +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",7381,"Rib_13C3",1.087 +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",7234,"Rib_13C4",1.779 +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",771,"Rib_13C5",0.043 +"RibHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",206,"",NA +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",932,"",NA +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",1179902,"Rib_13C0",82.872 +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",226332,"Rib_13C1",5.849 +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",163847,"Rib_13C2",8.523 +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",31919,"Rib_13C3",1.063 +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",30137,"Rib_13C4",1.681 +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",2751,"Rib_13C5",0.012 +"RibHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",873,"",NA +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",971,"",NA +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",1069286,"Rib_13C0",83.191 +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",203649,"Rib_13C1",5.76 +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",144834,"Rib_13C2",8.3 +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",29001,"Rib_13C3",1.099 +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",26841,"Rib_13C4",1.653 +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",2229,"Rib_13C5",-0.003 +"RibHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",575,"",NA +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",1110,"",NA +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",884720,"Rib_13C0",85.496 +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",158921,"Rib_13C1",5.016 +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",102387,"Rib_13C2",7.049 +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",20957,"Rib_13C3",1.008 +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",18820,"Rib_13C4",1.414 +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",1831,"Rib_13C5",0.018 +"RibHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",409,"",NA +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",1074,"",NA +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",1314620,"Rib_13C0",85.727 +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",231912,"Rib_13C1",4.761 +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",153365,"Rib_13C2",7.178 +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",30596,"Rib_13C3",0.968 +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",26741,"Rib_13C4",1.346 +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",2661,"Rib_13C5",0.02 +"RibHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",622,"",NA +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",896,"",NA +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",1208501,"Rib_13C0",85.68 +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",216171,"Rib_13C1",4.964 +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",139574,"Rib_13C2",7.055 +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",27329,"Rib_13C3",0.924 +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",24551,"Rib_13C4",1.348 +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",2598,"Rib_13C5",0.029 +"RibHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",696,"",NA +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",566,"",NA +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",413236,"Rib_13C0",85.631 +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",73551,"Rib_13C1",4.887 +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",47638,"Rib_13C2",7.04 +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",10322,"Rib_13C3",1.118 +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",8394,"Rib_13C4",1.33 +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",691,"Rib_13C5",-0.006 +"RibHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",136,"",NA +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",770,"",NA +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",616545,"Rib_13C0",85.482 +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",109939,"Rib_13C1",4.906 +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",72656,"Rib_13C2",7.234 +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",14300,"Rib_13C3",0.95 +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",13146,"Rib_13C4",1.422 +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",1191,"Rib_13C5",0.007 +"RibHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",362,"",NA +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",721,"",NA +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",771861,"Rib_13C0",85.555 +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",136381,"Rib_13C1",4.775 +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",91122,"Rib_13C2",7.273 +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",18142,"Rib_13C3",0.973 +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",16176,"Rib_13C4",1.392 +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",1733,"Rib_13C5",0.033 +"RibHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",537,"",NA +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",3137,"",NA +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",714380,"Rib_13C0",100.016 +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",85346,"Rib_13C1",-0.021 +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",14865,"Rib_13C2",-0.01 +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",1523,"Rib_13C3",0.008 +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",1267,"Rib_13C4",-0.009 +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",363,"Rib_13C5",0.015 +"RibNat1_01.CDF","","","","1","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",395,"",NA +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",3031,"",NA +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",669201,"Rib_13C0",99.766 +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",81441,"Rib_13C1",0.197 +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",14566,"Rib_13C2",0.055 +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",1093,"Rib_13C3",-0.047 +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",1349,"Rib_13C4",0.018 +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",325,"Rib_13C5",0.011 +"RibNat1_02.CDF","","","","2","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",198,"",NA +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","255",3176,"",NA +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","256",975103,"Rib_13C0",100.149 +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","257",115502,"Rib_13C1",-0.121 +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","258",19955,"Rib_13C2",-0.03 +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","259",2233,"Rib_13C3",0.026 +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","260",1767,"Rib_13C4",-0.006 +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","261",133,"Rib_13C5",-0.018 +"RibNat1_03.CDF","","","","3","1","","D-Ribose","CHEBI:16988","C1-C5","C11H14O6N","262",237,"",0 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",2196,"",NA +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",2446098,"Glyc_13C0",65.379 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",399396,"Glyc_13C1",0.025 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",1422059,"Glyc_13C2",33.141 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",196738,"Glyc_13C3",0.168 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",59646,"Glyc_13C4",1.102 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",7591,"Glyc_13C5",0.034 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",7395,"Glyc_13C6",0.152 +"GlycHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","335",127,"",NA +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",1620,"",NA +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",1769847,"Glyc_13C0",65.337 +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",293369,"Glyc_13C1",0.179 +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",1027502,"Glyc_13C2",33.047 +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",142206,"Glyc_13C3",0.171 +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",42838,"Glyc_13C4",1.09 +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",5202,"Glyc_13C5",0.025 +"GlycHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",5315,"Glyc_13C6",0.151 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",1843,"",NA +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",1911157,"Glyc_13C0",65.562 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",313581,"Glyc_13C1",0.076 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",1101163,"Glyc_13C2",32.916 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",154077,"Glyc_13C3",0.223 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",45115,"Glyc_13C4",1.054 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",5435,"Glyc_13C5",0.024 +"GlycHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",5482,"Glyc_13C6",0.145 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",2513,"",NA +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",3363647,"Glyc_13C0",63.19 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",550138,"Glyc_13C1",0.023 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",2156304,"Glyc_13C2",35.468 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",296382,"Glyc_13C3",0.143 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",81887,"Glyc_13C4",1.033 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",9870,"Glyc_13C5",0.025 +"GlycHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",8296,"Glyc_13C6",0.118 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",4438,"",NA +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",6759189,"Glyc_13C0",63.469 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",1087145,"Glyc_13C1",-0.139 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",4307168,"Glyc_13C2",35.435 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",584913,"Glyc_13C3",0.08 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",160139,"Glyc_13C4",1.009 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",19652,"Glyc_13C5",0.027 +"GlycHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",16704,"Glyc_13C6",0.119 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",3714,"",NA +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",4562771,"Glyc_13C0",63.306 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",741265,"Glyc_13C1",-0.042 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",2919742,"Glyc_13C2",35.48 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",397099,"Glyc_13C3",0.089 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",109987,"Glyc_13C4",1.028 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",12962,"Glyc_13C5",0.02 +"GlycHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",11290,"Glyc_13C6",0.119 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",3970,"",NA +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",5564173,"Glyc_13C0",64.194 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",907901,"Glyc_13C1",0.008 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",3409599,"Glyc_13C2",34.381 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",468160,"Glyc_13C3",0.135 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",140652,"Glyc_13C4",1.121 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",17388,"Glyc_13C5",0.029 +"GlycHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",15014,"Glyc_13C6",0.132 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",3618,"",NA +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",6209370,"Glyc_13C0",64.138 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",1011002,"Glyc_13C1",-0.014 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",3814652,"Glyc_13C2",34.445 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",524055,"Glyc_13C3",0.137 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",158819,"Glyc_13C4",1.136 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",19339,"Glyc_13C5",0.027 +"GlycHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",16576,"Glyc_13C6",0.13 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",876,"",NA +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",1001508,"Glyc_13C0",63.948 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",167025,"Glyc_13C1",0.226 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",616159,"Glyc_13C2",34.352 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",85239,"Glyc_13C3",0.174 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",25781,"Glyc_13C4",1.138 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",3266,"Glyc_13C5",0.034 +"GlycHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","334",2657,"Glyc_13C6",0.128 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",775,"",NA +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",169962,"Glyc_13C0",99.939 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",27215,"Glyc_13C1",0.007 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",5465,"Glyc_13C2",0.043 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",681,"Glyc_13C3",0.003 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",159,"Glyc_13C4",0.005 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",43,"Glyc_13C5",0.004 +"GlycCom1_01.CDF","","","","1","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",7,"Glyc_13C6",0 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",880,"",NA +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",184642,"Glyc_13C0",100.017 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",29566,"Glyc_13C1",0.007 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",5806,"Glyc_13C2",-0.023 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",727,"Glyc_13C3",0.005 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",155,"Glyc_13C4",-0.004 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",32,"Glyc_13C5",-0.003 +"GlycCom1_02.CDF","","","","2","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",7,"Glyc_13C6",0.001 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","327",1410,"",NA +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","328",311944,"Glyc_13C0",100.024 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","329",49901,"Glyc_13C1",-0.008 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","330",9846,"Glyc_13C2",-0.01 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","331",1202,"Glyc_13C3",-0.004 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","332",271,"Glyc_13C4",0 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",62,"Glyc_13C5",-0.001 +"GlycCom1_03.CDF","","","","3","1","","Glycogen","CHEBI:28087","C1-C6","C14H18O8N","333",7,"Glyc_13C6",-0.001 +"LacHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",2741,"",NA +"LacHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",96907,"Lac_13C0",80.968 +"LacHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",11858,"Lac_13C1",0.342 +"LacHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",24967,"Lac_13C2",18.702 +"LacHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",2252,"Lac_13C3",-0.012 +"LacHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","332",250,"",NA +"LacHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",202879,"",NA +"LacHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",7670682,"Lac_13C0",80.997 +"LacHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",927486,"Lac_13C1",0.226 +"LacHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",1979804,"Lac_13C2",18.755 +"LacHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",181833,"Lac_13C3",0.023 +"LacHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",182821,"",NA +"LacHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",6937517,"Lac_13C0",80.949 +"LacHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",836095,"Lac_13C1",0.191 +"LacHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",1799598,"Lac_13C2",18.848 +"LacHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",164267,"Lac_13C3",0.012 +"LacHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",204750,"",NA +"LacHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",7885236,"Lac_13C0",81.146 +"LacHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",945811,"Lac_13C1",0.152 +"LacHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",2025378,"Lac_13C2",18.702 +"LacHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",183732,"Lac_13C3",0.001 +"LacHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",34865,"",NA +"LacHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",1300930,"Lac_13C0",80.721 +"LacHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",159805,"Lac_13C1",0.371 +"LacHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",339658,"Lac_13C2",18.907 +"LacHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",30783,"Lac_13C3",0.001 +"LacHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",151078,"",NA +"LacHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",5658032,"Lac_13C0",81.082 +"LacHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",686801,"Lac_13C1",0.268 +"LacHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",1448361,"Lac_13C2",18.606 +"LacHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",134706,"Lac_13C3",0.044 +"LacHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",9107,"",NA +"LacHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",363566,"Lac_13C0",81.77 +"LacHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",43608,"Lac_13C1",0.153 +"LacHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",93457,"Lac_13C2",18.893 +"LacHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",4388,"Lac_13C3",-0.816 +"LacHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",19872,"",NA +"LacHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",784950,"Lac_13C0",82.235 +"LacHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",93866,"Lac_13C1",0.115 +"LacHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",205189,"Lac_13C2",19.381 +"LacHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",0,"Lac_13C3",-1.731 +"LacNat1_01.CDF","","","","1","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",64602,"",NA +"LacNat1_01.CDF","","","","1","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",2407465,"Lac_13C0",100.017 +"LacNat1_01.CDF","","","","1","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",269129,"Lac_13C1",0.006 +"LacNat1_01.CDF","","","","1","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",35516,"Lac_13C2",-0.042 +"LacNat1_01.CDF","","","","1","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",4464,"Lac_13C3",0.019 +"LacNat1_02.CDF","","","","2","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","327",65253,"",NA +"LacNat1_02.CDF","","","","2","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","328",2423371,"Lac_13C0",99.983 +"LacNat1_02.CDF","","","","2","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","329",270675,"Lac_13C1",-0.006 +"LacNat1_02.CDF","","","","2","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","330",37803,"Lac_13C2",0.042 +"LacNat1_02.CDF","","","","2","1","","Lactate","CHEBI:24996","C1-C3","C10H13O3NF7","331",3660,"Lac_13C3",-0.019 +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",15475,"",NA +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",1128384,"Glu_13C0",96.677 +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",110886,"Glu_13C1",2.295 +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",22658,"Glu_13C2",0.877 +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",2283,"Glu_13C3",0.09 +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",2714,"Glu_13C4",0.06 +"GluHyp1_01.CDF","Glucose","1,1,0,0,0,0","48","1","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",1278,"",NA +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",5704,"",NA +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",472074,"Glu_13C0",99.034 +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",36071,"Glu_13C1",0.26 +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",7434,"Glu_13C2",0.618 +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",746,"Glu_13C3",0.067 +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",901,"Glu_13C4",0.021 +"GluHyp1_02.CDF","Glucose","1,1,0,0,0,0","48","2","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",552,"",NA +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",5814,"",NA +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",469219,"Glu_13C0",99.037 +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",35839,"Glu_13C1",0.257 +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",7373,"Glu_13C2",0.615 +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",750,"Glu_13C3",0.069 +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",900,"Glu_13C4",0.022 +"GluHyp1_03.CDF","Glucose","1,1,0,0,0,0","48","3","1","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",514,"",NA +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",5558,"",NA +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",433440,"Glu_13C0",99.062 +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",33099,"Glu_13C1",0.256 +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",6714,"Glu_13C2",0.594 +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",674,"Glu_13C3",0.066 +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",834,"Glu_13C4",0.023 +"GluHyp2_01.CDF","Glucose","1,1,0,0,0,0","48","1","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",578,"",NA +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",5535,"",NA +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",421641,"Glu_13C0",99.068 +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",32170,"Glu_13C1",0.25 +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",6536,"Glu_13C2",0.595 +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",656,"Glu_13C3",0.066 +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",804,"Glu_13C4",0.021 +"GluHyp2_02.CDF","Glucose","1,1,0,0,0,0","48","2","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",585,"",NA +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",6791,"",NA +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",561036,"Glu_13C0",99.082 +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",42759,"Glu_13C1",0.242 +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",8667,"Glu_13C2",0.591 +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",871,"Glu_13C3",0.066 +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",1061,"Glu_13C4",0.02 +"GluHyp2_03.CDF","Glucose","1,1,0,0,0,0","48","3","2","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",653,"",NA +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",3333,"",NA +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",407706,"Glu_13C0",99.141 +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",30935,"Glu_13C1",0.21 +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",6120,"Glu_13C2",0.551 +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",614,"Glu_13C3",0.063 +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",838,"Glu_13C4",0.034 +"GluHyp3_01.CDF","Glucose","1,1,0,0,0,0","48","1","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",715,"",NA +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",2718,"",NA +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",337411,"Glu_13C0",99.105 +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",25725,"Glu_13C1",0.245 +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",5086,"Glu_13C2",0.555 +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",499,"Glu_13C3",0.06 +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",691,"Glu_13C4",0.034 +"GluHyp3_02.CDF","Glucose","1,1,0,0,0,0","48","2","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",497,"",NA +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",3456,"",NA +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",430150,"Glu_13C0",99.128 +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",32691,"Glu_13C1",0.222 +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",6473,"Glu_13C2",0.554 +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",641,"Glu_13C3",0.061 +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",880,"Glu_13C4",0.034 +"GluHyp3_03.CDF","Glucose","1,1,0,0,0,0","48","3","3","40","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",655,"",NA +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",2039,"",NA +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",196294,"Glu_13C0",100.02 +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",14398,"Glu_13C1",-0.022 +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",1772,"Glu_13C2",-0.001 +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",114,"Glu_13C3",0.001 +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",323,"Glu_13C4",0.001 +"GluNat1_01.CDF","","","","1","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",280,"",NA +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",3722,"",NA +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",362166,"Glu_13C0",99.993 +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",26681,"Glu_13C1",0.009 +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",3272,"Glu_13C2",-0.002 +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",205,"Glu_13C3",0 +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",592,"Glu_13C4",0 +"GluNat1_02.CDF","","","","2","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",480,"",NA +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","197",4406,"",NA +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","198",433705,"Glu_13C0",99.997 +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","199",31919,"Glu_13C1",0.002 +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","200",3933,"Glu_13C2",0.002 +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","201",246,"Glu_13C3",0 +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","202",706,"Glu_13C4",0 +"GluNat1_03.CDF","","","","3","1","","L-Glutamate","CHEBI:29985","C2-C5","C6H7O3NF3","203",548,"",0 diff --git a/examples/fluxomics_stationary/sbml_model.sbml b/examples/fluxomics_stationary/sbml_model.sbml new file mode 100644 index 0000000..90f3d11 --- /dev/null +++ b/examples/fluxomics_stationary/sbml_model.sbml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/fluxomics_stationary/stationary_fluxomics_v1.0.ga b/examples/fluxomics_stationary/stationary_fluxomics_v1.0.ga new file mode 100644 index 0000000..21c91ee --- /dev/null +++ b/examples/fluxomics_stationary/stationary_fluxomics_v1.0.ga @@ -0,0 +1,331 @@ +{ + "a_galaxy_workflow": "true", + "annotation": "", + "format-version": "0.1", + "name": "Stationary Fluxomics v1.0", + "steps": { + "0": { + "annotation": "", + "content_id": null, + "id": 0, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "exchange" + } + ], + "label": null, + "name": "Input dataset", + "outputs": [], + "position": { + "left": 200, + "top": 200 + }, + "tool_errors": null, + "tool_id": null, + "tool_state": "{\"name\": \"exchange\"}", + "tool_version": null, + "type": "data_input", + "uuid": "52cdd99b-d135-45f4-b2b9-691bf8d48fe2", + "workflow_outputs": [] + }, + "1": { + "annotation": "", + "content_id": null, + "id": 1, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "ZipData" + } + ], + "label": null, + "name": "Input dataset", + "outputs": [], + "position": { + "left": 220, + "top": 324 + }, + "tool_errors": null, + "tool_id": null, + "tool_state": "{\"name\": \"ZipData\"}", + "tool_version": null, + "type": "data_input", + "uuid": "20c91aac-f78c-4afd-8059-de76308f6136", + "workflow_outputs": [] + }, + "2": { + "annotation": "", + "content_id": null, + "id": 2, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "tracingModel" + } + ], + "label": null, + "name": "Input dataset", + "outputs": [], + "position": { + "left": 522, + "top": 452 + }, + "tool_errors": null, + "tool_id": null, + "tool_state": "{\"name\": \"tracingModel\"}", + "tool_version": null, + "type": "data_input", + "uuid": "e9b776db-4d5a-471d-ac5b-4a2def0177e7", + "workflow_outputs": [] + }, + "3": { + "annotation": "", + "content_id": null, + "id": 3, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "SBMLmodel" + } + ], + "label": null, + "name": "Input dataset", + "outputs": [], + "position": { + "left": 533, + "top": 532 + }, + "tool_errors": null, + "tool_id": null, + "tool_state": "{\"name\": \"SBMLmodel\"}", + "tool_version": null, + "type": "data_input", + "uuid": "b40bd23a-a2f5-4c8c-8c64-f57d2ea58acd", + "workflow_outputs": [] + }, + "4": { + "annotation": "", + "content_id": null, + "id": 4, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "constraints" + } + ], + "label": null, + "name": "Input dataset", + "outputs": [], + "position": { + "left": 536, + "top": 615 + }, + "tool_errors": null, + "tool_id": null, + "tool_state": "{\"name\": \"constraints\"}", + "tool_version": null, + "type": "data_input", + "uuid": "6e5cd25c-fc2c-47ee-8d81-b6a3e6f55b38", + "workflow_outputs": [] + }, + "5": { + "annotation": "", + "content_id": "ramid", + "id": 5, + "input_connections": { + "inputExchange": { + "id": 0, + "output_name": "output" + }, + "zipped_data": { + "id": 1, + "output_name": "output" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool ramid", + "name": "zipped_data" + }, + { + "description": "runtime parameter for tool ramid", + "name": "inputExchange" + } + ], + "label": null, + "name": "ramid", + "outputs": [ + { + "name": "outputExchange", + "type": "csv" + } + ], + "position": { + "left": 455, + "top": 248 + }, + "post_job_actions": { + "HideDatasetActionoutputExchange": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "outputExchange" + } + }, + "tool_errors": null, + "tool_id": "ramid", + "tool_state": "{\"zipped_data\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"__page__\": 0, \"__rerun_remap_job_id__\": null, \"inputExchange\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\"}", + "tool_version": "0.1.0", + "type": "tool", + "uuid": "55ead344-6ac9-44f5-b52c-428bc8bf7d5b", + "workflow_outputs": [] + }, + "6": { + "annotation": "", + "content_id": "midcor", + "id": 6, + "input_connections": { + "input1": { + "id": 5, + "output_name": "outputExchange" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool midcor", + "name": "input1" + } + ], + "label": null, + "name": "midcor", + "outputs": [ + { + "name": "output1", + "type": "csv" + } + ], + "position": { + "left": 743, + "top": 277 + }, + "post_job_actions": { + "HideDatasetActionoutput1": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "output1" + } + }, + "tool_errors": null, + "tool_id": "midcor", + "tool_state": "{\"__page__\": 0, \"__rerun_remap_job_id__\": null, \"input1\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\"}", + "tool_version": "0.1.0", + "type": "tool", + "uuid": "a05f396a-6e05-455f-b36d-31daf5c5a87c", + "workflow_outputs": [] + }, + "7": { + "annotation": "", + "content_id": "iso2flux", + "id": 7, + "input_connections": { + "constraints": { + "id": 4, + "output_name": "output" + }, + "sbml_model": { + "id": 3, + "output_name": "output" + }, + "tracing_data": { + "id": 6, + "output_name": "output1" + }, + "tracing_model": { + "id": 2, + "output_name": "output" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool iso2flux", + "name": "tracing_data" + }, + { + "description": "runtime parameter for tool iso2flux", + "name": "parameters" + }, + { + "description": "runtime parameter for tool iso2flux", + "name": "sbml_model" + }, + { + "description": "runtime parameter for tool iso2flux", + "name": "tracing_model" + }, + { + "description": "runtime parameter for tool iso2flux", + "name": "constraints" + } + ], + "label": null, + "name": "iso2flux", + "outputs": [ + { + "name": "best_fit_fluxes", + "type": "csv" + }, + { + "name": "best_fit_label", + "type": "csv" + }, + { + "name": "constrained_sbml_model", + "type": "xml" + }, + { + "name": "fluxes_confidence", + "type": "csv" + } + ], + "position": { + "left": 1047, + "top": 330 + }, + "post_job_actions": {}, + "tool_errors": null, + "tool_id": "iso2flux", + "tool_state": "{\"tracing_data\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"confidence\": \"{\\\"compute\\\": \\\"no\\\", \\\"__current_case__\\\": 1}\", \"parameters\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"__page__\": 0, \"__rerun_remap_job_id__\": null, \"sbml_model\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"tracing_model\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"constraints\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\"}", + "tool_version": "1.0", + "type": "tool", + "uuid": "8153fe24-854b-4677-bad3-fd3c13e8c593", + "workflow_outputs": [ + { + "label": "fluxes_confidence", + "output_name": "fluxes_confidence", + "uuid": "ec1ff17c-fcd2-419e-b1a5-d4d07a1f9b68" + }, + { + "label": "constrained_sbml_model", + "output_name": "constrained_sbml_model", + "uuid": "34c4e58e-31e7-411f-9674-ec87d23f627c" + }, + { + "label": "best_fit_fluxes", + "output_name": "best_fit_fluxes", + "uuid": "6b51a74c-2451-4861-859b-2ceaa31d80eb" + }, + { + "label": "best_fit_label", + "output_name": "best_fit_label", + "uuid": "1958f8c3-9646-4259-aa1b-fe5c58bb489d" + } + ] + } + }, + "uuid": "73601aed-984e-46cb-a10d-c9830622cf97" +} \ No newline at end of file diff --git a/examples/fluxomics_stationary/tracing_model.csv b/examples/fluxomics_stationary/tracing_model.csv new file mode 100644 index 0000000..52e60c8 --- /dev/null +++ b/examples/fluxomics_stationary/tracing_model.csv @@ -0,0 +1,20 @@ +Metabolite/s,N carbons,Symmetry,Constant,large unlabelled pool,Name of measured Metabolite +Glc,,,,,D-Glucose +Glc6p_a,,,,m/SM,Glycogen +"Glc6p_b,Fru6p",,,,, +Fru16bp,,,,, +"Gap,Dhap",,,,, +Pep,,,,, +Pyr,,,,, +Lac,,,,,L-Lactate +"Rib5p,Rul5p,Xyl5p",,,,m/SM,D-Ribose +Sed7p,,,,, +E4p,,,,, +,,,,, +,,,,, +Reaction,Substrates,Products,,, +Rfba,"Fru16bp(c1,c2,c3,c4,c5,c6)","Dhap(c3,c2,c1)+Gap(c4,c5,c6)",,, +RoxPPP,"Glc6p_b(c1,c2,c3,c4,c5,c6)","Rul5p(c2,c3,c4,c5,c6)",,, +Rtkt1,"Xyl5p(x1,x2,x3,x4,x5)+Rib5p(r1,r2,r3,r4,r5)","Gap(x3,x4,x5)+Sed7p(x1,x2,r1,r2,r3,r4,r5)",,, +Rtkt2,"Xyl5p(x1,x2,x3,x4,x5)+E4p(e1,e2,e3,e4)","Gap(x3,x4,x5)+Fru6p(x1,x2,e1,e2,e3,e4)",,, +Rtala,"Sed7p(s1,s2,s3,s4,s5,s6,s7)+Gap(g1,g2,g3)","Fru6p(s1,s2,s3,g1,g2,g3)+E4p(s4,s5,s6,s7)",,, diff --git a/examples/fluxomics_stationary/wd.zip b/examples/fluxomics_stationary/wd.zip new file mode 100644 index 0000000..04c2e3f Binary files /dev/null and b/examples/fluxomics_stationary/wd.zip differ diff --git a/examples/fluxomics_stationary/workflow-test.yml b/examples/fluxomics_stationary/workflow-test.yml new file mode 100644 index 0000000..10c9a91 --- /dev/null +++ b/examples/fluxomics_stationary/workflow-test.yml @@ -0,0 +1,31 @@ +########################################################################################## +# Global settings +########################################################################################## +# galaxy_url: "http://192.168.64.8:30700" # default is GALAXY_URL +# galaxy_api_key: "4b86f51252b5f220012b3e259d0877f9" # default is GALAXY_API_KEY +#enable_logger: True +#enable_debug: True +#output_folder: "results" +#disable_cleanup: True + +########################################################################################## +# Workflow tests +########################################################################################## +workflows: + fluxomics-stationary: + file: "stationary_fluxomics_v1.0.ga" + inputs: + "exchange": "exchanged_file.csv" + ZipData: + file: "wd.zip" + type: "zip" + "tracingModel": "tracing_model.csv" + "SBMLmodel": "sbml_model.sbml" + "constraints": "constraints.csv" + expected: + best_fit_fluxes: + file: "expected_best_fit_fluxes.csv" + comparator: "comparators.csv_same_row_and_col_lengths" + best_fit_label: + file: "expected_best_fit_label.csv" + comparator: "comparators.csv_same_row_and_col_lengths" diff --git a/examples/multivariate/dataMatrix.tsv b/examples/multivariate/dataMatrix.tsv new file mode 100644 index 0000000..1c37390 --- /dev/null +++ b/examples/multivariate/dataMatrix.tsv @@ -0,0 +1,110 @@ +dataMatrix HU_011 HU_014 HU_015 HU_017 HU_018 HU_019 HU_020 HU_021 HU_022 HU_023 HU_024 HU_025 HU_026 HU_027 HU_028 HU_029 HU_030 HU_031 HU_032 HU_033 HU_034 HU_035 HU_036 HU_037 HU_038 HU_039 HU_040 HU_041 HU_042 HU_043 HU_044 HU_045 HU_046 HU_047 HU_048 HU_049 HU_050 HU_051 HU_052 HU_053 HU_054 HU_055 HU_056 HU_057 HU_058 HU_060 HU_061 HU_062 HU_063 HU_064 HU_065 HU_066 HU_067 HU_068 HU_069 HU_070 HU_072 HU_073 HU_074 HU_075 HU_076 HU_077 HU_078 HU_079 HU_080 HU_081 HU_082 HU_083 HU_084 HU_085 HU_086 HU_087 HU_088 HU_089 HU_090 HU_091 HU_092 HU_093 HU_094 HU_095 HU_097 HU_098 HU_099 HU_100 HU_101 HU_102 HU_103 HU_105 HU_106 HU_107 HU_108 HU_109 HU_110 HU_112 HU_113 HU_114 HU_115 HU_116 HU_117 HU_118 HU_119 HU_120 HU_121 HU_122 HU_123 HU_124 HU_125 HU_126 HU_127 HU_129 HU_130 HU_131 HU_132 HU_133 HU_134 HU_135 HU_136 HU_137 HU_138 HU_139 HU_140 HU_142 HU_143 HU_144 HU_145 HU_146 HU_147 HU_148 HU_149 HU_150 HU_152 HU_154 HU_155 HU_156 HU_157 HU_158 HU_159 HU_160 HU_162 HU_163 HU_164 HU_166 HU_167 HU_168 HU_169 HU_170 HU_171 HU_172 HU_173 HU_174 HU_175 HU_177 HU_179 HU_180 HU_181 HU_182 HU_183 HU_184 HU_185 HU_186 HU_187 HU_188 HU_189 HU_190 HU_191 HU_192 HU_193 HU_194 HU_195 HU_196 HU_197 HU_198 HU_199 HU_200 HU_201 HU_202 HU_203 HU_204 HU_205 HU_206 HU_207 HU_208 HU_209 +(2-methoxyethoxy)propanoic acid isomer 3.019766011 3.81433889 3.51969148 2.56218265 3.781921607 4.161073524 3.199174022 3.378109516 3.26452758 3.787490017 5.36371403 3.202345706 3.980345369 3.020293232 5.083462878 3.388718935 3.445549982 1.27650453 3.738547491 1.253594534 3.232847813 4.559559002 4.075948481 2.570748216 4.117811641 5.038208548 4.394350472 3.665845239 3.42296993 3.74546685 3.110957103 4.252742233 4.296284046 2.995377877 3.389971588 5.349114655 5.813374487 4.304743135 1.435768568 5.369591232 3.809431106 3.0110849 1.321147859 3.401176446 3.506978677 5.24237122 3.416889621 3.415584225 3.887678774 3.555974489 3.710985751 4.232236312 3.803661779 4.379572071 3.938310455 1.376325833 3.390271579 5.215817481 4.351838419 3.714724817 3.529736242 3.862848205 3.383427403 3.661146136 4.112188079 4.249731699 4.765467314 3.51532253 4.155850086 4.045784307 4.222815204 4.168351191 4.21782555 3.612098315 3.073157836 4.235420499 3.820636952 2.797679916 3.136688731 3.665614604 4.154569098 4.299336631 3.559309507 2.996742676 3.480758857 4.034741661 3.856739467 2.852684744 3.651373844 3.759574346 3.95537384 2.849099312 3.398179811 3.984515153 3.597414226 3.290898684 4.179746804 4.943696911 1.555387577 3.60408986 1.301552667 3.640714337 3.9838544 3.827632696 4.969533288 3.504223072 2.927962237 4.011233932 3.846480069 3.945182011 3.444671991 3.617341684 4.433665852 3.758001601 3.117921102 3.604887175 3.827127682 1.270341972 4.661967452 3.058563173 4.718036674 3.77969937 4.41111843 3.735829951 3.867366105 3.377810236 4.174630078 4.051745447 4.354188592 3.522532268 3.278058138 3.375142493 4.201257373 3.531025311 4.104608416 3.308431289 3.645655442 5.077657223 1.307713092 4.169713633 3.588749002 3.785980907 3.237049946 4.089354447 3.881406873 3.732585337 4.054073292 4.137363308 4.493012079 4.930648019 3.399303204 3.372649157 3.808510752 3.912572116 4.87526109 3.423336878 4.817034951 3.574103433 3.392706279 3.640266302 3.918027353 2.984720403 4.912949546 3.391126097 3.496992454 4.454290676 3.679442656 4.082141098 3.901748493 4.459292151 3.658028576 3.61865837 1.347192548 3.156817506 4.088827883 3.68482537 3.739437875 3.62621039 3.861325975 1.321648909 4.186987285 3.748127215 4.208859398 +(gamma)Glu-Leu/Ile 3.888479324 4.277148905 4.195649235 4.323759965 4.629328558 4.412266289 4.175236737 4.635271487 3.847144646 3.871586241 4.417740636 4.328564559 4.02953783 4.152376569 4.292682632 4.531347748 4.453076004 4.6291358 4.113221891 4.150947299 4.124072576 3.901047415 4.024811926 4.181515516 4.181368916 3.876389846 4.704956128 4.21159738 4.336920642 4.38187405 3.899552672 4.061643136 4.379398702 3.828154643 4.197557784 4.015019635 4.401325613 3.802961064 4.191430823 4.033966081 4.629557057 4.036365226 4.074358075 4.298537585 4.137887914 4.081451184 4.144428558 4.474804847 4.241676991 4.079688597 4.45979395 4.312246611 4.350598142 4.237664342 4.527419561 4.124084771 4.514244811 4.64306131 4.271454952 4.36397192 4.576486505 4.237029245 4.513324715 4.270510804 4.421063705 4.458245195 4.627969047 4.509811626 4.056176501 4.422448169 4.366316747 4.490622041 4.159146755 4.536378752 4.383857835 4.510287241 4.167334552 4.174861594 4.601433234 4.567295355 4.112488727 4.449374592 4.330871255 4.472058257 4.195670651 2.547586072 4.22097707 4.163925573 4.241035139 4.473772748 4.686731124 4.432171235 4.16038834 4.451110819 4.494920147 4.634499027 4.219155766 4.107579555 4.445377608 4.349982397 4.075422576 4.31829832 4.382325565 4.41358207 4.4568619 4.366357751 4.656853062 4.497583009 4.520452157 4.45554842 4.126441435 4.044901635 4.288916503 4.515312542 4.23005449 4.376616455 4.177676375 4.371806218 4.386378049 4.554152454 4.403703398 4.330703662 4.406347983 4.486475242 4.131251075 4.651977512 4.402084046 4.361771196 4.152777225 3.943570151 4.297440518 4.279994571 4.097546435 4.610586253 4.260938685 4.308325701 4.193526735 4.352079905 4.140745724 4.571828123 4.304399418 4.207251762 4.289434556 4.472756151 4.184599722 4.269607998 4.542199089 4.28525399 4.372047511 4.271733348 4.709122005 4.570667623 4.645108019 4.023056063 4.285770646 4.244340956 4.097054014 4.329710306 4.048329564 4.300926436 4.394476465 4.229841587 4.640003432 4.510502463 4.49765051 4.676359915 4.311101927 4.346944282 4.390929252 4.369701086 4.400757756 4.264071507 4.424354235 4.346125608 4.716491956 4.439047008 4.522890301 4.464620988 4.535947877 4.340933235 4.279162069 4.523763202 4.675880567 +1-Methyluric acid 3.869005757 3.837704025 4.102253758 4.53851996 4.178828862 4.516804994 4.180262737 4.036363075 4.29539342 4.39843134 4.529621208 4.110273903 3.739690888 3.783864332 4.126845744 4.512252909 4.310715632 3.876092627 4.5382435 4.400064971 4.405030617 4.576459192 4.607787677 4.199167663 3.811003723 4.553639696 4.086069055 3.982201933 4.061318954 3.884658556 4.388323909 4.433052936 4.303166583 3.850169946 3.663065812 3.928415194 4.442538201 3.723141617 4.320960083 3.868372811 4.278357531 3.931399948 4.394283723 4.191055566 4.015202218 4.451980882 4.013951422 3.746775861 3.947264897 4.424307688 4.440758471 4.080269187 4.026487851 4.448598045 4.50241562 4.185972984 4.347490309 4.307373715 3.930847424 4.449523817 4.735564676 4.355485393 4.44730007 4.261056169 3.984921096 3.695941443 4.262191156 4.385303993 4.438472061 4.331046708 4.823313661 4.465264163 4.084509398 4.554347486 4.26722868 4.20965944 4.165127819 4.77198565 4.206803554 4.438913725 4.373420662 4.496138427 3.856337995 4.538461252 3.73115281 4.271259447 4.233785487 4.243157325 4.617232016 4.709315012 3.453508227 4.049015989 3.840057964 4.612430619 3.766373797 4.591914026 4.199031236 4.308091252 4.224613455 4.807463081 4.014286513 3.280255087 4.029210425 4.479174189 4.241599707 4.515289394 4.471915472 4.570944429 4.251272306 4.596509423 4.2977884 4.424861011 4.301318819 4.313461316 4.371944102 4.288667814 4.446679482 3.932538017 4.407016342 4.369669037 4.28004355 3.297853384 4.398635009 4.583136658 4.380968695 4.36390834 4.434536613 4.432712941 4.560693661 4.759913511 4.219084518 4.361073776 4.503982338 3.784593694 4.477545231 3.850359954 4.68348388 2.662181085 4.718988601 4.102906315 4.392549368 4.423742606 4.582072605 3.630752653 4.859354755 4.355740885 4.900985415 4.567816307 4.898479707 4.454348708 3.839674974 4.257669308 3.794147563 4.326475355 4.348360167 4.432015659 4.529324069 3.913853716 3.777678946 4.78389024 3.97543424 4.031952376 3.813277842 3.414198616 4.164712015 4.079598029 3.238936288 4.258033235 4.678921556 4.183286887 3.323589951 4.328859696 3.742993009 4.672722618 3.97039066 3.789260832 3.847149987 4.654270418 4.235271882 4.617247195 4.475160306 4.360622075 4.190382227 +1-Methylxanthine 3.717258956 3.776851289 4.291665208 4.432216078 4.117359884 4.562051669 4.253087207 3.937694218 4.07128411 4.469453919 4.49764343 4.125096956 4.158616259 3.747657308 4.110164142 4.501070536 4.194719856 3.827925381 4.597539049 4.457819085 4.380920344 4.61981642 4.676615044 4.196067515 3.974259027 4.559835 4.062946123 3.839137596 3.912728389 3.738233471 4.383899236 4.408831223 4.246963978 3.807884374 3.340923823 4.024747325 4.45071532 3.675607889 4.280048842 3.973393044 4.353071085 4.017880056 4.467425724 4.108250444 3.98494054 4.377914817 3.738491158 3.565305684 3.865676726 4.309873284 4.472338053 3.848630923 4.045115345 4.328511452 4.500614773 4.155400977 4.39624587 4.321422633 3.992728016 4.470462089 4.737869502 4.392065917 4.546971152 4.050148879 3.788451056 3.211686468 4.175976015 4.256400205 4.488599419 4.336682808 4.823789899 4.494926636 3.847901256 4.458712813 4.236256907 4.153200985 4.231200685 4.811483812 4.063299933 4.472696463 4.328163572 4.513468938 3.772097818 4.538945508 3.30840287 4.226454037 4.156192857 4.287751671 4.583349551 4.722035141 4.316924553 4.085991725 3.959883467 4.549628588 3.542714311 4.540416704 4.167810843 4.381165428 4.223181752 4.822021587 4.32130313 2.694186083 3.929434012 4.402786086 4.231094166 4.364250731 4.383958629 4.645389513 4.155038069 4.586560661 4.376099254 4.513208105 4.245774401 4.272030227 4.365149093 4.179011675 4.399339843 3.856714699 4.268492041 4.332470507 4.00564268 2.817325291 4.413911031 4.536731659 4.205212138 4.452975667 4.618490572 4.429968084 4.573270407 4.889518527 4.050952184 4.352439712 4.65087298 3.468679301 4.488476532 3.89014596 4.7135781 3.225433772 4.772797873 4.110744482 4.337320441 4.445975513 4.714429798 3.544884608 5.092044037 4.367010672 4.975799887 4.431701776 4.937211032 4.349899864 3.667337583 4.056684453 3.609138436 4.423802223 4.401733884 4.508995674 4.500112742 3.967633245 3.859919235 4.729830725 3.911008167 3.977956628 3.741390882 3.137538537 4.309154588 4.06180723 3.418850577 4.196678738 4.672770748 4.15730105 2.749731915 4.24945651 3.592576776 4.717844658 3.906095974 3.594897645 3.847913791 4.693313202 4.1945088 4.612080805 4.459744366 4.357491415 4.209774566 +1,3-Dimethyluric acid 3.535461262 3.932581047 3.955376494 4.228491474 4.005544905 4.320581555 4.013865361 3.666724547 4.570381584 4.686482839 4.442089338 4.00906691 3.198911937 3.702778441 4.059331521 4.719267494 4.35239842 3.638961641 4.340513379 4.415213618 4.143482382 4.554092216 4.841897653 4.018662697 4.11013597 4.435338893 4.173841745 3.500046825 3.910175218 3.776445747 4.211320787 4.677791062 4.456304565 3.842990684 3.596449511 3.90278158 4.391664312 3.32944846 4.104350152 4.13774184 4.291891051 3.966725852 4.331607272 4.400939733 4.138128682 4.544795231 4.077609223 3.489006397 4.111269243 4.30790584 4.403463536 4.154601205 3.966873309 4.462060144 4.623939426 4.283646108 4.435652259 4.28711223 3.946339587 4.415669201 4.712400966 4.281408837 4.58368653 4.168365877 3.575031244 3.551973507 4.444643961 4.646473161 4.293853359 4.397658414 5.002172217 4.606453577 3.981214721 4.662710784 4.300286665 4.198236941 4.07769813 4.655290259 4.465476468 4.394372232 4.285404344 4.411250372 3.798698983 4.61969759 3.436564807 4.335265933 4.093751714 4.204482484 4.90038848 4.775732932 3.140600055 3.78182915 3.756559161 4.847256417 3.409133437 4.651272055 4.324683148 4.42535901 4.155374668 4.854366731 4.408416748 2.419214922 3.729881565 4.669381278 4.165641976 4.523536945 4.630965109 4.737408273 4.320295901 4.798007619 4.307316974 4.41918487 4.436520855 4.403887335 4.468039756 4.243672761 4.286572538 3.950548159 4.514956853 4.667219589 4.140606955 2.431676864 4.390701057 4.593296925 4.392804128 4.440356787 4.695108976 4.370928699 4.833067512 4.666683032 4.162739499 4.64392046 4.322519677 3.430301948 4.487336536 3.875425888 4.910834327 0.599641675 4.760466421 4.162707184 3.569821505 4.540350713 4.494474707 3.536814157 4.771297038 4.38313722 4.745349743 4.604235215 4.873802198 4.630135007 3.868843776 4.514266695 3.404195294 4.334259162 4.292046144 4.30287387 4.397143544 3.753656396 4.498580403 4.77115931 3.530034835 3.71304327 4.246996283 2.77016062 4.070320494 4.079316381 3.567098397 4.536291909 4.61043751 4.338026754 2.486308067 4.324914649 3.484586723 4.790234734 3.675000339 3.729555376 3.809869829 4.753736238 4.379127281 4.815899485 4.451929569 4.229554203 4.146196553 +1,7-Dimethyluric acid 3.325198822 4.025125167 3.972904281 4.109927073 4.024092147 4.32685618 4.197503911 3.997385046 4.459222667 4.636227778 4.420607029 3.945387493 4.25456669 4.131751075 4.048240614 4.427084584 4.146700265 3.377914646 4.459927064 4.349967505 4.087973085 4.483969656 4.495590599 3.818919353 4.302240019 4.394897151 4.298906704 3.703873611 3.913014438 3.937758149 4.355411274 4.6474585 4.389388243 3.832382894 3.817644551 4.035339385 4.328021888 3.671127042 4.349959467 4.169638997 4.219619346 4.322466695 4.34171365 4.187333936 4.268704692 4.297634468 4.201335591 3.804794141 4.134833036 4.341790701 4.376674196 4.125612259 3.87228714 4.297557604 4.312266601 4.299669257 4.408604532 4.000500035 4.154798527 4.311867797 4.565385637 4.305788765 4.530812445 4.22891051 3.815321914 3.4441312 4.187325612 4.483070413 4.503241588 4.284143905 4.766331272 4.520393709 3.791837124 4.487740885 4.343909557 4.089572119 3.821966923 4.65797315 4.474110959 4.43532289 4.16504335 4.476002097 3.879963175 4.413856388 3.345885663 4.371999698 4.082776003 4.145991373 4.564423725 4.423733307 3.503519373 3.865595371 4.124190694 4.685241686 3.444237446 4.523257363 4.39260327 4.607290219 4.353793102 4.761828968 4.518176923 2.163307758 4.163861868 4.566116389 3.959585588 4.049110456 4.521903613 4.50678045 4.355648415 4.701394212 4.290950695 4.277043087 4.538649434 4.334818188 4.271792797 4.014470895 4.556842564 3.967742871 4.368406512 4.564251065 3.985579648 2.759871231 4.409372504 4.379120848 4.159415835 4.331086214 4.242505447 4.313252017 4.651901973 4.785003062 3.925523446 4.469381782 4.433972994 3.4169402 4.501501586 4.028060275 4.836630262 3.244070182 4.577253288 4.181600124 4.547534408 2.839126384 4.711853027 4.009473759 4.819487895 4.305366823 4.747031087 4.205072593 4.940625952 4.539526502 3.984691731 4.381926955 3.507204213 4.360509083 4.55150832 4.404508772 4.486945743 3.727156246 4.019582594 4.775668757 3.777262289 4.114762699 4.159060888 2.638533639 4.284002092 3.977698 3.766492496 4.286871561 4.593320506 4.239927223 2.426748206 4.007362269 3.460572841 4.492864092 3.751305227 3.694703177 3.905566729 4.494405047 4.17254668 4.442710028 4.520598632 4.43895914 4.099095764 +2-acetamido-4-methylphenyl acetate 4.204754369 5.181858021 3.885679615 4.237914873 1.852994393 4.08068096 4.378655209 3.954104505 4.257704386 3.481900872 4.359334581 4.190780444 4.207212329 4.006990646 4.122870209 3.826902064 4.528368527 4.809730336 5.01538777 4.204697176 3.943419885 4.592455086 4.233076886 2.087977253 3.918253783 3.974957753 3.914812238 4.552178208 4.451459789 4.118236855 4.407493061 4.07387897 4.097586584 4.122564648 4.553495461 3.69674312 4.255931238 4.390154919 4.905184651 3.872156968 4.591283189 4.03586327 4.077002761 4.301386369 2.824425848 4.604272227 4.216319597 4.824775989 4.506770536 4.371755917 4.545632539 4.142422527 3.559730096 4.657566867 4.19246623 4.192391794 4.109052293 3.924438511 4.298091994 4.251218748 4.387445001 4.484052916 4.191487148 4.484741195 4.579868448 3.846091491 4.421678763 4.625427013 4.828889033 4.440887624 4.631682911 4.441164886 4.80656985 3.965987708 4.264889918 4.032613215 4.161369494 4.396891812 4.470114514 3.558332433 3.602714558 4.65406568 4.247915974 4.21470253 3.679898834 4.366544159 4.567982037 4.601002532 4.643655961 2.938055512 2.792946955 4.281278726 4.218627503 4.498343261 3.917366256 4.535112143 4.430967663 4.427217216 4.666577449 4.553871987 4.782272613 4.491546517 4.00023114 4.526811455 4.776329561 4.274720394 4.64895875 4.541337995 4.479996057 4.357458209 3.901187851 3.947001729 4.498837309 4.707525953 4.253546768 4.08453658 4.472385643 4.132050014 4.468058862 3.823215741 4.759228316 4.365270368 4.616853468 4.131956326 4.271961803 3.9079323 3.913860007 3.428155613 4.175638229 2.440543936 4.686472331 4.29531576 4.999270325 4.148608798 4.813925156 4.382689301 4.647067155 4.677953419 4.445722319 4.364495384 3.91633816 4.883832838 4.456177905 4.253328093 4.38928714 3.674417107 4.284504145 4.098569234 4.901800428 4.808331987 4.267059913 4.458888371 3.433280461 4.463491852 4.644050109 4.390649702 4.255130645 4.329093273 4.236368734 3.274905606 5.211479804 4.17802318 4.38755781 3.8939541 3.541473621 4.181840474 3.587742575 3.014278632 4.358245904 4.560378948 4.266306028 4.617655223 4.677735713 4.652596669 4.007108847 3.87593389 3.856115346 4.336053419 3.690396943 4.956675526 5.439831006 4.581057371 2.740433904 +2-Aminoadipic acid 4.080203824 4.35924574 4.249110618 4.231404241 4.323679299 4.244484932 4.123676821 4.262412224 4.163466826 4.143000611 4.287074542 4.180458777 4.1594218 4.091647817 4.406471146 4.211600312 4.310607376 4.998189223 4.50111645 4.372088244 4.274448934 4.761239318 4.040922353 4.395299373 4.350773089 4.247528647 4.343348689 4.424388086 4.213386208 4.16223373 4.149022111 4.287490359 3.919010052 4.08476233 4.422012149 4.191709573 4.310697502 4.133889325 4.405931304 3.947185614 4.151500331 4.13567836 4.380458873 4.169295762 4.065228768 4.280539554 4.455652199 4.339999355 4.462118671 4.264785362 4.290890259 4.335997952 4.644885616 4.217126962 4.384343259 4.36058507 4.340773023 4.38335829 4.210965344 4.174439234 4.568349481 4.454956874 4.296990791 4.52671481 4.096754718 4.72245046 4.519578541 4.21091423 4.166382229 4.407948351 4.734350167 4.588259557 4.55547504 4.498365796 4.210377278 4.404159224 4.315613227 4.214565197 4.14803883 4.418738226 4.414545721 4.289342093 4.252080088 4.287176282 4.569559653 4.344858253 4.169117434 4.308331645 4.109202981 4.180070648 4.572879199 4.397143071 4.481817442 4.614158811 4.228295812 4.449162282 4.205797419 4.479857319 4.484869922 4.390072816 4.423985504 4.290078425 4.469676552 4.243668508 4.347302049 4.642942407 4.622160832 4.33527645 4.394745669 4.245996277 4.207045333 4.212462896 4.273611553 4.3315668 4.33624573 4.323785125 4.376502318 4.384982029 4.677595881 4.386377638 4.544411014 4.354096843 4.411129155 4.397893071 4.307591978 4.266146911 4.328884728 4.271774608 4.456988959 4.45762652 4.485017846 4.475255007 4.436700217 4.311810671 4.450521569 4.415196344 4.552559986 4.38616773 4.37475152 4.272854147 4.418854401 4.211057275 4.227996157 4.320237325 4.289287063 4.378445365 4.586721642 4.600102101 4.7176115 4.287556192 4.415612524 4.564363922 4.169629332 4.365700355 4.506519884 4.279765628 4.175661147 4.176404023 4.488150773 4.225008322 4.947737368 4.622446845 4.46916043 4.834765326 4.316873597 4.46109412 4.250900805 4.31868279 4.687598237 4.557094514 4.198296767 4.164133654 4.28794234 4.20965854 4.313946634 4.259804328 4.398241568 4.237182176 4.44449416 4.566543054 4.454333566 4.477071372 4.43878969 +2-Hydroxybenzyl alcohol 4.560048648 3.158211998 4.290525486 3.644975587 4.095923132 4.428005291 3.88499543 2.29778171 4.704974715 3.658760562 3.656477698 4.168804205 3.711944592 3.904652936 4.111157534 4.279858699 3.923353919 4.311867641 4.028314927 4.557703567 4.287144157 4.069471989 4.893828836 4.013607577 3.507905893 4.333678863 3.89459861 4.02412563 4.020083362 4.034488459 4.242125384 3.563240594 3.996013737 3.921309113 4.139503394 3.944281095 4.46156869 3.978545611 4.672541048 3.926295988 4.203867112 3.828954417 4.089618139 4.396806624 3.067822773 4.229983809 4.155646675 3.400932219 4.433665419 2.634994356 4.240799527 4.072921786 4.139679903 4.350358684 3.7626697 4.665998376 4.372318256 3.917742285 4.075061875 4.383152906 4.413278189 4.609186357 4.378055554 4.088685263 4.549663466 4.192065438 4.68436394 4.557940768 4.390917367 4.037437456 4.850394393 4.353939636 4.547985133 4.370049098 4.564564956 4.596620322 4.520063507 4.625226353 3.757839127 4.288969955 4.329637216 4.338164487 4.178126136 4.406185041 3.007329748 4.060415841 4.529066532 4.525370963 4.599014588 4.765397486 2.824725457 4.213619898 3.565303799 4.29505462 4.209089394 3.935998869 3.681101751 4.418612724 4.285210851 4.50630078 4.301597631 4.450625575 3.191602378 4.436999415 4.035582593 4.80850997 4.508459046 4.369458293 4.004500442 4.716731628 4.381859325 4.614910359 4.637106597 4.060114275 4.450228765 4.272617759 3.640454361 3.378201177 4.198882214 1.977465551 4.295226139 4.295171134 4.353293385 4.616337784 4.372491233 4.016837996 4.225155776 4.411995661 4.332202094 4.861532898 4.314233983 4.601705143 4.486330554 4.567821018 4.575673556 3.910397416 3.852770568 4.149195035 5.344458036 4.445461616 4.42462981 4.132994954 4.565942657 3.274135467 4.654402543 4.175516272 4.626791699 4.509199498 4.939665842 4.44981347 3.824309322 4.168505625 3.963852297 4.419850134 4.371012521 4.272009562 4.698059237 4.344210176 3.765686265 4.827299705 3.676429585 3.417514191 4.122657655 4.124856321 2.875089837 4.138392274 3.447675466 4.447590759 3.462105504 4.313842945 3.982114746 4.104399648 3.359908159 4.626051268 3.870093037 4.129591957 3.532087016 4.544045928 4.147465065 3.991142461 4.189870376 3.766040725 4.201575095 +2-Isopropylmalic acid 3.466915892 3.942746313 3.539600259 3.152084457 4.490115602 4.156566875 3.919985176 3.824098897 4.177213837 3.3844456 4.059153929 4.361120067 3.206617961 3.889866941 3.011189135 4.859806742 4.118075697 4.999192435 3.249595203 3.634741156 5.096587998 4.44855343 4.13923224 2.581143091 4.430137007 3.768505152 4.696166424 3.164801249 3.527828973 3.813924179 4.000036595 3.238868105 4.408431097 3.93479592 3.084878897 3.498853423 4.87973726 2.780197782 3.788743441 3.336824826 3.84435935 2.818999629 4.189967716 4.412636601 4.070540911 4.801183226 4.233796978 4.653738517 4.366911703 4.183739882 4.997714383 3.615954044 3.401716018 3.526549117 4.119038383 4.500387313 4.062024419 4.162840206 3.44622448 3.785973037 3.860028815 3.71449037 4.905836242 3.915342732 3.034086017 4.548200751 4.560199161 4.606279963 3.630274451 4.231277529 3.927293653 3.259768911 4.18460959 3.979968727 3.863120475 5.139586321 3.866847323 4.36501917 4.701745545 3.837659751 3.175484712 4.544247852 4.018089048 3.419662492 3.715483311 4.740375577 4.35244614 3.459696158 4.588552904 4.076238082 4.31827308 3.658062486 3.676050686 4.220905856 3.637527974 3.962733601 3.803317696 3.43834458 5.066575808 3.25812093 3.154525105 3.397809604 3.69446916 4.525503852 3.423843078 4.029514344 3.896920721 4.683480877 4.33900512 4.629673397 4.301504835 4.576005403 4.64053805 3.472172061 3.43463972 3.803074053 3.792908564 3.954036122 4.032096686 4.375847256 3.274796374 3.974972098 4.45191124 4.261829829 4.343466789 4.047214784 5.153651205 4.80632967 3.671289738 3.769872345 3.585447838 4.111962221 3.975529214 3.69600546 3.685840625 4.722091697 4.282435724 4.013156313 3.339737546 3.882687099 3.499164095 3.856764327 3.646046863 4.494961273 4.194740728 4.40772563 5.000085357 3.841394258 5.19536541 3.909236303 4.674248223 4.091861895 3.047766966 3.619307572 4.238540028 3.858539397 4.206177447 3.334717577 4.020591252 4.17037437 3.36012684 4.336168386 3.979004426 3.950026694 4.216565961 4.00814167 3.923565461 4.02819114 4.583162258 3.918460666 4.188141737 3.934739415 3.542028654 3.858110904 3.845868791 3.712030185 3.776361813 3.943491628 4.360785384 4.495457192 4.320291731 4.894338254 4.470101336 +2-Methylhippuric acid 4.297716111 3.833793453 4.199261935 3.865259684 4.27122307 3.831930196 3.818268219 4.116614977 4.010124405 3.714125936 4.115347599 3.961512201 3.957246738 3.708261546 3.938108327 3.585296042 4.670860491 4.433260463 4.398469758 4.391785113 4.553186135 4.256565483 4.264486294 4.151369453 3.447717355 3.934395944 4.507601862 3.95956944 3.933408609 3.980383757 3.502999183 4.939482589 4.044485714 3.892022065 3.951354604 3.983911984 3.947184099 4.63006946 3.884871408 3.998942554 4.347038864 4.182268298 3.948766443 4.184655164 4.212668004 4.309528857 3.816587234 4.0644408 4.165350452 4.481438304 4.042294659 4.147446761 4.426169445 4.257760914 4.021172232 4.003365512 4.948525362 4.544622146 3.602858497 3.889584867 3.983138009 4.501376333 3.869808826 4.545920554 4.123038392 4.34212305 4.530950101 4.43857144 3.919128791 3.940697976 4.64943189 5.095099802 4.36473686 4.249491077 4.149394266 4.186380076 4.055368016 4.011216201 4.084230559 4.346414823 4.281721483 4.614819872 4.338826511 4.29926333 3.743496813 4.241357813 4.078367914 3.861133558 4.121344973 4.562870544 4.348932673 3.624094604 4.087846928 4.537479368 3.863327986 4.071390937 3.77291017 4.174750099 4.424984845 3.871664187 4.500272657 4.48216485 4.330528929 4.083827957 4.412975616 4.328061791 4.142474086 4.364016103 4.164240994 4.104539509 3.322190336 4.635438162 3.93488456 4.535661851 3.761744189 3.959208715 4.908909163 3.782016898 3.885410808 3.736046989 4.20502311 4.272754895 4.175378203 5.175702408 4.054672629 3.750379595 4.084868478 4.447462572 4.334471742 4.421616074 4.178299866 4.044490362 4.489016612 3.679110535 4.226552038 5.067355568 4.046114506 4.906024903 4.132194578 5.105177869 4.296475729 4.411679055 4.716501819 5.562505717 5.231592691 5.00944987 5.183815021 4.744007384 5.131478717 4.720548082 5.092624352 4.332976025 4.043335601 3.954211363 4.407216374 3.962732214 4.738078193 4.620976423 4.458225654 4.738988167 4.026354025 3.79041055 4.74056905 4.569042269 3.864793714 3.795689112 3.79925269 4.269908611 4.121515177 4.335103647 4.174135543 4.726121343 4.171182786 4.172055679 4.107050591 4.126756833 4.344034805 4.17845154 3.898080214 4.146697033 4.800618192 4.303678123 4.160976713 +2,2-Dimethylglutaric acid 3.799720356 4.19234167 4.146923616 4.233270149 4.755177497 4.33359873 3.891446712 4.534533975 4.367026531 4.381289604 4.107586527 4.230240118 4.063755827 4.270807068 4.510079979 4.280862199 4.219704662 4.024367485 4.177300067 4.524498726 4.228861417 4.599861229 4.252800851 4.419432548 4.100124233 4.283157663 4.448106469 4.217831408 4.184473098 4.376709915 4.752424734 4.443911851 4.529302716 3.80252268 4.129401036 4.16205046 4.34989951 5.249317385 4.089484641 4.043603325 4.305852041 4.148035084 4.20502496 4.468851489 4.289426312 4.272295429 4.587612782 4.603389065 4.379275831 5.08040087 4.34428522 4.665401 4.198540731 4.102976532 4.466339156 4.270545578 4.281858526 4.022179788 4.131678302 3.927403769 4.51153176 4.371961455 4.213380167 4.465299268 3.8988482 4.468517398 4.300360552 4.266470795 3.947081116 4.253037724 5.082887866 4.366971536 4.544129266 4.631167063 4.27224641 4.145264013 3.983343246 4.186249864 4.451611443 4.439933671 3.812199127 4.246498838 4.4466049 4.316700326 4.781731494 4.376821127 4.287628897 4.129890271 4.271188722 4.606776999 4.298733971 4.119793246 4.006587626 4.695235857 4.483149864 4.546877353 4.452230082 4.249916841 4.466011216 4.452661293 4.560812329 4.357251794 4.424346499 4.595007499 4.175085391 4.433839992 4.3930925 4.166249065 4.431192967 4.376702929 4.135984845 4.116866539 4.120679858 4.623401333 4.343793021 4.12807302 4.387708946 4.429037785 4.624485081 4.709736476 4.964646527 4.157678102 4.125803218 4.241305881 4.777696635 4.550950215 4.59379683 4.096208317 4.519870211 3.969381268 4.038186601 4.322471701 4.487434402 4.309441177 4.213801811 4.349486548 4.273827232 4.38961721 4.581010651 4.342064859 4.307414087 4.178775018 3.891456053 4.379908667 4.073768443 4.371209543 4.856217675 4.010278329 4.171709828 4.292175377 4.325313847 4.562633718 4.467594947 4.00641086 4.308923107 4.257518931 4.214263417 3.977058879 4.112625113 4.575768793 4.450577739 4.152831435 4.200451496 4.84149328 4.53443006 4.695069251 4.23483713 4.288991234 4.447872376 4.412384279 4.155046879 4.368462184 4.208306346 4.235477288 4.477394796 4.590931183 4.086511012 4.515310656 4.508231393 4.458355493 4.242826455 4.49623813 4.72165729 +3-Hydroxybenzyl alcohol 3.502957774 4.37005344 3.990813876 4.151259694 4.373424905 1.446237099 4.161600951 4.175691412 4.333414623 3.604361103 4.065173022 4.006826358 1.461689692 4.13795343 4.602938611 4.222632361 4.319823555 4.316176185 4.269907832 4.534762218 4.153499163 4.10214145 4.401083783 3.934819522 2.028952173 4.321014602 4.115158824 4.265450073 4.577106624 4.142287421 4.149935257 3.538985431 4.370772628 4.268322134 4.5926159 3.885258881 4.102971952 4.406897858 4.364355743 3.634262194 4.219106648 3.822422953 4.260249769 4.317807956 4.145613567 4.401864966 4.049213519 4.526431094 4.50786395 4.195686667 4.067248022 4.410006161 4.247739127 4.303036753 2.173602806 4.014347205 4.218573826 3.537467365 4.599249281 4.175812371 4.351761446 4.231685955 4.424586839 4.287510139 3.975306937 4.692682014 4.179834473 4.503376733 3.311708012 4.578732737 4.385102357 4.314520963 4.125838357 4.479133531 4.46955627 4.003779176 4.112515583 4.506980766 3.979520648 4.274323163 3.889963267 4.054525089 4.115934645 4.367254214 4.285880176 2.88142351 4.096926546 4.380551338 4.48989385 3.909933371 4.13189412 4.430486308 4.301280432 3.924391049 2.827751579 4.638346155 4.788764056 4.422116492 4.674092109 4.489413152 4.724655219 4.405152483 1.895924882 4.356968124 4.340176265 4.145353144 4.22929387 4.690595594 4.298471423 4.366117064 4.07300047 3.691901485 4.285242728 4.164826432 3.896317933 4.226588036 4.125816075 4.095323167 4.462737269 4.182535188 4.142440097 4.307814228 4.709650498 4.198763236 3.326949452 4.329735042 4.701274919 4.276780082 4.09082314 4.505710513 4.350430521 4.53598643 4.144759609 4.513096348 4.685830842 4.206386157 4.401494989 4.737557199 4.92663871 4.621228875 4.353757039 4.586052291 3.79749106 4.034759555 4.34184398 4.471941024 4.679330072 4.027062558 4.633137723 4.692113349 4.299337881 4.068138114 4.387968577 4.155694173 4.085336615 4.216048591 4.265717193 4.055107708 4.251726374 4.865189209 2.161266079 1.812776667 4.326405273 4.210519323 4.2431862 4.126390858 4.40889654 4.288048599 4.540105436 4.39776926 3.506129745 4.189687624 4.381284025 4.042624639 4.474057517 5.070073987 4.331236991 4.128685412 4.50050995 4.198684423 4.630386117 4.654391839 4.738578802 +3-Hydroxyphenylacetic acid 4.672720846 4.4901268 4.416154519 3.960911838 4.247531995 4.164327383 4.551696241 3.97076971 4.509400273 3.901836572 4.310386326 3.890507196 4.473985754 4.722715169 4.041185417 4.331662639 4.149130556 4.071424564 4.229220456 4.453683631 4.310652705 4.711755245 3.856335932 3.722110443 4.741444318 4.276859446 3.744626121 4.298471885 4.453581851 4.39554904 3.993151227 4.090969053 4.500995276 4.238006463 4.649282925 4.616411023 4.004764048 4.419401321 4.61221155 4.215638883 4.414913091 4.085800961 4.027523791 4.225935655 3.468941823 4.749085556 4.39732342 4.212266341 3.83069882 4.499428321 3.951047407 4.437529897 4.048802092 4.653477606 4.42048527 4.854533429 4.023638585 3.496824975 3.529906571 4.409303207 4.433968287 4.264683959 3.619605722 4.094002922 4.420971526 3.685798825 4.092457963 4.10923496 4.329052515 4.580414324 4.788555795 4.169624788 4.654683585 3.779403617 4.3394696 4.186621499 4.165309238 4.869200767 4.183131957 4.505150559 3.798975978 3.806090181 4.208331966 4.369916721 3.254837697 4.402221248 3.231459827 3.686985756 4.27618879 4.095623329 4.709402452 4.593703683 4.49665137 3.950837023 4.208066831 4.559783577 4.09040745 3.41014983 4.535189439 3.941470789 4.25623356 4.236771749 4.399764525 4.789858584 4.46658037 4.471473651 4.046312906 4.849314122 4.464463747 3.704428233 3.636665064 4.139049953 4.244400408 4.601692747 4.554710299 4.621043515 3.86539871 4.069201653 4.567997614 4.347322629 3.838764508 4.856407463 4.723997078 3.511308344 4.656239923 4.010489198 4.681764087 4.280630633 4.463404841 3.461376927 3.924501661 4.444886098 4.924413258 4.525255575 4.272571037 4.319151407 4.291472452 4.180640668 4.813613901 3.856781561 4.480897809 4.720040059 4.186164847 3.947689136 4.352622862 4.296767545 4.998691411 4.246827981 4.478351356 4.68038648 4.23622685 4.218245034 3.815163083 3.913666177 4.404550329 4.361462218 4.030009795 4.022334821 4.518821575 4.019780386 4.346452205 4.442889478 4.484854993 3.686499085 4.304278698 4.417984212 4.340139275 3.656849559 4.28529015 4.697373086 4.361999557 4.071701227 4.282727521 4.224352263 4.433077975 4.020273428 4.185461334 3.948778016 4.101459239 3.968214317 4.527180261 4.883937474 4.903423427 +3-Indole carboxylic acid glucuronide 3.548979394 4.344955331 4.174502666 4.688053299 3.276676449 4.206904567 4.771924437 4.740428773 4.076126378 4.234849569 4.315856984 4.42137969 4.17965253 4.544166547 3.636839072 4.204447492 4.394264893 4.24335178 4.741652638 2.907372616 4.236049199 4.465815064 4.196500055 4.347369598 4.185065277 3.716964358 4.249850905 4.330259728 4.356803051 4.221954347 4.051334933 4.10951734 3.872225597 4.217915728 2.948928545 4.414903926 4.237104511 4.140369855 3.90399322 3.927478574 4.198768443 4.248876378 3.892735753 4.137070809 4.006318039 2.924668139 4.402515116 3.782733464 2.82947231 4.393197826 4.076544064 3.674636766 4.275261027 3.327424035 4.853757457 4.100832155 3.477201085 4.44959175 4.408133437 4.36592118 4.324796729 2.545024709 4.30570518 4.335971694 4.321949661 4.578466484 4.090408012 4.440428732 4.17607172 4.292501129 3.129553715 4.050977157 4.26856917 4.457114802 4.216856465 3.554486681 3.863587919 4.255577882 4.423725882 4.428418909 3.821875999 4.11367142 4.337553787 3.119405434 4.260702366 3.312039595 4.109719672 4.797506086 4.321943121 4.233675401 4.153268517 4.329446034 4.435889021 3.600232558 3.669269569 4.335654212 4.265966454 4.246827355 4.461573544 4.296277145 3.065586259 4.408140368 4.44649887 4.039571264 4.280040744 4.291259853 4.376228963 4.364924896 4.282753228 4.554501375 3.939403376 4.181652502 4.203271713 4.430622815 4.305206562 3.939873589 3.874323344 4.251637365 4.053833577 4.316671786 4.615966181 4.345570355 4.310854757 4.220822475 4.119071482 4.32486217 4.320312515 4.075631684 2.865296862 4.037026916 4.29517541 4.351658917 4.145150049 4.652210697 4.184330762 4.245888144 4.579376613 4.409887182 4.194192022 4.130063877 4.465816561 4.274176642 4.210028089 4.329325588 4.028962576 3.93600548 4.332990246 3.764249607 4.505433955 4.090088423 4.242462819 4.304032965 4.283208372 3.9012552 4.620580231 4.399790714 4.347395352 4.155054377 4.333239455 4.225075639 4.800076302 4.386136963 4.371775466 4.246973219 4.384927964 4.10825041 4.071014009 4.686165579 4.597570003 2.683604211 4.469529051 4.086926142 4.195227868 4.206733025 4.328314358 4.350808963 4.254593625 3.922181571 4.27161118 3.574158953 4.329430429 4.369302543 4.286557033 +3-Methyl-2-oxovaleric acid 3.956109582 4.062869743 4.420564858 4.146151946 4.351114234 4.341493999 4.25114372 4.696322137 3.83399325 4.139277624 4.217707219 4.654425551 3.926207795 3.910270523 4.428326978 4.341312422 4.328824046 4.663658646 4.241869629 4.215471125 4.15762763 4.350581938 4.052565093 4.338432606 2.164714777 4.067598819 3.891002615 3.895416207 4.091738469 4.320906852 3.565483575 4.281548234 4.472513403 3.722208464 3.834262143 3.943208528 4.392378403 4.563657906 4.376786133 4.301294709 4.175999548 3.506407981 3.968028443 4.373155374 4.283629864 4.200790126 4.092219364 4.133175373 3.920090012 3.649362953 4.518742785 4.017656111 4.362624333 4.278503991 4.343710436 4.576152994 4.087294682 4.607182584 4.539837962 4.381309975 4.615523116 4.095589017 4.608870554 3.88530618 4.410913899 4.37165786 4.449444491 4.321594347 3.315632 4.403590821 4.565594124 4.413600788 4.41941824 4.591421008 4.452729512 4.541426359 4.076411711 4.567071891 4.388988213 4.5506408 4.22775919 4.320009706 4.469884215 4.425905864 3.955203774 4.357524813 4.103526401 4.339566101 3.96599517 3.820411615 3.944625483 4.248451963 3.874312711 4.620726366 4.72559325 4.635963845 4.123508426 4.573368141 4.652007981 4.20681848 4.376135531 4.144775043 4.316029591 4.323048824 4.442121374 4.067993461 4.203714012 4.178974156 4.466630084 4.563818778 3.92902137 4.195917503 4.222037205 4.584675698 4.617336426 4.494100027 3.950509653 4.410928213 4.158973281 4.616802951 4.417535769 4.415141496 4.470069762 4.602413831 4.190076692 4.536826659 4.121456995 4.53806738 3.972929806 4.018768682 4.168477982 4.521909181 3.547025587 4.036158025 4.18736304 3.939023119 3.753266461 4.446536253 4.5092509 4.705890938 4.278187216 4.355888393 2.909561091 4.404364282 4.145713835 4.245693071 4.67542521 4.192429739 3.968655734 4.306019467 4.588296597 4.186277331 4.503354565 4.323767975 4.0719231 4.179038778 4.0778433 4.583135788 3.697087637 3.992550542 4.113428677 4.216892818 4.794812965 4.435993054 3.902553618 4.174137338 4.173702368 4.314891818 4.086786698 4.427232603 4.366568212 4.117092893 4.421819612 4.136736129 4.276374753 4.345454483 4.114463473 4.253379305 4.321193012 4.488845993 3.947477862 4.460427565 4.342697186 +3-Methylcrotonylglycine 4.204464698 4.055143765 4.14809497 4.193129846 4.225719751 4.127074465 4.103336743 4.225448498 3.904234939 3.94232418 4.423787376 4.278320668 4.194748157 4.044521946 4.411209619 4.038121416 4.348551513 4.52912785 4.839488626 4.493140379 4.211723992 4.684327087 4.179692695 4.127424334 4.178495202 3.842876175 4.321372488 4.052981495 4.183403917 3.941508017 4.168870802 4.361500973 4.143430227 4.104063703 4.381286083 3.863367336 4.040132521 4.274003917 4.21381908 3.663488215 4.423888139 4.213950632 4.119900155 3.898918034 3.839954042 4.287789646 4.294271376 4.263095071 4.401838015 4.476488912 4.251172472 4.282048334 4.313249647 4.395180342 4.398671503 3.614752007 4.333134396 4.671442832 4.230918214 4.340691032 4.352519256 4.509243031 4.187300943 4.668849096 4.602181912 4.679271076 4.438960639 4.416745773 4.011701566 4.311648933 4.50932991 4.637426435 4.506270054 4.616910199 4.38600183 4.286931711 4.332916475 3.961139013 4.274801885 4.388284355 3.958098748 4.223533257 4.317207309 4.360337818 4.342839115 3.587617671 3.956047156 4.368429427 4.410493134 4.335836363 4.462518926 4.189731075 4.050093076 4.697175687 4.540230053 4.538955599 4.025882478 3.833821604 4.477488307 4.405061036 4.242007917 4.453576906 4.630525793 4.245935097 4.548353382 4.337492584 4.450603502 4.562491769 4.14267008 4.170732329 3.630183439 3.927080303 4.349143586 4.744933513 4.23557111 4.331268243 4.077593319 4.289207244 4.563351495 4.532282648 4.290656919 4.523253117 4.485981365 4.582982979 4.339964701 4.194069813 4.351277135 3.995833082 4.3673905 4.07356114 4.630468813 4.285108136 4.232087089 4.340869491 4.595634314 4.435185876 4.233268893 4.305539467 3.926284575 4.205904918 4.302032238 4.713304 4.290332985 4.578524487 4.858087851 4.61166802 4.35750003 4.402636497 4.706946409 4.344601186 4.498795814 4.571215149 4.373280462 4.268513962 4.482838737 4.652116957 4.481216263 4.347919334 4.651231493 4.562998891 4.508041429 4.177179275 4.437261725 4.504838923 4.357207295 4.414256032 4.282859073 3.848887826 4.569927252 4.680841851 4.578390642 4.052933847 4.531072423 4.533602767 4.296428325 3.821542684 4.710922299 4.04738229 4.121745201 4.178401605 4.774725121 4.632197058 4.485803556 +3,3-Dimethylglutaric acid 4.223994451 4.486961239 4.137063024 4.200239029 4.569052298 4.195226443 3.928428448 4.398111469 4.477726771 4.231028753 4.259191383 4.236527395 3.842022029 4.236760998 4.272755245 4.446509024 4.331235778 4.253683368 4.380888669 4.353332721 4.197688317 4.619576804 4.364526206 4.209663683 4.1881105 4.28967549 4.405320266 4.02018626 4.289619949 4.315973811 3.964389276 4.275385951 4.23823965 4.027437667 4.292310287 4.409746291 4.276160396 4.16977214 4.461294622 3.975853312 4.136691736 4.224158977 4.334757042 4.066569871 4.461451105 4.31623956 4.476118383 4.691952301 4.533628857 4.243975651 4.236787131 4.271200094 4.262009925 4.298576999 4.403414494 4.40237992 4.204862948 4.138665903 4.302679662 3.759237685 4.636537894 4.082255129 4.125460013 4.363751157 3.744447735 4.542968521 4.241157101 4.060841489 4.382820095 4.067492368 4.853112015 4.334695646 4.476312501 4.345076441 4.338817999 4.061684464 3.915114466 4.388279428 4.363470921 4.461400368 3.861509986 4.052339476 4.298716985 4.303473469 4.675768044 4.84397278 4.104708782 4.469723762 4.015182158 4.538760259 4.357647849 4.416183213 4.2606853 4.691393272 4.305784173 4.655477444 4.499526101 4.310810023 4.420564856 4.425133175 4.815105141 4.250256074 4.411911837 4.516089423 4.003569545 4.289097055 4.391915882 4.132356636 4.378888039 4.364889082 4.042546902 4.154819149 4.561032161 4.536066844 4.363186132 4.377852902 4.244712626 4.138050861 4.700666879 4.901810052 4.924416725 4.127692373 4.336790786 4.468874966 4.293339008 4.685017562 4.539658775 4.148376253 4.542924615 4.189946528 4.151688511 4.373758567 4.494191322 4.792693157 4.134575648 4.424163133 4.310917664 4.492178757 4.639322891 4.210931845 4.036359523 4.484102337 4.043609793 4.220532643 4.389779903 4.445841944 4.70654342 4.105193859 4.516347829 4.366061344 4.280233154 4.354147804 4.210143393 3.977506199 4.420911615 4.376419877 4.037961321 4.036758099 4.078368455 4.424304802 4.356009986 4.284951494 4.326973477 4.667656079 4.638851669 4.793321348 4.716987183 4.337003095 4.187603841 4.649158324 4.160762644 4.190743391 4.030722751 3.957914084 4.409050177 4.604899241 4.095623617 4.524058077 4.281717053 4.601315139 4.501784065 4.577002318 4.679023519 +3,4-Dihydroxybenzeneacetic acid 3.400453527 4.366694586 3.965742094 4.121298479 4.373746741 2.320550279 4.155087233 4.166003141 4.288844874 3.527081163 4.087601772 3.83941092 1.4428604 4.07828042 4.614126918 4.352865062 4.362276741 4.292730992 4.355644021 4.535898446 4.171274894 4.092492957 4.406894362 3.902789058 2.887021931 4.300850021 4.166401275 4.271747779 4.467376172 4.136900025 4.0939363 3.6478244 4.351900033 4.267288241 4.618268347 3.94343261 4.111790335 4.389125526 4.323078207 3.812178008 4.260296134 3.793783955 4.266652023 4.25075863 4.165339479 4.399128428 4.051848535 4.565938736 4.541826911 4.147504426 4.076819249 4.420949361 4.26206994 4.316080317 1.630670608 4.047552918 4.257935115 3.680710833 4.588435235 4.218595892 4.269395076 4.288908631 4.469354529 4.312870354 3.921149689 4.753437615 4.101728659 4.509294615 3.793871231 4.521745027 4.451931818 4.28627721 4.140160047 4.515708686 4.517028663 3.980845917 4.114089642 4.495974651 4.001853979 4.261429547 3.868196419 4.13746299 4.566332539 4.347346865 4.292850768 2.915021531 4.085065022 4.366252519 4.284599635 3.965654009 4.115871497 4.44955108 4.296315005 3.912451345 2.978119426 4.654718528 4.80429937 4.365144373 4.582728781 4.492280681 4.719274146 4.445232689 3.621648934 4.333640183 4.332530037 4.170880281 4.210891373 4.712798998 4.250079151 4.321374496 4.064095229 3.593633375 4.224129166 4.155013328 3.882297396 4.248763998 4.051245995 4.100269032 4.438241214 4.237909144 4.267540499 4.33483205 4.748587155 4.5228978 2.811576812 4.341741128 4.502339992 4.222792969 4.055269517 4.666280796 4.355340533 4.436736054 3.31102734 4.40000333 4.622409486 4.287823774 4.376750217 5.009557966 4.941270403 5.043833511 4.385725676 4.614337752 3.972776489 4.104578853 4.295092327 4.289815583 4.659721561 4.211160963 4.844752171 4.78787171 4.755273597 4.102565901 4.322781461 4.125510721 4.008490615 4.356043834 4.35414034 4.406781795 4.162585575 4.791855302 3.036066943 2.910924904 4.428201464 4.228056694 4.30140338 4.095299539 4.471035684 4.293040242 4.614028362 4.329826649 3.311804477 4.230916526 4.324650918 3.918639723 4.375159781 4.860022574 4.323752663 4.019973598 4.574970578 4.234485623 4.515669832 4.410269225 4.664951607 +3,5-dihydroxybenzoic acid/3,4-dihydroxybenzoic acid 4.494137556 4.11802084 4.284273559 4.11824787 4.077463029 4.107162683 3.826772088 4.248928073 4.559851332 3.685253548 4.313732951 3.827369623 3.728988315 3.805395447 3.933624607 3.800998621 4.118473478 3.880411853 4.438077349 4.276377226 3.8857113 4.167690568 4.584571612 4.285849549 3.940075433 4.484562815 4.118566411 4.014156468 4.571263565 4.292501459 4.294036919 4.121694167 3.931389642 4.396498618 4.269192292 3.783484495 4.26711309 4.393563183 4.772591028 3.329114305 3.867683205 3.290769245 4.571153679 4.136408212 4.020422071 5.052166557 4.046812184 4.023754228 4.383728136 3.852105514 4.795892303 4.080139907 4.207531411 4.049061391 4.12456187 4.408350966 4.444472249 3.292129559 4.425441704 4.031583942 4.819585441 4.013106754 4.25417306 4.529661106 4.653088261 4.426961616 3.60831389 4.343848816 4.857776127 4.845988308 3.846131839 4.254953484 4.091166509 4.29920802 4.543111046 4.313915304 4.14579985 4.587859501 3.959822658 5.146347318 4.32680681 3.840946691 4.345820501 3.854781873 4.355970131 3.855826276 4.087002844 4.611434603 4.291965694 3.96914335 3.999288516 4.788976987 4.257131641 4.065690706 4.233160816 4.313470673 4.161492226 4.411647145 4.138981981 4.378335041 4.358598789 4.570131858 4.001930539 4.223620588 4.273880257 4.441037467 4.089375912 3.83618004 4.02267456 4.191616778 4.318386904 4.598599321 4.009319723 3.982401847 4.571752994 4.066429179 4.080516138 4.668447172 3.988691212 3.975488152 3.808331844 3.971362846 4.510148397 4.466740132 5.10476336 4.478954978 4.313689807 4.255669056 4.340241944 4.903116143 4.624094488 4.819499609 4.937943894 4.434234567 4.387249502 4.55934006 4.817008286 4.515447738 3.88453049 3.849804191 4.507394812 4.154634826 4.690467764 4.590421992 4.827672921 4.392136761 4.379836973 4.914118647 5.211092172 4.474585185 5.021738731 3.806880093 4.13419859 4.68124109 4.322069821 4.546384036 4.791683133 4.175266232 4.080163651 4.792890513 4.497010908 4.013518235 4.144770429 3.592244738 5.041721545 3.67646823 4.211380244 4.573072789 5.64780865 4.545946544 4.335388577 4.254991615 4.657523117 4.679560712 4.025768422 4.755688114 4.515715981 4.270872721 4.176130612 3.898349768 4.41049841 4.22624615 4.580002794 +3,7-Dimethyluric acid 4.233819668 3.596650747 3.954021738 3.995038988 3.908515001 4.72060297 3.763223501 4.283161127 4.720718327 4.122026419 3.809710012 4.389594052 4.428302993 3.147436562 3.885685117 4.387075686 4.635101143 4.400658339 4.159732752 4.790743125 4.07033603 4.003527465 4.287021884 1.383567399 3.302388516 4.958002076 3.984321529 4.108395077 4.544899485 4.833998354 1.540616732 4.524293139 4.340068406 1.194265667 4.299306303 4.38244021 4.491749111 1.68838143 4.660634596 3.304030673 3.785955614 1.317827313 4.050496697 3.949964541 4.255978348 4.349155358 1.412001152 4.965487428 4.070255509 4.523685708 1.069508355 4.315146238 3.400765104 4.603886929 4.463336698 3.456543371 4.177057784 3.655054961 3.745985138 4.587734941 4.986658811 4.102672879 3.96341199 4.379605861 4.722250377 3.855110531 4.37259197 4.263296094 3.775578775 4.714168539 5.032114685 4.044701612 4.405183801 4.887925919 4.407420143 4.404972861 3.456411511 4.191139051 4.379515672 4.475276099 3.606635868 3.956478999 4.550430071 4.391365983 3.441136101 4.186086739 4.396105031 3.490233977 4.304671052 4.625879294 4.084001355 3.365622613 3.545970697 4.387696203 4.018167804 4.655106236 4.57488379 4.361717325 4.093973649 4.128848496 3.879626672 3.568675858 4.802552286 4.753253743 3.611644019 4.159493692 4.10963911 4.408943088 3.891643962 4.999201682 3.645211464 4.024172829 3.90126422 4.42409331 4.020759552 4.553610257 4.232421125 3.683252707 4.979139807 4.2854478 4.200072874 3.863459278 4.570950784 4.923713225 5.032177976 4.154009297 4.034867213 4.255791263 4.841916446 4.113248453 4.483454203 4.625247948 3.871753491 4.548389506 3.962707211 3.729274523 4.998226873 3.068024101 4.121057403 3.917579864 4.298218099 4.533291834 4.028820256 5.012636779 4.142225365 3.829981463 4.271257701 4.304216507 4.07599008 4.659205177 4.667170494 4.399322964 4.608305748 3.747654281 4.091481368 3.892756382 4.524930588 3.621537529 3.133751862 4.873938824 4.716057294 3.64731765 4.250641299 4.229273016 3.923502331 4.513761671 4.172227083 4.566648188 4.012111966 4.807527283 3.863335845 3.850150472 4.639140762 4.627430545 4.934139844 3.944413469 3.792999612 4.238126072 3.742845522 4.463311908 4.358035063 4.207611713 4.272498789 +4-Acetamidobutanoic acid isomer 2 4.046984191 4.218430715 3.995719199 4.006450055 4.564357484 4.193067575 4.084182572 4.182949167 4.317084732 4.095378812 4.23009087 4.187882902 3.921403537 4.053804758 4.28655102 4.184982328 4.381222132 4.513639307 4.120956724 4.436384942 4.089348744 4.530976983 4.247661363 4.050937541 3.990693948 4.213626932 4.325045895 4.021074071 4.37338749 4.457348259 3.660512479 4.231404112 4.257446942 3.892403931 4.395069333 4.231695253 4.285512962 3.868051455 4.320013842 3.617975305 4.237931025 4.01779192 4.267510074 4.405452469 4.035392914 4.442477311 4.28471817 4.485183307 4.461169616 4.138522051 4.310405953 4.489559655 4.174591494 4.479224904 4.194314745 4.382179221 4.278955617 4.130442352 4.36933243 4.284318066 4.312723721 4.410047215 4.410251484 4.356425933 4.40005141 4.587860397 4.539085169 4.458173474 4.119064298 4.447864488 4.824213764 4.279746508 4.548438294 4.516965 4.371431058 4.196533581 4.213155537 4.184238244 4.438623217 4.422029871 4.230809179 4.279322149 4.322546573 4.524856567 4.272673778 4.390835975 4.235396425 4.190286383 4.494926116 4.294850109 4.075211675 4.066563229 4.1042014 4.426711184 4.417301054 4.391005538 4.487588308 4.554249981 4.670753138 4.376841626 4.541686374 4.45418927 4.208695927 4.804347023 4.359958553 4.409789546 4.45732835 4.386920214 4.361857422 4.453072644 4.092556977 4.246376892 4.584191677 4.332113847 4.383618537 4.347307185 3.860424588 4.386759974 4.489257507 4.508129904 4.664500778 4.412255722 4.329691011 4.339267111 4.487241812 4.145107063 4.396650385 4.204874882 4.507990816 4.249760026 4.4285681 4.267440501 4.143883681 4.513200429 4.510367478 4.123903317 4.48239156 4.435355273 4.400960313 4.406412486 4.323763901 4.189530409 4.007890679 4.345290597 4.034261611 4.343940542 4.433892835 4.274703332 4.374078083 4.303829572 4.33960832 4.439257188 4.253818293 4.044539459 4.225287465 4.252018922 3.999896842 4.223827489 4.098096911 4.321441404 4.473316493 4.271209646 4.48296281 4.464778809 4.213264144 4.331730705 4.42795216 4.446038221 4.532517908 4.452793759 4.374463204 4.216498296 4.285912086 4.257342785 4.376601689 4.404927726 4.537615253 4.418529505 4.277338191 4.467103706 4.408705883 4.328763816 4.444397594 +4-Acetamidobutanoic acid isomer 3 3.964379663 4.08786518 4.031485074 3.884680994 4.347508931 4.040540801 4.194199054 4.036494654 3.875014907 4.049588051 4.205857655 4.379372477 4.022572081 3.660633758 4.398634404 3.672229185 4.118429048 4.00960616 4.828723817 4.613221582 4.113298436 4.682212011 4.104475574 3.95786585 3.978244384 4.070645263 4.204408536 4.074902255 4.218329798 4.006376436 4.074720967 3.898995392 4.165778675 4.105888586 4.610515958 4.320548236 4.029408916 4.18048468 4.361099422 3.692960374 4.348624122 3.820316238 3.842834991 4.268791337 3.680824251 4.468762761 4.351358248 4.282937612 4.681423772 4.324351632 4.267923861 4.240251948 4.492540829 4.480032781 4.28118044 3.868701277 4.675254268 4.476082173 4.484449792 4.393662295 3.845461247 4.557769531 3.990732862 4.444154653 4.687089512 4.843114842 4.249428158 4.45100122 4.287329238 4.25217372 4.583709535 4.404656988 4.501975365 4.239030055 4.486439256 4.254114978 4.527111208 4.153799155 4.200645849 4.38711602 3.752254425 4.261181307 4.318593092 4.511161602 4.032102112 4.353635788 4.015983775 4.361189297 4.468550171 4.111963659 4.277631389 3.801880022 3.908590818 4.532790429 4.511344472 4.544905464 4.071497157 4.388034101 4.657869494 4.173391102 4.319690186 4.467360906 4.558514107 4.054228927 4.621686878 4.380129623 4.259620678 4.285677784 4.113809817 3.900315285 3.658178346 4.120141564 4.374837273 4.784216762 4.145699468 4.176793582 4.002308717 4.349385665 4.37625181 4.359626778 4.158856882 4.519319794 4.513757457 4.226634256 3.761009992 4.224383105 4.453110801 4.15010821 4.713836081 4.094670468 4.805845437 4.276686291 4.551350206 4.522418535 4.670638677 4.420084616 4.266928207 3.780457576 3.870209294 4.295223785 4.154199244 4.800310529 4.312027241 4.120742116 4.708195226 4.909539936 4.354453711 4.179082686 4.789036666 4.296075753 4.379392451 4.626334975 4.350567813 4.410954321 4.456481255 4.534082279 4.53432229 4.822724792 4.547049003 4.316371953 4.437482217 3.925663356 4.628199957 4.173228012 3.983036958 4.700482915 4.16840917 3.955276575 4.467925079 4.785239418 4.624936768 4.459212459 4.590207747 4.487473303 4.411005353 4.019506846 4.560177633 3.903360676 4.036534772 4.058492936 5.006801452 4.496587215 4.507963647 +4-Hydroxybenzoic acid 4.581811302 4.675483139 4.248247699 4.171788269 4.660292988 4.335561109 4.158905332 4.217291286 4.192658629 5.313806874 4.154890504 4.591828324 4.763827966 4.203545535 4.422072436 3.872188525 3.967061946 3.811538343 4.288530074 4.300369646 4.033590413 4.486295668 4.003095815 4.354294657 4.804813659 3.893758243 3.673271702 4.231847255 4.053907764 4.303289931 3.780478597 4.576504957 4.511372828 3.903898519 4.48193787 4.027467985 4.072823195 3.31693697 4.75635731 3.897989486 4.31916228 3.590699113 3.808284297 5.010227519 4.158168773 4.233653523 4.230850775 4.32400758 4.41300055 3.973748033 3.873713121 4.1682523 4.257059582 4.495689071 4.634977036 4.101350801 3.721010886 4.553204776 4.882051642 4.20990738 4.203094018 4.321125813 4.462849161 4.271314871 4.458024309 4.145075629 4.318390585 4.192059346 2.182092227 4.943666352 4.57564715 4.224812189 4.880148859 4.563012829 4.031356173 4.049699941 4.267361502 4.939007689 4.434860938 4.578717827 4.40581042 4.026954503 4.455884915 4.035032762 4.195069378 3.746834682 4.398738106 4.1281152 2.106646581 3.360880903 4.634556763 4.320897307 4.429097807 4.243190227 4.524590407 3.908150254 3.868693933 4.341637123 4.682836143 4.375774715 3.978857437 4.814156857 4.849036385 4.48262698 4.300082106 4.682447364 4.262916538 3.982102523 4.729284114 4.170692171 4.202133681 4.274903577 4.538123152 4.367899258 4.157755534 4.235565467 4.053206959 4.301387503 4.31846397 3.924718321 4.599187408 4.08698162 4.13479664 4.098872063 4.578524795 4.453561075 3.351977018 5.148366394 4.26044112 4.09071734 4.183231583 5.085742738 2.367196954 4.315319978 4.707464177 4.179758405 4.570113657 4.503382303 4.189043063 4.710212795 4.540126781 4.318825414 4.656523959 4.706096206 4.78772653 4.709952208 4.549214255 4.116257062 4.342067459 4.062949624 4.123153406 4.22447608 4.568082358 4.269139479 4.355879155 4.484963035 4.535239529 4.457961356 4.299508895 4.406927538 5.031283459 4.491437861 4.391319723 4.307444939 3.993331365 4.301779623 4.365054758 3.995207866 4.495517781 5.248657755 4.791849547 3.990776258 4.32190868 4.21223186 4.571436725 4.516589827 4.33407653 4.183686787 4.287649313 4.322858841 4.686435794 4.625270971 4.889035099 +4-Methylhippuric acid/3-Methylhippuric acid 3.242186003 3.838006782 4.72389994 3.617350025 4.285847985 3.430341658 3.299994191 3.854158016 4.265667707 4.048860639 3.63506772 3.392771507 3.775575079 3.311462062 3.53486388 3.563054316 5.035692923 4.830488559 4.056129508 3.719104605 4.875061052 4.043001872 4.727923517 4.678198974 3.261332451 3.787440062 4.380707911 4.239506318 3.489953099 3.681724472 3.423700192 4.359213306 3.705276227 3.863801319 3.579115902 4.232934267 3.989144706 2.828714793 4.053322263 3.820650008 4.51670496 4.218154089 3.55698928 3.796179827 4.333344346 4.536109552 3.746730544 3.66862487 4.372877689 3.252182892 3.565487018 3.907467492 4.699838252 3.670167781 3.915211333 4.427240203 3.351711117 4.811761225 3.660818779 3.772154463 4.043751084 3.681462395 4.046173841 4.766900484 3.334301292 3.670113885 4.772820797 4.29531449 4.009630073 3.684002784 5.06283207 3.606905789 4.637433468 3.94127773 4.354952338 4.692823421 4.774194503 4.051864436 3.822909786 4.001355377 4.980129187 4.813669149 4.278915464 4.687543956 3.920432975 3.801401222 4.901679599 4.057478919 3.714000783 5.093593795 4.030363802 3.328740345 3.430189544 3.542149991 3.655292633 3.503782986 3.37931069 3.762022106 3.560671747 3.87060195 4.724289142 4.41258113 3.372111815 3.962788403 3.219974957 4.785031095 3.887703819 4.702313985 3.730125479 3.786802173 3.478025574 5.20801647 3.693294271 4.49022399 3.88518362 4.532512622 3.197668064 3.281755451 3.37419129 3.528354223 4.595557339 4.749444095 3.504930408 5.173401623 3.931227024 3.479985272 4.226737937 4.702685986 4.001274884 4.971668661 3.687486187 4.329314088 5.294186853 3.537910121 4.044053834 3.676656854 3.822865323 3.767560185 5.042959984 4.092715266 4.347503407 3.937558576 3.602162922 4.127888029 4.389736764 3.967645353 4.864923095 4.482998797 3.849137235 3.722760424 4.097405622 3.801103146 4.359246736 3.729735225 3.872254813 3.995832662 3.97308427 4.936669457 4.676381219 4.02374129 4.066187388 3.354891009 5.057644087 4.825774615 3.576691133 3.493179353 3.879089606 4.154666427 4.007812106 3.886082086 4.24066354 5.085789311 3.910099143 4.355648821 3.723214092 4.216404892 4.233587011 4.666871163 3.915717946 4.546429675 3.939016015 3.957332107 4.057366757 +5-Hydroxyindoleacetic acid 4.307544634 4.402027321 3.975412924 4.168655287 4.502182007 4.281092309 4.379544372 4.495214357 4.105822327 4.189521506 4.31557039 4.481418433 4.29019838 4.253033853 4.318097284 4.075345642 4.439765435 3.9553326 4.348066534 4.18649514 4.17229603 4.346000095 4.193838513 4.475751276 3.665663721 3.34642612 4.419010323 4.310290823 4.337410028 4.372171442 4.145700632 4.234054384 4.313765855 3.880743176 4.694964778 4.383580541 3.953211042 4.34353278 4.370746189 3.817267901 4.322195188 4.171778471 4.280891334 4.103565952 4.180887538 4.612846275 4.279364752 4.285976596 4.228049104 4.635537624 4.128319085 4.579574541 4.205248266 4.570477036 4.313653162 4.282795318 4.252929171 4.321199671 4.539354291 4.236156241 4.405789122 4.333826937 4.872287385 4.563345107 4.427033816 4.670446937 4.107663889 4.380449967 3.421302962 4.338266907 4.178364444 4.347756262 4.754924868 4.551334565 4.342559111 4.143325306 4.072110682 4.012999747 4.355461246 4.447298749 4.04310781 4.212165246 4.442333223 4.488975205 4.338019535 3.757343159 4.410244599 4.203933448 4.50732075 4.31781315 4.403086439 4.586659988 4.383272801 4.168981132 4.366937758 4.474457886 4.287813391 4.425816462 4.703630863 4.428331444 4.108074622 4.515691055 4.476480737 4.345278372 4.656173554 4.291460054 4.4235228 4.274722826 4.30220265 4.34548291 3.970502302 4.19932732 4.432427599 4.508004932 4.02625758 4.266433499 4.316887529 4.312370468 4.380934833 4.238147716 4.679716095 4.312222877 4.624038556 4.277154066 4.37698827 4.297369614 4.276934725 4.193154456 4.57553573 4.168289479 4.524772443 4.295869966 4.014157956 4.825631273 4.657789499 4.551332209 4.660771087 4.446377711 4.321221113 3.993454241 4.312737481 4.393597975 4.036182677 4.370401589 4.135225982 4.253756307 4.598133229 4.173151922 4.39537193 4.251152315 4.366926513 4.308539003 4.554444715 3.801453781 4.357609156 4.381371536 3.96102242 4.40583965 4.38758213 4.276497679 4.568761477 4.312493736 4.50700873 4.526636005 4.361470858 4.161842003 4.591711991 4.489883397 4.584508866 4.450376373 4.432690342 4.123160872 4.339095715 4.267212597 4.400382015 4.412515499 4.487556145 4.4803662 4.378169152 4.445571108 4.570560553 4.61379511 4.591220355 +5-Sulfosalicylic acid 4.023477297 4.08369203 4.232118506 3.088972402 4.142685807 3.950240917 4.982740828 4.090823705 4.98442524 1.103431997 3.720013168 3.846030693 4.032781504 4.52225371 0.941272725 4.496737035 3.720167164 4.169784214 4.897063157 3.68544467 3.86569931 4.689196506 3.897866393 3.794142014 3.850975689 4.235019788 3.524955218 3.880796285 4.846867984 4.89024387 4.28374836 3.501871884 3.963303225 4.905552661 4.24009914 4.251011554 3.922774364 3.405700073 5.209842071 4.43633749 3.891536527 3.827539915 5.140030622 0.774200433 3.512088114 4.941120561 4.940324628 3.604204321 3.573805923 4.010445643 4.689951697 4.391021146 4.019074005 4.597202794 4.094333085 4.737866293 4.370598755 3.354824729 3.588525617 3.831506702 3.521464814 4.038811788 4.145936306 4.365699413 3.700456366 3.422694759 4.037574947 4.243870997 4.38715451 3.836152376 4.8997012 4.004403763 4.419193927 3.928886687 3.67835637 4.511122077 4.042936657 5.191723108 4.62104547 4.292880635 3.867302224 4.051821403 3.394784997 4.40500743 2.98133431 3.68732597 4.554786612 3.981659372 5.142331726 3.931876155 4.089959451 4.085580871 3.538954692 4.736284869 3.889767971 4.003997218 4.013018628 4.212452491 3.890244016 3.922271194 3.545408501 4.324113874 3.80766108 4.677581686 4.956881596 4.304078015 4.241468389 4.864832453 5.083492368 3.610490503 3.388850717 4.725799032 4.091160854 4.209933913 3.754617428 4.321028469 4.480490283 4.835453911 4.627902407 3.246764553 4.259725729 4.419642813 4.060317403 3.800426067 4.487283507 4.328859507 4.460617506 4.536194294 5.030689198 3.367266615 4.179603589 3.758908744 4.417991495 3.876526344 4.185899799 4.462909388 4.488817029 3.886355106 4.869095728 4.234080613 3.822195995 3.994601935 3.958331527 3.926166428 3.841814845 4.58901159 4.49217343 3.718159085 4.472980371 5.051655272 4.188562783 3.673801836 3.565458264 3.647337699 4.217907353 4.333736618 4.178016896 3.504514789 3.862538728 4.005426479 4.136152241 4.437883258 4.609953259 4.105197892 3.997173138 3.751231213 3.463023809 4.453680232 3.488705549 4.944747505 3.879431769 4.606639058 3.017810216 5.190955537 4.099027132 3.934038262 4.369180348 4.12578442 3.860510899 4.340479399 3.973770408 5.020660448 3.912430403 +6-(2-hydroxyethoxy)-6-oxohexanoic acid 3.758640363 4.329163462 3.994169621 4.436173835 4.442813511 4.260598545 4.105474347 4.371577549 4.34723385 4.240364736 4.294306175 4.521698811 3.994291645 3.953249718 4.317810304 4.229005465 4.638284917 4.337485288 4.123860602 4.387932157 4.389687678 4.246906662 4.424686629 4.014175857 4.141068659 4.556182177 4.351751905 4.291420579 4.30922856 3.921615951 3.850241886 4.35654408 4.292989434 4.031275315 4.068871221 4.054256573 4.36600611 4.258148716 4.761042367 3.623128794 4.766343478 4.049180068 4.498837205 4.254478425 4.723375155 4.351326315 4.615558197 4.583784384 4.294941559 4.525444695 4.255650696 4.136384904 4.22244506 4.258590673 4.260191213 4.455951644 4.186709571 4.231312328 3.918355158 4.150970505 4.247645457 4.299751875 4.343457601 4.325089779 3.939025564 4.518274907 4.549612891 4.051505628 4.179609399 4.329752931 4.779073921 4.492991282 4.369588949 4.607091723 4.377963635 4.236167341 4.097176018 4.314060701 4.407455313 4.697074667 3.996451508 3.939920484 4.384662221 4.392466202 4.409878719 4.722707393 4.373999487 4.326871012 4.186804256 4.624609135 4.800451226 4.472530664 4.2944721 4.614188138 4.699278491 4.55011651 4.514921986 4.436818869 4.763705394 4.539802288 4.637169659 4.083182348 4.481742231 4.522986263 4.139976614 4.100527761 4.411169875 4.140789304 4.464276318 4.158884202 4.19189977 4.156973555 4.754836691 4.621572406 4.325521672 4.601658525 4.364898719 3.911428139 4.587262069 4.675578765 4.475639013 4.275212418 4.048477677 4.544535902 4.404551266 4.404920481 3.756576265 4.382726975 4.521155762 4.486374583 4.476083501 4.259254828 4.310831197 4.430065513 4.134482626 4.481856755 3.723256731 4.445023186 4.320326768 4.264493689 4.420479365 4.367855572 4.431002452 4.358107581 4.487425925 4.209070284 4.639821556 4.283242618 4.658842388 4.826319108 4.249526744 4.447765377 4.20764694 4.150538989 4.719283926 4.385379956 4.110361351 4.124836607 4.329088746 4.785468341 4.663509886 4.209580776 4.403295072 4.674789619 4.593690984 4.173899599 4.046980187 4.099890332 4.494110305 4.77679145 4.068946352 4.062626538 4.404528364 4.285796775 4.610649799 4.409920889 3.786669057 4.558817587 4.239232049 4.475794546 4.716785219 4.814111314 4.19177738 +6-(carboxymethoxy)-hexanoic acid 3.445392336 3.999589092 4.039266761 4.084427944 4.527799913 4.114818359 4.248547516 4.887580409 4.007891769 4.166171119 4.034456502 4.089753821 3.896744529 3.781179952 4.288645856 4.213977609 4.718835295 4.723046183 3.905128517 3.63048141 3.87790443 4.58488378 4.060433704 4.03270047 3.412438354 4.127785186 4.558196206 4.232369479 4.272760117 4.360180653 3.794824665 4.081681277 4.425941956 3.789166377 4.348765001 3.899991778 4.514261936 3.672457723 3.920255032 3.779910594 4.654674795 3.429786152 4.274419912 3.94675982 4.233158317 4.590078486 4.051332336 4.049922458 4.245892878 4.188538337 4.089860862 4.532727489 4.182742905 4.612089954 4.719644793 3.937355311 4.436914661 3.963082154 4.432328698 4.253314457 3.894674289 3.799670018 4.586854401 3.908584021 4.297473942 4.94930441 4.187367114 4.57556476 3.68454306 4.598548104 4.034049002 4.285959461 4.210458482 4.039894687 4.165139384 3.871663269 3.985385767 3.831940081 4.345755761 4.859102352 3.577311102 4.284312981 4.499666875 4.284959745 4.129943363 3.344345607 4.457654065 3.597011114 4.189023904 4.201866272 3.994016748 3.711982666 4.227710355 4.069345711 4.575060026 4.581796486 4.546972206 4.037379717 4.542652667 4.176675076 4.294989567 4.095508213 4.325163135 4.464868707 4.323026378 4.59968237 4.517297728 4.223830234 4.598814339 4.754019332 3.886017726 4.17781177 4.391530266 4.26353625 4.273030122 4.207938652 1.783118956 4.351042852 4.721741494 5.029139807 5.10547738 4.797664182 4.149808347 4.5008274 4.745835935 4.375919055 4.085945146 4.040711137 4.396462014 3.496395658 4.543049047 3.961895727 3.798053812 3.689105047 4.422822047 3.813746958 4.510111746 4.70420018 4.448021831 4.192104696 4.233504372 4.541922343 3.472741868 3.953825183 3.764809316 4.105389656 4.339086284 3.979392463 3.863832929 4.138944082 4.622558967 4.127114085 4.233898347 3.67447241 4.316191522 3.954311551 3.843721232 3.878935077 3.77409925 3.977315831 4.344450075 4.201053686 4.379847022 4.827406201 4.260055025 4.354511416 4.367627047 4.33974575 4.45384444 3.39046876 4.61884429 4.285649787 4.217932448 4.436438727 4.724276052 4.423098046 4.357052522 4.842572671 4.769506004 4.470752353 3.6881505 4.425203328 4.462327139 +9-Methylxanthine 4.403908726 4.211292788 4.07395983 4.257367332 3.662753683 4.262500742 4.296477349 4.510545789 4.5758199 4.360610852 4.071235071 4.200445863 4.552809846 3.875139602 3.908933066 4.104319513 4.423389768 4.339450408 4.656810762 4.445543168 4.192749389 4.208634491 4.275384286 3.868084325 3.673920687 4.690373426 4.073794943 4.331488826 4.35242741 4.600267522 4.302550678 4.739515069 4.184319682 3.457127478 4.367066954 4.275025171 4.268369378 3.042916317 4.743015064 3.669824671 3.856213704 3.889561055 4.329529656 3.994055883 4.150635608 4.343718136 3.883249385 4.461891199 3.822964412 4.687221184 3.957157951 4.367288402 3.649644614 4.379583023 4.350929483 3.940296291 4.112752691 3.879018106 4.107455927 4.331894311 4.812778462 4.261727256 4.046876508 4.377882769 4.502211994 4.318334251 4.383462135 4.213273503 4.042533306 4.644602667 4.646834481 4.23047532 4.488430199 4.901050242 4.512800451 4.212689425 3.754357268 4.363627642 4.686895753 4.592597557 3.932924125 4.094481719 4.455462526 4.467638906 3.664215962 4.049628855 4.505386709 3.883723365 4.431569558 4.528363629 4.364780785 3.774988614 3.836638822 4.606488082 3.917770048 4.584822234 4.270084509 4.235098719 4.329685438 4.461281944 3.876047128 3.687020512 4.908537126 4.727122227 3.684380593 4.258558814 4.190680132 4.324643893 3.987014789 4.827643629 3.821046056 4.135888267 4.033097228 4.763879327 4.137066513 4.202756356 4.571857525 3.857519432 4.56046148 4.38369508 4.229385189 3.855098454 4.681833076 4.553709217 4.517681701 4.019791834 4.217805625 4.355678872 4.5126431 4.281552387 4.523218048 4.327960246 4.347512511 4.384559358 4.146342172 3.946867869 4.890141288 3.135233823 4.454746828 4.028150667 4.613161969 4.389435352 4.452431479 5.030917871 4.475517178 3.892193391 4.543922726 4.05787729 4.443556636 4.469993919 4.261341275 4.140283924 4.365864147 4.041850569 4.50027066 4.027946544 4.671569569 3.613562838 3.542564227 4.989793881 4.703361697 3.827987606 4.194083557 4.226544063 4.128336903 4.183358106 3.938478169 4.253289629 4.405245065 4.628385274 3.966250881 4.024452011 4.427259017 4.53082725 4.648358556 3.873182802 3.957410051 4.276434243 3.914776113 4.318563398 4.424454278 4.448587206 4.249211165 +Acetaminophen glucuronide 1.646201355 0.094671234 -0.159476724 0.321438533 1.761274626 4.625680884 2.07294372 0.010570405 1.966871801 0.227297994 0.146645162 1.82694255 5.227465524 0.883997744 0.511570153 1.337005857 -0.098843873 -0.203213513 0.223666363 3.286191271 0.079563412 4.361203167 2.921812091 2.117884467 0.522866544 1.186746407 3.93577778 0.242085556 2.969757338 1.672576149 0.278310231 0.465050069 -0.127708211 -0.068442182 1.96608253 1.30854517 -0.140350981 2.588716623 3.699325518 0.031982294 1.291606218 5.303363585 -0.189800966 -0.089418407 3.537405068 1.808534229 0.145845671 -0.288460907 2.603348313 1.933614296 -0.197794109 2.422551178 1.943904967 -0.091897896 2.092208944 -0.134412238 -0.121829678 -0.098153464 -0.198918545 -0.133597752 3.681324171 -0.146029239 1.728598267 2.529619367 1.263670495 1.914356423 -0.017240844 -0.107266911 4.501954334 3.438139177 -0.053925661 1.87473306 1.554653774 2.263663675 3.89291818 1.731262839 -0.077803225 0.437010979 0.117369133 -0.066815382 0.713959199 -0.111569331 4.028763234 1.804710349 0.35844127 2.018666352 -0.115037397 0.090869322 2.151984192 -0.011099613 0.837658424 0.585006637 5.281141908 1.765940538 1.872340093 1.665963917 -0.153302381 5.161564829 0.051640394 0.426480838 5.362819215 3.76347941 4.529298334 -0.278179438 2.61341246 0.008712055 1.976548129 0.04081137 -0.006135673 0.093914725 -0.106595876 0.01260086 2.215954045 0.063351562 2.404372832 1.727640388 0.517918138 1.471955778 -0.055263829 3.293720892 0.241015389 -0.268941855 3.109589692 -0.002185696 1.71356638 2.707351509 0.037865684 2.011642615 1.365950461 0.487846177 1.910471727 1.966522249 0.384941525 1.909330926 3.342439754 1.864492674 4.757104427 5.567388141 1.706783722 0.035967263 2.090187898 2.006130935 0.196911043 2.676292557 0.408099682 0.084382677 4.578557723 0.140208827 0.747825044 0.212237271 0.041303083 2.0739382 0.042003507 0.14167419 0.72669553 2.099676492 0.036201962 1.713907743 0.622541279 0.747144792 0.640791174 0.286196063 2.342299261 -0.300010358 -0.044212743 2.61926009 5.04543163 -0.067056664 2.023469712 1.815949273 2.345278783 -0.046102239 1.567465403 0.158363644 2.771166801 0.131571634 2.415411968 1.743270513 1.232476466 2.16134783 2.030420136 0.817908338 0.250596019 +Acetylphenylalanine 4.169513923 4.515992777 4.083459947 3.767910143 4.187942437 4.292496362 4.31609019 4.149062609 4.597155951 3.727467137 4.232674677 3.59143665 2.538760574 4.050912938 4.059098909 4.004698254 4.22859221 4.023039679 4.325942732 4.398296278 4.243851098 4.108654004 4.265683556 3.629703176 4.216840213 4.423295715 4.180227482 3.942625908 3.902951123 2.422335633 4.396052188 4.627739206 4.575548363 4.03310342 4.469157835 4.545629734 4.3066475 4.060932264 4.233744494 4.541076573 4.117907095 4.091463187 3.919001922 4.234498433 3.908398293 4.693267218 4.022515721 4.146739462 4.713476218 4.15048658 4.411357421 4.20874702 4.341930524 4.425046946 4.428615861 4.269684642 4.546969881 4.549475995 4.606704729 4.361158729 4.218216379 4.060271429 4.387673217 3.921418984 4.174875197 4.522271005 4.349898309 4.454181991 4.628637466 4.17811886 4.269597619 4.801722557 4.166671803 4.182757633 4.379847818 4.33133603 4.373031553 4.4324334 2.481165417 4.436629964 4.007668842 4.529763546 4.104678126 4.400269088 3.673836752 4.386885808 4.526620458 4.108789742 4.230820291 4.159014614 3.792550679 3.907706817 4.211981724 4.191495291 4.222715586 4.951652092 4.419622583 4.660240346 3.856703478 4.426705527 4.700766165 4.932165951 4.3160654 4.297951491 4.901169211 4.066678371 4.231029045 4.390326497 4.309849228 4.515660709 4.268590868 4.313573881 4.204952958 3.945380062 4.267998449 4.013888632 4.203993921 3.976693859 3.936955521 4.068692189 4.081676763 4.494135688 4.593326648 4.372415496 4.204535457 3.946785526 4.540096771 4.393999914 4.645577733 4.475405063 4.313405288 4.406407588 4.750946437 4.293892358 4.320093601 4.428423611 4.331024949 4.231721909 4.449781296 4.556285855 4.644091559 4.54338275 4.463855582 4.576265872 4.728628572 4.735288339 4.578219309 4.402178777 5.021485466 4.705752407 4.628488227 4.594875808 4.185956049 4.737812769 4.39926229 4.517987133 4.349325687 4.330187073 4.446593006 4.520759435 4.528879159 4.254680272 4.782865267 3.726917043 4.049289853 4.115810754 4.323744136 4.583887364 4.638558671 4.370738305 4.099397738 4.275930774 3.663594774 4.528420144 4.042801954 4.364063941 4.250809359 4.161956353 3.99845573 4.285344773 4.713524674 4.154443029 4.061376249 +alpha-N-Phenylacetyl-glutamine 4.406637627 4.362681954 4.101540003 4.173136912 4.332329587 4.366653316 4.461964225 4.388642003 4.415675992 4.332673502 4.458553096 4.437548819 4.429282483 4.414200334 4.317699746 3.938614502 4.270712682 4.234317299 4.555459488 4.421714547 4.315767387 4.274728972 4.063164924 4.36918943 4.504579158 4.260871105 4.09382618 4.306217016 4.31168691 4.279650948 4.2609037 4.503911689 4.495709982 4.279948716 4.330602424 4.113980688 4.223859777 4.269043447 4.293297395 4.216579521 4.331653031 4.360668049 4.182416204 4.226419027 4.291492993 4.457042732 4.28235793 4.381293767 4.392618737 4.676549901 4.203519947 4.335538534 4.3897433 4.450821411 4.453111598 4.304693149 4.299638758 4.459410571 4.26841797 4.241927569 4.447681977 4.420754645 4.27143225 4.581378181 4.427549406 4.38255432 4.209331678 4.231168645 4.283866289 4.189650352 4.464341496 4.47439298 4.462570193 4.539785187 4.364373164 4.347195099 4.051185188 4.600162387 4.394556426 4.481284787 4.220726104 4.310668317 4.171478861 4.493696998 4.129846703 4.48764115 4.394091402 4.338685461 4.531927543 4.211098413 4.558618047 4.588607674 4.647526273 4.407535188 4.355179684 4.431940307 4.278625227 4.805641627 4.49858121 4.625656113 4.456189482 4.440480586 4.700833018 4.403614375 4.479164826 4.218198675 4.522197147 4.415694127 4.284927048 4.391609686 3.91901705 4.045073303 4.19925829 4.534079874 4.28313528 4.244082319 4.624567265 4.113229438 4.394081542 4.086807928 4.613979846 4.260850069 4.688914971 4.206963527 4.321442228 4.349831455 4.051563303 4.32843606 4.487493908 4.193582492 4.367497772 4.432281289 4.216298471 4.423832623 4.609894417 4.42085996 4.46320437 4.196686134 4.133993849 4.244686578 4.552108401 4.373187035 4.533233651 4.548783272 4.688769586 4.31936479 4.573821413 4.326561202 4.656642131 4.39377611 4.310488941 4.308951494 4.085514172 4.175713352 4.81835527 4.613515337 4.377449903 4.326728026 4.571813782 4.457454101 4.906983268 4.554972785 4.469683807 4.128937771 4.245857785 4.255804527 4.252296369 4.123558205 4.657171871 4.526561955 4.264466117 4.054069908 4.403143558 4.464760193 4.279396893 4.279898248 4.431853932 4.470370332 4.2157219 4.39279817 4.652195086 4.661454941 4.351744431 +Aminosalicyluric acid 4.125305912 3.942511754 4.004895162 4.277246263 4.307815834 3.908609803 3.362831141 3.531876612 4.228954584 4.194517002 4.034643168 4.028521309 3.704192773 3.37018234 3.890552072 4.128110271 3.560355554 3.398034484 3.992929114 4.456327843 4.708177834 3.974943237 4.765794078 4.189151836 4.21074852 4.761098539 4.727420107 3.949304446 4.092387894 3.822744493 4.837088113 4.342629455 4.153361768 3.877153376 4.157386744 3.434775701 4.652054996 3.340046479 4.366779552 3.361201246 4.35537252 4.377643518 3.868458195 3.988477904 3.582502741 4.477460046 4.442647096 3.822135582 3.624001917 4.433879708 4.223009681 4.313821507 4.373408616 4.722944732 4.326438335 4.067774059 4.837383715 3.585228614 3.699683761 4.490920421 4.053028236 4.450007868 4.162786526 4.302164926 3.013784151 4.16716517 3.788139455 4.204192953 4.60188521 3.856868965 4.695535108 4.555520082 4.456192558 4.132417431 4.440536658 4.365220078 3.835130037 4.632661825 4.163440013 3.801771439 3.982990911 4.663728134 3.793949485 4.445159188 3.836923414 4.699959146 4.171765185 4.885551177 4.396807504 4.076463956 3.814682329 4.201972176 3.836052857 4.817980665 3.618498124 4.399376137 4.122355627 4.929409395 4.29315624 4.663354638 4.549642937 3.669799547 3.324545858 4.441408859 4.415835404 4.649878114 4.505354381 4.142033002 4.381459781 4.436863883 4.444475084 4.145200045 4.276148033 4.278051637 4.082589804 4.127488593 4.208929019 4.192107484 4.650165572 4.135328974 4.731151515 2.961342895 4.673410109 4.257098913 3.782429246 3.613121656 4.510477221 4.26452765 4.636152717 4.904683017 4.486620338 4.691179626 4.459661097 3.819077982 4.991760216 3.740282756 5.04203888 2.785235255 4.529918803 3.868256093 4.210892378 4.46946463 5.070258651 3.472230704 5.265001426 4.230849862 4.237273718 3.820685731 5.212253847 4.643910732 3.818041435 4.64304173 3.12925336 4.356430489 4.386859307 4.551006839 4.653505875 3.762843064 3.028805489 4.860588427 3.826419728 3.817281611 3.758577168 3.801144328 3.583683632 3.814659739 3.705067035 4.589866161 4.800213113 3.493052472 3.742016483 4.719003595 4.09790942 4.654825112 4.066664647 3.316518099 3.063257529 4.000521386 3.972275628 4.162260519 4.175203154 4.294818591 3.421239062 +Asp-Leu/Ile isomer 1 3.565668774 3.852858721 3.879880741 3.564682686 4.710113671 4.55116975 3.695178945 4.247001836 3.712261505 3.984288604 3.917378711 3.890765125 3.543724766 4.651064591 3.815146983 3.815150555 4.068184736 4.371105896 3.971377582 4.027466676 4.367170491 4.042295574 3.741666754 4.20102811 4.342835787 4.17420322 3.928458608 3.862280392 3.926513607 4.108852971 3.141985003 3.813761785 3.862874137 3.70531895 4.100139266 4.042578133 4.525508703 3.293875357 3.728479278 3.340645139 4.114004173 4.141048104 3.748848423 4.259877333 3.85133015 3.860894187 3.809091709 5.000292871 4.004028331 4.048112186 4.141997227 3.903943729 4.009746701 3.834078372 4.002027785 4.592409056 4.566161975 4.195677039 3.934984005 3.859685942 3.91713235 4.403929362 4.63108006 4.121769264 3.972122401 3.94123585 4.694467634 4.076473356 3.384724329 3.969896253 4.124555754 4.291495743 4.765049305 4.141516197 3.975304583 4.245336409 4.875945003 3.726321077 4.171078224 4.230344651 4.212779208 3.973315251 3.868219335 4.123885322 3.920136962 4.927573182 4.219414687 3.784140926 3.901462252 4.038136044 4.165447326 3.818607677 3.68906972 4.510378185 4.056725798 4.075731584 4.053874021 3.707928961 4.474975908 3.818300052 3.699826327 4.165658245 4.03244344 4.022639945 4.88659712 4.050419195 4.530303813 4.469849496 4.179626044 3.921154671 4.961601481 3.884401118 4.157084837 4.216008004 4.652233087 4.232467837 3.836656716 4.141358736 4.123154774 4.025848482 4.381283996 4.175604194 4.090184257 4.699098933 4.03508133 4.135397926 4.577443327 3.797894568 4.215903052 3.680372332 4.066493499 3.800412066 3.372450565 3.981373093 4.609121014 3.816721903 4.021385826 4.000504561 3.703968365 3.95054076 4.298913351 3.647205701 4.037576423 4.173639156 3.911102059 4.066479134 3.98300268 3.885493305 3.659256499 4.036201065 4.036954205 5.120696665 4.058174439 4.737363926 4.484840651 3.837492837 3.740334327 4.433068664 3.772521236 4.896140479 4.0876658 3.919413562 4.328491435 4.025887167 4.295420364 4.300190048 4.201247821 4.107287571 4.275025827 4.006199322 3.996979792 3.922636647 4.363835025 4.764535508 4.575252543 3.952925794 4.391519259 4.158483171 4.728968298 4.136253342 4.311798309 3.972396626 4.506540521 +Asp-Leu/Ile isomer 2 3.706871339 3.624546933 3.965623198 4.000451202 4.414011612 4.417868913 3.926281369 4.373926222 3.776043883 3.943840569 4.018258112 4.107890767 3.812856871 4.850653033 4.118653056 3.951648232 4.17634634 4.336134102 4.086947335 4.174920658 4.206159456 3.839588468 3.838091939 3.774794379 4.424306609 4.068697118 3.991201398 3.927249755 3.975678213 4.096829416 3.717738044 4.08720699 3.978199671 3.829827008 4.244810982 3.722758237 4.358897813 2.888968491 3.703995527 3.113823624 4.079282303 4.308543763 3.747755945 3.669481017 3.725816666 4.035794707 3.986643078 4.940684113 4.064290762 4.202395404 3.937180612 4.200793944 4.026351442 4.153677293 4.173021887 4.271588038 4.486748851 4.114267113 3.838477101 4.078585282 4.006863725 4.594237645 4.46734983 4.326851716 4.033240294 4.193687642 4.522540873 4.386367131 3.542078022 3.979116399 4.118695498 4.372080404 4.992845647 4.489498235 4.359552695 4.147894681 5.012787229 3.658377754 4.201652414 4.292739568 4.27436741 3.954752559 4.248874232 4.492568735 4.320705664 3.151811925 4.265401269 4.076708912 4.020827518 4.142647366 4.125959881 4.07397474 3.972311304 4.564086403 4.265608214 4.227685179 4.131203988 3.978804567 4.590706577 4.242005483 3.947424393 4.336738485 4.180743873 4.144285582 5.154738984 4.008042955 4.404008875 4.481038822 4.279735464 3.962647071 5.046257244 3.836530257 4.011987968 4.180965881 4.853802492 4.143705998 3.505481722 4.120745236 4.198926784 4.326126935 4.307231424 4.317457612 4.344214192 4.832598033 4.374042843 4.180790859 4.495129722 3.661583344 4.06167621 4.150130119 4.284320457 4.081154259 3.630340493 4.036323557 4.713451898 3.99969989 4.184397041 4.273654916 3.70245369 4.000713807 4.501107852 3.971856299 3.960902201 4.39581004 4.080190148 3.908680386 4.091280842 3.932113042 3.752674945 4.057436382 4.449644361 4.957834805 4.194465225 4.902219052 4.41444862 4.109762702 3.850032506 4.479903996 4.019826802 4.766977621 4.355627759 4.0585683 4.137688213 4.163805445 4.337484871 4.12689227 4.239724642 3.826000674 4.363848699 4.176335656 4.132540582 3.519265279 4.47109615 4.780943674 4.408686361 4.035515208 4.136306131 4.032060219 4.463467627 3.775633 4.188471972 3.893531384 4.435022419 +Aspartic acid 4.262678588 4.27890607 4.225658276 4.476138406 4.460985917 4.545151204 4.522560646 4.475431781 4.209005592 4.180046318 4.16005695 4.421468273 4.388748702 4.352549399 4.12847357 4.184901912 4.549570048 4.173367078 4.291628454 4.319294546 4.242974259 4.259141715 4.216203577 4.348494736 4.338907201 4.053885537 4.339563874 4.446828294 4.230468175 4.277251954 4.171742446 4.614364493 4.470460386 4.092219862 4.538531438 4.440638407 4.236447442 4.411835682 4.233530765 4.08053554 4.235126923 4.192090111 4.142023301 4.302988382 4.05993043 4.20311412 4.422863583 4.324107669 4.533188105 4.475691705 3.871185851 4.34693586 4.341414804 4.323692961 4.487166077 4.234884194 4.216099462 4.207946943 4.303327018 4.325777063 4.509128858 4.328850097 4.224161426 4.335450004 4.486595736 4.290737374 4.490959188 4.29221377 4.225454829 4.278241644 4.405711668 4.359199699 4.595918928 4.587219 4.518146248 4.056587259 4.346690826 4.570292038 4.5259927 4.576586703 4.254662413 4.124010963 4.239099427 4.315199583 4.711455609 4.153856419 4.279177642 4.226742308 4.404647306 4.291688178 4.638932106 4.605944549 4.559172176 4.210165073 4.576131356 4.312549268 4.234737402 4.413174352 4.265497187 4.332071799 3.866636308 4.231928417 4.915587273 4.249946359 4.459828386 4.377559771 4.450261176 4.269753269 4.498859457 4.228849685 4.004985119 4.346706299 4.175066701 4.444966647 4.272671792 4.244531312 4.32861028 4.196503719 4.380912731 4.359964115 4.786543151 4.396605937 4.480341736 4.401546808 4.375524749 4.447226203 4.246014008 4.014349561 4.635260126 4.286113297 4.361436832 4.38005068 4.449588134 4.640204182 4.527806506 4.466498315 4.843512409 4.516375168 4.294984946 4.223742001 4.571174066 4.371175862 4.294453514 4.703905493 4.136668234 4.227950601 4.513499728 4.178149554 4.501025752 4.199546208 4.536350628 4.222118861 4.363362636 3.916198355 4.455878819 4.306149769 4.211902141 4.177757851 4.673196987 4.45218755 5.123631332 4.676638966 4.474865255 4.362297828 4.393770634 4.190091261 4.624370162 4.40069831 4.603209731 4.292025286 4.547317657 4.207222119 4.317516645 4.355591746 4.550290357 4.336649953 4.445650063 4.232604644 4.30997219 4.11302481 4.485478391 4.70388769 4.334297331 +Azelaic acid 4.419660232 4.331719762 4.105070118 4.017998931 4.320763456 4.641621515 4.262313325 4.34990778 4.389703026 4.222185372 4.306394913 4.374646182 4.107936812 4.147555437 4.201008048 4.401241876 4.101307687 4.203287108 4.323311856 4.487467672 4.44045598 4.452312734 4.150352842 4.519542455 4.403604916 4.400391065 3.989788573 4.323622693 4.356027191 4.105954576 4.35940848 4.181051397 4.069764588 4.178494823 4.141146987 4.284864347 4.331312311 4.256817435 4.463386649 4.159199057 4.345699881 3.698767227 4.093100102 4.207550656 4.721755879 4.276077494 4.143047123 4.589065698 4.247882546 4.371381938 4.364179692 4.120640136 4.135903267 4.370939023 4.483516694 4.300111225 3.941153425 4.416644324 4.143491019 4.269397079 4.533601528 4.19649434 4.368681279 4.220039485 4.369163352 4.044670291 4.800372446 4.125515535 4.114989694 4.407166225 4.302774187 4.239096951 4.265364148 4.491942289 4.539127651 4.387055684 4.070967586 4.508752278 4.484295378 4.643155318 4.101326045 4.127072916 4.351271653 4.380788342 4.14424422 4.353895492 4.194090304 4.305856519 4.245866724 4.040592761 4.570818987 4.62785576 4.431849101 4.586136348 4.446081199 4.301660938 3.923391335 4.271342995 4.423573291 4.587418138 4.170117976 4.468548523 4.503531248 4.381739417 4.326455394 4.470403848 4.344235214 4.141932499 4.257674802 4.511958132 4.084455224 4.031856152 4.637826906 4.275478332 4.43418192 4.526503455 4.268179272 4.318364802 4.308437288 4.426720973 4.623934797 4.346621361 4.268121756 4.280747466 4.69574173 4.3700352 4.181502731 4.557527886 4.209768007 4.180687626 4.199458399 4.890517736 4.622861485 4.405156382 4.195085295 4.619560347 4.352824423 4.601985619 3.945949999 4.631015106 4.17023225 4.223275026 4.62956488 4.834159251 4.35031656 4.529758367 4.78124723 4.639058245 5.229402349 4.497989891 4.419110774 4.305716213 4.057833853 4.252920508 4.648325263 4.667371532 4.572165234 4.071090688 4.731201764 4.961390875 4.524943152 4.327350087 4.481196266 4.341893765 4.588261689 4.321770124 4.395138059 4.082017183 4.882619869 4.581508888 4.201957402 4.305869926 4.157323655 4.342689116 4.412465439 4.342145722 4.241601737 4.272858673 4.550879203 4.418736326 4.72833252 4.704840337 4.483361327 +Benzoic acid isomer 3.86724466 4.830235949 3.371990466 3.724524736 4.593359452 4.475129634 4.404544358 3.80062009 4.033450942 4.023628658 3.560339441 3.646274254 3.793879755 3.960548607 3.882868265 3.8635655 3.982092479 4.436322357 4.60386265 4.229187283 4.557374199 3.934060154 4.363889045 4.668904859 4.04891203 4.690739606 4.247815988 4.668330869 4.328234534 4.269418328 4.126810437 3.953518079 4.172779268 4.412426553 4.402854078 4.613616504 4.641340405 4.796236726 4.471869267 3.941671015 3.84752572 3.208036698 4.184019866 4.452500648 4.372227003 4.169460637 4.150183071 4.549424457 4.032104265 4.214544995 4.569496073 3.688317021 3.10834869 4.352049489 3.311666784 4.141733121 3.918299997 3.780964142 4.320744376 3.982892553 4.64091688 4.373228446 4.261552223 4.097791803 3.670795474 4.396242491 3.813919078 4.020934002 4.385199217 3.905886402 5.086390448 3.724151855 4.489522484 4.200350954 2.669142529 4.301504613 4.208046126 5.141530156 4.488399492 4.254552479 4.316057597 4.643682878 3.745287505 4.451565957 3.548559987 4.227813502 4.315464425 4.496455658 4.368432829 3.535231191 4.032376879 4.124530226 3.62282921 3.860836217 3.434918057 4.17323652 4.126421038 4.301570983 4.473973934 4.176522406 4.402001114 4.103008308 3.696582161 4.161921504 4.214459269 4.476052273 4.661613675 3.953317719 4.264990228 4.626789052 4.473180378 4.440875392 4.337777773 4.24962481 4.190775428 3.503913429 4.806539772 3.897503877 4.452618883 3.660979183 5.055403905 3.629918612 3.943102669 4.136504923 3.652830768 4.060649065 4.363713269 4.68421532 4.192297426 2.449092304 3.927857274 3.916519596 4.758298107 4.419456818 4.441205202 4.342806485 4.218735428 3.368612825 4.261675296 4.210204621 4.361808051 3.258098474 4.313564459 4.447919526 3.777895684 4.738342435 5.045063367 4.252196229 5.168784964 4.197642957 3.449174298 4.043354508 3.500282664 4.491693476 3.833926081 4.244741652 3.387502428 3.990363047 3.783901796 4.957046302 4.920768214 4.230361223 3.839495619 3.466690619 3.317370441 4.045105026 3.684199563 4.930841987 3.64351065 4.297384713 3.412949662 4.785542698 3.871249626 4.058759109 3.869914287 3.713925336 3.618887388 4.726480066 4.417195207 4.943446055 4.531173371 4.776084194 4.631228479 +Chenodeoxycholic acid isomer 3.507941373 3.925771282 4.765679443 4.058410296 4.379708577 4.120224127 3.713847835 4.360354173 4.70760252 4.371437718 4.27336953 2.635281076 4.415442258 3.746504059 3.802174877 2.543100077 2.050700108 1.969647326 2.99768978 4.977562388 4.212606734 3.592982452 4.016928271 4.625848014 4.322543156 5.047045003 4.280442043 2.08903272 4.259786714 4.520288061 3.698278591 2.673198735 4.633860086 3.361460273 4.176894861 4.599913917 4.999576149 2.260693586 4.516827233 4.256867249 4.629254177 3.626356199 4.165334488 3.933252123 4.401083492 4.583573701 2.709789331 1.868952991 4.949901481 3.822191682 4.324816063 4.022703291 3.439310479 4.634524877 4.216094988 4.231859147 4.66647178 4.400668609 4.513140044 4.31195068 4.779355657 3.459720144 4.237240773 3.643603003 4.759696528 4.941188179 4.433579349 4.351944897 4.315998037 4.326456911 4.308246047 4.637071202 4.69218283 4.152005115 4.614292535 4.285853895 4.825621342 3.711659733 4.299844425 4.855587231 4.547221837 3.372626063 4.412995466 3.548617223 2.927091707 3.505983327 4.364590849 4.370660733 3.163967297 4.869475254 4.022382898 4.020379844 2.078041361 4.181789065 4.469936972 4.859991764 4.217793675 3.898650489 2.263610617 4.409587896 4.578269647 4.633729693 4.1883254 1.87319865 4.598833968 3.929685241 4.348302926 4.605760213 4.484275799 2.296821172 4.638026402 3.109039778 3.651418988 3.391045109 4.527867005 4.386992653 2.730485859 4.470469116 3.054544728 4.254628892 2.385672231 4.13386674 2.294196072 4.865618394 4.931505145 3.891391195 4.235427371 5.321327365 4.692607582 3.929578822 3.747802977 2.189379061 4.798063828 3.611876977 4.38822091 3.470181968 4.288691587 4.435782236 4.61284713 4.631626184 4.341863664 4.014778868 3.793060081 2.497074223 4.072061495 4.044848126 3.974251727 1.925228474 5.146688842 3.522145223 3.49403144 4.399741293 4.070313424 4.201690374 4.409887745 4.306922201 3.714865732 2.254297159 3.944242262 2.946780196 4.471536176 4.182635817 3.974935826 4.461502819 4.116024184 4.53762716 3.897607316 4.082289295 2.42103671 3.771373669 4.008274394 4.137858878 2.673488569 3.497436046 4.874294085 4.095410577 3.108550628 4.939562014 3.331501086 4.355573003 2.845169295 4.57217538 4.226315292 +Cinnamoylglycine 3.981493072 3.38145318 3.773392727 4.213982094 2.636678103 4.071693675 4.468352167 4.021831096 4.335168276 3.84517088 4.169279126 4.142754737 4.185027854 4.138618689 4.402825257 4.186151459 4.411143508 5.036492317 4.79363079 4.24198403 4.19201687 4.657107109 4.224470598 2.765067579 4.185186251 3.919484074 3.829968254 3.139920497 4.463297228 4.203553625 4.358672239 4.358932389 4.050169088 4.088081038 4.340176117 3.848532646 4.243706092 4.502075283 4.82751082 3.864127489 4.13962031 4.386215348 4.125163204 4.217052345 3.557211325 4.576291837 4.157731234 2.862549424 4.411196276 4.286959515 4.613576375 4.339227979 4.047718752 4.562922143 4.442263047 4.341079923 3.982857994 3.95864023 4.236168705 4.152828278 4.412463732 4.554884423 4.179345569 4.681306358 4.377676348 4.581915279 4.247910547 4.49246686 4.725415319 4.436272183 4.572363255 4.352343799 4.654007275 4.372625847 4.272813843 4.349168566 4.105642463 4.494268106 4.324235934 4.011180314 3.87059632 4.45573114 4.148122207 4.446481852 4.012837449 4.22899166 4.293131461 4.759998226 4.829804313 3.499708508 3.82189672 4.289494729 4.371023423 4.417145135 4.22884605 4.467948532 4.357859381 4.700377286 4.661754126 4.644376205 4.691236629 4.498077924 3.867461756 4.558512415 4.51886409 4.619495032 4.75800958 4.434091071 4.571050785 4.318337104 3.947094154 3.790356278 4.457757157 4.680595743 4.337914689 4.071425405 4.205047438 4.323923309 4.639034907 4.086533827 2.796163078 4.278473939 4.290473545 4.035656923 4.191229494 4.290289633 4.105652555 2.480299912 4.024928907 1.909413041 4.546822246 4.179494901 5.052545963 4.104876995 4.672142103 4.203594057 4.712279263 4.289812165 4.65659158 4.084470544 4.30619547 4.697303691 4.234114557 3.550354929 4.513428133 3.592831102 4.346351218 4.229610174 4.738759379 4.549610311 4.084909049 4.380632237 3.499457598 4.603229288 4.592609183 4.456325277 4.271144143 3.979528235 4.275387059 2.877957352 4.500019419 4.365478971 4.180982159 4.038244505 3.817049857 4.085993875 3.966608401 3.51202226 4.357201323 4.62605352 4.093691984 2.448281586 4.485115802 4.284985775 3.924255083 4.016974099 4.137850385 4.336442386 4.017521614 3.574428929 4.718589197 4.607571666 2.800889703 +Citric acid 4.077504851 4.418116654 4.179829664 4.21891601 4.294478657 4.386380244 4.342538906 4.504382392 4.364181148 4.3856178 4.336328879 4.214319448 4.24458253 4.379453801 4.38638277 4.229816961 4.206949058 4.007234362 4.403198012 4.355490907 4.262640972 4.401817172 4.160245819 4.238622591 4.356172032 4.278483031 4.12214848 4.249421294 4.284359674 4.428659514 4.305277236 4.582959827 4.426733677 3.989141659 4.153612183 4.326324 4.146511647 3.978088144 4.395500705 4.214737065 4.235471966 4.241519986 4.129240014 4.30572703 4.091757132 4.33469633 4.390361887 4.273269122 4.342692235 4.435575373 4.391680949 4.441500893 3.987215326 4.504239497 4.358940611 4.18108943 4.216449036 4.29453336 4.590707359 4.285538777 4.58748265 4.240657966 4.471357432 4.092048223 4.44978379 4.256149942 4.325522673 4.426666232 4.398155956 4.216700449 4.312543612 4.352312693 4.522150899 4.632509263 4.497808243 4.264470612 4.101238515 4.803635835 4.445090222 4.507573742 4.203389879 4.244376899 4.329599669 4.54621657 4.194664384 4.229358811 4.198673485 4.478897492 4.41969875 4.162589668 4.504561406 4.535043525 4.468853839 4.297846154 4.480632033 4.386634218 4.375390641 4.298979556 4.16589978 4.606823971 4.458084438 4.433566005 4.610187829 4.449839371 4.295141259 4.268788468 4.382832467 4.367319096 4.402874569 4.495818283 4.16737518 4.134919705 4.416967256 4.449627471 4.410254586 4.250476699 4.397093385 4.190519451 4.149563828 4.390926383 4.567602117 4.110992218 4.568871005 4.326483664 4.448367131 4.342656856 4.220538881 4.49454957 4.396657436 4.390698413 4.231093988 4.658871242 4.559750522 4.273189673 4.289997294 4.50213807 4.327969509 4.531107448 4.57057127 4.487136846 4.551011936 4.398514341 4.310492397 4.775140976 4.500933506 4.464731142 4.79126336 4.277375223 4.766941203 4.434689116 4.355348465 4.069434997 4.477047291 4.416940492 4.47885937 4.540242678 4.470577255 4.354146772 4.25825461 4.657387746 4.524995904 4.425918684 4.423807591 4.220249441 4.2343667 4.146649834 4.339864635 4.240285139 4.239470935 4.498277137 4.301630414 4.211137484 4.139805927 4.205307114 4.410704386 4.117727412 4.25231278 4.317697631 4.270759172 4.333403329 4.516882782 4.61094387 4.403323075 +Dehydroepiandrosterone 3-glucuronide 4.276798769 3.781078879 4.039522782 3.960037071 4.178258436 4.018968215 3.934194965 4.623505669 4.199948542 3.692954799 3.964720652 4.493531089 4.103096244 4.141067604 4.534587558 4.305692531 4.356197071 4.54901558 4.114247605 3.961314589 3.824267353 4.386985949 3.767656908 4.145823475 2.352751589 4.275257903 4.376408765 4.466288075 4.444300977 4.082227213 3.426317904 3.263286164 4.223090427 3.266308551 4.551056899 4.41694955 4.578512888 3.913795947 3.896087732 2.701147755 4.060341488 2.562186854 4.121758141 3.931054721 4.063997943 4.536004278 4.142323258 4.112047355 4.097004432 4.02244341 4.289882331 4.404824156 3.766264911 3.890008034 4.620480792 4.041278847 4.198860395 4.269503668 4.183370516 4.45957499 4.312772594 4.537418847 4.111873681 4.289976565 4.607317026 4.396042779 4.486929944 4.261456436 2.912939871 4.824696635 5.056527217 4.660268222 4.716478598 4.589009119 4.335007771 4.049710962 4.533068101 4.238152845 4.436220149 4.723204056 3.642979904 4.223197507 4.598402197 4.52839758 4.287724036 4.159411925 3.422501791 4.043958831 4.596367832 4.682379446 4.473615541 4.337666023 3.368514241 4.05741348 4.258473989 3.947929597 4.206227507 4.377585064 4.828426575 4.559011324 4.763211003 4.127554133 4.137573465 4.240936269 4.125518335 4.733855584 4.115354602 4.469567954 4.227271411 4.384356153 4.201614654 4.424910841 4.045683947 4.468709325 4.510480592 4.122238751 2.837334248 4.526852821 4.443386714 4.753242371 4.456891562 4.279848041 3.910235797 4.684401392 4.440231203 4.55350565 4.071463397 2.645389586 4.603618575 3.846342744 4.459314348 4.275986398 4.350106002 4.527922049 4.467808628 3.675637641 4.589111468 4.85519866 3.913570732 3.987763603 3.942768956 4.478996691 3.154717349 3.842394056 3.649086253 4.12888335 4.709174391 4.316752449 3.887648927 4.177376306 4.009898563 4.027277889 4.41227298 3.658139212 4.245525669 4.10177903 3.423780008 4.025636917 3.482065651 3.995979529 4.090641913 4.433671682 4.475847301 4.648027547 4.159744586 4.028173259 4.558608579 4.66834237 4.49949061 5.2370236 4.459156173 4.216167577 4.282642946 4.273579314 4.395864412 3.982069449 4.216899501 4.962730767 3.892943398 4.475482245 3.757587359 4.061018872 4.241429028 +Dehydroepiandrosterone sulfate 4.462774103 3.806104468 3.193502082 4.165680276 4.36325294 3.986996779 3.040706678 4.237767949 3.395426635 2.80571715 2.973556839 3.77167612 3.367209969 4.849470567 4.684479794 4.368515859 4.544111563 2.628914977 3.755359012 2.511892665 3.716167025 2.929191267 1.209995376 4.650028868 1.745754697 3.06543409 4.569901235 4.786453478 4.144206201 3.103368686 2.52474703 0.747665007 4.166963983 2.084833401 3.530892585 0.791734296 3.643083892 3.479545161 2.552174632 0.346039693 4.945757816 1.133210407 1.952747771 2.330401027 3.243393384 4.190152769 3.692192126 2.465526561 1.256372699 4.087392457 2.560943591 5.47507585 2.807051086 3.628604744 3.7964178 4.920367673 3.475439631 4.357577873 4.868821768 4.505226713 0.464877101 4.112521991 4.775341177 2.979097854 3.072331483 3.896636924 3.863157016 2.022925428 2.251287169 4.927737534 3.690753284 4.965086285 4.098471547 4.708469101 4.503314855 2.684088184 4.545998626 3.65545313 4.437748359 4.394655802 3.010988388 4.008899078 5.061204893 4.13886103 2.45401195 1.953983917 0.205296111 3.988508878 3.813906086 3.707777488 4.477249749 4.648108725 3.046462587 3.690242651 4.519137849 5.1733046 0.195216736 5.019899417 3.446353932 3.510694699 4.758013647 3.154688663 4.152636032 3.399446589 2.541226364 4.92704426 3.744509154 2.332051425 4.561346499 3.57022554 4.720462895 4.715345792 2.291911696 4.097627684 4.532155882 5.261171351 2.098449001 3.664599928 4.43512973 4.780002575 4.891994981 4.805086124 2.629334533 4.530957138 5.327150648 5.248427446 2.382705331 0.057546539 3.49387728 2.316846724 4.599308269 3.672655713 3.130079744 2.377536285 4.285937724 3.787358796 3.171858257 5.045323833 1.340592909 3.751056574 2.460418932 3.078672472 3.918548763 1.893434581 2.819125659 3.740268046 4.730973595 3.719944661 3.311735829 3.076664299 4.021877549 2.465209616 4.785891472 2.665612199 3.02438261 4.853185391 3.283182185 3.280061113 2.014361398 2.579407251 4.49755281 4.675171878 3.016821513 5.249820573 5.066117161 4.790910444 3.373832383 2.868966011 3.719006536 4.409156516 5.319092951 4.884747212 4.088902671 3.844311318 5.100470554 2.821026404 3.513738633 4.194823456 1.741775181 3.071345918 2.167536565 2.583908025 5.001021835 +Deoxyhexose 3.760568554 3.809186227 4.226145461 3.997356997 4.084736387 4.296965209 3.849157381 4.127491988 4.613837607 3.417551827 3.560839941 3.786335624 3.807161832 3.447998581 4.160597935 3.856635697 4.332878095 4.66252168 4.216584698 4.380411419 4.291223004 4.238279137 4.81272652 3.666481167 4.732201236 4.703935912 4.430350757 3.99189936 4.04915368 4.504551033 4.731582287 3.771718494 4.227191288 2.811917615 4.240014592 3.918430457 4.543848436 2.705095721 4.553469946 4.293614273 3.956723771 3.034497894 4.30681946 3.978471133 4.054244916 4.426937759 4.111246294 4.362523867 4.254576603 4.001677866 4.509975075 4.258775465 4.394193453 4.238967392 4.109243502 4.584278613 4.692692991 4.299318717 4.185801008 4.271784759 4.239609366 4.111442083 4.180050098 4.348285204 4.185535603 4.317112125 4.637157246 4.401406269 4.816315249 4.385098524 4.483539194 4.560590374 4.303483935 4.381171873 4.632834934 4.544035911 4.421060336 4.802983751 4.625538306 4.174496985 4.352943162 4.456902753 4.300962505 4.303691571 3.607576534 4.329142002 4.294692643 4.412638325 4.411008838 4.626010898 3.349336208 3.440375157 3.807978058 4.412379809 4.125696009 4.291631359 4.162927259 4.570754258 4.586271583 4.400470215 4.41110147 4.420855334 3.603408955 4.215333602 4.072682122 4.766518096 4.435857511 4.525217886 4.294454377 4.396683784 4.593248135 4.614804934 4.492702568 4.067914786 4.576610098 4.152063026 4.328666397 4.241052345 4.303866199 3.996685258 4.320849142 4.295031702 3.78814012 4.36435315 4.56429552 3.483083903 4.726027769 4.791514429 4.386124626 5.109249774 4.415854105 4.79379773 4.969251572 3.98918257 4.328383776 4.438974955 4.593483943 4.220451372 4.59292316 4.475351987 3.768811919 4.193401864 4.884088421 4.136397083 4.65724137 4.562357317 4.685611444 4.542884259 5.04125391 4.433384581 4.135259054 3.81497526 3.890972055 4.849193602 4.559505243 4.518003633 4.504955641 4.192956485 3.842609046 4.896459721 4.251055747 3.710024137 4.272208612 4.274836079 4.302148815 4.22096369 4.141296459 4.568607834 4.518316365 4.313603516 3.945305511 4.469963909 3.70663822 4.238006944 4.195157787 4.087620975 4.056777141 4.634997888 4.271058587 4.402391067 4.168505033 3.538183103 4.599999019 +Dimethylguanosine 4.052598091 4.269906676 4.197531974 4.350022732 4.408428725 4.310143565 4.315772202 4.497621425 4.248062177 4.385290686 4.31060815 4.439865506 4.117313141 4.238034116 4.349461783 4.267852304 4.523557723 4.177409002 4.443593705 4.249982427 4.264437279 4.315286246 4.263334536 4.368490467 4.158555509 4.053279803 4.335105522 4.416714625 4.524236962 4.447563007 3.892995373 4.306731769 4.348326754 3.870416412 4.323312776 4.132845502 4.220468862 4.120617112 4.113696024 3.995702319 4.411970414 4.103047742 4.153782928 4.142907138 4.210409088 4.323331744 4.420929126 4.301298717 4.409565295 4.38043486 4.147382346 4.544228438 4.318337512 4.445982334 4.343192459 4.289728938 4.342153391 4.251355065 4.4803938 4.321025999 4.495658489 4.342892479 4.359914926 4.509807301 4.618175277 4.525792351 4.347023552 4.407776621 4.165750492 4.472909617 4.503917805 4.224508207 4.450533444 4.688727091 4.368343997 4.077805299 4.268858755 4.339474419 4.461990079 4.507822879 4.156882681 4.288235055 4.404183377 4.473328106 4.499344729 4.190944073 4.350903492 4.349052698 4.420649696 4.388287448 4.490991976 4.41048368 4.328792027 4.149446407 4.489456219 4.489672244 4.472116071 4.452227831 4.691774533 4.528826723 4.204184628 4.374788165 4.490225441 4.436155858 4.357635183 4.376995788 4.501521918 4.3427077 4.266639333 4.423609822 3.928622121 4.236910743 4.265015662 4.382973877 4.200708016 4.145651715 4.266810415 4.246853829 4.34511265 4.438016744 4.767733324 4.29671889 4.48632068 4.341425388 4.597428982 4.442621963 4.105507983 4.140298855 4.361849439 4.282905367 4.465095606 4.381214155 4.260714789 4.618260841 4.560164845 4.299429652 4.30788004 4.252873069 4.077630542 4.192799426 4.503213288 4.257484628 4.168284546 4.486169578 3.980735647 4.181693719 4.487989479 4.068118023 4.251887455 4.294833602 4.304977814 4.425565166 4.387552882 3.975011807 4.39090676 4.444197383 4.139105746 4.221659862 4.37468351 4.392707281 4.738718881 4.507497005 4.437873767 4.383635659 4.348774175 4.257027772 4.358071689 4.484260226 4.596796355 4.466143315 4.469527013 4.051247802 4.408126087 4.313469692 4.455645709 4.408337932 4.442947164 4.517358742 4.481542797 4.237602377 4.543725868 4.547476016 4.412187226 +FMNH2 3.565083008 4.208395129 4.034408777 4.233036501 4.597363712 4.19974499 3.970691407 4.554182224 3.873713186 3.734016786 3.958395779 4.336754873 3.732100313 4.252491589 4.506793318 4.101970496 4.340524455 3.913764145 4.400011601 2.592784091 3.866454478 4.339455353 3.951149386 4.269054968 3.396649215 2.536137908 4.268475381 4.383205167 4.640872044 4.526935297 3.847653437 3.8707237 4.429443753 2.479225461 4.441108271 4.418227033 4.19061762 2.968350983 3.631480073 2.927251401 4.465081322 4.005022162 3.727870408 4.232394961 4.161865497 4.480744315 4.296695206 4.244514342 4.073333018 4.236326175 4.17107333 4.798755543 2.764623987 4.633891158 4.248045477 2.734752171 4.096033932 4.096888095 4.614751154 4.466184229 2.998210284 4.43540726 4.271288795 4.445165955 4.474167064 4.702870404 4.422856676 4.528445732 3.028079815 4.566069801 3.92724642 3.790738407 4.518227897 4.715110648 3.899335873 4.171738237 4.082420215 3.885569944 4.428287521 4.526961694 3.615976946 4.477902713 4.387443716 4.529906944 4.32881877 2.6098687 4.352588521 4.070361752 4.282696156 4.16274804 3.981768396 3.773867985 4.243990753 2.618928452 4.607593133 4.821916592 4.516175475 4.547547496 4.536692842 4.29938213 3.740287569 4.580086966 3.293707814 4.550790012 4.240547001 4.398862883 4.456629878 4.296152996 4.360058458 4.338842809 3.981786801 4.108237518 4.513641957 4.487776783 4.00457189 4.448333881 3.390934494 4.378852533 4.276945574 4.252699458 4.69485089 4.524718011 3.867898367 4.304310168 4.712737057 4.359022191 4.18511935 4.156708485 4.524617808 2.933984202 4.566067474 4.008171097 3.160981709 4.681638156 4.542660818 4.370196964 4.757255946 4.752066823 2.697363186 4.064090106 3.919573286 4.369840441 3.043694503 3.222456334 3.301555156 4.225423708 4.3129138 3.422755742 3.174700911 4.165784489 4.369309296 4.570857596 4.45759381 3.548831629 3.666590862 4.230115004 2.932419277 3.983732741 4.158114109 3.911488775 4.35561988 3.155183627 4.477923661 4.599414643 4.486222695 4.242439208 4.396911723 4.687778973 4.642563981 4.419447014 4.510127003 3.782346568 4.432969278 4.386810204 4.40141419 4.252857393 4.709510445 4.666792332 4.700792166 4.427825877 4.476774363 4.532662808 4.535470512 +Fumaric acid 3.567560782 3.840096674 4.384063693 3.416630038 4.091963642 4.012107192 3.671532307 3.840724307 4.881027453 4.009271949 3.83179901 3.802339511 3.844749988 3.722821152 3.948375326 4.03025341 4.001416754 4.680681503 3.98267978 4.378819798 4.242766105 4.244078263 4.68821659 3.771889587 4.797782976 4.904606977 4.143319579 3.722666007 3.767446777 3.908773927 5.024939027 3.983507301 4.073936288 3.697942238 3.97825002 3.812893158 4.525422476 3.822121327 4.736023443 4.15440702 3.860333481 3.662480191 3.736597845 4.069205605 3.801466619 4.290407375 4.045010884 4.096662862 3.978596862 3.558277588 4.213042242 3.998573131 4.411598194 4.163943213 3.912899608 4.510803499 5.107341943 3.876044905 4.199766504 3.762082548 4.485876962 3.944954794 4.112209759 3.776608609 3.841772354 4.183303934 4.252617734 4.065853899 5.140258281 3.938473959 4.511974928 4.811590656 4.198253839 4.208241735 4.606903937 4.548983254 4.569392809 5.020436127 4.112396559 4.073816653 4.622626686 4.183176556 4.161016879 3.975057034 3.947501889 4.091334494 3.846246067 4.689107582 4.408307776 4.436301373 4.058452436 3.754350401 3.864976008 4.105540287 4.032899586 3.992520493 3.876083173 4.830667323 4.178699596 4.806959236 4.142349942 3.900269796 3.829991891 4.069802645 3.990968431 4.345192778 4.595581854 4.266618517 4.022117896 4.2077283 4.873141791 4.790806951 4.143331351 4.094063623 4.511287966 3.988210369 4.196524176 3.935910174 4.095708386 4.193018366 4.10955338 3.853243642 4.133924963 3.975114206 4.085273535 3.91948594 5.075094791 4.617504151 4.101968871 5.241395328 4.089361868 4.640535889 5.21518482 4.173129367 4.351925828 3.87254539 4.146135801 4.205913808 5.011946149 4.609900403 4.102699737 3.991920093 5.245301831 4.134617829 5.075064684 4.528611131 4.848768098 4.710690867 5.382441854 4.432107411 4.176137807 4.038783659 4.072610148 5.054446544 4.476023621 4.662139994 5.014253699 4.409877664 4.1779154 5.462612524 4.178397702 4.034830849 4.046387035 4.020659596 3.873157913 3.610232993 3.93682221 4.212162178 4.032269381 4.134989667 3.741292877 4.086220984 3.641054179 4.078297846 3.979560896 3.951426663 4.0507192 4.356254053 4.108875888 4.459749533 4.305009784 4.154146083 4.471819148 +Gentisic acid 4.300974169 4.584677426 4.764176038 4.06266317 4.431808402 4.238883353 3.866571129 4.217908822 4.388629571 4.663981312 4.266877372 4.291444878 0.925459206 4.584132488 4.356579628 4.152886084 3.777807654 4.462717416 4.187362508 4.379184867 3.994990552 4.489944186 4.177670591 3.197646075 4.143611401 3.998708926 3.488895287 4.49213756 4.291209398 4.310998967 3.958936408 4.037913033 4.701580941 4.380518732 4.355886643 3.570932345 4.595141442 4.186372302 4.673993801 3.240354603 4.22317143 4.34362375 4.06939992 4.537082183 4.039645221 4.34576338 4.055249872 4.140239099 4.601503269 4.373333044 4.336395925 4.395472016 4.083270269 4.881782054 4.617221475 4.310419799 3.693682469 3.971810821 4.528144875 4.654841123 3.768661192 4.786458501 4.521853109 5.025644074 3.982728888 4.848774131 4.419929142 4.195207149 3.71952507 4.694076213 4.252431764 4.098580155 4.457247277 4.271601463 4.129519744 4.02609141 4.734731284 4.686301384 4.478153894 4.398400702 4.324726125 4.104525334 4.22576513 3.419782328 3.78288979 4.23034049 4.199261975 4.225005783 4.698532517 3.428063992 4.188785882 4.35534811 4.201475341 4.529711902 4.681479154 3.263892525 3.886368369 4.11201537 4.178380299 4.436971903 4.02957784 4.773213652 1.366079912 4.477947005 4.030246108 4.148919747 4.162430993 4.511599374 4.916967387 4.294664201 3.992813001 4.053692075 4.928164052 3.862644014 4.162641544 4.662465559 3.779869486 3.886963784 4.183640336 4.350930643 4.240007248 4.011548539 4.574527801 4.415473142 0.878222932 4.305325216 4.526488439 4.260930169 4.342992414 4.46895081 4.893847683 4.419042911 4.277484652 4.3533748 4.595113826 4.43884883 4.237103947 4.714395742 4.393736504 4.536663736 4.055413049 4.274321753 3.943228905 3.738522556 4.025149465 4.179311502 3.926101948 3.936766844 4.675558878 4.356676059 3.842253879 3.964004114 3.86112861 4.058941978 3.860813279 4.142543209 4.165567663 3.698324423 3.98721059 4.297250947 4.079649787 4.138448054 4.547512441 4.036246312 4.349987054 4.236659067 4.280257663 4.266744636 4.379716616 4.532161215 4.077253524 3.841269212 4.696532349 4.528242826 4.410324016 4.402729127 4.101888156 4.488183103 4.018575723 4.366776262 4.513499356 4.807457299 3.686177008 +Glu-Val 3.70666622 4.310927172 4.289508698 4.376817954 4.72188894 4.392127881 4.049237595 4.639082002 3.821355703 4.266130415 4.284175627 4.378978069 3.906109263 4.152752192 4.350452304 4.362779118 4.416866844 4.527326869 4.135738598 4.238758535 4.059163904 4.270617853 4.013038556 4.101742789 3.924571246 4.220714116 4.744405675 4.115053019 4.417116589 4.381296648 4.039283935 3.820099447 4.405153911 4.044221147 4.017472529 4.608555228 4.447626989 3.74522803 4.315010353 3.920601108 4.564197092 4.019064285 4.090617721 4.529227654 3.985450945 3.837148292 4.054284957 4.515650688 4.295487951 3.897571748 4.568120016 4.202248138 4.493703478 4.002694787 4.397870233 4.276456292 4.464801323 4.48006596 4.284473803 4.452749729 4.583315737 4.176740017 4.436546934 4.043574325 4.48191981 4.518593587 4.582609617 4.550368273 4.194412184 4.430053168 4.332653306 4.516097638 4.122816826 4.418055309 4.311167887 4.527135021 4.193220117 4.325525823 4.431114072 4.412475696 3.961759124 4.472920562 4.491854826 4.353161204 4.230446609 4.461841701 4.240114051 4.261996417 4.229056336 4.509750988 4.594264015 4.265426127 4.158068857 4.367438388 4.479172751 4.624056505 4.2117965 4.062587596 4.479710338 4.327326786 4.204462767 4.438829314 4.363576514 4.287107355 4.494813529 4.32899983 4.615795946 4.378240925 4.464453227 4.317035795 4.20294491 4.275224415 4.379870567 4.350606526 4.384260999 4.290580334 4.087801267 4.383898237 4.268091741 4.44075611 4.358408187 4.295002064 4.315325088 4.458625434 3.958149971 4.63928543 4.264634104 4.527305062 4.323019435 3.869954663 4.216087189 4.561983858 4.258991725 4.630221462 4.283141961 4.360775599 4.30971222 4.117800265 4.327466748 4.554773463 4.363406949 4.062461163 4.427888115 4.487732816 4.259478468 4.351510889 4.559948566 4.207323508 4.396105927 4.269430146 4.537192424 4.575133862 4.53503675 4.208887536 4.060288407 4.242601782 4.216701385 4.423571944 4.045791977 4.149163676 4.435973623 4.243145897 4.487064413 4.557092107 4.444706032 4.492528407 4.446077652 4.609683839 4.418081995 4.203722142 4.372006572 4.403779348 4.40372037 4.10756845 4.560273507 4.467803675 4.46799011 4.300581145 4.497071019 4.029266802 4.094641593 4.384376434 4.555933527 +Gluconic acid and/or isomers 4.288424392 4.586464143 4.096406768 4.743170328 4.614798261 4.334139437 4.334812906 4.311405036 4.302074672 4.417309999 4.492846018 4.287708199 4.069351094 4.338178918 4.244554179 4.155565546 4.455517406 4.305656617 4.286882088 4.501016356 4.633382629 4.237331943 4.333312107 4.541545839 4.363970996 4.250851577 4.229871214 4.124341226 4.302626561 4.223284005 4.27663771 4.66965947 4.437051103 3.990947766 4.410325378 4.406677391 4.289133131 4.891101012 4.59474552 4.024250536 4.30814475 4.335607668 4.465820267 4.238130867 4.152474787 4.477980082 4.775393527 4.331275942 4.315858666 4.86116818 4.306486229 4.463550618 4.255787862 4.565648228 4.098849778 4.225365836 4.464309223 3.951214582 4.294821998 4.204050582 4.520976448 4.192166713 4.251692465 4.571597715 4.395211919 4.502530481 4.382810711 4.396060235 4.297746803 4.172879836 4.648445547 4.435480638 4.334860488 4.637108479 4.419658139 4.038422025 4.319330704 4.685101468 4.208779342 4.502420339 4.093845636 4.127934308 4.16859421 4.535808364 4.673648155 4.419672503 4.140732801 4.196191326 4.333772597 4.291233588 4.79131544 4.498230116 4.181557915 4.215922508 4.339138858 4.57319021 4.529636955 4.612799033 4.919131291 4.9284841 4.471982281 4.440686778 4.615649344 4.287490778 4.262995325 4.201766817 4.54356148 4.292915998 4.369026835 4.312853392 3.857356142 4.098567751 4.645152114 4.501253275 4.126585605 4.119398536 4.511175985 4.006067211 4.728682092 4.19126913 4.784383669 4.218583032 4.547149993 4.409090468 4.51924787 4.12824995 4.338278599 4.230104604 4.403666108 4.136804607 4.492035639 4.543837928 4.421245944 4.644026482 4.823819105 4.457334337 4.693968815 4.540632038 4.515255439 4.454671313 4.490168666 4.268034809 4.538180913 4.562580442 4.488559141 4.456053604 4.957910441 4.0825066 4.871432432 4.450047507 4.351347092 4.611879918 4.301500998 4.042500906 4.746972737 4.307252959 4.202920681 4.146884036 4.55515979 4.707612866 4.960789453 4.41567857 4.30492075 4.287666609 4.258084569 4.097221445 4.200243655 4.569986114 4.752594107 4.230731381 4.115842036 4.035500892 4.018950475 4.149248577 4.255083634 4.193371109 4.197902024 4.609683981 4.444646774 4.222413604 4.686411136 4.698504562 4.655849225 +Glucuronic acid and/or isomers 4.271366191 4.701159301 4.123024802 4.593438405 4.461186024 4.461209004 4.403805891 4.311554558 4.399577546 4.496805888 4.500638666 4.164579599 4.334987057 4.376192557 3.991583612 4.186607076 4.347665477 4.486804468 4.500537372 4.378087193 4.763216754 4.262786103 4.405584331 4.436115874 4.833583028 4.427332438 4.254928471 4.191148247 4.164003858 4.211414357 4.40029428 4.652006767 4.234581018 3.925505755 4.29158863 4.63972097 4.355845373 4.791065561 4.550170283 4.536819879 4.199876416 4.352640002 4.454134858 4.284097379 4.123958468 4.313868915 4.565713644 4.2227023 4.284026971 4.804028593 4.34685005 4.31365789 4.269580119 4.384673516 4.19370113 4.400954361 4.46946632 3.930447474 4.114132741 4.161409986 4.657764195 4.110944031 4.304024641 4.496537101 4.340157285 4.460184295 4.48676052 4.351511201 4.609899836 4.194347929 4.71445962 4.451351678 4.320990064 4.509829833 4.407099529 4.274713387 4.179513012 4.728828996 4.275315177 4.524858145 4.155684006 4.134553771 4.138420925 4.52706411 4.542523828 4.353587554 4.117694967 4.221735263 4.395375484 4.441417 4.757241675 4.557190558 4.336935492 4.313678423 4.165956075 4.438654172 4.317108606 4.643222381 4.823917089 4.757124104 4.526940555 4.293017068 4.634497537 4.304945987 4.128651393 4.236591095 4.62083142 4.253793055 4.260887261 4.463076034 3.947016873 4.252188133 4.601315978 4.309012716 4.218295889 4.104346454 4.651257929 4.102027888 4.576388588 4.296127887 4.925470856 4.236317019 4.473424798 4.420078908 4.581094731 4.126071767 4.465282709 4.370626161 4.4526407 4.409319087 4.353225366 4.578216176 4.780284989 4.689984852 4.724880212 4.400270774 4.637205492 4.533178539 4.637404525 4.365253024 4.289205138 4.772162488 4.718525802 4.572691117 4.615688571 4.483896448 5.031608579 4.205305746 5.033855141 4.49037167 4.140360089 4.396103662 4.110661472 4.206002781 4.684798049 4.464536729 4.339877584 4.109274715 4.508938492 4.848693614 5.033430477 4.367734941 4.334701612 4.248635497 4.240374668 4.032511335 4.236367275 4.649372693 4.771255786 4.283868821 4.06419123 4.137905682 4.170213881 4.250849781 4.19224627 4.149106184 4.20204857 4.833398932 4.340235864 4.415464831 4.563314371 4.694615119 4.555721553 +Glyceric acid 3.928441136 4.286770493 4.273123 4.606753207 4.64100415 4.429627888 4.612894346 4.610948045 4.202411791 4.221061658 3.878630073 4.428565809 4.445767061 4.515143855 4.210898193 4.166359906 4.575555081 4.580435326 4.297340458 4.197865321 4.334587751 4.17863049 4.178598739 4.100926903 4.345698323 4.084210798 4.267958737 4.1002765 4.204520988 4.199363764 4.499614778 4.386924668 4.700949574 4.279806529 4.27608955 3.6171838 4.389084605 4.936596686 4.839891844 4.257990692 4.347674977 3.954513416 4.156313677 4.302203696 3.851900697 4.32199623 4.610968647 4.072599081 4.297140004 4.337220064 4.295564024 4.14503705 4.557721906 4.297157481 4.535912267 4.513219312 4.073307459 4.309830895 4.261370736 4.169953605 4.325160686 4.125384861 4.492016277 4.182951346 4.27418143 4.455514949 4.252490733 4.135499815 4.959001676 4.208756998 4.255658201 4.510071226 4.351455709 4.353018111 4.300336458 4.286622889 4.315764156 4.70714448 4.178419881 4.58680404 4.155225378 4.221365498 4.28357326 4.220797452 4.492940184 4.283305837 4.214136554 4.40030801 3.878930795 3.917628299 4.051372805 4.693443443 4.082046293 4.443490865 4.500135979 4.344568955 4.440062967 4.704294898 4.704993631 4.709719753 4.038714981 4.490687448 4.87576752 4.094444621 4.202122109 4.076262016 4.40792521 4.193863259 4.526814771 4.432636968 4.06035193 4.242366649 4.300016563 4.513712914 4.349278523 4.251172035 4.152005968 4.093420178 4.28415043 4.472345674 4.432557868 4.210783209 4.343636549 4.280924321 4.446766508 4.358339775 4.073934813 4.554157338 4.339725371 4.310721585 4.21488806 4.900726429 4.730866086 4.366523492 4.543976549 4.46448814 4.371120421 4.512298743 4.234110766 4.641300242 4.357193334 4.314671053 4.542279793 4.831016079 4.370132937 4.361551769 4.749356447 4.228493064 4.514822819 4.646515789 4.778158946 4.370142115 4.308389396 4.458286906 4.740605349 4.274681914 4.6164659 4.456347692 4.322446637 4.255126871 5.247732175 5.144088293 4.644289353 4.324081338 4.017114805 4.166832239 4.409090138 4.105460028 4.168033923 4.255789191 4.44799317 4.128816434 4.226452017 4.031518286 4.13311698 4.044891998 4.146103434 3.781074624 4.391660363 4.034566721 4.341684644 4.515700719 4.236870172 +Glycocholic acid isomer 2 3.536032693 4.157624454 4.298946708 2.519657942 4.743202379 3.39570504 3.371440111 4.421920583 2.503637125 3.624656055 4.147178348 4.158125946 2.648425962 3.422973331 4.483293618 2.665736818 3.505113524 2.512092533 3.383278939 5.112191409 3.272766939 4.208323 2.575356958 4.115082081 3.217045903 4.702379575 4.561483821 3.471252879 4.577166533 4.186974325 2.474061884 4.112328406 3.587844246 3.826763987 4.900055495 4.585315345 3.966187289 3.56815921 4.2549843 2.710511973 4.549213369 2.246006939 4.084428672 4.464554527 3.730727402 4.15048329 3.659977118 4.593120958 4.410260041 4.042066293 4.564941294 4.248780654 5.039407221 4.396215615 4.220211336 5.106940358 4.188273973 4.753432265 4.719703688 4.549634781 4.655360686 3.886329136 4.365732779 3.918807491 4.818029932 4.939282744 4.201920401 4.089130179 2.844922931 4.433219112 4.525999827 4.725981348 4.001099757 4.623524075 4.208678699 3.940473596 4.967101792 4.200734883 4.209750137 4.908367108 3.872810389 2.577793143 4.33765289 4.404178344 2.543490516 4.141548374 3.508112087 4.12943616 3.660550284 4.220594551 3.687523719 2.767088158 2.443559356 4.510595559 4.484435491 4.633007682 4.233395418 3.393447626 3.433010365 2.605926666 4.858259157 4.643363581 3.075541631 3.834661675 4.803825432 3.236413412 3.85235151 4.605758379 4.548668362 2.761326164 4.103823816 2.186710204 3.346652109 4.262282784 4.383628735 4.154928305 3.173874266 4.465277975 3.700816243 4.12181461 4.589971494 4.310824712 2.847264644 4.372200803 4.666494075 4.479254269 4.441723528 4.306119965 4.413075493 3.674599668 4.501349894 3.974337969 4.536102309 4.374249149 4.402790156 4.102828814 4.641836485 4.931167503 2.540533851 4.016734529 3.882649308 4.611452286 2.917099233 3.018699354 3.862667826 4.569708658 4.195328578 6.025757653 4.717900745 4.109461592 4.262823299 3.959607876 4.473052464 4.108500163 4.242025512 3.949034217 4.2055663 4.035383383 4.068856044 3.819168201 3.361419303 3.006057786 4.160477165 4.629322278 3.931442908 4.583369317 2.52265633 3.864044121 2.979836788 4.045046817 4.267926146 4.048694802 3.926404985 3.843748764 4.59413546 4.698549998 2.714472817 4.412781845 5.234317683 4.536384237 4.202485253 4.682541821 4.487952687 +Glycocholic acid isomer 3 3.467331262 4.170019176 4.04584231 2.687939091 4.763984145 3.371073818 2.494700341 4.302818389 4.45399502 4.165655862 3.527396783 3.730585908 2.629218779 3.974577013 4.802508576 2.743153524 2.656180829 2.639756175 3.542011058 5.402272234 2.433761955 4.001526184 2.580462292 4.183075561 4.532942515 4.91137872 4.161312222 2.591561029 4.393354458 4.274987453 2.624819769 3.167670574 2.525878409 3.44211031 5.054551403 4.65929276 4.194470749 2.762163163 4.203149754 2.681079551 4.338768539 2.388412598 2.502714904 3.778795532 4.125938628 3.591436427 3.984097743 2.500698032 4.518881937 4.225983659 4.682757884 4.339686802 5.162326893 4.56970268 4.178683 4.353258076 4.492312217 4.49550535 4.829897118 4.121161592 4.959909396 3.67359465 4.326996595 2.466536354 4.471239798 4.762237981 4.006352223 4.059831908 2.891283149 3.855337397 4.403548201 4.596942517 3.847451042 4.599716326 4.11146372 2.995880319 4.914134649 3.623684349 4.054143915 5.154447667 4.209719859 3.197338344 4.342324125 3.64608438 2.673888777 4.184418421 3.49755383 4.102705898 2.847451728 4.069953636 3.151155642 2.897919474 3.535559038 4.476392851 4.506888278 4.640959992 3.695300023 2.634711625 2.705573898 3.892964816 4.868357281 4.741362155 3.804761636 4.090670268 4.849567967 2.684060467 3.98536555 4.767495699 4.624236904 2.739978116 4.235944884 2.323464628 2.334232998 3.679268851 4.505571868 3.799660576 3.173232091 4.392114814 3.46296181 3.474923848 4.550923638 4.610294603 2.946620374 4.148855703 4.267692032 4.509845676 4.237966062 4.153686941 4.634871583 3.476856256 4.31635168 4.048111723 4.626485841 3.582603081 4.234639337 4.001699954 4.989873042 4.858925268 2.633326774 4.320459742 4.623435508 4.78853966 3.994614008 3.813997328 3.850859237 4.628223874 2.919864842 3.365408732 4.596921597 4.022860408 4.653440735 3.325230069 4.42447248 4.328408788 4.32751312 4.30098646 4.001387705 2.465031453 4.178630302 3.025340403 3.391410045 4.116948408 4.131858156 3.741293737 4.22360699 4.418004585 2.516043568 2.581272632 2.964046324 4.151510187 4.024158064 3.343212416 2.479626288 3.055575302 4.49018465 4.406945093 2.687871809 3.945995402 5.960429978 4.445126639 4.082619463 4.560025299 4.427960683 +Heptylmalonic acid 4.299341699 4.587916986 4.245114639 4.101908743 4.270874337 4.417991574 4.389124895 4.433952209 4.023465338 3.178928661 4.334173906 4.085223134 4.12631072 3.976001645 4.317494727 4.260280913 4.353529838 4.372408327 4.387316136 4.096800815 4.348361642 4.575197828 4.279671433 4.302046194 3.968492364 4.259355149 4.488639946 4.210616387 4.553557477 4.267628155 4.258225225 4.165941408 4.138713958 4.128371814 4.386588411 4.128157269 4.204054638 4.070802904 4.189612456 3.871673193 2.810881009 3.917182417 4.225714769 4.12660887 4.122921351 4.217599113 4.038259209 4.316820062 3.92937153 4.34567719 4.200202588 4.21874852 4.383751316 4.320500946 4.384915425 4.266910187 4.243456253 4.268981923 4.154994917 4.367063825 4.579474298 4.15440187 4.282061347 4.393613461 4.094841008 4.694408792 4.482884297 4.354927869 4.145848602 4.379481338 4.43351869 4.084361267 4.382022154 4.523537809 4.330448318 4.014939866 4.280868336 4.447454727 4.520675798 4.763367 4.137858374 4.36968073 4.384717857 4.290442682 4.336049154 4.306504961 4.135101302 4.430871761 4.002378762 4.380132417 4.322680735 4.729687254 3.921150585 4.533774511 4.389253474 4.308995579 4.315712146 4.302363603 4.65561906 4.253077044 4.446069206 4.403475926 4.407114925 4.46916994 4.447080367 4.383714826 4.33772838 4.342121246 4.386683226 4.586079446 3.92659341 4.030748056 4.501346433 4.442128437 4.167966127 4.426717505 3.93526222 4.280209598 4.400839445 4.287299163 4.822050529 4.280223497 4.300257928 4.197441025 4.39458742 4.363714115 4.366069656 4.369664727 4.406489142 4.265505322 4.46858944 4.551488409 4.457948422 4.635960338 4.381154144 4.441256531 4.625869451 4.586694526 3.830120094 4.547904731 4.203003359 4.357710018 4.215141513 4.704270183 4.490997194 4.511836712 4.773444499 4.288127062 4.739196982 4.46211346 4.375795785 4.252357671 4.233088587 4.372344159 4.435643736 4.256285744 4.265061084 4.210479466 4.536633127 4.537628515 4.676421216 4.370838851 4.54567416 4.247712169 4.655694544 4.446052547 4.538551442 4.673979925 4.886256786 4.31906369 4.307278845 4.344951304 4.306520411 4.033535609 4.392998165 4.313706179 4.46248253 4.464805334 4.315697852 4.568915849 4.203649774 4.68775279 4.641594557 +Hexanoylglycine 3.700494627 4.288871652 4.154404935 4.076289465 4.575927515 3.904992197 3.877884894 4.230920953 3.912197505 4.273305742 4.04434945 2.993146422 3.84732681 3.773504324 4.685415827 4.26524319 4.055709818 3.874207291 4.721702794 4.721865525 4.074654967 5.165928117 4.217471496 4.759010737 3.440134915 4.036433773 4.111448656 3.696996627 3.828093211 3.969416085 3.371515451 3.893078862 3.924494652 3.744384645 4.299485384 3.825071824 4.292822345 3.472324466 4.060129116 4.02139235 3.602056594 4.019331842 4.452872236 4.058684176 3.704841558 4.113694448 4.243168488 4.291987266 4.093927531 4.42962114 4.231859965 4.41308139 4.127127886 4.590475637 4.164126598 4.239903169 4.263443759 4.095233506 3.948729151 3.630245817 4.390515629 4.531417942 4.127467131 4.382605722 3.641129253 4.667126208 4.499317776 4.100654988 4.331412623 3.825943385 5.050810051 4.424137617 5.023901082 4.627349096 4.425803649 3.953190556 3.800013717 3.387310875 3.98224588 4.160874031 4.025227766 4.240543744 4.413778962 4.427210559 4.499488755 4.400583094 3.654638749 4.671665856 4.149785773 4.056785881 3.854814709 3.874020972 4.126766339 4.731710777 4.264126464 4.485543686 4.086891547 4.596189218 4.379696931 4.558138326 4.535314492 4.394477612 3.946615262 4.464555803 4.203129498 4.609836496 4.584734376 4.379476498 4.115377816 4.173452852 3.860464301 3.853873629 4.106562063 4.768727148 4.219198021 4.032664636 4.162961393 4.356278414 4.86248789 4.269870265 4.621240262 4.246288764 4.130236692 4.195049429 4.628061846 4.041258601 4.430404415 4.198708588 4.415141749 3.762758065 4.677546029 4.298691096 4.523061592 3.975102972 4.418691095 3.929631039 4.257038095 4.594092916 4.579044601 4.07388784 3.942673155 4.192940523 3.838638669 3.985651255 4.281830481 4.534500588 4.518562277 4.567908445 4.100328869 4.176395675 4.336645865 4.746218793 4.271558047 4.314564898 4.132986243 4.296508856 3.896188465 4.403554337 3.776969919 4.072859857 3.943616844 3.915657387 4.110123161 4.993007277 3.939471184 3.850110737 3.984209632 3.819836878 4.120613502 4.762192373 3.85077852 3.743866422 4.082495999 4.169428674 4.247367805 3.701030497 3.782027769 4.363680085 4.333121886 4.719125891 4.829008954 4.236023979 4.450432172 +Hippuric acid 4.281181406 4.274764926 4.030600936 4.4377587 4.105510329 4.297233813 4.362889394 4.210852492 4.324765336 4.328093819 4.358286798 4.242481939 4.235294745 4.374712297 4.39645747 4.205689469 4.344658945 4.229599057 4.440386625 4.41045519 4.328135438 4.28950172 4.389438315 3.618722405 4.546502642 4.27928942 4.260910723 4.270060243 4.298188292 4.138378854 4.365884829 4.348309997 4.187430215 4.210255226 4.301518791 3.994188744 4.472814133 4.556826429 4.662422262 3.890562992 4.301730957 4.057448074 4.21002059 4.355647617 4.045400853 4.329895602 4.322173362 3.834974431 4.45184378 4.606589789 4.388172638 4.151875298 3.999333439 4.304840899 4.216879626 4.40497743 4.224938416 4.087002099 4.211363835 4.237846424 4.503335486 4.268106624 4.733404738 4.356578299 4.540218616 4.193280808 4.319896168 4.48671195 4.482043682 4.178296434 4.660852766 4.20366686 4.310835914 4.286814768 4.10728861 4.291238889 4.380042706 4.922998331 4.478193264 4.270458553 4.319780156 4.392282318 4.226292111 4.408696132 4.331386823 4.148944199 4.274367842 4.617327952 4.552965506 3.893501845 4.614562993 4.884670776 4.407130077 4.220684568 4.228891984 4.327189976 4.36006739 4.409281652 4.484422172 4.69733527 4.539179502 4.475007184 4.315367934 4.374963685 4.371871127 4.287049949 4.589736242 4.489876183 4.448628035 4.640588131 4.188972462 3.996302392 4.790488834 4.276373806 4.435834282 4.23276951 4.685424215 4.106025464 4.25233276 4.159998736 4.101688019 4.242501128 4.559037747 4.007443418 4.256428672 4.281113631 4.095520474 3.924342946 4.128061232 3.889590709 4.151648869 4.285397077 4.728645432 4.741148141 4.585295007 4.533389542 4.382599634 4.363833136 4.812642141 4.593856163 4.846698618 4.302381024 4.520806167 4.373805782 4.402355933 4.170850464 4.698599386 4.08915133 4.946422722 4.427300849 3.962706786 4.260480364 3.748521079 4.453949385 4.578057907 4.569995861 4.291736306 3.826629402 4.499493406 4.605220817 4.836919162 4.535375651 4.13720766 4.048475513 4.258218387 4.113680538 3.943688485 4.514435711 4.640780843 4.143918073 4.072874384 4.35791414 4.256345532 4.148999488 4.134123407 4.194779022 4.254028219 4.539702312 4.099636862 4.351963388 4.456370849 4.751454705 3.896687817 +Hydroxybenzyl alcohol isomer 4.238095945 3.602193865 3.948782363 3.368220034 4.324214366 4.043064848 3.778587616 4.278639704 4.578267158 3.88599815 3.910158559 4.149224738 3.83544383 3.636450775 3.920965394 4.055184269 3.967744016 3.95438243 3.840417028 4.615547066 4.075727845 4.111320633 4.011566708 3.826437949 4.242439967 4.385580069 3.647015945 3.903041839 4.416234287 4.206459426 3.981062813 4.34793272 4.136204117 4.054272057 4.26208997 2.618565082 4.154186878 3.785708712 4.46076539 3.996754115 4.468887035 3.667304739 3.672568761 3.769788931 3.57958633 4.490505476 3.817725974 3.920914438 4.990518828 3.805283938 4.265493802 4.196331358 3.884832901 4.333636998 4.14591893 4.418813752 4.155670063 3.924153826 4.814997891 4.535243211 4.231423076 3.78947273 4.723121412 3.976255353 4.333769207 4.059959077 4.289629231 3.910171146 4.156976673 4.01458566 4.269220734 4.31459281 4.114280729 4.432281478 4.64705089 4.404234273 4.603482331 4.267855985 3.977068906 3.933572706 4.214823939 3.881594303 3.653798241 4.32665794 3.750840076 4.325983718 4.912840068 4.542411988 4.613574103 4.195678046 3.945161317 3.721114131 3.966845221 3.872586236 4.219960639 4.496731561 3.898041059 4.882479632 4.42627767 4.328235308 4.294927583 4.630495646 4.25622935 4.133590699 4.162605733 4.372019817 4.287660371 4.479711336 4.174157489 4.120745738 3.82068464 4.245268805 4.070527458 4.036357352 4.638982812 4.074242087 3.818249513 3.599702831 3.971269738 3.46108935 4.036540915 4.516148364 4.612132391 4.468767731 4.303020879 4.115533454 4.650413816 4.19214737 4.218245071 4.063104951 4.393212353 4.406739821 4.371388454 3.847027409 4.659754156 4.20053985 4.297973276 4.40761158 5.525149578 4.182043465 4.322445192 4.099210001 4.268751616 4.443693583 4.184085991 4.233128083 4.619077472 4.450312072 4.49148768 4.765013638 4.18336194 4.311638131 4.034342256 4.141411593 4.197153012 4.166333722 4.374668288 3.901828407 3.642516999 4.252584517 4.457777181 3.623378123 4.245376308 3.907968699 3.73256083 3.990035382 4.13804275 4.039730651 4.070395479 4.458161978 4.007137476 3.868736136 3.870190818 4.187933308 4.223019968 3.973337482 4.373276529 4.17072504 3.988192913 4.114129541 4.236625508 4.189598627 4.550228372 +Hydroxyphenyllactic acid 3.959217417 4.7746982 3.457264319 3.805230444 4.567749234 4.413443475 4.398338756 3.899031787 4.182781481 4.052861502 3.701510177 3.727090801 3.832110389 3.945884164 4.001123201 3.93428456 4.061211166 4.452515919 4.651141269 4.221234657 4.551629486 4.014022002 4.347069881 4.607224561 4.140099182 4.623355189 4.229334657 4.610683883 4.300694283 4.257820381 4.196057652 4.033600172 4.190181129 4.363748239 4.36225888 4.529039362 4.58501606 4.721550016 4.48959368 4.031103382 3.887439925 3.421020593 4.209418663 4.399725994 4.344333961 4.233509276 4.196792095 4.46755515 4.057574804 4.237395496 4.512004238 3.728033819 3.203497905 4.328205079 3.501965065 4.175298261 3.96565232 3.880560295 4.33875911 4.003871643 4.612304589 4.336677673 4.282635551 4.047371866 3.778759797 4.369080432 3.951525215 4.112165721 4.409239866 4.004693373 4.986103581 3.88109775 4.408585254 4.225526661 3.201573806 4.27269161 4.190592708 5.077770746 4.44546873 4.287048036 4.288975789 4.541632632 3.806530397 4.403872445 3.718781541 4.298385818 4.279111453 4.435975955 4.342274794 3.669728066 4.055568739 4.270918034 3.77441146 3.899089252 3.607303096 4.20983163 4.151141669 4.290911369 4.457272827 4.208096346 4.338810266 4.145108336 3.792040108 4.198380221 4.170382368 4.466278666 4.586087143 4.012170362 4.277405452 4.562791765 4.407174915 4.395096692 4.316153913 4.261480471 4.14413833 3.634536583 4.757604108 4.003506306 4.410089439 3.781970132 4.968567493 3.797772595 4.079334447 4.09508471 3.745488717 4.053733869 4.335520026 4.609481364 4.155458247 3.339208362 3.996329249 3.983570608 4.74241778 4.360508239 4.407460709 4.266838128 4.281466815 3.462959414 4.29828428 4.223274125 4.378904878 3.402341252 4.387389769 4.499347989 3.862868802 4.648858889 4.977407635 4.258109138 5.093650954 4.190659695 3.598162996 4.093556916 3.690273805 4.444775963 4.035539612 4.211078784 3.60366961 4.031757488 3.953881579 4.932062447 4.902649063 4.325015164 3.961916218 3.655265521 3.477494018 4.067113425 3.748321748 4.847839447 3.844473841 4.281623768 3.542234664 4.720023914 3.979118095 4.135740449 3.923872798 3.877114564 3.662919671 4.687393606 4.39528041 4.843950551 4.546663495 4.766393928 4.61182424 +Hydroxysuberic acid isomer 1 4.144705403 3.914817917 4.118942163 4.016531806 4.513976916 4.522243053 4.285403698 4.342154264 3.924279126 4.366647384 4.469864155 4.976970144 4.162378033 4.049386125 4.240019565 4.334291758 4.542278478 4.389010605 4.138563572 4.438416093 4.498221059 4.303678684 4.221448876 3.988971473 4.435946462 4.241119434 4.262258144 4.79386579 4.488099749 3.945453277 4.393734888 4.397420668 4.301083657 4.380994205 4.127391755 4.204329514 4.254143488 4.44695043 4.522612738 4.381412852 4.299224006 3.990272339 4.394347075 4.040006973 4.567255087 4.435613289 4.400651854 4.212317152 4.542814939 4.375791888 4.329849213 4.359914932 4.458373621 4.543850609 4.11412778 4.447103472 4.20010677 4.538600054 4.228280646 4.325472577 4.252069179 4.220340693 4.351665407 4.3391945 4.023619504 4.489888042 4.523369458 4.20941117 4.194560521 4.249973491 4.361839662 4.005542959 4.648201559 4.56740739 4.081715484 3.848746942 4.26332104 4.124255829 4.460454156 4.827310291 3.995318425 4.229915118 4.291741862 4.610505536 4.647926358 4.868524459 4.306128222 4.257802822 4.21039602 4.58510712 4.60761948 4.639673641 4.077559092 4.409509612 4.711504573 4.776768461 4.126365396 4.93785731 4.456377159 4.556379124 4.541253146 4.192737214 4.559415523 4.296264528 4.140275927 4.299546615 4.115155954 4.381814031 4.24598474 4.379393303 4.347555355 4.085712798 4.860704482 4.45000418 4.254892161 5.085366473 4.269422264 4.103345178 4.335497007 4.616897702 4.650494624 4.36560137 4.357906847 4.19802683 4.246297818 4.304997199 4.580731277 4.383417485 4.153042026 4.193249037 4.532266672 4.210513682 3.877898772 4.41164339 4.553296486 4.392118999 4.255983333 4.245322848 4.375085662 3.501977743 4.11019149 3.071583994 3.923260626 4.251076891 4.470506744 4.150614595 4.652168676 4.312681933 4.581145079 4.319989308 4.123947159 4.698161147 4.258927502 3.898712888 4.282024265 4.150906295 3.804466045 4.475388248 4.275965071 4.427164904 4.597372388 4.447296374 4.269894533 4.885277779 4.668776693 4.038633134 4.296337821 4.311152862 4.769922833 4.330749606 4.32679194 4.05391565 4.559818415 4.063704921 4.851577771 4.229145143 4.338693741 4.20890346 4.325720566 4.55024814 4.458826922 4.683903096 5.206982705 +Hydroxysuberic acid isomer 2 4.295284686 4.351691984 4.050347912 4.476785326 4.474938192 4.145573966 4.098720809 4.632852997 4.448490639 4.39266973 4.312070036 4.109924286 4.219913588 4.19746051 4.592835007 4.327363558 4.446781103 4.636442485 4.355988418 4.409273441 4.483293525 4.489180971 4.196126612 4.267684629 4.141754605 4.130937904 4.209138076 3.754969139 3.764841597 4.207547204 4.096144918 4.259630436 4.124115295 3.927281919 4.183801393 3.832349421 4.299320282 3.783795559 4.2381878 3.96431657 3.111441418 4.162554788 4.260495207 3.82777952 4.173838719 4.212833395 4.274637707 4.48498412 4.508967048 4.528003039 4.251809614 4.616091079 4.283540389 4.189354995 4.476456189 3.082213857 4.221298851 4.294973349 3.226830641 4.158236387 3.568805272 4.326496164 4.241551292 4.572082909 3.973012405 4.594610387 4.543973286 4.112547206 4.019009756 4.150066567 4.40633231 4.628981905 4.693255718 4.92929413 4.296871725 4.101882673 3.812234114 4.507406599 4.338383646 4.823838229 3.478325135 4.083768262 4.449974878 4.437978499 4.963801205 3.795648629 4.06659559 4.327182723 4.071588258 4.532926992 4.645986412 4.465882332 4.163032797 4.536827574 4.753183221 4.986176411 4.415358637 4.520882778 4.464419965 4.560460365 4.467591553 4.226198194 4.470720527 4.492288795 4.126402668 3.183760163 4.4327761 4.103448591 4.326567569 4.218262475 3.959957684 4.027573089 4.309092244 4.813540287 4.148156954 4.395528973 3.701406888 4.394462608 4.841337727 4.788748719 4.317592094 4.31997786 4.414210832 4.614521049 4.819447462 4.444999096 4.569037934 3.928345027 4.471443693 3.788532868 4.413122574 4.50437917 3.681419431 4.218097729 4.163469208 4.123699519 3.992317776 4.669446561 4.223482269 3.988116441 4.136975939 3.637542861 4.089309199 4.453895655 4.100302891 3.990302589 4.709592004 4.367374161 4.568026774 4.206736023 4.44539644 4.899803439 4.437073919 3.986544636 4.334172635 4.382537367 4.253406907 3.942775454 3.870360096 4.428713838 4.568407465 4.289774046 4.107396519 5.493512973 4.558551711 4.230008977 4.175076848 3.683935878 4.419333208 4.775206575 4.084944527 3.944814642 4.579656668 3.637578915 4.442723844 3.962425615 4.349661246 4.164361872 4.476814169 4.510899972 4.21281001 4.499599349 4.112267314 +Isovalerylalanine isomer 3.878689037 4.16756426 4.427536001 4.377871091 4.700257705 4.067620181 3.918469764 4.481128255 3.978227936 3.96921542 4.435000147 3.782618485 4.109885125 4.126640846 4.362388596 4.128542209 4.52046266 4.816274879 4.881582233 4.473484203 4.090203183 4.641664294 4.810348877 4.41061049 3.891813535 4.337487178 4.310444815 4.259243129 3.944113094 4.018618094 3.404236722 3.90479245 4.045973611 3.56345757 4.236182952 4.071445735 4.318295694 4.231806988 4.218238304 4.214393128 3.727828555 4.167320546 4.639434867 3.591083431 3.972759138 4.166871169 4.690375615 4.499454388 4.281409674 4.685818606 4.361562863 4.527869568 4.152581637 4.372755586 3.551508291 4.312019652 4.316304678 4.419733914 4.492847638 4.266300419 4.401639232 4.317832308 4.026809684 4.23402821 3.784390171 4.673714247 4.437149191 4.129383771 4.713260681 4.397070904 5.131916989 4.679517583 4.822632615 4.466989858 4.633423069 3.839710918 4.537968182 3.926495195 4.357528973 4.377687298 3.8955673 4.370500777 4.632216417 4.077669937 4.616216404 4.432957188 3.762776451 4.454513418 4.556774702 4.336794407 4.207343361 4.116813201 4.176629032 4.884450435 4.20362285 4.788865118 4.167782638 4.29098975 4.472214003 4.478494063 4.471465365 4.019199996 4.588555574 4.395139782 4.373719515 4.081414196 4.375292119 4.321794718 4.348816347 4.285083705 4.223500809 4.305783072 4.563254019 4.88167997 4.321640016 4.234083258 4.230461357 4.469616379 4.794666699 4.460056758 4.465879402 4.419359982 4.353482286 4.34405663 3.800365997 4.573624383 4.652764242 4.434016511 4.49687697 3.994820609 4.704091606 4.195382477 4.639577304 4.271099459 4.583881075 4.361528803 4.441861357 4.397484496 4.518016536 4.237630274 3.980313926 4.594907223 4.19330765 4.055409745 4.289049743 4.678795643 4.523970774 4.208343635 4.459245714 4.449298544 5.144795656 4.34052993 4.460696348 4.241310551 4.405114757 4.417538654 4.463953025 4.746246313 4.11508846 4.382436302 4.321566288 4.496524497 4.178017519 4.803421276 4.357605656 4.173412057 3.929985731 4.088210528 4.226973681 4.614434609 4.226166966 4.020699915 4.269074644 4.233774078 4.467716308 4.086683923 3.984197959 4.32306533 4.036782513 4.549852667 5.34643563 4.749275476 4.725939133 +Ketoleucine 3.522784347 3.861881879 3.839057211 4.034677513 4.078886294 4.030811582 4.047805343 4.267998269 3.488479776 4.198069245 4.287264164 3.867967803 3.78285437 3.769634989 4.08887777 4.081537558 4.072513328 4.211880238 4.192746221 4.012416258 3.828692611 4.283847967 3.956520568 4.140424789 2.548341533 3.677585778 4.016670561 3.859831811 4.054434653 4.078033425 3.33608653 4.030430718 4.26964476 3.574594872 3.723144681 3.927695346 4.033660079 4.848883476 3.986944424 3.869654828 4.071363089 3.686068881 3.722594215 4.241460206 3.983362031 4.103256198 3.962928877 4.002679412 3.928708528 3.727543757 4.161231289 3.850190683 4.076822892 4.125873751 4.009543486 4.404597653 3.782862247 4.137503439 4.191406829 4.038506124 4.280495031 3.92966527 4.308019074 3.991823475 4.042428767 4.32753648 4.312975222 4.196583879 3.109829369 4.061428593 4.434328082 4.131824514 4.149933612 4.214480758 4.143904923 4.328402299 3.848935685 4.202825966 4.142391882 4.099579193 3.800830423 4.132821028 4.346008737 4.273154183 3.94789911 3.840887364 4.046866079 4.078569262 3.797634114 3.74102081 3.907901771 3.874289074 3.8549114 4.394699294 4.205591647 4.397073008 3.980323736 4.255340674 4.157183798 3.969991865 3.895664057 4.019581357 3.781553662 4.141971638 4.161000393 4.015411208 4.174416917 4.117735162 4.024833767 4.330538932 3.677130298 3.931391903 4.037318632 4.340830262 4.17221139 4.229656501 3.825924121 4.116695336 4.224813331 4.359040111 4.441488821 4.176207922 4.180839153 4.163833053 3.783676104 4.051837343 4.163831372 4.232623442 3.951647984 3.823312455 3.90111808 4.360216588 2.825294783 3.993464974 4.014417647 3.796855617 3.878765158 4.285205734 4.432123072 4.27614633 4.047265163 4.074745275 2.656454573 4.062305632 3.969759039 3.915112441 4.373375984 3.894389178 3.82154154 4.021733309 4.24408178 4.230270809 4.242521915 3.855018018 3.687941012 4.026763749 3.402025444 4.26360185 3.742488112 3.695978359 3.955536894 4.065041232 4.363756019 4.423605944 3.932973369 4.036659156 4.170043103 4.350912725 4.181166703 4.107573913 4.023646868 4.024618124 3.763540042 4.043427351 4.105615525 4.170680368 4.063520881 4.254683362 4.095361521 4.277928071 3.934981306 4.175478962 4.279006167 +Kynurenic acid 4.012746846 4.068846823 4.157414109 4.392389285 4.296854466 4.323642399 4.009272014 4.356818646 4.165834003 4.267298105 4.310529944 4.320476893 3.85006516 3.923432135 4.214422553 4.194590435 4.29827385 3.975408912 4.337554616 4.620768444 4.006888376 4.365831502 4.225926144 4.200446498 4.165236614 4.17939256 4.43247861 4.250972899 4.207895392 4.365396272 4.004943296 4.019720554 4.338927848 4.066294256 4.184172434 4.473982589 4.342110428 3.955581336 4.368409456 3.707358673 4.339726106 3.805894104 4.012599519 4.499136642 4.224863557 4.518864797 4.38218759 4.501899178 4.266805453 4.266631517 4.20001263 4.500444974 4.467431479 4.542554229 4.487592936 4.178487768 4.561981052 4.606450682 4.464989185 4.370280326 4.482833108 4.382266528 4.60654788 4.319147992 4.555443957 4.357598603 4.370369715 4.560383017 4.355562661 4.518402238 4.711883692 4.480253985 4.290939738 4.452693541 4.33632833 4.238131962 4.318978974 4.276225895 4.490078325 4.645889584 4.325358847 4.324896712 4.231757094 4.395193694 4.45695523 4.495560015 4.326055054 4.265329147 4.414563529 4.56266629 4.545475042 4.211828103 4.101718912 4.406310158 4.526483979 4.389907921 4.476973142 4.1007761 4.387168198 4.518491862 3.754846699 4.277818885 4.481097013 4.508962138 4.509906087 4.249842508 4.425014797 4.541190687 4.455510256 4.284838833 4.387862771 4.339622497 4.587972896 4.312493323 4.388433245 4.286201435 4.183398571 4.0885388 4.309211971 4.522513396 4.632258698 4.556519737 4.557255169 4.462341634 4.466743845 4.320219231 4.158507972 4.300642033 4.259888758 4.278507407 4.415327463 4.293274652 4.130579286 4.196905792 4.330109704 4.452502716 4.336547773 4.245626546 4.312584098 4.350863739 4.461459261 4.414344106 4.19251707 4.388388283 4.394166651 4.510295716 4.315295108 4.289984324 4.076098511 4.465190634 4.369087174 4.245381467 4.548631446 4.310796991 4.44414451 4.398650198 4.24288096 4.273955765 4.147731717 4.40529666 4.575394126 4.358005163 4.259410909 4.506484067 4.589253049 4.418940899 4.441226365 4.508359998 4.746235747 4.348513987 4.450485403 4.401273081 4.294544192 4.283250196 4.5716631 4.43153063 4.376272612 4.649479841 4.405740316 4.449623462 4.514316281 4.60396967 4.77474238 +Malic acid 3.534346694 4.069773502 3.696515321 3.940602141 4.231243326 4.333562176 4.045153992 4.351572535 4.033538577 3.922149758 3.849889509 3.82418732 4.216862635 4.031303531 4.304139105 4.112283888 4.148779453 4.387124547 4.391885361 4.451635231 3.758607255 4.721897754 4.134592645 4.041013346 3.735701363 4.213910943 4.009656649 4.096172997 3.981104145 4.442230802 4.012148409 4.714358297 4.399314509 4.217354049 4.334283539 4.340643559 4.062583465 5.248973304 4.236662417 4.199027152 4.348838924 4.227580863 4.048961551 4.090259874 3.824394868 4.393993641 4.710046124 4.153728801 4.437642241 4.198497145 4.436627595 4.224963236 4.131054884 4.677443003 3.821974598 4.325980803 4.157634189 3.981192157 4.920439995 4.105911481 4.181916656 4.164518002 4.143098072 4.279938887 4.346193198 4.494014743 4.349907462 4.265497545 4.295940411 4.119770543 4.418601906 4.263745478 4.570167407 4.382433981 4.242360277 4.588931429 3.820814986 4.615069218 4.291498892 4.241951781 4.081699621 4.302081388 4.298469352 4.371684968 4.317989728 4.319700061 4.064998129 4.284985339 4.069202503 4.070471731 4.439533243 4.063111248 4.40361471 4.287737293 4.370174494 4.594838809 4.301985675 4.092141633 4.238567472 4.381218742 4.428831304 4.718649562 3.921851947 4.153190532 4.295582766 4.388161779 4.237407758 4.121574866 4.13695682 4.583274969 3.902804436 4.040225373 4.449904757 4.231122826 4.384148862 4.113776577 4.48836889 4.027391622 4.358388483 4.220419514 4.424974852 4.042840872 4.179133904 4.27531713 4.415507072 3.98686536 4.54838617 4.436866668 4.530013431 4.111850208 4.327279047 4.2951689 4.787562248 4.239612869 4.315758663 4.483307357 4.223291241 4.270803326 4.770570817 4.564503438 4.498604428 4.497371502 3.921826267 4.559860413 4.322029162 4.841735908 4.667929184 4.449208275 4.515982374 4.53654634 4.846208136 4.090322109 4.324348253 4.247444891 4.10181752 4.16544904 4.321785884 4.353328685 4.300085179 3.985387538 4.590096164 4.804992446 4.537420474 4.323326933 4.095893014 4.301015021 4.472980245 4.333634287 4.307040977 4.506594072 4.059781111 4.412783129 3.871285467 3.986032319 4.390161979 4.288514173 3.972771953 4.370143259 4.14623146 4.727567341 4.587614075 4.641852928 4.446096988 +Methoxysalicylic acid isomer 4.060952031 4.112546615 4.288847415 4.458436925 4.189122646 4.562834529 4.009719041 3.906832407 4.694805934 4.970444034 4.676988099 4.389579971 3.854946976 4.400599379 4.18617087 4.422786278 3.323350499 2.987293978 4.442835162 4.308571536 4.20391787 4.442077419 4.020279518 3.622024678 4.374117434 4.279265901 3.085641914 3.804577605 3.865870399 4.903225484 4.538105397 3.805652796 4.821084254 3.992747496 4.383416047 3.377111562 4.261983508 2.109093389 4.905334457 3.794701257 3.66638302 3.730425618 3.268374328 4.531302899 3.546849666 4.800743674 4.349585482 3.894923492 4.226748027 4.049590291 4.216032486 4.136902885 5.237012867 4.646455525 4.219377682 4.662697504 3.304849447 4.287288957 4.393472749 3.808821818 4.189535303 4.383886089 5.243215 4.432488403 4.770558267 2.681691398 4.286847582 4.526059106 4.662944258 3.957341615 4.474705848 4.097400103 4.981472367 4.371442564 4.297737503 4.566869793 4.080729427 4.608125487 4.281645984 4.564848738 4.707533691 4.20219478 4.304771893 4.320174224 4.173095989 4.093827659 4.247995928 4.334833513 5.02655211 4.048762631 3.823431485 4.366620072 4.347998872 4.627333312 4.64204667 4.670646439 3.114853134 4.433799287 3.80001037 4.548736628 3.174555812 4.761015589 4.436204017 4.49301415 4.565814769 4.531469651 4.391461859 4.564735391 4.672334609 4.460783385 4.528518534 4.866579673 4.899487239 4.414628357 4.718513337 4.277097588 3.999656135 3.954340987 3.999573303 4.221231333 4.316516412 3.656058164 4.473970933 5.492421166 4.404297627 4.30281766 3.761315628 4.174811983 3.621221229 4.923717544 4.449136821 4.64825022 3.636778958 3.999423675 3.783456584 3.906170957 4.651629702 3.832297308 3.901628925 3.949164973 4.601518728 3.828048787 4.817574135 4.356593453 4.544337266 4.449714562 4.566747142 4.568582937 4.796861927 4.433345479 3.451249932 4.27941558 4.54799299 3.828523468 4.708330493 4.452925761 4.481455314 3.314501715 3.92883579 4.968472751 4.377501869 4.262256203 4.078000218 3.926755553 4.63068174 3.950124247 3.910855988 3.993505637 4.597300917 4.240450343 4.391160926 4.199543663 4.111434583 3.967947811 3.823797376 4.42346304 4.388570988 3.719727183 4.128946671 4.347302549 4.142374765 4.287596947 4.176100819 +Methyl (hydroxymethyl)pyrrolidine-carboxylate/Methyl (hydroxy)piperidine-carboxylate 3.899312973 4.233934536 4.520556275 4.35559171 4.407202469 4.232537051 4.249504177 4.397296209 3.773416636 4.34729037 5.186590378 4.535448387 3.211032645 4.135758092 4.475619099 4.428625338 4.813159862 4.70886243 4.375575493 4.31094144 4.491268384 3.927232963 4.540481337 4.308581507 3.302248204 4.151872243 4.493944894 4.234071347 4.186476372 4.705388181 3.607576207 4.41104398 4.353059633 4.027610505 4.19823232 4.448144808 4.886207118 3.860022872 3.969514647 4.269530066 4.373774713 3.186123341 4.876890745 4.629110049 4.240819844 4.412809091 3.967919212 4.54826158 4.205132004 4.148091174 4.799881689 4.121668988 4.084524739 4.800355421 4.127774598 4.172305401 4.699537804 4.739071358 4.51134703 4.243963408 4.198252568 4.568404225 4.929490316 3.907736159 4.479382947 4.452945705 4.192916401 4.360984508 4.031983903 4.244858201 4.848808398 4.38477094 4.855925862 4.832920554 3.904552233 4.405422794 4.474946597 4.48468437 5.025890602 4.118918645 4.148664136 4.387835901 3.941271725 4.552441989 4.004115908 4.690835504 4.111860807 3.939747133 4.122197203 4.002491439 4.423396385 5.116725057 2.989258929 5.06079674 5.012677826 4.928610084 4.567139319 3.592448444 3.967860573 4.328430132 3.709541741 4.041881053 4.619437975 4.428287694 4.668683113 4.152031201 4.04939548 4.49743367 4.251476875 4.957190502 4.330673626 3.890509805 4.449877381 4.424711371 3.73290667 4.031157711 4.20144362 4.587364789 4.681879372 4.498395396 5.055394773 4.164920652 4.603126063 4.046975266 3.915565446 4.41958122 4.555014517 4.055687815 4.72022915 4.235378875 4.476740605 4.145586119 3.91775998 4.720206579 4.408831277 4.452540655 4.571191837 2.710569121 3.944666136 4.125026469 4.460279916 4.329960954 4.012570587 4.466839367 3.964973443 4.574751398 3.999326826 4.530579731 4.219569984 4.416083748 4.213264101 4.744502009 4.200152861 3.773993257 4.532270917 4.075978117 3.761242048 4.576400581 4.143818844 4.26065744 4.469650648 4.686495435 4.225788269 4.463726512 4.334691214 4.356876487 4.015965341 4.616068049 4.371356788 4.510472107 3.977130034 4.327802404 4.568152085 4.12484649 4.306403448 4.672027031 4.310193863 3.934298716 4.592896303 4.695167723 4.620513946 4.440138437 4.755157467 +Methylinosine 3.979666714 4.191844897 4.362142931 4.272384159 4.487805084 4.378914363 4.139627672 4.35572884 3.799671623 4.216277497 4.341552408 4.426027462 4.212118607 4.031605082 4.295766854 4.249186693 4.433740916 4.077336053 4.282154632 4.127707969 4.176079951 4.203686736 4.253369219 4.305828404 3.803012298 4.13313631 4.479357478 4.188951285 4.591616199 4.428881183 3.446453555 4.002942918 4.264590161 3.938392056 4.225819497 4.407909605 4.22636798 3.961365137 3.997475881 2.092805747 4.407251232 3.742384683 4.119943402 4.087403226 4.14088594 4.203143645 4.225033075 4.372033717 4.483205679 4.332565391 4.304506709 4.515378358 4.176719337 4.675071351 4.215182144 4.218886021 4.364237986 4.215952385 4.641747576 4.29916152 4.40511548 4.354519746 4.374019418 4.176782673 4.567713434 4.601482834 4.311779888 4.373154535 3.890738317 4.43263288 4.719642454 4.181370807 4.610282988 4.448302077 4.258120642 4.263024978 4.065580685 4.24878583 4.515244102 4.50150076 4.181922329 4.311989013 4.386034178 4.587250743 4.382835833 4.020608518 4.27157868 4.393744071 4.161786115 4.324379589 4.074945339 4.202957389 4.223743842 4.208168357 4.403894101 4.591294731 4.41941123 4.348028988 4.508646477 4.516240547 4.329624207 4.368593973 4.29933577 4.417631453 4.240214344 4.511603578 4.358934433 4.47351656 4.273009354 4.427613573 4.081407095 4.224809433 4.256754904 4.335744987 4.221093348 4.353435994 4.220312808 4.282896704 4.452688192 4.481620234 4.758371109 4.281989406 4.279010426 4.311183273 4.594918221 4.313423159 4.410681478 4.333840712 4.481155058 4.272189444 4.509407834 4.470557013 4.029223347 4.413571788 4.398387285 4.418546369 4.468682356 3.752094636 4.210881537 4.02857611 4.373321824 4.338678612 2.27217509 4.396386554 3.14959228 4.256287744 4.534402106 3.999681559 4.218804264 4.121752802 4.349464414 4.482570643 4.318126087 3.981242859 4.082143663 4.233079654 4.053242236 4.210734054 4.294900093 4.365060059 4.405620449 4.247772943 4.670905069 4.713122954 4.422002641 4.339492094 4.33972484 4.562381924 4.653462071 4.385104504 4.271697482 4.186971485 4.26165763 4.196887882 4.257340595 4.35725992 4.339862897 4.803101534 4.332232576 4.536402955 4.383072459 4.401136643 4.547549743 +Mevalonic acid isomer 1 3.329768714 4.01885596 1.55128105 2.800934288 4.112110246 4.144181722 3.266306242 3.548106496 1.450744405 3.890604119 5.414234532 3.434944007 3.288683315 2.659873804 5.281449243 3.823955243 3.887871621 3.940179057 3.968164472 1.437872137 3.499853957 4.560265779 3.755147141 2.599752557 2.23822886 4.753462502 4.459311073 3.910512793 3.394074337 3.86234362 1.986649296 4.373589103 4.483316872 3.188947997 3.643117677 5.631947911 5.778234719 4.342018885 3.787732344 5.411551874 3.944692581 1.768900941 3.544871834 3.707130837 3.779851683 5.463196078 3.5476364 3.717418009 4.011571837 3.720767967 3.892619609 4.392909575 3.770370485 4.641493433 4.054192872 1.57837002 3.398297034 5.241902036 4.532136532 3.792704991 1.717365934 4.096117725 3.899798089 3.897687042 4.13970206 4.280247232 4.491425061 3.875900821 3.741221643 4.077613133 4.425680953 4.029188057 4.485756 3.946067132 3.557552791 4.161107904 3.469574506 2.173480289 3.624065496 3.839294538 4.089084936 4.368441341 3.566072258 3.526212189 3.527633165 4.122670725 4.044074066 3.310279714 3.808402658 3.502572583 4.025560484 3.460012368 2.915323603 4.140850892 3.787825769 3.583514446 4.356772353 4.741681861 3.663322466 3.052734099 3.165872601 3.065972444 2.105901578 4.256446681 5.240803343 3.534537557 3.476192506 4.176661172 4.086790889 4.060151495 3.249549955 3.629384379 4.73777147 4.045241987 3.350672539 3.75042517 3.537314649 3.614248388 4.930515151 3.55285965 4.98577501 3.86112046 4.585115302 3.926586012 4.135818984 3.597819221 4.035827085 4.126097854 4.609116594 2.867036597 3.432469709 3.853016375 3.509530047 3.832708303 4.354521391 3.56524289 3.63231974 3.948999292 4.011461657 4.253022053 3.36635185 3.892230775 1.877408149 4.218293669 3.868060055 3.677959432 3.924576676 3.732474881 4.400633532 4.884217649 3.440541697 3.784883446 3.975001105 3.525072625 4.744875812 2.864421734 4.319293931 3.779487054 3.488463582 3.613148976 3.69844603 3.236850067 5.179596383 3.702668326 3.773538731 4.63146966 3.51188323 4.247238657 4.259951873 4.779933449 3.847600876 3.878634272 3.52874316 3.316667446 4.347027385 3.82093297 3.891593055 3.901150335 4.01205817 4.157738639 4.319196889 3.827124391 4.188049575 +Monoethyl phthalate 4.186149533 3.347641278 3.824038574 3.091727965 3.655938217 4.240828147 3.92916447 3.232053199 4.191019034 4.869509077 3.452697146 3.577856926 3.917557128 3.788281036 4.15534968 3.783713871 2.59111257 2.646661085 3.345677786 4.454533442 3.584592975 4.472116408 3.245582122 1.592161096 3.240506988 3.851157024 4.583003853 3.909560071 2.546271718 3.844327347 3.727405393 4.786231889 3.863192893 3.817315616 3.183211562 3.905220001 4.308478315 1.875277011 3.505072748 3.276251991 3.625287884 3.837302832 3.75108969 4.160431669 3.020595461 3.55861859 3.643076347 4.057017223 3.924223061 3.415201389 3.573439451 3.873738794 5.128802546 4.354731551 3.551776409 3.984297976 3.284431863 3.915980178 4.665948294 3.116653382 4.864481721 3.916022558 4.870521355 3.122522739 4.626306462 4.468088189 2.712161119 3.941118054 4.629057709 5.16256182 4.669070252 4.074333075 4.960050954 4.842911203 3.304665017 4.77712504 3.701976999 3.039650692 3.241481836 4.080715355 3.984561182 5.153158125 2.99543817 4.043905291 3.784858019 4.034692952 2.930379282 3.129481397 3.889687283 3.0324151 4.29209414 2.023701271 4.294901489 3.97783233 3.215635214 3.641038029 3.439987942 3.840928015 4.115968256 3.964875554 4.607871999 4.097981574 4.058786626 4.18082311 4.215871913 3.878959659 3.080075891 3.404764058 4.085073819 4.209089302 4.964286476 3.876730704 4.788699165 3.517087561 5.054329171 3.120099901 3.550672471 2.984302977 2.883250783 2.892385904 5.387827386 3.591682728 1.909198611 4.659684859 3.823808082 4.136709749 3.4930608 4.282988162 3.325438948 4.184967391 3.311638774 5.193632682 4.985035209 3.135515896 4.37760101 3.699209999 4.528127839 3.755191637 4.610147532 5.650792689 5.260533744 3.254067065 4.503890397 3.447802749 3.958665566 5.297744061 4.581762371 5.044901714 3.931139951 4.123857144 3.059027107 5.04483697 3.144806035 3.659856214 3.08950507 4.480084802 3.910751848 5.278054688 4.385351961 4.407322549 4.114040903 2.961346086 3.786035186 3.495810731 2.840106468 3.914692573 4.813414578 2.777730855 4.362417861 5.345533497 4.786583673 3.35354784 2.482702149 3.084784912 3.705556412 3.209044804 5.338140882 3.768419149 3.810374348 3.444242507 4.093356435 4.128964477 4.383778336 +N-Acetyl-aspartic acid 4.117673299 4.428008423 4.20571486 4.385727239 4.253549056 4.363792315 4.17251627 4.426590612 4.146049138 4.229702296 4.185635586 4.379919597 4.468380285 4.24572544 4.449904543 4.130868553 4.581894324 4.261440331 4.677721126 4.604583971 3.983439791 4.529516369 4.385609444 4.257778296 4.371509605 4.200262648 4.342894754 4.601978825 4.323946097 4.263684145 4.200976223 4.349149769 4.218111164 4.094733605 4.303832991 4.269466437 4.245658181 4.222819349 4.485445645 4.087595362 4.354635751 4.182230166 4.381225602 4.26236428 4.204068834 4.39336885 4.407689054 4.49080592 4.41415523 4.357848076 4.230005922 4.389271791 4.540391672 4.460784736 4.464338818 4.462174032 4.28321563 4.171052699 4.415193494 4.263487219 4.445067399 4.352372295 4.271972546 4.429538171 4.442196908 4.613408374 4.289417728 4.152841788 4.328022563 4.444020711 4.749250937 4.456038913 4.313256598 4.451627163 4.285574505 4.134492359 4.168142751 4.361346667 4.427568158 4.524975607 4.201072999 4.338593857 4.300156507 4.386067899 4.505774091 4.33000985 4.403566697 4.423440016 4.204877186 4.292376939 4.497193787 4.548869993 4.306390178 4.188508619 4.345139857 4.422043998 4.252990281 4.704905982 4.691233929 4.577451503 4.420679814 4.600801811 4.423605069 4.360149868 4.216566382 4.417551144 4.494948108 4.374923833 4.313779798 4.154477076 4.162853775 4.38503998 4.23628203 4.317141578 4.437083714 4.202597921 4.677655605 4.449589415 4.290875004 4.145962986 4.81286811 4.536253548 4.588522864 4.196580391 4.231932637 4.346866775 4.373064276 4.464556604 4.296434071 4.398940169 4.589677326 4.708719241 4.521277013 4.470084938 4.584214938 4.323525556 4.621763004 4.437426669 4.397254037 4.148132119 4.522836316 4.471210801 4.496026036 4.322945053 4.397015511 4.281962527 4.711415673 4.083525533 4.549700613 4.414223504 4.41708129 4.441320027 4.34655768 4.332021878 4.551616218 4.353644797 4.093469594 4.177435167 4.543959515 4.378205913 4.980978659 4.547834722 4.49449042 4.263651736 4.402640312 4.547112829 4.397689439 4.381203248 4.799388556 4.554007231 4.225271655 4.387688914 4.287664014 4.363958525 4.464589331 4.357733792 4.4155156 4.49043134 4.341535783 4.107648279 4.72267878 4.761037511 4.60787629 +N-Acetylisoleucine 4.093392933 4.306259479 4.268660372 4.01720264 4.11461914 4.483259885 4.011141232 4.386072995 3.941465569 4.200706948 4.390884063 4.032094103 4.378304321 3.928265366 4.223293581 4.474423317 4.327815254 4.612486558 4.485848538 4.176618531 4.214823765 4.468380804 4.084432411 4.196963877 4.183414831 4.156462888 4.453212424 4.183084163 4.291202438 4.358505132 3.922603205 4.331735091 4.335840166 3.878485743 4.153248276 4.446454125 4.154598899 4.054242817 4.245752523 4.035446854 4.394694652 3.938318766 4.112851835 4.378255715 4.243514064 4.345535633 4.554808438 4.411035463 4.142014503 3.736277591 4.532461585 4.30772129 4.329159225 4.441784142 4.340362581 4.201270851 4.285520313 4.770268214 4.356948292 4.314535228 4.44204279 4.112154002 4.581879769 4.033712503 4.166179151 4.511751867 4.581188785 4.400568511 4.313858944 4.404867557 4.663460874 4.491833269 4.224499651 4.502740767 4.160629404 4.421748443 4.332843547 4.289813738 4.417317207 4.558394509 4.003062599 4.474956513 4.119427642 4.61662265 3.956775815 4.405136379 4.077310664 4.120486533 4.057382775 4.092030272 4.401945486 4.308141134 4.411088489 4.449163109 4.375282362 4.537661873 4.247754844 4.149903163 4.366243279 3.99828563 4.362978727 4.405027141 4.260632476 4.401018613 4.505264485 4.514928777 4.415582094 4.506847965 4.292880382 4.671971476 4.299037457 4.194630615 4.327174605 4.408331738 4.24752175 4.430822166 4.095315065 4.338747771 3.87334117 4.582527576 4.619242083 4.292628349 4.356011288 4.55589852 4.246649405 4.340173868 4.371669017 4.334263343 4.309951004 4.169432674 4.395145331 4.309345915 4.192730493 4.144633207 4.353742218 4.589586787 4.199041104 4.346503353 4.101002997 4.541144759 4.421004561 4.23197999 4.117095575 4.587659761 4.289363732 4.442539084 4.472488997 3.840110378 4.759075871 4.401684664 4.463637485 4.311989568 4.456102108 4.187092201 4.359828239 4.1925079 4.079305443 4.324324347 4.125142065 4.344995768 4.369572042 4.331208257 4.711112204 4.396522132 4.308202854 4.470227797 4.22995693 4.470316758 4.551559001 4.367660335 4.30224457 4.392754135 3.983064735 4.421182554 4.437380697 4.54615836 4.434133108 4.272493449 4.440495838 4.421061622 4.380774708 4.47809306 4.688224266 +N-Acetylleucine 3.411935939 4.478246245 4.266854201 4.027336877 3.237243702 4.370739348 4.049776629 4.321892825 3.719506534 3.747108951 4.324902966 4.38990265 4.544151966 3.928668072 3.717229537 4.238244903 4.179498278 4.553247918 4.585045749 1.252632365 4.036372096 4.197684016 4.094522222 3.968414669 4.04546133 4.032668166 4.370806292 4.006400196 4.258586363 4.072601877 4.038946049 3.906651262 4.151898691 4.146175691 1.373469001 4.485477297 4.262708097 4.607094345 4.201926753 3.849307467 4.496933848 3.935923043 4.213467708 4.013346424 3.896396827 1.387462564 4.362232788 4.368454549 3.426599233 3.040968482 4.571239734 3.789115103 4.509703049 4.926268337 4.091755266 4.156831695 4.177995101 4.5301362 4.837511001 4.247099026 4.169462165 1.360056413 4.712349698 3.662011871 4.210748489 4.290033896 4.090269113 4.499998165 4.25289589 4.182027921 1.446944602 4.720268635 4.205799662 4.378293656 4.663153698 4.159774181 4.280734782 4.147809341 4.01715964 4.055017583 3.730857457 4.556932032 4.318343355 1.447590476 4.000363423 3.845094202 3.636191412 4.130577544 3.91935408 4.039553232 3.998049454 4.223809349 4.178654426 4.158416807 3.982589095 4.645453937 4.103243061 4.084384427 4.254109553 4.059200151 3.457505617 4.118927849 4.073307966 4.285909618 4.766498128 4.180234337 4.211253849 4.197592432 4.49180972 4.840598523 4.402721164 4.23268261 4.003121281 4.057127798 4.193316548 4.195242354 3.934358743 4.480363233 3.700448336 4.399179372 4.155174936 4.635719842 4.139995119 4.399878869 3.892737175 4.20022387 4.080847603 4.803071915 3.605887498 4.489921541 4.676792496 4.985624358 4.353765899 3.847578506 4.006750217 4.635485192 4.14016084 4.685227699 4.316059982 4.979799557 4.357369803 4.442562003 4.044954003 4.977383445 4.48556449 4.888551806 4.408711185 3.900245484 4.725370421 4.65362645 5.009564658 3.969440713 4.698791862 4.8249116 4.337884131 4.424946069 4.392416348 4.179423197 4.485667452 4.317898788 3.909394109 4.506696095 4.679795467 4.164901633 4.113008581 4.226648569 4.369350144 4.547350567 4.587619203 3.418594965 4.223696796 4.10354029 3.880060715 3.991231643 4.152324514 4.347810683 4.213627407 3.921782392 4.251468658 4.288331935 4.107483976 4.453917522 4.512905008 +N-Acetyltryptophan 3.792114594 4.484241506 4.254060712 3.645017863 4.193700821 4.221704854 4.001768564 4.348902612 4.188240169 4.139993279 4.0027179 3.864348148 4.187264768 3.685318475 4.318309622 4.248804846 4.065573562 4.329738641 4.498627819 4.481776916 4.476892983 4.390793115 4.289966076 4.048186311 3.831594434 4.374106781 4.515282319 4.023445727 4.060282039 4.600997759 4.210914331 4.347922408 4.261528699 4.005414766 4.429975516 4.600663853 3.701741009 3.394503547 4.472227325 4.253035585 3.75318104 4.0071026 3.944243002 4.342421133 4.289486428 4.555628903 4.176816458 4.331818138 4.661430532 3.752913943 4.64348302 4.138212207 4.248260121 4.772517561 4.056809742 4.41827191 4.503252594 4.590738081 4.350951834 4.339266371 4.473594178 4.326589448 4.425253841 3.801003076 3.700885641 4.007036576 4.493100353 4.464411666 4.371274981 4.427861454 4.43452224 4.666639615 4.327676605 4.251967363 3.999759051 4.412858406 4.352777472 4.481229505 4.65144922 4.197837027 4.232342892 4.304434567 3.956895772 4.507118499 3.643188166 4.359867773 4.364240305 4.258488936 4.216699993 4.039878928 4.244485258 4.229518949 4.476823156 4.427604468 3.866027183 4.787970469 4.417812308 5.018721142 4.450059403 4.338579722 4.464370475 4.954789196 3.201638735 4.433133502 4.474183756 4.292137177 4.328235643 4.532092763 4.36466385 4.554354972 4.031713914 4.158858555 4.447193387 4.024990973 4.360870408 4.040923085 4.424499455 4.220897061 3.772289744 4.393171017 4.47240325 4.189883819 4.363330292 4.384760209 3.863801103 4.380330625 4.617069533 3.904715414 4.517857911 4.245071693 4.190362837 3.940867629 3.879870286 4.156897507 4.475330565 4.446035883 3.979681451 4.086306228 4.674671971 4.340283574 4.602378257 4.276892629 4.206951669 3.66422721 4.483019579 4.406351128 4.610847825 4.496446835 4.902989926 4.34880434 4.331674836 4.132485284 4.27511983 4.298158401 4.240036541 4.321068593 4.36893211 4.169557295 4.389724451 4.342044039 3.642104575 2.342342656 4.718235431 4.182039725 4.008021848 4.389654512 4.017129309 4.561795533 4.558337842 4.431771598 4.055354436 4.276159044 4.436308004 4.254393321 4.357129041 4.269124588 4.176829148 4.286452011 4.102987085 4.336219072 4.39476028 4.30243077 4.305107691 +N-Acetyltryptophan isomer 3 4.559494909 4.038887064 4.333962331 4.621738785 3.276002059 4.174603772 4.219100595 4.802701221 4.174870057 3.84640755 4.7466645 4.312784671 4.324868794 4.548185194 4.584805247 3.892834504 4.440624976 4.381021444 4.432310469 4.248648967 4.269092146 4.925012546 4.353527057 3.819131366 4.289286017 4.018294515 3.576258674 4.640146179 4.427638725 4.234870766 4.071449945 4.056532422 3.831339194 4.028401182 4.420406876 3.77497406 4.470605833 4.79935696 4.317735216 3.77618964 3.837427645 3.771032017 4.688330955 3.99392049 3.620562851 4.369688566 4.33467519 4.686165045 4.390923256 4.424870795 4.337925813 4.349701531 3.869069084 4.603122769 4.290506836 4.60452742 4.178865675 3.678022694 4.612135005 4.386374325 3.982315278 4.257497548 4.529557877 4.217134178 4.373914201 4.279557688 4.136927665 4.448094501 4.368341473 4.747791917 4.765930372 4.054875763 4.472394483 4.748793421 4.965176171 3.832536011 4.493240282 4.347522955 4.25422 4.533289237 3.66198122 4.3688315 4.613272754 3.592792063 4.368091112 4.061858222 4.075893527 4.128221256 4.340897786 3.513404387 4.123312024 4.634084655 4.390508986 4.398026065 4.59079396 4.26069176 3.423228464 4.100723617 4.674345999 4.233932367 4.236726596 4.666772698 4.604615242 4.281942972 4.596424557 4.509286784 4.037164938 4.403692163 4.324546197 2.678111126 3.823563064 4.004818673 4.726344276 4.523393088 3.991258749 4.353642617 4.24758893 4.288624427 4.126483191 4.423399235 3.795463806 4.160351387 4.938242983 3.845472216 4.353668593 3.980657593 4.360862367 4.315415115 4.341601385 3.401314049 4.581188597 3.823257638 4.352312901 4.184954251 4.328007465 4.484669484 4.579685188 5.108833669 4.182741259 3.917922457 3.95667289 4.649023815 3.999073448 3.652302618 4.226307164 4.367943253 3.772799342 3.66003382 4.731834228 4.358107107 4.388836368 4.315565477 4.61860606 3.959845783 4.271825723 4.20499549 3.923169218 4.345935741 4.472189153 3.579747925 4.718615767 4.32642541 4.751658536 3.913796202 3.878454568 3.940924297 4.248683428 3.996379832 5.017935618 4.423754207 4.866064129 4.104907422 4.648059583 4.128809763 4.484915832 4.138861231 4.310123876 4.116370852 4.316416182 3.922917461 5.024165168 4.768230502 4.413212414 +N2-Acetylaminoadipic acid 3.631931485 4.493697972 3.904043409 3.997636224 4.330821932 4.210519908 3.980256318 4.409265825 4.497058936 4.168541461 4.255754455 4.456862101 4.034675732 4.068235177 4.431279698 4.286634726 4.501533483 4.484303217 4.181696443 4.420602819 4.131043532 4.187416093 4.047494495 4.159603317 3.998529794 4.025050916 4.340780859 4.000968018 4.416097069 4.548893489 3.752581746 3.815653732 4.388543157 3.991505459 4.479613053 4.663311627 4.413249623 3.850999735 4.163490806 3.715488509 4.357418828 3.581254501 3.847453369 4.160136577 4.144150326 4.519528403 4.267855482 4.373240413 4.62805497 3.865115964 4.166662968 4.687241899 4.302793904 4.611491653 4.217542267 4.194899545 4.450316429 4.045307441 4.736861547 4.438132488 4.216669879 4.302702631 4.497297553 4.192227161 4.391837757 4.627237172 4.446288995 4.420441886 4.012070601 4.221980986 4.418465717 4.491957016 4.684069262 4.462448893 4.53002242 4.312481059 4.353201986 3.940130605 4.300241235 4.471871119 4.349851896 4.409457073 4.492335806 4.593733789 4.312282011 4.592382948 4.191925486 4.288141617 4.476380499 4.461376425 4.093660493 4.148346136 4.086497422 4.163553668 4.390791796 4.704537609 4.747792458 3.949561438 4.790572543 4.349200483 3.909438058 4.463588574 4.099655988 4.488029214 4.495264424 4.228082031 4.408012605 4.121597622 4.370665414 4.442940601 4.28851256 4.168371126 4.562686663 4.344160811 4.104345014 4.278303289 3.565677025 4.374421533 4.263252667 4.436970901 4.68092313 4.90259078 4.336810538 4.642849403 4.174780788 4.16221286 4.314882523 4.355791652 4.579308219 4.208370333 4.625311188 4.454769198 4.055873216 4.409818203 4.387792514 4.301176262 4.369483128 3.020442469 4.596777933 4.511196622 4.437109943 4.309776098 3.981470744 4.506159412 4.170120631 4.553343722 4.236528588 4.136140856 4.188716158 4.497020541 4.64516288 4.617624138 4.73359042 4.399938455 4.173357638 4.541289877 4.049800313 4.331028063 4.381871407 4.198320703 4.473601097 4.460773156 4.617895804 4.452316714 4.109993198 4.392065901 4.589539268 4.798107402 4.472577795 4.741173365 4.269265213 4.072568524 4.342651853 4.198552816 4.414982199 4.431377554 4.428301131 4.502398728 4.402273402 4.559533255 4.378985986 4.42709997 4.581048395 +N4-Acetylcytidine 4.361609643 4.518477034 3.885826078 4.49615993 4.685970905 4.46802532 4.431310239 4.622987522 3.409346338 4.588791222 4.540992081 4.588072574 1.795245343 4.360119266 4.546949124 4.439698362 4.760376107 4.563838772 4.532754028 4.199985272 4.211485291 4.735433618 3.738424876 4.427184616 2.363070199 3.526429205 4.513634946 4.519449942 4.796994188 4.546922337 3.78392939 4.447964609 4.686839366 3.988103619 4.590012512 4.471516714 3.922783157 4.039486985 3.964201839 3.953606004 4.558836745 3.714793643 4.368415976 4.540502495 4.489321641 4.473930942 4.541112083 4.766180454 4.740106794 4.321021823 4.35373965 4.694199246 4.171291464 4.59505115 4.526736201 4.185779389 4.271722011 4.513424303 4.775341998 4.599059603 4.251893117 4.638888038 4.521419381 4.599289423 4.716035595 4.796416 4.148175751 4.599990675 3.407087932 4.601683669 4.771793845 3.944493061 4.719823065 4.823902074 3.878930392 4.066754066 3.899837124 4.155478309 4.563428787 4.775228109 3.847580623 4.525363812 4.481060365 4.672514937 4.642609236 4.589924159 4.660452601 4.261008507 4.431898556 4.125547453 4.520539664 4.541769877 4.139888335 4.552349357 4.813999467 4.84202037 4.646418346 4.332166889 4.789054234 4.397441227 1.644952696 4.634033172 4.63721093 4.834674837 4.582735893 4.610611849 4.284491269 4.486594971 4.603733106 4.623787157 3.662849086 4.011136125 4.522095345 4.685580578 3.668593544 4.711226376 3.990282855 4.649915987 4.583684827 4.659330281 5.027677564 4.72261564 4.677360443 4.571888997 4.70752035 4.551698298 4.155108063 4.123340403 4.637714601 3.956234554 4.742323164 4.122840775 2.985802921 4.844030871 4.670175599 4.491780177 4.709173672 1.813204603 4.304280797 4.097726445 4.833619917 4.609745669 2.04455286 4.779461521 4.035491242 4.171829432 4.393086795 3.584564965 4.170493446 4.203181764 4.46121079 4.731329184 4.641576461 3.558000483 4.126896672 4.190273598 2.89158479 4.213514575 4.447905748 4.132091914 4.953108 4.711567409 4.682199035 4.724942528 4.662459287 4.466964051 4.193004867 4.68181059 4.898709568 4.797625361 4.66834168 4.421398311 4.582599312 4.611101327 4.608399387 4.642137094 4.628515294 4.698383974 4.642671328 4.752698647 4.751965746 4.672414222 4.665286887 +Nicotinuric acid isomer 3.848277948 4.441710061 4.240329544 4.343147921 4.044958424 4.452897392 4.069243707 4.360414459 4.310635467 4.286487429 4.557676034 4.219688418 4.531023496 4.02578442 4.385885 4.209993102 4.357155646 4.367754298 4.516798434 4.348993501 4.004007975 4.234194974 4.296152473 4.283646714 4.49395269 3.989634776 4.382157094 4.490603026 4.296165071 4.300081961 4.424610369 4.149157795 4.067015904 4.203692621 4.271051614 4.076712683 4.281958784 4.191544249 4.347895958 3.854569552 4.48402046 4.219782057 4.023917511 4.303206503 4.298712464 4.311622942 4.376160761 4.413899366 4.176836152 4.499362087 4.152647407 4.248626648 4.319889686 4.359474989 4.295639405 4.257071556 4.455549184 4.52115421 4.524329788 4.346714545 4.611316458 4.143537162 4.437350481 4.432290348 4.398427136 4.087643389 4.536329754 4.468712611 4.366730308 4.328129607 4.362188517 4.411982669 4.266695934 4.374473046 4.466193503 4.418052648 4.291367099 4.611003053 4.531031762 4.500411574 4.484850981 4.305267431 4.22070272 4.28426411 4.354801373 3.979346556 4.213690306 4.500839012 4.356853224 4.406925019 4.834954838 4.269912567 4.401149991 4.233262672 4.327497947 4.151271705 4.326011519 4.322991103 4.387740076 4.663657524 4.033720055 4.473244839 4.602146357 4.292599549 4.510383702 4.185267818 4.63872426 4.517647149 4.243409813 4.453039889 4.366750265 4.414654817 4.424820789 4.208432844 4.353245981 4.2988509 4.364784241 4.058330333 4.044595821 4.372309388 4.504592819 4.47954545 4.535341017 4.401440347 4.255582193 4.306239795 4.257846516 4.250693443 3.924352636 4.539105865 4.352093526 4.428641908 4.421103849 4.555750419 4.374414284 4.492695842 4.331347699 4.369638826 4.343833438 4.287608045 4.514484387 4.398163234 4.720604766 4.837567821 4.659339419 4.260583738 4.511803529 4.468905523 4.797788259 4.441818079 4.270032914 4.281925183 4.402468917 4.390695 4.537543713 4.664551285 4.469287794 4.282003569 4.398305404 4.659690827 4.87345427 4.448214059 4.42561643 4.052620446 4.475766968 4.580386216 4.520741699 4.701414819 4.79001911 4.094181567 4.345810719 4.273393084 4.262318215 4.319397117 4.386931282 4.263510781 4.688791466 4.403503291 4.284876626 4.440418433 4.430970774 4.570177471 4.487122204 +Ortho-Hydroxyphenylacetic acid 3.870824929 4.658540671 4.001140771 4.296011389 4.679457982 4.295494865 3.912166117 4.37582796 3.739987581 4.490693802 4.721074276 4.582119544 3.8513424 4.17806315 4.382493395 4.292043166 4.650941782 4.894867285 4.245549315 4.681186246 4.321378774 4.288952907 4.454332789 3.93610227 4.660791399 4.468401701 4.321051354 4.344537136 4.37162237 4.508087338 4.312607769 4.279273908 4.102383975 3.950064843 4.571615055 4.654587511 4.516626792 4.122120003 4.35900592 3.848390547 3.95039226 3.802358333 3.868060096 4.17194496 3.731774232 4.450974905 4.511289055 4.705453265 4.441813271 4.094634135 4.473905961 4.599768772 4.756004414 4.488454927 3.679249555 4.14142042 4.257904956 3.91338478 4.285114944 4.610854828 4.692969302 4.397799724 4.632113454 4.10793978 4.665123362 4.584949031 4.731617145 4.654222978 4.313323653 4.433377294 4.865555047 4.054012437 4.548531822 4.480688142 4.759463222 4.355206877 4.211024568 4.578480533 4.395905321 4.464734086 4.204766898 3.816340021 4.778847386 4.419119391 5.133579188 4.235504349 3.850912633 4.261580479 4.396383124 4.512908172 4.915008669 4.601543752 4.513611656 4.451985595 4.826955999 4.023252401 3.74059767 4.086353451 4.459909177 4.77839555 4.314528073 3.693257077 4.471118536 4.507106029 4.649716544 4.146013896 4.224004105 4.523828997 4.690387208 4.447190327 4.545033856 4.679721559 4.820108554 4.364831742 4.524277351 4.360215619 4.484934702 4.386802016 4.433289433 4.810761739 4.58357595 4.697270206 4.182629498 4.574089569 3.722802553 4.498534471 4.106472267 4.683116331 4.610176326 5.047133041 4.354976493 4.720300752 4.241270679 4.696744538 4.298450139 5.068421422 4.855509567 4.380379622 4.56059746 4.487766885 4.560877685 3.984233571 4.557379495 4.694006259 4.676356517 4.46211292 5.138156339 4.096954295 5.11092929 4.330594995 4.078777656 3.516273289 4.60198434 4.372087774 4.687759768 4.798736734 4.861374043 4.372227774 5.200205012 5.311270662 5.42759631 4.809127214 4.288451074 4.5027486 4.543930003 4.34050131 4.745896821 4.605442284 4.994924348 4.434890895 4.534631955 4.310279356 4.643602597 3.96837775 4.547472279 4.656763031 4.848205737 4.374864163 4.037887693 4.490154962 4.178500046 5.228845842 4.694311557 +Oxoglutaric acid 2.997953327 3.993253058 3.482831033 3.947712189 3.955677222 4.195984835 3.827938384 4.46370673 3.221085384 4.254866805 4.205709234 4.240555777 4.005307326 3.569422128 4.715971267 4.230498602 4.203600932 4.132963381 4.397287684 4.084910561 3.605194779 4.698992952 3.941184855 3.95861053 1.656689636 3.171361685 3.927404771 4.091384806 4.256807014 4.440401814 3.58134755 4.442478422 4.435883859 4.226015335 4.342983009 4.382118092 3.861924203 4.235937594 4.128016585 3.36766344 4.412105336 4.164099877 4.186128616 4.382761603 4.193950877 4.457250674 4.609915034 4.234944357 4.607193359 4.279340579 4.273798429 4.626349884 4.110662675 4.914789988 3.628903363 4.255224229 4.125671651 4.172319944 4.652037443 4.197956496 4.294734436 4.071406656 4.172875815 4.265965069 4.806912312 4.762312119 4.245878703 4.240654399 2.978157444 4.08352973 4.387207534 4.129992593 4.503600646 4.504006756 4.34432582 4.202328239 3.806016331 4.302185026 4.395537715 3.634596545 4.024483353 4.170679177 4.352000928 4.5067432 4.18447704 4.309751701 4.269924486 4.536963733 4.231431828 3.959984 4.151862227 4.114686888 4.680997053 3.876413479 4.151883585 4.4579426 4.483625382 4.606697945 4.09093396 4.690610395 4.062107162 4.759477229 3.238448196 3.854951129 4.059449067 3.817350658 4.094653578 4.146330016 4.302827453 4.287051757 3.940189528 3.5747648 4.302323078 4.218233601 4.10600958 4.171094876 4.507620542 4.285725389 4.205800685 4.359026033 4.330324744 4.199519618 4.374083165 3.943531305 2.918496151 4.207792062 4.553543502 3.768050606 4.504883164 4.108029567 4.566183533 4.33990102 2.94991145 4.33831468 4.431417351 4.395502996 4.095840781 4.594067187 4.74595543 4.314671067 4.679468053 4.842515725 2.657418705 4.715804814 4.410779266 4.530727795 4.653094603 4.223129146 4.359264466 4.505087585 4.610666486 4.221348597 4.459617611 4.103615934 4.060145945 4.559095963 3.676430077 4.376656995 4.32864296 3.982213724 4.064027645 4.364609826 4.555042291 4.153035365 4.15820397 4.447549231 4.564754928 4.269715947 4.656865986 4.727417256 3.612761447 4.298919659 4.356824293 4.187213218 4.446964009 4.164657311 4.658030501 4.07957559 3.888405251 4.630421517 4.569199991 4.660857742 4.619881923 +p-Anisic acid 3.841620372 4.67814823 3.455274772 2.890224145 3.247603257 3.952276744 3.632400008 3.399320117 4.613479081 3.200812591 4.366086847 4.20867478 4.548048451 2.5911613 4.754272237 3.879060498 0.614417554 0.518954984 4.776688666 4.030992394 2.876410388 4.418889644 4.234275182 2.416554615 4.145689617 3.563638012 2.9056979 3.658154074 0.591057595 3.822266334 1.971820352 4.306644946 4.045788437 2.518668339 4.537002905 3.03597474 4.172937244 1.994558569 3.536770475 1.938002307 4.12007797 3.528596493 2.521113289 4.162813884 2.525758231 4.963490927 4.336210548 3.823697556 4.397621243 3.776632773 2.370555269 4.229321753 5.166307498 4.248133437 3.141538344 3.385460948 2.106390669 4.208366301 3.504535902 2.804939665 3.494824135 3.736500067 3.365121484 2.811311414 4.919098739 4.900256061 3.061372527 3.252293408 4.142929007 5.357012272 5.227608659 4.211927703 4.404687034 3.156567014 3.351661839 4.600042867 0.70667874 5.062660142 2.275657413 3.403167957 2.840446595 3.595254836 3.922116861 3.858567962 1.926801019 3.93464401 3.082411976 3.151599931 3.87926799 2.601766141 4.096416876 3.330046569 4.197309531 3.610269064 4.059590068 3.262385497 3.04714323 4.027294281 3.152721874 4.796592707 3.346222634 5.525471071 4.882808562 3.462778203 3.055911367 3.205648342 2.321708386 3.558554781 3.816709635 0.855078852 3.658737043 4.352862885 4.516556023 3.792376187 4.115367644 3.129490457 4.335701338 2.754917803 2.765293887 3.260138855 3.349295923 0.444434296 4.511777769 3.196451923 0.674057441 3.159029546 0.826941912 4.316120947 3.597052854 4.505705357 3.986400953 5.220801924 3.431248314 4.508788991 4.924513589 4.146662897 4.718940649 5.099923345 3.321442487 4.933892359 4.99479534 4.256514462 4.836126413 4.020812645 5.629051758 5.644296479 5.302187429 4.309409552 4.236889497 4.837344326 4.089557913 0.778779327 2.811773148 3.943528988 3.562675979 3.173803629 4.346803359 3.945303794 4.895454707 4.645891958 4.548530605 3.916492295 4.212930971 3.256700296 3.519238182 2.784912583 4.215587073 4.48897553 3.671712361 5.007125826 4.587593025 3.075644058 3.791881391 2.400308915 4.660526358 3.712406867 3.488734701 2.744899823 0.750528737 3.790976994 4.769380285 3.100030035 5.239291832 +p-Hydroxyhippuric acid 4.19843532 4.621760233 3.835598217 4.166668318 4.592458446 4.114811714 4.396440722 4.121999263 4.256156274 4.000214964 4.130368577 4.278923491 4.145819781 4.35235218 4.1729921 3.952865196 4.336801411 4.552977188 4.265798381 4.176261216 4.462127049 4.18177478 4.420362862 4.774721118 4.306754117 4.211846882 4.104355475 4.582892562 4.190535633 4.170568499 4.226987242 4.250890616 4.430680172 4.143403551 4.24535203 4.234323926 4.229801555 4.110849602 4.532582798 3.577343179 4.164302885 3.843926737 4.302656386 4.184038718 4.212014584 4.232138386 4.371300456 4.829479578 4.289774412 4.498746989 4.141690993 4.100376572 4.288794629 4.180112394 4.025261614 4.094521816 4.008629134 4.368240587 4.431093845 4.073730731 4.296298646 4.059785897 4.284779851 4.180525454 4.426283967 4.544505084 4.736952973 4.15136083 4.460892912 4.364888023 4.523698919 4.372308179 4.37744339 4.266168539 4.062775145 4.147646502 4.120537003 4.880869399 4.16470919 4.320909347 4.444234864 4.093628024 4.054689057 4.152025549 4.315307092 4.271724031 4.283705217 4.14873609 4.327580848 4.046412105 4.5420621 4.325354224 4.340727345 3.953599065 4.122076579 4.206174968 4.587845933 4.48362137 4.593545116 4.527751731 4.457871145 4.548365006 4.270127727 4.240685881 4.029739358 4.462459129 4.392778784 4.164311753 4.302045587 4.129884274 4.130548896 4.13481632 4.446873998 4.212946576 3.968228648 4.094676526 4.23880486 3.987038862 4.500410558 3.903581185 4.611987362 4.15102207 4.484340397 4.102800792 4.174494192 4.056830723 4.190479395 4.685930698 4.397142524 4.499293489 4.302477493 4.720777917 4.490552951 4.557491872 4.565277206 4.340336186 4.213375878 4.223720483 4.340073866 4.385925834 4.30601188 4.226635128 4.435014 4.460519733 4.65298726 4.643995773 4.609086971 4.318908355 4.980967843 4.327189403 4.161115007 4.376218806 4.194725406 4.269542316 4.48227709 4.557218664 4.375768288 4.373990484 4.490098704 4.570959996 4.68544653 4.477571909 4.216141871 4.044547343 3.945023369 4.063879862 3.946870067 4.332280549 4.473481542 4.296758482 4.227847149 4.399927815 4.316545667 4.207044889 4.338592172 4.133756605 4.222293405 4.356079297 4.353581256 4.790346203 4.76392933 4.621562561 4.732695128 +p-Hydroxymandelic acid 4.140948524 3.818507725 4.221859857 4.42101423 4.703186348 4.096615968 3.685936889 4.12842035 4.151551883 3.915723693 4.104312477 3.854454695 3.866449817 4.037377672 4.012453042 4.101215426 4.147706664 4.418984061 3.96762532 4.229419306 4.545156009 4.351507456 4.279815175 4.096763049 3.912543491 4.229136223 4.302823242 3.965698853 4.496408074 4.085383312 3.651401986 3.736035561 4.352190668 3.641593855 4.180389342 4.395219366 4.182143623 4.02290813 4.529639259 3.380436785 4.496982028 3.440271914 4.321327466 4.372956257 4.03591563 4.460930316 4.437778329 4.650167814 4.102419515 3.733152178 4.376182002 4.030765483 4.29142906 4.050604335 4.125012116 3.927521676 4.398116604 4.358373494 4.289724829 4.038232429 4.468095395 4.395060987 4.504799525 4.34306862 4.159688824 4.387388808 4.265885353 4.235680036 4.011337087 4.321897505 4.840298421 4.164000829 4.036792556 4.382228584 4.478539902 4.290602685 4.718056848 4.486123487 4.455542534 4.184634951 3.992709919 4.182385818 4.176048626 4.270151305 4.479345138 4.268762462 4.235961273 4.301321641 4.586426603 4.144676363 4.732709866 3.982782103 3.998404872 4.492609307 4.220450882 4.206252701 4.194921717 4.419270403 4.956386087 4.236717098 4.404148594 4.088911384 4.361167474 4.389588236 4.094564137 4.700966303 4.344187455 4.411684984 4.259693857 4.107581051 3.993438676 4.061206412 4.270136874 4.283578351 4.125513154 3.985946988 3.993004753 4.264959604 4.621843016 4.219691552 4.276510588 4.409620922 4.146996712 4.220398798 4.545820009 4.348457163 4.425466063 4.551341607 4.201347284 3.786223133 4.271030825 4.215473795 4.888129918 4.380000561 4.588151064 4.122217904 4.322595462 4.296574205 4.248218462 4.860730596 4.02972026 4.282806775 4.109762643 4.132348514 4.092216169 4.223993643 4.537834137 4.140677696 4.886662462 4.295678347 4.011458473 4.568541975 4.040250951 4.333755691 4.206666875 4.064446205 4.857714714 4.699648177 3.97010567 4.211137293 4.342238569 3.872441917 4.316264213 4.354882646 4.133200547 4.332574545 4.126603009 4.394454433 4.470231501 4.185669339 4.480478248 4.162395833 4.535171161 4.153080377 4.410127731 4.413538574 4.287989581 4.340385432 4.49030945 4.146523383 4.305234507 4.35089235 4.514431369 +p-Hydroxyphenylacetic acid 4.05736231 3.86796131 4.198771191 4.138231392 4.348635683 4.181576934 3.697926818 4.218169495 4.472245884 3.956276821 2.610658378 3.900964462 4.058632241 3.682032226 4.012415848 3.744681105 4.532682442 4.634929908 4.025718671 4.332195398 4.547795103 4.197794578 4.392796683 4.384420443 4.247841053 4.083428355 4.0788081 3.92659288 4.032120458 4.294351305 3.959747578 4.061532511 4.279596467 4.091212239 4.359466736 4.183957993 3.885912461 3.440457584 4.524486852 3.669110477 4.169203488 3.622516677 4.049748042 4.023985992 3.987348555 4.355090342 4.131067238 4.483968401 4.461183029 3.880038351 3.953083862 4.303093382 4.628384687 4.091044278 4.085584594 4.382980338 3.975746057 4.615118433 4.089062713 4.047587687 4.324673888 3.907971067 4.426924728 4.063836773 4.122617289 4.267032609 4.663525461 4.264661515 4.603318853 4.381815232 4.710444473 4.055487475 4.604825553 4.481626288 4.191319083 4.622114948 4.430265192 4.113949958 4.114740225 4.503812382 4.352768645 4.255053256 4.23893276 4.552732381 3.877013224 4.119467647 4.378337267 4.075242181 4.304982009 4.427842001 3.976029968 3.871326759 3.928001994 4.188049983 4.430144934 4.18925736 3.848597567 4.172603723 4.046401582 4.075358526 4.179249341 4.11106299 4.226720672 4.139500564 4.264172098 4.423503069 4.04558008 4.525002851 4.218407439 4.18406402 4.4010728 4.741917247 4.022653576 4.172739282 4.029288338 4.357602987 4.449185564 4.166544506 4.036704272 4.227928903 4.851987623 4.54549929 4.156820722 4.760368125 4.417888527 4.137805173 4.161716362 4.659939391 4.433742771 4.437972611 4.241397496 4.159660625 4.975182204 4.280445508 4.175095007 3.973738042 4.592778935 4.346213716 4.769627035 4.016625417 4.217385226 4.159292652 4.110609323 4.314982294 4.562881418 4.395310218 4.479936095 4.320982547 5.49945148 4.011157743 4.253985193 4.123458673 4.244874436 3.983372263 4.013200286 4.121063333 4.929453452 4.52560507 4.129709121 4.341375697 4.472469075 4.048510841 4.590297949 4.667542863 4.1009301 4.27097614 4.475825216 4.427834134 4.609073701 4.334693385 4.103770273 4.400486573 4.156704805 4.30313939 4.437082614 4.034686686 4.361433342 4.658843679 3.893735867 4.821383172 4.331688869 4.102464268 4.149684354 +Pantothenic acid 4.367247334 4.483831887 4.281965459 4.201389969 4.367093307 4.12143302 4.116223426 4.455311359 4.345771044 4.339761847 4.415714856 4.577301648 4.31245042 4.200481881 4.520045129 4.079488089 4.404947443 3.71592691 4.406727743 4.481110712 4.12792603 4.741976115 3.891665182 4.362649916 3.795060816 3.895104953 4.267307785 4.149310701 4.456598689 4.464810614 4.144509363 4.549585288 4.204224416 4.023307814 4.407977745 3.322433049 4.159305389 4.241945576 4.281161172 3.605063616 4.223968995 4.362257074 3.65686753 4.196034505 4.172503302 4.352842212 4.019248944 4.133868215 4.496883345 4.33461246 4.212738878 4.429278162 4.477538045 4.461608446 4.387688289 4.45605307 3.961672363 3.894944727 4.484136257 4.284984462 4.542346383 4.435083315 4.385524588 4.315954538 4.565564798 4.927870414 4.089774808 4.292940343 4.234355686 4.414531157 4.227434152 4.336180565 4.644676488 4.375246001 4.325309151 4.086457004 4.08048769 4.480145304 4.325993583 4.395026441 3.796087812 4.230551192 4.403325775 4.335946458 4.157573648 4.152677338 4.059275786 4.333274323 4.655365081 4.057558462 4.230659779 4.374384326 4.031423709 4.089169667 4.308833452 4.457194778 4.305629722 4.547441221 4.316191265 4.511205624 4.384161141 4.752292673 4.496341379 4.303808179 4.495719734 4.261743852 4.387575654 4.329833962 4.328075416 4.309064148 3.991747011 4.162008584 4.305513103 4.645539861 4.260700212 3.997418543 4.294622108 4.403559361 4.289771737 4.349053053 4.24303012 4.060536512 4.652879333 4.360037976 4.337169958 4.423376395 3.922090058 4.297968547 4.384007881 4.217886457 4.566773336 4.627353261 4.37133688 4.500611435 4.450545436 4.784615594 4.296664344 4.088751388 4.465215779 4.648054729 4.747642088 4.295713765 4.219996876 4.698669672 4.315893022 4.458067602 4.817227593 3.933629629 4.580695619 4.578985553 4.646978852 4.58074936 4.638262927 4.257246118 4.400916286 4.463858522 4.450558697 4.4422835 4.349466063 4.374542518 5.508215221 4.636987861 4.68068667 4.437582411 4.40132205 4.178136085 4.431910677 4.382453613 4.646802468 4.622836155 4.571494029 3.967261522 4.325201427 4.271679139 4.344753321 4.167783673 4.375445703 3.873315927 4.209552825 3.69941405 4.630314885 4.594166143 4.526163619 +Pentose 4.119871721 4.219937702 4.354550608 4.294260166 4.465689501 4.250879597 4.277679997 4.278462672 4.657936971 4.128114826 4.215473458 4.160792962 4.069193579 4.316303496 4.098270878 4.13463717 4.232189782 4.331623689 4.413289683 4.350021378 4.403003927 4.151769662 4.668216148 4.295610896 4.768855099 4.518023446 4.231636572 4.409638319 4.160768728 4.334588535 4.7354561 4.311383982 4.19214026 3.909024698 4.216080369 4.006302205 4.416614846 4.15698254 4.580017748 4.31042454 4.05081232 4.111825078 4.302163524 4.105870438 3.976648242 4.34502477 4.466541671 4.171811023 4.16773866 4.329820687 4.293309999 4.24586205 4.396878621 4.249975197 4.210546911 4.480785766 4.50617367 4.306196712 4.250123501 4.199471831 4.534039978 4.235963569 4.301360706 4.396095811 4.204462535 4.36350881 4.523499447 4.31571048 4.836016385 4.249257321 4.355335579 4.606089408 4.343779092 4.390043073 4.559331338 4.446740347 4.444222905 4.834768793 4.345083824 4.422871318 4.42122223 4.337982279 4.147207465 4.311280736 4.334168268 4.224429493 4.335981722 4.406547647 4.257768948 4.45977675 4.328731126 4.430806359 4.235394427 4.251938246 4.178799861 4.315720111 4.241424315 4.647214429 4.411578641 4.644016049 4.145104132 4.306021313 4.418724889 4.244636079 4.20138108 4.533932279 4.467155316 4.407129585 4.245012444 4.343094395 4.452680978 4.464509528 4.099847 4.26006406 4.436671925 4.121763515 4.624037483 4.076161018 4.216534512 4.139958453 4.470772562 4.190182995 4.436567766 4.276442749 4.386747999 4.112255727 4.515114382 4.418888881 4.295222522 4.9308117 4.218017524 4.765391656 4.890318753 4.553737621 4.399243593 4.334164537 4.572322729 4.352859056 4.61105258 4.378584054 4.328201951 4.153073167 4.81539247 4.407779562 4.808601681 4.420646725 4.752444141 4.546169018 5.003417858 4.452155384 4.187523527 4.325115302 4.19117674 4.670860083 4.694087008 4.698875239 4.79193488 4.253359343 4.24021432 4.867837714 4.691353264 4.408002324 4.244441404 4.210238198 4.249258084 4.185131334 4.17919891 4.328089997 4.386445426 4.177845281 4.143571523 4.24560518 4.108481009 4.181567401 4.316960545 4.13784407 4.254798859 4.217586696 4.263808327 4.34668206 4.374921156 4.29050139 4.274382352 +Phe-Tyr-Asp (and isomers) 4.379156111 4.227932317 4.004176162 4.214129481 4.154740736 4.340768134 4.466498085 4.303681771 4.379938142 4.315440218 4.491396854 4.436651568 4.31590619 4.436574575 4.350766404 3.948406925 4.314086102 4.275870681 4.535510139 4.457980179 4.354674737 4.236558235 4.177595748 3.718404165 4.274878632 4.257635492 4.16849056 4.257669335 4.313065163 4.166427679 4.244440021 4.404214991 4.332048578 4.248106775 4.310693137 3.992532242 4.320209365 4.340412043 4.473040844 3.819547163 4.361746928 4.164412154 4.200483013 4.213904114 4.11518848 4.373518441 4.293502236 4.048312344 4.467111362 4.680139607 4.281778862 4.246824447 4.087680253 4.387434877 4.329440002 4.356477257 4.233739948 4.255008844 4.256774127 4.277535147 4.463307778 4.339411306 4.468078703 4.515931208 4.466491377 4.318803709 4.227502262 4.36232443 4.336244088 4.204547371 4.562732239 4.319251694 4.385613167 4.461615802 4.234106919 4.383164833 4.141358399 4.785769328 4.479756237 4.34956587 4.287002151 4.348522344 4.257333879 4.504073087 4.108382036 4.315915961 4.316182977 4.530741574 4.506830041 3.965284799 4.41712613 4.792596739 4.602594141 4.330410156 4.316099593 4.400810032 4.342201446 4.585693731 4.544985343 4.727896855 4.552019159 4.369932479 4.376947846 4.410270346 4.436935234 4.118827162 4.591438392 4.470255181 4.388563451 4.515402187 4.053751632 3.943157069 4.457779878 4.415306531 4.431574367 4.281264572 4.690607827 4.102430414 4.341032441 4.063224607 4.079544418 4.277586964 4.632199784 4.031482482 4.149513409 4.334901541 3.892749315 4.027514592 4.314948837 3.761268962 4.231934661 4.264209954 4.297219764 4.582569433 4.592493115 4.505244156 4.42985341 4.249757849 4.34534646 4.441015261 4.728023364 4.355933294 4.512004874 4.36835759 4.574413454 4.245437035 4.634240718 4.165469091 4.822346925 4.408703485 4.04261215 4.190243132 3.825264392 4.338737149 4.849095597 4.676471169 4.356126615 3.90494047 4.648283079 4.544804112 4.723229642 4.452135141 4.305023406 4.037882863 4.210850837 4.226067132 4.022974499 4.207246625 4.671045094 4.335831087 4.234674038 4.096636288 4.434848897 4.254186733 4.172721514 4.207995378 4.386079457 4.571789215 4.059207749 4.385172228 4.541536144 4.767153034 3.997265908 +Porphobilinogen 3.873927113 4.181048155 4.136767309 4.162674888 4.461157419 4.170573444 3.982546315 4.270354416 4.273039905 4.288919139 4.570908001 4.277645912 3.793927527 4.076542976 4.134035026 4.377456236 4.255352161 5.145749782 4.362922373 4.128284387 4.281163187 4.255700616 4.389500673 4.198064382 4.099758996 4.250535348 4.449570449 4.112408366 4.304340735 4.310021004 4.07695445 4.117586923 4.080296523 3.798107753 4.202380073 4.166050387 4.164065401 3.814699992 4.165492415 3.91072026 4.518137937 3.606117296 4.384786953 4.583740343 4.06432618 4.277926146 4.046541997 4.245677684 4.322047372 4.323421686 4.465878268 4.311599054 4.343216295 4.250810035 4.28129383 4.342599425 4.540885946 4.625025473 4.461626229 4.187417861 4.62484201 4.221832854 4.235719028 4.407137444 4.449755152 4.410327973 4.989324729 4.236278394 4.208204142 4.412758885 4.167296775 4.318131601 4.279654289 4.432272273 4.355548232 4.277077556 4.291611822 4.576975282 4.688588491 4.551028985 4.242067153 4.207482229 4.210452327 4.295538595 4.22182383 4.120176811 4.098075341 4.393289561 4.407305695 4.486272511 4.40262124 4.137285345 4.172125889 4.230774203 4.3444091 4.453885748 4.470691472 4.212433886 4.47019463 4.275877117 4.057396632 4.445322715 4.166119238 4.225532267 4.260620943 4.649177611 4.241158703 4.35311746 3.986270993 4.497736839 4.187863765 4.381269427 4.406922014 4.27303819 4.217842802 4.068648775 4.634413499 4.346050823 4.110135105 4.275678776 4.47166599 4.134919636 4.535103537 4.734691106 4.397031287 4.412495201 4.475282165 4.33755279 4.3776055 4.686904646 4.498734391 4.476378645 4.455380185 4.449074039 4.324208009 4.365883484 4.436777233 3.435033177 4.398008961 4.359481703 4.40575705 4.160172614 4.482901445 4.448295006 4.517324818 4.333445124 4.45993167 4.235318607 4.644306052 4.420501728 4.284397738 4.4430976 4.319779576 4.336040731 4.626692199 4.454550188 4.401833974 4.20803863 4.264486702 4.626944765 4.449969012 4.169323882 4.437123299 4.522648764 4.470288321 4.792206286 4.488967708 4.574836461 4.660166616 4.244194973 4.46980505 4.398515307 4.331418009 4.28136673 4.3648762 4.444910178 4.562721827 4.369843173 4.380710633 4.479089002 4.347467684 4.361606999 4.640743992 +Pyridoxic acid isomer 1 4.264819199 4.103787627 3.887146735 3.856185626 4.602856679 4.069685985 3.957622391 4.202148172 4.155964515 4.112236976 3.975255063 4.29219003 3.844729789 3.909667528 4.355590357 4.112186714 4.228109216 3.958438437 4.048373376 4.650212892 3.614607712 4.761749962 4.421921703 4.285466177 3.739609538 4.289163317 4.276782792 4.08700669 4.456312491 4.25967544 3.674610753 3.750833528 4.218934161 3.717938625 4.700949901 4.436243606 4.439237041 3.667646637 4.037174771 3.562816335 4.492597661 4.228232857 3.882085275 3.940136128 4.09656269 4.486018766 3.870279224 4.344156893 4.691412898 4.831949863 4.235091057 4.557447407 4.130417251 4.486144176 4.438607866 4.180773629 4.351686238 4.369726061 4.364481128 4.321247731 3.939037088 4.670810347 4.448168121 4.175271855 4.539397483 4.466687092 4.316178864 4.325638829 4.10347642 3.865998703 4.823856061 4.26464455 4.486019481 4.221542536 4.237028419 4.169899394 4.179547984 4.132325119 4.110391733 4.27014303 3.972445983 3.953368565 4.236628801 4.402763057 4.125805881 4.202656347 4.174005287 4.292596793 4.682159817 4.084197395 3.754464879 3.937341215 4.188266783 4.363257434 4.470785172 4.343701563 4.201280383 5.795654058 4.541553693 4.25722027 4.503431163 4.693042574 4.330434909 4.473568376 4.524739255 4.207236457 4.457168421 4.251665114 4.368422561 4.104339925 3.976649324 4.109056165 4.405195926 4.314572869 4.285596158 4.244030854 3.741179095 4.16170832 4.418902168 4.258469754 4.455772322 4.69269206 4.337773791 4.136907686 4.512565697 4.271876865 4.312526113 4.227665455 4.591549696 4.108779405 4.351904667 4.059870789 4.171731625 4.442439639 4.407173946 4.488694963 4.357501068 4.309730593 4.46297114 4.35404029 4.158410862 4.141364494 4.770041072 3.921049558 3.938507514 4.348566645 4.424484274 4.169944189 4.2041828 3.945854367 4.310445112 4.312146907 4.446034954 3.780346245 4.029180746 4.197413711 4.076096457 4.225577482 3.814738211 3.986999692 5.123458608 4.085895748 4.24649997 4.52217256 4.336618661 4.635701052 4.600673151 4.481214623 4.569517367 4.371816058 4.581913598 4.237584798 4.284817176 4.217788424 4.584269736 4.079932532 4.109106187 4.266889125 4.167132899 4.190732525 4.307299534 4.343830247 4.434036564 +Pyridylacetylglycine 4.042991845 4.21032699 4.099646284 4.309022212 4.386012889 4.398878593 4.195925543 4.385432396 4.030210987 4.415859504 4.362366845 4.448932883 4.226969951 4.045274167 4.216427591 4.260473293 4.236345036 4.112286095 4.252136083 4.395046014 4.15288747 4.37100491 4.104235233 4.255684221 4.064337793 4.070409927 4.382614505 4.295542132 4.489714707 4.34505446 3.800032964 4.195880016 4.380279169 3.914009556 4.258167038 4.340718693 4.30839512 3.959208081 4.47164672 3.928025576 4.475867298 4.352749288 4.009209356 4.32895183 4.247008497 4.455641963 4.296864467 4.366877024 4.377557057 4.32165334 4.138156381 4.437185501 4.619823482 4.560737277 4.440055204 4.12522324 4.471238641 4.518166048 4.503480461 4.328339555 4.371554151 4.315219104 4.542337389 4.503182762 4.607558678 4.422271235 4.345219565 4.483151752 4.158919228 4.69752083 4.417843095 4.403220444 4.328740626 4.598514129 4.405837148 4.240850916 4.234039254 4.180140233 4.389289789 4.54881315 4.115922636 4.344072521 4.259365322 4.314701951 4.37200863 4.551560419 4.307100349 4.22714068 4.471541133 4.351771423 4.728102573 4.250562271 4.270256349 4.330308639 4.572226856 4.491542024 4.383985047 4.338460212 4.625564988 4.509122541 4.227242652 4.29799515 4.470676279 4.5748393 4.387221405 4.306126752 4.56338414 4.381149817 4.36853998 4.331051703 4.051344812 4.146306333 4.371347065 4.380367318 4.20837015 4.11731501 4.272920081 4.228597819 4.310783714 4.519180413 4.690801474 4.38313131 4.625963566 4.245021569 4.485415953 4.366597015 4.131922485 4.15041966 4.338845 4.023274266 4.487896215 4.119189963 3.777620854 4.629820138 4.431361796 4.357124988 4.374066385 4.35103391 3.809224093 4.185979168 4.525742517 4.184597694 4.201596689 4.470285463 4.405949718 4.423398925 4.501812832 4.064266688 4.181762332 4.430002781 4.405850129 4.531333018 4.402607901 4.087334498 4.56899762 4.408212531 4.222787827 4.393317483 4.17858613 4.385807332 4.640097609 4.405474231 4.370818488 4.341298318 4.584067096 4.403255979 4.495063791 4.193452212 4.600589925 4.479885141 4.578150087 4.180420451 4.488254561 4.385279377 4.474134903 4.431225358 4.496193486 4.29825967 4.5248521 4.220961078 4.70252771 4.704379463 4.584008587 +Pyrocatechol sulfate 4.452942268 4.281094021 4.239741313 4.186333009 4.060465931 4.282089235 4.098804246 4.218382543 4.560716274 3.790356495 4.255926391 4.357877449 4.122079856 4.128600347 4.329101172 4.172429473 4.213921643 4.446184688 4.377532675 4.430559695 4.353444407 4.229803339 4.569526967 4.147555959 4.536912291 4.484772013 4.117851592 4.07894434 4.346167509 4.23989747 4.342622862 4.14501768 3.97815995 3.924294079 4.217068517 4.117804164 4.420189864 4.309973611 4.647461775 4.094548645 4.264716063 3.841567588 4.14651541 4.210736803 3.947304993 4.461308418 4.217984476 4.11769865 4.283273069 4.243818106 4.238755132 4.191104128 4.269170078 4.309801813 4.072865665 4.395226389 4.38234509 3.821174502 4.247200872 4.555804777 4.529913421 4.436393623 4.326217697 4.155658749 4.490483506 4.284693871 4.538235021 4.387158416 4.497050524 4.29832622 4.620718952 4.345991941 4.33624304 4.419431838 4.41985945 4.37740988 4.360086886 4.793473401 4.301337244 4.226587796 4.421730694 4.202872482 4.161752874 4.23443884 3.906884932 4.133233616 4.211327461 4.448421089 4.469381648 4.458506426 4.405768745 4.514945691 4.190574076 4.209055099 4.193731885 4.218487555 4.00834538 4.434380239 4.452833297 4.575112292 4.213779599 4.39990054 4.325718968 4.278140379 4.164449135 4.445398465 4.435497224 4.302743933 4.26356807 4.534303115 4.302440982 4.373890358 4.550625771 4.122333175 4.47011902 4.232206978 4.552186032 4.042350903 4.241909864 4.045684994 4.445092697 4.181007781 4.395192068 4.336078545 4.418438893 4.234701687 4.385299036 4.3658378 4.142063581 4.793846239 4.233819573 4.574474674 4.61406951 4.580705947 4.59647548 4.180978965 4.347278883 4.299974391 4.970936326 4.396895975 4.54210523 4.206704428 4.690032175 4.355108593 4.728064586 4.311681713 4.696468324 4.435072949 5.013804122 4.39027052 3.998090741 4.14588842 3.956809967 4.54205792 4.465166163 4.452902965 4.786058184 4.185581116 4.003309395 4.768004424 4.72720122 4.216698377 4.182351566 4.234124847 3.966746246 4.105529851 4.024941215 4.468606074 4.407870066 4.430394972 4.074229144 4.215413018 4.173349378 4.337385783 4.097998022 4.07731427 4.172790598 4.420439902 4.128882577 4.261934051 4.412189637 4.329814223 4.230007965 +Pyroglutamic acid 4.013842815 4.188312874 4.202476277 4.209444222 4.246487149 4.184347049 4.091154917 4.047518309 4.407469367 4.146465942 4.098654742 4.211437065 4.11483148 4.039582951 4.142495944 4.083169719 4.209294408 4.154260011 4.406318949 4.399642084 4.117807919 4.2047482 4.786186945 4.235600842 4.557513462 4.317404582 4.257847969 4.274328402 4.196528587 4.201391692 4.25917282 4.093610526 4.135677618 3.89094674 4.232711587 4.233675003 4.271068353 4.116743137 4.25586463 4.205877026 4.363468736 3.877112761 4.141461721 4.602344318 4.06105723 4.16605457 4.216089324 4.263804794 4.2932128 4.199912886 4.102885027 4.164596806 4.419578783 4.162636691 4.224613953 4.394520095 4.595545205 4.079658622 4.027507872 4.184902297 4.590981971 4.202962735 4.15196659 4.352261584 4.188161991 4.33846269 4.357706348 4.150041743 4.404670134 4.225231361 4.583043227 4.349888874 4.218207382 4.317227536 4.291675442 4.24037171 4.281911603 4.384953942 4.449188443 4.396245426 4.293884735 4.113952058 4.216665167 4.138714952 4.410723129 4.189034919 4.134110711 4.464513059 4.374130687 4.37695277 4.455034222 4.529323888 4.149616353 4.276660107 4.204749302 4.353621671 4.067349137 4.499644346 4.493029964 4.415227647 4.296063465 4.121987526 4.428202149 4.287082326 4.131199191 4.38198089 4.427605165 4.261986508 4.13418033 4.182910308 4.235844747 4.306820558 4.327048223 4.01607882 4.328466836 4.108020647 4.402214491 4.099190553 4.323499468 4.219547908 4.573692466 4.244233446 4.266409881 4.206343294 4.451648795 4.193972421 4.403388718 5.412193964 4.362064414 4.522796297 4.233366906 5.721490134 4.481957146 4.36856755 4.41061672 4.113086704 4.515517156 4.143517552 4.763330773 4.449634674 4.308078296 4.055880808 4.648491419 4.139100169 4.449903925 4.125578133 4.634972207 4.28957406 5.056631706 4.176783229 3.999993022 4.330930497 4.122089452 4.204084943 4.406196446 4.386170727 4.357840767 3.841891448 4.173465971 4.536408327 4.708647365 4.327946659 4.178730197 4.334587901 4.209925843 4.126995141 4.120913487 4.32686551 4.423143656 4.215670777 4.173833466 4.367713845 4.233705443 4.108685965 4.212770105 4.210922823 4.245704624 4.389884026 4.202785829 4.220507092 4.329617796 4.428668419 4.342312715 +Pyrroledicarboxylic acid 3.854579114 4.059364419 4.426634009 3.763358298 3.828248673 4.317047209 3.653239518 4.111334911 4.777541613 2.622717807 3.677787331 3.408444104 3.762430308 3.037436447 3.787293714 4.069635086 4.238515185 4.261964146 4.274529508 4.165879474 4.37503895 3.263420848 4.931663419 3.358254306 4.587461819 4.691596125 4.285182752 3.821239459 3.537697775 4.359533441 4.786093202 3.861779654 3.342007118 3.362664867 4.027628354 2.736417731 4.494857717 3.095008545 4.582017749 4.394177721 3.999205283 3.591238846 4.608953614 3.920741146 3.967034181 4.6579082 4.277916818 4.267594064 3.918868237 3.71440331 4.192358479 3.523575342 4.12407591 3.880367189 3.933289044 4.267696039 5.039733374 3.970872993 4.309639824 3.60353218 4.424784465 3.731856439 3.929041828 4.223397639 3.640394033 4.800906563 4.535811871 4.184077072 5.142957315 4.656231545 4.519334234 4.686885134 3.851437572 4.240032633 4.581950141 4.542876815 4.010406141 4.859471421 4.377173938 2.972977143 4.371862588 4.355159769 4.047843455 4.147332046 3.416652185 1.329789387 4.213418972 4.953308754 4.490477118 4.406039747 3.640817037 3.705879148 3.897129282 4.31138347 4.163960075 4.300168507 2.723831499 4.56932769 4.724611784 4.452748386 4.174484931 3.696974094 3.664942173 3.799775746 4.054642892 4.207904352 4.214112617 4.700356179 3.892409252 4.538983165 4.342201507 4.5692299 4.550031042 3.969627003 4.258433595 4.424413206 4.507690199 3.705676361 4.47922391 4.066068482 4.077938823 3.570837788 4.309784225 3.723210713 4.149492213 4.139991864 4.821173146 4.69416412 3.968458101 5.100034062 3.814516819 5.027327444 4.852634907 3.462003239 4.249748147 4.275777659 4.536632409 4.429400869 4.734176044 4.698283326 3.947454229 4.08947485 4.901733262 4.476970558 4.973645733 4.341417189 4.468495562 4.491827043 5.394516232 4.465347369 5.031729314 4.054094909 3.330805759 4.798448498 4.534364455 4.778212618 4.875325796 3.91753572 3.714145477 5.052434824 3.992669252 1.87851345 3.862180586 4.1225882 4.000996516 4.057040543 3.432638137 4.374123325 4.381139269 4.314721512 3.247179474 4.245774059 4.346498136 3.983524123 4.643219212 3.092427604 4.023887592 4.04184372 3.609924791 3.361971531 4.300861991 3.383012094 4.490839591 +Pyruvic acid 3.2294447 3.843605903 3.555714319 3.766176294 3.9850185 3.911799496 3.761245558 4.053891494 3.703902512 3.956699772 4.045294524 3.587880766 3.67423758 3.570043632 3.887100829 3.71025496 4.214226161 3.957779199 3.976196323 3.919245818 3.843025872 4.042436904 3.80446762 3.746318817 3.389486364 3.660104216 4.293777969 3.739373575 4.305703748 4.229059796 3.561759746 4.167141526 4.060358412 3.627207116 4.004860017 4.018798122 3.95382979 4.96055597 3.888572435 3.459311038 4.045783288 3.885893624 3.948278672 4.03136454 3.731009619 4.032480575 4.147974155 4.087402319 4.349814369 3.897689375 4.231372515 4.064129562 3.985308254 4.112122315 3.705466047 4.160780936 4.041754141 3.883258836 4.211096957 3.965846892 3.978731775 3.898213623 3.931016783 3.725286156 4.073220289 4.556007083 4.138106033 3.988883399 3.710231178 3.870261169 4.205405747 4.115582199 3.97203181 4.118544271 4.060153378 4.026814738 3.685109799 4.230371942 3.9867026 3.853026494 3.562693776 4.33315937 4.040134597 4.153041493 3.822209283 4.199282077 4.031680137 4.030984531 3.866695239 3.855035696 3.96170596 3.906239378 3.883787689 3.733800144 3.881230102 4.32748352 4.294087386 3.960115328 3.863012886 4.142489651 3.899288315 4.147714565 3.794032874 3.930106936 3.767974951 3.795401965 3.951157827 3.866192504 3.929857887 4.274195794 3.670991126 3.629715859 4.067656673 3.923321806 3.869677545 3.92676383 3.895299561 3.894855792 3.87907668 4.325806777 4.167930503 4.119907612 4.21017052 3.906369681 3.788762928 3.842935054 4.294224555 3.903768764 4.124530821 3.861607166 3.858652364 4.055664243 3.856563933 3.868157041 3.850977152 3.920151209 3.942328236 4.165617303 4.437698708 4.048982673 4.066357319 4.160697288 3.3972272 4.221227172 4.002245973 4.07971399 4.306162859 3.721016847 4.194464611 4.09022797 4.040569547 4.016677626 3.957898676 3.942939736 3.833773778 3.947216555 3.795651844 3.894276439 3.815415279 4.017282735 3.930370386 3.991492216 4.081504688 4.137284074 3.950676482 3.785027417 4.143087459 4.324116605 4.316397611 4.039188003 3.69557932 3.973950535 3.898082144 3.758508068 3.877212845 3.717605553 3.943230856 3.916129555 3.943488816 4.157750248 4.109323435 4.003650254 3.882996846 +Quinic acid 4.128022579 4.168760741 4.295170907 4.533187887 3.685546068 4.459419655 3.288560982 2.478387705 4.609045176 4.589248893 4.264874894 4.131776602 4.306133559 2.884534579 3.981475827 4.290301655 4.255466321 3.66759262 4.386240402 4.35377852 4.470196854 4.269261907 4.690219256 4.348301322 4.760091628 4.564911913 4.277410867 2.514187419 3.871439564 2.401970428 4.732005274 4.454358888 4.251352852 3.703407249 3.003091342 3.757674808 4.578727258 3.207569678 4.434107243 4.307125905 3.873225155 4.442626052 3.227629373 4.218743321 3.700804891 4.46132076 4.167095711 2.559844916 3.236934993 4.559719333 4.152463835 3.938745035 4.121693323 4.347113499 4.48769076 4.299635646 4.482480627 4.130994885 2.354327183 4.372537506 4.576020376 4.295298528 4.341087842 4.405203089 3.645970766 3.563584543 4.10409149 4.497579246 4.865082063 4.183718797 4.830931412 4.599137016 4.436283523 4.570429661 4.428274316 4.509338764 4.281873073 4.95629524 4.150018113 4.326603438 4.54183606 4.576556172 3.833419551 4.788645529 3.874043217 4.203214173 3.997906628 4.514788628 4.664222711 4.680167071 2.962311372 4.2753686 4.358198121 4.75751362 3.521918157 4.395425362 3.683085602 4.754968551 4.241310366 4.879172582 4.334200589 3.842363883 1.81295007 4.151322673 4.177687869 4.516878544 4.689843848 4.524157969 4.251486879 4.751241149 4.3993775 4.526590473 4.310426245 4.391614593 4.529305587 4.205538868 4.565822509 3.718330078 4.344941994 4.409662578 4.626989004 2.99256157 4.585895833 4.419101295 3.352960248 4.235866272 4.533961908 4.257714551 4.292380258 5.072789857 4.20546342 4.64915713 4.975216311 3.815103487 4.712280677 3.147665665 4.415998726 3.560563395 4.761358965 4.210108471 4.600317877 4.394180748 5.051862866 2.243739801 5.051576727 4.43622963 4.996038263 4.337334063 5.188803906 4.63123598 4.007778902 4.403208958 2.350875284 4.577332893 4.569936968 4.562652643 4.756893046 3.814785962 3.310757607 4.973969502 2.985531007 2.946014739 3.264690876 2.841876292 2.914897877 3.757722984 1.217098255 4.217605035 4.450511087 3.327658004 1.667391826 4.501886858 2.456828173 4.640039086 2.567376572 3.284486362 2.302849371 4.489767625 4.252573554 4.057719476 4.095065603 4.031562868 3.91706933 +Salicylic acid 3.925518082 4.035195971 4.5883271 3.847884613 3.695890564 4.100362812 4.158632572 4.002481235 3.648724074 5.823615583 3.769767338 3.415179194 4.219493821 4.86066326 3.347440671 4.055732504 3.023362123 2.536248816 4.21241967 3.716968204 3.487607924 4.264724228 3.360201611 3.664865648 4.470893181 3.491812176 2.953202863 4.047609223 3.157043077 3.083276313 4.095700175 4.5559707 3.734333775 4.028777085 3.093673202 1.444256034 3.099840132 2.801124401 5.137744645 3.827829519 3.57803436 3.260438716 3.193100994 5.509455669 3.205288246 3.283103731 3.345729541 2.92740373 3.167156178 3.41093249 3.398235016 2.303975215 4.155495144 3.446519964 5.204929441 2.796690621 2.358265196 4.189447187 4.97979158 3.42623018 3.866853177 3.18358818 3.705148602 3.133948316 4.024278085 3.14078385 3.597403714 3.712374012 4.674007316 4.765613289 3.918148547 3.557964947 4.385415488 4.133747631 2.55548391 3.074524137 3.431348839 4.492914216 4.202071133 3.495335135 3.967792187 3.217560367 3.156421888 2.810789538 3.363505468 2.850465711 3.591907073 3.14452569 4.146763047 2.486982493 3.268661585 4.782400902 4.28960336 3.621119394 4.034275993 2.752368019 2.932808434 3.234499307 3.069526304 3.900218887 3.179726265 4.894320537 4.267031816 3.697107945 3.473474581 4.087165274 4.102824906 3.473900212 5.288672554 3.72875648 3.745443367 4.428919726 3.948154133 3.774784129 4.272672814 3.946919194 3.96680245 3.259699189 3.03068318 2.559535824 3.664928793 2.846839322 3.473221379 4.113499328 4.409442284 3.861618963 3.539470123 4.517628785 3.986443681 4.237410931 3.184097302 4.003168096 4.847979347 2.79880742 3.335411274 3.444641282 3.844077484 3.993723664 3.528890153 4.54719652 3.85537092 2.99748052 4.245642544 4.029724291 4.146009191 4.239040747 3.995450891 3.964939957 4.035283383 3.193018683 3.022493223 3.500831612 3.737490371 3.86367482 4.566501818 4.106954951 3.657577566 3.809355699 4.021846494 4.267287531 4.674386362 4.309696625 3.650610964 2.916432599 3.422667166 3.056954892 3.489730344 3.311029341 4.05815664 4.082048214 4.184269525 3.558799239 3.185054421 3.420641151 3.904303363 3.73329128 3.738333835 2.359633687 4.000295019 2.782454862 4.045779722 4.275853474 3.868478396 +Sebacic acid 4.298555268 4.316858535 4.387094407 4.026013055 4.516984982 4.547072723 4.282560639 4.670899734 5.017336121 4.563748127 4.553187929 4.346599872 4.261236226 4.378770052 4.542229999 4.491316482 4.413607967 4.651304602 4.428966572 4.665731364 4.245685996 4.988373031 4.405413172 4.257716618 4.315631146 4.706686729 4.108902479 4.2357287 4.481226924 4.467081517 3.928407937 4.19931723 4.398839515 4.186042285 4.358087765 4.09499758 4.494340852 3.749516871 4.599855351 4.327760827 4.288708933 3.627599004 4.087643961 4.262129304 4.530826915 4.563930328 4.224525709 4.461182329 4.47916709 4.789513778 4.405070067 4.422549994 4.402651381 4.623782724 4.614527744 4.448409677 3.84157317 4.557315869 4.400956333 4.417914886 5.026830525 4.300994082 4.361824305 4.486165102 4.561142729 4.707734755 4.837446902 4.5223813 4.323099623 4.424828039 4.712575316 4.469480349 4.684188393 4.510145229 4.771669607 4.334306898 4.174608134 4.33760734 4.498937684 4.798892867 4.221297407 4.29301081 4.546123748 4.582348037 4.350395865 4.309700108 4.581973598 4.340437115 4.494844122 4.148700028 4.371509884 4.26766615 4.725835844 5.056952271 4.736886676 4.602653547 4.223366428 4.308148897 5.07037142 4.951851542 4.480412831 4.681173361 4.54094933 4.665003005 4.449876138 4.8753044 4.62959568 4.30576659 4.762041403 4.672347447 4.207255542 4.227813115 4.411994843 4.700513714 4.672484549 4.539954799 4.209507941 4.273936188 4.727028085 4.684662705 4.913020345 4.574709256 4.268849413 4.538584409 4.967562478 4.428501974 4.354777856 4.563733674 4.155158823 3.961840024 4.425254906 4.483130973 4.57515467 4.234613955 4.37584757 4.188007471 4.658944933 5.000679498 4.273578987 4.746413745 4.501040047 4.739362016 4.208149194 4.547150173 4.439019594 4.668770636 4.984581049 4.740483592 4.651999841 4.336164594 4.290369822 4.200108987 4.28154867 4.260287805 4.468531839 4.369895939 4.684927562 4.134826991 4.097824073 4.646122812 4.610300162 4.463753404 4.479189993 4.497785148 4.495440985 4.248585163 4.675045099 4.755728353 4.864248932 4.755550339 4.440132536 4.468152889 4.235826268 4.05616641 4.561905501 4.759717692 4.401025762 4.512930545 4.512006366 4.880794684 4.335057688 4.650956667 4.544485632 +Suberic acid 4.283357894 4.521645928 4.159624866 4.125570405 4.452634104 4.53542272 4.099827742 4.381655452 4.351379191 4.424450713 4.46091251 4.02922461 4.071142157 4.219656604 4.314138133 4.422525911 4.301566401 4.702656971 4.221069832 4.408334443 4.618071858 4.604806366 4.474656029 4.518038557 4.449238781 4.379907286 4.180994998 4.24743405 4.323730427 4.230315656 4.065658453 4.215773586 4.017466815 4.021412937 4.337847427 4.207433299 4.500680389 3.986565698 4.34660985 4.413725123 3.718601747 4.04859078 4.305140761 3.918934467 4.433824104 4.095601961 4.338914485 4.558247614 4.251144575 4.586909006 4.429677472 4.145296378 4.286177418 4.387352863 3.739471886 4.517958886 4.0888315 4.38195026 4.163649178 4.127921884 4.446732967 4.127805755 4.327475574 4.18607893 3.780536407 4.255501014 4.810679271 4.143086489 4.336259615 4.090909391 4.64632557 4.241134282 4.638210027 4.594096662 4.458397522 4.24102841 4.08455917 4.274537248 4.53499753 4.839944827 4.082757564 4.091058902 4.498809516 4.149499948 4.650827377 4.505248625 4.316351258 4.428941768 4.42095798 4.482573305 4.615800502 4.471119379 4.085379987 4.684071044 4.605139274 4.57388834 4.11184204 4.256323914 4.427305825 4.405496322 4.416475521 4.079785405 4.621433862 4.56053546 4.224083556 4.182786195 4.424640676 4.217595923 4.39235046 4.268952132 4.198375976 4.20385148 4.796664784 4.466524665 4.290878924 4.430714146 4.643137724 4.219308308 4.689338882 4.633036853 4.910510683 4.227852375 4.329125735 4.486979266 4.471815393 4.758771852 4.595374643 4.578410022 4.468391436 4.483679958 4.289919674 4.455207449 4.545546844 4.820239703 4.233971613 4.405340393 4.386853073 4.759883447 4.473540717 4.48025737 4.14554037 4.208657553 4.248730203 4.630179802 4.461024268 4.473196933 4.999889118 4.529494274 4.789214186 4.467935305 4.338446917 3.986306592 4.289727745 4.240604933 4.320078038 4.579158859 4.495738561 4.294238643 4.386724192 4.761007734 4.72756778 4.521800213 4.295974777 4.839379318 4.572440585 4.919904931 4.601706443 4.172027387 4.506486466 4.663169002 3.926062879 4.144213768 4.043683878 3.879728396 4.459115581 4.381787149 4.058095437 4.502549607 4.342747471 4.839935036 4.511889823 4.809278489 4.691557399 +Sulfosalicylic acid isomer 4.724542627 3.968790602 3.9465924 3.560990024 4.320034402 4.480640221 4.211068943 4.034459114 4.629955847 4.300503931 4.297629557 4.672109302 4.421392738 4.309183112 4.3052094 3.795517328 3.950070377 3.782221441 4.317349501 4.646520241 3.973993945 4.329854558 3.850695754 4.013830242 3.930330096 4.027441334 3.877227437 3.883969386 4.522357155 3.975774901 3.248754713 4.362800427 4.536878079 4.101913236 4.77923668 4.034839629 4.020783746 3.433093634 4.738648985 3.870442402 4.216698732 4.152979546 4.022790993 4.297088453 4.418675188 4.673908706 4.044239008 4.322499023 4.801396418 4.62967226 4.176507216 4.517129681 3.73704683 4.848514015 4.660950017 3.945784036 4.389369102 4.153686829 3.88791022 3.927724935 4.253282555 4.52292424 4.193003236 4.255385677 4.18172858 4.033752325 4.435635876 4.02604779 3.846012264 4.404074226 4.738315977 4.624524968 4.3419335 4.214800638 4.061083417 4.10067569 4.174586914 4.451261804 4.021541317 4.048840167 4.72466035 4.318190951 3.673542728 4.644850889 3.646875009 4.524099979 4.52159815 4.090952401 4.655446127 4.185936651 3.773032324 4.248810329 3.92861717 4.386831145 4.393411947 4.778395497 4.171041974 4.819762562 4.502462309 4.314627103 4.615983815 4.770565665 4.482510736 4.311415049 4.231913712 4.548893069 4.291913059 4.26960026 4.475223938 4.420191615 3.552362493 4.107780235 4.728471821 4.570217399 4.23893534 4.127303943 4.010883309 4.179153933 4.476568742 3.523473422 4.719970581 3.95387306 4.430623338 4.355131195 4.196484174 4.10989053 3.890350787 4.393069198 4.814095436 3.205246154 4.535037207 4.447569237 4.027486128 4.231447097 4.794761849 3.991451039 4.406278605 4.029068636 3.624360737 4.005769388 4.588634263 4.53104739 3.928741906 4.175914676 4.247618677 4.511275985 4.36383847 4.267336563 4.321921699 4.15651223 4.513588626 4.338971289 3.936087508 3.597933115 4.359283063 4.434161275 3.774623674 4.181390084 4.257746381 3.911062891 4.346541481 3.95663675 4.551762007 4.266643627 4.050336669 4.015825144 4.359807909 3.881123049 4.586744167 4.67928259 4.481356923 4.488949266 3.994400651 4.410206236 4.291927033 4.175443972 4.144767527 4.532649726 4.53561743 4.655785439 4.756255765 4.138518618 4.067452526 +Taurine 4.294955544 5.143374302 4.525364632 4.821052287 4.544508368 3.999298113 4.82623719 4.655239659 4.007468063 5.042936201 4.800154513 4.461322603 3.569861462 4.128042581 4.557499728 4.500319644 4.528352909 5.092530231 4.893367499 4.182412771 3.986501365 4.165662459 3.628624479 4.708126207 5.135750355 4.110263668 4.086133064 4.531039991 4.189118535 4.084436173 4.622734314 4.16104834 4.213809356 4.438001434 3.47844618 4.588485467 3.652346354 5.138491471 1.593821865 4.037974916 4.137795085 3.329748499 2.840310804 4.287876054 4.365351502 4.038795083 5.152233452 4.081949755 4.13801078 5.042392273 4.266523139 4.253489396 4.379992393 4.821439809 4.421164397 4.749909843 4.483011559 4.041890017 2.410288674 3.591739617 4.866831712 4.039157543 4.324237435 4.426433733 4.691644036 4.191053008 4.758601555 4.231683333 4.036473759 3.536078349 4.610679686 4.378320044 5.031716857 4.314092512 4.358920266 4.320681528 4.251428702 5.21014401 4.578010211 4.718210628 4.606296091 3.683189262 4.21168305 4.905828758 4.769925256 4.608147209 3.87726102 4.599165163 3.570251787 3.315029244 5.387072061 5.086381807 4.349839286 4.240439698 4.663546514 4.69925422 4.254972781 4.550255365 4.843803005 4.8178866 3.489131739 2.199231921 4.775987476 4.184231696 4.557785095 3.962891076 4.844678949 4.266447217 4.511472418 3.996559151 4.218533622 4.59452921 4.91335686 4.599332044 4.857214361 4.1408353 4.032985757 4.560522225 4.519846666 4.222809316 5.620030868 4.652830956 4.817966075 3.937079218 4.543560004 4.458181305 3.92304048 2.315561606 2.842205252 4.503857575 4.317899609 4.362754352 4.509943161 1.917028675 4.500265086 1.863361312 1.644145369 3.952728999 3.987847726 4.571917268 4.318482165 4.551073115 4.186278347 4.396529354 4.474917091 4.289063232 5.137503905 3.09931886 4.093108458 4.044406253 4.378755372 4.309870834 4.604652026 4.3105238 4.749764547 4.710284261 4.147436658 4.375819665 4.11383333 3.728735275 3.222442547 4.540922996 4.662862059 4.242657588 4.438342016 4.419668435 4.044139411 3.068401905 4.106686583 4.714052116 4.577833534 3.8629837 3.297803234 4.486835108 4.583493207 4.401218176 4.424595644 4.390711436 3.720404002 2.364132049 4.298145835 5.225412044 4.742826254 +Testosterone glucuronide 4.292437346 3.467556126 4.325042578 4.306861676 4.589207976 4.010065624 3.949479485 4.634697877 3.934808838 4.273896385 3.856351858 4.38023644 3.695799496 3.976266006 4.554130733 4.363478091 4.476691092 4.493874877 3.898166621 3.745816908 3.833326823 4.463233637 4.139324119 4.577328372 2.574687117 4.513755035 4.465354 4.520254029 4.474550595 4.424517577 2.033125636 2.466263188 4.697006892 3.100724052 4.063739123 4.503641671 4.395068945 3.951331034 3.750355215 3.574701886 4.504581687 2.705226767 4.145326613 4.187153079 4.250541599 4.592006579 4.229260483 4.314234237 4.113101324 3.301270983 4.359257982 4.779536197 3.60330204 4.140623902 4.407982009 4.219738119 4.364364573 4.414975135 4.297006939 4.716728042 4.303885101 4.650848616 4.264969087 4.491364822 4.369311616 4.627652424 4.391710237 4.128255916 2.924695463 4.795384375 5.260365012 4.581156354 4.395147594 4.620026202 4.613989274 4.328765568 4.322224258 4.252128025 4.598959018 4.649659639 3.895630416 4.481670482 4.702051285 4.16886765 4.34610054 3.568323265 4.069798778 4.209275538 4.431615524 4.687757067 4.01912921 4.359695115 2.869343304 4.352794617 4.623338035 4.596567236 3.933727633 4.172031843 4.937413858 4.288068161 4.582754845 3.982000358 4.198973015 4.478457098 4.306073754 4.509899751 4.555597879 4.581611701 4.441428589 4.53316839 4.427418504 4.392911651 3.919683303 4.510679713 4.605028159 4.572647621 2.512192311 4.575136155 4.348264046 4.515482365 4.764314309 4.690527967 2.184745748 4.715273163 4.931993991 4.722764649 4.057121476 3.399040484 4.077208661 3.71522178 4.617477343 4.037489808 3.644872636 3.856057428 4.291863346 3.512330504 4.103837527 4.180462506 4.158161118 3.711250731 3.643544106 4.35712392 3.100844566 2.372174268 2.411561389 3.833347686 4.540534372 4.063370472 2.441882068 4.068253188 4.271473933 3.884488575 4.293512512 3.640573307 3.898178329 4.297704998 3.060350268 3.610245855 2.306670586 3.706141431 2.702803325 4.516497727 3.776639433 4.725472316 4.544972359 4.297896403 4.02148345 4.222998687 4.267865792 4.296510999 4.670306816 4.162256644 4.480804767 4.188796572 4.631827454 4.233203407 3.989416355 4.854903603 4.491458154 4.399174537 4.011308592 4.250233781 4.269353315 +Tetrahydrohippuric acid 3.409692231 4.76682715 3.407598479 4.522244489 4.296404399 3.764092383 3.774824162 3.808102913 3.432094679 4.446872148 4.445913188 4.281855767 3.658976449 4.10742413 4.782742283 3.902947178 4.352986917 3.922518416 4.792640591 4.7130064 4.775549554 4.314276383 4.524298603 3.266369759 3.316867231 3.98703248 4.350958894 4.834671632 4.183090859 3.476357402 4.674144362 3.979174548 3.129741437 3.711235728 3.953804935 3.729236411 4.806873148 5.140741291 4.910238703 3.647228472 4.162891616 3.91656121 4.417539751 4.538472946 3.241557054 3.778427546 4.411022606 3.224452512 4.284461804 5.186691827 4.972021339 3.916100173 3.124347515 3.978409859 3.583779397 3.741257545 4.567627453 3.221242537 4.326710362 4.370758252 4.383634482 4.572763006 5.427828111 3.642881081 4.977837767 4.311901247 4.124769879 5.292343344 4.450814633 3.961743137 5.431656591 3.346076037 4.694419448 3.781447914 3.440547537 4.140770166 4.664812253 5.533925973 4.812596681 3.411608069 4.302627273 4.312603387 4.637764867 4.409915505 4.8176685 2.779529007 3.290418053 5.212260715 4.450939604 3.748090882 4.448896477 5.261515762 4.284525636 4.060230264 4.145918825 3.915938565 3.716325244 3.840843193 4.40379273 5.056169973 4.340986763 4.491933016 3.272632794 3.83623808 4.507029539 4.16881219 4.470906565 4.168871373 4.576624797 5.060451469 4.669907588 4.203739798 4.964901791 3.621870677 3.955814664 3.84465735 4.574240947 4.244677435 3.585809763 4.075142914 4.047947912 4.426946191 4.546870848 3.217532062 2.592352049 3.932713547 4.251067838 3.538394013 3.597243829 3.66289944 3.455592608 4.135950212 4.979378876 5.246424238 4.039716196 5.014401767 3.671918556 4.087863792 5.044099555 5.057405277 5.281695949 3.808304704 4.758863469 4.121039355 4.362748784 4.2638864 4.834113993 3.687587403 5.640766352 4.680612922 3.285273746 4.239099254 3.71338851 5.093663422 4.52659207 4.388420261 4.203525951 4.082820476 4.432651683 4.723088052 4.896800856 4.563313026 2.536616563 3.955458723 4.186138621 3.488528949 2.510338347 4.777590532 4.785887826 3.049898269 3.875756953 4.501813406 3.914903756 2.877656436 3.892469135 3.915733853 3.856165627 3.907870589 3.953533863 4.419693281 4.392726024 4.520764375 3.700881326 +Threo-3-Phenylserine 4.274910494 4.15393383 3.45729612 3.927525296 4.246965533 4.269735712 3.876733901 3.929919772 4.129820937 4.448093736 4.203623572 4.04504328 4.131762761 3.903241935 4.581390612 3.93144758 3.746989557 3.45350104 4.508143728 4.674652887 4.419992563 4.360160942 4.424805755 3.182131206 2.753115906 4.238050678 4.316458739 4.253183745 3.905127172 3.347644806 4.022949731 4.063579784 4.003475979 3.919084336 4.030850537 3.650793626 4.419339499 4.310983109 4.591683693 3.721263644 4.27653355 3.657464176 4.331174737 4.50553633 4.021507572 3.789654174 4.023920072 3.645775842 4.537035074 4.529611237 4.625193245 4.021218667 3.196259587 3.865894818 4.019350325 4.051894196 4.368265583 3.948240834 4.119568106 4.047999872 4.337680269 4.459600609 4.9766578 3.880872721 4.791631575 4.044744778 3.855743906 4.787783735 4.475329881 3.752100398 5.017327315 3.775618023 4.386972216 4.139479617 3.277416376 4.203351988 4.55419899 4.940289797 4.312073933 3.918488398 4.30063083 4.596593291 3.849001685 4.421325295 3.815838717 3.630181323 4.099747386 4.669516265 4.320040956 3.51232356 3.643667331 4.501707389 3.785725666 4.193790227 4.362347479 4.311563847 3.897825606 4.235179781 4.277917824 4.579203862 4.200697794 4.810679885 3.178585853 4.073177661 4.528467984 4.418014047 4.563616082 4.21196492 4.407261536 4.938480864 4.039147116 3.693646204 4.710953791 3.754790702 4.160458153 4.054228609 4.550357014 4.137806433 3.885262098 3.941400814 4.147122328 4.09324887 4.792876121 3.609287656 3.82766728 3.981234981 4.144639893 3.85239035 4.0825432 3.004202062 3.876685165 3.705887117 5.048805496 4.856837223 4.746656011 4.478565952 3.803336835 3.694623926 4.870270741 4.821400085 5.202148069 4.258171216 4.332585144 3.875727141 4.033591789 4.473362975 4.272841414 4.326091996 5.126575756 4.370851213 3.762720894 4.59236853 3.467478505 4.684608014 4.102095297 4.254652941 3.892104516 3.706913198 4.09707758 4.4529687 4.298299141 4.064696295 3.515943904 4.021525843 4.141858505 4.115709693 3.050585484 4.937994707 4.564867446 3.844558746 3.845246449 4.716338189 3.414976128 3.984387063 3.90775427 3.864057463 3.673806723 4.648874949 3.963553648 4.551190353 4.532860182 4.406217283 3.878895848 +Threonic acid/Erythronic acid 4.313963325 4.473728977 4.124348489 4.558517852 4.446222079 4.367591637 4.456741975 4.423534101 4.425982016 4.407831871 4.492283928 4.269593411 4.295105782 4.485143336 4.215179882 4.19821675 4.433375284 4.527392297 4.523639759 4.4009354 4.481254283 4.258404849 4.29237496 4.463453592 4.490769295 4.2888749 4.260731117 4.360905491 4.276795157 4.300857123 4.349559807 4.621335151 4.294095247 4.060976398 4.329823242 4.257450889 4.309883974 4.747773805 4.276946051 4.275426191 4.259145749 4.311042599 4.337770466 4.295802073 4.098668027 4.329491723 4.611249958 4.284695982 4.274880627 4.733648875 4.215484118 4.436124365 4.276267127 4.436900858 4.254937197 4.300267567 4.354867448 4.101507452 4.308488024 4.337467697 4.556775816 4.259960541 4.248129656 4.516018945 4.398146433 4.477500112 4.445113572 4.359651024 4.282851528 4.275799701 4.634577393 4.362124458 4.313990403 4.673385924 4.457391464 4.197385 4.253712529 4.712116103 4.359766657 4.571585707 4.163257943 4.268242706 4.263875432 4.456848417 4.570508189 4.261276253 4.272483396 4.290254949 4.524391198 4.358937038 4.823370697 4.605011129 4.350192502 4.227658304 4.276851456 4.483142894 4.314094479 4.53918902 4.664924285 4.679002048 4.152138843 4.362717012 4.70044696 4.294819723 4.268013607 4.29730056 4.569311052 4.282688043 4.304149961 4.540233857 3.978125463 4.112360743 4.32872294 4.324125157 4.128062632 4.119042891 4.596261541 4.165608906 4.400481278 4.28174612 4.862713716 4.345228433 4.591878337 4.412990324 4.522522487 4.33521362 4.358693155 4.296745073 4.432679788 4.31700049 4.330714569 4.436922163 4.435223895 4.620595793 4.578777899 4.393555171 4.585059966 4.452743756 4.4321268 4.202907407 4.513644747 4.304526526 4.468465885 4.646686653 4.42680567 4.37927932 4.907265664 4.119344288 4.724543017 4.361924746 4.275842717 4.44911699 4.24966425 4.108964537 4.593140705 4.451319279 4.281276962 4.141019312 4.565297616 4.708509693 5.121321992 4.697802032 4.284989455 4.287321075 4.30616777 4.113395415 4.251029927 4.480673553 4.724307576 4.301950391 4.262383161 4.12529641 4.202929034 4.21232733 4.278974312 4.267965681 4.303580459 4.552510385 4.363657314 4.27163218 4.642877753 4.703771355 4.517390792 +Tryptophan 4.006518145 4.421590182 4.438305654 4.542105055 4.217120084 4.558530841 4.594285494 4.602582155 3.755448638 4.083327977 4.467260181 4.284253921 4.452736695 4.446745751 4.406250496 4.456603341 4.20467154 4.175133053 4.6988231 4.216690457 3.910997629 4.066861191 3.853908267 4.695474358 4.764997907 3.844000704 4.420374814 4.698198386 4.521445049 4.366663903 4.385478917 4.392199746 4.211792156 4.095357552 3.94274881 3.756232105 4.121063743 4.156756006 4.138501463 4.011422868 4.253853088 4.0396714 4.3676362 3.998399116 4.374581498 4.112124927 4.429130327 4.144981471 4.183132004 4.330408034 4.250363737 3.93164585 4.10717991 4.331926998 4.449487538 4.632162155 4.191232135 4.452904661 4.448646469 4.653087422 4.789200277 4.040434369 4.701754649 4.177189259 4.556233089 4.080013895 4.454273054 4.442816755 3.890305772 4.715000449 3.477374706 4.138223864 4.366033195 4.591547913 4.299657277 4.160235652 4.120551464 4.790969937 4.480853062 4.48320933 4.478147668 4.389225818 4.324417293 4.295483557 4.169535669 3.583912128 4.228694252 4.501577773 3.967997274 3.757025058 4.771293412 4.714692339 4.492840968 4.519807664 4.567994119 4.008612707 4.40410005 4.752453045 4.759380991 4.309832422 4.394063032 4.237659167 4.568966709 4.398508214 4.756375291 4.168442308 4.677272939 3.978031284 4.663793577 4.674684628 4.298287976 4.364220357 4.333705715 4.252375568 4.460680174 4.511418991 4.312606536 4.320831296 4.129001852 4.263505413 4.704249397 4.526287391 4.471569145 4.383089254 4.105092009 4.428899202 3.467422776 4.34639618 3.997745312 4.223471472 4.412224645 4.256111314 3.864810023 4.34681087 4.523609898 4.092748709 4.458011022 4.535423092 3.965900639 4.222450568 4.716494414 4.364600597 4.425823439 4.584698587 4.327148979 4.229307543 4.694991016 3.804089921 4.263901695 4.507756435 4.436409541 4.127606922 4.532252064 4.070376229 4.604743245 4.600031277 4.103990486 4.09763683 4.242916532 4.233038844 5.044019048 4.491745119 4.871133581 3.90322846 4.203132965 4.609026883 4.328277289 4.500697925 4.534672662 4.110936043 4.550227727 4.185437714 4.416729048 4.076709694 4.516014135 4.342583031 4.448587677 4.35091576 4.123865415 4.044296166 3.99916971 4.6873815 4.495757177 +Valerylglycine isomer 1 4.016260966 3.881005467 4.187176209 4.147544157 4.10449814 4.065452493 4.195771335 4.365553185 4.221221437 4.048706906 4.662549001 4.512595612 4.309422115 4.116851447 4.286686806 4.072967385 4.261706936 4.113702658 4.726028449 4.634412635 4.087797642 4.353756472 4.297211714 3.930559687 4.14833566 3.867298004 4.393248184 3.920066317 4.051276242 4.064649411 4.089873573 4.379006337 4.257290867 3.946490611 4.139446873 3.802748605 4.094913988 4.128372529 4.080243278 3.934470169 4.338898054 4.29544982 4.123837747 4.018987536 3.972859303 4.518104281 4.426399478 4.039166596 4.398027926 4.567846669 3.882498396 4.456261633 4.305525218 4.501831402 4.535017824 3.690047373 4.424362946 4.705606934 4.123640663 4.318823951 4.345941723 4.326056957 4.261045783 4.463031674 4.487175686 4.739448228 4.485993002 4.605754206 4.188100764 4.345645845 4.502777005 4.676812618 4.590849327 4.578742449 4.498112109 4.209994056 4.489593095 5.105139235 4.335035952 4.512776609 3.819530946 4.239369153 4.345227856 4.438637985 4.151023539 4.069495644 4.001636171 4.289563059 4.44463779 4.332423245 4.42209126 4.158625045 4.140618014 4.737429181 4.605328542 4.770893466 4.177843226 4.38072755 4.384436576 4.3036776 4.277542571 4.45586256 4.799206287 4.345462192 4.604132752 4.295548881 4.331294808 4.403530577 4.124398366 4.190615061 3.768626221 3.967950268 4.365055601 4.639460672 4.25929984 4.526081835 4.065621299 4.4578692 4.24011565 4.603380032 3.977609797 4.514553432 4.613591421 4.71347876 4.542861335 4.261765774 4.564014341 4.249556733 4.485123192 4.913916221 4.599588909 4.382972992 4.232318164 4.216276302 4.567372109 4.52031209 4.301255404 4.528325901 3.983551093 4.347386257 4.408110607 4.731154051 4.355978564 4.668527874 4.830977039 4.524930045 4.38520582 4.365996623 4.599009189 4.450875729 4.519916222 4.609242596 4.554090331 4.255125993 4.583035562 4.362465329 4.351628819 4.730888095 4.547088843 4.345854504 4.568109389 4.327210176 4.369962576 4.527475795 4.479201193 4.516097677 4.235344227 3.519476484 4.622131561 4.470330451 4.672129338 3.958931766 4.375629967 4.555918016 4.40903929 4.015765819 4.708088568 4.259459416 4.158079759 3.928620189 4.739685824 4.439139434 4.470200623 +Valerylglycine isomer 2 3.889078716 4.181765852 4.254694804 4.290660491 4.138196474 4.300929631 4.267335235 4.273554372 4.026459018 4.117726076 4.391506546 4.327061846 4.319591936 3.959436787 4.302327307 4.111199307 4.234801947 4.405743336 4.782640641 4.475097443 3.950485409 4.579432672 4.271695364 4.182347358 4.34619879 4.069431557 4.388545701 4.241584222 4.191744654 4.160850517 4.43226049 4.330382886 4.100121431 4.320047243 4.239744811 4.150606181 4.124659917 4.375400222 4.251030211 3.777775091 4.361487807 4.082842319 4.083917302 4.325269835 4.010354674 4.462516251 4.472209609 4.259480191 4.392390039 4.395272253 4.305664387 4.179207569 4.396834579 4.31087313 4.419271137 4.039056214 4.393125083 4.675851363 4.364602525 4.466913655 4.481694872 4.318407645 4.289313676 4.446749448 4.571755159 4.580876703 4.472186105 4.571326085 4.256571368 4.39667478 4.528005839 4.541201304 4.406940498 4.545197346 4.391907474 4.344684431 4.477778512 4.450207826 4.417370227 4.386250441 4.085408476 4.379901509 4.215423793 4.406536979 4.163083399 3.963043381 4.187628652 4.320252412 4.545904132 4.157495172 4.5392129 4.355912516 4.32104914 4.595052116 4.387708897 4.434185544 4.060156974 4.416837064 4.417398742 4.332046944 4.248920107 4.318558306 4.675950075 4.188599527 4.654017827 4.398818689 4.448725636 4.565013209 4.273248747 4.353604308 4.056089953 4.261860182 4.366973197 4.451823465 4.375387491 4.392784813 4.187746104 4.182184758 4.06300237 4.433683963 4.494079796 4.423765189 4.646938456 4.487248568 4.175523204 4.322262883 4.314792833 4.211783408 4.348925516 4.245849039 4.482311354 4.365509618 4.44930672 4.232880823 4.441521421 4.563517091 4.331946693 4.200062175 4.208486129 4.241824508 4.445903314 4.60948463 4.517829053 4.578649469 4.916165933 4.654804445 4.551715167 4.291265754 4.874321475 4.400847348 4.38994431 4.303778936 4.373744009 4.302854884 4.598405731 4.568087675 4.461992655 4.464836218 4.625734497 4.584892798 4.662890116 4.339637524 4.497000889 3.983841809 4.283440095 4.488303133 4.296996312 4.19346948 4.727898398 4.28073709 4.513542781 4.421895016 4.313514034 4.453121704 4.303450906 4.055802163 4.602680714 4.27076319 4.224132258 4.276186679 4.652756637 4.634338821 4.47194762 +Xanthosine 4.075879575 4.195761901 4.12449321 4.2502583 4.361708565 4.199196067 4.196265732 4.404987211 4.41064782 4.175794892 4.258855541 4.172714224 4.016015657 4.100203052 4.384366912 4.112921255 4.399534645 4.332193324 4.208322622 4.379464496 4.265560718 4.418307991 4.087210986 4.354190761 3.978396839 4.172345295 4.106312026 4.113942504 4.558528094 4.405650867 3.683591924 4.26118478 4.282118008 3.858642232 4.299616596 4.314749151 4.065692925 4.144560403 4.103564195 3.790628566 4.416095358 3.700313782 4.265516105 4.289286398 4.302147514 4.38354181 4.218737122 4.241238791 4.415874314 4.120532172 4.291457181 4.432756525 4.239834416 4.385267423 4.203494903 4.352140139 4.353667915 4.211041989 4.471329543 4.407096124 4.335026554 4.295258417 4.360194162 4.244628342 4.523107299 4.680727647 4.380119407 4.50434686 4.101784524 4.190726746 4.702793616 4.283539498 4.491848445 4.628062354 4.405671691 4.158371484 4.227722032 4.320367885 4.415241512 4.640270467 4.21985738 4.150109329 4.265318291 4.540761333 4.261018241 4.151723361 4.259370091 4.393426673 4.870015557 4.19378655 4.10780659 4.016284523 4.107217721 4.31688128 4.49131669 4.562464053 4.50079102 4.281917446 4.487327505 4.133987874 4.186924379 4.447610934 4.384756495 4.455984384 4.431190839 4.272439619 4.515910771 4.35224905 4.249140203 4.126305817 4.025207129 4.144468584 4.370255637 4.480739473 4.363577911 4.194958282 3.950238979 4.197796158 4.489707246 4.395211284 4.589147194 4.410919138 4.26922062 4.315277915 4.516084092 4.26149305 5.535146698 4.244361054 4.422768199 4.078743662 4.434466561 4.090579617 4.085780689 4.48828568 4.610716761 4.159093884 4.139057245 3.674563769 4.65106654 4.176384186 4.301494215 4.241053606 3.94529113 4.123354762 3.765637618 4.203290621 4.40791255 4.150929571 4.289863493 4.178743871 4.123566885 4.345336878 4.279958081 4.063705348 4.069319014 4.200426656 4.00966354 4.200744339 4.061326655 4.093155495 4.514761467 4.227698791 4.527880359 4.507718263 4.375752047 4.28503905 4.235141509 4.534792548 4.394130646 4.523847631 4.352227778 4.233160334 4.253659257 4.031631259 4.426082168 4.500371235 4.186340083 4.629825565 4.408696151 4.3878006 4.256140724 4.487781609 4.222953354 diff --git a/examples/multivariate/pod-run.sh b/examples/multivariate/pod-run.sh new file mode 100755 index 0000000..db783e2 --- /dev/null +++ b/examples/multivariate/pod-run.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +docker run docker-registry.phenomenal-h2020.eu/phnmnl/multivariate:latest \ + /bin/bash -c mkdir -p working; cd working; /opt/galaxy_data/database/job_working_directory/001/1466/tool_script.sh; return_code=$?; sh -c "exit $return_code" \ No newline at end of file diff --git a/examples/multivariate/sampleMetadata.tsv b/examples/multivariate/sampleMetadata.tsv new file mode 100644 index 0000000..f370fc9 --- /dev/null +++ b/examples/multivariate/sampleMetadata.tsv @@ -0,0 +1,184 @@ +sampleMetadata age bmi gender +HU_011 29 19.75 M +HU_014 59 22.64 F +HU_015 42 22.72 M +HU_017 41 23.03 M +HU_018 34 20.96 M +HU_019 35 23.41 M +HU_020 59 17.1 M +HU_021 34 23.36 M +HU_022 51 28.23 F +HU_023 51 29.55 M +HU_024 57 29.86 M +HU_025 53 21.6 M +HU_026 34 23.46 F +HU_027 37 24.82 M +HU_028 41 23.92 F +HU_029 37 27.78 M +HU_030 49 25.88 M +HU_031 25 20.76 M +HU_032 38 24.09 F +HU_033 44 18.36 F +HU_034 52 23.37 M +HU_035 37 20.7 F +HU_036 47 29.51 M +HU_037 35 25.62 M +HU_038 52 22.72 M +HU_039 45 24.9 M +HU_040 24 26.54 M +HU_041 28 23.67 M +HU_042 36 19.75 M +HU_043 42 29.04 M +HU_044 57 25.46 F +HU_045 46 20.81 F +HU_046 35 24.84 M +HU_047 43 25 F +HU_048 39 19.49 F +HU_049 50 27.85 M +HU_050 30 24.21 M +HU_051 24 23.23 F +HU_052 51 20.06 F +HU_053 49 25.88 M +HU_054 29 20.76 M +HU_055 58 24.89 F +HU_056 41 21.15 M +HU_057 57 27.16 M +HU_058 45 26.7 M +HU_060 55 28.72 F +HU_061 44 25.35 F +HU_062 34 22.22 M +HU_063 35 21.01 F +HU_064 32 21.94 F +HU_065 54 21.87 M +HU_066 25 22.53 F +HU_067 40 19.31 F +HU_068 37 27.22 F +HU_069 39 24.38 M +HU_070 58 18.71 M +HU_072 47 27.13 M +HU_073 35 25.38 M +HU_074 42 20.94 F +HU_075 38 21.05 M +HU_076 47 26.7 M +HU_077 27 21.15 M +HU_078 46 25.18 M +HU_079 47 23.55 M +HU_080 21 19.72 F +HU_081 25 17.84 F +HU_082 49 23.15 M +HU_083 50 29.76 M +HU_084 62 23.8 F +HU_085 23 22.86 M +HU_086 33 23.51 M +HU_087 38 23.8 F +HU_088 50 21.78 F +HU_089 31 23.7 M +HU_090 46 19.79 M +HU_091 61 26.12 M +HU_092 40 21.83 M +HU_093 53 21.71 M +HU_094 32 23.29 M +HU_095 27 27.33 M +HU_097 50 26.78 M +HU_098 46 20.45 M +HU_099 23 21.3 M +HU_100 47 21.22 F +HU_101 39 23.7 M +HU_102 59 24.03 F +HU_103 49 26.79 M +HU_105 47 22.96 M +HU_106 42 27.34 M +HU_107 46 24.22 M +HU_108 25 23.81 M +HU_109 32 22.68 M +HU_110 50 20.9 F +HU_112 55 25.36 M +HU_113 44 23.05 M +HU_114 58 29.38 M +HU_115 46 27.24 F +HU_116 28 20.96 F +HU_117 24 22.86 M +HU_118 30 21.64 F +HU_119 50 24.44 F +HU_120 32 23.88 F +HU_121 26 20.57 M +HU_122 48 23.03 M +HU_123 49 24.39 M +HU_124 34 22.22 M +HU_125 58 25.47 M +HU_126 45 24.7 M +HU_127 45 25.62 M +HU_129 47 29.32 M +HU_130 33 26.06 M +HU_131 42 23.12 M +HU_132 38 26.67 F +HU_133 53 25.43 M +HU_134 48 22.89 M +HU_135 31 24.93 M +HU_136 52 20.81 F +HU_137 28 22.22 M +HU_138 42 21.88 M +HU_139 47 23.03 M +HU_140 49 26.59 M +HU_142 25 20.98 M +HU_143 52 23.15 F +HU_144 38 29.54 M +HU_145 27 29.09 M +HU_146 42 24.21 M +HU_147 60 31.74 M +HU_148 55 30.48 F +HU_149 35 19.49 F +HU_150 49 27.24 F +HU_152 26 17.58 F +HU_154 35 27.71 F +HU_155 48 20.45 F +HU_156 36 16.85 F +HU_157 43 21.95 F +HU_158 50 25.48 F +HU_159 37 21.72 F +HU_160 31 24.17 F +HU_162 50 29.03 F +HU_163 49 23.15 F +HU_164 45 25.63 F +HU_166 40 19.72 F +HU_167 55 20.57 F +HU_168 37 20.76 F +HU_169 53 19.14 F +HU_170 50 24.61 F +HU_171 29 21.37 F +HU_172 55 21.36 F +HU_173 55 20.28 F +HU_174 42 31.64 F +HU_175 35 21.26 F +HU_177 59 28.58 F +HU_179 33 26.57 F +HU_180 53 23.74 F +HU_181 49 22.46 F +HU_182 43 23.74 F +HU_183 46 19.13 F +HU_184 37 25.33 F +HU_185 42 21.09 F +HU_186 44 22.1 F +HU_187 21 19.95 F +HU_188 22 24.22 F +HU_189 39 19.43 F +HU_190 28 25.93 M +HU_191 36 26.12 M +HU_192 31 24.22 M +HU_193 35 21.78 F +HU_194 40 28.04 F +HU_195 26 18.42 F +HU_196 27 21.1 F +HU_197 26 20.72 M +HU_198 35 22.98 M +HU_199 33 21.04 M +HU_200 46 23.89 M +HU_201 34 20.24 M +HU_202 42 28.06 M +HU_203 25 19.95 F +HU_204 31 29.06 M +HU_205 33 28.37 M +HU_206 45 22.15 F +HU_207 33 19.47 F +HU_208 27 18.61 F +HU_209 17.5 21.48 F diff --git a/examples/multivariate/sampleMetadata_out b/examples/multivariate/sampleMetadata_out new file mode 100644 index 0000000..7ca6710 --- /dev/null +++ b/examples/multivariate/sampleMetadata_out @@ -0,0 +1,184 @@ +sampleMetadata age bmi gender gender_OPLSDA_XSCOR-h1 gender_OPLSDA_XSCOR-o1 gender_OPLSDA_predictions +HU_011 29 19.75 M 1.58293313047118 4.9806037392409 M +HU_014 59 22.64 F -1.37280613081632 1.74433815056477 F +HU_015 42 22.72 M 3.34136968418065 3.43727711491962 M +HU_017 41 23.03 M 3.59006316404314 0.979495987120886 M +HU_018 34 20.96 M 1.66271563510991 -0.315584520504211 M +HU_019 35 23.41 M 2.31292339567712 -0.656128073574044 M +HU_020 59 17.1 M 0.932682995993685 3.13384149735159 M +HU_021 34 23.36 M 1.74869628827996 0.41752604868978 M +HU_022 51 28.23 F -0.241809256894707 0.491049116158774 M +HU_023 51 29.55 M 1.7425061156994 2.95169109073032 M +HU_024 57 29.86 M 1.29517450819287 0.205827759529838 M +HU_025 53 21.6 M 1.77687142137439 1.74290900741242 M +HU_026 34 23.46 F -0.905433973047307 6.27708879537232 F +HU_027 37 24.82 M 2.38884046119679 4.10267671703555 M +HU_028 41 23.92 F -1.33253605468889 2.70035605659215 F +HU_029 37 27.78 M 4.04962818855043 2.04230210400039 M +HU_030 49 25.88 M 2.31942286908789 -0.536465874242346 M +HU_031 25 20.76 M 3.9676885414254 -1.53991130404747 M +HU_032 38 24.09 F -1.90648288426957 -2.00562755678015 F +HU_033 44 18.36 F -2.60330864259552 -1.04392739299679 F +HU_034 52 23.37 M 3.16799714286182 -0.733953917496611 M +HU_035 37 20.7 F -2.88236649269234 -0.0420212890932657 F +HU_036 47 29.51 M 0.456450017551661 -0.465131358686609 M +HU_037 35 25.62 M 1.80080016818244 3.91504037841238 M +HU_038 52 22.72 M 1.74154406361342 1.15677072444102 M +HU_039 45 24.9 M 2.51337372518582 -0.0601405276939136 M +HU_040 24 26.54 M 1.77425721650046 1.25860088731523 M +HU_041 28 23.67 M 1.34364556833848 2.36517436329155 M +HU_042 36 19.75 M 2.2708435582018 0.664476283924372 M +HU_043 42 29.04 M 1.37975330324734 2.19923914440385 M +HU_044 57 25.46 F -0.693510288549522 3.79714140989595 F +HU_045 46 20.81 F -3.99445110424675 2.4512989046396 F +HU_046 35 24.84 M 0.789202061516398 1.76837903047691 M +HU_047 43 25 F -1.03708773561841 9.32213664193582 F +HU_048 39 19.49 F -3.28152944701099 3.43069989788204 F +HU_049 50 27.85 M 1.25926419544782 4.70594121877466 M +HU_050 30 24.21 M 2.89950306721262 -1.09754469539616 M +HU_051 24 23.23 F -3.98947680827422 6.81135423195647 F +HU_052 51 20.06 F -2.16112718026215 -1.77029334378363 F +HU_053 49 25.88 M 1.42526044160803 8.90619343237515 M +HU_054 29 20.76 M 1.78456402868924 1.43502042646009 M +HU_055 58 24.89 F -3.5431501643564 10.7483458185538 F +HU_056 41 21.15 M 2.20260798475925 2.39922664129116 M +HU_057 57 27.16 M 1.6155332179699 1.43419490597522 M +HU_058 45 26.7 M 3.05317465504811 4.87646520314668 M +HU_060 55 28.72 F -1.82313449553941 -0.536464981602601 F +HU_061 44 25.35 F -1.24385157546657 0.785314506600513 F +HU_062 34 22.22 M 1.01911820989929 0.845017425604579 M +HU_063 35 21.01 F -3.75661480829994 1.93213102018408 F +HU_064 32 21.94 F -1.38665360030315 -1.12022977200023 F +HU_065 54 21.87 M 1.68481339709357 0.0563934127767823 M +HU_066 25 22.53 F -1.27149486038764 2.0628293107866 F +HU_067 40 19.31 F -2.22770474417785 3.12411146123335 F +HU_068 37 27.22 F -2.66189899325594 -0.348623393778582 F +HU_069 39 24.38 M 3.37590105763249 0.0480755536432562 M +HU_070 58 18.71 M 1.69442075760416 0.186724671273337 M +HU_072 47 27.13 M 1.6701256535878 -0.730068657993729 M +HU_073 35 25.38 M 2.18213690858945 1.18138479819621 M +HU_074 42 20.94 F -3.09095007228102 2.59274708312188 F +HU_075 38 21.05 M 2.25267420757465 0.543717672555423 M +HU_076 47 26.7 M 0.639518677745425 -4.86754252197724 M +HU_077 27 21.15 M 0.668851404829271 0.733305089280426 M +HU_078 46 25.18 M 2.23156976189628 -2.55792315642502 M +HU_079 47 23.55 M 0.291481015536569 -0.351419211590525 M +HU_080 21 19.72 F -1.46458707358092 0.642471609597288 F +HU_081 25 17.84 F -3.56869282665826 0.109841130953026 F +HU_082 49 23.15 M 2.21733368238415 -3.72517614164827 M +HU_083 50 29.76 M 1.35101571931506 -1.53150431318518 M +HU_084 62 23.8 F -2.47025939454657 0.704854684902949 F +HU_085 23 22.86 M 0.861449221187205 -0.284776704434232 M +HU_086 33 23.51 M 0.240625133995134 -7.82759918445756 M +HU_087 38 23.8 F -1.46583179373077 -0.995836439732216 F +HU_088 50 21.78 F -1.23073077205365 -1.9557540368262 F +HU_089 31 23.7 M 0.84722329333765 -4.67466272644122 M +HU_090 46 19.79 M -0.240220827251134 -0.434984651413085 M +HU_091 61 26.12 M 0.708954446373867 0.708518233273242 M +HU_092 40 21.83 M 3.25766373991557 0.612242632003036 M +HU_093 53 21.71 M -0.2722512450185 -6.82015994391301 F +HU_094 32 23.29 M 4.87627977216498 -3.75781257316719 M +HU_095 27 27.33 M 1.79060767273301 -3.94305975589431 M +HU_097 50 26.78 M 1.34192808561658 2.90083895963035 M +HU_098 46 20.45 M 0.941521289370677 0.700263194210824 M +HU_099 23 21.3 M 0.681914663439508 1.95803602933046 M +HU_100 47 21.22 F -0.00400805795203465 -1.7505007413511 M +HU_101 39 23.7 M 0.702375537901114 2.60821894164833 M +HU_102 59 24.03 F -2.12354375191367 4.04958472118649 F +HU_103 49 26.79 M 1.56705287036968 1.82851108037729 M +HU_105 47 22.96 M 0.0839930499132598 -1.11455935491243 M +HU_106 42 27.34 M 0.80666063967251 -2.63028112461382 M +HU_107 46 24.22 M 3.20001113166665 0.420680749500796 M +HU_108 25 23.81 M 0.910342296333496 -1.98026861854879 M +HU_109 32 22.68 M 1.54651064802147 -2.02723634840039 M +HU_110 50 20.9 F -3.21988058005263 4.00451740339073 F +HU_112 55 25.36 M 2.34265130693714 -2.82841842092514 M +HU_113 44 23.05 M 1.59298133135561 -0.0404370176047968 M +HU_114 58 29.38 M 0.167378495824655 -2.86861303174659 M +HU_115 46 27.24 F -0.901455340321644 3.05526769990411 F +HU_116 28 20.96 F -2.95438113046617 -1.9639137601519 F +HU_117 24 22.86 M 1.72975632333293 -5.76828706634313 M +HU_118 30 21.64 F -1.80785380931897 -4.68898788609544 F +HU_119 50 24.44 F -2.89039792620823 1.63508664871793 F +HU_120 32 23.88 F -6.30383360370801 3.2508991957068 F +HU_121 26 20.57 M 0.261571391689504 -1.31242983428482 M +HU_122 48 23.03 M 1.97722954327486 -2.16514182787301 M +HU_123 49 24.39 M -0.0533046345794438 -0.258942585739277 M +HU_124 34 22.22 M 2.13330833604065 -2.22583897553433 M +HU_125 58 25.47 M 1.86694393977163 -4.53044405236957 M +HU_126 45 24.7 M 1.86189354677789 -2.31555101874733 M +HU_127 45 25.62 M 1.64818368333343 -1.18235506727406 M +HU_129 47 29.32 M 2.24729386939742 -3.31832337030591 M +HU_130 33 26.06 M 3.97472227767611 3.23839165604945 M +HU_131 42 23.12 M 2.46293367161478 1.09749415459956 M +HU_132 38 26.67 F -0.497855004714105 -2.51983712816142 F +HU_133 53 25.43 M 0.514756115402624 -1.53681474889941 M +HU_134 48 22.89 M 1.3700484952222 -0.56306165650533 M +HU_135 31 24.93 M 2.44925229897762 1.24524100505772 M +HU_136 52 20.81 F -2.7546732916265 0.0283481186281538 F +HU_137 28 22.22 M 2.12489637483936 3.37201477458599 M +HU_138 42 21.88 M 1.90096259238906 -1.81868737707891 M +HU_139 47 23.03 M 2.69443528333851 -0.0992540138446447 M +HU_140 49 26.59 M 0.709228526328496 -5.69514718965739 M +HU_142 25 20.98 M 0.906595007806958 2.4906802941563 M +HU_143 52 23.15 F -2.87301511377198 -2.35405760231077 F +HU_144 38 29.54 M 2.10713674682657 -1.79664265133915 M +HU_145 27 29.09 M 3.82599319921535 -1.99244640166711 M +HU_146 42 24.21 M 3.13977240382026 -0.366994303453535 M +HU_147 60 31.74 M 1.70236062431376 -1.1157713452035 M +HU_148 55 30.48 F -1.39625886460325 -0.0975023672835233 F +HU_149 35 19.49 F -2.39597821298642 0.0642246680295437 F +HU_150 49 27.24 F -1.90392495280342 1.81127258367052 F +HU_152 26 17.58 F -1.31160302430449 0.0235635071995006 F +HU_154 35 27.71 F -2.66444245379189 -3.27758649173271 F +HU_155 48 20.45 F -2.20856364721724 -3.33644002158172 F +HU_156 36 16.85 F -1.52953002189326 -1.51427503378043 F +HU_157 43 21.95 F -1.75308670674791 -3.43093920423897 F +HU_158 50 25.48 F -3.83377911414521 0.849063729773212 F +HU_159 37 21.72 F -1.52581332135293 -2.5764314930024 F +HU_160 31 24.17 F -3.9255448024201 4.21997212073322 F +HU_162 50 29.03 F -2.46131392118948 -1.97630797198586 F +HU_163 49 23.15 F -1.76731833221729 -0.476614076082873 F +HU_164 45 25.63 F -2.46969740417325 -1.73837091356558 F +HU_166 40 19.72 F -2.60891832045248 1.62397221076742 F +HU_167 55 20.57 F -1.13595390084553 -2.32018077055045 F +HU_168 37 20.76 F -4.17806521546818 -0.73451031942323 F +HU_169 53 19.14 F -4.74381993648062 -2.56906729222864 F +HU_170 50 24.61 F -4.19693772130769 -0.250917674903843 F +HU_171 29 21.37 F -2.15651839000821 -8.90928509895316 F +HU_172 55 21.36 F -1.30886599279716 1.50002406583418 F +HU_173 55 20.28 F -4.45842407224622 -10.7099858705925 F +HU_174 42 31.64 F -2.46896639658496 -1.57045228110498 F +HU_175 35 21.26 F -2.31704752376519 2.42707115016401 F +HU_177 59 28.58 F 1.05949064742695 -0.628494629070062 M +HU_179 33 26.57 F -0.221776928921426 4.37067631370139 M +HU_180 53 23.74 F -1.06030081691949 1.45138367797621 F +HU_181 49 22.46 F -0.538051411009479 -4.4254784256287 F +HU_182 43 23.74 F -1.33082226230118 -2.58616318394215 F +HU_183 46 19.13 F -1.98148234207269 -0.534346683073414 F +HU_184 37 25.33 F -2.20665960604897 4.45485889844764 F +HU_185 42 21.09 F -4.80320147288146 2.93822239486359 F +HU_186 44 22.1 F -0.49335383900729 -6.68178851358826 F +HU_187 21 19.95 F -4.10733091383723 -6.84959062049853 F +HU_188 22 24.22 F -0.422324155810693 0.742725159557937 F +HU_189 39 19.43 F -2.23938444082181 0.580857050424952 F +HU_190 28 25.93 M 1.71585518120188 1.58148883395967 M +HU_191 36 26.12 M 2.72614391002983 0.619530750996703 M +HU_192 31 24.22 M 1.5342927967285 1.16830178189421 M +HU_193 35 21.78 F -2.71720235383659 5.23695437441707 F +HU_194 40 28.04 F 1.10865110375743 -1.47303720351079 M +HU_195 26 18.42 F -1.68579671119508 -5.97486671349496 F +HU_196 27 21.1 F -3.30746570726101 -0.305963539467928 F +HU_197 26 20.72 M 0.420110533407766 3.74844549106185 M +HU_198 35 22.98 M 1.52314064013922 1.49166148399989 M +HU_199 33 21.04 M 1.63113861184599 2.46761505226682 M +HU_200 46 23.89 M 2.1046874718637 0.496891033197679 M +HU_201 34 20.24 M 1.23447231490137 -0.274965736229789 M +HU_202 42 28.06 M 1.75245715769325 2.55184357924034 M +HU_203 25 19.95 F -1.2678577769433 2.23710583625043 F +HU_204 31 29.06 M 2.92159137203804 -3.42721722053952 M +HU_205 33 28.37 M 3.02003919689608 0.185278133133454 M +HU_206 45 22.15 F -0.238014487254299 -1.02240454218737 M +HU_207 33 19.47 F -4.86076571554572 -3.25318131416302 F +HU_208 27 18.61 F -1.09520423821411 -5.73060865883602 F +HU_209 17.5 21.48 F -0.496198164163254 -2.23289512714009 F diff --git a/examples/multivariate/variableMetadata.tsv b/examples/multivariate/variableMetadata.tsv new file mode 100644 index 0000000..a7793ae --- /dev/null +++ b/examples/multivariate/variableMetadata.tsv @@ -0,0 +1,110 @@ +variableMetadata msiLevel hmdb chemicalClass +(2-methoxyethoxy)propanoic acid isomer 2 Organi +(gamma)Glu-Leu/Ile 2 AA-pep +1-Methyluric acid 1 HMDB03099 AroHeP:Xenobi +1-Methylxanthine 1 HMDB10738 AroHeP +1,3-Dimethyluric acid 1 HMDB01857 AroHeP +1,7-Dimethyluric acid 1 HMDB11103 AroHeP +2-acetamido-4-methylphenyl acetate 2 AroHoM +2-Aminoadipic acid 1 HMDB00510 AA-pep +2-Hydroxybenzyl alcohol 1 HMDB59709 AroHoM +2-Isopropylmalic acid 1 HMDB00402 Organi +2-Methylhippuric acid 1 HMDB11723 AA-pep:AcyGly +2,2-Dimethylglutaric acid 1 Lipids +3-Hydroxybenzyl alcohol 1 HMDB59712 AroHoM +3-Hydroxyphenylacetic acid 1 HMDB00440 AroHoM +3-Indole carboxylic acid glucuronide 2 HMDB13189 Carboh +3-Methyl-2-oxovaleric acid 1 HMDB00491 Lipids +3-Methylcrotonylglycine 1 HMDB00459 AA-pep:AcyGly +3,3-Dimethylglutaric acid 1 HMDB02441 Lipids +3,4-Dihydroxybenzeneacetic acid 1 HMDB01336 AroHoM +3,5-dihydroxybenzoic acid/3,4-dihydroxybenzoic acid 2 AroHoM +3,7-Dimethyluric acid 1 HMDB01982 AroHeP +4-Acetamidobutanoic acid isomer 2 2 Lipids +4-Acetamidobutanoic acid isomer 3 2 Lipids +4-Hydroxybenzoic acid 1 HMDB00500 AroHoM +4-Methylhippuric acid/3-Methylhippuric acid 1 AA-pep:AcyGly +5-Hydroxyindoleacetic acid 1 HMDB00763 AroHeP +5-Sulfosalicylic acid 1 HMDB11725 AroHoM +6-(2-hydroxyethoxy)-6-oxohexanoic acid 2 Organi +6-(carboxymethoxy)-hexanoic acid 2 Organi +9-Methylxanthine 2 HMDB59716 AroHeP +Acetaminophen glucuronide 1 HMDB10316 Carboh +Acetylphenylalanine 1 HMDB00512 AA-pep +alpha-N-Phenylacetyl-glutamine 1 HMDB06344 AA-pep +Aminosalicyluric acid 2 AA-pep:AcyGly +Asp-Leu/Ile isomer 1 2 AA-pep +Asp-Leu/Ile isomer 2 2 AA-pep +Aspartic acid 1 HMDB00191 AA-pep +Azelaic acid 1 HMDB00784 Organi +Benzoic acid isomer 2 AroHoM +Chenodeoxycholic acid isomer 2 Lipids:Steroi +Cinnamoylglycine 1 HMDB11621 AA-pep:AcyGly +Citric acid 1 HMDB00094 Organi +Dehydroepiandrosterone 3-glucuronide 1 HMDB10348 Lipids:Steroi +Dehydroepiandrosterone sulfate 1 HMDB01032 Lipids:Steroi +Deoxyhexose 1 HMDB00849 Carboh +Dimethylguanosine 2 HMDB04824 Nucleo +FMNH2 2 HMDB01142 AroHeP +Fumaric acid 1 HMDB00134 Lipids +Gentisic acid 1 HMDB00152 AroHoM +Glu-Val 2 HMDB59717 AA-pep +Gluconic acid and/or isomers 2 Carboh +Glucuronic acid and/or isomers 2 Carboh +Glyceric acid 1 HMDB00139 Carboh +Glycocholic acid isomer 2 2 Lipids:Steroi +Glycocholic acid isomer 3 2 Lipids:Steroi +Heptylmalonic acid 2 HMDB59719 Lipids +Hexanoylglycine 1 HMDB00701 AA-pep:AcyGly +Hippuric acid 1 HMDB00714 AA-pep:AcyGly +Hydroxybenzyl alcohol isomer 2 AroHeM +Hydroxyphenyllactic acid 1 HMDB00755 AroHoM +Hydroxysuberic acid isomer 1 2 Organi +Hydroxysuberic acid isomer 2 2 Organi +Isovalerylalanine isomer 2 AA-pep +Ketoleucine 1 HMDB00695 Lipids +Kynurenic acid 1 HMDB00715 AA-pep +Malic acid 1 HMDB00156 Organi +Methoxysalicylic acid isomer 2 AroHoM +Methyl (hydroxymethyl)pyrrolidine-carboxylate/Methyl (hydroxy)piperidine-carboxylate 2 AA-pep +Methylinosine 2 Nucleo +Mevalonic acid isomer 1 2 Organi +Monoethyl phthalate 2 HMDB02120 AroHoM:Xenobi +N-Acetyl-aspartic acid 1 HMDB00812 AA-pep +N-Acetylisoleucine 1 AA-pep +N-Acetylleucine 1 HMDB11756 AA-pep +N-Acetyltryptophan 1 HMDB13713 AA-pep +N-Acetyltryptophan isomer 3 2 AA-pep +N2-Acetylaminoadipic acid 2 AA-pep +N4-Acetylcytidine 1 HMDB05923 Nucleo +Nicotinuric acid isomer 2 AA-pep +Ortho-Hydroxyphenylacetic acid 1 HMDB00669 AroHoM +Oxoglutaric acid 2 HMDB00208 Organi +p-Anisic acid 1 HMDB01101 AroHoM +p-Hydroxyhippuric acid 2 HMDB13678 AA-pep:AcyGly +p-Hydroxymandelic acid 1 HMDB00822 AroHoM +p-Hydroxyphenylacetic acid 1 HMDB00020 AroHoM +Pantothenic acid 1 HMDB00210 AliAcy +Pentose 2 Carboh +Phe-Tyr-Asp (and isomers) 2 AA-pep +Porphobilinogen 1 HMDB00245 Organi +Pyridoxic acid isomer 1 2 AroHeM +Pyridylacetylglycine 2 HMDB59723 AA-pep:AcyGly:Xenobi +Pyrocatechol sulfate 2 HMDB59724 AroHoM +Pyroglutamic acid 1 HMDB00267 AliHeM +Pyrroledicarboxylic acid 2 AroHeM +Pyruvic acid 1 HMDB00243 Organi +Quinic acid 1 HMDB03072 AliHoM +Salicylic acid 1 HMDB01895 AroHoM:Xenobi +Sebacic acid 1 HMDB00792 Organi +Suberic acid 1 HMDB00893 Organi +Sulfosalicylic acid isomer 2 AroHoM +Taurine 1 HMDB00251 Organi +Testosterone glucuronide 2 HMDB03193 Lipids:Steroi +Tetrahydrohippuric acid 2 AA-pep:AcyGly +Threo-3-Phenylserine 1 HMDB02184 AA-pep +Threonic acid/Erythronic acid 2 Carboh +Tryptophan 1 HMDB00929 AA-pep +Valerylglycine isomer 1 2 AA-pep:AcyGly +Valerylglycine isomer 2 2 AA-pep:AcyGly +Xanthosine 1 HMDB00299 Nucleo diff --git a/examples/multivariate/variableMetadata_out b/examples/multivariate/variableMetadata_out new file mode 100644 index 0000000..862d7c3 --- /dev/null +++ b/examples/multivariate/variableMetadata_out @@ -0,0 +1,110 @@ +variableMetadata msiLevel hmdb chemicalClass gender_OPLSDA_XLOAD-h1 gender_OPLSDA_XLOAD-o1 gender_OPLSDA_VIP_pred gender_OPLSDA_VIP_ortho gender_OPLSDA_COEFF +(2-methoxyethoxy)propanoic acid isomer 2 Organi -0.0629231482333729 -0.0106578681921491 0.644176403894964 0.199659454473129 -0.0179477929812287 +(gamma)Glu-Leu/Ile 2 AA-pep 0.119757449196811 -0.114197591390804 1.22601816865736 1.11501833480893 0.052902303671276 +1-Methyluric acid 1 HMDB03099 AroHeP:Xenobi 0.0580401884855163 -0.18668459107107 0.59418705118375 1.29909060235335 0.00706012193066922 +1-Methylxanthine 1 HMDB10738 AroHeP 0.0457802870110654 -0.163743392689823 0.468676178545472 1.25124771548414 0.00287986210020381 +1,3-Dimethyluric acid 1 HMDB01857 AroHeP 0.0619417839511327 -0.145268965047105 0.634129676545915 0.977670149488149 0.00673585118665721 +1,7-Dimethyluric acid 1 HMDB11103 AroHeP 0.00321602177090704 -0.143756133059411 0.0329240573206418 1.09838110115389 -0.0182116492538695 +2-acetamido-4-methylphenyl acetate 2 AroHoM -0.117545942512656 -0.085316977297524 1.20337784529489 0.628258400512213 -0.0348057705638337 +2-Aminoadipic acid 1 HMDB00510 AA-pep -0.0897211337725939 -0.147460535871994 0.918521067837397 1.10427240455208 -0.0343231205539951 +2-Hydroxybenzyl alcohol 1 HMDB59709 AroHoM -0.0265310276810774 -0.0990951036013229 0.271611680010787 0.69703068597789 -0.0128684486468477 +2-Isopropylmalic acid 1 HMDB00402 Organi 0.0929305372671568 -0.120005540777645 0.95137737048309 0.796847440948451 0.0325647310393633 +2-Methylhippuric acid 1 HMDB11723 AA-pep:AcyGly -0.166200152983592 -0.0719454878732734 1.70147584603817 0.488403501916531 -0.0504315810274886 +2,2-Dimethylglutaric acid 1 Lipids 0.0220173358253972 -0.0885073869607203 0.225402711300287 0.910620880252181 0.0131510606425336 +3-Hydroxybenzyl alcohol 1 HMDB59712 AroHoM -0.0727309359617904 -0.0578237774387485 0.744583735798078 0.750764959691574 -0.0248558027475987 +3-Hydroxyphenylacetic acid 1 HMDB00440 AroHoM -0.0671868690768632 -0.0627301515093895 0.687826291691183 0.478807004603776 -0.0214185502116562 +3-Indole carboxylic acid glucuronide 2 HMDB13189 Carboh 0.0526403993957739 -0.0433270602435651 0.538906652550156 0.398419383333496 0.0211072621909597 +3-Methyl-2-oxovaleric acid 1 HMDB00491 Lipids 0.0546014582147987 -0.0584863441443364 0.558983013211269 1.15616076142631 0.0310919514182214 +3-Methylcrotonylglycine 1 HMDB00459 AA-pep:AcyGly -0.126816864744417 -0.116763669721785 1.29828901092658 0.952430294659145 -0.0364128253699755 +3,3-Dimethylglutaric acid 1 HMDB02441 Lipids -0.0379640854323549 -0.108710283604268 0.388657731178252 1.04761005708284 -0.0112517741937685 +3,4-Dihydroxybenzeneacetic acid 1 HMDB01336 AroHoM -0.0994678576724457 -0.063817938417832 1.01830325814163 0.772577762546872 -0.0311329307437024 +3,5-dihydroxybenzoic acid/3,4-dihydroxybenzoic acid 2 AroHoM -0.110942854855835 -0.0934123110715136 1.13577866469448 0.653600600492383 -0.0437302828967115 +3,7-Dimethyluric acid 1 HMDB01982 AroHeP 0.0450312739542251 -0.142442499931642 0.461008149354747 1.12143499165439 0.0159013738582697 +4-Acetamidobutanoic acid isomer 2 2 Lipids -0.0168483083703037 -0.155485854278854 0.172484737372682 1.7525698929438 -0.00330727703842402 +4-Acetamidobutanoic acid isomer 3 2 Lipids -0.184021226805839 -0.0907978230779515 1.88391928014265 0.924824980226579 -0.0588702046728787 +4-Hydroxybenzoic acid 1 HMDB00500 AroHoM -0.0569685114233274 -0.0512306887082397 0.583215745782799 0.472611223022251 -0.0168742606735916 +4-Methylhippuric acid/3-Methylhippuric acid 1 AA-pep:AcyGly 0.0152653328528409 -0.0300990564467396 0.156279008560274 0.360485311500883 0.00964929186267553 +5-Hydroxyindoleacetic acid 1 HMDB00763 AroHeP -0.0876373012561967 -0.0807117120073239 0.897187810134627 1.20188926892232 -0.0278895210372743 +5-Sulfosalicylic acid 1 HMDB11725 AroHoM -0.00792056733516729 -0.0696570443336542 0.0810868929166179 0.493485950353912 -0.00640765925827987 +6-(2-hydroxyethoxy)-6-oxohexanoic acid 2 Organi -0.0104490598114745 -0.153032269137012 0.106972361720913 1.06534077864588 -0.00324535539878882 +6-(carboxymethoxy)-hexanoic acid 2 Organi 0.119688724190158 -0.0559414186201415 1.22531459566576 1.29274680600267 0.0437756539745847 +9-Methylxanthine 2 HMDB59716 AroHeP 0.0100848515264305 -0.169220440531131 0.1032437755024 1.11627466028614 -0.00330231698776486 +Acetaminophen glucuronide 1 HMDB10316 Carboh -0.144168724494679 0.0318613064271238 1.47592886094422 0.232244427417829 -0.0481015232700137 +Acetylphenylalanine 1 HMDB00512 AA-pep -0.194218188933215 -0.0666199134009379 1.98831078912284 0.438227632202136 -0.0692918392044546 +alpha-N-Phenylacetyl-glutamine 1 HMDB06344 AA-pep -0.192020018021106 -0.142575934235487 1.9658069908695 1.00521557851703 -0.0625742943254429 +Aminosalicyluric acid 2 AA-pep:AcyGly -0.0251109919662731 -0.138839896001846 0.257074049173049 1.02123780942415 -0.0187295699946089 +Asp-Leu/Ile isomer 1 2 AA-pep 0.130474917086294 -0.0611801744862112 1.33573836095132 0.827840861792004 0.0451379977078123 +Asp-Leu/Ile isomer 2 2 AA-pep 0.0926234532524922 -0.0728816762453344 0.948233594594341 0.782973627888894 0.0346070512216744 +Aspartic acid 1 HMDB00191 AA-pep -0.083571987342248 -0.0999327986169215 0.855569115404368 0.674222379497357 -0.0153718143676333 +Azelaic acid 1 HMDB00784 Organi -0.064341302766364 -0.164552607175279 0.658694776113743 1.10310338316206 -0.0228691249591028 +Benzoic acid isomer 2 AroHoM -0.0163654147308624 -0.132696854408139 0.167541108567503 0.916875438954182 -0.0067778965326895 +Chenodeoxycholic acid isomer 2 Lipids:Steroi 0.0435032593596702 -0.0183586013146566 0.445365083579196 0.173185485497993 0.0162806949296843 +Cinnamoylglycine 1 HMDB11621 AA-pep:AcyGly -0.0780187830563322 -0.0685443373085233 0.798718127056997 0.539360023590325 -0.0218656315093793 +Citric acid 1 HMDB00094 Organi -0.177201682028484 -0.16416481719859 1.81410411745269 1.08701541994548 -0.0623887092791427 +Dehydroepiandrosterone 3-glucuronide 1 HMDB10348 Lipids:Steroi 0.101248771777523 -0.0993006498984019 1.03653538536449 1.34702455488379 0.0362900392995272 +Dehydroepiandrosterone sulfate 1 HMDB01032 Lipids:Steroi 0.110124702353369 -0.0478317831742589 1.12740281968872 0.626599124124917 0.0431153379016612 +Deoxyhexose 1 HMDB00849 Carboh -0.00278895878878273 -0.151476869342967 0.0285519954676465 1.00126213186046 -0.0103190901904822 +Dimethylguanosine 2 HMDB04824 Nucleo -0.00671419756903697 -0.150138394768253 0.0687366695166184 1.35378433578044 0.00567599398135352 +FMNH2 2 HMDB01142 AroHeP 0.0661211010113434 -0.0377695279952386 0.676915479706914 1.24762434000977 0.0267677223858153 +Fumaric acid 1 HMDB00134 Lipids -0.0812069277171281 -0.133120228395083 0.831356792164335 1.13695392328096 -0.0455049925501546 +Gentisic acid 1 HMDB00152 AroHoM -0.0379721323445418 -0.0434473231691346 0.388740111527941 0.381640451808289 -0.00807450712744702 +Glu-Val 2 HMDB59717 AA-pep 0.0926397907489698 -0.0959239242064072 0.948400849889491 1.14818944426074 0.0425575782649377 +Gluconic acid and/or isomers 2 Carboh -0.150557610736939 -0.175769746860379 1.54133515226914 1.160111550752 -0.0589064746969207 +Glucuronic acid and/or isomers 2 Carboh -0.129265065715949 -0.182144098231692 1.32335249459089 1.38191396340929 -0.0528758333809788 +Glyceric acid 1 HMDB00139 Carboh -0.132314216410903 -0.0799583467702576 1.35456820748441 0.663916092761863 -0.0541128361230358 +Glycocholic acid isomer 2 2 Lipids:Steroi -0.00103524258646424 -0.042501227572099 0.0105983070655349 0.983106753785751 0.00778177293727898 +Glycocholic acid isomer 3 2 Lipids:Steroi -0.0337465002549098 -0.0360711936269894 0.345480157757246 0.638805913744572 -0.00954332164542622 +Heptylmalonic acid 2 HMDB59719 Lipids -0.0534556456563322 -0.148038184263367 0.547252744873247 1.08671393238417 -0.0235502476865258 +Hexanoylglycine 1 HMDB00701 AA-pep:AcyGly -0.069065353398607 -0.0969117927431154 0.707057295052076 1.09003981712174 -0.0257216689067251 +Hippuric acid 1 HMDB00714 AA-pep:AcyGly -0.103768347760368 -0.178922596041449 1.06232957147149 1.48116549511923 -0.0386684868738123 +Hydroxybenzyl alcohol isomer 2 AroHeM -0.116154230094499 -0.113264979601255 1.18913017450989 0.749299286984473 -0.040664887789903 +Hydroxyphenyllactic acid 1 HMDB00755 AroHoM -0.0277989388415157 -0.144536404579182 0.284591934094073 1.01043523727569 -0.0121834800853389 +Hydroxysuberic acid isomer 1 2 Organi 0.0336831631933201 -0.0709070344730043 0.344831743910933 0.676272383342317 0.0107924282141943 +Hydroxysuberic acid isomer 2 2 Organi 0.0237968641148827 -0.0857035992702099 0.243620651221198 0.828661515512191 0.00696061266474597 +Isovalerylalanine isomer 2 AA-pep -0.0643678011799719 -0.107235939786368 0.658966053906831 0.966340419720918 -0.0198805837046875 +Ketoleucine 1 HMDB00695 Lipids 0.0268257795267178 -0.0520034886990856 0.274629205187083 1.34317188625478 0.0249497006592116 +Kynurenic acid 1 HMDB00715 AA-pep 0.0316881355610339 -0.142015994415772 0.324407627160278 1.40538633373515 0.0112487845157698 +Malic acid 1 HMDB00156 Organi -0.24217689598014 -0.0612973499236012 2.47928856611454 0.700050338607768 -0.0867545485685649 +Methoxysalicylic acid isomer 2 AroHoM 0.00877566366424832 -0.104831642682627 0.0898409507429721 0.72940877204432 4.16059610636481e-05 +Methyl (hydroxymethyl)pyrrolidine-carboxylate/Methyl (hydroxy)piperidine-carboxylate 2 AA-pep 0.110929577119035 -0.0927011232974581 1.13564273372179 0.999558392708976 0.0409253639463481 +Methylinosine 2 Nucleo 0.0400625442184748 -0.103861094227721 0.410140725473944 1.50345601548568 0.0166720486446603 +Mevalonic acid isomer 1 2 Organi -0.0178672929893043 -0.0350871314799568 0.182916603322199 0.892419403989909 -0.0035662417066509 +Monoethyl phthalate 2 HMDB02120 AroHoM:Xenobi -0.119246036354195 -0.0437487362245172 1.22078257420426 0.336894662640625 -0.0483771156300739 +N-Acetyl-aspartic acid 1 HMDB00812 AA-pep -0.166071482656643 -0.151622051891626 1.70015858218807 1.02226577362575 -0.0588422752163416 +N-Acetylisoleucine 1 AA-pep 0.00883509005820815 -0.12001518300752 0.0904493290875442 1.19396466653225 0.00566561488280379 +N-Acetylleucine 1 HMDB11756 AA-pep -0.00632875977154954 -0.00121026532725527 0.0647907459371151 0.0159130186538505 -0.00464967875333961 +N-Acetyltryptophan 1 HMDB13713 AA-pep -0.0630497183908986 -0.0771315862302059 0.645472167238097 0.659434587984169 -0.0197465642877814 +N-Acetyltryptophan isomer 3 2 AA-pep -0.0845361382476443 -0.0371011182339037 0.865439620623636 0.256234087115519 -0.0139648592516904 +N2-Acetylaminoadipic acid 2 AA-pep -0.00965744990697951 -0.081207933805558 0.0988682468461471 1.54699719342116 -0.0164548056078999 +N4-Acetylcytidine 1 HMDB05923 Nucleo 0.0624124122330541 -0.0637988721905562 0.638947738622132 1.28331545578467 0.0352119219770329 +Nicotinuric acid isomer 2 AA-pep -0.0903308528734704 -0.149199418397508 0.924763073662217 1.0149843811703 -0.0424626406881353 +Ortho-Hydroxyphenylacetic acid 1 HMDB00669 AroHoM -0.0748384342632805 -0.134908852533061 0.766159272229178 0.900674716021854 -0.0257568162925087 +Oxoglutaric acid 2 HMDB00208 Organi -0.1666401029451 -0.0263616564477747 1.70597983848061 1.2639686436575 -0.0606996610516088 +p-Anisic acid 1 HMDB01101 AroHoM -0.247444917996862 -0.0434920219651048 2.53321999792696 0.287274505075279 -0.08931517050814 +p-Hydroxyhippuric acid 2 HMDB13678 AA-pep:AcyGly -0.162981488746578 -0.153237184496861 1.66852473644245 1.01384688380847 -0.0666643558856858 +p-Hydroxymandelic acid 1 HMDB00822 AroHoM 0.0509409350154879 -0.161917903348557 0.521508367757095 1.17821390616966 0.0267307017188526 +p-Hydroxyphenylacetic acid 1 HMDB00020 AroHoM -0.0405570845814076 -0.117811781756049 0.415203587735595 0.832908851135483 -0.0186269702720734 +Pantothenic acid 1 HMDB00210 AliAcy -0.211506110251781 -0.10044953458525 2.16529606876126 0.817832248225162 -0.0796479912164316 +Pentose 2 Carboh -0.104341721306731 -0.168395765092076 1.06819948929274 1.5229310586726 -0.0471796556401668 +Phe-Tyr-Asp (and isomers) 2 AA-pep -0.143925171228004 -0.172897855433651 1.47343548176837 1.30333054575822 -0.0484195148518902 +Porphobilinogen 1 HMDB00245 Organi 0.0414770840131332 -0.169957628608973 0.424622091770332 1.22482228520033 0.00625763204525801 +Pyridoxic acid isomer 1 2 AroHeM -0.0675056289277174 -0.0845873697790599 0.691089599077962 1.10877762911864 -0.0178529337196506 +Pyridylacetylglycine 2 HMDB59723 AA-pep:AcyGly:Xenobi -0.0233633465446015 -0.109121479023196 0.239182510452822 1.28411667397314 0.00175043877511296 +Pyrocatechol sulfate 2 HMDB59724 AroHoM -0.0969455502461404 -0.203668066068413 0.992481108852962 1.57004218826219 -0.0417587896946231 +Pyroglutamic acid 1 HMDB00267 AliHeM -0.0514465054285054 -0.175117727600434 0.52668415027461 1.24029105854752 -0.0204544463097541 +Pyrroledicarboxylic acid 2 AroHeM -0.0330591970449878 -0.129285133650744 0.338443883785211 1.0162165069596 -0.0112902990228137 +Pyruvic acid 1 HMDB00243 Organi -0.14203905845856 -0.0751936974802729 1.45412638209245 1.08497558434152 -0.0441043938248178 +Quinic acid 1 HMDB03072 AliHoM 0.0138529775615802 -0.124344532871573 0.141820006140815 1.12146067598945 -0.00845906463120633 +Salicylic acid 1 HMDB01895 AroHoM:Xenobi -0.0546257314555333 -0.0362421801037827 0.559231510773237 0.818955231668964 -0.0230844577466112 +Sebacic acid 1 HMDB00792 Organi 0.00478050490137978 -0.15321516216344 0.0489404701232001 1.13899791691835 0.00113944085897672 +Suberic acid 1 HMDB00893 Organi -0.0196318693224189 -0.146338194150704 0.200981472429638 0.996379795906669 -0.007224284519048 +Sulfosalicylic acid isomer 2 AroHoM -0.0836189654729464 -0.0794314184628052 0.85605005452049 0.749654649755071 -0.0204138472856556 +Taurine 1 HMDB00251 Organi 0.0824187353266325 -0.0398145211124536 0.843762685544111 0.311470632615305 0.0364968361158125 +Testosterone glucuronide 2 HMDB03193 Lipids:Steroi 0.236540994687854 -0.04248122040133 2.42159096627883 1.17304880421209 0.098506592594453 +Tetrahydrohippuric acid 2 AA-pep:AcyGly -0.0632817887289301 -0.118780596428636 0.64784798980898 0.984828666672331 -0.0240429749541618 +Threo-3-Phenylserine 1 HMDB02184 AA-pep -0.0597489265991061 -0.13577630772878 0.611680275920823 0.93566741678381 -0.0263854323430091 +Threonic acid/Erythronic acid 2 Carboh -0.119238298799105 -0.185807133812037 1.22070336090116 1.27608947040735 -0.0395101148225436 +Tryptophan 1 HMDB00929 AA-pep 0.0225021022691837 -0.0684280362181393 0.230365512960006 0.469918951785939 0.0128229908770535 +Valerylglycine isomer 1 2 AA-pep:AcyGly -0.130272928470127 -0.104173137359217 1.33367050033018 0.806325009996822 -0.0364740883768796 +Valerylglycine isomer 2 2 AA-pep:AcyGly -0.159375429923644 -0.165146363738146 1.63160767062471 1.08828416431267 -0.0506824047376072 +Xanthosine 1 HMDB00299 Nucleo 0.0616689259430038 -0.121944642477108 0.631336289765608 1.40242616715505 0.0328701450858134 diff --git a/examples/multivariate/workflow-test.yml b/examples/multivariate/workflow-test.yml new file mode 100644 index 0000000..208f0b8 --- /dev/null +++ b/examples/multivariate/workflow-test.yml @@ -0,0 +1,29 @@ +########################################################################################## +# Global settings +########################################################################################## +# galaxy_url: "http://192.168.64.8:30700" # default is GALAXY_URL +# galaxy_api_key: "4b86f51252b5f220012b3e259d0877f9" # default is GALAXY_API_KEY +#enable_logger: True +#enable_debug: True +#output_folder: "results" +#disable_cleanup: True + +########################################################################################## +# Workflow tests +########################################################################################## +workflows: + multivariate: + file: "workflow.ga" + params: + 3: + "orthoI": "NA" + "predI": "1" + "respC": "gender" + "testL": "FALSE" + inputs: + "DataMatrix": "dataMatrix.tsv" + "SampleMetadata": "sampleMetadata.tsv" + "VariableMetadata": "variableMetadata.tsv" + expected: + sampleMetadata_out: "sampleMetadata_out" + variableMetadata_out: "variableMetadata_out" diff --git a/examples/multivariate/workflow.ga b/examples/multivariate/workflow.ga new file mode 100644 index 0000000..57ec8d8 --- /dev/null +++ b/examples/multivariate/workflow.ga @@ -0,0 +1,206 @@ +{ + "a_galaxy_workflow": "true", + "annotation": "", + "format-version": "0.1", + "name": "Multivariate", + "steps": { + "0": { + "annotation": "", + "content_id": null, + "id": 0, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "DataMatrix" + } + ], + "label": null, + "name": "Input dataset", + "outputs": [], + "position": { + "left": 180, + "top": 180.5 + }, + "tool_errors": null, + "tool_id": null, + "tool_state": "{\"name\": \"DataMatrix\"}", + "tool_version": null, + "type": "data_input", + "uuid": "b71c284a-506c-4bfb-8651-9ea2c0dada7d", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "80d3fef5-6194-45f5-905b-e4b1da288ee1" + } + ] + }, + "1": { + "annotation": "", + "content_id": null, + "id": 1, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "SampleMetadata" + } + ], + "label": null, + "name": "Input dataset", + "outputs": [], + "position": { + "left": 178, + "top": 281.5 + }, + "tool_errors": null, + "tool_id": null, + "tool_state": "{\"name\": \"SampleMetadata\"}", + "tool_version": null, + "type": "data_input", + "uuid": "226998dc-8449-47c9-91ea-a64aa86486ff", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "022a49b0-23ae-4394-b652-8639c2282835" + } + ] + }, + "2": { + "annotation": "", + "content_id": null, + "id": 2, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "VariableMetadata" + } + ], + "label": null, + "name": "Input dataset", + "outputs": [], + "position": { + "left": 173, + "top": 387.5 + }, + "tool_errors": null, + "tool_id": null, + "tool_state": "{\"name\": \"VariableMetadata\"}", + "tool_version": null, + "type": "data_input", + "uuid": "ef8729a9-922d-4329-a9ae-9566c65550be", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "e63f4162-4fa5-423d-aa55-2752ebe62c67" + } + ] + }, + "3": { + "annotation": "", + "content_id": "Multivariate", + "id": 3, + "input_connections": { + "dataMatrix_in": { + "id": 0, + "output_name": "output" + }, + "sampleMetadata_in": { + "id": 1, + "output_name": "output" + }, + "variableMetadata_in": { + "id": 2, + "output_name": "output" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool Multivariate", + "name": "sampleMetadata_in" + }, + { + "description": "runtime parameter for tool Multivariate", + "name": "variableMetadata_in" + }, + { + "description": "runtime parameter for tool Multivariate", + "name": "dataMatrix_in" + } + ], + "label": null, + "name": "Multivariate", + "outputs": [ + { + "name": "sampleMetadata_out", + "type": "tabular" + }, + { + "name": "variableMetadata_out", + "type": "tabular" + }, + { + "name": "figure", + "type": "pdf" + }, + { + "name": "information", + "type": "txt" + } + ], + "position": { + "left": 577, + "top": 197.5 + }, + "post_job_actions": { + "HideDatasetActionfigure": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "figure" + }, + "HideDatasetActioninformation": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "information" + }, + "RenameDatasetActionsampleMetadata_out": { + "action_arguments": { + "newname": "sampleMetadata_out" + }, + "action_type": "RenameDatasetAction", + "output_name": "sampleMetadata_out" + }, + "RenameDatasetActionvariableMetadata_out": { + "action_arguments": { + "newname": "variableMetadata_out" + }, + "action_type": "RenameDatasetAction", + "output_name": "variableMetadata_out" + } + }, + "tool_errors": null, + "tool_id": "Multivariate", + "tool_state": "{\"advGph\": \"{\\\"__current_case__\\\": 0, \\\"opgC\\\": \\\"default\\\"}\", \"__page__\": 0, \"sampleMetadata_in\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"__rerun_remap_job_id__\": null, \"predI\": \"\\\"1\\\"\", \"respC\": \"\\\"gender\\\"\", \"orthoI\": \"\\\"NA\\\"\", \"advCpt\": \"{\\\"opcC\\\": \\\"default\\\", \\\"__current_case__\\\": 0}\", \"variableMetadata_in\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"dataMatrix_in\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"testL\": \"\\\"FALSE\\\"\"}", + "tool_version": "2.3.2", + "type": "tool", + "uuid": "d36ba3ad-52ac-4753-a9a1-4bc1fd207eb3", + "workflow_outputs": [ + { + "label": "variableMetadata_out", + "output_name": "variableMetadata_out", + "uuid": "9f9d5f24-7d65-4523-b4c2-09f3bfc970c5" + }, + { + "label": "sampleMetadata_out", + "output_name": "sampleMetadata_out", + "uuid": "bed6c5f3-1cf3-4455-9235-35bfa4d067b4" + } + ] + } + }, + "uuid": "ea0fdf6f-9686-4d32-8f9e-bec7ee488eda" +} \ No newline at end of file diff --git a/examples/sacurine/expected/Biosigner_variableMetadata.tsv b/examples/sacurine/expected/Biosigner_variableMetadata.tsv new file mode 100644 index 0000000..764402a --- /dev/null +++ b/examples/sacurine/expected/Biosigner_variableMetadata.tsv @@ -0,0 +1,110 @@ +variableMetadata msiLevel hmdb chemicalClass gender_ttest_M.F_dif gender_ttest_M.F_fdr gender_ttest_M.F_sig gender_OPLSDA_XLOAD-h1 gender_OPLSDA_XLOAD-o1 gender_OPLSDA_VIP_pred gender_OPLSDA_VIP_ortho gender_OPLSDA_COEFF gender_tier_S +(2-methoxyethoxy)propanoic acid isomer 2 Organi -0.155000269394578 0.323764778788649 0 -0.0629231482333729 -0.0106578681921491 0.644176403894964 0.199659454473129 -0.0179477929812287 +(gamma)Glu-Leu/Ile 2 AA-pep 0.133545985543373 0.00175885260227822 1 0.119757449196811 -0.114197591390804 1.22601816865736 1.11501833480893 0.052902303671276 +1-Methyluric acid 1 HMDB03099 AroHeP:Xenobi 0.026049678345422 0.727167328693187 0 0.0580401884855163 -0.18668459107107 0.59418705118375 1.29909060235335 0.00706012193066922 +1-Methylxanthine 1 HMDB10738 AroHeP 0.0122904029602404 0.86545714954036 0 0.0457802870110654 -0.163743392689823 0.468676178545472 1.25124771548414 0.00287986210020381 +1,3-Dimethyluric acid 1 HMDB01857 AroHeP 0.0380317125866263 0.728490752219743 0 0.0619417839511327 -0.145268965047105 0.634129676545915 0.977670149488149 0.00673585118665721 +1,7-Dimethyluric acid 1 HMDB11103 AroHeP -0.0816380257692773 0.323764778788649 0 0.00321602177090704 -0.143756133059411 0.0329240573206418 1.09838110115389 -0.0182116492538695 +2-acetamido-4-methylphenyl acetate 2 AroHoM -0.185871896669639 0.0390078637644484 1 -0.117545942512656 -0.085316977297524 1.20337784529489 0.628258400512213 -0.0348057705638337 +2-Aminoadipic acid 1 HMDB00510 AA-pep -0.0619694471480727 0.0390078637644484 1 -0.0897211337725939 -0.147460535871994 0.918521067837397 1.10427240455208 -0.0343231205539951 +2-Hydroxybenzyl alcohol 1 HMDB59709 AroHoM -0.0642157802242167 0.493892938114586 0 -0.0265310276810774 -0.0990951036013229 0.271611680010787 0.69703068597789 -0.0128684486468477 +2-Isopropylmalic acid 1 HMDB00402 Organi 0.177456127433735 0.0548810070399391 0 0.0929305372671568 -0.120005540777645 0.95137737048309 0.796847440948451 0.0325647310393633 +2-Methylhippuric acid 1 HMDB11723 AA-pep:AcyGly -0.19997626443265 0.0029590065830821 1 -0.166200152983592 -0.0719454878732734 1.70147584603817 0.488403501916531 -0.0504315810274886 +2,2-Dimethylglutaric acid 1 Lipids 0.0331951037524094 0.493892938114586 0 0.0220173358253972 -0.0885073869607203 0.225402711300287 0.910620880252181 0.0131510606425336 +3-Hydroxybenzyl alcohol 1 HMDB59712 AroHoM -0.146666681675181 0.16563257821464 0 -0.0727309359617904 -0.0578237774387485 0.744583735798078 0.750764959691574 -0.0248558027475987 +3-Hydroxyphenylacetic acid 1 HMDB00440 AroHoM -0.0787244344097591 0.232246669407913 0 -0.0671868690768632 -0.0627301515093895 0.687826291691183 0.478807004603776 -0.0214185502116562 +3-Indole carboxylic acid glucuronide 2 HMDB13189 Carboh 0.0897953261873488 0.266350691693662 0 0.0526403993957739 -0.0433270602435651 0.538906652550156 0.398419383333496 0.0211072621909597 +3-Methyl-2-oxovaleric acid 1 HMDB00491 Lipids 0.104657798739759 0.0681790770646561 0 0.0546014582147987 -0.0584863441443364 0.558983013211269 1.15616076142631 0.0310919514182214 +3-Methylcrotonylglycine 1 HMDB00459 AA-pep:AcyGly -0.093752160335181 0.0300560255989004 1 -0.126816864744417 -0.116763669721785 1.29828901092658 0.952430294659145 -0.0364128253699755 +3,3-Dimethylglutaric acid 1 HMDB02441 Lipids -0.0264119394712052 0.564959339157832 0 -0.0379640854323549 -0.108710283604268 0.388657731178252 1.04761005708284 -0.0112517741937685 +3,4-Dihydroxybenzeneacetic acid 1 HMDB01336 AroHoM -0.159994211585301 0.0681790770646561 0 -0.0994678576724457 -0.063817938417832 1.01830325814163 0.772577762546872 -0.0311329307437024 +3,5-dihydroxybenzoic acid/3,4-dihydroxybenzoic acid 2 AroHoM -0.168856806629036 0.00847422558090828 1 -0.110942854855835 -0.0934123110715136 1.13577866469448 0.653600600492383 -0.0437302828967115 +3,7-Dimethyluric acid 1 HMDB01982 AroHeP 0.115234758953735 0.397912677311787 0 0.0450312739542251 -0.142442499931642 0.461008149354747 1.12143499165439 0.0159013738582697 +4-Acetamidobutanoic acid isomer 2 2 Lipids -0.00639635431120489 0.851136619032405 0 -0.0168483083703037 -0.155485854278854 0.172484737372682 1.7525698929438 -0.00330727703842402 +4-Acetamidobutanoic acid isomer 3 2 Lipids -0.173798023344699 0.00025215004086728 1 -0.184021226805839 -0.0907978230779515 1.88391928014265 0.924824980226579 -0.0588702046728787 +4-Hydroxybenzoic acid 1 HMDB00500 AroHoM -0.0755555816692777 0.372723845099362 0 -0.0569685114233274 -0.0512306887082397 0.583215745782799 0.472611223022251 -0.0168742606735916 +4-Methylhippuric acid/3-Methylhippuric acid 1 AA-pep:AcyGly 0.052166858115422 0.615183249932764 0 0.0152653328528409 -0.0300990564467396 0.156279008560274 0.360485311500883 0.00964929186267553 +5-Hydroxyindoleacetic acid 1 HMDB00763 AroHeP -0.0650083066834943 0.119666781024437 0 -0.0876373012561967 -0.0807117120073239 0.897187810134627 1.20188926892232 -0.0278895210372743 +5-Sulfosalicylic acid 1 HMDB11725 AroHoM -0.0420496747481929 0.728490752219743 0 -0.00792056733516729 -0.0696570443336542 0.0810868929166179 0.493485950353912 -0.00640765925827987 +6-(2-hydroxyethoxy)-6-oxohexanoic acid 2 Organi -0.00818924782674735 0.851136619032405 0 -0.0104490598114745 -0.153032269137012 0.106972361720913 1.06534077864588 -0.00324535539878882 +6-(carboxymethoxy)-hexanoic acid 2 Organi 0.179643082754096 0.00899236438990862 1 0.119688724190158 -0.0559414186201415 1.22531459566576 1.29274680600267 0.0437756539745847 +9-Methylxanthine 2 HMDB59716 AroHeP -0.0115307413883139 0.851136619032405 0 0.0100848515264305 -0.169220440531131 0.1032437755024 1.11627466028614 -0.00330231698776486 +Acetaminophen glucuronide 1 HMDB10316 Carboh -0.757586956784096 0.00411942788078397 1 -0.144168724494679 0.0318613064271238 1.47592886094422 0.232244427417829 -0.0481015232700137 +Acetylphenylalanine 1 HMDB00512 AA-pep -0.256958555759156 7.01473681436596e-06 1 -0.194218188933215 -0.0666199134009379 1.98831078912284 0.438227632202136 -0.0692918392044546 +alpha-N-Phenylacetyl-glutamine 1 HMDB06344 AA-pep -0.110215238882288 0.000111989218695563 1 -0.192020018021106 -0.142575934235487 1.9658069908695 1.00521557851703 -0.0625742943254429 +Aminosalicyluric acid 2 AA-pep:AcyGly -0.0917527537379517 0.321632126826463 0 -0.0251109919662731 -0.138839896001846 0.257074049173049 1.02123780942415 -0.0187295699946089 +Asp-Leu/Ile isomer 1 2 AA-pep 0.162114407681807 0.00679341330573933 1 0.130474917086294 -0.0611801744862112 1.33573836095132 0.827840861792004 0.0451379977078123 +Asp-Leu/Ile isomer 2 2 AA-pep 0.123121995850844 0.0390078637644484 1 0.0926234532524922 -0.0728816762453344 0.948233594594341 0.782973627888894 0.0346070512216744 +Aspartic acid 1 HMDB00191 AA-pep -0.0295416717565065 0.41230846296291 0 -0.083571987342248 -0.0999327986169215 0.855569115404368 0.674222379497357 -0.0153718143676333 +Azelaic acid 1 HMDB00784 Organi -0.0520165541467463 0.2234578668199 0 -0.064341302766364 -0.164552607175279 0.658694776113743 1.10310338316206 -0.0228691249591028 +Benzoic acid isomer 2 AroHoM -0.0322679127638557 0.728490752219743 0 -0.0163654147308624 -0.132696854408139 0.167541108567503 0.916875438954182 -0.0067778965326895 +Chenodeoxycholic acid isomer 2 Lipids:Steroi 0.132745971456386 0.376543094435485 0 0.0435032593596702 -0.0183586013146566 0.445365083579196 0.173185485497993 0.0162806949296843 +Cinnamoylglycine 1 HMDB11621 AA-pep:AcyGly -0.109754596634337 0.232246669407913 0 -0.0780187830563322 -0.0685443373085233 0.798718127056997 0.539360023590325 -0.0218656315093793 +Citric acid 1 HMDB00094 Organi -0.102817022939518 0.000111989218695563 1 -0.177201682028484 -0.16416481719859 1.81410411745269 1.08701541994548 -0.0623887092791427 +Dehydroepiandrosterone 3-glucuronide 1 HMDB10348 Lipids:Steroi 0.168656222366748 0.0359628801792618 1 0.101248771777523 -0.0993006498984019 1.03653538536449 1.34702455488379 0.0362900392995272 +Dehydroepiandrosterone sulfate 1 HMDB01032 Lipids:Steroi 0.52783958455 0.00863944317079213 1 0.110124702353369 -0.0478317831742589 1.12740281968872 0.626599124124917 0.0431153379016612 +Deoxyhexose 1 HMDB00849 Carboh -0.0410464369986743 0.605514398859828 0 -0.00278895878878273 -0.151476869342967 0.0285519954676465 1.00126213186046 -0.0103190901904822 +Dimethylguanosine 2 HMDB04824 Nucleo 0.00939526703722926 0.755561619359514 0 -0.00671419756903697 -0.150138394768253 0.0687366695166184 1.35378433578044 0.00567599398135352 +FMNH2 2 HMDB01142 AroHeP 0.14862320068024 0.145954616937161 0 0.0661211010113434 -0.0377695279952386 0.676915479706914 1.24762434000977 0.0267677223858153 +Fumaric acid 1 HMDB00134 Lipids -0.192060238400361 0.00712151197473303 1 -0.0812069277171281 -0.133120228395083 0.831356792164335 1.13695392328096 -0.0455049925501546 +Gentisic acid 1 HMDB00152 AroHoM -0.0444349874475911 0.68346774984917 0 -0.0379721323445418 -0.0434473231691346 0.388740111527941 0.381640451808289 -0.00807450712744702 +Glu-Val 2 HMDB59717 AA-pep 0.0909208948490363 0.0101095402055825 1 0.0926397907489698 -0.0959239242064072 0.948400849889491 1.14818944426074 0.0425575782649377 +Gluconic acid and/or isomers 2 Carboh -0.137224428202771 0.00025215004086728 1 -0.150557610736939 -0.175769746860379 1.54133515226914 1.160111550752 -0.0589064746969207 +Glucuronic acid and/or isomers 2 Carboh -0.123892879733855 0.00132416540855552 1 -0.129265065715949 -0.182144098231692 1.32335249459089 1.38191396340929 -0.0528758333809788 +Glyceric acid 1 HMDB00139 Carboh -0.13790885799747 0.00104086903382066 1 -0.132314216410903 -0.0799583467702576 1.35456820748441 0.663916092761863 -0.0541128361230358 +Glycocholic acid isomer 2 2 Lipids:Steroi 0.0572079357465056 0.705371999506042 0 -0.00103524258646424 -0.042501227572099 0.0105983070655349 0.983106753785751 0.00778177293727898 +Glycocholic acid isomer 3 2 Lipids:Steroi -0.0773405690756626 0.620298386109946 0 -0.0337465002549098 -0.0360711936269894 0.345480157757246 0.638805913744572 -0.00954332164542622 +Heptylmalonic acid 2 HMDB59719 Lipids -0.0593328945353013 0.180596643777345 0 -0.0534556456563322 -0.148038184263367 0.547252744873247 1.08671393238417 -0.0235502476865258 +Hexanoylglycine 1 HMDB00701 AA-pep:AcyGly -0.0932936237616868 0.146715865408848 0 -0.069065353398607 -0.0969117927431154 0.707057295052076 1.09003981712174 -0.0257216689067251 +Hippuric acid 1 HMDB00714 AA-pep:AcyGly -0.0931749649768676 0.0229376686045519 1 -0.103768347760368 -0.178922596041449 1.06232957147149 1.48116549511923 -0.0386684868738123 +Hydroxybenzyl alcohol isomer 2 AroHeM -0.141695646881807 0.0131586645370246 1 -0.116154230094499 -0.113264979601255 1.18913017450989 0.749299286984473 -0.040664887789903 +Hydroxyphenyllactic acid 1 HMDB00755 AroHoM -0.0473971061795186 0.533678624764605 0 -0.0277989388415157 -0.144536404579182 0.284591934094073 1.01043523727569 -0.0121834800853389 +Hydroxysuberic acid isomer 1 2 Organi 0.030003776340723 0.587869096751915 0 0.0336831631933201 -0.0709070344730043 0.344831743910933 0.676272383342317 0.0107924282141943 +Hydroxysuberic acid isomer 2 2 Organi 0.0248794358010835 0.722732216359098 0 0.0237968641148827 -0.0857035992702099 0.243620651221198 0.828661515512191 0.00696061266474597 +Isovalerylalanine isomer 2 AA-pep -0.0624740261720484 0.281950696594999 0 -0.0643678011799719 -0.107235939786368 0.658966053906831 0.966340419720918 -0.0198805837046875 +Ketoleucine 1 HMDB00695 Lipids 0.0749368582506023 0.174428012008638 0 0.0268257795267178 -0.0520034886990856 0.274629205187083 1.34317188625478 0.0249497006592116 +Kynurenic acid 1 HMDB00715 AA-pep 0.0214304106015666 0.568923400129814 0 0.0316881355610339 -0.142015994415772 0.324407627160278 1.40538633373515 0.0112487845157698 +Malic acid 1 HMDB00156 Organi -0.229742558759036 7.73571435325274e-09 1 -0.24217689598014 -0.0612973499236012 2.47928856611454 0.700050338607768 -0.0867545485685649 plsda +Methoxysalicylic acid isomer 2 AroHoM 0.000204360076987875 0.997700145180708 0 0.00877566366424832 -0.104831642682627 0.0898409507429721 0.72940877204432 4.16059610636481e-05 +Methyl (hydroxymethyl)pyrrolidine-carboxylate/Methyl (hydroxy)piperidine-carboxylate 2 AA-pep 0.161809911653012 0.0142091308775083 1 0.110929577119035 -0.0927011232974581 1.13564273372179 0.999558392708976 0.0409253639463481 +Methylinosine 2 Nucleo 0.0537904500254216 0.376543094435485 0 0.0400625442184748 -0.103861094227721 0.410140725473944 1.50345601548568 0.0166720486446603 +Mevalonic acid isomer 1 2 Organi -0.0280319198460237 0.851136619032405 0 -0.0178672929893043 -0.0350871314799568 0.182916603322199 0.892419403989909 -0.0035662417066509 +Monoethyl phthalate 2 HMDB02120 AroHoM:Xenobi -0.373668043448674 0.00356064280978631 1 -0.119246036354195 -0.0437487362245172 1.22078257420426 0.336894662640625 -0.0483771156300739 +N-Acetyl-aspartic acid 1 HMDB00812 AA-pep -0.101375128568796 0.000296825262376728 1 -0.166071482656643 -0.151622051891626 1.70015858218807 1.02226577362575 -0.0588422752163416 +N-Acetylisoleucine 1 AA-pep 0.0112460433407229 0.755561619359514 0 0.00883509005820815 -0.12001518300752 0.0904493290875442 1.19396466653225 0.00566561488280379 +N-Acetylleucine 1 HMDB11756 AA-pep -0.0296529066110844 0.813128123044942 0 -0.00632875977154954 -0.00121026532725527 0.0647907459371151 0.0159130186538505 -0.00464967875333961 +N-Acetyltryptophan 1 HMDB13713 AA-pep -0.0644318900663849 0.293698095990347 0 -0.0630497183908986 -0.0771315862302059 0.645472167238097 0.659434587984169 -0.0197465642877814 +N-Acetyltryptophan isomer 3 2 AA-pep -0.0531422853532533 0.458874204962082 0 -0.0845361382476443 -0.0371011182339037 0.865439620623636 0.256234087115519 -0.0139648592516904 +N2-Acetylaminoadipic acid 2 AA-pep -0.0449681021906017 0.38704087969443 0 -0.00965744990697951 -0.081207933805558 0.0988682468461471 1.54699719342116 -0.0164548056078999 +N4-Acetylcytidine 1 HMDB05923 Nucleo 0.200198253936987 0.0477572039288908 1 0.0624124122330541 -0.0637988721905562 0.638947738622132 1.28331545578467 0.0352119219770329 +Nicotinuric acid isomer 2 AA-pep -0.0804786190622888 0.0101095402055825 1 -0.0903308528734704 -0.149199418397508 0.924763073662217 1.0149843811703 -0.0424626406881353 +Ortho-Hydroxyphenylacetic acid 1 HMDB00669 AroHoM -0.0910445016612051 0.157861708287969 0 -0.0748384342632805 -0.134908852533061 0.766159272229178 0.900674716021854 -0.0257568162925087 +Oxoglutaric acid 2 HMDB00208 Organi -0.272243796903374 0.000156166570647348 1 -0.1666401029451 -0.0263616564477747 1.70597983848061 1.2639686436575 -0.0606996610516088 randomforest|svm +p-Anisic acid 1 HMDB01101 AroHoM -1.00732093264819 5.5336810352022e-10 1 -0.247444917996862 -0.0434920219651048 2.53321999792696 0.287274505075279 -0.08931517050814 plsda|svm +p-Hydroxyhippuric acid 2 HMDB13678 AA-pep:AcyGly -0.152664533694819 2.03909504126136e-05 1 -0.162981488746578 -0.153237184496861 1.66852473644245 1.01384688380847 -0.0666643558856858 +p-Hydroxymandelic acid 1 HMDB00822 AroHoM 0.0718999493459034 0.14110362223617 0 0.0509409350154879 -0.161917903348557 0.521508367757095 1.17821390616966 0.0267307017188526 +p-Hydroxyphenylacetic acid 1 HMDB00020 AroHoM -0.0586099811667466 0.313687856620237 0 -0.0405570845814076 -0.117811781756049 0.415203587735595 0.832908851135483 -0.0186269702720734 +Pantothenic acid 1 HMDB00210 AliAcy -0.213367654010361 1.53497476881495e-07 1 -0.211506110251781 -0.10044953458525 2.16529606876126 0.817832248225162 -0.0796479912164316 +Pentose 2 Carboh -0.0985631455153007 0.00644782785225947 1 -0.104341721306731 -0.168395765092076 1.06819948929274 1.5229310586726 -0.0471796556401668 +Phe-Tyr-Asp (and isomers) 2 AA-pep -0.104756723535543 0.0037290768207204 1 -0.143925171228004 -0.172897855433651 1.47343548176837 1.30333054575822 -0.0484195148518902 +Porphobilinogen 1 HMDB00245 Organi 0.0138893409498788 0.736664310621888 0 0.0414770840131332 -0.169957628608973 0.424622091770332 1.22482228520033 0.00625763204525801 +Pyridoxic acid isomer 1 2 AroHeM -0.0527027983043373 0.346666592719352 0 -0.0675056289277174 -0.0845873697790599 0.691089599077962 1.10877762911864 -0.0178529337196506 +Pyridylacetylglycine 2 HMDB59723 AA-pep:AcyGly:Xenobi 0.00331051837638618 0.920694638319013 0 -0.0233633465446015 -0.109121479023196 0.239182510452822 1.28411667397314 0.00175043877511296 +Pyrocatechol sulfate 2 HMDB59724 AroHoM -0.0903571215657832 0.0131586645370246 1 -0.0969455502461404 -0.203668066068413 0.992481108852962 1.57004218826219 -0.0417587896946231 +Pyroglutamic acid 1 HMDB00267 AliHeM -0.0466009188086751 0.292065277904693 0 -0.0514465054285054 -0.175117727600434 0.52668415027461 1.24029105854752 -0.0204544463097541 +Pyrroledicarboxylic acid 2 AroHeM -0.067312693438434 0.572964151753452 0 -0.0330591970449878 -0.129285133650744 0.338443883785211 1.0162165069596 -0.0112902990228137 +Pyruvic acid 1 HMDB00243 Organi -0.10101159113012 0.00789906415430823 1 -0.14203905845856 -0.0751936974802729 1.45412638209245 1.08497558434152 -0.0441043938248178 +Quinic acid 1 HMDB03072 AliHoM -0.0632898631250605 0.678953333211909 0 0.0138529775615802 -0.124344532871573 0.141820006140815 1.12146067598945 -0.00845906463120633 +Salicylic acid 1 HMDB01895 AroHoM:Xenobi -0.156227365217108 0.18641747826249 0 -0.0546257314555333 -0.0362421801037827 0.559231510773237 0.818955231668964 -0.0230844577466112 +Sebacic acid 1 HMDB00792 Organi 0.00295366794855489 0.945812280705322 0 0.00478050490137978 -0.15321516216344 0.0489404701232001 1.13899791691835 0.00113944085897672 +Suberic acid 1 HMDB00893 Organi -0.0180310815753009 0.722732216359098 0 -0.0196318693224189 -0.146338194150704 0.200981472429638 0.996379795906669 -0.007224284519048 +Sulfosalicylic acid isomer 2 AroHoM -0.0690984041927711 0.280585988106105 0 -0.0836189654729464 -0.0794314184628052 0.85605005452049 0.749654649755071 -0.0204138472856556 +Taurine 1 HMDB00251 Organi 0.254491855108554 0.0390078637644484 1 0.0824187353266325 -0.0398145211124536 0.843762685544111 0.311470632615305 0.0364968361158125 +Testosterone glucuronide 2 HMDB03193 Lipids:Steroi 0.601299684173133 5.5336810352022e-10 1 0.236540994687854 -0.04248122040133 2.42159096627883 1.17304880421209 0.098506592594453 plsda|randomforest|svm +Tetrahydrohippuric acid 2 AA-pep:AcyGly -0.154121197716505 0.180596643777345 0 -0.0632817887289301 -0.118780596428636 0.64784798980898 0.984828666672331 -0.0240429749541618 +Threo-3-Phenylserine 1 HMDB02184 AA-pep -0.119193198221084 0.145065110930369 0 -0.0597489265991061 -0.13577630772878 0.611680275920823 0.93566741678381 -0.0263854323430091 +Threonic acid/Erythronic acid 2 Carboh -0.0737144061928916 0.0184829598851726 1 -0.119238298799105 -0.185807133812037 1.22070336090116 1.27608947040735 -0.0395101148225436 +Tryptophan 1 HMDB00929 AA-pep 0.0364385885168677 0.493892938114586 0 0.0225021022691837 -0.0684280362181393 0.230365512960006 0.469918951785939 0.0128229908770535 +Valerylglycine isomer 1 2 AA-pep:AcyGly -0.0973494772580725 0.027878996619724 1 -0.130272928470127 -0.104173137359217 1.33367050033018 0.806325009996822 -0.0364740883768796 +Valerylglycine isomer 2 2 AA-pep:AcyGly -0.0982757370783132 0.0020365443559464 1 -0.159375429923644 -0.165146363738146 1.63160767062471 1.08828416431267 -0.0506824047376072 +Xanthosine 1 HMDB00299 Nucleo 0.073335073878674 0.0508203249581786 0 0.0616689259430038 -0.121944642477108 0.631336289765608 1.40242616715505 0.0328701450858134 diff --git a/examples/sacurine/expected/Multivariate_sampleMetadata.tsv b/examples/sacurine/expected/Multivariate_sampleMetadata.tsv new file mode 100644 index 0000000..7ca6710 --- /dev/null +++ b/examples/sacurine/expected/Multivariate_sampleMetadata.tsv @@ -0,0 +1,184 @@ +sampleMetadata age bmi gender gender_OPLSDA_XSCOR-h1 gender_OPLSDA_XSCOR-o1 gender_OPLSDA_predictions +HU_011 29 19.75 M 1.58293313047118 4.9806037392409 M +HU_014 59 22.64 F -1.37280613081632 1.74433815056477 F +HU_015 42 22.72 M 3.34136968418065 3.43727711491962 M +HU_017 41 23.03 M 3.59006316404314 0.979495987120886 M +HU_018 34 20.96 M 1.66271563510991 -0.315584520504211 M +HU_019 35 23.41 M 2.31292339567712 -0.656128073574044 M +HU_020 59 17.1 M 0.932682995993685 3.13384149735159 M +HU_021 34 23.36 M 1.74869628827996 0.41752604868978 M +HU_022 51 28.23 F -0.241809256894707 0.491049116158774 M +HU_023 51 29.55 M 1.7425061156994 2.95169109073032 M +HU_024 57 29.86 M 1.29517450819287 0.205827759529838 M +HU_025 53 21.6 M 1.77687142137439 1.74290900741242 M +HU_026 34 23.46 F -0.905433973047307 6.27708879537232 F +HU_027 37 24.82 M 2.38884046119679 4.10267671703555 M +HU_028 41 23.92 F -1.33253605468889 2.70035605659215 F +HU_029 37 27.78 M 4.04962818855043 2.04230210400039 M +HU_030 49 25.88 M 2.31942286908789 -0.536465874242346 M +HU_031 25 20.76 M 3.9676885414254 -1.53991130404747 M +HU_032 38 24.09 F -1.90648288426957 -2.00562755678015 F +HU_033 44 18.36 F -2.60330864259552 -1.04392739299679 F +HU_034 52 23.37 M 3.16799714286182 -0.733953917496611 M +HU_035 37 20.7 F -2.88236649269234 -0.0420212890932657 F +HU_036 47 29.51 M 0.456450017551661 -0.465131358686609 M +HU_037 35 25.62 M 1.80080016818244 3.91504037841238 M +HU_038 52 22.72 M 1.74154406361342 1.15677072444102 M +HU_039 45 24.9 M 2.51337372518582 -0.0601405276939136 M +HU_040 24 26.54 M 1.77425721650046 1.25860088731523 M +HU_041 28 23.67 M 1.34364556833848 2.36517436329155 M +HU_042 36 19.75 M 2.2708435582018 0.664476283924372 M +HU_043 42 29.04 M 1.37975330324734 2.19923914440385 M +HU_044 57 25.46 F -0.693510288549522 3.79714140989595 F +HU_045 46 20.81 F -3.99445110424675 2.4512989046396 F +HU_046 35 24.84 M 0.789202061516398 1.76837903047691 M +HU_047 43 25 F -1.03708773561841 9.32213664193582 F +HU_048 39 19.49 F -3.28152944701099 3.43069989788204 F +HU_049 50 27.85 M 1.25926419544782 4.70594121877466 M +HU_050 30 24.21 M 2.89950306721262 -1.09754469539616 M +HU_051 24 23.23 F -3.98947680827422 6.81135423195647 F +HU_052 51 20.06 F -2.16112718026215 -1.77029334378363 F +HU_053 49 25.88 M 1.42526044160803 8.90619343237515 M +HU_054 29 20.76 M 1.78456402868924 1.43502042646009 M +HU_055 58 24.89 F -3.5431501643564 10.7483458185538 F +HU_056 41 21.15 M 2.20260798475925 2.39922664129116 M +HU_057 57 27.16 M 1.6155332179699 1.43419490597522 M +HU_058 45 26.7 M 3.05317465504811 4.87646520314668 M +HU_060 55 28.72 F -1.82313449553941 -0.536464981602601 F +HU_061 44 25.35 F -1.24385157546657 0.785314506600513 F +HU_062 34 22.22 M 1.01911820989929 0.845017425604579 M +HU_063 35 21.01 F -3.75661480829994 1.93213102018408 F +HU_064 32 21.94 F -1.38665360030315 -1.12022977200023 F +HU_065 54 21.87 M 1.68481339709357 0.0563934127767823 M +HU_066 25 22.53 F -1.27149486038764 2.0628293107866 F +HU_067 40 19.31 F -2.22770474417785 3.12411146123335 F +HU_068 37 27.22 F -2.66189899325594 -0.348623393778582 F +HU_069 39 24.38 M 3.37590105763249 0.0480755536432562 M +HU_070 58 18.71 M 1.69442075760416 0.186724671273337 M +HU_072 47 27.13 M 1.6701256535878 -0.730068657993729 M +HU_073 35 25.38 M 2.18213690858945 1.18138479819621 M +HU_074 42 20.94 F -3.09095007228102 2.59274708312188 F +HU_075 38 21.05 M 2.25267420757465 0.543717672555423 M +HU_076 47 26.7 M 0.639518677745425 -4.86754252197724 M +HU_077 27 21.15 M 0.668851404829271 0.733305089280426 M +HU_078 46 25.18 M 2.23156976189628 -2.55792315642502 M +HU_079 47 23.55 M 0.291481015536569 -0.351419211590525 M +HU_080 21 19.72 F -1.46458707358092 0.642471609597288 F +HU_081 25 17.84 F -3.56869282665826 0.109841130953026 F +HU_082 49 23.15 M 2.21733368238415 -3.72517614164827 M +HU_083 50 29.76 M 1.35101571931506 -1.53150431318518 M +HU_084 62 23.8 F -2.47025939454657 0.704854684902949 F +HU_085 23 22.86 M 0.861449221187205 -0.284776704434232 M +HU_086 33 23.51 M 0.240625133995134 -7.82759918445756 M +HU_087 38 23.8 F -1.46583179373077 -0.995836439732216 F +HU_088 50 21.78 F -1.23073077205365 -1.9557540368262 F +HU_089 31 23.7 M 0.84722329333765 -4.67466272644122 M +HU_090 46 19.79 M -0.240220827251134 -0.434984651413085 M +HU_091 61 26.12 M 0.708954446373867 0.708518233273242 M +HU_092 40 21.83 M 3.25766373991557 0.612242632003036 M +HU_093 53 21.71 M -0.2722512450185 -6.82015994391301 F +HU_094 32 23.29 M 4.87627977216498 -3.75781257316719 M +HU_095 27 27.33 M 1.79060767273301 -3.94305975589431 M +HU_097 50 26.78 M 1.34192808561658 2.90083895963035 M +HU_098 46 20.45 M 0.941521289370677 0.700263194210824 M +HU_099 23 21.3 M 0.681914663439508 1.95803602933046 M +HU_100 47 21.22 F -0.00400805795203465 -1.7505007413511 M +HU_101 39 23.7 M 0.702375537901114 2.60821894164833 M +HU_102 59 24.03 F -2.12354375191367 4.04958472118649 F +HU_103 49 26.79 M 1.56705287036968 1.82851108037729 M +HU_105 47 22.96 M 0.0839930499132598 -1.11455935491243 M +HU_106 42 27.34 M 0.80666063967251 -2.63028112461382 M +HU_107 46 24.22 M 3.20001113166665 0.420680749500796 M +HU_108 25 23.81 M 0.910342296333496 -1.98026861854879 M +HU_109 32 22.68 M 1.54651064802147 -2.02723634840039 M +HU_110 50 20.9 F -3.21988058005263 4.00451740339073 F +HU_112 55 25.36 M 2.34265130693714 -2.82841842092514 M +HU_113 44 23.05 M 1.59298133135561 -0.0404370176047968 M +HU_114 58 29.38 M 0.167378495824655 -2.86861303174659 M +HU_115 46 27.24 F -0.901455340321644 3.05526769990411 F +HU_116 28 20.96 F -2.95438113046617 -1.9639137601519 F +HU_117 24 22.86 M 1.72975632333293 -5.76828706634313 M +HU_118 30 21.64 F -1.80785380931897 -4.68898788609544 F +HU_119 50 24.44 F -2.89039792620823 1.63508664871793 F +HU_120 32 23.88 F -6.30383360370801 3.2508991957068 F +HU_121 26 20.57 M 0.261571391689504 -1.31242983428482 M +HU_122 48 23.03 M 1.97722954327486 -2.16514182787301 M +HU_123 49 24.39 M -0.0533046345794438 -0.258942585739277 M +HU_124 34 22.22 M 2.13330833604065 -2.22583897553433 M +HU_125 58 25.47 M 1.86694393977163 -4.53044405236957 M +HU_126 45 24.7 M 1.86189354677789 -2.31555101874733 M +HU_127 45 25.62 M 1.64818368333343 -1.18235506727406 M +HU_129 47 29.32 M 2.24729386939742 -3.31832337030591 M +HU_130 33 26.06 M 3.97472227767611 3.23839165604945 M +HU_131 42 23.12 M 2.46293367161478 1.09749415459956 M +HU_132 38 26.67 F -0.497855004714105 -2.51983712816142 F +HU_133 53 25.43 M 0.514756115402624 -1.53681474889941 M +HU_134 48 22.89 M 1.3700484952222 -0.56306165650533 M +HU_135 31 24.93 M 2.44925229897762 1.24524100505772 M +HU_136 52 20.81 F -2.7546732916265 0.0283481186281538 F +HU_137 28 22.22 M 2.12489637483936 3.37201477458599 M +HU_138 42 21.88 M 1.90096259238906 -1.81868737707891 M +HU_139 47 23.03 M 2.69443528333851 -0.0992540138446447 M +HU_140 49 26.59 M 0.709228526328496 -5.69514718965739 M +HU_142 25 20.98 M 0.906595007806958 2.4906802941563 M +HU_143 52 23.15 F -2.87301511377198 -2.35405760231077 F +HU_144 38 29.54 M 2.10713674682657 -1.79664265133915 M +HU_145 27 29.09 M 3.82599319921535 -1.99244640166711 M +HU_146 42 24.21 M 3.13977240382026 -0.366994303453535 M +HU_147 60 31.74 M 1.70236062431376 -1.1157713452035 M +HU_148 55 30.48 F -1.39625886460325 -0.0975023672835233 F +HU_149 35 19.49 F -2.39597821298642 0.0642246680295437 F +HU_150 49 27.24 F -1.90392495280342 1.81127258367052 F +HU_152 26 17.58 F -1.31160302430449 0.0235635071995006 F +HU_154 35 27.71 F -2.66444245379189 -3.27758649173271 F +HU_155 48 20.45 F -2.20856364721724 -3.33644002158172 F +HU_156 36 16.85 F -1.52953002189326 -1.51427503378043 F +HU_157 43 21.95 F -1.75308670674791 -3.43093920423897 F +HU_158 50 25.48 F -3.83377911414521 0.849063729773212 F +HU_159 37 21.72 F -1.52581332135293 -2.5764314930024 F +HU_160 31 24.17 F -3.9255448024201 4.21997212073322 F +HU_162 50 29.03 F -2.46131392118948 -1.97630797198586 F +HU_163 49 23.15 F -1.76731833221729 -0.476614076082873 F +HU_164 45 25.63 F -2.46969740417325 -1.73837091356558 F +HU_166 40 19.72 F -2.60891832045248 1.62397221076742 F +HU_167 55 20.57 F -1.13595390084553 -2.32018077055045 F +HU_168 37 20.76 F -4.17806521546818 -0.73451031942323 F +HU_169 53 19.14 F -4.74381993648062 -2.56906729222864 F +HU_170 50 24.61 F -4.19693772130769 -0.250917674903843 F +HU_171 29 21.37 F -2.15651839000821 -8.90928509895316 F +HU_172 55 21.36 F -1.30886599279716 1.50002406583418 F +HU_173 55 20.28 F -4.45842407224622 -10.7099858705925 F +HU_174 42 31.64 F -2.46896639658496 -1.57045228110498 F +HU_175 35 21.26 F -2.31704752376519 2.42707115016401 F +HU_177 59 28.58 F 1.05949064742695 -0.628494629070062 M +HU_179 33 26.57 F -0.221776928921426 4.37067631370139 M +HU_180 53 23.74 F -1.06030081691949 1.45138367797621 F +HU_181 49 22.46 F -0.538051411009479 -4.4254784256287 F +HU_182 43 23.74 F -1.33082226230118 -2.58616318394215 F +HU_183 46 19.13 F -1.98148234207269 -0.534346683073414 F +HU_184 37 25.33 F -2.20665960604897 4.45485889844764 F +HU_185 42 21.09 F -4.80320147288146 2.93822239486359 F +HU_186 44 22.1 F -0.49335383900729 -6.68178851358826 F +HU_187 21 19.95 F -4.10733091383723 -6.84959062049853 F +HU_188 22 24.22 F -0.422324155810693 0.742725159557937 F +HU_189 39 19.43 F -2.23938444082181 0.580857050424952 F +HU_190 28 25.93 M 1.71585518120188 1.58148883395967 M +HU_191 36 26.12 M 2.72614391002983 0.619530750996703 M +HU_192 31 24.22 M 1.5342927967285 1.16830178189421 M +HU_193 35 21.78 F -2.71720235383659 5.23695437441707 F +HU_194 40 28.04 F 1.10865110375743 -1.47303720351079 M +HU_195 26 18.42 F -1.68579671119508 -5.97486671349496 F +HU_196 27 21.1 F -3.30746570726101 -0.305963539467928 F +HU_197 26 20.72 M 0.420110533407766 3.74844549106185 M +HU_198 35 22.98 M 1.52314064013922 1.49166148399989 M +HU_199 33 21.04 M 1.63113861184599 2.46761505226682 M +HU_200 46 23.89 M 2.1046874718637 0.496891033197679 M +HU_201 34 20.24 M 1.23447231490137 -0.274965736229789 M +HU_202 42 28.06 M 1.75245715769325 2.55184357924034 M +HU_203 25 19.95 F -1.2678577769433 2.23710583625043 F +HU_204 31 29.06 M 2.92159137203804 -3.42721722053952 M +HU_205 33 28.37 M 3.02003919689608 0.185278133133454 M +HU_206 45 22.15 F -0.238014487254299 -1.02240454218737 M +HU_207 33 19.47 F -4.86076571554572 -3.25318131416302 F +HU_208 27 18.61 F -1.09520423821411 -5.73060865883602 F +HU_209 17.5 21.48 F -0.496198164163254 -2.23289512714009 F diff --git a/examples/sacurine/expected/Multivariate_variableMetadata.tsv b/examples/sacurine/expected/Multivariate_variableMetadata.tsv new file mode 100644 index 0000000..869b64e --- /dev/null +++ b/examples/sacurine/expected/Multivariate_variableMetadata.tsv @@ -0,0 +1,110 @@ +variableMetadata msiLevel hmdb chemicalClass gender_ttest_M.F_dif gender_ttest_M.F_fdr gender_ttest_M.F_sig gender_OPLSDA_XLOAD-h1 gender_OPLSDA_XLOAD-o1 gender_OPLSDA_VIP_pred gender_OPLSDA_VIP_ortho gender_OPLSDA_COEFF +(2-methoxyethoxy)propanoic acid isomer 2 Organi -0.155000269394578 0.323764778788649 0 -0.0629231482333729 -0.0106578681921491 0.644176403894964 0.199659454473129 -0.0179477929812287 +(gamma)Glu-Leu/Ile 2 AA-pep 0.133545985543373 0.00175885260227822 1 0.119757449196811 -0.114197591390804 1.22601816865736 1.11501833480893 0.052902303671276 +1-Methyluric acid 1 HMDB03099 AroHeP:Xenobi 0.026049678345422 0.727167328693187 0 0.0580401884855163 -0.18668459107107 0.59418705118375 1.29909060235335 0.00706012193066922 +1-Methylxanthine 1 HMDB10738 AroHeP 0.0122904029602404 0.86545714954036 0 0.0457802870110654 -0.163743392689823 0.468676178545472 1.25124771548414 0.00287986210020381 +1,3-Dimethyluric acid 1 HMDB01857 AroHeP 0.0380317125866263 0.728490752219743 0 0.0619417839511327 -0.145268965047105 0.634129676545915 0.977670149488149 0.00673585118665721 +1,7-Dimethyluric acid 1 HMDB11103 AroHeP -0.0816380257692773 0.323764778788649 0 0.00321602177090704 -0.143756133059411 0.0329240573206418 1.09838110115389 -0.0182116492538695 +2-acetamido-4-methylphenyl acetate 2 AroHoM -0.185871896669639 0.0390078637644484 1 -0.117545942512656 -0.085316977297524 1.20337784529489 0.628258400512213 -0.0348057705638337 +2-Aminoadipic acid 1 HMDB00510 AA-pep -0.0619694471480727 0.0390078637644484 1 -0.0897211337725939 -0.147460535871994 0.918521067837397 1.10427240455208 -0.0343231205539951 +2-Hydroxybenzyl alcohol 1 HMDB59709 AroHoM -0.0642157802242167 0.493892938114586 0 -0.0265310276810774 -0.0990951036013229 0.271611680010787 0.69703068597789 -0.0128684486468477 +2-Isopropylmalic acid 1 HMDB00402 Organi 0.177456127433735 0.0548810070399391 0 0.0929305372671568 -0.120005540777645 0.95137737048309 0.796847440948451 0.0325647310393633 +2-Methylhippuric acid 1 HMDB11723 AA-pep:AcyGly -0.19997626443265 0.0029590065830821 1 -0.166200152983592 -0.0719454878732734 1.70147584603817 0.488403501916531 -0.0504315810274886 +2,2-Dimethylglutaric acid 1 Lipids 0.0331951037524094 0.493892938114586 0 0.0220173358253972 -0.0885073869607203 0.225402711300287 0.910620880252181 0.0131510606425336 +3-Hydroxybenzyl alcohol 1 HMDB59712 AroHoM -0.146666681675181 0.16563257821464 0 -0.0727309359617904 -0.0578237774387485 0.744583735798078 0.750764959691574 -0.0248558027475987 +3-Hydroxyphenylacetic acid 1 HMDB00440 AroHoM -0.0787244344097591 0.232246669407913 0 -0.0671868690768632 -0.0627301515093895 0.687826291691183 0.478807004603776 -0.0214185502116562 +3-Indole carboxylic acid glucuronide 2 HMDB13189 Carboh 0.0897953261873488 0.266350691693662 0 0.0526403993957739 -0.0433270602435651 0.538906652550156 0.398419383333496 0.0211072621909597 +3-Methyl-2-oxovaleric acid 1 HMDB00491 Lipids 0.104657798739759 0.0681790770646561 0 0.0546014582147987 -0.0584863441443364 0.558983013211269 1.15616076142631 0.0310919514182214 +3-Methylcrotonylglycine 1 HMDB00459 AA-pep:AcyGly -0.093752160335181 0.0300560255989004 1 -0.126816864744417 -0.116763669721785 1.29828901092658 0.952430294659145 -0.0364128253699755 +3,3-Dimethylglutaric acid 1 HMDB02441 Lipids -0.0264119394712052 0.564959339157832 0 -0.0379640854323549 -0.108710283604268 0.388657731178252 1.04761005708284 -0.0112517741937685 +3,4-Dihydroxybenzeneacetic acid 1 HMDB01336 AroHoM -0.159994211585301 0.0681790770646561 0 -0.0994678576724457 -0.063817938417832 1.01830325814163 0.772577762546872 -0.0311329307437024 +3,5-dihydroxybenzoic acid/3,4-dihydroxybenzoic acid 2 AroHoM -0.168856806629036 0.00847422558090828 1 -0.110942854855835 -0.0934123110715136 1.13577866469448 0.653600600492383 -0.0437302828967115 +3,7-Dimethyluric acid 1 HMDB01982 AroHeP 0.115234758953735 0.397912677311787 0 0.0450312739542251 -0.142442499931642 0.461008149354747 1.12143499165439 0.0159013738582697 +4-Acetamidobutanoic acid isomer 2 2 Lipids -0.00639635431120489 0.851136619032405 0 -0.0168483083703037 -0.155485854278854 0.172484737372682 1.7525698929438 -0.00330727703842402 +4-Acetamidobutanoic acid isomer 3 2 Lipids -0.173798023344699 0.00025215004086728 1 -0.184021226805839 -0.0907978230779515 1.88391928014265 0.924824980226579 -0.0588702046728787 +4-Hydroxybenzoic acid 1 HMDB00500 AroHoM -0.0755555816692777 0.372723845099362 0 -0.0569685114233274 -0.0512306887082397 0.583215745782799 0.472611223022251 -0.0168742606735916 +4-Methylhippuric acid/3-Methylhippuric acid 1 AA-pep:AcyGly 0.052166858115422 0.615183249932764 0 0.0152653328528409 -0.0300990564467396 0.156279008560274 0.360485311500883 0.00964929186267553 +5-Hydroxyindoleacetic acid 1 HMDB00763 AroHeP -0.0650083066834943 0.119666781024437 0 -0.0876373012561967 -0.0807117120073239 0.897187810134627 1.20188926892232 -0.0278895210372743 +5-Sulfosalicylic acid 1 HMDB11725 AroHoM -0.0420496747481929 0.728490752219743 0 -0.00792056733516729 -0.0696570443336542 0.0810868929166179 0.493485950353912 -0.00640765925827987 +6-(2-hydroxyethoxy)-6-oxohexanoic acid 2 Organi -0.00818924782674735 0.851136619032405 0 -0.0104490598114745 -0.153032269137012 0.106972361720913 1.06534077864588 -0.00324535539878882 +6-(carboxymethoxy)-hexanoic acid 2 Organi 0.179643082754096 0.00899236438990862 1 0.119688724190158 -0.0559414186201415 1.22531459566576 1.29274680600267 0.0437756539745847 +9-Methylxanthine 2 HMDB59716 AroHeP -0.0115307413883139 0.851136619032405 0 0.0100848515264305 -0.169220440531131 0.1032437755024 1.11627466028614 -0.00330231698776486 +Acetaminophen glucuronide 1 HMDB10316 Carboh -0.757586956784096 0.00411942788078397 1 -0.144168724494679 0.0318613064271238 1.47592886094422 0.232244427417829 -0.0481015232700137 +Acetylphenylalanine 1 HMDB00512 AA-pep -0.256958555759156 7.01473681436596e-06 1 -0.194218188933215 -0.0666199134009379 1.98831078912284 0.438227632202136 -0.0692918392044546 +alpha-N-Phenylacetyl-glutamine 1 HMDB06344 AA-pep -0.110215238882288 0.000111989218695563 1 -0.192020018021106 -0.142575934235487 1.9658069908695 1.00521557851703 -0.0625742943254429 +Aminosalicyluric acid 2 AA-pep:AcyGly -0.0917527537379517 0.321632126826463 0 -0.0251109919662731 -0.138839896001846 0.257074049173049 1.02123780942415 -0.0187295699946089 +Asp-Leu/Ile isomer 1 2 AA-pep 0.162114407681807 0.00679341330573933 1 0.130474917086294 -0.0611801744862112 1.33573836095132 0.827840861792004 0.0451379977078123 +Asp-Leu/Ile isomer 2 2 AA-pep 0.123121995850844 0.0390078637644484 1 0.0926234532524922 -0.0728816762453344 0.948233594594341 0.782973627888894 0.0346070512216744 +Aspartic acid 1 HMDB00191 AA-pep -0.0295416717565065 0.41230846296291 0 -0.083571987342248 -0.0999327986169215 0.855569115404368 0.674222379497357 -0.0153718143676333 +Azelaic acid 1 HMDB00784 Organi -0.0520165541467463 0.2234578668199 0 -0.064341302766364 -0.164552607175279 0.658694776113743 1.10310338316206 -0.0228691249591028 +Benzoic acid isomer 2 AroHoM -0.0322679127638557 0.728490752219743 0 -0.0163654147308624 -0.132696854408139 0.167541108567503 0.916875438954182 -0.0067778965326895 +Chenodeoxycholic acid isomer 2 Lipids:Steroi 0.132745971456386 0.376543094435485 0 0.0435032593596702 -0.0183586013146566 0.445365083579196 0.173185485497993 0.0162806949296843 +Cinnamoylglycine 1 HMDB11621 AA-pep:AcyGly -0.109754596634337 0.232246669407913 0 -0.0780187830563322 -0.0685443373085233 0.798718127056997 0.539360023590325 -0.0218656315093793 +Citric acid 1 HMDB00094 Organi -0.102817022939518 0.000111989218695563 1 -0.177201682028484 -0.16416481719859 1.81410411745269 1.08701541994548 -0.0623887092791427 +Dehydroepiandrosterone 3-glucuronide 1 HMDB10348 Lipids:Steroi 0.168656222366748 0.0359628801792618 1 0.101248771777523 -0.0993006498984019 1.03653538536449 1.34702455488379 0.0362900392995272 +Dehydroepiandrosterone sulfate 1 HMDB01032 Lipids:Steroi 0.52783958455 0.00863944317079213 1 0.110124702353369 -0.0478317831742589 1.12740281968872 0.626599124124917 0.0431153379016612 +Deoxyhexose 1 HMDB00849 Carboh -0.0410464369986743 0.605514398859828 0 -0.00278895878878273 -0.151476869342967 0.0285519954676465 1.00126213186046 -0.0103190901904822 +Dimethylguanosine 2 HMDB04824 Nucleo 0.00939526703722926 0.755561619359514 0 -0.00671419756903697 -0.150138394768253 0.0687366695166184 1.35378433578044 0.00567599398135352 +FMNH2 2 HMDB01142 AroHeP 0.14862320068024 0.145954616937161 0 0.0661211010113434 -0.0377695279952386 0.676915479706914 1.24762434000977 0.0267677223858153 +Fumaric acid 1 HMDB00134 Lipids -0.192060238400361 0.00712151197473303 1 -0.0812069277171281 -0.133120228395083 0.831356792164335 1.13695392328096 -0.0455049925501546 +Gentisic acid 1 HMDB00152 AroHoM -0.0444349874475911 0.68346774984917 0 -0.0379721323445418 -0.0434473231691346 0.388740111527941 0.381640451808289 -0.00807450712744702 +Glu-Val 2 HMDB59717 AA-pep 0.0909208948490363 0.0101095402055825 1 0.0926397907489698 -0.0959239242064072 0.948400849889491 1.14818944426074 0.0425575782649377 +Gluconic acid and/or isomers 2 Carboh -0.137224428202771 0.00025215004086728 1 -0.150557610736939 -0.175769746860379 1.54133515226914 1.160111550752 -0.0589064746969207 +Glucuronic acid and/or isomers 2 Carboh -0.123892879733855 0.00132416540855552 1 -0.129265065715949 -0.182144098231692 1.32335249459089 1.38191396340929 -0.0528758333809788 +Glyceric acid 1 HMDB00139 Carboh -0.13790885799747 0.00104086903382066 1 -0.132314216410903 -0.0799583467702576 1.35456820748441 0.663916092761863 -0.0541128361230358 +Glycocholic acid isomer 2 2 Lipids:Steroi 0.0572079357465056 0.705371999506042 0 -0.00103524258646424 -0.042501227572099 0.0105983070655349 0.983106753785751 0.00778177293727898 +Glycocholic acid isomer 3 2 Lipids:Steroi -0.0773405690756626 0.620298386109946 0 -0.0337465002549098 -0.0360711936269894 0.345480157757246 0.638805913744572 -0.00954332164542622 +Heptylmalonic acid 2 HMDB59719 Lipids -0.0593328945353013 0.180596643777345 0 -0.0534556456563322 -0.148038184263367 0.547252744873247 1.08671393238417 -0.0235502476865258 +Hexanoylglycine 1 HMDB00701 AA-pep:AcyGly -0.0932936237616868 0.146715865408848 0 -0.069065353398607 -0.0969117927431154 0.707057295052076 1.09003981712174 -0.0257216689067251 +Hippuric acid 1 HMDB00714 AA-pep:AcyGly -0.0931749649768676 0.0229376686045519 1 -0.103768347760368 -0.178922596041449 1.06232957147149 1.48116549511923 -0.0386684868738123 +Hydroxybenzyl alcohol isomer 2 AroHeM -0.141695646881807 0.0131586645370246 1 -0.116154230094499 -0.113264979601255 1.18913017450989 0.749299286984473 -0.040664887789903 +Hydroxyphenyllactic acid 1 HMDB00755 AroHoM -0.0473971061795186 0.533678624764605 0 -0.0277989388415157 -0.144536404579182 0.284591934094073 1.01043523727569 -0.0121834800853389 +Hydroxysuberic acid isomer 1 2 Organi 0.030003776340723 0.587869096751915 0 0.0336831631933201 -0.0709070344730043 0.344831743910933 0.676272383342317 0.0107924282141943 +Hydroxysuberic acid isomer 2 2 Organi 0.0248794358010835 0.722732216359098 0 0.0237968641148827 -0.0857035992702099 0.243620651221198 0.828661515512191 0.00696061266474597 +Isovalerylalanine isomer 2 AA-pep -0.0624740261720484 0.281950696594999 0 -0.0643678011799719 -0.107235939786368 0.658966053906831 0.966340419720918 -0.0198805837046875 +Ketoleucine 1 HMDB00695 Lipids 0.0749368582506023 0.174428012008638 0 0.0268257795267178 -0.0520034886990856 0.274629205187083 1.34317188625478 0.0249497006592116 +Kynurenic acid 1 HMDB00715 AA-pep 0.0214304106015666 0.568923400129814 0 0.0316881355610339 -0.142015994415772 0.324407627160278 1.40538633373515 0.0112487845157698 +Malic acid 1 HMDB00156 Organi -0.229742558759036 7.73571435325274e-09 1 -0.24217689598014 -0.0612973499236012 2.47928856611454 0.700050338607768 -0.0867545485685649 +Methoxysalicylic acid isomer 2 AroHoM 0.000204360076987875 0.997700145180708 0 0.00877566366424832 -0.104831642682627 0.0898409507429721 0.72940877204432 4.16059610636481e-05 +Methyl (hydroxymethyl)pyrrolidine-carboxylate/Methyl (hydroxy)piperidine-carboxylate 2 AA-pep 0.161809911653012 0.0142091308775083 1 0.110929577119035 -0.0927011232974581 1.13564273372179 0.999558392708976 0.0409253639463481 +Methylinosine 2 Nucleo 0.0537904500254216 0.376543094435485 0 0.0400625442184748 -0.103861094227721 0.410140725473944 1.50345601548568 0.0166720486446603 +Mevalonic acid isomer 1 2 Organi -0.0280319198460237 0.851136619032405 0 -0.0178672929893043 -0.0350871314799568 0.182916603322199 0.892419403989909 -0.0035662417066509 +Monoethyl phthalate 2 HMDB02120 AroHoM:Xenobi -0.373668043448674 0.00356064280978631 1 -0.119246036354195 -0.0437487362245172 1.22078257420426 0.336894662640625 -0.0483771156300739 +N-Acetyl-aspartic acid 1 HMDB00812 AA-pep -0.101375128568796 0.000296825262376728 1 -0.166071482656643 -0.151622051891626 1.70015858218807 1.02226577362575 -0.0588422752163416 +N-Acetylisoleucine 1 AA-pep 0.0112460433407229 0.755561619359514 0 0.00883509005820815 -0.12001518300752 0.0904493290875442 1.19396466653225 0.00566561488280379 +N-Acetylleucine 1 HMDB11756 AA-pep -0.0296529066110844 0.813128123044942 0 -0.00632875977154954 -0.00121026532725527 0.0647907459371151 0.0159130186538505 -0.00464967875333961 +N-Acetyltryptophan 1 HMDB13713 AA-pep -0.0644318900663849 0.293698095990347 0 -0.0630497183908986 -0.0771315862302059 0.645472167238097 0.659434587984169 -0.0197465642877814 +N-Acetyltryptophan isomer 3 2 AA-pep -0.0531422853532533 0.458874204962082 0 -0.0845361382476443 -0.0371011182339037 0.865439620623636 0.256234087115519 -0.0139648592516904 +N2-Acetylaminoadipic acid 2 AA-pep -0.0449681021906017 0.38704087969443 0 -0.00965744990697951 -0.081207933805558 0.0988682468461471 1.54699719342116 -0.0164548056078999 +N4-Acetylcytidine 1 HMDB05923 Nucleo 0.200198253936987 0.0477572039288908 1 0.0624124122330541 -0.0637988721905562 0.638947738622132 1.28331545578467 0.0352119219770329 +Nicotinuric acid isomer 2 AA-pep -0.0804786190622888 0.0101095402055825 1 -0.0903308528734704 -0.149199418397508 0.924763073662217 1.0149843811703 -0.0424626406881353 +Ortho-Hydroxyphenylacetic acid 1 HMDB00669 AroHoM -0.0910445016612051 0.157861708287969 0 -0.0748384342632805 -0.134908852533061 0.766159272229178 0.900674716021854 -0.0257568162925087 +Oxoglutaric acid 2 HMDB00208 Organi -0.272243796903374 0.000156166570647348 1 -0.1666401029451 -0.0263616564477747 1.70597983848061 1.2639686436575 -0.0606996610516088 +p-Anisic acid 1 HMDB01101 AroHoM -1.00732093264819 5.5336810352022e-10 1 -0.247444917996862 -0.0434920219651048 2.53321999792696 0.287274505075279 -0.08931517050814 +p-Hydroxyhippuric acid 2 HMDB13678 AA-pep:AcyGly -0.152664533694819 2.03909504126136e-05 1 -0.162981488746578 -0.153237184496861 1.66852473644245 1.01384688380847 -0.0666643558856858 +p-Hydroxymandelic acid 1 HMDB00822 AroHoM 0.0718999493459034 0.14110362223617 0 0.0509409350154879 -0.161917903348557 0.521508367757095 1.17821390616966 0.0267307017188526 +p-Hydroxyphenylacetic acid 1 HMDB00020 AroHoM -0.0586099811667466 0.313687856620237 0 -0.0405570845814076 -0.117811781756049 0.415203587735595 0.832908851135483 -0.0186269702720734 +Pantothenic acid 1 HMDB00210 AliAcy -0.213367654010361 1.53497476881495e-07 1 -0.211506110251781 -0.10044953458525 2.16529606876126 0.817832248225162 -0.0796479912164316 +Pentose 2 Carboh -0.0985631455153007 0.00644782785225947 1 -0.104341721306731 -0.168395765092076 1.06819948929274 1.5229310586726 -0.0471796556401668 +Phe-Tyr-Asp (and isomers) 2 AA-pep -0.104756723535543 0.0037290768207204 1 -0.143925171228004 -0.172897855433651 1.47343548176837 1.30333054575822 -0.0484195148518902 +Porphobilinogen 1 HMDB00245 Organi 0.0138893409498788 0.736664310621888 0 0.0414770840131332 -0.169957628608973 0.424622091770332 1.22482228520033 0.00625763204525801 +Pyridoxic acid isomer 1 2 AroHeM -0.0527027983043373 0.346666592719352 0 -0.0675056289277174 -0.0845873697790599 0.691089599077962 1.10877762911864 -0.0178529337196506 +Pyridylacetylglycine 2 HMDB59723 AA-pep:AcyGly:Xenobi 0.00331051837638618 0.920694638319013 0 -0.0233633465446015 -0.109121479023196 0.239182510452822 1.28411667397314 0.00175043877511296 +Pyrocatechol sulfate 2 HMDB59724 AroHoM -0.0903571215657832 0.0131586645370246 1 -0.0969455502461404 -0.203668066068413 0.992481108852962 1.57004218826219 -0.0417587896946231 +Pyroglutamic acid 1 HMDB00267 AliHeM -0.0466009188086751 0.292065277904693 0 -0.0514465054285054 -0.175117727600434 0.52668415027461 1.24029105854752 -0.0204544463097541 +Pyrroledicarboxylic acid 2 AroHeM -0.067312693438434 0.572964151753452 0 -0.0330591970449878 -0.129285133650744 0.338443883785211 1.0162165069596 -0.0112902990228137 +Pyruvic acid 1 HMDB00243 Organi -0.10101159113012 0.00789906415430823 1 -0.14203905845856 -0.0751936974802729 1.45412638209245 1.08497558434152 -0.0441043938248178 +Quinic acid 1 HMDB03072 AliHoM -0.0632898631250605 0.678953333211909 0 0.0138529775615802 -0.124344532871573 0.141820006140815 1.12146067598945 -0.00845906463120633 +Salicylic acid 1 HMDB01895 AroHoM:Xenobi -0.156227365217108 0.18641747826249 0 -0.0546257314555333 -0.0362421801037827 0.559231510773237 0.818955231668964 -0.0230844577466112 +Sebacic acid 1 HMDB00792 Organi 0.00295366794855489 0.945812280705322 0 0.00478050490137978 -0.15321516216344 0.0489404701232001 1.13899791691835 0.00113944085897672 +Suberic acid 1 HMDB00893 Organi -0.0180310815753009 0.722732216359098 0 -0.0196318693224189 -0.146338194150704 0.200981472429638 0.996379795906669 -0.007224284519048 +Sulfosalicylic acid isomer 2 AroHoM -0.0690984041927711 0.280585988106105 0 -0.0836189654729464 -0.0794314184628052 0.85605005452049 0.749654649755071 -0.0204138472856556 +Taurine 1 HMDB00251 Organi 0.254491855108554 0.0390078637644484 1 0.0824187353266325 -0.0398145211124536 0.843762685544111 0.311470632615305 0.0364968361158125 +Testosterone glucuronide 2 HMDB03193 Lipids:Steroi 0.601299684173133 5.5336810352022e-10 1 0.236540994687854 -0.04248122040133 2.42159096627883 1.17304880421209 0.098506592594453 +Tetrahydrohippuric acid 2 AA-pep:AcyGly -0.154121197716505 0.180596643777345 0 -0.0632817887289301 -0.118780596428636 0.64784798980898 0.984828666672331 -0.0240429749541618 +Threo-3-Phenylserine 1 HMDB02184 AA-pep -0.119193198221084 0.145065110930369 0 -0.0597489265991061 -0.13577630772878 0.611680275920823 0.93566741678381 -0.0263854323430091 +Threonic acid/Erythronic acid 2 Carboh -0.0737144061928916 0.0184829598851726 1 -0.119238298799105 -0.185807133812037 1.22070336090116 1.27608947040735 -0.0395101148225436 +Tryptophan 1 HMDB00929 AA-pep 0.0364385885168677 0.493892938114586 0 0.0225021022691837 -0.0684280362181393 0.230365512960006 0.469918951785939 0.0128229908770535 +Valerylglycine isomer 1 2 AA-pep:AcyGly -0.0973494772580725 0.027878996619724 1 -0.130272928470127 -0.104173137359217 1.33367050033018 0.806325009996822 -0.0364740883768796 +Valerylglycine isomer 2 2 AA-pep:AcyGly -0.0982757370783132 0.0020365443559464 1 -0.159375429923644 -0.165146363738146 1.63160767062471 1.08828416431267 -0.0506824047376072 +Xanthosine 1 HMDB00299 Nucleo 0.073335073878674 0.0508203249581786 0 0.0616689259430038 -0.121944642477108 0.631336289765608 1.40242616715505 0.0328701450858134 diff --git a/examples/sacurine/expected/Univariate_variableMetadata.tsv b/examples/sacurine/expected/Univariate_variableMetadata.tsv new file mode 100644 index 0000000..5cdf813 --- /dev/null +++ b/examples/sacurine/expected/Univariate_variableMetadata.tsv @@ -0,0 +1,110 @@ +variableMetadata msiLevel hmdb chemicalClass gender_ttest_M.F_dif gender_ttest_M.F_fdr gender_ttest_M.F_sig +(2-methoxyethoxy)propanoic acid isomer 2 Organi -0.155000269394578 0.323764778788649 0 +(gamma)Glu-Leu/Ile 2 AA-pep 0.133545985543373 0.00175885260227822 1 +1-Methyluric acid 1 HMDB03099 AroHeP:Xenobi 0.026049678345422 0.727167328693187 0 +1-Methylxanthine 1 HMDB10738 AroHeP 0.0122904029602404 0.86545714954036 0 +1,3-Dimethyluric acid 1 HMDB01857 AroHeP 0.0380317125866263 0.728490752219743 0 +1,7-Dimethyluric acid 1 HMDB11103 AroHeP -0.0816380257692773 0.323764778788649 0 +2-acetamido-4-methylphenyl acetate 2 AroHoM -0.185871896669639 0.0390078637644484 1 +2-Aminoadipic acid 1 HMDB00510 AA-pep -0.0619694471480727 0.0390078637644484 1 +2-Hydroxybenzyl alcohol 1 HMDB59709 AroHoM -0.0642157802242167 0.493892938114586 0 +2-Isopropylmalic acid 1 HMDB00402 Organi 0.177456127433735 0.0548810070399391 0 +2-Methylhippuric acid 1 HMDB11723 AA-pep:AcyGly -0.19997626443265 0.0029590065830821 1 +2,2-Dimethylglutaric acid 1 Lipids 0.0331951037524094 0.493892938114586 0 +3-Hydroxybenzyl alcohol 1 HMDB59712 AroHoM -0.146666681675181 0.16563257821464 0 +3-Hydroxyphenylacetic acid 1 HMDB00440 AroHoM -0.0787244344097591 0.232246669407913 0 +3-Indole carboxylic acid glucuronide 2 HMDB13189 Carboh 0.0897953261873488 0.266350691693662 0 +3-Methyl-2-oxovaleric acid 1 HMDB00491 Lipids 0.104657798739759 0.0681790770646561 0 +3-Methylcrotonylglycine 1 HMDB00459 AA-pep:AcyGly -0.093752160335181 0.0300560255989004 1 +3,3-Dimethylglutaric acid 1 HMDB02441 Lipids -0.0264119394712052 0.564959339157832 0 +3,4-Dihydroxybenzeneacetic acid 1 HMDB01336 AroHoM -0.159994211585301 0.0681790770646561 0 +3,5-dihydroxybenzoic acid/3,4-dihydroxybenzoic acid 2 AroHoM -0.168856806629036 0.00847422558090828 1 +3,7-Dimethyluric acid 1 HMDB01982 AroHeP 0.115234758953735 0.397912677311787 0 +4-Acetamidobutanoic acid isomer 2 2 Lipids -0.00639635431120489 0.851136619032405 0 +4-Acetamidobutanoic acid isomer 3 2 Lipids -0.173798023344699 0.00025215004086728 1 +4-Hydroxybenzoic acid 1 HMDB00500 AroHoM -0.0755555816692777 0.372723845099362 0 +4-Methylhippuric acid/3-Methylhippuric acid 1 AA-pep:AcyGly 0.052166858115422 0.615183249932764 0 +5-Hydroxyindoleacetic acid 1 HMDB00763 AroHeP -0.0650083066834943 0.119666781024437 0 +5-Sulfosalicylic acid 1 HMDB11725 AroHoM -0.0420496747481929 0.728490752219743 0 +6-(2-hydroxyethoxy)-6-oxohexanoic acid 2 Organi -0.00818924782674735 0.851136619032405 0 +6-(carboxymethoxy)-hexanoic acid 2 Organi 0.179643082754096 0.00899236438990862 1 +9-Methylxanthine 2 HMDB59716 AroHeP -0.0115307413883139 0.851136619032405 0 +Acetaminophen glucuronide 1 HMDB10316 Carboh -0.757586956784096 0.00411942788078397 1 +Acetylphenylalanine 1 HMDB00512 AA-pep -0.256958555759156 7.01473681436596e-06 1 +alpha-N-Phenylacetyl-glutamine 1 HMDB06344 AA-pep -0.110215238882288 0.000111989218695563 1 +Aminosalicyluric acid 2 AA-pep:AcyGly -0.0917527537379517 0.321632126826463 0 +Asp-Leu/Ile isomer 1 2 AA-pep 0.162114407681807 0.00679341330573933 1 +Asp-Leu/Ile isomer 2 2 AA-pep 0.123121995850844 0.0390078637644484 1 +Aspartic acid 1 HMDB00191 AA-pep -0.0295416717565065 0.41230846296291 0 +Azelaic acid 1 HMDB00784 Organi -0.0520165541467463 0.2234578668199 0 +Benzoic acid isomer 2 AroHoM -0.0322679127638557 0.728490752219743 0 +Chenodeoxycholic acid isomer 2 Lipids:Steroi 0.132745971456386 0.376543094435485 0 +Cinnamoylglycine 1 HMDB11621 AA-pep:AcyGly -0.109754596634337 0.232246669407913 0 +Citric acid 1 HMDB00094 Organi -0.102817022939518 0.000111989218695563 1 +Dehydroepiandrosterone 3-glucuronide 1 HMDB10348 Lipids:Steroi 0.168656222366748 0.0359628801792618 1 +Dehydroepiandrosterone sulfate 1 HMDB01032 Lipids:Steroi 0.52783958455 0.00863944317079213 1 +Deoxyhexose 1 HMDB00849 Carboh -0.0410464369986743 0.605514398859828 0 +Dimethylguanosine 2 HMDB04824 Nucleo 0.00939526703722926 0.755561619359514 0 +FMNH2 2 HMDB01142 AroHeP 0.14862320068024 0.145954616937161 0 +Fumaric acid 1 HMDB00134 Lipids -0.192060238400361 0.00712151197473303 1 +Gentisic acid 1 HMDB00152 AroHoM -0.0444349874475911 0.68346774984917 0 +Glu-Val 2 HMDB59717 AA-pep 0.0909208948490363 0.0101095402055825 1 +Gluconic acid and/or isomers 2 Carboh -0.137224428202771 0.00025215004086728 1 +Glucuronic acid and/or isomers 2 Carboh -0.123892879733855 0.00132416540855552 1 +Glyceric acid 1 HMDB00139 Carboh -0.13790885799747 0.00104086903382066 1 +Glycocholic acid isomer 2 2 Lipids:Steroi 0.0572079357465056 0.705371999506042 0 +Glycocholic acid isomer 3 2 Lipids:Steroi -0.0773405690756626 0.620298386109946 0 +Heptylmalonic acid 2 HMDB59719 Lipids -0.0593328945353013 0.180596643777345 0 +Hexanoylglycine 1 HMDB00701 AA-pep:AcyGly -0.0932936237616868 0.146715865408848 0 +Hippuric acid 1 HMDB00714 AA-pep:AcyGly -0.0931749649768676 0.0229376686045519 1 +Hydroxybenzyl alcohol isomer 2 AroHeM -0.141695646881807 0.0131586645370246 1 +Hydroxyphenyllactic acid 1 HMDB00755 AroHoM -0.0473971061795186 0.533678624764605 0 +Hydroxysuberic acid isomer 1 2 Organi 0.030003776340723 0.587869096751915 0 +Hydroxysuberic acid isomer 2 2 Organi 0.0248794358010835 0.722732216359098 0 +Isovalerylalanine isomer 2 AA-pep -0.0624740261720484 0.281950696594999 0 +Ketoleucine 1 HMDB00695 Lipids 0.0749368582506023 0.174428012008638 0 +Kynurenic acid 1 HMDB00715 AA-pep 0.0214304106015666 0.568923400129814 0 +Malic acid 1 HMDB00156 Organi -0.229742558759036 7.73571435325274e-09 1 +Methoxysalicylic acid isomer 2 AroHoM 0.000204360076987875 0.997700145180708 0 +Methyl (hydroxymethyl)pyrrolidine-carboxylate/Methyl (hydroxy)piperidine-carboxylate 2 AA-pep 0.161809911653012 0.0142091308775083 1 +Methylinosine 2 Nucleo 0.0537904500254216 0.376543094435485 0 +Mevalonic acid isomer 1 2 Organi -0.0280319198460237 0.851136619032405 0 +Monoethyl phthalate 2 HMDB02120 AroHoM:Xenobi -0.373668043448674 0.00356064280978631 1 +N-Acetyl-aspartic acid 1 HMDB00812 AA-pep -0.101375128568796 0.000296825262376728 1 +N-Acetylisoleucine 1 AA-pep 0.0112460433407229 0.755561619359514 0 +N-Acetylleucine 1 HMDB11756 AA-pep -0.0296529066110844 0.813128123044942 0 +N-Acetyltryptophan 1 HMDB13713 AA-pep -0.0644318900663849 0.293698095990347 0 +N-Acetyltryptophan isomer 3 2 AA-pep -0.0531422853532533 0.458874204962082 0 +N2-Acetylaminoadipic acid 2 AA-pep -0.0449681021906017 0.38704087969443 0 +N4-Acetylcytidine 1 HMDB05923 Nucleo 0.200198253936987 0.0477572039288908 1 +Nicotinuric acid isomer 2 AA-pep -0.0804786190622888 0.0101095402055825 1 +Ortho-Hydroxyphenylacetic acid 1 HMDB00669 AroHoM -0.0910445016612051 0.157861708287969 0 +Oxoglutaric acid 2 HMDB00208 Organi -0.272243796903374 0.000156166570647348 1 +p-Anisic acid 1 HMDB01101 AroHoM -1.00732093264819 5.5336810352022e-10 1 +p-Hydroxyhippuric acid 2 HMDB13678 AA-pep:AcyGly -0.152664533694819 2.03909504126136e-05 1 +p-Hydroxymandelic acid 1 HMDB00822 AroHoM 0.0718999493459034 0.14110362223617 0 +p-Hydroxyphenylacetic acid 1 HMDB00020 AroHoM -0.0586099811667466 0.313687856620237 0 +Pantothenic acid 1 HMDB00210 AliAcy -0.213367654010361 1.53497476881495e-07 1 +Pentose 2 Carboh -0.0985631455153007 0.00644782785225947 1 +Phe-Tyr-Asp (and isomers) 2 AA-pep -0.104756723535543 0.0037290768207204 1 +Porphobilinogen 1 HMDB00245 Organi 0.0138893409498788 0.736664310621888 0 +Pyridoxic acid isomer 1 2 AroHeM -0.0527027983043373 0.346666592719352 0 +Pyridylacetylglycine 2 HMDB59723 AA-pep:AcyGly:Xenobi 0.00331051837638618 0.920694638319013 0 +Pyrocatechol sulfate 2 HMDB59724 AroHoM -0.0903571215657832 0.0131586645370246 1 +Pyroglutamic acid 1 HMDB00267 AliHeM -0.0466009188086751 0.292065277904693 0 +Pyrroledicarboxylic acid 2 AroHeM -0.067312693438434 0.572964151753452 0 +Pyruvic acid 1 HMDB00243 Organi -0.10101159113012 0.00789906415430823 1 +Quinic acid 1 HMDB03072 AliHoM -0.0632898631250605 0.678953333211909 0 +Salicylic acid 1 HMDB01895 AroHoM:Xenobi -0.156227365217108 0.18641747826249 0 +Sebacic acid 1 HMDB00792 Organi 0.00295366794855489 0.945812280705322 0 +Suberic acid 1 HMDB00893 Organi -0.0180310815753009 0.722732216359098 0 +Sulfosalicylic acid isomer 2 AroHoM -0.0690984041927711 0.280585988106105 0 +Taurine 1 HMDB00251 Organi 0.254491855108554 0.0390078637644484 1 +Testosterone glucuronide 2 HMDB03193 Lipids:Steroi 0.601299684173133 5.5336810352022e-10 1 +Tetrahydrohippuric acid 2 AA-pep:AcyGly -0.154121197716505 0.180596643777345 0 +Threo-3-Phenylserine 1 HMDB02184 AA-pep -0.119193198221084 0.145065110930369 0 +Threonic acid/Erythronic acid 2 Carboh -0.0737144061928916 0.0184829598851726 1 +Tryptophan 1 HMDB00929 AA-pep 0.0364385885168677 0.493892938114586 0 +Valerylglycine isomer 1 2 AA-pep:AcyGly -0.0973494772580725 0.027878996619724 1 +Valerylglycine isomer 2 2 AA-pep:AcyGly -0.0982757370783132 0.0020365443559464 1 +Xanthosine 1 HMDB00299 Nucleo 0.073335073878674 0.0508203249581786 0 diff --git a/examples/sacurine/input/dataMatrix.tsv b/examples/sacurine/input/dataMatrix.tsv new file mode 100644 index 0000000..1c37390 --- /dev/null +++ b/examples/sacurine/input/dataMatrix.tsv @@ -0,0 +1,110 @@ +dataMatrix HU_011 HU_014 HU_015 HU_017 HU_018 HU_019 HU_020 HU_021 HU_022 HU_023 HU_024 HU_025 HU_026 HU_027 HU_028 HU_029 HU_030 HU_031 HU_032 HU_033 HU_034 HU_035 HU_036 HU_037 HU_038 HU_039 HU_040 HU_041 HU_042 HU_043 HU_044 HU_045 HU_046 HU_047 HU_048 HU_049 HU_050 HU_051 HU_052 HU_053 HU_054 HU_055 HU_056 HU_057 HU_058 HU_060 HU_061 HU_062 HU_063 HU_064 HU_065 HU_066 HU_067 HU_068 HU_069 HU_070 HU_072 HU_073 HU_074 HU_075 HU_076 HU_077 HU_078 HU_079 HU_080 HU_081 HU_082 HU_083 HU_084 HU_085 HU_086 HU_087 HU_088 HU_089 HU_090 HU_091 HU_092 HU_093 HU_094 HU_095 HU_097 HU_098 HU_099 HU_100 HU_101 HU_102 HU_103 HU_105 HU_106 HU_107 HU_108 HU_109 HU_110 HU_112 HU_113 HU_114 HU_115 HU_116 HU_117 HU_118 HU_119 HU_120 HU_121 HU_122 HU_123 HU_124 HU_125 HU_126 HU_127 HU_129 HU_130 HU_131 HU_132 HU_133 HU_134 HU_135 HU_136 HU_137 HU_138 HU_139 HU_140 HU_142 HU_143 HU_144 HU_145 HU_146 HU_147 HU_148 HU_149 HU_150 HU_152 HU_154 HU_155 HU_156 HU_157 HU_158 HU_159 HU_160 HU_162 HU_163 HU_164 HU_166 HU_167 HU_168 HU_169 HU_170 HU_171 HU_172 HU_173 HU_174 HU_175 HU_177 HU_179 HU_180 HU_181 HU_182 HU_183 HU_184 HU_185 HU_186 HU_187 HU_188 HU_189 HU_190 HU_191 HU_192 HU_193 HU_194 HU_195 HU_196 HU_197 HU_198 HU_199 HU_200 HU_201 HU_202 HU_203 HU_204 HU_205 HU_206 HU_207 HU_208 HU_209 +(2-methoxyethoxy)propanoic acid isomer 3.019766011 3.81433889 3.51969148 2.56218265 3.781921607 4.161073524 3.199174022 3.378109516 3.26452758 3.787490017 5.36371403 3.202345706 3.980345369 3.020293232 5.083462878 3.388718935 3.445549982 1.27650453 3.738547491 1.253594534 3.232847813 4.559559002 4.075948481 2.570748216 4.117811641 5.038208548 4.394350472 3.665845239 3.42296993 3.74546685 3.110957103 4.252742233 4.296284046 2.995377877 3.389971588 5.349114655 5.813374487 4.304743135 1.435768568 5.369591232 3.809431106 3.0110849 1.321147859 3.401176446 3.506978677 5.24237122 3.416889621 3.415584225 3.887678774 3.555974489 3.710985751 4.232236312 3.803661779 4.379572071 3.938310455 1.376325833 3.390271579 5.215817481 4.351838419 3.714724817 3.529736242 3.862848205 3.383427403 3.661146136 4.112188079 4.249731699 4.765467314 3.51532253 4.155850086 4.045784307 4.222815204 4.168351191 4.21782555 3.612098315 3.073157836 4.235420499 3.820636952 2.797679916 3.136688731 3.665614604 4.154569098 4.299336631 3.559309507 2.996742676 3.480758857 4.034741661 3.856739467 2.852684744 3.651373844 3.759574346 3.95537384 2.849099312 3.398179811 3.984515153 3.597414226 3.290898684 4.179746804 4.943696911 1.555387577 3.60408986 1.301552667 3.640714337 3.9838544 3.827632696 4.969533288 3.504223072 2.927962237 4.011233932 3.846480069 3.945182011 3.444671991 3.617341684 4.433665852 3.758001601 3.117921102 3.604887175 3.827127682 1.270341972 4.661967452 3.058563173 4.718036674 3.77969937 4.41111843 3.735829951 3.867366105 3.377810236 4.174630078 4.051745447 4.354188592 3.522532268 3.278058138 3.375142493 4.201257373 3.531025311 4.104608416 3.308431289 3.645655442 5.077657223 1.307713092 4.169713633 3.588749002 3.785980907 3.237049946 4.089354447 3.881406873 3.732585337 4.054073292 4.137363308 4.493012079 4.930648019 3.399303204 3.372649157 3.808510752 3.912572116 4.87526109 3.423336878 4.817034951 3.574103433 3.392706279 3.640266302 3.918027353 2.984720403 4.912949546 3.391126097 3.496992454 4.454290676 3.679442656 4.082141098 3.901748493 4.459292151 3.658028576 3.61865837 1.347192548 3.156817506 4.088827883 3.68482537 3.739437875 3.62621039 3.861325975 1.321648909 4.186987285 3.748127215 4.208859398 +(gamma)Glu-Leu/Ile 3.888479324 4.277148905 4.195649235 4.323759965 4.629328558 4.412266289 4.175236737 4.635271487 3.847144646 3.871586241 4.417740636 4.328564559 4.02953783 4.152376569 4.292682632 4.531347748 4.453076004 4.6291358 4.113221891 4.150947299 4.124072576 3.901047415 4.024811926 4.181515516 4.181368916 3.876389846 4.704956128 4.21159738 4.336920642 4.38187405 3.899552672 4.061643136 4.379398702 3.828154643 4.197557784 4.015019635 4.401325613 3.802961064 4.191430823 4.033966081 4.629557057 4.036365226 4.074358075 4.298537585 4.137887914 4.081451184 4.144428558 4.474804847 4.241676991 4.079688597 4.45979395 4.312246611 4.350598142 4.237664342 4.527419561 4.124084771 4.514244811 4.64306131 4.271454952 4.36397192 4.576486505 4.237029245 4.513324715 4.270510804 4.421063705 4.458245195 4.627969047 4.509811626 4.056176501 4.422448169 4.366316747 4.490622041 4.159146755 4.536378752 4.383857835 4.510287241 4.167334552 4.174861594 4.601433234 4.567295355 4.112488727 4.449374592 4.330871255 4.472058257 4.195670651 2.547586072 4.22097707 4.163925573 4.241035139 4.473772748 4.686731124 4.432171235 4.16038834 4.451110819 4.494920147 4.634499027 4.219155766 4.107579555 4.445377608 4.349982397 4.075422576 4.31829832 4.382325565 4.41358207 4.4568619 4.366357751 4.656853062 4.497583009 4.520452157 4.45554842 4.126441435 4.044901635 4.288916503 4.515312542 4.23005449 4.376616455 4.177676375 4.371806218 4.386378049 4.554152454 4.403703398 4.330703662 4.406347983 4.486475242 4.131251075 4.651977512 4.402084046 4.361771196 4.152777225 3.943570151 4.297440518 4.279994571 4.097546435 4.610586253 4.260938685 4.308325701 4.193526735 4.352079905 4.140745724 4.571828123 4.304399418 4.207251762 4.289434556 4.472756151 4.184599722 4.269607998 4.542199089 4.28525399 4.372047511 4.271733348 4.709122005 4.570667623 4.645108019 4.023056063 4.285770646 4.244340956 4.097054014 4.329710306 4.048329564 4.300926436 4.394476465 4.229841587 4.640003432 4.510502463 4.49765051 4.676359915 4.311101927 4.346944282 4.390929252 4.369701086 4.400757756 4.264071507 4.424354235 4.346125608 4.716491956 4.439047008 4.522890301 4.464620988 4.535947877 4.340933235 4.279162069 4.523763202 4.675880567 +1-Methyluric acid 3.869005757 3.837704025 4.102253758 4.53851996 4.178828862 4.516804994 4.180262737 4.036363075 4.29539342 4.39843134 4.529621208 4.110273903 3.739690888 3.783864332 4.126845744 4.512252909 4.310715632 3.876092627 4.5382435 4.400064971 4.405030617 4.576459192 4.607787677 4.199167663 3.811003723 4.553639696 4.086069055 3.982201933 4.061318954 3.884658556 4.388323909 4.433052936 4.303166583 3.850169946 3.663065812 3.928415194 4.442538201 3.723141617 4.320960083 3.868372811 4.278357531 3.931399948 4.394283723 4.191055566 4.015202218 4.451980882 4.013951422 3.746775861 3.947264897 4.424307688 4.440758471 4.080269187 4.026487851 4.448598045 4.50241562 4.185972984 4.347490309 4.307373715 3.930847424 4.449523817 4.735564676 4.355485393 4.44730007 4.261056169 3.984921096 3.695941443 4.262191156 4.385303993 4.438472061 4.331046708 4.823313661 4.465264163 4.084509398 4.554347486 4.26722868 4.20965944 4.165127819 4.77198565 4.206803554 4.438913725 4.373420662 4.496138427 3.856337995 4.538461252 3.73115281 4.271259447 4.233785487 4.243157325 4.617232016 4.709315012 3.453508227 4.049015989 3.840057964 4.612430619 3.766373797 4.591914026 4.199031236 4.308091252 4.224613455 4.807463081 4.014286513 3.280255087 4.029210425 4.479174189 4.241599707 4.515289394 4.471915472 4.570944429 4.251272306 4.596509423 4.2977884 4.424861011 4.301318819 4.313461316 4.371944102 4.288667814 4.446679482 3.932538017 4.407016342 4.369669037 4.28004355 3.297853384 4.398635009 4.583136658 4.380968695 4.36390834 4.434536613 4.432712941 4.560693661 4.759913511 4.219084518 4.361073776 4.503982338 3.784593694 4.477545231 3.850359954 4.68348388 2.662181085 4.718988601 4.102906315 4.392549368 4.423742606 4.582072605 3.630752653 4.859354755 4.355740885 4.900985415 4.567816307 4.898479707 4.454348708 3.839674974 4.257669308 3.794147563 4.326475355 4.348360167 4.432015659 4.529324069 3.913853716 3.777678946 4.78389024 3.97543424 4.031952376 3.813277842 3.414198616 4.164712015 4.079598029 3.238936288 4.258033235 4.678921556 4.183286887 3.323589951 4.328859696 3.742993009 4.672722618 3.97039066 3.789260832 3.847149987 4.654270418 4.235271882 4.617247195 4.475160306 4.360622075 4.190382227 +1-Methylxanthine 3.717258956 3.776851289 4.291665208 4.432216078 4.117359884 4.562051669 4.253087207 3.937694218 4.07128411 4.469453919 4.49764343 4.125096956 4.158616259 3.747657308 4.110164142 4.501070536 4.194719856 3.827925381 4.597539049 4.457819085 4.380920344 4.61981642 4.676615044 4.196067515 3.974259027 4.559835 4.062946123 3.839137596 3.912728389 3.738233471 4.383899236 4.408831223 4.246963978 3.807884374 3.340923823 4.024747325 4.45071532 3.675607889 4.280048842 3.973393044 4.353071085 4.017880056 4.467425724 4.108250444 3.98494054 4.377914817 3.738491158 3.565305684 3.865676726 4.309873284 4.472338053 3.848630923 4.045115345 4.328511452 4.500614773 4.155400977 4.39624587 4.321422633 3.992728016 4.470462089 4.737869502 4.392065917 4.546971152 4.050148879 3.788451056 3.211686468 4.175976015 4.256400205 4.488599419 4.336682808 4.823789899 4.494926636 3.847901256 4.458712813 4.236256907 4.153200985 4.231200685 4.811483812 4.063299933 4.472696463 4.328163572 4.513468938 3.772097818 4.538945508 3.30840287 4.226454037 4.156192857 4.287751671 4.583349551 4.722035141 4.316924553 4.085991725 3.959883467 4.549628588 3.542714311 4.540416704 4.167810843 4.381165428 4.223181752 4.822021587 4.32130313 2.694186083 3.929434012 4.402786086 4.231094166 4.364250731 4.383958629 4.645389513 4.155038069 4.586560661 4.376099254 4.513208105 4.245774401 4.272030227 4.365149093 4.179011675 4.399339843 3.856714699 4.268492041 4.332470507 4.00564268 2.817325291 4.413911031 4.536731659 4.205212138 4.452975667 4.618490572 4.429968084 4.573270407 4.889518527 4.050952184 4.352439712 4.65087298 3.468679301 4.488476532 3.89014596 4.7135781 3.225433772 4.772797873 4.110744482 4.337320441 4.445975513 4.714429798 3.544884608 5.092044037 4.367010672 4.975799887 4.431701776 4.937211032 4.349899864 3.667337583 4.056684453 3.609138436 4.423802223 4.401733884 4.508995674 4.500112742 3.967633245 3.859919235 4.729830725 3.911008167 3.977956628 3.741390882 3.137538537 4.309154588 4.06180723 3.418850577 4.196678738 4.672770748 4.15730105 2.749731915 4.24945651 3.592576776 4.717844658 3.906095974 3.594897645 3.847913791 4.693313202 4.1945088 4.612080805 4.459744366 4.357491415 4.209774566 +1,3-Dimethyluric acid 3.535461262 3.932581047 3.955376494 4.228491474 4.005544905 4.320581555 4.013865361 3.666724547 4.570381584 4.686482839 4.442089338 4.00906691 3.198911937 3.702778441 4.059331521 4.719267494 4.35239842 3.638961641 4.340513379 4.415213618 4.143482382 4.554092216 4.841897653 4.018662697 4.11013597 4.435338893 4.173841745 3.500046825 3.910175218 3.776445747 4.211320787 4.677791062 4.456304565 3.842990684 3.596449511 3.90278158 4.391664312 3.32944846 4.104350152 4.13774184 4.291891051 3.966725852 4.331607272 4.400939733 4.138128682 4.544795231 4.077609223 3.489006397 4.111269243 4.30790584 4.403463536 4.154601205 3.966873309 4.462060144 4.623939426 4.283646108 4.435652259 4.28711223 3.946339587 4.415669201 4.712400966 4.281408837 4.58368653 4.168365877 3.575031244 3.551973507 4.444643961 4.646473161 4.293853359 4.397658414 5.002172217 4.606453577 3.981214721 4.662710784 4.300286665 4.198236941 4.07769813 4.655290259 4.465476468 4.394372232 4.285404344 4.411250372 3.798698983 4.61969759 3.436564807 4.335265933 4.093751714 4.204482484 4.90038848 4.775732932 3.140600055 3.78182915 3.756559161 4.847256417 3.409133437 4.651272055 4.324683148 4.42535901 4.155374668 4.854366731 4.408416748 2.419214922 3.729881565 4.669381278 4.165641976 4.523536945 4.630965109 4.737408273 4.320295901 4.798007619 4.307316974 4.41918487 4.436520855 4.403887335 4.468039756 4.243672761 4.286572538 3.950548159 4.514956853 4.667219589 4.140606955 2.431676864 4.390701057 4.593296925 4.392804128 4.440356787 4.695108976 4.370928699 4.833067512 4.666683032 4.162739499 4.64392046 4.322519677 3.430301948 4.487336536 3.875425888 4.910834327 0.599641675 4.760466421 4.162707184 3.569821505 4.540350713 4.494474707 3.536814157 4.771297038 4.38313722 4.745349743 4.604235215 4.873802198 4.630135007 3.868843776 4.514266695 3.404195294 4.334259162 4.292046144 4.30287387 4.397143544 3.753656396 4.498580403 4.77115931 3.530034835 3.71304327 4.246996283 2.77016062 4.070320494 4.079316381 3.567098397 4.536291909 4.61043751 4.338026754 2.486308067 4.324914649 3.484586723 4.790234734 3.675000339 3.729555376 3.809869829 4.753736238 4.379127281 4.815899485 4.451929569 4.229554203 4.146196553 +1,7-Dimethyluric acid 3.325198822 4.025125167 3.972904281 4.109927073 4.024092147 4.32685618 4.197503911 3.997385046 4.459222667 4.636227778 4.420607029 3.945387493 4.25456669 4.131751075 4.048240614 4.427084584 4.146700265 3.377914646 4.459927064 4.349967505 4.087973085 4.483969656 4.495590599 3.818919353 4.302240019 4.394897151 4.298906704 3.703873611 3.913014438 3.937758149 4.355411274 4.6474585 4.389388243 3.832382894 3.817644551 4.035339385 4.328021888 3.671127042 4.349959467 4.169638997 4.219619346 4.322466695 4.34171365 4.187333936 4.268704692 4.297634468 4.201335591 3.804794141 4.134833036 4.341790701 4.376674196 4.125612259 3.87228714 4.297557604 4.312266601 4.299669257 4.408604532 4.000500035 4.154798527 4.311867797 4.565385637 4.305788765 4.530812445 4.22891051 3.815321914 3.4441312 4.187325612 4.483070413 4.503241588 4.284143905 4.766331272 4.520393709 3.791837124 4.487740885 4.343909557 4.089572119 3.821966923 4.65797315 4.474110959 4.43532289 4.16504335 4.476002097 3.879963175 4.413856388 3.345885663 4.371999698 4.082776003 4.145991373 4.564423725 4.423733307 3.503519373 3.865595371 4.124190694 4.685241686 3.444237446 4.523257363 4.39260327 4.607290219 4.353793102 4.761828968 4.518176923 2.163307758 4.163861868 4.566116389 3.959585588 4.049110456 4.521903613 4.50678045 4.355648415 4.701394212 4.290950695 4.277043087 4.538649434 4.334818188 4.271792797 4.014470895 4.556842564 3.967742871 4.368406512 4.564251065 3.985579648 2.759871231 4.409372504 4.379120848 4.159415835 4.331086214 4.242505447 4.313252017 4.651901973 4.785003062 3.925523446 4.469381782 4.433972994 3.4169402 4.501501586 4.028060275 4.836630262 3.244070182 4.577253288 4.181600124 4.547534408 2.839126384 4.711853027 4.009473759 4.819487895 4.305366823 4.747031087 4.205072593 4.940625952 4.539526502 3.984691731 4.381926955 3.507204213 4.360509083 4.55150832 4.404508772 4.486945743 3.727156246 4.019582594 4.775668757 3.777262289 4.114762699 4.159060888 2.638533639 4.284002092 3.977698 3.766492496 4.286871561 4.593320506 4.239927223 2.426748206 4.007362269 3.460572841 4.492864092 3.751305227 3.694703177 3.905566729 4.494405047 4.17254668 4.442710028 4.520598632 4.43895914 4.099095764 +2-acetamido-4-methylphenyl acetate 4.204754369 5.181858021 3.885679615 4.237914873 1.852994393 4.08068096 4.378655209 3.954104505 4.257704386 3.481900872 4.359334581 4.190780444 4.207212329 4.006990646 4.122870209 3.826902064 4.528368527 4.809730336 5.01538777 4.204697176 3.943419885 4.592455086 4.233076886 2.087977253 3.918253783 3.974957753 3.914812238 4.552178208 4.451459789 4.118236855 4.407493061 4.07387897 4.097586584 4.122564648 4.553495461 3.69674312 4.255931238 4.390154919 4.905184651 3.872156968 4.591283189 4.03586327 4.077002761 4.301386369 2.824425848 4.604272227 4.216319597 4.824775989 4.506770536 4.371755917 4.545632539 4.142422527 3.559730096 4.657566867 4.19246623 4.192391794 4.109052293 3.924438511 4.298091994 4.251218748 4.387445001 4.484052916 4.191487148 4.484741195 4.579868448 3.846091491 4.421678763 4.625427013 4.828889033 4.440887624 4.631682911 4.441164886 4.80656985 3.965987708 4.264889918 4.032613215 4.161369494 4.396891812 4.470114514 3.558332433 3.602714558 4.65406568 4.247915974 4.21470253 3.679898834 4.366544159 4.567982037 4.601002532 4.643655961 2.938055512 2.792946955 4.281278726 4.218627503 4.498343261 3.917366256 4.535112143 4.430967663 4.427217216 4.666577449 4.553871987 4.782272613 4.491546517 4.00023114 4.526811455 4.776329561 4.274720394 4.64895875 4.541337995 4.479996057 4.357458209 3.901187851 3.947001729 4.498837309 4.707525953 4.253546768 4.08453658 4.472385643 4.132050014 4.468058862 3.823215741 4.759228316 4.365270368 4.616853468 4.131956326 4.271961803 3.9079323 3.913860007 3.428155613 4.175638229 2.440543936 4.686472331 4.29531576 4.999270325 4.148608798 4.813925156 4.382689301 4.647067155 4.677953419 4.445722319 4.364495384 3.91633816 4.883832838 4.456177905 4.253328093 4.38928714 3.674417107 4.284504145 4.098569234 4.901800428 4.808331987 4.267059913 4.458888371 3.433280461 4.463491852 4.644050109 4.390649702 4.255130645 4.329093273 4.236368734 3.274905606 5.211479804 4.17802318 4.38755781 3.8939541 3.541473621 4.181840474 3.587742575 3.014278632 4.358245904 4.560378948 4.266306028 4.617655223 4.677735713 4.652596669 4.007108847 3.87593389 3.856115346 4.336053419 3.690396943 4.956675526 5.439831006 4.581057371 2.740433904 +2-Aminoadipic acid 4.080203824 4.35924574 4.249110618 4.231404241 4.323679299 4.244484932 4.123676821 4.262412224 4.163466826 4.143000611 4.287074542 4.180458777 4.1594218 4.091647817 4.406471146 4.211600312 4.310607376 4.998189223 4.50111645 4.372088244 4.274448934 4.761239318 4.040922353 4.395299373 4.350773089 4.247528647 4.343348689 4.424388086 4.213386208 4.16223373 4.149022111 4.287490359 3.919010052 4.08476233 4.422012149 4.191709573 4.310697502 4.133889325 4.405931304 3.947185614 4.151500331 4.13567836 4.380458873 4.169295762 4.065228768 4.280539554 4.455652199 4.339999355 4.462118671 4.264785362 4.290890259 4.335997952 4.644885616 4.217126962 4.384343259 4.36058507 4.340773023 4.38335829 4.210965344 4.174439234 4.568349481 4.454956874 4.296990791 4.52671481 4.096754718 4.72245046 4.519578541 4.21091423 4.166382229 4.407948351 4.734350167 4.588259557 4.55547504 4.498365796 4.210377278 4.404159224 4.315613227 4.214565197 4.14803883 4.418738226 4.414545721 4.289342093 4.252080088 4.287176282 4.569559653 4.344858253 4.169117434 4.308331645 4.109202981 4.180070648 4.572879199 4.397143071 4.481817442 4.614158811 4.228295812 4.449162282 4.205797419 4.479857319 4.484869922 4.390072816 4.423985504 4.290078425 4.469676552 4.243668508 4.347302049 4.642942407 4.622160832 4.33527645 4.394745669 4.245996277 4.207045333 4.212462896 4.273611553 4.3315668 4.33624573 4.323785125 4.376502318 4.384982029 4.677595881 4.386377638 4.544411014 4.354096843 4.411129155 4.397893071 4.307591978 4.266146911 4.328884728 4.271774608 4.456988959 4.45762652 4.485017846 4.475255007 4.436700217 4.311810671 4.450521569 4.415196344 4.552559986 4.38616773 4.37475152 4.272854147 4.418854401 4.211057275 4.227996157 4.320237325 4.289287063 4.378445365 4.586721642 4.600102101 4.7176115 4.287556192 4.415612524 4.564363922 4.169629332 4.365700355 4.506519884 4.279765628 4.175661147 4.176404023 4.488150773 4.225008322 4.947737368 4.622446845 4.46916043 4.834765326 4.316873597 4.46109412 4.250900805 4.31868279 4.687598237 4.557094514 4.198296767 4.164133654 4.28794234 4.20965854 4.313946634 4.259804328 4.398241568 4.237182176 4.44449416 4.566543054 4.454333566 4.477071372 4.43878969 +2-Hydroxybenzyl alcohol 4.560048648 3.158211998 4.290525486 3.644975587 4.095923132 4.428005291 3.88499543 2.29778171 4.704974715 3.658760562 3.656477698 4.168804205 3.711944592 3.904652936 4.111157534 4.279858699 3.923353919 4.311867641 4.028314927 4.557703567 4.287144157 4.069471989 4.893828836 4.013607577 3.507905893 4.333678863 3.89459861 4.02412563 4.020083362 4.034488459 4.242125384 3.563240594 3.996013737 3.921309113 4.139503394 3.944281095 4.46156869 3.978545611 4.672541048 3.926295988 4.203867112 3.828954417 4.089618139 4.396806624 3.067822773 4.229983809 4.155646675 3.400932219 4.433665419 2.634994356 4.240799527 4.072921786 4.139679903 4.350358684 3.7626697 4.665998376 4.372318256 3.917742285 4.075061875 4.383152906 4.413278189 4.609186357 4.378055554 4.088685263 4.549663466 4.192065438 4.68436394 4.557940768 4.390917367 4.037437456 4.850394393 4.353939636 4.547985133 4.370049098 4.564564956 4.596620322 4.520063507 4.625226353 3.757839127 4.288969955 4.329637216 4.338164487 4.178126136 4.406185041 3.007329748 4.060415841 4.529066532 4.525370963 4.599014588 4.765397486 2.824725457 4.213619898 3.565303799 4.29505462 4.209089394 3.935998869 3.681101751 4.418612724 4.285210851 4.50630078 4.301597631 4.450625575 3.191602378 4.436999415 4.035582593 4.80850997 4.508459046 4.369458293 4.004500442 4.716731628 4.381859325 4.614910359 4.637106597 4.060114275 4.450228765 4.272617759 3.640454361 3.378201177 4.198882214 1.977465551 4.295226139 4.295171134 4.353293385 4.616337784 4.372491233 4.016837996 4.225155776 4.411995661 4.332202094 4.861532898 4.314233983 4.601705143 4.486330554 4.567821018 4.575673556 3.910397416 3.852770568 4.149195035 5.344458036 4.445461616 4.42462981 4.132994954 4.565942657 3.274135467 4.654402543 4.175516272 4.626791699 4.509199498 4.939665842 4.44981347 3.824309322 4.168505625 3.963852297 4.419850134 4.371012521 4.272009562 4.698059237 4.344210176 3.765686265 4.827299705 3.676429585 3.417514191 4.122657655 4.124856321 2.875089837 4.138392274 3.447675466 4.447590759 3.462105504 4.313842945 3.982114746 4.104399648 3.359908159 4.626051268 3.870093037 4.129591957 3.532087016 4.544045928 4.147465065 3.991142461 4.189870376 3.766040725 4.201575095 +2-Isopropylmalic acid 3.466915892 3.942746313 3.539600259 3.152084457 4.490115602 4.156566875 3.919985176 3.824098897 4.177213837 3.3844456 4.059153929 4.361120067 3.206617961 3.889866941 3.011189135 4.859806742 4.118075697 4.999192435 3.249595203 3.634741156 5.096587998 4.44855343 4.13923224 2.581143091 4.430137007 3.768505152 4.696166424 3.164801249 3.527828973 3.813924179 4.000036595 3.238868105 4.408431097 3.93479592 3.084878897 3.498853423 4.87973726 2.780197782 3.788743441 3.336824826 3.84435935 2.818999629 4.189967716 4.412636601 4.070540911 4.801183226 4.233796978 4.653738517 4.366911703 4.183739882 4.997714383 3.615954044 3.401716018 3.526549117 4.119038383 4.500387313 4.062024419 4.162840206 3.44622448 3.785973037 3.860028815 3.71449037 4.905836242 3.915342732 3.034086017 4.548200751 4.560199161 4.606279963 3.630274451 4.231277529 3.927293653 3.259768911 4.18460959 3.979968727 3.863120475 5.139586321 3.866847323 4.36501917 4.701745545 3.837659751 3.175484712 4.544247852 4.018089048 3.419662492 3.715483311 4.740375577 4.35244614 3.459696158 4.588552904 4.076238082 4.31827308 3.658062486 3.676050686 4.220905856 3.637527974 3.962733601 3.803317696 3.43834458 5.066575808 3.25812093 3.154525105 3.397809604 3.69446916 4.525503852 3.423843078 4.029514344 3.896920721 4.683480877 4.33900512 4.629673397 4.301504835 4.576005403 4.64053805 3.472172061 3.43463972 3.803074053 3.792908564 3.954036122 4.032096686 4.375847256 3.274796374 3.974972098 4.45191124 4.261829829 4.343466789 4.047214784 5.153651205 4.80632967 3.671289738 3.769872345 3.585447838 4.111962221 3.975529214 3.69600546 3.685840625 4.722091697 4.282435724 4.013156313 3.339737546 3.882687099 3.499164095 3.856764327 3.646046863 4.494961273 4.194740728 4.40772563 5.000085357 3.841394258 5.19536541 3.909236303 4.674248223 4.091861895 3.047766966 3.619307572 4.238540028 3.858539397 4.206177447 3.334717577 4.020591252 4.17037437 3.36012684 4.336168386 3.979004426 3.950026694 4.216565961 4.00814167 3.923565461 4.02819114 4.583162258 3.918460666 4.188141737 3.934739415 3.542028654 3.858110904 3.845868791 3.712030185 3.776361813 3.943491628 4.360785384 4.495457192 4.320291731 4.894338254 4.470101336 +2-Methylhippuric acid 4.297716111 3.833793453 4.199261935 3.865259684 4.27122307 3.831930196 3.818268219 4.116614977 4.010124405 3.714125936 4.115347599 3.961512201 3.957246738 3.708261546 3.938108327 3.585296042 4.670860491 4.433260463 4.398469758 4.391785113 4.553186135 4.256565483 4.264486294 4.151369453 3.447717355 3.934395944 4.507601862 3.95956944 3.933408609 3.980383757 3.502999183 4.939482589 4.044485714 3.892022065 3.951354604 3.983911984 3.947184099 4.63006946 3.884871408 3.998942554 4.347038864 4.182268298 3.948766443 4.184655164 4.212668004 4.309528857 3.816587234 4.0644408 4.165350452 4.481438304 4.042294659 4.147446761 4.426169445 4.257760914 4.021172232 4.003365512 4.948525362 4.544622146 3.602858497 3.889584867 3.983138009 4.501376333 3.869808826 4.545920554 4.123038392 4.34212305 4.530950101 4.43857144 3.919128791 3.940697976 4.64943189 5.095099802 4.36473686 4.249491077 4.149394266 4.186380076 4.055368016 4.011216201 4.084230559 4.346414823 4.281721483 4.614819872 4.338826511 4.29926333 3.743496813 4.241357813 4.078367914 3.861133558 4.121344973 4.562870544 4.348932673 3.624094604 4.087846928 4.537479368 3.863327986 4.071390937 3.77291017 4.174750099 4.424984845 3.871664187 4.500272657 4.48216485 4.330528929 4.083827957 4.412975616 4.328061791 4.142474086 4.364016103 4.164240994 4.104539509 3.322190336 4.635438162 3.93488456 4.535661851 3.761744189 3.959208715 4.908909163 3.782016898 3.885410808 3.736046989 4.20502311 4.272754895 4.175378203 5.175702408 4.054672629 3.750379595 4.084868478 4.447462572 4.334471742 4.421616074 4.178299866 4.044490362 4.489016612 3.679110535 4.226552038 5.067355568 4.046114506 4.906024903 4.132194578 5.105177869 4.296475729 4.411679055 4.716501819 5.562505717 5.231592691 5.00944987 5.183815021 4.744007384 5.131478717 4.720548082 5.092624352 4.332976025 4.043335601 3.954211363 4.407216374 3.962732214 4.738078193 4.620976423 4.458225654 4.738988167 4.026354025 3.79041055 4.74056905 4.569042269 3.864793714 3.795689112 3.79925269 4.269908611 4.121515177 4.335103647 4.174135543 4.726121343 4.171182786 4.172055679 4.107050591 4.126756833 4.344034805 4.17845154 3.898080214 4.146697033 4.800618192 4.303678123 4.160976713 +2,2-Dimethylglutaric acid 3.799720356 4.19234167 4.146923616 4.233270149 4.755177497 4.33359873 3.891446712 4.534533975 4.367026531 4.381289604 4.107586527 4.230240118 4.063755827 4.270807068 4.510079979 4.280862199 4.219704662 4.024367485 4.177300067 4.524498726 4.228861417 4.599861229 4.252800851 4.419432548 4.100124233 4.283157663 4.448106469 4.217831408 4.184473098 4.376709915 4.752424734 4.443911851 4.529302716 3.80252268 4.129401036 4.16205046 4.34989951 5.249317385 4.089484641 4.043603325 4.305852041 4.148035084 4.20502496 4.468851489 4.289426312 4.272295429 4.587612782 4.603389065 4.379275831 5.08040087 4.34428522 4.665401 4.198540731 4.102976532 4.466339156 4.270545578 4.281858526 4.022179788 4.131678302 3.927403769 4.51153176 4.371961455 4.213380167 4.465299268 3.8988482 4.468517398 4.300360552 4.266470795 3.947081116 4.253037724 5.082887866 4.366971536 4.544129266 4.631167063 4.27224641 4.145264013 3.983343246 4.186249864 4.451611443 4.439933671 3.812199127 4.246498838 4.4466049 4.316700326 4.781731494 4.376821127 4.287628897 4.129890271 4.271188722 4.606776999 4.298733971 4.119793246 4.006587626 4.695235857 4.483149864 4.546877353 4.452230082 4.249916841 4.466011216 4.452661293 4.560812329 4.357251794 4.424346499 4.595007499 4.175085391 4.433839992 4.3930925 4.166249065 4.431192967 4.376702929 4.135984845 4.116866539 4.120679858 4.623401333 4.343793021 4.12807302 4.387708946 4.429037785 4.624485081 4.709736476 4.964646527 4.157678102 4.125803218 4.241305881 4.777696635 4.550950215 4.59379683 4.096208317 4.519870211 3.969381268 4.038186601 4.322471701 4.487434402 4.309441177 4.213801811 4.349486548 4.273827232 4.38961721 4.581010651 4.342064859 4.307414087 4.178775018 3.891456053 4.379908667 4.073768443 4.371209543 4.856217675 4.010278329 4.171709828 4.292175377 4.325313847 4.562633718 4.467594947 4.00641086 4.308923107 4.257518931 4.214263417 3.977058879 4.112625113 4.575768793 4.450577739 4.152831435 4.200451496 4.84149328 4.53443006 4.695069251 4.23483713 4.288991234 4.447872376 4.412384279 4.155046879 4.368462184 4.208306346 4.235477288 4.477394796 4.590931183 4.086511012 4.515310656 4.508231393 4.458355493 4.242826455 4.49623813 4.72165729 +3-Hydroxybenzyl alcohol 3.502957774 4.37005344 3.990813876 4.151259694 4.373424905 1.446237099 4.161600951 4.175691412 4.333414623 3.604361103 4.065173022 4.006826358 1.461689692 4.13795343 4.602938611 4.222632361 4.319823555 4.316176185 4.269907832 4.534762218 4.153499163 4.10214145 4.401083783 3.934819522 2.028952173 4.321014602 4.115158824 4.265450073 4.577106624 4.142287421 4.149935257 3.538985431 4.370772628 4.268322134 4.5926159 3.885258881 4.102971952 4.406897858 4.364355743 3.634262194 4.219106648 3.822422953 4.260249769 4.317807956 4.145613567 4.401864966 4.049213519 4.526431094 4.50786395 4.195686667 4.067248022 4.410006161 4.247739127 4.303036753 2.173602806 4.014347205 4.218573826 3.537467365 4.599249281 4.175812371 4.351761446 4.231685955 4.424586839 4.287510139 3.975306937 4.692682014 4.179834473 4.503376733 3.311708012 4.578732737 4.385102357 4.314520963 4.125838357 4.479133531 4.46955627 4.003779176 4.112515583 4.506980766 3.979520648 4.274323163 3.889963267 4.054525089 4.115934645 4.367254214 4.285880176 2.88142351 4.096926546 4.380551338 4.48989385 3.909933371 4.13189412 4.430486308 4.301280432 3.924391049 2.827751579 4.638346155 4.788764056 4.422116492 4.674092109 4.489413152 4.724655219 4.405152483 1.895924882 4.356968124 4.340176265 4.145353144 4.22929387 4.690595594 4.298471423 4.366117064 4.07300047 3.691901485 4.285242728 4.164826432 3.896317933 4.226588036 4.125816075 4.095323167 4.462737269 4.182535188 4.142440097 4.307814228 4.709650498 4.198763236 3.326949452 4.329735042 4.701274919 4.276780082 4.09082314 4.505710513 4.350430521 4.53598643 4.144759609 4.513096348 4.685830842 4.206386157 4.401494989 4.737557199 4.92663871 4.621228875 4.353757039 4.586052291 3.79749106 4.034759555 4.34184398 4.471941024 4.679330072 4.027062558 4.633137723 4.692113349 4.299337881 4.068138114 4.387968577 4.155694173 4.085336615 4.216048591 4.265717193 4.055107708 4.251726374 4.865189209 2.161266079 1.812776667 4.326405273 4.210519323 4.2431862 4.126390858 4.40889654 4.288048599 4.540105436 4.39776926 3.506129745 4.189687624 4.381284025 4.042624639 4.474057517 5.070073987 4.331236991 4.128685412 4.50050995 4.198684423 4.630386117 4.654391839 4.738578802 +3-Hydroxyphenylacetic acid 4.672720846 4.4901268 4.416154519 3.960911838 4.247531995 4.164327383 4.551696241 3.97076971 4.509400273 3.901836572 4.310386326 3.890507196 4.473985754 4.722715169 4.041185417 4.331662639 4.149130556 4.071424564 4.229220456 4.453683631 4.310652705 4.711755245 3.856335932 3.722110443 4.741444318 4.276859446 3.744626121 4.298471885 4.453581851 4.39554904 3.993151227 4.090969053 4.500995276 4.238006463 4.649282925 4.616411023 4.004764048 4.419401321 4.61221155 4.215638883 4.414913091 4.085800961 4.027523791 4.225935655 3.468941823 4.749085556 4.39732342 4.212266341 3.83069882 4.499428321 3.951047407 4.437529897 4.048802092 4.653477606 4.42048527 4.854533429 4.023638585 3.496824975 3.529906571 4.409303207 4.433968287 4.264683959 3.619605722 4.094002922 4.420971526 3.685798825 4.092457963 4.10923496 4.329052515 4.580414324 4.788555795 4.169624788 4.654683585 3.779403617 4.3394696 4.186621499 4.165309238 4.869200767 4.183131957 4.505150559 3.798975978 3.806090181 4.208331966 4.369916721 3.254837697 4.402221248 3.231459827 3.686985756 4.27618879 4.095623329 4.709402452 4.593703683 4.49665137 3.950837023 4.208066831 4.559783577 4.09040745 3.41014983 4.535189439 3.941470789 4.25623356 4.236771749 4.399764525 4.789858584 4.46658037 4.471473651 4.046312906 4.849314122 4.464463747 3.704428233 3.636665064 4.139049953 4.244400408 4.601692747 4.554710299 4.621043515 3.86539871 4.069201653 4.567997614 4.347322629 3.838764508 4.856407463 4.723997078 3.511308344 4.656239923 4.010489198 4.681764087 4.280630633 4.463404841 3.461376927 3.924501661 4.444886098 4.924413258 4.525255575 4.272571037 4.319151407 4.291472452 4.180640668 4.813613901 3.856781561 4.480897809 4.720040059 4.186164847 3.947689136 4.352622862 4.296767545 4.998691411 4.246827981 4.478351356 4.68038648 4.23622685 4.218245034 3.815163083 3.913666177 4.404550329 4.361462218 4.030009795 4.022334821 4.518821575 4.019780386 4.346452205 4.442889478 4.484854993 3.686499085 4.304278698 4.417984212 4.340139275 3.656849559 4.28529015 4.697373086 4.361999557 4.071701227 4.282727521 4.224352263 4.433077975 4.020273428 4.185461334 3.948778016 4.101459239 3.968214317 4.527180261 4.883937474 4.903423427 +3-Indole carboxylic acid glucuronide 3.548979394 4.344955331 4.174502666 4.688053299 3.276676449 4.206904567 4.771924437 4.740428773 4.076126378 4.234849569 4.315856984 4.42137969 4.17965253 4.544166547 3.636839072 4.204447492 4.394264893 4.24335178 4.741652638 2.907372616 4.236049199 4.465815064 4.196500055 4.347369598 4.185065277 3.716964358 4.249850905 4.330259728 4.356803051 4.221954347 4.051334933 4.10951734 3.872225597 4.217915728 2.948928545 4.414903926 4.237104511 4.140369855 3.90399322 3.927478574 4.198768443 4.248876378 3.892735753 4.137070809 4.006318039 2.924668139 4.402515116 3.782733464 2.82947231 4.393197826 4.076544064 3.674636766 4.275261027 3.327424035 4.853757457 4.100832155 3.477201085 4.44959175 4.408133437 4.36592118 4.324796729 2.545024709 4.30570518 4.335971694 4.321949661 4.578466484 4.090408012 4.440428732 4.17607172 4.292501129 3.129553715 4.050977157 4.26856917 4.457114802 4.216856465 3.554486681 3.863587919 4.255577882 4.423725882 4.428418909 3.821875999 4.11367142 4.337553787 3.119405434 4.260702366 3.312039595 4.109719672 4.797506086 4.321943121 4.233675401 4.153268517 4.329446034 4.435889021 3.600232558 3.669269569 4.335654212 4.265966454 4.246827355 4.461573544 4.296277145 3.065586259 4.408140368 4.44649887 4.039571264 4.280040744 4.291259853 4.376228963 4.364924896 4.282753228 4.554501375 3.939403376 4.181652502 4.203271713 4.430622815 4.305206562 3.939873589 3.874323344 4.251637365 4.053833577 4.316671786 4.615966181 4.345570355 4.310854757 4.220822475 4.119071482 4.32486217 4.320312515 4.075631684 2.865296862 4.037026916 4.29517541 4.351658917 4.145150049 4.652210697 4.184330762 4.245888144 4.579376613 4.409887182 4.194192022 4.130063877 4.465816561 4.274176642 4.210028089 4.329325588 4.028962576 3.93600548 4.332990246 3.764249607 4.505433955 4.090088423 4.242462819 4.304032965 4.283208372 3.9012552 4.620580231 4.399790714 4.347395352 4.155054377 4.333239455 4.225075639 4.800076302 4.386136963 4.371775466 4.246973219 4.384927964 4.10825041 4.071014009 4.686165579 4.597570003 2.683604211 4.469529051 4.086926142 4.195227868 4.206733025 4.328314358 4.350808963 4.254593625 3.922181571 4.27161118 3.574158953 4.329430429 4.369302543 4.286557033 +3-Methyl-2-oxovaleric acid 3.956109582 4.062869743 4.420564858 4.146151946 4.351114234 4.341493999 4.25114372 4.696322137 3.83399325 4.139277624 4.217707219 4.654425551 3.926207795 3.910270523 4.428326978 4.341312422 4.328824046 4.663658646 4.241869629 4.215471125 4.15762763 4.350581938 4.052565093 4.338432606 2.164714777 4.067598819 3.891002615 3.895416207 4.091738469 4.320906852 3.565483575 4.281548234 4.472513403 3.722208464 3.834262143 3.943208528 4.392378403 4.563657906 4.376786133 4.301294709 4.175999548 3.506407981 3.968028443 4.373155374 4.283629864 4.200790126 4.092219364 4.133175373 3.920090012 3.649362953 4.518742785 4.017656111 4.362624333 4.278503991 4.343710436 4.576152994 4.087294682 4.607182584 4.539837962 4.381309975 4.615523116 4.095589017 4.608870554 3.88530618 4.410913899 4.37165786 4.449444491 4.321594347 3.315632 4.403590821 4.565594124 4.413600788 4.41941824 4.591421008 4.452729512 4.541426359 4.076411711 4.567071891 4.388988213 4.5506408 4.22775919 4.320009706 4.469884215 4.425905864 3.955203774 4.357524813 4.103526401 4.339566101 3.96599517 3.820411615 3.944625483 4.248451963 3.874312711 4.620726366 4.72559325 4.635963845 4.123508426 4.573368141 4.652007981 4.20681848 4.376135531 4.144775043 4.316029591 4.323048824 4.442121374 4.067993461 4.203714012 4.178974156 4.466630084 4.563818778 3.92902137 4.195917503 4.222037205 4.584675698 4.617336426 4.494100027 3.950509653 4.410928213 4.158973281 4.616802951 4.417535769 4.415141496 4.470069762 4.602413831 4.190076692 4.536826659 4.121456995 4.53806738 3.972929806 4.018768682 4.168477982 4.521909181 3.547025587 4.036158025 4.18736304 3.939023119 3.753266461 4.446536253 4.5092509 4.705890938 4.278187216 4.355888393 2.909561091 4.404364282 4.145713835 4.245693071 4.67542521 4.192429739 3.968655734 4.306019467 4.588296597 4.186277331 4.503354565 4.323767975 4.0719231 4.179038778 4.0778433 4.583135788 3.697087637 3.992550542 4.113428677 4.216892818 4.794812965 4.435993054 3.902553618 4.174137338 4.173702368 4.314891818 4.086786698 4.427232603 4.366568212 4.117092893 4.421819612 4.136736129 4.276374753 4.345454483 4.114463473 4.253379305 4.321193012 4.488845993 3.947477862 4.460427565 4.342697186 +3-Methylcrotonylglycine 4.204464698 4.055143765 4.14809497 4.193129846 4.225719751 4.127074465 4.103336743 4.225448498 3.904234939 3.94232418 4.423787376 4.278320668 4.194748157 4.044521946 4.411209619 4.038121416 4.348551513 4.52912785 4.839488626 4.493140379 4.211723992 4.684327087 4.179692695 4.127424334 4.178495202 3.842876175 4.321372488 4.052981495 4.183403917 3.941508017 4.168870802 4.361500973 4.143430227 4.104063703 4.381286083 3.863367336 4.040132521 4.274003917 4.21381908 3.663488215 4.423888139 4.213950632 4.119900155 3.898918034 3.839954042 4.287789646 4.294271376 4.263095071 4.401838015 4.476488912 4.251172472 4.282048334 4.313249647 4.395180342 4.398671503 3.614752007 4.333134396 4.671442832 4.230918214 4.340691032 4.352519256 4.509243031 4.187300943 4.668849096 4.602181912 4.679271076 4.438960639 4.416745773 4.011701566 4.311648933 4.50932991 4.637426435 4.506270054 4.616910199 4.38600183 4.286931711 4.332916475 3.961139013 4.274801885 4.388284355 3.958098748 4.223533257 4.317207309 4.360337818 4.342839115 3.587617671 3.956047156 4.368429427 4.410493134 4.335836363 4.462518926 4.189731075 4.050093076 4.697175687 4.540230053 4.538955599 4.025882478 3.833821604 4.477488307 4.405061036 4.242007917 4.453576906 4.630525793 4.245935097 4.548353382 4.337492584 4.450603502 4.562491769 4.14267008 4.170732329 3.630183439 3.927080303 4.349143586 4.744933513 4.23557111 4.331268243 4.077593319 4.289207244 4.563351495 4.532282648 4.290656919 4.523253117 4.485981365 4.582982979 4.339964701 4.194069813 4.351277135 3.995833082 4.3673905 4.07356114 4.630468813 4.285108136 4.232087089 4.340869491 4.595634314 4.435185876 4.233268893 4.305539467 3.926284575 4.205904918 4.302032238 4.713304 4.290332985 4.578524487 4.858087851 4.61166802 4.35750003 4.402636497 4.706946409 4.344601186 4.498795814 4.571215149 4.373280462 4.268513962 4.482838737 4.652116957 4.481216263 4.347919334 4.651231493 4.562998891 4.508041429 4.177179275 4.437261725 4.504838923 4.357207295 4.414256032 4.282859073 3.848887826 4.569927252 4.680841851 4.578390642 4.052933847 4.531072423 4.533602767 4.296428325 3.821542684 4.710922299 4.04738229 4.121745201 4.178401605 4.774725121 4.632197058 4.485803556 +3,3-Dimethylglutaric acid 4.223994451 4.486961239 4.137063024 4.200239029 4.569052298 4.195226443 3.928428448 4.398111469 4.477726771 4.231028753 4.259191383 4.236527395 3.842022029 4.236760998 4.272755245 4.446509024 4.331235778 4.253683368 4.380888669 4.353332721 4.197688317 4.619576804 4.364526206 4.209663683 4.1881105 4.28967549 4.405320266 4.02018626 4.289619949 4.315973811 3.964389276 4.275385951 4.23823965 4.027437667 4.292310287 4.409746291 4.276160396 4.16977214 4.461294622 3.975853312 4.136691736 4.224158977 4.334757042 4.066569871 4.461451105 4.31623956 4.476118383 4.691952301 4.533628857 4.243975651 4.236787131 4.271200094 4.262009925 4.298576999 4.403414494 4.40237992 4.204862948 4.138665903 4.302679662 3.759237685 4.636537894 4.082255129 4.125460013 4.363751157 3.744447735 4.542968521 4.241157101 4.060841489 4.382820095 4.067492368 4.853112015 4.334695646 4.476312501 4.345076441 4.338817999 4.061684464 3.915114466 4.388279428 4.363470921 4.461400368 3.861509986 4.052339476 4.298716985 4.303473469 4.675768044 4.84397278 4.104708782 4.469723762 4.015182158 4.538760259 4.357647849 4.416183213 4.2606853 4.691393272 4.305784173 4.655477444 4.499526101 4.310810023 4.420564856 4.425133175 4.815105141 4.250256074 4.411911837 4.516089423 4.003569545 4.289097055 4.391915882 4.132356636 4.378888039 4.364889082 4.042546902 4.154819149 4.561032161 4.536066844 4.363186132 4.377852902 4.244712626 4.138050861 4.700666879 4.901810052 4.924416725 4.127692373 4.336790786 4.468874966 4.293339008 4.685017562 4.539658775 4.148376253 4.542924615 4.189946528 4.151688511 4.373758567 4.494191322 4.792693157 4.134575648 4.424163133 4.310917664 4.492178757 4.639322891 4.210931845 4.036359523 4.484102337 4.043609793 4.220532643 4.389779903 4.445841944 4.70654342 4.105193859 4.516347829 4.366061344 4.280233154 4.354147804 4.210143393 3.977506199 4.420911615 4.376419877 4.037961321 4.036758099 4.078368455 4.424304802 4.356009986 4.284951494 4.326973477 4.667656079 4.638851669 4.793321348 4.716987183 4.337003095 4.187603841 4.649158324 4.160762644 4.190743391 4.030722751 3.957914084 4.409050177 4.604899241 4.095623617 4.524058077 4.281717053 4.601315139 4.501784065 4.577002318 4.679023519 +3,4-Dihydroxybenzeneacetic acid 3.400453527 4.366694586 3.965742094 4.121298479 4.373746741 2.320550279 4.155087233 4.166003141 4.288844874 3.527081163 4.087601772 3.83941092 1.4428604 4.07828042 4.614126918 4.352865062 4.362276741 4.292730992 4.355644021 4.535898446 4.171274894 4.092492957 4.406894362 3.902789058 2.887021931 4.300850021 4.166401275 4.271747779 4.467376172 4.136900025 4.0939363 3.6478244 4.351900033 4.267288241 4.618268347 3.94343261 4.111790335 4.389125526 4.323078207 3.812178008 4.260296134 3.793783955 4.266652023 4.25075863 4.165339479 4.399128428 4.051848535 4.565938736 4.541826911 4.147504426 4.076819249 4.420949361 4.26206994 4.316080317 1.630670608 4.047552918 4.257935115 3.680710833 4.588435235 4.218595892 4.269395076 4.288908631 4.469354529 4.312870354 3.921149689 4.753437615 4.101728659 4.509294615 3.793871231 4.521745027 4.451931818 4.28627721 4.140160047 4.515708686 4.517028663 3.980845917 4.114089642 4.495974651 4.001853979 4.261429547 3.868196419 4.13746299 4.566332539 4.347346865 4.292850768 2.915021531 4.085065022 4.366252519 4.284599635 3.965654009 4.115871497 4.44955108 4.296315005 3.912451345 2.978119426 4.654718528 4.80429937 4.365144373 4.582728781 4.492280681 4.719274146 4.445232689 3.621648934 4.333640183 4.332530037 4.170880281 4.210891373 4.712798998 4.250079151 4.321374496 4.064095229 3.593633375 4.224129166 4.155013328 3.882297396 4.248763998 4.051245995 4.100269032 4.438241214 4.237909144 4.267540499 4.33483205 4.748587155 4.5228978 2.811576812 4.341741128 4.502339992 4.222792969 4.055269517 4.666280796 4.355340533 4.436736054 3.31102734 4.40000333 4.622409486 4.287823774 4.376750217 5.009557966 4.941270403 5.043833511 4.385725676 4.614337752 3.972776489 4.104578853 4.295092327 4.289815583 4.659721561 4.211160963 4.844752171 4.78787171 4.755273597 4.102565901 4.322781461 4.125510721 4.008490615 4.356043834 4.35414034 4.406781795 4.162585575 4.791855302 3.036066943 2.910924904 4.428201464 4.228056694 4.30140338 4.095299539 4.471035684 4.293040242 4.614028362 4.329826649 3.311804477 4.230916526 4.324650918 3.918639723 4.375159781 4.860022574 4.323752663 4.019973598 4.574970578 4.234485623 4.515669832 4.410269225 4.664951607 +3,5-dihydroxybenzoic acid/3,4-dihydroxybenzoic acid 4.494137556 4.11802084 4.284273559 4.11824787 4.077463029 4.107162683 3.826772088 4.248928073 4.559851332 3.685253548 4.313732951 3.827369623 3.728988315 3.805395447 3.933624607 3.800998621 4.118473478 3.880411853 4.438077349 4.276377226 3.8857113 4.167690568 4.584571612 4.285849549 3.940075433 4.484562815 4.118566411 4.014156468 4.571263565 4.292501459 4.294036919 4.121694167 3.931389642 4.396498618 4.269192292 3.783484495 4.26711309 4.393563183 4.772591028 3.329114305 3.867683205 3.290769245 4.571153679 4.136408212 4.020422071 5.052166557 4.046812184 4.023754228 4.383728136 3.852105514 4.795892303 4.080139907 4.207531411 4.049061391 4.12456187 4.408350966 4.444472249 3.292129559 4.425441704 4.031583942 4.819585441 4.013106754 4.25417306 4.529661106 4.653088261 4.426961616 3.60831389 4.343848816 4.857776127 4.845988308 3.846131839 4.254953484 4.091166509 4.29920802 4.543111046 4.313915304 4.14579985 4.587859501 3.959822658 5.146347318 4.32680681 3.840946691 4.345820501 3.854781873 4.355970131 3.855826276 4.087002844 4.611434603 4.291965694 3.96914335 3.999288516 4.788976987 4.257131641 4.065690706 4.233160816 4.313470673 4.161492226 4.411647145 4.138981981 4.378335041 4.358598789 4.570131858 4.001930539 4.223620588 4.273880257 4.441037467 4.089375912 3.83618004 4.02267456 4.191616778 4.318386904 4.598599321 4.009319723 3.982401847 4.571752994 4.066429179 4.080516138 4.668447172 3.988691212 3.975488152 3.808331844 3.971362846 4.510148397 4.466740132 5.10476336 4.478954978 4.313689807 4.255669056 4.340241944 4.903116143 4.624094488 4.819499609 4.937943894 4.434234567 4.387249502 4.55934006 4.817008286 4.515447738 3.88453049 3.849804191 4.507394812 4.154634826 4.690467764 4.590421992 4.827672921 4.392136761 4.379836973 4.914118647 5.211092172 4.474585185 5.021738731 3.806880093 4.13419859 4.68124109 4.322069821 4.546384036 4.791683133 4.175266232 4.080163651 4.792890513 4.497010908 4.013518235 4.144770429 3.592244738 5.041721545 3.67646823 4.211380244 4.573072789 5.64780865 4.545946544 4.335388577 4.254991615 4.657523117 4.679560712 4.025768422 4.755688114 4.515715981 4.270872721 4.176130612 3.898349768 4.41049841 4.22624615 4.580002794 +3,7-Dimethyluric acid 4.233819668 3.596650747 3.954021738 3.995038988 3.908515001 4.72060297 3.763223501 4.283161127 4.720718327 4.122026419 3.809710012 4.389594052 4.428302993 3.147436562 3.885685117 4.387075686 4.635101143 4.400658339 4.159732752 4.790743125 4.07033603 4.003527465 4.287021884 1.383567399 3.302388516 4.958002076 3.984321529 4.108395077 4.544899485 4.833998354 1.540616732 4.524293139 4.340068406 1.194265667 4.299306303 4.38244021 4.491749111 1.68838143 4.660634596 3.304030673 3.785955614 1.317827313 4.050496697 3.949964541 4.255978348 4.349155358 1.412001152 4.965487428 4.070255509 4.523685708 1.069508355 4.315146238 3.400765104 4.603886929 4.463336698 3.456543371 4.177057784 3.655054961 3.745985138 4.587734941 4.986658811 4.102672879 3.96341199 4.379605861 4.722250377 3.855110531 4.37259197 4.263296094 3.775578775 4.714168539 5.032114685 4.044701612 4.405183801 4.887925919 4.407420143 4.404972861 3.456411511 4.191139051 4.379515672 4.475276099 3.606635868 3.956478999 4.550430071 4.391365983 3.441136101 4.186086739 4.396105031 3.490233977 4.304671052 4.625879294 4.084001355 3.365622613 3.545970697 4.387696203 4.018167804 4.655106236 4.57488379 4.361717325 4.093973649 4.128848496 3.879626672 3.568675858 4.802552286 4.753253743 3.611644019 4.159493692 4.10963911 4.408943088 3.891643962 4.999201682 3.645211464 4.024172829 3.90126422 4.42409331 4.020759552 4.553610257 4.232421125 3.683252707 4.979139807 4.2854478 4.200072874 3.863459278 4.570950784 4.923713225 5.032177976 4.154009297 4.034867213 4.255791263 4.841916446 4.113248453 4.483454203 4.625247948 3.871753491 4.548389506 3.962707211 3.729274523 4.998226873 3.068024101 4.121057403 3.917579864 4.298218099 4.533291834 4.028820256 5.012636779 4.142225365 3.829981463 4.271257701 4.304216507 4.07599008 4.659205177 4.667170494 4.399322964 4.608305748 3.747654281 4.091481368 3.892756382 4.524930588 3.621537529 3.133751862 4.873938824 4.716057294 3.64731765 4.250641299 4.229273016 3.923502331 4.513761671 4.172227083 4.566648188 4.012111966 4.807527283 3.863335845 3.850150472 4.639140762 4.627430545 4.934139844 3.944413469 3.792999612 4.238126072 3.742845522 4.463311908 4.358035063 4.207611713 4.272498789 +4-Acetamidobutanoic acid isomer 2 4.046984191 4.218430715 3.995719199 4.006450055 4.564357484 4.193067575 4.084182572 4.182949167 4.317084732 4.095378812 4.23009087 4.187882902 3.921403537 4.053804758 4.28655102 4.184982328 4.381222132 4.513639307 4.120956724 4.436384942 4.089348744 4.530976983 4.247661363 4.050937541 3.990693948 4.213626932 4.325045895 4.021074071 4.37338749 4.457348259 3.660512479 4.231404112 4.257446942 3.892403931 4.395069333 4.231695253 4.285512962 3.868051455 4.320013842 3.617975305 4.237931025 4.01779192 4.267510074 4.405452469 4.035392914 4.442477311 4.28471817 4.485183307 4.461169616 4.138522051 4.310405953 4.489559655 4.174591494 4.479224904 4.194314745 4.382179221 4.278955617 4.130442352 4.36933243 4.284318066 4.312723721 4.410047215 4.410251484 4.356425933 4.40005141 4.587860397 4.539085169 4.458173474 4.119064298 4.447864488 4.824213764 4.279746508 4.548438294 4.516965 4.371431058 4.196533581 4.213155537 4.184238244 4.438623217 4.422029871 4.230809179 4.279322149 4.322546573 4.524856567 4.272673778 4.390835975 4.235396425 4.190286383 4.494926116 4.294850109 4.075211675 4.066563229 4.1042014 4.426711184 4.417301054 4.391005538 4.487588308 4.554249981 4.670753138 4.376841626 4.541686374 4.45418927 4.208695927 4.804347023 4.359958553 4.409789546 4.45732835 4.386920214 4.361857422 4.453072644 4.092556977 4.246376892 4.584191677 4.332113847 4.383618537 4.347307185 3.860424588 4.386759974 4.489257507 4.508129904 4.664500778 4.412255722 4.329691011 4.339267111 4.487241812 4.145107063 4.396650385 4.204874882 4.507990816 4.249760026 4.4285681 4.267440501 4.143883681 4.513200429 4.510367478 4.123903317 4.48239156 4.435355273 4.400960313 4.406412486 4.323763901 4.189530409 4.007890679 4.345290597 4.034261611 4.343940542 4.433892835 4.274703332 4.374078083 4.303829572 4.33960832 4.439257188 4.253818293 4.044539459 4.225287465 4.252018922 3.999896842 4.223827489 4.098096911 4.321441404 4.473316493 4.271209646 4.48296281 4.464778809 4.213264144 4.331730705 4.42795216 4.446038221 4.532517908 4.452793759 4.374463204 4.216498296 4.285912086 4.257342785 4.376601689 4.404927726 4.537615253 4.418529505 4.277338191 4.467103706 4.408705883 4.328763816 4.444397594 +4-Acetamidobutanoic acid isomer 3 3.964379663 4.08786518 4.031485074 3.884680994 4.347508931 4.040540801 4.194199054 4.036494654 3.875014907 4.049588051 4.205857655 4.379372477 4.022572081 3.660633758 4.398634404 3.672229185 4.118429048 4.00960616 4.828723817 4.613221582 4.113298436 4.682212011 4.104475574 3.95786585 3.978244384 4.070645263 4.204408536 4.074902255 4.218329798 4.006376436 4.074720967 3.898995392 4.165778675 4.105888586 4.610515958 4.320548236 4.029408916 4.18048468 4.361099422 3.692960374 4.348624122 3.820316238 3.842834991 4.268791337 3.680824251 4.468762761 4.351358248 4.282937612 4.681423772 4.324351632 4.267923861 4.240251948 4.492540829 4.480032781 4.28118044 3.868701277 4.675254268 4.476082173 4.484449792 4.393662295 3.845461247 4.557769531 3.990732862 4.444154653 4.687089512 4.843114842 4.249428158 4.45100122 4.287329238 4.25217372 4.583709535 4.404656988 4.501975365 4.239030055 4.486439256 4.254114978 4.527111208 4.153799155 4.200645849 4.38711602 3.752254425 4.261181307 4.318593092 4.511161602 4.032102112 4.353635788 4.015983775 4.361189297 4.468550171 4.111963659 4.277631389 3.801880022 3.908590818 4.532790429 4.511344472 4.544905464 4.071497157 4.388034101 4.657869494 4.173391102 4.319690186 4.467360906 4.558514107 4.054228927 4.621686878 4.380129623 4.259620678 4.285677784 4.113809817 3.900315285 3.658178346 4.120141564 4.374837273 4.784216762 4.145699468 4.176793582 4.002308717 4.349385665 4.37625181 4.359626778 4.158856882 4.519319794 4.513757457 4.226634256 3.761009992 4.224383105 4.453110801 4.15010821 4.713836081 4.094670468 4.805845437 4.276686291 4.551350206 4.522418535 4.670638677 4.420084616 4.266928207 3.780457576 3.870209294 4.295223785 4.154199244 4.800310529 4.312027241 4.120742116 4.708195226 4.909539936 4.354453711 4.179082686 4.789036666 4.296075753 4.379392451 4.626334975 4.350567813 4.410954321 4.456481255 4.534082279 4.53432229 4.822724792 4.547049003 4.316371953 4.437482217 3.925663356 4.628199957 4.173228012 3.983036958 4.700482915 4.16840917 3.955276575 4.467925079 4.785239418 4.624936768 4.459212459 4.590207747 4.487473303 4.411005353 4.019506846 4.560177633 3.903360676 4.036534772 4.058492936 5.006801452 4.496587215 4.507963647 +4-Hydroxybenzoic acid 4.581811302 4.675483139 4.248247699 4.171788269 4.660292988 4.335561109 4.158905332 4.217291286 4.192658629 5.313806874 4.154890504 4.591828324 4.763827966 4.203545535 4.422072436 3.872188525 3.967061946 3.811538343 4.288530074 4.300369646 4.033590413 4.486295668 4.003095815 4.354294657 4.804813659 3.893758243 3.673271702 4.231847255 4.053907764 4.303289931 3.780478597 4.576504957 4.511372828 3.903898519 4.48193787 4.027467985 4.072823195 3.31693697 4.75635731 3.897989486 4.31916228 3.590699113 3.808284297 5.010227519 4.158168773 4.233653523 4.230850775 4.32400758 4.41300055 3.973748033 3.873713121 4.1682523 4.257059582 4.495689071 4.634977036 4.101350801 3.721010886 4.553204776 4.882051642 4.20990738 4.203094018 4.321125813 4.462849161 4.271314871 4.458024309 4.145075629 4.318390585 4.192059346 2.182092227 4.943666352 4.57564715 4.224812189 4.880148859 4.563012829 4.031356173 4.049699941 4.267361502 4.939007689 4.434860938 4.578717827 4.40581042 4.026954503 4.455884915 4.035032762 4.195069378 3.746834682 4.398738106 4.1281152 2.106646581 3.360880903 4.634556763 4.320897307 4.429097807 4.243190227 4.524590407 3.908150254 3.868693933 4.341637123 4.682836143 4.375774715 3.978857437 4.814156857 4.849036385 4.48262698 4.300082106 4.682447364 4.262916538 3.982102523 4.729284114 4.170692171 4.202133681 4.274903577 4.538123152 4.367899258 4.157755534 4.235565467 4.053206959 4.301387503 4.31846397 3.924718321 4.599187408 4.08698162 4.13479664 4.098872063 4.578524795 4.453561075 3.351977018 5.148366394 4.26044112 4.09071734 4.183231583 5.085742738 2.367196954 4.315319978 4.707464177 4.179758405 4.570113657 4.503382303 4.189043063 4.710212795 4.540126781 4.318825414 4.656523959 4.706096206 4.78772653 4.709952208 4.549214255 4.116257062 4.342067459 4.062949624 4.123153406 4.22447608 4.568082358 4.269139479 4.355879155 4.484963035 4.535239529 4.457961356 4.299508895 4.406927538 5.031283459 4.491437861 4.391319723 4.307444939 3.993331365 4.301779623 4.365054758 3.995207866 4.495517781 5.248657755 4.791849547 3.990776258 4.32190868 4.21223186 4.571436725 4.516589827 4.33407653 4.183686787 4.287649313 4.322858841 4.686435794 4.625270971 4.889035099 +4-Methylhippuric acid/3-Methylhippuric acid 3.242186003 3.838006782 4.72389994 3.617350025 4.285847985 3.430341658 3.299994191 3.854158016 4.265667707 4.048860639 3.63506772 3.392771507 3.775575079 3.311462062 3.53486388 3.563054316 5.035692923 4.830488559 4.056129508 3.719104605 4.875061052 4.043001872 4.727923517 4.678198974 3.261332451 3.787440062 4.380707911 4.239506318 3.489953099 3.681724472 3.423700192 4.359213306 3.705276227 3.863801319 3.579115902 4.232934267 3.989144706 2.828714793 4.053322263 3.820650008 4.51670496 4.218154089 3.55698928 3.796179827 4.333344346 4.536109552 3.746730544 3.66862487 4.372877689 3.252182892 3.565487018 3.907467492 4.699838252 3.670167781 3.915211333 4.427240203 3.351711117 4.811761225 3.660818779 3.772154463 4.043751084 3.681462395 4.046173841 4.766900484 3.334301292 3.670113885 4.772820797 4.29531449 4.009630073 3.684002784 5.06283207 3.606905789 4.637433468 3.94127773 4.354952338 4.692823421 4.774194503 4.051864436 3.822909786 4.001355377 4.980129187 4.813669149 4.278915464 4.687543956 3.920432975 3.801401222 4.901679599 4.057478919 3.714000783 5.093593795 4.030363802 3.328740345 3.430189544 3.542149991 3.655292633 3.503782986 3.37931069 3.762022106 3.560671747 3.87060195 4.724289142 4.41258113 3.372111815 3.962788403 3.219974957 4.785031095 3.887703819 4.702313985 3.730125479 3.786802173 3.478025574 5.20801647 3.693294271 4.49022399 3.88518362 4.532512622 3.197668064 3.281755451 3.37419129 3.528354223 4.595557339 4.749444095 3.504930408 5.173401623 3.931227024 3.479985272 4.226737937 4.702685986 4.001274884 4.971668661 3.687486187 4.329314088 5.294186853 3.537910121 4.044053834 3.676656854 3.822865323 3.767560185 5.042959984 4.092715266 4.347503407 3.937558576 3.602162922 4.127888029 4.389736764 3.967645353 4.864923095 4.482998797 3.849137235 3.722760424 4.097405622 3.801103146 4.359246736 3.729735225 3.872254813 3.995832662 3.97308427 4.936669457 4.676381219 4.02374129 4.066187388 3.354891009 5.057644087 4.825774615 3.576691133 3.493179353 3.879089606 4.154666427 4.007812106 3.886082086 4.24066354 5.085789311 3.910099143 4.355648821 3.723214092 4.216404892 4.233587011 4.666871163 3.915717946 4.546429675 3.939016015 3.957332107 4.057366757 +5-Hydroxyindoleacetic acid 4.307544634 4.402027321 3.975412924 4.168655287 4.502182007 4.281092309 4.379544372 4.495214357 4.105822327 4.189521506 4.31557039 4.481418433 4.29019838 4.253033853 4.318097284 4.075345642 4.439765435 3.9553326 4.348066534 4.18649514 4.17229603 4.346000095 4.193838513 4.475751276 3.665663721 3.34642612 4.419010323 4.310290823 4.337410028 4.372171442 4.145700632 4.234054384 4.313765855 3.880743176 4.694964778 4.383580541 3.953211042 4.34353278 4.370746189 3.817267901 4.322195188 4.171778471 4.280891334 4.103565952 4.180887538 4.612846275 4.279364752 4.285976596 4.228049104 4.635537624 4.128319085 4.579574541 4.205248266 4.570477036 4.313653162 4.282795318 4.252929171 4.321199671 4.539354291 4.236156241 4.405789122 4.333826937 4.872287385 4.563345107 4.427033816 4.670446937 4.107663889 4.380449967 3.421302962 4.338266907 4.178364444 4.347756262 4.754924868 4.551334565 4.342559111 4.143325306 4.072110682 4.012999747 4.355461246 4.447298749 4.04310781 4.212165246 4.442333223 4.488975205 4.338019535 3.757343159 4.410244599 4.203933448 4.50732075 4.31781315 4.403086439 4.586659988 4.383272801 4.168981132 4.366937758 4.474457886 4.287813391 4.425816462 4.703630863 4.428331444 4.108074622 4.515691055 4.476480737 4.345278372 4.656173554 4.291460054 4.4235228 4.274722826 4.30220265 4.34548291 3.970502302 4.19932732 4.432427599 4.508004932 4.02625758 4.266433499 4.316887529 4.312370468 4.380934833 4.238147716 4.679716095 4.312222877 4.624038556 4.277154066 4.37698827 4.297369614 4.276934725 4.193154456 4.57553573 4.168289479 4.524772443 4.295869966 4.014157956 4.825631273 4.657789499 4.551332209 4.660771087 4.446377711 4.321221113 3.993454241 4.312737481 4.393597975 4.036182677 4.370401589 4.135225982 4.253756307 4.598133229 4.173151922 4.39537193 4.251152315 4.366926513 4.308539003 4.554444715 3.801453781 4.357609156 4.381371536 3.96102242 4.40583965 4.38758213 4.276497679 4.568761477 4.312493736 4.50700873 4.526636005 4.361470858 4.161842003 4.591711991 4.489883397 4.584508866 4.450376373 4.432690342 4.123160872 4.339095715 4.267212597 4.400382015 4.412515499 4.487556145 4.4803662 4.378169152 4.445571108 4.570560553 4.61379511 4.591220355 +5-Sulfosalicylic acid 4.023477297 4.08369203 4.232118506 3.088972402 4.142685807 3.950240917 4.982740828 4.090823705 4.98442524 1.103431997 3.720013168 3.846030693 4.032781504 4.52225371 0.941272725 4.496737035 3.720167164 4.169784214 4.897063157 3.68544467 3.86569931 4.689196506 3.897866393 3.794142014 3.850975689 4.235019788 3.524955218 3.880796285 4.846867984 4.89024387 4.28374836 3.501871884 3.963303225 4.905552661 4.24009914 4.251011554 3.922774364 3.405700073 5.209842071 4.43633749 3.891536527 3.827539915 5.140030622 0.774200433 3.512088114 4.941120561 4.940324628 3.604204321 3.573805923 4.010445643 4.689951697 4.391021146 4.019074005 4.597202794 4.094333085 4.737866293 4.370598755 3.354824729 3.588525617 3.831506702 3.521464814 4.038811788 4.145936306 4.365699413 3.700456366 3.422694759 4.037574947 4.243870997 4.38715451 3.836152376 4.8997012 4.004403763 4.419193927 3.928886687 3.67835637 4.511122077 4.042936657 5.191723108 4.62104547 4.292880635 3.867302224 4.051821403 3.394784997 4.40500743 2.98133431 3.68732597 4.554786612 3.981659372 5.142331726 3.931876155 4.089959451 4.085580871 3.538954692 4.736284869 3.889767971 4.003997218 4.013018628 4.212452491 3.890244016 3.922271194 3.545408501 4.324113874 3.80766108 4.677581686 4.956881596 4.304078015 4.241468389 4.864832453 5.083492368 3.610490503 3.388850717 4.725799032 4.091160854 4.209933913 3.754617428 4.321028469 4.480490283 4.835453911 4.627902407 3.246764553 4.259725729 4.419642813 4.060317403 3.800426067 4.487283507 4.328859507 4.460617506 4.536194294 5.030689198 3.367266615 4.179603589 3.758908744 4.417991495 3.876526344 4.185899799 4.462909388 4.488817029 3.886355106 4.869095728 4.234080613 3.822195995 3.994601935 3.958331527 3.926166428 3.841814845 4.58901159 4.49217343 3.718159085 4.472980371 5.051655272 4.188562783 3.673801836 3.565458264 3.647337699 4.217907353 4.333736618 4.178016896 3.504514789 3.862538728 4.005426479 4.136152241 4.437883258 4.609953259 4.105197892 3.997173138 3.751231213 3.463023809 4.453680232 3.488705549 4.944747505 3.879431769 4.606639058 3.017810216 5.190955537 4.099027132 3.934038262 4.369180348 4.12578442 3.860510899 4.340479399 3.973770408 5.020660448 3.912430403 +6-(2-hydroxyethoxy)-6-oxohexanoic acid 3.758640363 4.329163462 3.994169621 4.436173835 4.442813511 4.260598545 4.105474347 4.371577549 4.34723385 4.240364736 4.294306175 4.521698811 3.994291645 3.953249718 4.317810304 4.229005465 4.638284917 4.337485288 4.123860602 4.387932157 4.389687678 4.246906662 4.424686629 4.014175857 4.141068659 4.556182177 4.351751905 4.291420579 4.30922856 3.921615951 3.850241886 4.35654408 4.292989434 4.031275315 4.068871221 4.054256573 4.36600611 4.258148716 4.761042367 3.623128794 4.766343478 4.049180068 4.498837205 4.254478425 4.723375155 4.351326315 4.615558197 4.583784384 4.294941559 4.525444695 4.255650696 4.136384904 4.22244506 4.258590673 4.260191213 4.455951644 4.186709571 4.231312328 3.918355158 4.150970505 4.247645457 4.299751875 4.343457601 4.325089779 3.939025564 4.518274907 4.549612891 4.051505628 4.179609399 4.329752931 4.779073921 4.492991282 4.369588949 4.607091723 4.377963635 4.236167341 4.097176018 4.314060701 4.407455313 4.697074667 3.996451508 3.939920484 4.384662221 4.392466202 4.409878719 4.722707393 4.373999487 4.326871012 4.186804256 4.624609135 4.800451226 4.472530664 4.2944721 4.614188138 4.699278491 4.55011651 4.514921986 4.436818869 4.763705394 4.539802288 4.637169659 4.083182348 4.481742231 4.522986263 4.139976614 4.100527761 4.411169875 4.140789304 4.464276318 4.158884202 4.19189977 4.156973555 4.754836691 4.621572406 4.325521672 4.601658525 4.364898719 3.911428139 4.587262069 4.675578765 4.475639013 4.275212418 4.048477677 4.544535902 4.404551266 4.404920481 3.756576265 4.382726975 4.521155762 4.486374583 4.476083501 4.259254828 4.310831197 4.430065513 4.134482626 4.481856755 3.723256731 4.445023186 4.320326768 4.264493689 4.420479365 4.367855572 4.431002452 4.358107581 4.487425925 4.209070284 4.639821556 4.283242618 4.658842388 4.826319108 4.249526744 4.447765377 4.20764694 4.150538989 4.719283926 4.385379956 4.110361351 4.124836607 4.329088746 4.785468341 4.663509886 4.209580776 4.403295072 4.674789619 4.593690984 4.173899599 4.046980187 4.099890332 4.494110305 4.77679145 4.068946352 4.062626538 4.404528364 4.285796775 4.610649799 4.409920889 3.786669057 4.558817587 4.239232049 4.475794546 4.716785219 4.814111314 4.19177738 +6-(carboxymethoxy)-hexanoic acid 3.445392336 3.999589092 4.039266761 4.084427944 4.527799913 4.114818359 4.248547516 4.887580409 4.007891769 4.166171119 4.034456502 4.089753821 3.896744529 3.781179952 4.288645856 4.213977609 4.718835295 4.723046183 3.905128517 3.63048141 3.87790443 4.58488378 4.060433704 4.03270047 3.412438354 4.127785186 4.558196206 4.232369479 4.272760117 4.360180653 3.794824665 4.081681277 4.425941956 3.789166377 4.348765001 3.899991778 4.514261936 3.672457723 3.920255032 3.779910594 4.654674795 3.429786152 4.274419912 3.94675982 4.233158317 4.590078486 4.051332336 4.049922458 4.245892878 4.188538337 4.089860862 4.532727489 4.182742905 4.612089954 4.719644793 3.937355311 4.436914661 3.963082154 4.432328698 4.253314457 3.894674289 3.799670018 4.586854401 3.908584021 4.297473942 4.94930441 4.187367114 4.57556476 3.68454306 4.598548104 4.034049002 4.285959461 4.210458482 4.039894687 4.165139384 3.871663269 3.985385767 3.831940081 4.345755761 4.859102352 3.577311102 4.284312981 4.499666875 4.284959745 4.129943363 3.344345607 4.457654065 3.597011114 4.189023904 4.201866272 3.994016748 3.711982666 4.227710355 4.069345711 4.575060026 4.581796486 4.546972206 4.037379717 4.542652667 4.176675076 4.294989567 4.095508213 4.325163135 4.464868707 4.323026378 4.59968237 4.517297728 4.223830234 4.598814339 4.754019332 3.886017726 4.17781177 4.391530266 4.26353625 4.273030122 4.207938652 1.783118956 4.351042852 4.721741494 5.029139807 5.10547738 4.797664182 4.149808347 4.5008274 4.745835935 4.375919055 4.085945146 4.040711137 4.396462014 3.496395658 4.543049047 3.961895727 3.798053812 3.689105047 4.422822047 3.813746958 4.510111746 4.70420018 4.448021831 4.192104696 4.233504372 4.541922343 3.472741868 3.953825183 3.764809316 4.105389656 4.339086284 3.979392463 3.863832929 4.138944082 4.622558967 4.127114085 4.233898347 3.67447241 4.316191522 3.954311551 3.843721232 3.878935077 3.77409925 3.977315831 4.344450075 4.201053686 4.379847022 4.827406201 4.260055025 4.354511416 4.367627047 4.33974575 4.45384444 3.39046876 4.61884429 4.285649787 4.217932448 4.436438727 4.724276052 4.423098046 4.357052522 4.842572671 4.769506004 4.470752353 3.6881505 4.425203328 4.462327139 +9-Methylxanthine 4.403908726 4.211292788 4.07395983 4.257367332 3.662753683 4.262500742 4.296477349 4.510545789 4.5758199 4.360610852 4.071235071 4.200445863 4.552809846 3.875139602 3.908933066 4.104319513 4.423389768 4.339450408 4.656810762 4.445543168 4.192749389 4.208634491 4.275384286 3.868084325 3.673920687 4.690373426 4.073794943 4.331488826 4.35242741 4.600267522 4.302550678 4.739515069 4.184319682 3.457127478 4.367066954 4.275025171 4.268369378 3.042916317 4.743015064 3.669824671 3.856213704 3.889561055 4.329529656 3.994055883 4.150635608 4.343718136 3.883249385 4.461891199 3.822964412 4.687221184 3.957157951 4.367288402 3.649644614 4.379583023 4.350929483 3.940296291 4.112752691 3.879018106 4.107455927 4.331894311 4.812778462 4.261727256 4.046876508 4.377882769 4.502211994 4.318334251 4.383462135 4.213273503 4.042533306 4.644602667 4.646834481 4.23047532 4.488430199 4.901050242 4.512800451 4.212689425 3.754357268 4.363627642 4.686895753 4.592597557 3.932924125 4.094481719 4.455462526 4.467638906 3.664215962 4.049628855 4.505386709 3.883723365 4.431569558 4.528363629 4.364780785 3.774988614 3.836638822 4.606488082 3.917770048 4.584822234 4.270084509 4.235098719 4.329685438 4.461281944 3.876047128 3.687020512 4.908537126 4.727122227 3.684380593 4.258558814 4.190680132 4.324643893 3.987014789 4.827643629 3.821046056 4.135888267 4.033097228 4.763879327 4.137066513 4.202756356 4.571857525 3.857519432 4.56046148 4.38369508 4.229385189 3.855098454 4.681833076 4.553709217 4.517681701 4.019791834 4.217805625 4.355678872 4.5126431 4.281552387 4.523218048 4.327960246 4.347512511 4.384559358 4.146342172 3.946867869 4.890141288 3.135233823 4.454746828 4.028150667 4.613161969 4.389435352 4.452431479 5.030917871 4.475517178 3.892193391 4.543922726 4.05787729 4.443556636 4.469993919 4.261341275 4.140283924 4.365864147 4.041850569 4.50027066 4.027946544 4.671569569 3.613562838 3.542564227 4.989793881 4.703361697 3.827987606 4.194083557 4.226544063 4.128336903 4.183358106 3.938478169 4.253289629 4.405245065 4.628385274 3.966250881 4.024452011 4.427259017 4.53082725 4.648358556 3.873182802 3.957410051 4.276434243 3.914776113 4.318563398 4.424454278 4.448587206 4.249211165 +Acetaminophen glucuronide 1.646201355 0.094671234 -0.159476724 0.321438533 1.761274626 4.625680884 2.07294372 0.010570405 1.966871801 0.227297994 0.146645162 1.82694255 5.227465524 0.883997744 0.511570153 1.337005857 -0.098843873 -0.203213513 0.223666363 3.286191271 0.079563412 4.361203167 2.921812091 2.117884467 0.522866544 1.186746407 3.93577778 0.242085556 2.969757338 1.672576149 0.278310231 0.465050069 -0.127708211 -0.068442182 1.96608253 1.30854517 -0.140350981 2.588716623 3.699325518 0.031982294 1.291606218 5.303363585 -0.189800966 -0.089418407 3.537405068 1.808534229 0.145845671 -0.288460907 2.603348313 1.933614296 -0.197794109 2.422551178 1.943904967 -0.091897896 2.092208944 -0.134412238 -0.121829678 -0.098153464 -0.198918545 -0.133597752 3.681324171 -0.146029239 1.728598267 2.529619367 1.263670495 1.914356423 -0.017240844 -0.107266911 4.501954334 3.438139177 -0.053925661 1.87473306 1.554653774 2.263663675 3.89291818 1.731262839 -0.077803225 0.437010979 0.117369133 -0.066815382 0.713959199 -0.111569331 4.028763234 1.804710349 0.35844127 2.018666352 -0.115037397 0.090869322 2.151984192 -0.011099613 0.837658424 0.585006637 5.281141908 1.765940538 1.872340093 1.665963917 -0.153302381 5.161564829 0.051640394 0.426480838 5.362819215 3.76347941 4.529298334 -0.278179438 2.61341246 0.008712055 1.976548129 0.04081137 -0.006135673 0.093914725 -0.106595876 0.01260086 2.215954045 0.063351562 2.404372832 1.727640388 0.517918138 1.471955778 -0.055263829 3.293720892 0.241015389 -0.268941855 3.109589692 -0.002185696 1.71356638 2.707351509 0.037865684 2.011642615 1.365950461 0.487846177 1.910471727 1.966522249 0.384941525 1.909330926 3.342439754 1.864492674 4.757104427 5.567388141 1.706783722 0.035967263 2.090187898 2.006130935 0.196911043 2.676292557 0.408099682 0.084382677 4.578557723 0.140208827 0.747825044 0.212237271 0.041303083 2.0739382 0.042003507 0.14167419 0.72669553 2.099676492 0.036201962 1.713907743 0.622541279 0.747144792 0.640791174 0.286196063 2.342299261 -0.300010358 -0.044212743 2.61926009 5.04543163 -0.067056664 2.023469712 1.815949273 2.345278783 -0.046102239 1.567465403 0.158363644 2.771166801 0.131571634 2.415411968 1.743270513 1.232476466 2.16134783 2.030420136 0.817908338 0.250596019 +Acetylphenylalanine 4.169513923 4.515992777 4.083459947 3.767910143 4.187942437 4.292496362 4.31609019 4.149062609 4.597155951 3.727467137 4.232674677 3.59143665 2.538760574 4.050912938 4.059098909 4.004698254 4.22859221 4.023039679 4.325942732 4.398296278 4.243851098 4.108654004 4.265683556 3.629703176 4.216840213 4.423295715 4.180227482 3.942625908 3.902951123 2.422335633 4.396052188 4.627739206 4.575548363 4.03310342 4.469157835 4.545629734 4.3066475 4.060932264 4.233744494 4.541076573 4.117907095 4.091463187 3.919001922 4.234498433 3.908398293 4.693267218 4.022515721 4.146739462 4.713476218 4.15048658 4.411357421 4.20874702 4.341930524 4.425046946 4.428615861 4.269684642 4.546969881 4.549475995 4.606704729 4.361158729 4.218216379 4.060271429 4.387673217 3.921418984 4.174875197 4.522271005 4.349898309 4.454181991 4.628637466 4.17811886 4.269597619 4.801722557 4.166671803 4.182757633 4.379847818 4.33133603 4.373031553 4.4324334 2.481165417 4.436629964 4.007668842 4.529763546 4.104678126 4.400269088 3.673836752 4.386885808 4.526620458 4.108789742 4.230820291 4.159014614 3.792550679 3.907706817 4.211981724 4.191495291 4.222715586 4.951652092 4.419622583 4.660240346 3.856703478 4.426705527 4.700766165 4.932165951 4.3160654 4.297951491 4.901169211 4.066678371 4.231029045 4.390326497 4.309849228 4.515660709 4.268590868 4.313573881 4.204952958 3.945380062 4.267998449 4.013888632 4.203993921 3.976693859 3.936955521 4.068692189 4.081676763 4.494135688 4.593326648 4.372415496 4.204535457 3.946785526 4.540096771 4.393999914 4.645577733 4.475405063 4.313405288 4.406407588 4.750946437 4.293892358 4.320093601 4.428423611 4.331024949 4.231721909 4.449781296 4.556285855 4.644091559 4.54338275 4.463855582 4.576265872 4.728628572 4.735288339 4.578219309 4.402178777 5.021485466 4.705752407 4.628488227 4.594875808 4.185956049 4.737812769 4.39926229 4.517987133 4.349325687 4.330187073 4.446593006 4.520759435 4.528879159 4.254680272 4.782865267 3.726917043 4.049289853 4.115810754 4.323744136 4.583887364 4.638558671 4.370738305 4.099397738 4.275930774 3.663594774 4.528420144 4.042801954 4.364063941 4.250809359 4.161956353 3.99845573 4.285344773 4.713524674 4.154443029 4.061376249 +alpha-N-Phenylacetyl-glutamine 4.406637627 4.362681954 4.101540003 4.173136912 4.332329587 4.366653316 4.461964225 4.388642003 4.415675992 4.332673502 4.458553096 4.437548819 4.429282483 4.414200334 4.317699746 3.938614502 4.270712682 4.234317299 4.555459488 4.421714547 4.315767387 4.274728972 4.063164924 4.36918943 4.504579158 4.260871105 4.09382618 4.306217016 4.31168691 4.279650948 4.2609037 4.503911689 4.495709982 4.279948716 4.330602424 4.113980688 4.223859777 4.269043447 4.293297395 4.216579521 4.331653031 4.360668049 4.182416204 4.226419027 4.291492993 4.457042732 4.28235793 4.381293767 4.392618737 4.676549901 4.203519947 4.335538534 4.3897433 4.450821411 4.453111598 4.304693149 4.299638758 4.459410571 4.26841797 4.241927569 4.447681977 4.420754645 4.27143225 4.581378181 4.427549406 4.38255432 4.209331678 4.231168645 4.283866289 4.189650352 4.464341496 4.47439298 4.462570193 4.539785187 4.364373164 4.347195099 4.051185188 4.600162387 4.394556426 4.481284787 4.220726104 4.310668317 4.171478861 4.493696998 4.129846703 4.48764115 4.394091402 4.338685461 4.531927543 4.211098413 4.558618047 4.588607674 4.647526273 4.407535188 4.355179684 4.431940307 4.278625227 4.805641627 4.49858121 4.625656113 4.456189482 4.440480586 4.700833018 4.403614375 4.479164826 4.218198675 4.522197147 4.415694127 4.284927048 4.391609686 3.91901705 4.045073303 4.19925829 4.534079874 4.28313528 4.244082319 4.624567265 4.113229438 4.394081542 4.086807928 4.613979846 4.260850069 4.688914971 4.206963527 4.321442228 4.349831455 4.051563303 4.32843606 4.487493908 4.193582492 4.367497772 4.432281289 4.216298471 4.423832623 4.609894417 4.42085996 4.46320437 4.196686134 4.133993849 4.244686578 4.552108401 4.373187035 4.533233651 4.548783272 4.688769586 4.31936479 4.573821413 4.326561202 4.656642131 4.39377611 4.310488941 4.308951494 4.085514172 4.175713352 4.81835527 4.613515337 4.377449903 4.326728026 4.571813782 4.457454101 4.906983268 4.554972785 4.469683807 4.128937771 4.245857785 4.255804527 4.252296369 4.123558205 4.657171871 4.526561955 4.264466117 4.054069908 4.403143558 4.464760193 4.279396893 4.279898248 4.431853932 4.470370332 4.2157219 4.39279817 4.652195086 4.661454941 4.351744431 +Aminosalicyluric acid 4.125305912 3.942511754 4.004895162 4.277246263 4.307815834 3.908609803 3.362831141 3.531876612 4.228954584 4.194517002 4.034643168 4.028521309 3.704192773 3.37018234 3.890552072 4.128110271 3.560355554 3.398034484 3.992929114 4.456327843 4.708177834 3.974943237 4.765794078 4.189151836 4.21074852 4.761098539 4.727420107 3.949304446 4.092387894 3.822744493 4.837088113 4.342629455 4.153361768 3.877153376 4.157386744 3.434775701 4.652054996 3.340046479 4.366779552 3.361201246 4.35537252 4.377643518 3.868458195 3.988477904 3.582502741 4.477460046 4.442647096 3.822135582 3.624001917 4.433879708 4.223009681 4.313821507 4.373408616 4.722944732 4.326438335 4.067774059 4.837383715 3.585228614 3.699683761 4.490920421 4.053028236 4.450007868 4.162786526 4.302164926 3.013784151 4.16716517 3.788139455 4.204192953 4.60188521 3.856868965 4.695535108 4.555520082 4.456192558 4.132417431 4.440536658 4.365220078 3.835130037 4.632661825 4.163440013 3.801771439 3.982990911 4.663728134 3.793949485 4.445159188 3.836923414 4.699959146 4.171765185 4.885551177 4.396807504 4.076463956 3.814682329 4.201972176 3.836052857 4.817980665 3.618498124 4.399376137 4.122355627 4.929409395 4.29315624 4.663354638 4.549642937 3.669799547 3.324545858 4.441408859 4.415835404 4.649878114 4.505354381 4.142033002 4.381459781 4.436863883 4.444475084 4.145200045 4.276148033 4.278051637 4.082589804 4.127488593 4.208929019 4.192107484 4.650165572 4.135328974 4.731151515 2.961342895 4.673410109 4.257098913 3.782429246 3.613121656 4.510477221 4.26452765 4.636152717 4.904683017 4.486620338 4.691179626 4.459661097 3.819077982 4.991760216 3.740282756 5.04203888 2.785235255 4.529918803 3.868256093 4.210892378 4.46946463 5.070258651 3.472230704 5.265001426 4.230849862 4.237273718 3.820685731 5.212253847 4.643910732 3.818041435 4.64304173 3.12925336 4.356430489 4.386859307 4.551006839 4.653505875 3.762843064 3.028805489 4.860588427 3.826419728 3.817281611 3.758577168 3.801144328 3.583683632 3.814659739 3.705067035 4.589866161 4.800213113 3.493052472 3.742016483 4.719003595 4.09790942 4.654825112 4.066664647 3.316518099 3.063257529 4.000521386 3.972275628 4.162260519 4.175203154 4.294818591 3.421239062 +Asp-Leu/Ile isomer 1 3.565668774 3.852858721 3.879880741 3.564682686 4.710113671 4.55116975 3.695178945 4.247001836 3.712261505 3.984288604 3.917378711 3.890765125 3.543724766 4.651064591 3.815146983 3.815150555 4.068184736 4.371105896 3.971377582 4.027466676 4.367170491 4.042295574 3.741666754 4.20102811 4.342835787 4.17420322 3.928458608 3.862280392 3.926513607 4.108852971 3.141985003 3.813761785 3.862874137 3.70531895 4.100139266 4.042578133 4.525508703 3.293875357 3.728479278 3.340645139 4.114004173 4.141048104 3.748848423 4.259877333 3.85133015 3.860894187 3.809091709 5.000292871 4.004028331 4.048112186 4.141997227 3.903943729 4.009746701 3.834078372 4.002027785 4.592409056 4.566161975 4.195677039 3.934984005 3.859685942 3.91713235 4.403929362 4.63108006 4.121769264 3.972122401 3.94123585 4.694467634 4.076473356 3.384724329 3.969896253 4.124555754 4.291495743 4.765049305 4.141516197 3.975304583 4.245336409 4.875945003 3.726321077 4.171078224 4.230344651 4.212779208 3.973315251 3.868219335 4.123885322 3.920136962 4.927573182 4.219414687 3.784140926 3.901462252 4.038136044 4.165447326 3.818607677 3.68906972 4.510378185 4.056725798 4.075731584 4.053874021 3.707928961 4.474975908 3.818300052 3.699826327 4.165658245 4.03244344 4.022639945 4.88659712 4.050419195 4.530303813 4.469849496 4.179626044 3.921154671 4.961601481 3.884401118 4.157084837 4.216008004 4.652233087 4.232467837 3.836656716 4.141358736 4.123154774 4.025848482 4.381283996 4.175604194 4.090184257 4.699098933 4.03508133 4.135397926 4.577443327 3.797894568 4.215903052 3.680372332 4.066493499 3.800412066 3.372450565 3.981373093 4.609121014 3.816721903 4.021385826 4.000504561 3.703968365 3.95054076 4.298913351 3.647205701 4.037576423 4.173639156 3.911102059 4.066479134 3.98300268 3.885493305 3.659256499 4.036201065 4.036954205 5.120696665 4.058174439 4.737363926 4.484840651 3.837492837 3.740334327 4.433068664 3.772521236 4.896140479 4.0876658 3.919413562 4.328491435 4.025887167 4.295420364 4.300190048 4.201247821 4.107287571 4.275025827 4.006199322 3.996979792 3.922636647 4.363835025 4.764535508 4.575252543 3.952925794 4.391519259 4.158483171 4.728968298 4.136253342 4.311798309 3.972396626 4.506540521 +Asp-Leu/Ile isomer 2 3.706871339 3.624546933 3.965623198 4.000451202 4.414011612 4.417868913 3.926281369 4.373926222 3.776043883 3.943840569 4.018258112 4.107890767 3.812856871 4.850653033 4.118653056 3.951648232 4.17634634 4.336134102 4.086947335 4.174920658 4.206159456 3.839588468 3.838091939 3.774794379 4.424306609 4.068697118 3.991201398 3.927249755 3.975678213 4.096829416 3.717738044 4.08720699 3.978199671 3.829827008 4.244810982 3.722758237 4.358897813 2.888968491 3.703995527 3.113823624 4.079282303 4.308543763 3.747755945 3.669481017 3.725816666 4.035794707 3.986643078 4.940684113 4.064290762 4.202395404 3.937180612 4.200793944 4.026351442 4.153677293 4.173021887 4.271588038 4.486748851 4.114267113 3.838477101 4.078585282 4.006863725 4.594237645 4.46734983 4.326851716 4.033240294 4.193687642 4.522540873 4.386367131 3.542078022 3.979116399 4.118695498 4.372080404 4.992845647 4.489498235 4.359552695 4.147894681 5.012787229 3.658377754 4.201652414 4.292739568 4.27436741 3.954752559 4.248874232 4.492568735 4.320705664 3.151811925 4.265401269 4.076708912 4.020827518 4.142647366 4.125959881 4.07397474 3.972311304 4.564086403 4.265608214 4.227685179 4.131203988 3.978804567 4.590706577 4.242005483 3.947424393 4.336738485 4.180743873 4.144285582 5.154738984 4.008042955 4.404008875 4.481038822 4.279735464 3.962647071 5.046257244 3.836530257 4.011987968 4.180965881 4.853802492 4.143705998 3.505481722 4.120745236 4.198926784 4.326126935 4.307231424 4.317457612 4.344214192 4.832598033 4.374042843 4.180790859 4.495129722 3.661583344 4.06167621 4.150130119 4.284320457 4.081154259 3.630340493 4.036323557 4.713451898 3.99969989 4.184397041 4.273654916 3.70245369 4.000713807 4.501107852 3.971856299 3.960902201 4.39581004 4.080190148 3.908680386 4.091280842 3.932113042 3.752674945 4.057436382 4.449644361 4.957834805 4.194465225 4.902219052 4.41444862 4.109762702 3.850032506 4.479903996 4.019826802 4.766977621 4.355627759 4.0585683 4.137688213 4.163805445 4.337484871 4.12689227 4.239724642 3.826000674 4.363848699 4.176335656 4.132540582 3.519265279 4.47109615 4.780943674 4.408686361 4.035515208 4.136306131 4.032060219 4.463467627 3.775633 4.188471972 3.893531384 4.435022419 +Aspartic acid 4.262678588 4.27890607 4.225658276 4.476138406 4.460985917 4.545151204 4.522560646 4.475431781 4.209005592 4.180046318 4.16005695 4.421468273 4.388748702 4.352549399 4.12847357 4.184901912 4.549570048 4.173367078 4.291628454 4.319294546 4.242974259 4.259141715 4.216203577 4.348494736 4.338907201 4.053885537 4.339563874 4.446828294 4.230468175 4.277251954 4.171742446 4.614364493 4.470460386 4.092219862 4.538531438 4.440638407 4.236447442 4.411835682 4.233530765 4.08053554 4.235126923 4.192090111 4.142023301 4.302988382 4.05993043 4.20311412 4.422863583 4.324107669 4.533188105 4.475691705 3.871185851 4.34693586 4.341414804 4.323692961 4.487166077 4.234884194 4.216099462 4.207946943 4.303327018 4.325777063 4.509128858 4.328850097 4.224161426 4.335450004 4.486595736 4.290737374 4.490959188 4.29221377 4.225454829 4.278241644 4.405711668 4.359199699 4.595918928 4.587219 4.518146248 4.056587259 4.346690826 4.570292038 4.5259927 4.576586703 4.254662413 4.124010963 4.239099427 4.315199583 4.711455609 4.153856419 4.279177642 4.226742308 4.404647306 4.291688178 4.638932106 4.605944549 4.559172176 4.210165073 4.576131356 4.312549268 4.234737402 4.413174352 4.265497187 4.332071799 3.866636308 4.231928417 4.915587273 4.249946359 4.459828386 4.377559771 4.450261176 4.269753269 4.498859457 4.228849685 4.004985119 4.346706299 4.175066701 4.444966647 4.272671792 4.244531312 4.32861028 4.196503719 4.380912731 4.359964115 4.786543151 4.396605937 4.480341736 4.401546808 4.375524749 4.447226203 4.246014008 4.014349561 4.635260126 4.286113297 4.361436832 4.38005068 4.449588134 4.640204182 4.527806506 4.466498315 4.843512409 4.516375168 4.294984946 4.223742001 4.571174066 4.371175862 4.294453514 4.703905493 4.136668234 4.227950601 4.513499728 4.178149554 4.501025752 4.199546208 4.536350628 4.222118861 4.363362636 3.916198355 4.455878819 4.306149769 4.211902141 4.177757851 4.673196987 4.45218755 5.123631332 4.676638966 4.474865255 4.362297828 4.393770634 4.190091261 4.624370162 4.40069831 4.603209731 4.292025286 4.547317657 4.207222119 4.317516645 4.355591746 4.550290357 4.336649953 4.445650063 4.232604644 4.30997219 4.11302481 4.485478391 4.70388769 4.334297331 +Azelaic acid 4.419660232 4.331719762 4.105070118 4.017998931 4.320763456 4.641621515 4.262313325 4.34990778 4.389703026 4.222185372 4.306394913 4.374646182 4.107936812 4.147555437 4.201008048 4.401241876 4.101307687 4.203287108 4.323311856 4.487467672 4.44045598 4.452312734 4.150352842 4.519542455 4.403604916 4.400391065 3.989788573 4.323622693 4.356027191 4.105954576 4.35940848 4.181051397 4.069764588 4.178494823 4.141146987 4.284864347 4.331312311 4.256817435 4.463386649 4.159199057 4.345699881 3.698767227 4.093100102 4.207550656 4.721755879 4.276077494 4.143047123 4.589065698 4.247882546 4.371381938 4.364179692 4.120640136 4.135903267 4.370939023 4.483516694 4.300111225 3.941153425 4.416644324 4.143491019 4.269397079 4.533601528 4.19649434 4.368681279 4.220039485 4.369163352 4.044670291 4.800372446 4.125515535 4.114989694 4.407166225 4.302774187 4.239096951 4.265364148 4.491942289 4.539127651 4.387055684 4.070967586 4.508752278 4.484295378 4.643155318 4.101326045 4.127072916 4.351271653 4.380788342 4.14424422 4.353895492 4.194090304 4.305856519 4.245866724 4.040592761 4.570818987 4.62785576 4.431849101 4.586136348 4.446081199 4.301660938 3.923391335 4.271342995 4.423573291 4.587418138 4.170117976 4.468548523 4.503531248 4.381739417 4.326455394 4.470403848 4.344235214 4.141932499 4.257674802 4.511958132 4.084455224 4.031856152 4.637826906 4.275478332 4.43418192 4.526503455 4.268179272 4.318364802 4.308437288 4.426720973 4.623934797 4.346621361 4.268121756 4.280747466 4.69574173 4.3700352 4.181502731 4.557527886 4.209768007 4.180687626 4.199458399 4.890517736 4.622861485 4.405156382 4.195085295 4.619560347 4.352824423 4.601985619 3.945949999 4.631015106 4.17023225 4.223275026 4.62956488 4.834159251 4.35031656 4.529758367 4.78124723 4.639058245 5.229402349 4.497989891 4.419110774 4.305716213 4.057833853 4.252920508 4.648325263 4.667371532 4.572165234 4.071090688 4.731201764 4.961390875 4.524943152 4.327350087 4.481196266 4.341893765 4.588261689 4.321770124 4.395138059 4.082017183 4.882619869 4.581508888 4.201957402 4.305869926 4.157323655 4.342689116 4.412465439 4.342145722 4.241601737 4.272858673 4.550879203 4.418736326 4.72833252 4.704840337 4.483361327 +Benzoic acid isomer 3.86724466 4.830235949 3.371990466 3.724524736 4.593359452 4.475129634 4.404544358 3.80062009 4.033450942 4.023628658 3.560339441 3.646274254 3.793879755 3.960548607 3.882868265 3.8635655 3.982092479 4.436322357 4.60386265 4.229187283 4.557374199 3.934060154 4.363889045 4.668904859 4.04891203 4.690739606 4.247815988 4.668330869 4.328234534 4.269418328 4.126810437 3.953518079 4.172779268 4.412426553 4.402854078 4.613616504 4.641340405 4.796236726 4.471869267 3.941671015 3.84752572 3.208036698 4.184019866 4.452500648 4.372227003 4.169460637 4.150183071 4.549424457 4.032104265 4.214544995 4.569496073 3.688317021 3.10834869 4.352049489 3.311666784 4.141733121 3.918299997 3.780964142 4.320744376 3.982892553 4.64091688 4.373228446 4.261552223 4.097791803 3.670795474 4.396242491 3.813919078 4.020934002 4.385199217 3.905886402 5.086390448 3.724151855 4.489522484 4.200350954 2.669142529 4.301504613 4.208046126 5.141530156 4.488399492 4.254552479 4.316057597 4.643682878 3.745287505 4.451565957 3.548559987 4.227813502 4.315464425 4.496455658 4.368432829 3.535231191 4.032376879 4.124530226 3.62282921 3.860836217 3.434918057 4.17323652 4.126421038 4.301570983 4.473973934 4.176522406 4.402001114 4.103008308 3.696582161 4.161921504 4.214459269 4.476052273 4.661613675 3.953317719 4.264990228 4.626789052 4.473180378 4.440875392 4.337777773 4.24962481 4.190775428 3.503913429 4.806539772 3.897503877 4.452618883 3.660979183 5.055403905 3.629918612 3.943102669 4.136504923 3.652830768 4.060649065 4.363713269 4.68421532 4.192297426 2.449092304 3.927857274 3.916519596 4.758298107 4.419456818 4.441205202 4.342806485 4.218735428 3.368612825 4.261675296 4.210204621 4.361808051 3.258098474 4.313564459 4.447919526 3.777895684 4.738342435 5.045063367 4.252196229 5.168784964 4.197642957 3.449174298 4.043354508 3.500282664 4.491693476 3.833926081 4.244741652 3.387502428 3.990363047 3.783901796 4.957046302 4.920768214 4.230361223 3.839495619 3.466690619 3.317370441 4.045105026 3.684199563 4.930841987 3.64351065 4.297384713 3.412949662 4.785542698 3.871249626 4.058759109 3.869914287 3.713925336 3.618887388 4.726480066 4.417195207 4.943446055 4.531173371 4.776084194 4.631228479 +Chenodeoxycholic acid isomer 3.507941373 3.925771282 4.765679443 4.058410296 4.379708577 4.120224127 3.713847835 4.360354173 4.70760252 4.371437718 4.27336953 2.635281076 4.415442258 3.746504059 3.802174877 2.543100077 2.050700108 1.969647326 2.99768978 4.977562388 4.212606734 3.592982452 4.016928271 4.625848014 4.322543156 5.047045003 4.280442043 2.08903272 4.259786714 4.520288061 3.698278591 2.673198735 4.633860086 3.361460273 4.176894861 4.599913917 4.999576149 2.260693586 4.516827233 4.256867249 4.629254177 3.626356199 4.165334488 3.933252123 4.401083492 4.583573701 2.709789331 1.868952991 4.949901481 3.822191682 4.324816063 4.022703291 3.439310479 4.634524877 4.216094988 4.231859147 4.66647178 4.400668609 4.513140044 4.31195068 4.779355657 3.459720144 4.237240773 3.643603003 4.759696528 4.941188179 4.433579349 4.351944897 4.315998037 4.326456911 4.308246047 4.637071202 4.69218283 4.152005115 4.614292535 4.285853895 4.825621342 3.711659733 4.299844425 4.855587231 4.547221837 3.372626063 4.412995466 3.548617223 2.927091707 3.505983327 4.364590849 4.370660733 3.163967297 4.869475254 4.022382898 4.020379844 2.078041361 4.181789065 4.469936972 4.859991764 4.217793675 3.898650489 2.263610617 4.409587896 4.578269647 4.633729693 4.1883254 1.87319865 4.598833968 3.929685241 4.348302926 4.605760213 4.484275799 2.296821172 4.638026402 3.109039778 3.651418988 3.391045109 4.527867005 4.386992653 2.730485859 4.470469116 3.054544728 4.254628892 2.385672231 4.13386674 2.294196072 4.865618394 4.931505145 3.891391195 4.235427371 5.321327365 4.692607582 3.929578822 3.747802977 2.189379061 4.798063828 3.611876977 4.38822091 3.470181968 4.288691587 4.435782236 4.61284713 4.631626184 4.341863664 4.014778868 3.793060081 2.497074223 4.072061495 4.044848126 3.974251727 1.925228474 5.146688842 3.522145223 3.49403144 4.399741293 4.070313424 4.201690374 4.409887745 4.306922201 3.714865732 2.254297159 3.944242262 2.946780196 4.471536176 4.182635817 3.974935826 4.461502819 4.116024184 4.53762716 3.897607316 4.082289295 2.42103671 3.771373669 4.008274394 4.137858878 2.673488569 3.497436046 4.874294085 4.095410577 3.108550628 4.939562014 3.331501086 4.355573003 2.845169295 4.57217538 4.226315292 +Cinnamoylglycine 3.981493072 3.38145318 3.773392727 4.213982094 2.636678103 4.071693675 4.468352167 4.021831096 4.335168276 3.84517088 4.169279126 4.142754737 4.185027854 4.138618689 4.402825257 4.186151459 4.411143508 5.036492317 4.79363079 4.24198403 4.19201687 4.657107109 4.224470598 2.765067579 4.185186251 3.919484074 3.829968254 3.139920497 4.463297228 4.203553625 4.358672239 4.358932389 4.050169088 4.088081038 4.340176117 3.848532646 4.243706092 4.502075283 4.82751082 3.864127489 4.13962031 4.386215348 4.125163204 4.217052345 3.557211325 4.576291837 4.157731234 2.862549424 4.411196276 4.286959515 4.613576375 4.339227979 4.047718752 4.562922143 4.442263047 4.341079923 3.982857994 3.95864023 4.236168705 4.152828278 4.412463732 4.554884423 4.179345569 4.681306358 4.377676348 4.581915279 4.247910547 4.49246686 4.725415319 4.436272183 4.572363255 4.352343799 4.654007275 4.372625847 4.272813843 4.349168566 4.105642463 4.494268106 4.324235934 4.011180314 3.87059632 4.45573114 4.148122207 4.446481852 4.012837449 4.22899166 4.293131461 4.759998226 4.829804313 3.499708508 3.82189672 4.289494729 4.371023423 4.417145135 4.22884605 4.467948532 4.357859381 4.700377286 4.661754126 4.644376205 4.691236629 4.498077924 3.867461756 4.558512415 4.51886409 4.619495032 4.75800958 4.434091071 4.571050785 4.318337104 3.947094154 3.790356278 4.457757157 4.680595743 4.337914689 4.071425405 4.205047438 4.323923309 4.639034907 4.086533827 2.796163078 4.278473939 4.290473545 4.035656923 4.191229494 4.290289633 4.105652555 2.480299912 4.024928907 1.909413041 4.546822246 4.179494901 5.052545963 4.104876995 4.672142103 4.203594057 4.712279263 4.289812165 4.65659158 4.084470544 4.30619547 4.697303691 4.234114557 3.550354929 4.513428133 3.592831102 4.346351218 4.229610174 4.738759379 4.549610311 4.084909049 4.380632237 3.499457598 4.603229288 4.592609183 4.456325277 4.271144143 3.979528235 4.275387059 2.877957352 4.500019419 4.365478971 4.180982159 4.038244505 3.817049857 4.085993875 3.966608401 3.51202226 4.357201323 4.62605352 4.093691984 2.448281586 4.485115802 4.284985775 3.924255083 4.016974099 4.137850385 4.336442386 4.017521614 3.574428929 4.718589197 4.607571666 2.800889703 +Citric acid 4.077504851 4.418116654 4.179829664 4.21891601 4.294478657 4.386380244 4.342538906 4.504382392 4.364181148 4.3856178 4.336328879 4.214319448 4.24458253 4.379453801 4.38638277 4.229816961 4.206949058 4.007234362 4.403198012 4.355490907 4.262640972 4.401817172 4.160245819 4.238622591 4.356172032 4.278483031 4.12214848 4.249421294 4.284359674 4.428659514 4.305277236 4.582959827 4.426733677 3.989141659 4.153612183 4.326324 4.146511647 3.978088144 4.395500705 4.214737065 4.235471966 4.241519986 4.129240014 4.30572703 4.091757132 4.33469633 4.390361887 4.273269122 4.342692235 4.435575373 4.391680949 4.441500893 3.987215326 4.504239497 4.358940611 4.18108943 4.216449036 4.29453336 4.590707359 4.285538777 4.58748265 4.240657966 4.471357432 4.092048223 4.44978379 4.256149942 4.325522673 4.426666232 4.398155956 4.216700449 4.312543612 4.352312693 4.522150899 4.632509263 4.497808243 4.264470612 4.101238515 4.803635835 4.445090222 4.507573742 4.203389879 4.244376899 4.329599669 4.54621657 4.194664384 4.229358811 4.198673485 4.478897492 4.41969875 4.162589668 4.504561406 4.535043525 4.468853839 4.297846154 4.480632033 4.386634218 4.375390641 4.298979556 4.16589978 4.606823971 4.458084438 4.433566005 4.610187829 4.449839371 4.295141259 4.268788468 4.382832467 4.367319096 4.402874569 4.495818283 4.16737518 4.134919705 4.416967256 4.449627471 4.410254586 4.250476699 4.397093385 4.190519451 4.149563828 4.390926383 4.567602117 4.110992218 4.568871005 4.326483664 4.448367131 4.342656856 4.220538881 4.49454957 4.396657436 4.390698413 4.231093988 4.658871242 4.559750522 4.273189673 4.289997294 4.50213807 4.327969509 4.531107448 4.57057127 4.487136846 4.551011936 4.398514341 4.310492397 4.775140976 4.500933506 4.464731142 4.79126336 4.277375223 4.766941203 4.434689116 4.355348465 4.069434997 4.477047291 4.416940492 4.47885937 4.540242678 4.470577255 4.354146772 4.25825461 4.657387746 4.524995904 4.425918684 4.423807591 4.220249441 4.2343667 4.146649834 4.339864635 4.240285139 4.239470935 4.498277137 4.301630414 4.211137484 4.139805927 4.205307114 4.410704386 4.117727412 4.25231278 4.317697631 4.270759172 4.333403329 4.516882782 4.61094387 4.403323075 +Dehydroepiandrosterone 3-glucuronide 4.276798769 3.781078879 4.039522782 3.960037071 4.178258436 4.018968215 3.934194965 4.623505669 4.199948542 3.692954799 3.964720652 4.493531089 4.103096244 4.141067604 4.534587558 4.305692531 4.356197071 4.54901558 4.114247605 3.961314589 3.824267353 4.386985949 3.767656908 4.145823475 2.352751589 4.275257903 4.376408765 4.466288075 4.444300977 4.082227213 3.426317904 3.263286164 4.223090427 3.266308551 4.551056899 4.41694955 4.578512888 3.913795947 3.896087732 2.701147755 4.060341488 2.562186854 4.121758141 3.931054721 4.063997943 4.536004278 4.142323258 4.112047355 4.097004432 4.02244341 4.289882331 4.404824156 3.766264911 3.890008034 4.620480792 4.041278847 4.198860395 4.269503668 4.183370516 4.45957499 4.312772594 4.537418847 4.111873681 4.289976565 4.607317026 4.396042779 4.486929944 4.261456436 2.912939871 4.824696635 5.056527217 4.660268222 4.716478598 4.589009119 4.335007771 4.049710962 4.533068101 4.238152845 4.436220149 4.723204056 3.642979904 4.223197507 4.598402197 4.52839758 4.287724036 4.159411925 3.422501791 4.043958831 4.596367832 4.682379446 4.473615541 4.337666023 3.368514241 4.05741348 4.258473989 3.947929597 4.206227507 4.377585064 4.828426575 4.559011324 4.763211003 4.127554133 4.137573465 4.240936269 4.125518335 4.733855584 4.115354602 4.469567954 4.227271411 4.384356153 4.201614654 4.424910841 4.045683947 4.468709325 4.510480592 4.122238751 2.837334248 4.526852821 4.443386714 4.753242371 4.456891562 4.279848041 3.910235797 4.684401392 4.440231203 4.55350565 4.071463397 2.645389586 4.603618575 3.846342744 4.459314348 4.275986398 4.350106002 4.527922049 4.467808628 3.675637641 4.589111468 4.85519866 3.913570732 3.987763603 3.942768956 4.478996691 3.154717349 3.842394056 3.649086253 4.12888335 4.709174391 4.316752449 3.887648927 4.177376306 4.009898563 4.027277889 4.41227298 3.658139212 4.245525669 4.10177903 3.423780008 4.025636917 3.482065651 3.995979529 4.090641913 4.433671682 4.475847301 4.648027547 4.159744586 4.028173259 4.558608579 4.66834237 4.49949061 5.2370236 4.459156173 4.216167577 4.282642946 4.273579314 4.395864412 3.982069449 4.216899501 4.962730767 3.892943398 4.475482245 3.757587359 4.061018872 4.241429028 +Dehydroepiandrosterone sulfate 4.462774103 3.806104468 3.193502082 4.165680276 4.36325294 3.986996779 3.040706678 4.237767949 3.395426635 2.80571715 2.973556839 3.77167612 3.367209969 4.849470567 4.684479794 4.368515859 4.544111563 2.628914977 3.755359012 2.511892665 3.716167025 2.929191267 1.209995376 4.650028868 1.745754697 3.06543409 4.569901235 4.786453478 4.144206201 3.103368686 2.52474703 0.747665007 4.166963983 2.084833401 3.530892585 0.791734296 3.643083892 3.479545161 2.552174632 0.346039693 4.945757816 1.133210407 1.952747771 2.330401027 3.243393384 4.190152769 3.692192126 2.465526561 1.256372699 4.087392457 2.560943591 5.47507585 2.807051086 3.628604744 3.7964178 4.920367673 3.475439631 4.357577873 4.868821768 4.505226713 0.464877101 4.112521991 4.775341177 2.979097854 3.072331483 3.896636924 3.863157016 2.022925428 2.251287169 4.927737534 3.690753284 4.965086285 4.098471547 4.708469101 4.503314855 2.684088184 4.545998626 3.65545313 4.437748359 4.394655802 3.010988388 4.008899078 5.061204893 4.13886103 2.45401195 1.953983917 0.205296111 3.988508878 3.813906086 3.707777488 4.477249749 4.648108725 3.046462587 3.690242651 4.519137849 5.1733046 0.195216736 5.019899417 3.446353932 3.510694699 4.758013647 3.154688663 4.152636032 3.399446589 2.541226364 4.92704426 3.744509154 2.332051425 4.561346499 3.57022554 4.720462895 4.715345792 2.291911696 4.097627684 4.532155882 5.261171351 2.098449001 3.664599928 4.43512973 4.780002575 4.891994981 4.805086124 2.629334533 4.530957138 5.327150648 5.248427446 2.382705331 0.057546539 3.49387728 2.316846724 4.599308269 3.672655713 3.130079744 2.377536285 4.285937724 3.787358796 3.171858257 5.045323833 1.340592909 3.751056574 2.460418932 3.078672472 3.918548763 1.893434581 2.819125659 3.740268046 4.730973595 3.719944661 3.311735829 3.076664299 4.021877549 2.465209616 4.785891472 2.665612199 3.02438261 4.853185391 3.283182185 3.280061113 2.014361398 2.579407251 4.49755281 4.675171878 3.016821513 5.249820573 5.066117161 4.790910444 3.373832383 2.868966011 3.719006536 4.409156516 5.319092951 4.884747212 4.088902671 3.844311318 5.100470554 2.821026404 3.513738633 4.194823456 1.741775181 3.071345918 2.167536565 2.583908025 5.001021835 +Deoxyhexose 3.760568554 3.809186227 4.226145461 3.997356997 4.084736387 4.296965209 3.849157381 4.127491988 4.613837607 3.417551827 3.560839941 3.786335624 3.807161832 3.447998581 4.160597935 3.856635697 4.332878095 4.66252168 4.216584698 4.380411419 4.291223004 4.238279137 4.81272652 3.666481167 4.732201236 4.703935912 4.430350757 3.99189936 4.04915368 4.504551033 4.731582287 3.771718494 4.227191288 2.811917615 4.240014592 3.918430457 4.543848436 2.705095721 4.553469946 4.293614273 3.956723771 3.034497894 4.30681946 3.978471133 4.054244916 4.426937759 4.111246294 4.362523867 4.254576603 4.001677866 4.509975075 4.258775465 4.394193453 4.238967392 4.109243502 4.584278613 4.692692991 4.299318717 4.185801008 4.271784759 4.239609366 4.111442083 4.180050098 4.348285204 4.185535603 4.317112125 4.637157246 4.401406269 4.816315249 4.385098524 4.483539194 4.560590374 4.303483935 4.381171873 4.632834934 4.544035911 4.421060336 4.802983751 4.625538306 4.174496985 4.352943162 4.456902753 4.300962505 4.303691571 3.607576534 4.329142002 4.294692643 4.412638325 4.411008838 4.626010898 3.349336208 3.440375157 3.807978058 4.412379809 4.125696009 4.291631359 4.162927259 4.570754258 4.586271583 4.400470215 4.41110147 4.420855334 3.603408955 4.215333602 4.072682122 4.766518096 4.435857511 4.525217886 4.294454377 4.396683784 4.593248135 4.614804934 4.492702568 4.067914786 4.576610098 4.152063026 4.328666397 4.241052345 4.303866199 3.996685258 4.320849142 4.295031702 3.78814012 4.36435315 4.56429552 3.483083903 4.726027769 4.791514429 4.386124626 5.109249774 4.415854105 4.79379773 4.969251572 3.98918257 4.328383776 4.438974955 4.593483943 4.220451372 4.59292316 4.475351987 3.768811919 4.193401864 4.884088421 4.136397083 4.65724137 4.562357317 4.685611444 4.542884259 5.04125391 4.433384581 4.135259054 3.81497526 3.890972055 4.849193602 4.559505243 4.518003633 4.504955641 4.192956485 3.842609046 4.896459721 4.251055747 3.710024137 4.272208612 4.274836079 4.302148815 4.22096369 4.141296459 4.568607834 4.518316365 4.313603516 3.945305511 4.469963909 3.70663822 4.238006944 4.195157787 4.087620975 4.056777141 4.634997888 4.271058587 4.402391067 4.168505033 3.538183103 4.599999019 +Dimethylguanosine 4.052598091 4.269906676 4.197531974 4.350022732 4.408428725 4.310143565 4.315772202 4.497621425 4.248062177 4.385290686 4.31060815 4.439865506 4.117313141 4.238034116 4.349461783 4.267852304 4.523557723 4.177409002 4.443593705 4.249982427 4.264437279 4.315286246 4.263334536 4.368490467 4.158555509 4.053279803 4.335105522 4.416714625 4.524236962 4.447563007 3.892995373 4.306731769 4.348326754 3.870416412 4.323312776 4.132845502 4.220468862 4.120617112 4.113696024 3.995702319 4.411970414 4.103047742 4.153782928 4.142907138 4.210409088 4.323331744 4.420929126 4.301298717 4.409565295 4.38043486 4.147382346 4.544228438 4.318337512 4.445982334 4.343192459 4.289728938 4.342153391 4.251355065 4.4803938 4.321025999 4.495658489 4.342892479 4.359914926 4.509807301 4.618175277 4.525792351 4.347023552 4.407776621 4.165750492 4.472909617 4.503917805 4.224508207 4.450533444 4.688727091 4.368343997 4.077805299 4.268858755 4.339474419 4.461990079 4.507822879 4.156882681 4.288235055 4.404183377 4.473328106 4.499344729 4.190944073 4.350903492 4.349052698 4.420649696 4.388287448 4.490991976 4.41048368 4.328792027 4.149446407 4.489456219 4.489672244 4.472116071 4.452227831 4.691774533 4.528826723 4.204184628 4.374788165 4.490225441 4.436155858 4.357635183 4.376995788 4.501521918 4.3427077 4.266639333 4.423609822 3.928622121 4.236910743 4.265015662 4.382973877 4.200708016 4.145651715 4.266810415 4.246853829 4.34511265 4.438016744 4.767733324 4.29671889 4.48632068 4.341425388 4.597428982 4.442621963 4.105507983 4.140298855 4.361849439 4.282905367 4.465095606 4.381214155 4.260714789 4.618260841 4.560164845 4.299429652 4.30788004 4.252873069 4.077630542 4.192799426 4.503213288 4.257484628 4.168284546 4.486169578 3.980735647 4.181693719 4.487989479 4.068118023 4.251887455 4.294833602 4.304977814 4.425565166 4.387552882 3.975011807 4.39090676 4.444197383 4.139105746 4.221659862 4.37468351 4.392707281 4.738718881 4.507497005 4.437873767 4.383635659 4.348774175 4.257027772 4.358071689 4.484260226 4.596796355 4.466143315 4.469527013 4.051247802 4.408126087 4.313469692 4.455645709 4.408337932 4.442947164 4.517358742 4.481542797 4.237602377 4.543725868 4.547476016 4.412187226 +FMNH2 3.565083008 4.208395129 4.034408777 4.233036501 4.597363712 4.19974499 3.970691407 4.554182224 3.873713186 3.734016786 3.958395779 4.336754873 3.732100313 4.252491589 4.506793318 4.101970496 4.340524455 3.913764145 4.400011601 2.592784091 3.866454478 4.339455353 3.951149386 4.269054968 3.396649215 2.536137908 4.268475381 4.383205167 4.640872044 4.526935297 3.847653437 3.8707237 4.429443753 2.479225461 4.441108271 4.418227033 4.19061762 2.968350983 3.631480073 2.927251401 4.465081322 4.005022162 3.727870408 4.232394961 4.161865497 4.480744315 4.296695206 4.244514342 4.073333018 4.236326175 4.17107333 4.798755543 2.764623987 4.633891158 4.248045477 2.734752171 4.096033932 4.096888095 4.614751154 4.466184229 2.998210284 4.43540726 4.271288795 4.445165955 4.474167064 4.702870404 4.422856676 4.528445732 3.028079815 4.566069801 3.92724642 3.790738407 4.518227897 4.715110648 3.899335873 4.171738237 4.082420215 3.885569944 4.428287521 4.526961694 3.615976946 4.477902713 4.387443716 4.529906944 4.32881877 2.6098687 4.352588521 4.070361752 4.282696156 4.16274804 3.981768396 3.773867985 4.243990753 2.618928452 4.607593133 4.821916592 4.516175475 4.547547496 4.536692842 4.29938213 3.740287569 4.580086966 3.293707814 4.550790012 4.240547001 4.398862883 4.456629878 4.296152996 4.360058458 4.338842809 3.981786801 4.108237518 4.513641957 4.487776783 4.00457189 4.448333881 3.390934494 4.378852533 4.276945574 4.252699458 4.69485089 4.524718011 3.867898367 4.304310168 4.712737057 4.359022191 4.18511935 4.156708485 4.524617808 2.933984202 4.566067474 4.008171097 3.160981709 4.681638156 4.542660818 4.370196964 4.757255946 4.752066823 2.697363186 4.064090106 3.919573286 4.369840441 3.043694503 3.222456334 3.301555156 4.225423708 4.3129138 3.422755742 3.174700911 4.165784489 4.369309296 4.570857596 4.45759381 3.548831629 3.666590862 4.230115004 2.932419277 3.983732741 4.158114109 3.911488775 4.35561988 3.155183627 4.477923661 4.599414643 4.486222695 4.242439208 4.396911723 4.687778973 4.642563981 4.419447014 4.510127003 3.782346568 4.432969278 4.386810204 4.40141419 4.252857393 4.709510445 4.666792332 4.700792166 4.427825877 4.476774363 4.532662808 4.535470512 +Fumaric acid 3.567560782 3.840096674 4.384063693 3.416630038 4.091963642 4.012107192 3.671532307 3.840724307 4.881027453 4.009271949 3.83179901 3.802339511 3.844749988 3.722821152 3.948375326 4.03025341 4.001416754 4.680681503 3.98267978 4.378819798 4.242766105 4.244078263 4.68821659 3.771889587 4.797782976 4.904606977 4.143319579 3.722666007 3.767446777 3.908773927 5.024939027 3.983507301 4.073936288 3.697942238 3.97825002 3.812893158 4.525422476 3.822121327 4.736023443 4.15440702 3.860333481 3.662480191 3.736597845 4.069205605 3.801466619 4.290407375 4.045010884 4.096662862 3.978596862 3.558277588 4.213042242 3.998573131 4.411598194 4.163943213 3.912899608 4.510803499 5.107341943 3.876044905 4.199766504 3.762082548 4.485876962 3.944954794 4.112209759 3.776608609 3.841772354 4.183303934 4.252617734 4.065853899 5.140258281 3.938473959 4.511974928 4.811590656 4.198253839 4.208241735 4.606903937 4.548983254 4.569392809 5.020436127 4.112396559 4.073816653 4.622626686 4.183176556 4.161016879 3.975057034 3.947501889 4.091334494 3.846246067 4.689107582 4.408307776 4.436301373 4.058452436 3.754350401 3.864976008 4.105540287 4.032899586 3.992520493 3.876083173 4.830667323 4.178699596 4.806959236 4.142349942 3.900269796 3.829991891 4.069802645 3.990968431 4.345192778 4.595581854 4.266618517 4.022117896 4.2077283 4.873141791 4.790806951 4.143331351 4.094063623 4.511287966 3.988210369 4.196524176 3.935910174 4.095708386 4.193018366 4.10955338 3.853243642 4.133924963 3.975114206 4.085273535 3.91948594 5.075094791 4.617504151 4.101968871 5.241395328 4.089361868 4.640535889 5.21518482 4.173129367 4.351925828 3.87254539 4.146135801 4.205913808 5.011946149 4.609900403 4.102699737 3.991920093 5.245301831 4.134617829 5.075064684 4.528611131 4.848768098 4.710690867 5.382441854 4.432107411 4.176137807 4.038783659 4.072610148 5.054446544 4.476023621 4.662139994 5.014253699 4.409877664 4.1779154 5.462612524 4.178397702 4.034830849 4.046387035 4.020659596 3.873157913 3.610232993 3.93682221 4.212162178 4.032269381 4.134989667 3.741292877 4.086220984 3.641054179 4.078297846 3.979560896 3.951426663 4.0507192 4.356254053 4.108875888 4.459749533 4.305009784 4.154146083 4.471819148 +Gentisic acid 4.300974169 4.584677426 4.764176038 4.06266317 4.431808402 4.238883353 3.866571129 4.217908822 4.388629571 4.663981312 4.266877372 4.291444878 0.925459206 4.584132488 4.356579628 4.152886084 3.777807654 4.462717416 4.187362508 4.379184867 3.994990552 4.489944186 4.177670591 3.197646075 4.143611401 3.998708926 3.488895287 4.49213756 4.291209398 4.310998967 3.958936408 4.037913033 4.701580941 4.380518732 4.355886643 3.570932345 4.595141442 4.186372302 4.673993801 3.240354603 4.22317143 4.34362375 4.06939992 4.537082183 4.039645221 4.34576338 4.055249872 4.140239099 4.601503269 4.373333044 4.336395925 4.395472016 4.083270269 4.881782054 4.617221475 4.310419799 3.693682469 3.971810821 4.528144875 4.654841123 3.768661192 4.786458501 4.521853109 5.025644074 3.982728888 4.848774131 4.419929142 4.195207149 3.71952507 4.694076213 4.252431764 4.098580155 4.457247277 4.271601463 4.129519744 4.02609141 4.734731284 4.686301384 4.478153894 4.398400702 4.324726125 4.104525334 4.22576513 3.419782328 3.78288979 4.23034049 4.199261975 4.225005783 4.698532517 3.428063992 4.188785882 4.35534811 4.201475341 4.529711902 4.681479154 3.263892525 3.886368369 4.11201537 4.178380299 4.436971903 4.02957784 4.773213652 1.366079912 4.477947005 4.030246108 4.148919747 4.162430993 4.511599374 4.916967387 4.294664201 3.992813001 4.053692075 4.928164052 3.862644014 4.162641544 4.662465559 3.779869486 3.886963784 4.183640336 4.350930643 4.240007248 4.011548539 4.574527801 4.415473142 0.878222932 4.305325216 4.526488439 4.260930169 4.342992414 4.46895081 4.893847683 4.419042911 4.277484652 4.3533748 4.595113826 4.43884883 4.237103947 4.714395742 4.393736504 4.536663736 4.055413049 4.274321753 3.943228905 3.738522556 4.025149465 4.179311502 3.926101948 3.936766844 4.675558878 4.356676059 3.842253879 3.964004114 3.86112861 4.058941978 3.860813279 4.142543209 4.165567663 3.698324423 3.98721059 4.297250947 4.079649787 4.138448054 4.547512441 4.036246312 4.349987054 4.236659067 4.280257663 4.266744636 4.379716616 4.532161215 4.077253524 3.841269212 4.696532349 4.528242826 4.410324016 4.402729127 4.101888156 4.488183103 4.018575723 4.366776262 4.513499356 4.807457299 3.686177008 +Glu-Val 3.70666622 4.310927172 4.289508698 4.376817954 4.72188894 4.392127881 4.049237595 4.639082002 3.821355703 4.266130415 4.284175627 4.378978069 3.906109263 4.152752192 4.350452304 4.362779118 4.416866844 4.527326869 4.135738598 4.238758535 4.059163904 4.270617853 4.013038556 4.101742789 3.924571246 4.220714116 4.744405675 4.115053019 4.417116589 4.381296648 4.039283935 3.820099447 4.405153911 4.044221147 4.017472529 4.608555228 4.447626989 3.74522803 4.315010353 3.920601108 4.564197092 4.019064285 4.090617721 4.529227654 3.985450945 3.837148292 4.054284957 4.515650688 4.295487951 3.897571748 4.568120016 4.202248138 4.493703478 4.002694787 4.397870233 4.276456292 4.464801323 4.48006596 4.284473803 4.452749729 4.583315737 4.176740017 4.436546934 4.043574325 4.48191981 4.518593587 4.582609617 4.550368273 4.194412184 4.430053168 4.332653306 4.516097638 4.122816826 4.418055309 4.311167887 4.527135021 4.193220117 4.325525823 4.431114072 4.412475696 3.961759124 4.472920562 4.491854826 4.353161204 4.230446609 4.461841701 4.240114051 4.261996417 4.229056336 4.509750988 4.594264015 4.265426127 4.158068857 4.367438388 4.479172751 4.624056505 4.2117965 4.062587596 4.479710338 4.327326786 4.204462767 4.438829314 4.363576514 4.287107355 4.494813529 4.32899983 4.615795946 4.378240925 4.464453227 4.317035795 4.20294491 4.275224415 4.379870567 4.350606526 4.384260999 4.290580334 4.087801267 4.383898237 4.268091741 4.44075611 4.358408187 4.295002064 4.315325088 4.458625434 3.958149971 4.63928543 4.264634104 4.527305062 4.323019435 3.869954663 4.216087189 4.561983858 4.258991725 4.630221462 4.283141961 4.360775599 4.30971222 4.117800265 4.327466748 4.554773463 4.363406949 4.062461163 4.427888115 4.487732816 4.259478468 4.351510889 4.559948566 4.207323508 4.396105927 4.269430146 4.537192424 4.575133862 4.53503675 4.208887536 4.060288407 4.242601782 4.216701385 4.423571944 4.045791977 4.149163676 4.435973623 4.243145897 4.487064413 4.557092107 4.444706032 4.492528407 4.446077652 4.609683839 4.418081995 4.203722142 4.372006572 4.403779348 4.40372037 4.10756845 4.560273507 4.467803675 4.46799011 4.300581145 4.497071019 4.029266802 4.094641593 4.384376434 4.555933527 +Gluconic acid and/or isomers 4.288424392 4.586464143 4.096406768 4.743170328 4.614798261 4.334139437 4.334812906 4.311405036 4.302074672 4.417309999 4.492846018 4.287708199 4.069351094 4.338178918 4.244554179 4.155565546 4.455517406 4.305656617 4.286882088 4.501016356 4.633382629 4.237331943 4.333312107 4.541545839 4.363970996 4.250851577 4.229871214 4.124341226 4.302626561 4.223284005 4.27663771 4.66965947 4.437051103 3.990947766 4.410325378 4.406677391 4.289133131 4.891101012 4.59474552 4.024250536 4.30814475 4.335607668 4.465820267 4.238130867 4.152474787 4.477980082 4.775393527 4.331275942 4.315858666 4.86116818 4.306486229 4.463550618 4.255787862 4.565648228 4.098849778 4.225365836 4.464309223 3.951214582 4.294821998 4.204050582 4.520976448 4.192166713 4.251692465 4.571597715 4.395211919 4.502530481 4.382810711 4.396060235 4.297746803 4.172879836 4.648445547 4.435480638 4.334860488 4.637108479 4.419658139 4.038422025 4.319330704 4.685101468 4.208779342 4.502420339 4.093845636 4.127934308 4.16859421 4.535808364 4.673648155 4.419672503 4.140732801 4.196191326 4.333772597 4.291233588 4.79131544 4.498230116 4.181557915 4.215922508 4.339138858 4.57319021 4.529636955 4.612799033 4.919131291 4.9284841 4.471982281 4.440686778 4.615649344 4.287490778 4.262995325 4.201766817 4.54356148 4.292915998 4.369026835 4.312853392 3.857356142 4.098567751 4.645152114 4.501253275 4.126585605 4.119398536 4.511175985 4.006067211 4.728682092 4.19126913 4.784383669 4.218583032 4.547149993 4.409090468 4.51924787 4.12824995 4.338278599 4.230104604 4.403666108 4.136804607 4.492035639 4.543837928 4.421245944 4.644026482 4.823819105 4.457334337 4.693968815 4.540632038 4.515255439 4.454671313 4.490168666 4.268034809 4.538180913 4.562580442 4.488559141 4.456053604 4.957910441 4.0825066 4.871432432 4.450047507 4.351347092 4.611879918 4.301500998 4.042500906 4.746972737 4.307252959 4.202920681 4.146884036 4.55515979 4.707612866 4.960789453 4.41567857 4.30492075 4.287666609 4.258084569 4.097221445 4.200243655 4.569986114 4.752594107 4.230731381 4.115842036 4.035500892 4.018950475 4.149248577 4.255083634 4.193371109 4.197902024 4.609683981 4.444646774 4.222413604 4.686411136 4.698504562 4.655849225 +Glucuronic acid and/or isomers 4.271366191 4.701159301 4.123024802 4.593438405 4.461186024 4.461209004 4.403805891 4.311554558 4.399577546 4.496805888 4.500638666 4.164579599 4.334987057 4.376192557 3.991583612 4.186607076 4.347665477 4.486804468 4.500537372 4.378087193 4.763216754 4.262786103 4.405584331 4.436115874 4.833583028 4.427332438 4.254928471 4.191148247 4.164003858 4.211414357 4.40029428 4.652006767 4.234581018 3.925505755 4.29158863 4.63972097 4.355845373 4.791065561 4.550170283 4.536819879 4.199876416 4.352640002 4.454134858 4.284097379 4.123958468 4.313868915 4.565713644 4.2227023 4.284026971 4.804028593 4.34685005 4.31365789 4.269580119 4.384673516 4.19370113 4.400954361 4.46946632 3.930447474 4.114132741 4.161409986 4.657764195 4.110944031 4.304024641 4.496537101 4.340157285 4.460184295 4.48676052 4.351511201 4.609899836 4.194347929 4.71445962 4.451351678 4.320990064 4.509829833 4.407099529 4.274713387 4.179513012 4.728828996 4.275315177 4.524858145 4.155684006 4.134553771 4.138420925 4.52706411 4.542523828 4.353587554 4.117694967 4.221735263 4.395375484 4.441417 4.757241675 4.557190558 4.336935492 4.313678423 4.165956075 4.438654172 4.317108606 4.643222381 4.823917089 4.757124104 4.526940555 4.293017068 4.634497537 4.304945987 4.128651393 4.236591095 4.62083142 4.253793055 4.260887261 4.463076034 3.947016873 4.252188133 4.601315978 4.309012716 4.218295889 4.104346454 4.651257929 4.102027888 4.576388588 4.296127887 4.925470856 4.236317019 4.473424798 4.420078908 4.581094731 4.126071767 4.465282709 4.370626161 4.4526407 4.409319087 4.353225366 4.578216176 4.780284989 4.689984852 4.724880212 4.400270774 4.637205492 4.533178539 4.637404525 4.365253024 4.289205138 4.772162488 4.718525802 4.572691117 4.615688571 4.483896448 5.031608579 4.205305746 5.033855141 4.49037167 4.140360089 4.396103662 4.110661472 4.206002781 4.684798049 4.464536729 4.339877584 4.109274715 4.508938492 4.848693614 5.033430477 4.367734941 4.334701612 4.248635497 4.240374668 4.032511335 4.236367275 4.649372693 4.771255786 4.283868821 4.06419123 4.137905682 4.170213881 4.250849781 4.19224627 4.149106184 4.20204857 4.833398932 4.340235864 4.415464831 4.563314371 4.694615119 4.555721553 +Glyceric acid 3.928441136 4.286770493 4.273123 4.606753207 4.64100415 4.429627888 4.612894346 4.610948045 4.202411791 4.221061658 3.878630073 4.428565809 4.445767061 4.515143855 4.210898193 4.166359906 4.575555081 4.580435326 4.297340458 4.197865321 4.334587751 4.17863049 4.178598739 4.100926903 4.345698323 4.084210798 4.267958737 4.1002765 4.204520988 4.199363764 4.499614778 4.386924668 4.700949574 4.279806529 4.27608955 3.6171838 4.389084605 4.936596686 4.839891844 4.257990692 4.347674977 3.954513416 4.156313677 4.302203696 3.851900697 4.32199623 4.610968647 4.072599081 4.297140004 4.337220064 4.295564024 4.14503705 4.557721906 4.297157481 4.535912267 4.513219312 4.073307459 4.309830895 4.261370736 4.169953605 4.325160686 4.125384861 4.492016277 4.182951346 4.27418143 4.455514949 4.252490733 4.135499815 4.959001676 4.208756998 4.255658201 4.510071226 4.351455709 4.353018111 4.300336458 4.286622889 4.315764156 4.70714448 4.178419881 4.58680404 4.155225378 4.221365498 4.28357326 4.220797452 4.492940184 4.283305837 4.214136554 4.40030801 3.878930795 3.917628299 4.051372805 4.693443443 4.082046293 4.443490865 4.500135979 4.344568955 4.440062967 4.704294898 4.704993631 4.709719753 4.038714981 4.490687448 4.87576752 4.094444621 4.202122109 4.076262016 4.40792521 4.193863259 4.526814771 4.432636968 4.06035193 4.242366649 4.300016563 4.513712914 4.349278523 4.251172035 4.152005968 4.093420178 4.28415043 4.472345674 4.432557868 4.210783209 4.343636549 4.280924321 4.446766508 4.358339775 4.073934813 4.554157338 4.339725371 4.310721585 4.21488806 4.900726429 4.730866086 4.366523492 4.543976549 4.46448814 4.371120421 4.512298743 4.234110766 4.641300242 4.357193334 4.314671053 4.542279793 4.831016079 4.370132937 4.361551769 4.749356447 4.228493064 4.514822819 4.646515789 4.778158946 4.370142115 4.308389396 4.458286906 4.740605349 4.274681914 4.6164659 4.456347692 4.322446637 4.255126871 5.247732175 5.144088293 4.644289353 4.324081338 4.017114805 4.166832239 4.409090138 4.105460028 4.168033923 4.255789191 4.44799317 4.128816434 4.226452017 4.031518286 4.13311698 4.044891998 4.146103434 3.781074624 4.391660363 4.034566721 4.341684644 4.515700719 4.236870172 +Glycocholic acid isomer 2 3.536032693 4.157624454 4.298946708 2.519657942 4.743202379 3.39570504 3.371440111 4.421920583 2.503637125 3.624656055 4.147178348 4.158125946 2.648425962 3.422973331 4.483293618 2.665736818 3.505113524 2.512092533 3.383278939 5.112191409 3.272766939 4.208323 2.575356958 4.115082081 3.217045903 4.702379575 4.561483821 3.471252879 4.577166533 4.186974325 2.474061884 4.112328406 3.587844246 3.826763987 4.900055495 4.585315345 3.966187289 3.56815921 4.2549843 2.710511973 4.549213369 2.246006939 4.084428672 4.464554527 3.730727402 4.15048329 3.659977118 4.593120958 4.410260041 4.042066293 4.564941294 4.248780654 5.039407221 4.396215615 4.220211336 5.106940358 4.188273973 4.753432265 4.719703688 4.549634781 4.655360686 3.886329136 4.365732779 3.918807491 4.818029932 4.939282744 4.201920401 4.089130179 2.844922931 4.433219112 4.525999827 4.725981348 4.001099757 4.623524075 4.208678699 3.940473596 4.967101792 4.200734883 4.209750137 4.908367108 3.872810389 2.577793143 4.33765289 4.404178344 2.543490516 4.141548374 3.508112087 4.12943616 3.660550284 4.220594551 3.687523719 2.767088158 2.443559356 4.510595559 4.484435491 4.633007682 4.233395418 3.393447626 3.433010365 2.605926666 4.858259157 4.643363581 3.075541631 3.834661675 4.803825432 3.236413412 3.85235151 4.605758379 4.548668362 2.761326164 4.103823816 2.186710204 3.346652109 4.262282784 4.383628735 4.154928305 3.173874266 4.465277975 3.700816243 4.12181461 4.589971494 4.310824712 2.847264644 4.372200803 4.666494075 4.479254269 4.441723528 4.306119965 4.413075493 3.674599668 4.501349894 3.974337969 4.536102309 4.374249149 4.402790156 4.102828814 4.641836485 4.931167503 2.540533851 4.016734529 3.882649308 4.611452286 2.917099233 3.018699354 3.862667826 4.569708658 4.195328578 6.025757653 4.717900745 4.109461592 4.262823299 3.959607876 4.473052464 4.108500163 4.242025512 3.949034217 4.2055663 4.035383383 4.068856044 3.819168201 3.361419303 3.006057786 4.160477165 4.629322278 3.931442908 4.583369317 2.52265633 3.864044121 2.979836788 4.045046817 4.267926146 4.048694802 3.926404985 3.843748764 4.59413546 4.698549998 2.714472817 4.412781845 5.234317683 4.536384237 4.202485253 4.682541821 4.487952687 +Glycocholic acid isomer 3 3.467331262 4.170019176 4.04584231 2.687939091 4.763984145 3.371073818 2.494700341 4.302818389 4.45399502 4.165655862 3.527396783 3.730585908 2.629218779 3.974577013 4.802508576 2.743153524 2.656180829 2.639756175 3.542011058 5.402272234 2.433761955 4.001526184 2.580462292 4.183075561 4.532942515 4.91137872 4.161312222 2.591561029 4.393354458 4.274987453 2.624819769 3.167670574 2.525878409 3.44211031 5.054551403 4.65929276 4.194470749 2.762163163 4.203149754 2.681079551 4.338768539 2.388412598 2.502714904 3.778795532 4.125938628 3.591436427 3.984097743 2.500698032 4.518881937 4.225983659 4.682757884 4.339686802 5.162326893 4.56970268 4.178683 4.353258076 4.492312217 4.49550535 4.829897118 4.121161592 4.959909396 3.67359465 4.326996595 2.466536354 4.471239798 4.762237981 4.006352223 4.059831908 2.891283149 3.855337397 4.403548201 4.596942517 3.847451042 4.599716326 4.11146372 2.995880319 4.914134649 3.623684349 4.054143915 5.154447667 4.209719859 3.197338344 4.342324125 3.64608438 2.673888777 4.184418421 3.49755383 4.102705898 2.847451728 4.069953636 3.151155642 2.897919474 3.535559038 4.476392851 4.506888278 4.640959992 3.695300023 2.634711625 2.705573898 3.892964816 4.868357281 4.741362155 3.804761636 4.090670268 4.849567967 2.684060467 3.98536555 4.767495699 4.624236904 2.739978116 4.235944884 2.323464628 2.334232998 3.679268851 4.505571868 3.799660576 3.173232091 4.392114814 3.46296181 3.474923848 4.550923638 4.610294603 2.946620374 4.148855703 4.267692032 4.509845676 4.237966062 4.153686941 4.634871583 3.476856256 4.31635168 4.048111723 4.626485841 3.582603081 4.234639337 4.001699954 4.989873042 4.858925268 2.633326774 4.320459742 4.623435508 4.78853966 3.994614008 3.813997328 3.850859237 4.628223874 2.919864842 3.365408732 4.596921597 4.022860408 4.653440735 3.325230069 4.42447248 4.328408788 4.32751312 4.30098646 4.001387705 2.465031453 4.178630302 3.025340403 3.391410045 4.116948408 4.131858156 3.741293737 4.22360699 4.418004585 2.516043568 2.581272632 2.964046324 4.151510187 4.024158064 3.343212416 2.479626288 3.055575302 4.49018465 4.406945093 2.687871809 3.945995402 5.960429978 4.445126639 4.082619463 4.560025299 4.427960683 +Heptylmalonic acid 4.299341699 4.587916986 4.245114639 4.101908743 4.270874337 4.417991574 4.389124895 4.433952209 4.023465338 3.178928661 4.334173906 4.085223134 4.12631072 3.976001645 4.317494727 4.260280913 4.353529838 4.372408327 4.387316136 4.096800815 4.348361642 4.575197828 4.279671433 4.302046194 3.968492364 4.259355149 4.488639946 4.210616387 4.553557477 4.267628155 4.258225225 4.165941408 4.138713958 4.128371814 4.386588411 4.128157269 4.204054638 4.070802904 4.189612456 3.871673193 2.810881009 3.917182417 4.225714769 4.12660887 4.122921351 4.217599113 4.038259209 4.316820062 3.92937153 4.34567719 4.200202588 4.21874852 4.383751316 4.320500946 4.384915425 4.266910187 4.243456253 4.268981923 4.154994917 4.367063825 4.579474298 4.15440187 4.282061347 4.393613461 4.094841008 4.694408792 4.482884297 4.354927869 4.145848602 4.379481338 4.43351869 4.084361267 4.382022154 4.523537809 4.330448318 4.014939866 4.280868336 4.447454727 4.520675798 4.763367 4.137858374 4.36968073 4.384717857 4.290442682 4.336049154 4.306504961 4.135101302 4.430871761 4.002378762 4.380132417 4.322680735 4.729687254 3.921150585 4.533774511 4.389253474 4.308995579 4.315712146 4.302363603 4.65561906 4.253077044 4.446069206 4.403475926 4.407114925 4.46916994 4.447080367 4.383714826 4.33772838 4.342121246 4.386683226 4.586079446 3.92659341 4.030748056 4.501346433 4.442128437 4.167966127 4.426717505 3.93526222 4.280209598 4.400839445 4.287299163 4.822050529 4.280223497 4.300257928 4.197441025 4.39458742 4.363714115 4.366069656 4.369664727 4.406489142 4.265505322 4.46858944 4.551488409 4.457948422 4.635960338 4.381154144 4.441256531 4.625869451 4.586694526 3.830120094 4.547904731 4.203003359 4.357710018 4.215141513 4.704270183 4.490997194 4.511836712 4.773444499 4.288127062 4.739196982 4.46211346 4.375795785 4.252357671 4.233088587 4.372344159 4.435643736 4.256285744 4.265061084 4.210479466 4.536633127 4.537628515 4.676421216 4.370838851 4.54567416 4.247712169 4.655694544 4.446052547 4.538551442 4.673979925 4.886256786 4.31906369 4.307278845 4.344951304 4.306520411 4.033535609 4.392998165 4.313706179 4.46248253 4.464805334 4.315697852 4.568915849 4.203649774 4.68775279 4.641594557 +Hexanoylglycine 3.700494627 4.288871652 4.154404935 4.076289465 4.575927515 3.904992197 3.877884894 4.230920953 3.912197505 4.273305742 4.04434945 2.993146422 3.84732681 3.773504324 4.685415827 4.26524319 4.055709818 3.874207291 4.721702794 4.721865525 4.074654967 5.165928117 4.217471496 4.759010737 3.440134915 4.036433773 4.111448656 3.696996627 3.828093211 3.969416085 3.371515451 3.893078862 3.924494652 3.744384645 4.299485384 3.825071824 4.292822345 3.472324466 4.060129116 4.02139235 3.602056594 4.019331842 4.452872236 4.058684176 3.704841558 4.113694448 4.243168488 4.291987266 4.093927531 4.42962114 4.231859965 4.41308139 4.127127886 4.590475637 4.164126598 4.239903169 4.263443759 4.095233506 3.948729151 3.630245817 4.390515629 4.531417942 4.127467131 4.382605722 3.641129253 4.667126208 4.499317776 4.100654988 4.331412623 3.825943385 5.050810051 4.424137617 5.023901082 4.627349096 4.425803649 3.953190556 3.800013717 3.387310875 3.98224588 4.160874031 4.025227766 4.240543744 4.413778962 4.427210559 4.499488755 4.400583094 3.654638749 4.671665856 4.149785773 4.056785881 3.854814709 3.874020972 4.126766339 4.731710777 4.264126464 4.485543686 4.086891547 4.596189218 4.379696931 4.558138326 4.535314492 4.394477612 3.946615262 4.464555803 4.203129498 4.609836496 4.584734376 4.379476498 4.115377816 4.173452852 3.860464301 3.853873629 4.106562063 4.768727148 4.219198021 4.032664636 4.162961393 4.356278414 4.86248789 4.269870265 4.621240262 4.246288764 4.130236692 4.195049429 4.628061846 4.041258601 4.430404415 4.198708588 4.415141749 3.762758065 4.677546029 4.298691096 4.523061592 3.975102972 4.418691095 3.929631039 4.257038095 4.594092916 4.579044601 4.07388784 3.942673155 4.192940523 3.838638669 3.985651255 4.281830481 4.534500588 4.518562277 4.567908445 4.100328869 4.176395675 4.336645865 4.746218793 4.271558047 4.314564898 4.132986243 4.296508856 3.896188465 4.403554337 3.776969919 4.072859857 3.943616844 3.915657387 4.110123161 4.993007277 3.939471184 3.850110737 3.984209632 3.819836878 4.120613502 4.762192373 3.85077852 3.743866422 4.082495999 4.169428674 4.247367805 3.701030497 3.782027769 4.363680085 4.333121886 4.719125891 4.829008954 4.236023979 4.450432172 +Hippuric acid 4.281181406 4.274764926 4.030600936 4.4377587 4.105510329 4.297233813 4.362889394 4.210852492 4.324765336 4.328093819 4.358286798 4.242481939 4.235294745 4.374712297 4.39645747 4.205689469 4.344658945 4.229599057 4.440386625 4.41045519 4.328135438 4.28950172 4.389438315 3.618722405 4.546502642 4.27928942 4.260910723 4.270060243 4.298188292 4.138378854 4.365884829 4.348309997 4.187430215 4.210255226 4.301518791 3.994188744 4.472814133 4.556826429 4.662422262 3.890562992 4.301730957 4.057448074 4.21002059 4.355647617 4.045400853 4.329895602 4.322173362 3.834974431 4.45184378 4.606589789 4.388172638 4.151875298 3.999333439 4.304840899 4.216879626 4.40497743 4.224938416 4.087002099 4.211363835 4.237846424 4.503335486 4.268106624 4.733404738 4.356578299 4.540218616 4.193280808 4.319896168 4.48671195 4.482043682 4.178296434 4.660852766 4.20366686 4.310835914 4.286814768 4.10728861 4.291238889 4.380042706 4.922998331 4.478193264 4.270458553 4.319780156 4.392282318 4.226292111 4.408696132 4.331386823 4.148944199 4.274367842 4.617327952 4.552965506 3.893501845 4.614562993 4.884670776 4.407130077 4.220684568 4.228891984 4.327189976 4.36006739 4.409281652 4.484422172 4.69733527 4.539179502 4.475007184 4.315367934 4.374963685 4.371871127 4.287049949 4.589736242 4.489876183 4.448628035 4.640588131 4.188972462 3.996302392 4.790488834 4.276373806 4.435834282 4.23276951 4.685424215 4.106025464 4.25233276 4.159998736 4.101688019 4.242501128 4.559037747 4.007443418 4.256428672 4.281113631 4.095520474 3.924342946 4.128061232 3.889590709 4.151648869 4.285397077 4.728645432 4.741148141 4.585295007 4.533389542 4.382599634 4.363833136 4.812642141 4.593856163 4.846698618 4.302381024 4.520806167 4.373805782 4.402355933 4.170850464 4.698599386 4.08915133 4.946422722 4.427300849 3.962706786 4.260480364 3.748521079 4.453949385 4.578057907 4.569995861 4.291736306 3.826629402 4.499493406 4.605220817 4.836919162 4.535375651 4.13720766 4.048475513 4.258218387 4.113680538 3.943688485 4.514435711 4.640780843 4.143918073 4.072874384 4.35791414 4.256345532 4.148999488 4.134123407 4.194779022 4.254028219 4.539702312 4.099636862 4.351963388 4.456370849 4.751454705 3.896687817 +Hydroxybenzyl alcohol isomer 4.238095945 3.602193865 3.948782363 3.368220034 4.324214366 4.043064848 3.778587616 4.278639704 4.578267158 3.88599815 3.910158559 4.149224738 3.83544383 3.636450775 3.920965394 4.055184269 3.967744016 3.95438243 3.840417028 4.615547066 4.075727845 4.111320633 4.011566708 3.826437949 4.242439967 4.385580069 3.647015945 3.903041839 4.416234287 4.206459426 3.981062813 4.34793272 4.136204117 4.054272057 4.26208997 2.618565082 4.154186878 3.785708712 4.46076539 3.996754115 4.468887035 3.667304739 3.672568761 3.769788931 3.57958633 4.490505476 3.817725974 3.920914438 4.990518828 3.805283938 4.265493802 4.196331358 3.884832901 4.333636998 4.14591893 4.418813752 4.155670063 3.924153826 4.814997891 4.535243211 4.231423076 3.78947273 4.723121412 3.976255353 4.333769207 4.059959077 4.289629231 3.910171146 4.156976673 4.01458566 4.269220734 4.31459281 4.114280729 4.432281478 4.64705089 4.404234273 4.603482331 4.267855985 3.977068906 3.933572706 4.214823939 3.881594303 3.653798241 4.32665794 3.750840076 4.325983718 4.912840068 4.542411988 4.613574103 4.195678046 3.945161317 3.721114131 3.966845221 3.872586236 4.219960639 4.496731561 3.898041059 4.882479632 4.42627767 4.328235308 4.294927583 4.630495646 4.25622935 4.133590699 4.162605733 4.372019817 4.287660371 4.479711336 4.174157489 4.120745738 3.82068464 4.245268805 4.070527458 4.036357352 4.638982812 4.074242087 3.818249513 3.599702831 3.971269738 3.46108935 4.036540915 4.516148364 4.612132391 4.468767731 4.303020879 4.115533454 4.650413816 4.19214737 4.218245071 4.063104951 4.393212353 4.406739821 4.371388454 3.847027409 4.659754156 4.20053985 4.297973276 4.40761158 5.525149578 4.182043465 4.322445192 4.099210001 4.268751616 4.443693583 4.184085991 4.233128083 4.619077472 4.450312072 4.49148768 4.765013638 4.18336194 4.311638131 4.034342256 4.141411593 4.197153012 4.166333722 4.374668288 3.901828407 3.642516999 4.252584517 4.457777181 3.623378123 4.245376308 3.907968699 3.73256083 3.990035382 4.13804275 4.039730651 4.070395479 4.458161978 4.007137476 3.868736136 3.870190818 4.187933308 4.223019968 3.973337482 4.373276529 4.17072504 3.988192913 4.114129541 4.236625508 4.189598627 4.550228372 +Hydroxyphenyllactic acid 3.959217417 4.7746982 3.457264319 3.805230444 4.567749234 4.413443475 4.398338756 3.899031787 4.182781481 4.052861502 3.701510177 3.727090801 3.832110389 3.945884164 4.001123201 3.93428456 4.061211166 4.452515919 4.651141269 4.221234657 4.551629486 4.014022002 4.347069881 4.607224561 4.140099182 4.623355189 4.229334657 4.610683883 4.300694283 4.257820381 4.196057652 4.033600172 4.190181129 4.363748239 4.36225888 4.529039362 4.58501606 4.721550016 4.48959368 4.031103382 3.887439925 3.421020593 4.209418663 4.399725994 4.344333961 4.233509276 4.196792095 4.46755515 4.057574804 4.237395496 4.512004238 3.728033819 3.203497905 4.328205079 3.501965065 4.175298261 3.96565232 3.880560295 4.33875911 4.003871643 4.612304589 4.336677673 4.282635551 4.047371866 3.778759797 4.369080432 3.951525215 4.112165721 4.409239866 4.004693373 4.986103581 3.88109775 4.408585254 4.225526661 3.201573806 4.27269161 4.190592708 5.077770746 4.44546873 4.287048036 4.288975789 4.541632632 3.806530397 4.403872445 3.718781541 4.298385818 4.279111453 4.435975955 4.342274794 3.669728066 4.055568739 4.270918034 3.77441146 3.899089252 3.607303096 4.20983163 4.151141669 4.290911369 4.457272827 4.208096346 4.338810266 4.145108336 3.792040108 4.198380221 4.170382368 4.466278666 4.586087143 4.012170362 4.277405452 4.562791765 4.407174915 4.395096692 4.316153913 4.261480471 4.14413833 3.634536583 4.757604108 4.003506306 4.410089439 3.781970132 4.968567493 3.797772595 4.079334447 4.09508471 3.745488717 4.053733869 4.335520026 4.609481364 4.155458247 3.339208362 3.996329249 3.983570608 4.74241778 4.360508239 4.407460709 4.266838128 4.281466815 3.462959414 4.29828428 4.223274125 4.378904878 3.402341252 4.387389769 4.499347989 3.862868802 4.648858889 4.977407635 4.258109138 5.093650954 4.190659695 3.598162996 4.093556916 3.690273805 4.444775963 4.035539612 4.211078784 3.60366961 4.031757488 3.953881579 4.932062447 4.902649063 4.325015164 3.961916218 3.655265521 3.477494018 4.067113425 3.748321748 4.847839447 3.844473841 4.281623768 3.542234664 4.720023914 3.979118095 4.135740449 3.923872798 3.877114564 3.662919671 4.687393606 4.39528041 4.843950551 4.546663495 4.766393928 4.61182424 +Hydroxysuberic acid isomer 1 4.144705403 3.914817917 4.118942163 4.016531806 4.513976916 4.522243053 4.285403698 4.342154264 3.924279126 4.366647384 4.469864155 4.976970144 4.162378033 4.049386125 4.240019565 4.334291758 4.542278478 4.389010605 4.138563572 4.438416093 4.498221059 4.303678684 4.221448876 3.988971473 4.435946462 4.241119434 4.262258144 4.79386579 4.488099749 3.945453277 4.393734888 4.397420668 4.301083657 4.380994205 4.127391755 4.204329514 4.254143488 4.44695043 4.522612738 4.381412852 4.299224006 3.990272339 4.394347075 4.040006973 4.567255087 4.435613289 4.400651854 4.212317152 4.542814939 4.375791888 4.329849213 4.359914932 4.458373621 4.543850609 4.11412778 4.447103472 4.20010677 4.538600054 4.228280646 4.325472577 4.252069179 4.220340693 4.351665407 4.3391945 4.023619504 4.489888042 4.523369458 4.20941117 4.194560521 4.249973491 4.361839662 4.005542959 4.648201559 4.56740739 4.081715484 3.848746942 4.26332104 4.124255829 4.460454156 4.827310291 3.995318425 4.229915118 4.291741862 4.610505536 4.647926358 4.868524459 4.306128222 4.257802822 4.21039602 4.58510712 4.60761948 4.639673641 4.077559092 4.409509612 4.711504573 4.776768461 4.126365396 4.93785731 4.456377159 4.556379124 4.541253146 4.192737214 4.559415523 4.296264528 4.140275927 4.299546615 4.115155954 4.381814031 4.24598474 4.379393303 4.347555355 4.085712798 4.860704482 4.45000418 4.254892161 5.085366473 4.269422264 4.103345178 4.335497007 4.616897702 4.650494624 4.36560137 4.357906847 4.19802683 4.246297818 4.304997199 4.580731277 4.383417485 4.153042026 4.193249037 4.532266672 4.210513682 3.877898772 4.41164339 4.553296486 4.392118999 4.255983333 4.245322848 4.375085662 3.501977743 4.11019149 3.071583994 3.923260626 4.251076891 4.470506744 4.150614595 4.652168676 4.312681933 4.581145079 4.319989308 4.123947159 4.698161147 4.258927502 3.898712888 4.282024265 4.150906295 3.804466045 4.475388248 4.275965071 4.427164904 4.597372388 4.447296374 4.269894533 4.885277779 4.668776693 4.038633134 4.296337821 4.311152862 4.769922833 4.330749606 4.32679194 4.05391565 4.559818415 4.063704921 4.851577771 4.229145143 4.338693741 4.20890346 4.325720566 4.55024814 4.458826922 4.683903096 5.206982705 +Hydroxysuberic acid isomer 2 4.295284686 4.351691984 4.050347912 4.476785326 4.474938192 4.145573966 4.098720809 4.632852997 4.448490639 4.39266973 4.312070036 4.109924286 4.219913588 4.19746051 4.592835007 4.327363558 4.446781103 4.636442485 4.355988418 4.409273441 4.483293525 4.489180971 4.196126612 4.267684629 4.141754605 4.130937904 4.209138076 3.754969139 3.764841597 4.207547204 4.096144918 4.259630436 4.124115295 3.927281919 4.183801393 3.832349421 4.299320282 3.783795559 4.2381878 3.96431657 3.111441418 4.162554788 4.260495207 3.82777952 4.173838719 4.212833395 4.274637707 4.48498412 4.508967048 4.528003039 4.251809614 4.616091079 4.283540389 4.189354995 4.476456189 3.082213857 4.221298851 4.294973349 3.226830641 4.158236387 3.568805272 4.326496164 4.241551292 4.572082909 3.973012405 4.594610387 4.543973286 4.112547206 4.019009756 4.150066567 4.40633231 4.628981905 4.693255718 4.92929413 4.296871725 4.101882673 3.812234114 4.507406599 4.338383646 4.823838229 3.478325135 4.083768262 4.449974878 4.437978499 4.963801205 3.795648629 4.06659559 4.327182723 4.071588258 4.532926992 4.645986412 4.465882332 4.163032797 4.536827574 4.753183221 4.986176411 4.415358637 4.520882778 4.464419965 4.560460365 4.467591553 4.226198194 4.470720527 4.492288795 4.126402668 3.183760163 4.4327761 4.103448591 4.326567569 4.218262475 3.959957684 4.027573089 4.309092244 4.813540287 4.148156954 4.395528973 3.701406888 4.394462608 4.841337727 4.788748719 4.317592094 4.31997786 4.414210832 4.614521049 4.819447462 4.444999096 4.569037934 3.928345027 4.471443693 3.788532868 4.413122574 4.50437917 3.681419431 4.218097729 4.163469208 4.123699519 3.992317776 4.669446561 4.223482269 3.988116441 4.136975939 3.637542861 4.089309199 4.453895655 4.100302891 3.990302589 4.709592004 4.367374161 4.568026774 4.206736023 4.44539644 4.899803439 4.437073919 3.986544636 4.334172635 4.382537367 4.253406907 3.942775454 3.870360096 4.428713838 4.568407465 4.289774046 4.107396519 5.493512973 4.558551711 4.230008977 4.175076848 3.683935878 4.419333208 4.775206575 4.084944527 3.944814642 4.579656668 3.637578915 4.442723844 3.962425615 4.349661246 4.164361872 4.476814169 4.510899972 4.21281001 4.499599349 4.112267314 +Isovalerylalanine isomer 3.878689037 4.16756426 4.427536001 4.377871091 4.700257705 4.067620181 3.918469764 4.481128255 3.978227936 3.96921542 4.435000147 3.782618485 4.109885125 4.126640846 4.362388596 4.128542209 4.52046266 4.816274879 4.881582233 4.473484203 4.090203183 4.641664294 4.810348877 4.41061049 3.891813535 4.337487178 4.310444815 4.259243129 3.944113094 4.018618094 3.404236722 3.90479245 4.045973611 3.56345757 4.236182952 4.071445735 4.318295694 4.231806988 4.218238304 4.214393128 3.727828555 4.167320546 4.639434867 3.591083431 3.972759138 4.166871169 4.690375615 4.499454388 4.281409674 4.685818606 4.361562863 4.527869568 4.152581637 4.372755586 3.551508291 4.312019652 4.316304678 4.419733914 4.492847638 4.266300419 4.401639232 4.317832308 4.026809684 4.23402821 3.784390171 4.673714247 4.437149191 4.129383771 4.713260681 4.397070904 5.131916989 4.679517583 4.822632615 4.466989858 4.633423069 3.839710918 4.537968182 3.926495195 4.357528973 4.377687298 3.8955673 4.370500777 4.632216417 4.077669937 4.616216404 4.432957188 3.762776451 4.454513418 4.556774702 4.336794407 4.207343361 4.116813201 4.176629032 4.884450435 4.20362285 4.788865118 4.167782638 4.29098975 4.472214003 4.478494063 4.471465365 4.019199996 4.588555574 4.395139782 4.373719515 4.081414196 4.375292119 4.321794718 4.348816347 4.285083705 4.223500809 4.305783072 4.563254019 4.88167997 4.321640016 4.234083258 4.230461357 4.469616379 4.794666699 4.460056758 4.465879402 4.419359982 4.353482286 4.34405663 3.800365997 4.573624383 4.652764242 4.434016511 4.49687697 3.994820609 4.704091606 4.195382477 4.639577304 4.271099459 4.583881075 4.361528803 4.441861357 4.397484496 4.518016536 4.237630274 3.980313926 4.594907223 4.19330765 4.055409745 4.289049743 4.678795643 4.523970774 4.208343635 4.459245714 4.449298544 5.144795656 4.34052993 4.460696348 4.241310551 4.405114757 4.417538654 4.463953025 4.746246313 4.11508846 4.382436302 4.321566288 4.496524497 4.178017519 4.803421276 4.357605656 4.173412057 3.929985731 4.088210528 4.226973681 4.614434609 4.226166966 4.020699915 4.269074644 4.233774078 4.467716308 4.086683923 3.984197959 4.32306533 4.036782513 4.549852667 5.34643563 4.749275476 4.725939133 +Ketoleucine 3.522784347 3.861881879 3.839057211 4.034677513 4.078886294 4.030811582 4.047805343 4.267998269 3.488479776 4.198069245 4.287264164 3.867967803 3.78285437 3.769634989 4.08887777 4.081537558 4.072513328 4.211880238 4.192746221 4.012416258 3.828692611 4.283847967 3.956520568 4.140424789 2.548341533 3.677585778 4.016670561 3.859831811 4.054434653 4.078033425 3.33608653 4.030430718 4.26964476 3.574594872 3.723144681 3.927695346 4.033660079 4.848883476 3.986944424 3.869654828 4.071363089 3.686068881 3.722594215 4.241460206 3.983362031 4.103256198 3.962928877 4.002679412 3.928708528 3.727543757 4.161231289 3.850190683 4.076822892 4.125873751 4.009543486 4.404597653 3.782862247 4.137503439 4.191406829 4.038506124 4.280495031 3.92966527 4.308019074 3.991823475 4.042428767 4.32753648 4.312975222 4.196583879 3.109829369 4.061428593 4.434328082 4.131824514 4.149933612 4.214480758 4.143904923 4.328402299 3.848935685 4.202825966 4.142391882 4.099579193 3.800830423 4.132821028 4.346008737 4.273154183 3.94789911 3.840887364 4.046866079 4.078569262 3.797634114 3.74102081 3.907901771 3.874289074 3.8549114 4.394699294 4.205591647 4.397073008 3.980323736 4.255340674 4.157183798 3.969991865 3.895664057 4.019581357 3.781553662 4.141971638 4.161000393 4.015411208 4.174416917 4.117735162 4.024833767 4.330538932 3.677130298 3.931391903 4.037318632 4.340830262 4.17221139 4.229656501 3.825924121 4.116695336 4.224813331 4.359040111 4.441488821 4.176207922 4.180839153 4.163833053 3.783676104 4.051837343 4.163831372 4.232623442 3.951647984 3.823312455 3.90111808 4.360216588 2.825294783 3.993464974 4.014417647 3.796855617 3.878765158 4.285205734 4.432123072 4.27614633 4.047265163 4.074745275 2.656454573 4.062305632 3.969759039 3.915112441 4.373375984 3.894389178 3.82154154 4.021733309 4.24408178 4.230270809 4.242521915 3.855018018 3.687941012 4.026763749 3.402025444 4.26360185 3.742488112 3.695978359 3.955536894 4.065041232 4.363756019 4.423605944 3.932973369 4.036659156 4.170043103 4.350912725 4.181166703 4.107573913 4.023646868 4.024618124 3.763540042 4.043427351 4.105615525 4.170680368 4.063520881 4.254683362 4.095361521 4.277928071 3.934981306 4.175478962 4.279006167 +Kynurenic acid 4.012746846 4.068846823 4.157414109 4.392389285 4.296854466 4.323642399 4.009272014 4.356818646 4.165834003 4.267298105 4.310529944 4.320476893 3.85006516 3.923432135 4.214422553 4.194590435 4.29827385 3.975408912 4.337554616 4.620768444 4.006888376 4.365831502 4.225926144 4.200446498 4.165236614 4.17939256 4.43247861 4.250972899 4.207895392 4.365396272 4.004943296 4.019720554 4.338927848 4.066294256 4.184172434 4.473982589 4.342110428 3.955581336 4.368409456 3.707358673 4.339726106 3.805894104 4.012599519 4.499136642 4.224863557 4.518864797 4.38218759 4.501899178 4.266805453 4.266631517 4.20001263 4.500444974 4.467431479 4.542554229 4.487592936 4.178487768 4.561981052 4.606450682 4.464989185 4.370280326 4.482833108 4.382266528 4.60654788 4.319147992 4.555443957 4.357598603 4.370369715 4.560383017 4.355562661 4.518402238 4.711883692 4.480253985 4.290939738 4.452693541 4.33632833 4.238131962 4.318978974 4.276225895 4.490078325 4.645889584 4.325358847 4.324896712 4.231757094 4.395193694 4.45695523 4.495560015 4.326055054 4.265329147 4.414563529 4.56266629 4.545475042 4.211828103 4.101718912 4.406310158 4.526483979 4.389907921 4.476973142 4.1007761 4.387168198 4.518491862 3.754846699 4.277818885 4.481097013 4.508962138 4.509906087 4.249842508 4.425014797 4.541190687 4.455510256 4.284838833 4.387862771 4.339622497 4.587972896 4.312493323 4.388433245 4.286201435 4.183398571 4.0885388 4.309211971 4.522513396 4.632258698 4.556519737 4.557255169 4.462341634 4.466743845 4.320219231 4.158507972 4.300642033 4.259888758 4.278507407 4.415327463 4.293274652 4.130579286 4.196905792 4.330109704 4.452502716 4.336547773 4.245626546 4.312584098 4.350863739 4.461459261 4.414344106 4.19251707 4.388388283 4.394166651 4.510295716 4.315295108 4.289984324 4.076098511 4.465190634 4.369087174 4.245381467 4.548631446 4.310796991 4.44414451 4.398650198 4.24288096 4.273955765 4.147731717 4.40529666 4.575394126 4.358005163 4.259410909 4.506484067 4.589253049 4.418940899 4.441226365 4.508359998 4.746235747 4.348513987 4.450485403 4.401273081 4.294544192 4.283250196 4.5716631 4.43153063 4.376272612 4.649479841 4.405740316 4.449623462 4.514316281 4.60396967 4.77474238 +Malic acid 3.534346694 4.069773502 3.696515321 3.940602141 4.231243326 4.333562176 4.045153992 4.351572535 4.033538577 3.922149758 3.849889509 3.82418732 4.216862635 4.031303531 4.304139105 4.112283888 4.148779453 4.387124547 4.391885361 4.451635231 3.758607255 4.721897754 4.134592645 4.041013346 3.735701363 4.213910943 4.009656649 4.096172997 3.981104145 4.442230802 4.012148409 4.714358297 4.399314509 4.217354049 4.334283539 4.340643559 4.062583465 5.248973304 4.236662417 4.199027152 4.348838924 4.227580863 4.048961551 4.090259874 3.824394868 4.393993641 4.710046124 4.153728801 4.437642241 4.198497145 4.436627595 4.224963236 4.131054884 4.677443003 3.821974598 4.325980803 4.157634189 3.981192157 4.920439995 4.105911481 4.181916656 4.164518002 4.143098072 4.279938887 4.346193198 4.494014743 4.349907462 4.265497545 4.295940411 4.119770543 4.418601906 4.263745478 4.570167407 4.382433981 4.242360277 4.588931429 3.820814986 4.615069218 4.291498892 4.241951781 4.081699621 4.302081388 4.298469352 4.371684968 4.317989728 4.319700061 4.064998129 4.284985339 4.069202503 4.070471731 4.439533243 4.063111248 4.40361471 4.287737293 4.370174494 4.594838809 4.301985675 4.092141633 4.238567472 4.381218742 4.428831304 4.718649562 3.921851947 4.153190532 4.295582766 4.388161779 4.237407758 4.121574866 4.13695682 4.583274969 3.902804436 4.040225373 4.449904757 4.231122826 4.384148862 4.113776577 4.48836889 4.027391622 4.358388483 4.220419514 4.424974852 4.042840872 4.179133904 4.27531713 4.415507072 3.98686536 4.54838617 4.436866668 4.530013431 4.111850208 4.327279047 4.2951689 4.787562248 4.239612869 4.315758663 4.483307357 4.223291241 4.270803326 4.770570817 4.564503438 4.498604428 4.497371502 3.921826267 4.559860413 4.322029162 4.841735908 4.667929184 4.449208275 4.515982374 4.53654634 4.846208136 4.090322109 4.324348253 4.247444891 4.10181752 4.16544904 4.321785884 4.353328685 4.300085179 3.985387538 4.590096164 4.804992446 4.537420474 4.323326933 4.095893014 4.301015021 4.472980245 4.333634287 4.307040977 4.506594072 4.059781111 4.412783129 3.871285467 3.986032319 4.390161979 4.288514173 3.972771953 4.370143259 4.14623146 4.727567341 4.587614075 4.641852928 4.446096988 +Methoxysalicylic acid isomer 4.060952031 4.112546615 4.288847415 4.458436925 4.189122646 4.562834529 4.009719041 3.906832407 4.694805934 4.970444034 4.676988099 4.389579971 3.854946976 4.400599379 4.18617087 4.422786278 3.323350499 2.987293978 4.442835162 4.308571536 4.20391787 4.442077419 4.020279518 3.622024678 4.374117434 4.279265901 3.085641914 3.804577605 3.865870399 4.903225484 4.538105397 3.805652796 4.821084254 3.992747496 4.383416047 3.377111562 4.261983508 2.109093389 4.905334457 3.794701257 3.66638302 3.730425618 3.268374328 4.531302899 3.546849666 4.800743674 4.349585482 3.894923492 4.226748027 4.049590291 4.216032486 4.136902885 5.237012867 4.646455525 4.219377682 4.662697504 3.304849447 4.287288957 4.393472749 3.808821818 4.189535303 4.383886089 5.243215 4.432488403 4.770558267 2.681691398 4.286847582 4.526059106 4.662944258 3.957341615 4.474705848 4.097400103 4.981472367 4.371442564 4.297737503 4.566869793 4.080729427 4.608125487 4.281645984 4.564848738 4.707533691 4.20219478 4.304771893 4.320174224 4.173095989 4.093827659 4.247995928 4.334833513 5.02655211 4.048762631 3.823431485 4.366620072 4.347998872 4.627333312 4.64204667 4.670646439 3.114853134 4.433799287 3.80001037 4.548736628 3.174555812 4.761015589 4.436204017 4.49301415 4.565814769 4.531469651 4.391461859 4.564735391 4.672334609 4.460783385 4.528518534 4.866579673 4.899487239 4.414628357 4.718513337 4.277097588 3.999656135 3.954340987 3.999573303 4.221231333 4.316516412 3.656058164 4.473970933 5.492421166 4.404297627 4.30281766 3.761315628 4.174811983 3.621221229 4.923717544 4.449136821 4.64825022 3.636778958 3.999423675 3.783456584 3.906170957 4.651629702 3.832297308 3.901628925 3.949164973 4.601518728 3.828048787 4.817574135 4.356593453 4.544337266 4.449714562 4.566747142 4.568582937 4.796861927 4.433345479 3.451249932 4.27941558 4.54799299 3.828523468 4.708330493 4.452925761 4.481455314 3.314501715 3.92883579 4.968472751 4.377501869 4.262256203 4.078000218 3.926755553 4.63068174 3.950124247 3.910855988 3.993505637 4.597300917 4.240450343 4.391160926 4.199543663 4.111434583 3.967947811 3.823797376 4.42346304 4.388570988 3.719727183 4.128946671 4.347302549 4.142374765 4.287596947 4.176100819 +Methyl (hydroxymethyl)pyrrolidine-carboxylate/Methyl (hydroxy)piperidine-carboxylate 3.899312973 4.233934536 4.520556275 4.35559171 4.407202469 4.232537051 4.249504177 4.397296209 3.773416636 4.34729037 5.186590378 4.535448387 3.211032645 4.135758092 4.475619099 4.428625338 4.813159862 4.70886243 4.375575493 4.31094144 4.491268384 3.927232963 4.540481337 4.308581507 3.302248204 4.151872243 4.493944894 4.234071347 4.186476372 4.705388181 3.607576207 4.41104398 4.353059633 4.027610505 4.19823232 4.448144808 4.886207118 3.860022872 3.969514647 4.269530066 4.373774713 3.186123341 4.876890745 4.629110049 4.240819844 4.412809091 3.967919212 4.54826158 4.205132004 4.148091174 4.799881689 4.121668988 4.084524739 4.800355421 4.127774598 4.172305401 4.699537804 4.739071358 4.51134703 4.243963408 4.198252568 4.568404225 4.929490316 3.907736159 4.479382947 4.452945705 4.192916401 4.360984508 4.031983903 4.244858201 4.848808398 4.38477094 4.855925862 4.832920554 3.904552233 4.405422794 4.474946597 4.48468437 5.025890602 4.118918645 4.148664136 4.387835901 3.941271725 4.552441989 4.004115908 4.690835504 4.111860807 3.939747133 4.122197203 4.002491439 4.423396385 5.116725057 2.989258929 5.06079674 5.012677826 4.928610084 4.567139319 3.592448444 3.967860573 4.328430132 3.709541741 4.041881053 4.619437975 4.428287694 4.668683113 4.152031201 4.04939548 4.49743367 4.251476875 4.957190502 4.330673626 3.890509805 4.449877381 4.424711371 3.73290667 4.031157711 4.20144362 4.587364789 4.681879372 4.498395396 5.055394773 4.164920652 4.603126063 4.046975266 3.915565446 4.41958122 4.555014517 4.055687815 4.72022915 4.235378875 4.476740605 4.145586119 3.91775998 4.720206579 4.408831277 4.452540655 4.571191837 2.710569121 3.944666136 4.125026469 4.460279916 4.329960954 4.012570587 4.466839367 3.964973443 4.574751398 3.999326826 4.530579731 4.219569984 4.416083748 4.213264101 4.744502009 4.200152861 3.773993257 4.532270917 4.075978117 3.761242048 4.576400581 4.143818844 4.26065744 4.469650648 4.686495435 4.225788269 4.463726512 4.334691214 4.356876487 4.015965341 4.616068049 4.371356788 4.510472107 3.977130034 4.327802404 4.568152085 4.12484649 4.306403448 4.672027031 4.310193863 3.934298716 4.592896303 4.695167723 4.620513946 4.440138437 4.755157467 +Methylinosine 3.979666714 4.191844897 4.362142931 4.272384159 4.487805084 4.378914363 4.139627672 4.35572884 3.799671623 4.216277497 4.341552408 4.426027462 4.212118607 4.031605082 4.295766854 4.249186693 4.433740916 4.077336053 4.282154632 4.127707969 4.176079951 4.203686736 4.253369219 4.305828404 3.803012298 4.13313631 4.479357478 4.188951285 4.591616199 4.428881183 3.446453555 4.002942918 4.264590161 3.938392056 4.225819497 4.407909605 4.22636798 3.961365137 3.997475881 2.092805747 4.407251232 3.742384683 4.119943402 4.087403226 4.14088594 4.203143645 4.225033075 4.372033717 4.483205679 4.332565391 4.304506709 4.515378358 4.176719337 4.675071351 4.215182144 4.218886021 4.364237986 4.215952385 4.641747576 4.29916152 4.40511548 4.354519746 4.374019418 4.176782673 4.567713434 4.601482834 4.311779888 4.373154535 3.890738317 4.43263288 4.719642454 4.181370807 4.610282988 4.448302077 4.258120642 4.263024978 4.065580685 4.24878583 4.515244102 4.50150076 4.181922329 4.311989013 4.386034178 4.587250743 4.382835833 4.020608518 4.27157868 4.393744071 4.161786115 4.324379589 4.074945339 4.202957389 4.223743842 4.208168357 4.403894101 4.591294731 4.41941123 4.348028988 4.508646477 4.516240547 4.329624207 4.368593973 4.29933577 4.417631453 4.240214344 4.511603578 4.358934433 4.47351656 4.273009354 4.427613573 4.081407095 4.224809433 4.256754904 4.335744987 4.221093348 4.353435994 4.220312808 4.282896704 4.452688192 4.481620234 4.758371109 4.281989406 4.279010426 4.311183273 4.594918221 4.313423159 4.410681478 4.333840712 4.481155058 4.272189444 4.509407834 4.470557013 4.029223347 4.413571788 4.398387285 4.418546369 4.468682356 3.752094636 4.210881537 4.02857611 4.373321824 4.338678612 2.27217509 4.396386554 3.14959228 4.256287744 4.534402106 3.999681559 4.218804264 4.121752802 4.349464414 4.482570643 4.318126087 3.981242859 4.082143663 4.233079654 4.053242236 4.210734054 4.294900093 4.365060059 4.405620449 4.247772943 4.670905069 4.713122954 4.422002641 4.339492094 4.33972484 4.562381924 4.653462071 4.385104504 4.271697482 4.186971485 4.26165763 4.196887882 4.257340595 4.35725992 4.339862897 4.803101534 4.332232576 4.536402955 4.383072459 4.401136643 4.547549743 +Mevalonic acid isomer 1 3.329768714 4.01885596 1.55128105 2.800934288 4.112110246 4.144181722 3.266306242 3.548106496 1.450744405 3.890604119 5.414234532 3.434944007 3.288683315 2.659873804 5.281449243 3.823955243 3.887871621 3.940179057 3.968164472 1.437872137 3.499853957 4.560265779 3.755147141 2.599752557 2.23822886 4.753462502 4.459311073 3.910512793 3.394074337 3.86234362 1.986649296 4.373589103 4.483316872 3.188947997 3.643117677 5.631947911 5.778234719 4.342018885 3.787732344 5.411551874 3.944692581 1.768900941 3.544871834 3.707130837 3.779851683 5.463196078 3.5476364 3.717418009 4.011571837 3.720767967 3.892619609 4.392909575 3.770370485 4.641493433 4.054192872 1.57837002 3.398297034 5.241902036 4.532136532 3.792704991 1.717365934 4.096117725 3.899798089 3.897687042 4.13970206 4.280247232 4.491425061 3.875900821 3.741221643 4.077613133 4.425680953 4.029188057 4.485756 3.946067132 3.557552791 4.161107904 3.469574506 2.173480289 3.624065496 3.839294538 4.089084936 4.368441341 3.566072258 3.526212189 3.527633165 4.122670725 4.044074066 3.310279714 3.808402658 3.502572583 4.025560484 3.460012368 2.915323603 4.140850892 3.787825769 3.583514446 4.356772353 4.741681861 3.663322466 3.052734099 3.165872601 3.065972444 2.105901578 4.256446681 5.240803343 3.534537557 3.476192506 4.176661172 4.086790889 4.060151495 3.249549955 3.629384379 4.73777147 4.045241987 3.350672539 3.75042517 3.537314649 3.614248388 4.930515151 3.55285965 4.98577501 3.86112046 4.585115302 3.926586012 4.135818984 3.597819221 4.035827085 4.126097854 4.609116594 2.867036597 3.432469709 3.853016375 3.509530047 3.832708303 4.354521391 3.56524289 3.63231974 3.948999292 4.011461657 4.253022053 3.36635185 3.892230775 1.877408149 4.218293669 3.868060055 3.677959432 3.924576676 3.732474881 4.400633532 4.884217649 3.440541697 3.784883446 3.975001105 3.525072625 4.744875812 2.864421734 4.319293931 3.779487054 3.488463582 3.613148976 3.69844603 3.236850067 5.179596383 3.702668326 3.773538731 4.63146966 3.51188323 4.247238657 4.259951873 4.779933449 3.847600876 3.878634272 3.52874316 3.316667446 4.347027385 3.82093297 3.891593055 3.901150335 4.01205817 4.157738639 4.319196889 3.827124391 4.188049575 +Monoethyl phthalate 4.186149533 3.347641278 3.824038574 3.091727965 3.655938217 4.240828147 3.92916447 3.232053199 4.191019034 4.869509077 3.452697146 3.577856926 3.917557128 3.788281036 4.15534968 3.783713871 2.59111257 2.646661085 3.345677786 4.454533442 3.584592975 4.472116408 3.245582122 1.592161096 3.240506988 3.851157024 4.583003853 3.909560071 2.546271718 3.844327347 3.727405393 4.786231889 3.863192893 3.817315616 3.183211562 3.905220001 4.308478315 1.875277011 3.505072748 3.276251991 3.625287884 3.837302832 3.75108969 4.160431669 3.020595461 3.55861859 3.643076347 4.057017223 3.924223061 3.415201389 3.573439451 3.873738794 5.128802546 4.354731551 3.551776409 3.984297976 3.284431863 3.915980178 4.665948294 3.116653382 4.864481721 3.916022558 4.870521355 3.122522739 4.626306462 4.468088189 2.712161119 3.941118054 4.629057709 5.16256182 4.669070252 4.074333075 4.960050954 4.842911203 3.304665017 4.77712504 3.701976999 3.039650692 3.241481836 4.080715355 3.984561182 5.153158125 2.99543817 4.043905291 3.784858019 4.034692952 2.930379282 3.129481397 3.889687283 3.0324151 4.29209414 2.023701271 4.294901489 3.97783233 3.215635214 3.641038029 3.439987942 3.840928015 4.115968256 3.964875554 4.607871999 4.097981574 4.058786626 4.18082311 4.215871913 3.878959659 3.080075891 3.404764058 4.085073819 4.209089302 4.964286476 3.876730704 4.788699165 3.517087561 5.054329171 3.120099901 3.550672471 2.984302977 2.883250783 2.892385904 5.387827386 3.591682728 1.909198611 4.659684859 3.823808082 4.136709749 3.4930608 4.282988162 3.325438948 4.184967391 3.311638774 5.193632682 4.985035209 3.135515896 4.37760101 3.699209999 4.528127839 3.755191637 4.610147532 5.650792689 5.260533744 3.254067065 4.503890397 3.447802749 3.958665566 5.297744061 4.581762371 5.044901714 3.931139951 4.123857144 3.059027107 5.04483697 3.144806035 3.659856214 3.08950507 4.480084802 3.910751848 5.278054688 4.385351961 4.407322549 4.114040903 2.961346086 3.786035186 3.495810731 2.840106468 3.914692573 4.813414578 2.777730855 4.362417861 5.345533497 4.786583673 3.35354784 2.482702149 3.084784912 3.705556412 3.209044804 5.338140882 3.768419149 3.810374348 3.444242507 4.093356435 4.128964477 4.383778336 +N-Acetyl-aspartic acid 4.117673299 4.428008423 4.20571486 4.385727239 4.253549056 4.363792315 4.17251627 4.426590612 4.146049138 4.229702296 4.185635586 4.379919597 4.468380285 4.24572544 4.449904543 4.130868553 4.581894324 4.261440331 4.677721126 4.604583971 3.983439791 4.529516369 4.385609444 4.257778296 4.371509605 4.200262648 4.342894754 4.601978825 4.323946097 4.263684145 4.200976223 4.349149769 4.218111164 4.094733605 4.303832991 4.269466437 4.245658181 4.222819349 4.485445645 4.087595362 4.354635751 4.182230166 4.381225602 4.26236428 4.204068834 4.39336885 4.407689054 4.49080592 4.41415523 4.357848076 4.230005922 4.389271791 4.540391672 4.460784736 4.464338818 4.462174032 4.28321563 4.171052699 4.415193494 4.263487219 4.445067399 4.352372295 4.271972546 4.429538171 4.442196908 4.613408374 4.289417728 4.152841788 4.328022563 4.444020711 4.749250937 4.456038913 4.313256598 4.451627163 4.285574505 4.134492359 4.168142751 4.361346667 4.427568158 4.524975607 4.201072999 4.338593857 4.300156507 4.386067899 4.505774091 4.33000985 4.403566697 4.423440016 4.204877186 4.292376939 4.497193787 4.548869993 4.306390178 4.188508619 4.345139857 4.422043998 4.252990281 4.704905982 4.691233929 4.577451503 4.420679814 4.600801811 4.423605069 4.360149868 4.216566382 4.417551144 4.494948108 4.374923833 4.313779798 4.154477076 4.162853775 4.38503998 4.23628203 4.317141578 4.437083714 4.202597921 4.677655605 4.449589415 4.290875004 4.145962986 4.81286811 4.536253548 4.588522864 4.196580391 4.231932637 4.346866775 4.373064276 4.464556604 4.296434071 4.398940169 4.589677326 4.708719241 4.521277013 4.470084938 4.584214938 4.323525556 4.621763004 4.437426669 4.397254037 4.148132119 4.522836316 4.471210801 4.496026036 4.322945053 4.397015511 4.281962527 4.711415673 4.083525533 4.549700613 4.414223504 4.41708129 4.441320027 4.34655768 4.332021878 4.551616218 4.353644797 4.093469594 4.177435167 4.543959515 4.378205913 4.980978659 4.547834722 4.49449042 4.263651736 4.402640312 4.547112829 4.397689439 4.381203248 4.799388556 4.554007231 4.225271655 4.387688914 4.287664014 4.363958525 4.464589331 4.357733792 4.4155156 4.49043134 4.341535783 4.107648279 4.72267878 4.761037511 4.60787629 +N-Acetylisoleucine 4.093392933 4.306259479 4.268660372 4.01720264 4.11461914 4.483259885 4.011141232 4.386072995 3.941465569 4.200706948 4.390884063 4.032094103 4.378304321 3.928265366 4.223293581 4.474423317 4.327815254 4.612486558 4.485848538 4.176618531 4.214823765 4.468380804 4.084432411 4.196963877 4.183414831 4.156462888 4.453212424 4.183084163 4.291202438 4.358505132 3.922603205 4.331735091 4.335840166 3.878485743 4.153248276 4.446454125 4.154598899 4.054242817 4.245752523 4.035446854 4.394694652 3.938318766 4.112851835 4.378255715 4.243514064 4.345535633 4.554808438 4.411035463 4.142014503 3.736277591 4.532461585 4.30772129 4.329159225 4.441784142 4.340362581 4.201270851 4.285520313 4.770268214 4.356948292 4.314535228 4.44204279 4.112154002 4.581879769 4.033712503 4.166179151 4.511751867 4.581188785 4.400568511 4.313858944 4.404867557 4.663460874 4.491833269 4.224499651 4.502740767 4.160629404 4.421748443 4.332843547 4.289813738 4.417317207 4.558394509 4.003062599 4.474956513 4.119427642 4.61662265 3.956775815 4.405136379 4.077310664 4.120486533 4.057382775 4.092030272 4.401945486 4.308141134 4.411088489 4.449163109 4.375282362 4.537661873 4.247754844 4.149903163 4.366243279 3.99828563 4.362978727 4.405027141 4.260632476 4.401018613 4.505264485 4.514928777 4.415582094 4.506847965 4.292880382 4.671971476 4.299037457 4.194630615 4.327174605 4.408331738 4.24752175 4.430822166 4.095315065 4.338747771 3.87334117 4.582527576 4.619242083 4.292628349 4.356011288 4.55589852 4.246649405 4.340173868 4.371669017 4.334263343 4.309951004 4.169432674 4.395145331 4.309345915 4.192730493 4.144633207 4.353742218 4.589586787 4.199041104 4.346503353 4.101002997 4.541144759 4.421004561 4.23197999 4.117095575 4.587659761 4.289363732 4.442539084 4.472488997 3.840110378 4.759075871 4.401684664 4.463637485 4.311989568 4.456102108 4.187092201 4.359828239 4.1925079 4.079305443 4.324324347 4.125142065 4.344995768 4.369572042 4.331208257 4.711112204 4.396522132 4.308202854 4.470227797 4.22995693 4.470316758 4.551559001 4.367660335 4.30224457 4.392754135 3.983064735 4.421182554 4.437380697 4.54615836 4.434133108 4.272493449 4.440495838 4.421061622 4.380774708 4.47809306 4.688224266 +N-Acetylleucine 3.411935939 4.478246245 4.266854201 4.027336877 3.237243702 4.370739348 4.049776629 4.321892825 3.719506534 3.747108951 4.324902966 4.38990265 4.544151966 3.928668072 3.717229537 4.238244903 4.179498278 4.553247918 4.585045749 1.252632365 4.036372096 4.197684016 4.094522222 3.968414669 4.04546133 4.032668166 4.370806292 4.006400196 4.258586363 4.072601877 4.038946049 3.906651262 4.151898691 4.146175691 1.373469001 4.485477297 4.262708097 4.607094345 4.201926753 3.849307467 4.496933848 3.935923043 4.213467708 4.013346424 3.896396827 1.387462564 4.362232788 4.368454549 3.426599233 3.040968482 4.571239734 3.789115103 4.509703049 4.926268337 4.091755266 4.156831695 4.177995101 4.5301362 4.837511001 4.247099026 4.169462165 1.360056413 4.712349698 3.662011871 4.210748489 4.290033896 4.090269113 4.499998165 4.25289589 4.182027921 1.446944602 4.720268635 4.205799662 4.378293656 4.663153698 4.159774181 4.280734782 4.147809341 4.01715964 4.055017583 3.730857457 4.556932032 4.318343355 1.447590476 4.000363423 3.845094202 3.636191412 4.130577544 3.91935408 4.039553232 3.998049454 4.223809349 4.178654426 4.158416807 3.982589095 4.645453937 4.103243061 4.084384427 4.254109553 4.059200151 3.457505617 4.118927849 4.073307966 4.285909618 4.766498128 4.180234337 4.211253849 4.197592432 4.49180972 4.840598523 4.402721164 4.23268261 4.003121281 4.057127798 4.193316548 4.195242354 3.934358743 4.480363233 3.700448336 4.399179372 4.155174936 4.635719842 4.139995119 4.399878869 3.892737175 4.20022387 4.080847603 4.803071915 3.605887498 4.489921541 4.676792496 4.985624358 4.353765899 3.847578506 4.006750217 4.635485192 4.14016084 4.685227699 4.316059982 4.979799557 4.357369803 4.442562003 4.044954003 4.977383445 4.48556449 4.888551806 4.408711185 3.900245484 4.725370421 4.65362645 5.009564658 3.969440713 4.698791862 4.8249116 4.337884131 4.424946069 4.392416348 4.179423197 4.485667452 4.317898788 3.909394109 4.506696095 4.679795467 4.164901633 4.113008581 4.226648569 4.369350144 4.547350567 4.587619203 3.418594965 4.223696796 4.10354029 3.880060715 3.991231643 4.152324514 4.347810683 4.213627407 3.921782392 4.251468658 4.288331935 4.107483976 4.453917522 4.512905008 +N-Acetyltryptophan 3.792114594 4.484241506 4.254060712 3.645017863 4.193700821 4.221704854 4.001768564 4.348902612 4.188240169 4.139993279 4.0027179 3.864348148 4.187264768 3.685318475 4.318309622 4.248804846 4.065573562 4.329738641 4.498627819 4.481776916 4.476892983 4.390793115 4.289966076 4.048186311 3.831594434 4.374106781 4.515282319 4.023445727 4.060282039 4.600997759 4.210914331 4.347922408 4.261528699 4.005414766 4.429975516 4.600663853 3.701741009 3.394503547 4.472227325 4.253035585 3.75318104 4.0071026 3.944243002 4.342421133 4.289486428 4.555628903 4.176816458 4.331818138 4.661430532 3.752913943 4.64348302 4.138212207 4.248260121 4.772517561 4.056809742 4.41827191 4.503252594 4.590738081 4.350951834 4.339266371 4.473594178 4.326589448 4.425253841 3.801003076 3.700885641 4.007036576 4.493100353 4.464411666 4.371274981 4.427861454 4.43452224 4.666639615 4.327676605 4.251967363 3.999759051 4.412858406 4.352777472 4.481229505 4.65144922 4.197837027 4.232342892 4.304434567 3.956895772 4.507118499 3.643188166 4.359867773 4.364240305 4.258488936 4.216699993 4.039878928 4.244485258 4.229518949 4.476823156 4.427604468 3.866027183 4.787970469 4.417812308 5.018721142 4.450059403 4.338579722 4.464370475 4.954789196 3.201638735 4.433133502 4.474183756 4.292137177 4.328235643 4.532092763 4.36466385 4.554354972 4.031713914 4.158858555 4.447193387 4.024990973 4.360870408 4.040923085 4.424499455 4.220897061 3.772289744 4.393171017 4.47240325 4.189883819 4.363330292 4.384760209 3.863801103 4.380330625 4.617069533 3.904715414 4.517857911 4.245071693 4.190362837 3.940867629 3.879870286 4.156897507 4.475330565 4.446035883 3.979681451 4.086306228 4.674671971 4.340283574 4.602378257 4.276892629 4.206951669 3.66422721 4.483019579 4.406351128 4.610847825 4.496446835 4.902989926 4.34880434 4.331674836 4.132485284 4.27511983 4.298158401 4.240036541 4.321068593 4.36893211 4.169557295 4.389724451 4.342044039 3.642104575 2.342342656 4.718235431 4.182039725 4.008021848 4.389654512 4.017129309 4.561795533 4.558337842 4.431771598 4.055354436 4.276159044 4.436308004 4.254393321 4.357129041 4.269124588 4.176829148 4.286452011 4.102987085 4.336219072 4.39476028 4.30243077 4.305107691 +N-Acetyltryptophan isomer 3 4.559494909 4.038887064 4.333962331 4.621738785 3.276002059 4.174603772 4.219100595 4.802701221 4.174870057 3.84640755 4.7466645 4.312784671 4.324868794 4.548185194 4.584805247 3.892834504 4.440624976 4.381021444 4.432310469 4.248648967 4.269092146 4.925012546 4.353527057 3.819131366 4.289286017 4.018294515 3.576258674 4.640146179 4.427638725 4.234870766 4.071449945 4.056532422 3.831339194 4.028401182 4.420406876 3.77497406 4.470605833 4.79935696 4.317735216 3.77618964 3.837427645 3.771032017 4.688330955 3.99392049 3.620562851 4.369688566 4.33467519 4.686165045 4.390923256 4.424870795 4.337925813 4.349701531 3.869069084 4.603122769 4.290506836 4.60452742 4.178865675 3.678022694 4.612135005 4.386374325 3.982315278 4.257497548 4.529557877 4.217134178 4.373914201 4.279557688 4.136927665 4.448094501 4.368341473 4.747791917 4.765930372 4.054875763 4.472394483 4.748793421 4.965176171 3.832536011 4.493240282 4.347522955 4.25422 4.533289237 3.66198122 4.3688315 4.613272754 3.592792063 4.368091112 4.061858222 4.075893527 4.128221256 4.340897786 3.513404387 4.123312024 4.634084655 4.390508986 4.398026065 4.59079396 4.26069176 3.423228464 4.100723617 4.674345999 4.233932367 4.236726596 4.666772698 4.604615242 4.281942972 4.596424557 4.509286784 4.037164938 4.403692163 4.324546197 2.678111126 3.823563064 4.004818673 4.726344276 4.523393088 3.991258749 4.353642617 4.24758893 4.288624427 4.126483191 4.423399235 3.795463806 4.160351387 4.938242983 3.845472216 4.353668593 3.980657593 4.360862367 4.315415115 4.341601385 3.401314049 4.581188597 3.823257638 4.352312901 4.184954251 4.328007465 4.484669484 4.579685188 5.108833669 4.182741259 3.917922457 3.95667289 4.649023815 3.999073448 3.652302618 4.226307164 4.367943253 3.772799342 3.66003382 4.731834228 4.358107107 4.388836368 4.315565477 4.61860606 3.959845783 4.271825723 4.20499549 3.923169218 4.345935741 4.472189153 3.579747925 4.718615767 4.32642541 4.751658536 3.913796202 3.878454568 3.940924297 4.248683428 3.996379832 5.017935618 4.423754207 4.866064129 4.104907422 4.648059583 4.128809763 4.484915832 4.138861231 4.310123876 4.116370852 4.316416182 3.922917461 5.024165168 4.768230502 4.413212414 +N2-Acetylaminoadipic acid 3.631931485 4.493697972 3.904043409 3.997636224 4.330821932 4.210519908 3.980256318 4.409265825 4.497058936 4.168541461 4.255754455 4.456862101 4.034675732 4.068235177 4.431279698 4.286634726 4.501533483 4.484303217 4.181696443 4.420602819 4.131043532 4.187416093 4.047494495 4.159603317 3.998529794 4.025050916 4.340780859 4.000968018 4.416097069 4.548893489 3.752581746 3.815653732 4.388543157 3.991505459 4.479613053 4.663311627 4.413249623 3.850999735 4.163490806 3.715488509 4.357418828 3.581254501 3.847453369 4.160136577 4.144150326 4.519528403 4.267855482 4.373240413 4.62805497 3.865115964 4.166662968 4.687241899 4.302793904 4.611491653 4.217542267 4.194899545 4.450316429 4.045307441 4.736861547 4.438132488 4.216669879 4.302702631 4.497297553 4.192227161 4.391837757 4.627237172 4.446288995 4.420441886 4.012070601 4.221980986 4.418465717 4.491957016 4.684069262 4.462448893 4.53002242 4.312481059 4.353201986 3.940130605 4.300241235 4.471871119 4.349851896 4.409457073 4.492335806 4.593733789 4.312282011 4.592382948 4.191925486 4.288141617 4.476380499 4.461376425 4.093660493 4.148346136 4.086497422 4.163553668 4.390791796 4.704537609 4.747792458 3.949561438 4.790572543 4.349200483 3.909438058 4.463588574 4.099655988 4.488029214 4.495264424 4.228082031 4.408012605 4.121597622 4.370665414 4.442940601 4.28851256 4.168371126 4.562686663 4.344160811 4.104345014 4.278303289 3.565677025 4.374421533 4.263252667 4.436970901 4.68092313 4.90259078 4.336810538 4.642849403 4.174780788 4.16221286 4.314882523 4.355791652 4.579308219 4.208370333 4.625311188 4.454769198 4.055873216 4.409818203 4.387792514 4.301176262 4.369483128 3.020442469 4.596777933 4.511196622 4.437109943 4.309776098 3.981470744 4.506159412 4.170120631 4.553343722 4.236528588 4.136140856 4.188716158 4.497020541 4.64516288 4.617624138 4.73359042 4.399938455 4.173357638 4.541289877 4.049800313 4.331028063 4.381871407 4.198320703 4.473601097 4.460773156 4.617895804 4.452316714 4.109993198 4.392065901 4.589539268 4.798107402 4.472577795 4.741173365 4.269265213 4.072568524 4.342651853 4.198552816 4.414982199 4.431377554 4.428301131 4.502398728 4.402273402 4.559533255 4.378985986 4.42709997 4.581048395 +N4-Acetylcytidine 4.361609643 4.518477034 3.885826078 4.49615993 4.685970905 4.46802532 4.431310239 4.622987522 3.409346338 4.588791222 4.540992081 4.588072574 1.795245343 4.360119266 4.546949124 4.439698362 4.760376107 4.563838772 4.532754028 4.199985272 4.211485291 4.735433618 3.738424876 4.427184616 2.363070199 3.526429205 4.513634946 4.519449942 4.796994188 4.546922337 3.78392939 4.447964609 4.686839366 3.988103619 4.590012512 4.471516714 3.922783157 4.039486985 3.964201839 3.953606004 4.558836745 3.714793643 4.368415976 4.540502495 4.489321641 4.473930942 4.541112083 4.766180454 4.740106794 4.321021823 4.35373965 4.694199246 4.171291464 4.59505115 4.526736201 4.185779389 4.271722011 4.513424303 4.775341998 4.599059603 4.251893117 4.638888038 4.521419381 4.599289423 4.716035595 4.796416 4.148175751 4.599990675 3.407087932 4.601683669 4.771793845 3.944493061 4.719823065 4.823902074 3.878930392 4.066754066 3.899837124 4.155478309 4.563428787 4.775228109 3.847580623 4.525363812 4.481060365 4.672514937 4.642609236 4.589924159 4.660452601 4.261008507 4.431898556 4.125547453 4.520539664 4.541769877 4.139888335 4.552349357 4.813999467 4.84202037 4.646418346 4.332166889 4.789054234 4.397441227 1.644952696 4.634033172 4.63721093 4.834674837 4.582735893 4.610611849 4.284491269 4.486594971 4.603733106 4.623787157 3.662849086 4.011136125 4.522095345 4.685580578 3.668593544 4.711226376 3.990282855 4.649915987 4.583684827 4.659330281 5.027677564 4.72261564 4.677360443 4.571888997 4.70752035 4.551698298 4.155108063 4.123340403 4.637714601 3.956234554 4.742323164 4.122840775 2.985802921 4.844030871 4.670175599 4.491780177 4.709173672 1.813204603 4.304280797 4.097726445 4.833619917 4.609745669 2.04455286 4.779461521 4.035491242 4.171829432 4.393086795 3.584564965 4.170493446 4.203181764 4.46121079 4.731329184 4.641576461 3.558000483 4.126896672 4.190273598 2.89158479 4.213514575 4.447905748 4.132091914 4.953108 4.711567409 4.682199035 4.724942528 4.662459287 4.466964051 4.193004867 4.68181059 4.898709568 4.797625361 4.66834168 4.421398311 4.582599312 4.611101327 4.608399387 4.642137094 4.628515294 4.698383974 4.642671328 4.752698647 4.751965746 4.672414222 4.665286887 +Nicotinuric acid isomer 3.848277948 4.441710061 4.240329544 4.343147921 4.044958424 4.452897392 4.069243707 4.360414459 4.310635467 4.286487429 4.557676034 4.219688418 4.531023496 4.02578442 4.385885 4.209993102 4.357155646 4.367754298 4.516798434 4.348993501 4.004007975 4.234194974 4.296152473 4.283646714 4.49395269 3.989634776 4.382157094 4.490603026 4.296165071 4.300081961 4.424610369 4.149157795 4.067015904 4.203692621 4.271051614 4.076712683 4.281958784 4.191544249 4.347895958 3.854569552 4.48402046 4.219782057 4.023917511 4.303206503 4.298712464 4.311622942 4.376160761 4.413899366 4.176836152 4.499362087 4.152647407 4.248626648 4.319889686 4.359474989 4.295639405 4.257071556 4.455549184 4.52115421 4.524329788 4.346714545 4.611316458 4.143537162 4.437350481 4.432290348 4.398427136 4.087643389 4.536329754 4.468712611 4.366730308 4.328129607 4.362188517 4.411982669 4.266695934 4.374473046 4.466193503 4.418052648 4.291367099 4.611003053 4.531031762 4.500411574 4.484850981 4.305267431 4.22070272 4.28426411 4.354801373 3.979346556 4.213690306 4.500839012 4.356853224 4.406925019 4.834954838 4.269912567 4.401149991 4.233262672 4.327497947 4.151271705 4.326011519 4.322991103 4.387740076 4.663657524 4.033720055 4.473244839 4.602146357 4.292599549 4.510383702 4.185267818 4.63872426 4.517647149 4.243409813 4.453039889 4.366750265 4.414654817 4.424820789 4.208432844 4.353245981 4.2988509 4.364784241 4.058330333 4.044595821 4.372309388 4.504592819 4.47954545 4.535341017 4.401440347 4.255582193 4.306239795 4.257846516 4.250693443 3.924352636 4.539105865 4.352093526 4.428641908 4.421103849 4.555750419 4.374414284 4.492695842 4.331347699 4.369638826 4.343833438 4.287608045 4.514484387 4.398163234 4.720604766 4.837567821 4.659339419 4.260583738 4.511803529 4.468905523 4.797788259 4.441818079 4.270032914 4.281925183 4.402468917 4.390695 4.537543713 4.664551285 4.469287794 4.282003569 4.398305404 4.659690827 4.87345427 4.448214059 4.42561643 4.052620446 4.475766968 4.580386216 4.520741699 4.701414819 4.79001911 4.094181567 4.345810719 4.273393084 4.262318215 4.319397117 4.386931282 4.263510781 4.688791466 4.403503291 4.284876626 4.440418433 4.430970774 4.570177471 4.487122204 +Ortho-Hydroxyphenylacetic acid 3.870824929 4.658540671 4.001140771 4.296011389 4.679457982 4.295494865 3.912166117 4.37582796 3.739987581 4.490693802 4.721074276 4.582119544 3.8513424 4.17806315 4.382493395 4.292043166 4.650941782 4.894867285 4.245549315 4.681186246 4.321378774 4.288952907 4.454332789 3.93610227 4.660791399 4.468401701 4.321051354 4.344537136 4.37162237 4.508087338 4.312607769 4.279273908 4.102383975 3.950064843 4.571615055 4.654587511 4.516626792 4.122120003 4.35900592 3.848390547 3.95039226 3.802358333 3.868060096 4.17194496 3.731774232 4.450974905 4.511289055 4.705453265 4.441813271 4.094634135 4.473905961 4.599768772 4.756004414 4.488454927 3.679249555 4.14142042 4.257904956 3.91338478 4.285114944 4.610854828 4.692969302 4.397799724 4.632113454 4.10793978 4.665123362 4.584949031 4.731617145 4.654222978 4.313323653 4.433377294 4.865555047 4.054012437 4.548531822 4.480688142 4.759463222 4.355206877 4.211024568 4.578480533 4.395905321 4.464734086 4.204766898 3.816340021 4.778847386 4.419119391 5.133579188 4.235504349 3.850912633 4.261580479 4.396383124 4.512908172 4.915008669 4.601543752 4.513611656 4.451985595 4.826955999 4.023252401 3.74059767 4.086353451 4.459909177 4.77839555 4.314528073 3.693257077 4.471118536 4.507106029 4.649716544 4.146013896 4.224004105 4.523828997 4.690387208 4.447190327 4.545033856 4.679721559 4.820108554 4.364831742 4.524277351 4.360215619 4.484934702 4.386802016 4.433289433 4.810761739 4.58357595 4.697270206 4.182629498 4.574089569 3.722802553 4.498534471 4.106472267 4.683116331 4.610176326 5.047133041 4.354976493 4.720300752 4.241270679 4.696744538 4.298450139 5.068421422 4.855509567 4.380379622 4.56059746 4.487766885 4.560877685 3.984233571 4.557379495 4.694006259 4.676356517 4.46211292 5.138156339 4.096954295 5.11092929 4.330594995 4.078777656 3.516273289 4.60198434 4.372087774 4.687759768 4.798736734 4.861374043 4.372227774 5.200205012 5.311270662 5.42759631 4.809127214 4.288451074 4.5027486 4.543930003 4.34050131 4.745896821 4.605442284 4.994924348 4.434890895 4.534631955 4.310279356 4.643602597 3.96837775 4.547472279 4.656763031 4.848205737 4.374864163 4.037887693 4.490154962 4.178500046 5.228845842 4.694311557 +Oxoglutaric acid 2.997953327 3.993253058 3.482831033 3.947712189 3.955677222 4.195984835 3.827938384 4.46370673 3.221085384 4.254866805 4.205709234 4.240555777 4.005307326 3.569422128 4.715971267 4.230498602 4.203600932 4.132963381 4.397287684 4.084910561 3.605194779 4.698992952 3.941184855 3.95861053 1.656689636 3.171361685 3.927404771 4.091384806 4.256807014 4.440401814 3.58134755 4.442478422 4.435883859 4.226015335 4.342983009 4.382118092 3.861924203 4.235937594 4.128016585 3.36766344 4.412105336 4.164099877 4.186128616 4.382761603 4.193950877 4.457250674 4.609915034 4.234944357 4.607193359 4.279340579 4.273798429 4.626349884 4.110662675 4.914789988 3.628903363 4.255224229 4.125671651 4.172319944 4.652037443 4.197956496 4.294734436 4.071406656 4.172875815 4.265965069 4.806912312 4.762312119 4.245878703 4.240654399 2.978157444 4.08352973 4.387207534 4.129992593 4.503600646 4.504006756 4.34432582 4.202328239 3.806016331 4.302185026 4.395537715 3.634596545 4.024483353 4.170679177 4.352000928 4.5067432 4.18447704 4.309751701 4.269924486 4.536963733 4.231431828 3.959984 4.151862227 4.114686888 4.680997053 3.876413479 4.151883585 4.4579426 4.483625382 4.606697945 4.09093396 4.690610395 4.062107162 4.759477229 3.238448196 3.854951129 4.059449067 3.817350658 4.094653578 4.146330016 4.302827453 4.287051757 3.940189528 3.5747648 4.302323078 4.218233601 4.10600958 4.171094876 4.507620542 4.285725389 4.205800685 4.359026033 4.330324744 4.199519618 4.374083165 3.943531305 2.918496151 4.207792062 4.553543502 3.768050606 4.504883164 4.108029567 4.566183533 4.33990102 2.94991145 4.33831468 4.431417351 4.395502996 4.095840781 4.594067187 4.74595543 4.314671067 4.679468053 4.842515725 2.657418705 4.715804814 4.410779266 4.530727795 4.653094603 4.223129146 4.359264466 4.505087585 4.610666486 4.221348597 4.459617611 4.103615934 4.060145945 4.559095963 3.676430077 4.376656995 4.32864296 3.982213724 4.064027645 4.364609826 4.555042291 4.153035365 4.15820397 4.447549231 4.564754928 4.269715947 4.656865986 4.727417256 3.612761447 4.298919659 4.356824293 4.187213218 4.446964009 4.164657311 4.658030501 4.07957559 3.888405251 4.630421517 4.569199991 4.660857742 4.619881923 +p-Anisic acid 3.841620372 4.67814823 3.455274772 2.890224145 3.247603257 3.952276744 3.632400008 3.399320117 4.613479081 3.200812591 4.366086847 4.20867478 4.548048451 2.5911613 4.754272237 3.879060498 0.614417554 0.518954984 4.776688666 4.030992394 2.876410388 4.418889644 4.234275182 2.416554615 4.145689617 3.563638012 2.9056979 3.658154074 0.591057595 3.822266334 1.971820352 4.306644946 4.045788437 2.518668339 4.537002905 3.03597474 4.172937244 1.994558569 3.536770475 1.938002307 4.12007797 3.528596493 2.521113289 4.162813884 2.525758231 4.963490927 4.336210548 3.823697556 4.397621243 3.776632773 2.370555269 4.229321753 5.166307498 4.248133437 3.141538344 3.385460948 2.106390669 4.208366301 3.504535902 2.804939665 3.494824135 3.736500067 3.365121484 2.811311414 4.919098739 4.900256061 3.061372527 3.252293408 4.142929007 5.357012272 5.227608659 4.211927703 4.404687034 3.156567014 3.351661839 4.600042867 0.70667874 5.062660142 2.275657413 3.403167957 2.840446595 3.595254836 3.922116861 3.858567962 1.926801019 3.93464401 3.082411976 3.151599931 3.87926799 2.601766141 4.096416876 3.330046569 4.197309531 3.610269064 4.059590068 3.262385497 3.04714323 4.027294281 3.152721874 4.796592707 3.346222634 5.525471071 4.882808562 3.462778203 3.055911367 3.205648342 2.321708386 3.558554781 3.816709635 0.855078852 3.658737043 4.352862885 4.516556023 3.792376187 4.115367644 3.129490457 4.335701338 2.754917803 2.765293887 3.260138855 3.349295923 0.444434296 4.511777769 3.196451923 0.674057441 3.159029546 0.826941912 4.316120947 3.597052854 4.505705357 3.986400953 5.220801924 3.431248314 4.508788991 4.924513589 4.146662897 4.718940649 5.099923345 3.321442487 4.933892359 4.99479534 4.256514462 4.836126413 4.020812645 5.629051758 5.644296479 5.302187429 4.309409552 4.236889497 4.837344326 4.089557913 0.778779327 2.811773148 3.943528988 3.562675979 3.173803629 4.346803359 3.945303794 4.895454707 4.645891958 4.548530605 3.916492295 4.212930971 3.256700296 3.519238182 2.784912583 4.215587073 4.48897553 3.671712361 5.007125826 4.587593025 3.075644058 3.791881391 2.400308915 4.660526358 3.712406867 3.488734701 2.744899823 0.750528737 3.790976994 4.769380285 3.100030035 5.239291832 +p-Hydroxyhippuric acid 4.19843532 4.621760233 3.835598217 4.166668318 4.592458446 4.114811714 4.396440722 4.121999263 4.256156274 4.000214964 4.130368577 4.278923491 4.145819781 4.35235218 4.1729921 3.952865196 4.336801411 4.552977188 4.265798381 4.176261216 4.462127049 4.18177478 4.420362862 4.774721118 4.306754117 4.211846882 4.104355475 4.582892562 4.190535633 4.170568499 4.226987242 4.250890616 4.430680172 4.143403551 4.24535203 4.234323926 4.229801555 4.110849602 4.532582798 3.577343179 4.164302885 3.843926737 4.302656386 4.184038718 4.212014584 4.232138386 4.371300456 4.829479578 4.289774412 4.498746989 4.141690993 4.100376572 4.288794629 4.180112394 4.025261614 4.094521816 4.008629134 4.368240587 4.431093845 4.073730731 4.296298646 4.059785897 4.284779851 4.180525454 4.426283967 4.544505084 4.736952973 4.15136083 4.460892912 4.364888023 4.523698919 4.372308179 4.37744339 4.266168539 4.062775145 4.147646502 4.120537003 4.880869399 4.16470919 4.320909347 4.444234864 4.093628024 4.054689057 4.152025549 4.315307092 4.271724031 4.283705217 4.14873609 4.327580848 4.046412105 4.5420621 4.325354224 4.340727345 3.953599065 4.122076579 4.206174968 4.587845933 4.48362137 4.593545116 4.527751731 4.457871145 4.548365006 4.270127727 4.240685881 4.029739358 4.462459129 4.392778784 4.164311753 4.302045587 4.129884274 4.130548896 4.13481632 4.446873998 4.212946576 3.968228648 4.094676526 4.23880486 3.987038862 4.500410558 3.903581185 4.611987362 4.15102207 4.484340397 4.102800792 4.174494192 4.056830723 4.190479395 4.685930698 4.397142524 4.499293489 4.302477493 4.720777917 4.490552951 4.557491872 4.565277206 4.340336186 4.213375878 4.223720483 4.340073866 4.385925834 4.30601188 4.226635128 4.435014 4.460519733 4.65298726 4.643995773 4.609086971 4.318908355 4.980967843 4.327189403 4.161115007 4.376218806 4.194725406 4.269542316 4.48227709 4.557218664 4.375768288 4.373990484 4.490098704 4.570959996 4.68544653 4.477571909 4.216141871 4.044547343 3.945023369 4.063879862 3.946870067 4.332280549 4.473481542 4.296758482 4.227847149 4.399927815 4.316545667 4.207044889 4.338592172 4.133756605 4.222293405 4.356079297 4.353581256 4.790346203 4.76392933 4.621562561 4.732695128 +p-Hydroxymandelic acid 4.140948524 3.818507725 4.221859857 4.42101423 4.703186348 4.096615968 3.685936889 4.12842035 4.151551883 3.915723693 4.104312477 3.854454695 3.866449817 4.037377672 4.012453042 4.101215426 4.147706664 4.418984061 3.96762532 4.229419306 4.545156009 4.351507456 4.279815175 4.096763049 3.912543491 4.229136223 4.302823242 3.965698853 4.496408074 4.085383312 3.651401986 3.736035561 4.352190668 3.641593855 4.180389342 4.395219366 4.182143623 4.02290813 4.529639259 3.380436785 4.496982028 3.440271914 4.321327466 4.372956257 4.03591563 4.460930316 4.437778329 4.650167814 4.102419515 3.733152178 4.376182002 4.030765483 4.29142906 4.050604335 4.125012116 3.927521676 4.398116604 4.358373494 4.289724829 4.038232429 4.468095395 4.395060987 4.504799525 4.34306862 4.159688824 4.387388808 4.265885353 4.235680036 4.011337087 4.321897505 4.840298421 4.164000829 4.036792556 4.382228584 4.478539902 4.290602685 4.718056848 4.486123487 4.455542534 4.184634951 3.992709919 4.182385818 4.176048626 4.270151305 4.479345138 4.268762462 4.235961273 4.301321641 4.586426603 4.144676363 4.732709866 3.982782103 3.998404872 4.492609307 4.220450882 4.206252701 4.194921717 4.419270403 4.956386087 4.236717098 4.404148594 4.088911384 4.361167474 4.389588236 4.094564137 4.700966303 4.344187455 4.411684984 4.259693857 4.107581051 3.993438676 4.061206412 4.270136874 4.283578351 4.125513154 3.985946988 3.993004753 4.264959604 4.621843016 4.219691552 4.276510588 4.409620922 4.146996712 4.220398798 4.545820009 4.348457163 4.425466063 4.551341607 4.201347284 3.786223133 4.271030825 4.215473795 4.888129918 4.380000561 4.588151064 4.122217904 4.322595462 4.296574205 4.248218462 4.860730596 4.02972026 4.282806775 4.109762643 4.132348514 4.092216169 4.223993643 4.537834137 4.140677696 4.886662462 4.295678347 4.011458473 4.568541975 4.040250951 4.333755691 4.206666875 4.064446205 4.857714714 4.699648177 3.97010567 4.211137293 4.342238569 3.872441917 4.316264213 4.354882646 4.133200547 4.332574545 4.126603009 4.394454433 4.470231501 4.185669339 4.480478248 4.162395833 4.535171161 4.153080377 4.410127731 4.413538574 4.287989581 4.340385432 4.49030945 4.146523383 4.305234507 4.35089235 4.514431369 +p-Hydroxyphenylacetic acid 4.05736231 3.86796131 4.198771191 4.138231392 4.348635683 4.181576934 3.697926818 4.218169495 4.472245884 3.956276821 2.610658378 3.900964462 4.058632241 3.682032226 4.012415848 3.744681105 4.532682442 4.634929908 4.025718671 4.332195398 4.547795103 4.197794578 4.392796683 4.384420443 4.247841053 4.083428355 4.0788081 3.92659288 4.032120458 4.294351305 3.959747578 4.061532511 4.279596467 4.091212239 4.359466736 4.183957993 3.885912461 3.440457584 4.524486852 3.669110477 4.169203488 3.622516677 4.049748042 4.023985992 3.987348555 4.355090342 4.131067238 4.483968401 4.461183029 3.880038351 3.953083862 4.303093382 4.628384687 4.091044278 4.085584594 4.382980338 3.975746057 4.615118433 4.089062713 4.047587687 4.324673888 3.907971067 4.426924728 4.063836773 4.122617289 4.267032609 4.663525461 4.264661515 4.603318853 4.381815232 4.710444473 4.055487475 4.604825553 4.481626288 4.191319083 4.622114948 4.430265192 4.113949958 4.114740225 4.503812382 4.352768645 4.255053256 4.23893276 4.552732381 3.877013224 4.119467647 4.378337267 4.075242181 4.304982009 4.427842001 3.976029968 3.871326759 3.928001994 4.188049983 4.430144934 4.18925736 3.848597567 4.172603723 4.046401582 4.075358526 4.179249341 4.11106299 4.226720672 4.139500564 4.264172098 4.423503069 4.04558008 4.525002851 4.218407439 4.18406402 4.4010728 4.741917247 4.022653576 4.172739282 4.029288338 4.357602987 4.449185564 4.166544506 4.036704272 4.227928903 4.851987623 4.54549929 4.156820722 4.760368125 4.417888527 4.137805173 4.161716362 4.659939391 4.433742771 4.437972611 4.241397496 4.159660625 4.975182204 4.280445508 4.175095007 3.973738042 4.592778935 4.346213716 4.769627035 4.016625417 4.217385226 4.159292652 4.110609323 4.314982294 4.562881418 4.395310218 4.479936095 4.320982547 5.49945148 4.011157743 4.253985193 4.123458673 4.244874436 3.983372263 4.013200286 4.121063333 4.929453452 4.52560507 4.129709121 4.341375697 4.472469075 4.048510841 4.590297949 4.667542863 4.1009301 4.27097614 4.475825216 4.427834134 4.609073701 4.334693385 4.103770273 4.400486573 4.156704805 4.30313939 4.437082614 4.034686686 4.361433342 4.658843679 3.893735867 4.821383172 4.331688869 4.102464268 4.149684354 +Pantothenic acid 4.367247334 4.483831887 4.281965459 4.201389969 4.367093307 4.12143302 4.116223426 4.455311359 4.345771044 4.339761847 4.415714856 4.577301648 4.31245042 4.200481881 4.520045129 4.079488089 4.404947443 3.71592691 4.406727743 4.481110712 4.12792603 4.741976115 3.891665182 4.362649916 3.795060816 3.895104953 4.267307785 4.149310701 4.456598689 4.464810614 4.144509363 4.549585288 4.204224416 4.023307814 4.407977745 3.322433049 4.159305389 4.241945576 4.281161172 3.605063616 4.223968995 4.362257074 3.65686753 4.196034505 4.172503302 4.352842212 4.019248944 4.133868215 4.496883345 4.33461246 4.212738878 4.429278162 4.477538045 4.461608446 4.387688289 4.45605307 3.961672363 3.894944727 4.484136257 4.284984462 4.542346383 4.435083315 4.385524588 4.315954538 4.565564798 4.927870414 4.089774808 4.292940343 4.234355686 4.414531157 4.227434152 4.336180565 4.644676488 4.375246001 4.325309151 4.086457004 4.08048769 4.480145304 4.325993583 4.395026441 3.796087812 4.230551192 4.403325775 4.335946458 4.157573648 4.152677338 4.059275786 4.333274323 4.655365081 4.057558462 4.230659779 4.374384326 4.031423709 4.089169667 4.308833452 4.457194778 4.305629722 4.547441221 4.316191265 4.511205624 4.384161141 4.752292673 4.496341379 4.303808179 4.495719734 4.261743852 4.387575654 4.329833962 4.328075416 4.309064148 3.991747011 4.162008584 4.305513103 4.645539861 4.260700212 3.997418543 4.294622108 4.403559361 4.289771737 4.349053053 4.24303012 4.060536512 4.652879333 4.360037976 4.337169958 4.423376395 3.922090058 4.297968547 4.384007881 4.217886457 4.566773336 4.627353261 4.37133688 4.500611435 4.450545436 4.784615594 4.296664344 4.088751388 4.465215779 4.648054729 4.747642088 4.295713765 4.219996876 4.698669672 4.315893022 4.458067602 4.817227593 3.933629629 4.580695619 4.578985553 4.646978852 4.58074936 4.638262927 4.257246118 4.400916286 4.463858522 4.450558697 4.4422835 4.349466063 4.374542518 5.508215221 4.636987861 4.68068667 4.437582411 4.40132205 4.178136085 4.431910677 4.382453613 4.646802468 4.622836155 4.571494029 3.967261522 4.325201427 4.271679139 4.344753321 4.167783673 4.375445703 3.873315927 4.209552825 3.69941405 4.630314885 4.594166143 4.526163619 +Pentose 4.119871721 4.219937702 4.354550608 4.294260166 4.465689501 4.250879597 4.277679997 4.278462672 4.657936971 4.128114826 4.215473458 4.160792962 4.069193579 4.316303496 4.098270878 4.13463717 4.232189782 4.331623689 4.413289683 4.350021378 4.403003927 4.151769662 4.668216148 4.295610896 4.768855099 4.518023446 4.231636572 4.409638319 4.160768728 4.334588535 4.7354561 4.311383982 4.19214026 3.909024698 4.216080369 4.006302205 4.416614846 4.15698254 4.580017748 4.31042454 4.05081232 4.111825078 4.302163524 4.105870438 3.976648242 4.34502477 4.466541671 4.171811023 4.16773866 4.329820687 4.293309999 4.24586205 4.396878621 4.249975197 4.210546911 4.480785766 4.50617367 4.306196712 4.250123501 4.199471831 4.534039978 4.235963569 4.301360706 4.396095811 4.204462535 4.36350881 4.523499447 4.31571048 4.836016385 4.249257321 4.355335579 4.606089408 4.343779092 4.390043073 4.559331338 4.446740347 4.444222905 4.834768793 4.345083824 4.422871318 4.42122223 4.337982279 4.147207465 4.311280736 4.334168268 4.224429493 4.335981722 4.406547647 4.257768948 4.45977675 4.328731126 4.430806359 4.235394427 4.251938246 4.178799861 4.315720111 4.241424315 4.647214429 4.411578641 4.644016049 4.145104132 4.306021313 4.418724889 4.244636079 4.20138108 4.533932279 4.467155316 4.407129585 4.245012444 4.343094395 4.452680978 4.464509528 4.099847 4.26006406 4.436671925 4.121763515 4.624037483 4.076161018 4.216534512 4.139958453 4.470772562 4.190182995 4.436567766 4.276442749 4.386747999 4.112255727 4.515114382 4.418888881 4.295222522 4.9308117 4.218017524 4.765391656 4.890318753 4.553737621 4.399243593 4.334164537 4.572322729 4.352859056 4.61105258 4.378584054 4.328201951 4.153073167 4.81539247 4.407779562 4.808601681 4.420646725 4.752444141 4.546169018 5.003417858 4.452155384 4.187523527 4.325115302 4.19117674 4.670860083 4.694087008 4.698875239 4.79193488 4.253359343 4.24021432 4.867837714 4.691353264 4.408002324 4.244441404 4.210238198 4.249258084 4.185131334 4.17919891 4.328089997 4.386445426 4.177845281 4.143571523 4.24560518 4.108481009 4.181567401 4.316960545 4.13784407 4.254798859 4.217586696 4.263808327 4.34668206 4.374921156 4.29050139 4.274382352 +Phe-Tyr-Asp (and isomers) 4.379156111 4.227932317 4.004176162 4.214129481 4.154740736 4.340768134 4.466498085 4.303681771 4.379938142 4.315440218 4.491396854 4.436651568 4.31590619 4.436574575 4.350766404 3.948406925 4.314086102 4.275870681 4.535510139 4.457980179 4.354674737 4.236558235 4.177595748 3.718404165 4.274878632 4.257635492 4.16849056 4.257669335 4.313065163 4.166427679 4.244440021 4.404214991 4.332048578 4.248106775 4.310693137 3.992532242 4.320209365 4.340412043 4.473040844 3.819547163 4.361746928 4.164412154 4.200483013 4.213904114 4.11518848 4.373518441 4.293502236 4.048312344 4.467111362 4.680139607 4.281778862 4.246824447 4.087680253 4.387434877 4.329440002 4.356477257 4.233739948 4.255008844 4.256774127 4.277535147 4.463307778 4.339411306 4.468078703 4.515931208 4.466491377 4.318803709 4.227502262 4.36232443 4.336244088 4.204547371 4.562732239 4.319251694 4.385613167 4.461615802 4.234106919 4.383164833 4.141358399 4.785769328 4.479756237 4.34956587 4.287002151 4.348522344 4.257333879 4.504073087 4.108382036 4.315915961 4.316182977 4.530741574 4.506830041 3.965284799 4.41712613 4.792596739 4.602594141 4.330410156 4.316099593 4.400810032 4.342201446 4.585693731 4.544985343 4.727896855 4.552019159 4.369932479 4.376947846 4.410270346 4.436935234 4.118827162 4.591438392 4.470255181 4.388563451 4.515402187 4.053751632 3.943157069 4.457779878 4.415306531 4.431574367 4.281264572 4.690607827 4.102430414 4.341032441 4.063224607 4.079544418 4.277586964 4.632199784 4.031482482 4.149513409 4.334901541 3.892749315 4.027514592 4.314948837 3.761268962 4.231934661 4.264209954 4.297219764 4.582569433 4.592493115 4.505244156 4.42985341 4.249757849 4.34534646 4.441015261 4.728023364 4.355933294 4.512004874 4.36835759 4.574413454 4.245437035 4.634240718 4.165469091 4.822346925 4.408703485 4.04261215 4.190243132 3.825264392 4.338737149 4.849095597 4.676471169 4.356126615 3.90494047 4.648283079 4.544804112 4.723229642 4.452135141 4.305023406 4.037882863 4.210850837 4.226067132 4.022974499 4.207246625 4.671045094 4.335831087 4.234674038 4.096636288 4.434848897 4.254186733 4.172721514 4.207995378 4.386079457 4.571789215 4.059207749 4.385172228 4.541536144 4.767153034 3.997265908 +Porphobilinogen 3.873927113 4.181048155 4.136767309 4.162674888 4.461157419 4.170573444 3.982546315 4.270354416 4.273039905 4.288919139 4.570908001 4.277645912 3.793927527 4.076542976 4.134035026 4.377456236 4.255352161 5.145749782 4.362922373 4.128284387 4.281163187 4.255700616 4.389500673 4.198064382 4.099758996 4.250535348 4.449570449 4.112408366 4.304340735 4.310021004 4.07695445 4.117586923 4.080296523 3.798107753 4.202380073 4.166050387 4.164065401 3.814699992 4.165492415 3.91072026 4.518137937 3.606117296 4.384786953 4.583740343 4.06432618 4.277926146 4.046541997 4.245677684 4.322047372 4.323421686 4.465878268 4.311599054 4.343216295 4.250810035 4.28129383 4.342599425 4.540885946 4.625025473 4.461626229 4.187417861 4.62484201 4.221832854 4.235719028 4.407137444 4.449755152 4.410327973 4.989324729 4.236278394 4.208204142 4.412758885 4.167296775 4.318131601 4.279654289 4.432272273 4.355548232 4.277077556 4.291611822 4.576975282 4.688588491 4.551028985 4.242067153 4.207482229 4.210452327 4.295538595 4.22182383 4.120176811 4.098075341 4.393289561 4.407305695 4.486272511 4.40262124 4.137285345 4.172125889 4.230774203 4.3444091 4.453885748 4.470691472 4.212433886 4.47019463 4.275877117 4.057396632 4.445322715 4.166119238 4.225532267 4.260620943 4.649177611 4.241158703 4.35311746 3.986270993 4.497736839 4.187863765 4.381269427 4.406922014 4.27303819 4.217842802 4.068648775 4.634413499 4.346050823 4.110135105 4.275678776 4.47166599 4.134919636 4.535103537 4.734691106 4.397031287 4.412495201 4.475282165 4.33755279 4.3776055 4.686904646 4.498734391 4.476378645 4.455380185 4.449074039 4.324208009 4.365883484 4.436777233 3.435033177 4.398008961 4.359481703 4.40575705 4.160172614 4.482901445 4.448295006 4.517324818 4.333445124 4.45993167 4.235318607 4.644306052 4.420501728 4.284397738 4.4430976 4.319779576 4.336040731 4.626692199 4.454550188 4.401833974 4.20803863 4.264486702 4.626944765 4.449969012 4.169323882 4.437123299 4.522648764 4.470288321 4.792206286 4.488967708 4.574836461 4.660166616 4.244194973 4.46980505 4.398515307 4.331418009 4.28136673 4.3648762 4.444910178 4.562721827 4.369843173 4.380710633 4.479089002 4.347467684 4.361606999 4.640743992 +Pyridoxic acid isomer 1 4.264819199 4.103787627 3.887146735 3.856185626 4.602856679 4.069685985 3.957622391 4.202148172 4.155964515 4.112236976 3.975255063 4.29219003 3.844729789 3.909667528 4.355590357 4.112186714 4.228109216 3.958438437 4.048373376 4.650212892 3.614607712 4.761749962 4.421921703 4.285466177 3.739609538 4.289163317 4.276782792 4.08700669 4.456312491 4.25967544 3.674610753 3.750833528 4.218934161 3.717938625 4.700949901 4.436243606 4.439237041 3.667646637 4.037174771 3.562816335 4.492597661 4.228232857 3.882085275 3.940136128 4.09656269 4.486018766 3.870279224 4.344156893 4.691412898 4.831949863 4.235091057 4.557447407 4.130417251 4.486144176 4.438607866 4.180773629 4.351686238 4.369726061 4.364481128 4.321247731 3.939037088 4.670810347 4.448168121 4.175271855 4.539397483 4.466687092 4.316178864 4.325638829 4.10347642 3.865998703 4.823856061 4.26464455 4.486019481 4.221542536 4.237028419 4.169899394 4.179547984 4.132325119 4.110391733 4.27014303 3.972445983 3.953368565 4.236628801 4.402763057 4.125805881 4.202656347 4.174005287 4.292596793 4.682159817 4.084197395 3.754464879 3.937341215 4.188266783 4.363257434 4.470785172 4.343701563 4.201280383 5.795654058 4.541553693 4.25722027 4.503431163 4.693042574 4.330434909 4.473568376 4.524739255 4.207236457 4.457168421 4.251665114 4.368422561 4.104339925 3.976649324 4.109056165 4.405195926 4.314572869 4.285596158 4.244030854 3.741179095 4.16170832 4.418902168 4.258469754 4.455772322 4.69269206 4.337773791 4.136907686 4.512565697 4.271876865 4.312526113 4.227665455 4.591549696 4.108779405 4.351904667 4.059870789 4.171731625 4.442439639 4.407173946 4.488694963 4.357501068 4.309730593 4.46297114 4.35404029 4.158410862 4.141364494 4.770041072 3.921049558 3.938507514 4.348566645 4.424484274 4.169944189 4.2041828 3.945854367 4.310445112 4.312146907 4.446034954 3.780346245 4.029180746 4.197413711 4.076096457 4.225577482 3.814738211 3.986999692 5.123458608 4.085895748 4.24649997 4.52217256 4.336618661 4.635701052 4.600673151 4.481214623 4.569517367 4.371816058 4.581913598 4.237584798 4.284817176 4.217788424 4.584269736 4.079932532 4.109106187 4.266889125 4.167132899 4.190732525 4.307299534 4.343830247 4.434036564 +Pyridylacetylglycine 4.042991845 4.21032699 4.099646284 4.309022212 4.386012889 4.398878593 4.195925543 4.385432396 4.030210987 4.415859504 4.362366845 4.448932883 4.226969951 4.045274167 4.216427591 4.260473293 4.236345036 4.112286095 4.252136083 4.395046014 4.15288747 4.37100491 4.104235233 4.255684221 4.064337793 4.070409927 4.382614505 4.295542132 4.489714707 4.34505446 3.800032964 4.195880016 4.380279169 3.914009556 4.258167038 4.340718693 4.30839512 3.959208081 4.47164672 3.928025576 4.475867298 4.352749288 4.009209356 4.32895183 4.247008497 4.455641963 4.296864467 4.366877024 4.377557057 4.32165334 4.138156381 4.437185501 4.619823482 4.560737277 4.440055204 4.12522324 4.471238641 4.518166048 4.503480461 4.328339555 4.371554151 4.315219104 4.542337389 4.503182762 4.607558678 4.422271235 4.345219565 4.483151752 4.158919228 4.69752083 4.417843095 4.403220444 4.328740626 4.598514129 4.405837148 4.240850916 4.234039254 4.180140233 4.389289789 4.54881315 4.115922636 4.344072521 4.259365322 4.314701951 4.37200863 4.551560419 4.307100349 4.22714068 4.471541133 4.351771423 4.728102573 4.250562271 4.270256349 4.330308639 4.572226856 4.491542024 4.383985047 4.338460212 4.625564988 4.509122541 4.227242652 4.29799515 4.470676279 4.5748393 4.387221405 4.306126752 4.56338414 4.381149817 4.36853998 4.331051703 4.051344812 4.146306333 4.371347065 4.380367318 4.20837015 4.11731501 4.272920081 4.228597819 4.310783714 4.519180413 4.690801474 4.38313131 4.625963566 4.245021569 4.485415953 4.366597015 4.131922485 4.15041966 4.338845 4.023274266 4.487896215 4.119189963 3.777620854 4.629820138 4.431361796 4.357124988 4.374066385 4.35103391 3.809224093 4.185979168 4.525742517 4.184597694 4.201596689 4.470285463 4.405949718 4.423398925 4.501812832 4.064266688 4.181762332 4.430002781 4.405850129 4.531333018 4.402607901 4.087334498 4.56899762 4.408212531 4.222787827 4.393317483 4.17858613 4.385807332 4.640097609 4.405474231 4.370818488 4.341298318 4.584067096 4.403255979 4.495063791 4.193452212 4.600589925 4.479885141 4.578150087 4.180420451 4.488254561 4.385279377 4.474134903 4.431225358 4.496193486 4.29825967 4.5248521 4.220961078 4.70252771 4.704379463 4.584008587 +Pyrocatechol sulfate 4.452942268 4.281094021 4.239741313 4.186333009 4.060465931 4.282089235 4.098804246 4.218382543 4.560716274 3.790356495 4.255926391 4.357877449 4.122079856 4.128600347 4.329101172 4.172429473 4.213921643 4.446184688 4.377532675 4.430559695 4.353444407 4.229803339 4.569526967 4.147555959 4.536912291 4.484772013 4.117851592 4.07894434 4.346167509 4.23989747 4.342622862 4.14501768 3.97815995 3.924294079 4.217068517 4.117804164 4.420189864 4.309973611 4.647461775 4.094548645 4.264716063 3.841567588 4.14651541 4.210736803 3.947304993 4.461308418 4.217984476 4.11769865 4.283273069 4.243818106 4.238755132 4.191104128 4.269170078 4.309801813 4.072865665 4.395226389 4.38234509 3.821174502 4.247200872 4.555804777 4.529913421 4.436393623 4.326217697 4.155658749 4.490483506 4.284693871 4.538235021 4.387158416 4.497050524 4.29832622 4.620718952 4.345991941 4.33624304 4.419431838 4.41985945 4.37740988 4.360086886 4.793473401 4.301337244 4.226587796 4.421730694 4.202872482 4.161752874 4.23443884 3.906884932 4.133233616 4.211327461 4.448421089 4.469381648 4.458506426 4.405768745 4.514945691 4.190574076 4.209055099 4.193731885 4.218487555 4.00834538 4.434380239 4.452833297 4.575112292 4.213779599 4.39990054 4.325718968 4.278140379 4.164449135 4.445398465 4.435497224 4.302743933 4.26356807 4.534303115 4.302440982 4.373890358 4.550625771 4.122333175 4.47011902 4.232206978 4.552186032 4.042350903 4.241909864 4.045684994 4.445092697 4.181007781 4.395192068 4.336078545 4.418438893 4.234701687 4.385299036 4.3658378 4.142063581 4.793846239 4.233819573 4.574474674 4.61406951 4.580705947 4.59647548 4.180978965 4.347278883 4.299974391 4.970936326 4.396895975 4.54210523 4.206704428 4.690032175 4.355108593 4.728064586 4.311681713 4.696468324 4.435072949 5.013804122 4.39027052 3.998090741 4.14588842 3.956809967 4.54205792 4.465166163 4.452902965 4.786058184 4.185581116 4.003309395 4.768004424 4.72720122 4.216698377 4.182351566 4.234124847 3.966746246 4.105529851 4.024941215 4.468606074 4.407870066 4.430394972 4.074229144 4.215413018 4.173349378 4.337385783 4.097998022 4.07731427 4.172790598 4.420439902 4.128882577 4.261934051 4.412189637 4.329814223 4.230007965 +Pyroglutamic acid 4.013842815 4.188312874 4.202476277 4.209444222 4.246487149 4.184347049 4.091154917 4.047518309 4.407469367 4.146465942 4.098654742 4.211437065 4.11483148 4.039582951 4.142495944 4.083169719 4.209294408 4.154260011 4.406318949 4.399642084 4.117807919 4.2047482 4.786186945 4.235600842 4.557513462 4.317404582 4.257847969 4.274328402 4.196528587 4.201391692 4.25917282 4.093610526 4.135677618 3.89094674 4.232711587 4.233675003 4.271068353 4.116743137 4.25586463 4.205877026 4.363468736 3.877112761 4.141461721 4.602344318 4.06105723 4.16605457 4.216089324 4.263804794 4.2932128 4.199912886 4.102885027 4.164596806 4.419578783 4.162636691 4.224613953 4.394520095 4.595545205 4.079658622 4.027507872 4.184902297 4.590981971 4.202962735 4.15196659 4.352261584 4.188161991 4.33846269 4.357706348 4.150041743 4.404670134 4.225231361 4.583043227 4.349888874 4.218207382 4.317227536 4.291675442 4.24037171 4.281911603 4.384953942 4.449188443 4.396245426 4.293884735 4.113952058 4.216665167 4.138714952 4.410723129 4.189034919 4.134110711 4.464513059 4.374130687 4.37695277 4.455034222 4.529323888 4.149616353 4.276660107 4.204749302 4.353621671 4.067349137 4.499644346 4.493029964 4.415227647 4.296063465 4.121987526 4.428202149 4.287082326 4.131199191 4.38198089 4.427605165 4.261986508 4.13418033 4.182910308 4.235844747 4.306820558 4.327048223 4.01607882 4.328466836 4.108020647 4.402214491 4.099190553 4.323499468 4.219547908 4.573692466 4.244233446 4.266409881 4.206343294 4.451648795 4.193972421 4.403388718 5.412193964 4.362064414 4.522796297 4.233366906 5.721490134 4.481957146 4.36856755 4.41061672 4.113086704 4.515517156 4.143517552 4.763330773 4.449634674 4.308078296 4.055880808 4.648491419 4.139100169 4.449903925 4.125578133 4.634972207 4.28957406 5.056631706 4.176783229 3.999993022 4.330930497 4.122089452 4.204084943 4.406196446 4.386170727 4.357840767 3.841891448 4.173465971 4.536408327 4.708647365 4.327946659 4.178730197 4.334587901 4.209925843 4.126995141 4.120913487 4.32686551 4.423143656 4.215670777 4.173833466 4.367713845 4.233705443 4.108685965 4.212770105 4.210922823 4.245704624 4.389884026 4.202785829 4.220507092 4.329617796 4.428668419 4.342312715 +Pyrroledicarboxylic acid 3.854579114 4.059364419 4.426634009 3.763358298 3.828248673 4.317047209 3.653239518 4.111334911 4.777541613 2.622717807 3.677787331 3.408444104 3.762430308 3.037436447 3.787293714 4.069635086 4.238515185 4.261964146 4.274529508 4.165879474 4.37503895 3.263420848 4.931663419 3.358254306 4.587461819 4.691596125 4.285182752 3.821239459 3.537697775 4.359533441 4.786093202 3.861779654 3.342007118 3.362664867 4.027628354 2.736417731 4.494857717 3.095008545 4.582017749 4.394177721 3.999205283 3.591238846 4.608953614 3.920741146 3.967034181 4.6579082 4.277916818 4.267594064 3.918868237 3.71440331 4.192358479 3.523575342 4.12407591 3.880367189 3.933289044 4.267696039 5.039733374 3.970872993 4.309639824 3.60353218 4.424784465 3.731856439 3.929041828 4.223397639 3.640394033 4.800906563 4.535811871 4.184077072 5.142957315 4.656231545 4.519334234 4.686885134 3.851437572 4.240032633 4.581950141 4.542876815 4.010406141 4.859471421 4.377173938 2.972977143 4.371862588 4.355159769 4.047843455 4.147332046 3.416652185 1.329789387 4.213418972 4.953308754 4.490477118 4.406039747 3.640817037 3.705879148 3.897129282 4.31138347 4.163960075 4.300168507 2.723831499 4.56932769 4.724611784 4.452748386 4.174484931 3.696974094 3.664942173 3.799775746 4.054642892 4.207904352 4.214112617 4.700356179 3.892409252 4.538983165 4.342201507 4.5692299 4.550031042 3.969627003 4.258433595 4.424413206 4.507690199 3.705676361 4.47922391 4.066068482 4.077938823 3.570837788 4.309784225 3.723210713 4.149492213 4.139991864 4.821173146 4.69416412 3.968458101 5.100034062 3.814516819 5.027327444 4.852634907 3.462003239 4.249748147 4.275777659 4.536632409 4.429400869 4.734176044 4.698283326 3.947454229 4.08947485 4.901733262 4.476970558 4.973645733 4.341417189 4.468495562 4.491827043 5.394516232 4.465347369 5.031729314 4.054094909 3.330805759 4.798448498 4.534364455 4.778212618 4.875325796 3.91753572 3.714145477 5.052434824 3.992669252 1.87851345 3.862180586 4.1225882 4.000996516 4.057040543 3.432638137 4.374123325 4.381139269 4.314721512 3.247179474 4.245774059 4.346498136 3.983524123 4.643219212 3.092427604 4.023887592 4.04184372 3.609924791 3.361971531 4.300861991 3.383012094 4.490839591 +Pyruvic acid 3.2294447 3.843605903 3.555714319 3.766176294 3.9850185 3.911799496 3.761245558 4.053891494 3.703902512 3.956699772 4.045294524 3.587880766 3.67423758 3.570043632 3.887100829 3.71025496 4.214226161 3.957779199 3.976196323 3.919245818 3.843025872 4.042436904 3.80446762 3.746318817 3.389486364 3.660104216 4.293777969 3.739373575 4.305703748 4.229059796 3.561759746 4.167141526 4.060358412 3.627207116 4.004860017 4.018798122 3.95382979 4.96055597 3.888572435 3.459311038 4.045783288 3.885893624 3.948278672 4.03136454 3.731009619 4.032480575 4.147974155 4.087402319 4.349814369 3.897689375 4.231372515 4.064129562 3.985308254 4.112122315 3.705466047 4.160780936 4.041754141 3.883258836 4.211096957 3.965846892 3.978731775 3.898213623 3.931016783 3.725286156 4.073220289 4.556007083 4.138106033 3.988883399 3.710231178 3.870261169 4.205405747 4.115582199 3.97203181 4.118544271 4.060153378 4.026814738 3.685109799 4.230371942 3.9867026 3.853026494 3.562693776 4.33315937 4.040134597 4.153041493 3.822209283 4.199282077 4.031680137 4.030984531 3.866695239 3.855035696 3.96170596 3.906239378 3.883787689 3.733800144 3.881230102 4.32748352 4.294087386 3.960115328 3.863012886 4.142489651 3.899288315 4.147714565 3.794032874 3.930106936 3.767974951 3.795401965 3.951157827 3.866192504 3.929857887 4.274195794 3.670991126 3.629715859 4.067656673 3.923321806 3.869677545 3.92676383 3.895299561 3.894855792 3.87907668 4.325806777 4.167930503 4.119907612 4.21017052 3.906369681 3.788762928 3.842935054 4.294224555 3.903768764 4.124530821 3.861607166 3.858652364 4.055664243 3.856563933 3.868157041 3.850977152 3.920151209 3.942328236 4.165617303 4.437698708 4.048982673 4.066357319 4.160697288 3.3972272 4.221227172 4.002245973 4.07971399 4.306162859 3.721016847 4.194464611 4.09022797 4.040569547 4.016677626 3.957898676 3.942939736 3.833773778 3.947216555 3.795651844 3.894276439 3.815415279 4.017282735 3.930370386 3.991492216 4.081504688 4.137284074 3.950676482 3.785027417 4.143087459 4.324116605 4.316397611 4.039188003 3.69557932 3.973950535 3.898082144 3.758508068 3.877212845 3.717605553 3.943230856 3.916129555 3.943488816 4.157750248 4.109323435 4.003650254 3.882996846 +Quinic acid 4.128022579 4.168760741 4.295170907 4.533187887 3.685546068 4.459419655 3.288560982 2.478387705 4.609045176 4.589248893 4.264874894 4.131776602 4.306133559 2.884534579 3.981475827 4.290301655 4.255466321 3.66759262 4.386240402 4.35377852 4.470196854 4.269261907 4.690219256 4.348301322 4.760091628 4.564911913 4.277410867 2.514187419 3.871439564 2.401970428 4.732005274 4.454358888 4.251352852 3.703407249 3.003091342 3.757674808 4.578727258 3.207569678 4.434107243 4.307125905 3.873225155 4.442626052 3.227629373 4.218743321 3.700804891 4.46132076 4.167095711 2.559844916 3.236934993 4.559719333 4.152463835 3.938745035 4.121693323 4.347113499 4.48769076 4.299635646 4.482480627 4.130994885 2.354327183 4.372537506 4.576020376 4.295298528 4.341087842 4.405203089 3.645970766 3.563584543 4.10409149 4.497579246 4.865082063 4.183718797 4.830931412 4.599137016 4.436283523 4.570429661 4.428274316 4.509338764 4.281873073 4.95629524 4.150018113 4.326603438 4.54183606 4.576556172 3.833419551 4.788645529 3.874043217 4.203214173 3.997906628 4.514788628 4.664222711 4.680167071 2.962311372 4.2753686 4.358198121 4.75751362 3.521918157 4.395425362 3.683085602 4.754968551 4.241310366 4.879172582 4.334200589 3.842363883 1.81295007 4.151322673 4.177687869 4.516878544 4.689843848 4.524157969 4.251486879 4.751241149 4.3993775 4.526590473 4.310426245 4.391614593 4.529305587 4.205538868 4.565822509 3.718330078 4.344941994 4.409662578 4.626989004 2.99256157 4.585895833 4.419101295 3.352960248 4.235866272 4.533961908 4.257714551 4.292380258 5.072789857 4.20546342 4.64915713 4.975216311 3.815103487 4.712280677 3.147665665 4.415998726 3.560563395 4.761358965 4.210108471 4.600317877 4.394180748 5.051862866 2.243739801 5.051576727 4.43622963 4.996038263 4.337334063 5.188803906 4.63123598 4.007778902 4.403208958 2.350875284 4.577332893 4.569936968 4.562652643 4.756893046 3.814785962 3.310757607 4.973969502 2.985531007 2.946014739 3.264690876 2.841876292 2.914897877 3.757722984 1.217098255 4.217605035 4.450511087 3.327658004 1.667391826 4.501886858 2.456828173 4.640039086 2.567376572 3.284486362 2.302849371 4.489767625 4.252573554 4.057719476 4.095065603 4.031562868 3.91706933 +Salicylic acid 3.925518082 4.035195971 4.5883271 3.847884613 3.695890564 4.100362812 4.158632572 4.002481235 3.648724074 5.823615583 3.769767338 3.415179194 4.219493821 4.86066326 3.347440671 4.055732504 3.023362123 2.536248816 4.21241967 3.716968204 3.487607924 4.264724228 3.360201611 3.664865648 4.470893181 3.491812176 2.953202863 4.047609223 3.157043077 3.083276313 4.095700175 4.5559707 3.734333775 4.028777085 3.093673202 1.444256034 3.099840132 2.801124401 5.137744645 3.827829519 3.57803436 3.260438716 3.193100994 5.509455669 3.205288246 3.283103731 3.345729541 2.92740373 3.167156178 3.41093249 3.398235016 2.303975215 4.155495144 3.446519964 5.204929441 2.796690621 2.358265196 4.189447187 4.97979158 3.42623018 3.866853177 3.18358818 3.705148602 3.133948316 4.024278085 3.14078385 3.597403714 3.712374012 4.674007316 4.765613289 3.918148547 3.557964947 4.385415488 4.133747631 2.55548391 3.074524137 3.431348839 4.492914216 4.202071133 3.495335135 3.967792187 3.217560367 3.156421888 2.810789538 3.363505468 2.850465711 3.591907073 3.14452569 4.146763047 2.486982493 3.268661585 4.782400902 4.28960336 3.621119394 4.034275993 2.752368019 2.932808434 3.234499307 3.069526304 3.900218887 3.179726265 4.894320537 4.267031816 3.697107945 3.473474581 4.087165274 4.102824906 3.473900212 5.288672554 3.72875648 3.745443367 4.428919726 3.948154133 3.774784129 4.272672814 3.946919194 3.96680245 3.259699189 3.03068318 2.559535824 3.664928793 2.846839322 3.473221379 4.113499328 4.409442284 3.861618963 3.539470123 4.517628785 3.986443681 4.237410931 3.184097302 4.003168096 4.847979347 2.79880742 3.335411274 3.444641282 3.844077484 3.993723664 3.528890153 4.54719652 3.85537092 2.99748052 4.245642544 4.029724291 4.146009191 4.239040747 3.995450891 3.964939957 4.035283383 3.193018683 3.022493223 3.500831612 3.737490371 3.86367482 4.566501818 4.106954951 3.657577566 3.809355699 4.021846494 4.267287531 4.674386362 4.309696625 3.650610964 2.916432599 3.422667166 3.056954892 3.489730344 3.311029341 4.05815664 4.082048214 4.184269525 3.558799239 3.185054421 3.420641151 3.904303363 3.73329128 3.738333835 2.359633687 4.000295019 2.782454862 4.045779722 4.275853474 3.868478396 +Sebacic acid 4.298555268 4.316858535 4.387094407 4.026013055 4.516984982 4.547072723 4.282560639 4.670899734 5.017336121 4.563748127 4.553187929 4.346599872 4.261236226 4.378770052 4.542229999 4.491316482 4.413607967 4.651304602 4.428966572 4.665731364 4.245685996 4.988373031 4.405413172 4.257716618 4.315631146 4.706686729 4.108902479 4.2357287 4.481226924 4.467081517 3.928407937 4.19931723 4.398839515 4.186042285 4.358087765 4.09499758 4.494340852 3.749516871 4.599855351 4.327760827 4.288708933 3.627599004 4.087643961 4.262129304 4.530826915 4.563930328 4.224525709 4.461182329 4.47916709 4.789513778 4.405070067 4.422549994 4.402651381 4.623782724 4.614527744 4.448409677 3.84157317 4.557315869 4.400956333 4.417914886 5.026830525 4.300994082 4.361824305 4.486165102 4.561142729 4.707734755 4.837446902 4.5223813 4.323099623 4.424828039 4.712575316 4.469480349 4.684188393 4.510145229 4.771669607 4.334306898 4.174608134 4.33760734 4.498937684 4.798892867 4.221297407 4.29301081 4.546123748 4.582348037 4.350395865 4.309700108 4.581973598 4.340437115 4.494844122 4.148700028 4.371509884 4.26766615 4.725835844 5.056952271 4.736886676 4.602653547 4.223366428 4.308148897 5.07037142 4.951851542 4.480412831 4.681173361 4.54094933 4.665003005 4.449876138 4.8753044 4.62959568 4.30576659 4.762041403 4.672347447 4.207255542 4.227813115 4.411994843 4.700513714 4.672484549 4.539954799 4.209507941 4.273936188 4.727028085 4.684662705 4.913020345 4.574709256 4.268849413 4.538584409 4.967562478 4.428501974 4.354777856 4.563733674 4.155158823 3.961840024 4.425254906 4.483130973 4.57515467 4.234613955 4.37584757 4.188007471 4.658944933 5.000679498 4.273578987 4.746413745 4.501040047 4.739362016 4.208149194 4.547150173 4.439019594 4.668770636 4.984581049 4.740483592 4.651999841 4.336164594 4.290369822 4.200108987 4.28154867 4.260287805 4.468531839 4.369895939 4.684927562 4.134826991 4.097824073 4.646122812 4.610300162 4.463753404 4.479189993 4.497785148 4.495440985 4.248585163 4.675045099 4.755728353 4.864248932 4.755550339 4.440132536 4.468152889 4.235826268 4.05616641 4.561905501 4.759717692 4.401025762 4.512930545 4.512006366 4.880794684 4.335057688 4.650956667 4.544485632 +Suberic acid 4.283357894 4.521645928 4.159624866 4.125570405 4.452634104 4.53542272 4.099827742 4.381655452 4.351379191 4.424450713 4.46091251 4.02922461 4.071142157 4.219656604 4.314138133 4.422525911 4.301566401 4.702656971 4.221069832 4.408334443 4.618071858 4.604806366 4.474656029 4.518038557 4.449238781 4.379907286 4.180994998 4.24743405 4.323730427 4.230315656 4.065658453 4.215773586 4.017466815 4.021412937 4.337847427 4.207433299 4.500680389 3.986565698 4.34660985 4.413725123 3.718601747 4.04859078 4.305140761 3.918934467 4.433824104 4.095601961 4.338914485 4.558247614 4.251144575 4.586909006 4.429677472 4.145296378 4.286177418 4.387352863 3.739471886 4.517958886 4.0888315 4.38195026 4.163649178 4.127921884 4.446732967 4.127805755 4.327475574 4.18607893 3.780536407 4.255501014 4.810679271 4.143086489 4.336259615 4.090909391 4.64632557 4.241134282 4.638210027 4.594096662 4.458397522 4.24102841 4.08455917 4.274537248 4.53499753 4.839944827 4.082757564 4.091058902 4.498809516 4.149499948 4.650827377 4.505248625 4.316351258 4.428941768 4.42095798 4.482573305 4.615800502 4.471119379 4.085379987 4.684071044 4.605139274 4.57388834 4.11184204 4.256323914 4.427305825 4.405496322 4.416475521 4.079785405 4.621433862 4.56053546 4.224083556 4.182786195 4.424640676 4.217595923 4.39235046 4.268952132 4.198375976 4.20385148 4.796664784 4.466524665 4.290878924 4.430714146 4.643137724 4.219308308 4.689338882 4.633036853 4.910510683 4.227852375 4.329125735 4.486979266 4.471815393 4.758771852 4.595374643 4.578410022 4.468391436 4.483679958 4.289919674 4.455207449 4.545546844 4.820239703 4.233971613 4.405340393 4.386853073 4.759883447 4.473540717 4.48025737 4.14554037 4.208657553 4.248730203 4.630179802 4.461024268 4.473196933 4.999889118 4.529494274 4.789214186 4.467935305 4.338446917 3.986306592 4.289727745 4.240604933 4.320078038 4.579158859 4.495738561 4.294238643 4.386724192 4.761007734 4.72756778 4.521800213 4.295974777 4.839379318 4.572440585 4.919904931 4.601706443 4.172027387 4.506486466 4.663169002 3.926062879 4.144213768 4.043683878 3.879728396 4.459115581 4.381787149 4.058095437 4.502549607 4.342747471 4.839935036 4.511889823 4.809278489 4.691557399 +Sulfosalicylic acid isomer 4.724542627 3.968790602 3.9465924 3.560990024 4.320034402 4.480640221 4.211068943 4.034459114 4.629955847 4.300503931 4.297629557 4.672109302 4.421392738 4.309183112 4.3052094 3.795517328 3.950070377 3.782221441 4.317349501 4.646520241 3.973993945 4.329854558 3.850695754 4.013830242 3.930330096 4.027441334 3.877227437 3.883969386 4.522357155 3.975774901 3.248754713 4.362800427 4.536878079 4.101913236 4.77923668 4.034839629 4.020783746 3.433093634 4.738648985 3.870442402 4.216698732 4.152979546 4.022790993 4.297088453 4.418675188 4.673908706 4.044239008 4.322499023 4.801396418 4.62967226 4.176507216 4.517129681 3.73704683 4.848514015 4.660950017 3.945784036 4.389369102 4.153686829 3.88791022 3.927724935 4.253282555 4.52292424 4.193003236 4.255385677 4.18172858 4.033752325 4.435635876 4.02604779 3.846012264 4.404074226 4.738315977 4.624524968 4.3419335 4.214800638 4.061083417 4.10067569 4.174586914 4.451261804 4.021541317 4.048840167 4.72466035 4.318190951 3.673542728 4.644850889 3.646875009 4.524099979 4.52159815 4.090952401 4.655446127 4.185936651 3.773032324 4.248810329 3.92861717 4.386831145 4.393411947 4.778395497 4.171041974 4.819762562 4.502462309 4.314627103 4.615983815 4.770565665 4.482510736 4.311415049 4.231913712 4.548893069 4.291913059 4.26960026 4.475223938 4.420191615 3.552362493 4.107780235 4.728471821 4.570217399 4.23893534 4.127303943 4.010883309 4.179153933 4.476568742 3.523473422 4.719970581 3.95387306 4.430623338 4.355131195 4.196484174 4.10989053 3.890350787 4.393069198 4.814095436 3.205246154 4.535037207 4.447569237 4.027486128 4.231447097 4.794761849 3.991451039 4.406278605 4.029068636 3.624360737 4.005769388 4.588634263 4.53104739 3.928741906 4.175914676 4.247618677 4.511275985 4.36383847 4.267336563 4.321921699 4.15651223 4.513588626 4.338971289 3.936087508 3.597933115 4.359283063 4.434161275 3.774623674 4.181390084 4.257746381 3.911062891 4.346541481 3.95663675 4.551762007 4.266643627 4.050336669 4.015825144 4.359807909 3.881123049 4.586744167 4.67928259 4.481356923 4.488949266 3.994400651 4.410206236 4.291927033 4.175443972 4.144767527 4.532649726 4.53561743 4.655785439 4.756255765 4.138518618 4.067452526 +Taurine 4.294955544 5.143374302 4.525364632 4.821052287 4.544508368 3.999298113 4.82623719 4.655239659 4.007468063 5.042936201 4.800154513 4.461322603 3.569861462 4.128042581 4.557499728 4.500319644 4.528352909 5.092530231 4.893367499 4.182412771 3.986501365 4.165662459 3.628624479 4.708126207 5.135750355 4.110263668 4.086133064 4.531039991 4.189118535 4.084436173 4.622734314 4.16104834 4.213809356 4.438001434 3.47844618 4.588485467 3.652346354 5.138491471 1.593821865 4.037974916 4.137795085 3.329748499 2.840310804 4.287876054 4.365351502 4.038795083 5.152233452 4.081949755 4.13801078 5.042392273 4.266523139 4.253489396 4.379992393 4.821439809 4.421164397 4.749909843 4.483011559 4.041890017 2.410288674 3.591739617 4.866831712 4.039157543 4.324237435 4.426433733 4.691644036 4.191053008 4.758601555 4.231683333 4.036473759 3.536078349 4.610679686 4.378320044 5.031716857 4.314092512 4.358920266 4.320681528 4.251428702 5.21014401 4.578010211 4.718210628 4.606296091 3.683189262 4.21168305 4.905828758 4.769925256 4.608147209 3.87726102 4.599165163 3.570251787 3.315029244 5.387072061 5.086381807 4.349839286 4.240439698 4.663546514 4.69925422 4.254972781 4.550255365 4.843803005 4.8178866 3.489131739 2.199231921 4.775987476 4.184231696 4.557785095 3.962891076 4.844678949 4.266447217 4.511472418 3.996559151 4.218533622 4.59452921 4.91335686 4.599332044 4.857214361 4.1408353 4.032985757 4.560522225 4.519846666 4.222809316 5.620030868 4.652830956 4.817966075 3.937079218 4.543560004 4.458181305 3.92304048 2.315561606 2.842205252 4.503857575 4.317899609 4.362754352 4.509943161 1.917028675 4.500265086 1.863361312 1.644145369 3.952728999 3.987847726 4.571917268 4.318482165 4.551073115 4.186278347 4.396529354 4.474917091 4.289063232 5.137503905 3.09931886 4.093108458 4.044406253 4.378755372 4.309870834 4.604652026 4.3105238 4.749764547 4.710284261 4.147436658 4.375819665 4.11383333 3.728735275 3.222442547 4.540922996 4.662862059 4.242657588 4.438342016 4.419668435 4.044139411 3.068401905 4.106686583 4.714052116 4.577833534 3.8629837 3.297803234 4.486835108 4.583493207 4.401218176 4.424595644 4.390711436 3.720404002 2.364132049 4.298145835 5.225412044 4.742826254 +Testosterone glucuronide 4.292437346 3.467556126 4.325042578 4.306861676 4.589207976 4.010065624 3.949479485 4.634697877 3.934808838 4.273896385 3.856351858 4.38023644 3.695799496 3.976266006 4.554130733 4.363478091 4.476691092 4.493874877 3.898166621 3.745816908 3.833326823 4.463233637 4.139324119 4.577328372 2.574687117 4.513755035 4.465354 4.520254029 4.474550595 4.424517577 2.033125636 2.466263188 4.697006892 3.100724052 4.063739123 4.503641671 4.395068945 3.951331034 3.750355215 3.574701886 4.504581687 2.705226767 4.145326613 4.187153079 4.250541599 4.592006579 4.229260483 4.314234237 4.113101324 3.301270983 4.359257982 4.779536197 3.60330204 4.140623902 4.407982009 4.219738119 4.364364573 4.414975135 4.297006939 4.716728042 4.303885101 4.650848616 4.264969087 4.491364822 4.369311616 4.627652424 4.391710237 4.128255916 2.924695463 4.795384375 5.260365012 4.581156354 4.395147594 4.620026202 4.613989274 4.328765568 4.322224258 4.252128025 4.598959018 4.649659639 3.895630416 4.481670482 4.702051285 4.16886765 4.34610054 3.568323265 4.069798778 4.209275538 4.431615524 4.687757067 4.01912921 4.359695115 2.869343304 4.352794617 4.623338035 4.596567236 3.933727633 4.172031843 4.937413858 4.288068161 4.582754845 3.982000358 4.198973015 4.478457098 4.306073754 4.509899751 4.555597879 4.581611701 4.441428589 4.53316839 4.427418504 4.392911651 3.919683303 4.510679713 4.605028159 4.572647621 2.512192311 4.575136155 4.348264046 4.515482365 4.764314309 4.690527967 2.184745748 4.715273163 4.931993991 4.722764649 4.057121476 3.399040484 4.077208661 3.71522178 4.617477343 4.037489808 3.644872636 3.856057428 4.291863346 3.512330504 4.103837527 4.180462506 4.158161118 3.711250731 3.643544106 4.35712392 3.100844566 2.372174268 2.411561389 3.833347686 4.540534372 4.063370472 2.441882068 4.068253188 4.271473933 3.884488575 4.293512512 3.640573307 3.898178329 4.297704998 3.060350268 3.610245855 2.306670586 3.706141431 2.702803325 4.516497727 3.776639433 4.725472316 4.544972359 4.297896403 4.02148345 4.222998687 4.267865792 4.296510999 4.670306816 4.162256644 4.480804767 4.188796572 4.631827454 4.233203407 3.989416355 4.854903603 4.491458154 4.399174537 4.011308592 4.250233781 4.269353315 +Tetrahydrohippuric acid 3.409692231 4.76682715 3.407598479 4.522244489 4.296404399 3.764092383 3.774824162 3.808102913 3.432094679 4.446872148 4.445913188 4.281855767 3.658976449 4.10742413 4.782742283 3.902947178 4.352986917 3.922518416 4.792640591 4.7130064 4.775549554 4.314276383 4.524298603 3.266369759 3.316867231 3.98703248 4.350958894 4.834671632 4.183090859 3.476357402 4.674144362 3.979174548 3.129741437 3.711235728 3.953804935 3.729236411 4.806873148 5.140741291 4.910238703 3.647228472 4.162891616 3.91656121 4.417539751 4.538472946 3.241557054 3.778427546 4.411022606 3.224452512 4.284461804 5.186691827 4.972021339 3.916100173 3.124347515 3.978409859 3.583779397 3.741257545 4.567627453 3.221242537 4.326710362 4.370758252 4.383634482 4.572763006 5.427828111 3.642881081 4.977837767 4.311901247 4.124769879 5.292343344 4.450814633 3.961743137 5.431656591 3.346076037 4.694419448 3.781447914 3.440547537 4.140770166 4.664812253 5.533925973 4.812596681 3.411608069 4.302627273 4.312603387 4.637764867 4.409915505 4.8176685 2.779529007 3.290418053 5.212260715 4.450939604 3.748090882 4.448896477 5.261515762 4.284525636 4.060230264 4.145918825 3.915938565 3.716325244 3.840843193 4.40379273 5.056169973 4.340986763 4.491933016 3.272632794 3.83623808 4.507029539 4.16881219 4.470906565 4.168871373 4.576624797 5.060451469 4.669907588 4.203739798 4.964901791 3.621870677 3.955814664 3.84465735 4.574240947 4.244677435 3.585809763 4.075142914 4.047947912 4.426946191 4.546870848 3.217532062 2.592352049 3.932713547 4.251067838 3.538394013 3.597243829 3.66289944 3.455592608 4.135950212 4.979378876 5.246424238 4.039716196 5.014401767 3.671918556 4.087863792 5.044099555 5.057405277 5.281695949 3.808304704 4.758863469 4.121039355 4.362748784 4.2638864 4.834113993 3.687587403 5.640766352 4.680612922 3.285273746 4.239099254 3.71338851 5.093663422 4.52659207 4.388420261 4.203525951 4.082820476 4.432651683 4.723088052 4.896800856 4.563313026 2.536616563 3.955458723 4.186138621 3.488528949 2.510338347 4.777590532 4.785887826 3.049898269 3.875756953 4.501813406 3.914903756 2.877656436 3.892469135 3.915733853 3.856165627 3.907870589 3.953533863 4.419693281 4.392726024 4.520764375 3.700881326 +Threo-3-Phenylserine 4.274910494 4.15393383 3.45729612 3.927525296 4.246965533 4.269735712 3.876733901 3.929919772 4.129820937 4.448093736 4.203623572 4.04504328 4.131762761 3.903241935 4.581390612 3.93144758 3.746989557 3.45350104 4.508143728 4.674652887 4.419992563 4.360160942 4.424805755 3.182131206 2.753115906 4.238050678 4.316458739 4.253183745 3.905127172 3.347644806 4.022949731 4.063579784 4.003475979 3.919084336 4.030850537 3.650793626 4.419339499 4.310983109 4.591683693 3.721263644 4.27653355 3.657464176 4.331174737 4.50553633 4.021507572 3.789654174 4.023920072 3.645775842 4.537035074 4.529611237 4.625193245 4.021218667 3.196259587 3.865894818 4.019350325 4.051894196 4.368265583 3.948240834 4.119568106 4.047999872 4.337680269 4.459600609 4.9766578 3.880872721 4.791631575 4.044744778 3.855743906 4.787783735 4.475329881 3.752100398 5.017327315 3.775618023 4.386972216 4.139479617 3.277416376 4.203351988 4.55419899 4.940289797 4.312073933 3.918488398 4.30063083 4.596593291 3.849001685 4.421325295 3.815838717 3.630181323 4.099747386 4.669516265 4.320040956 3.51232356 3.643667331 4.501707389 3.785725666 4.193790227 4.362347479 4.311563847 3.897825606 4.235179781 4.277917824 4.579203862 4.200697794 4.810679885 3.178585853 4.073177661 4.528467984 4.418014047 4.563616082 4.21196492 4.407261536 4.938480864 4.039147116 3.693646204 4.710953791 3.754790702 4.160458153 4.054228609 4.550357014 4.137806433 3.885262098 3.941400814 4.147122328 4.09324887 4.792876121 3.609287656 3.82766728 3.981234981 4.144639893 3.85239035 4.0825432 3.004202062 3.876685165 3.705887117 5.048805496 4.856837223 4.746656011 4.478565952 3.803336835 3.694623926 4.870270741 4.821400085 5.202148069 4.258171216 4.332585144 3.875727141 4.033591789 4.473362975 4.272841414 4.326091996 5.126575756 4.370851213 3.762720894 4.59236853 3.467478505 4.684608014 4.102095297 4.254652941 3.892104516 3.706913198 4.09707758 4.4529687 4.298299141 4.064696295 3.515943904 4.021525843 4.141858505 4.115709693 3.050585484 4.937994707 4.564867446 3.844558746 3.845246449 4.716338189 3.414976128 3.984387063 3.90775427 3.864057463 3.673806723 4.648874949 3.963553648 4.551190353 4.532860182 4.406217283 3.878895848 +Threonic acid/Erythronic acid 4.313963325 4.473728977 4.124348489 4.558517852 4.446222079 4.367591637 4.456741975 4.423534101 4.425982016 4.407831871 4.492283928 4.269593411 4.295105782 4.485143336 4.215179882 4.19821675 4.433375284 4.527392297 4.523639759 4.4009354 4.481254283 4.258404849 4.29237496 4.463453592 4.490769295 4.2888749 4.260731117 4.360905491 4.276795157 4.300857123 4.349559807 4.621335151 4.294095247 4.060976398 4.329823242 4.257450889 4.309883974 4.747773805 4.276946051 4.275426191 4.259145749 4.311042599 4.337770466 4.295802073 4.098668027 4.329491723 4.611249958 4.284695982 4.274880627 4.733648875 4.215484118 4.436124365 4.276267127 4.436900858 4.254937197 4.300267567 4.354867448 4.101507452 4.308488024 4.337467697 4.556775816 4.259960541 4.248129656 4.516018945 4.398146433 4.477500112 4.445113572 4.359651024 4.282851528 4.275799701 4.634577393 4.362124458 4.313990403 4.673385924 4.457391464 4.197385 4.253712529 4.712116103 4.359766657 4.571585707 4.163257943 4.268242706 4.263875432 4.456848417 4.570508189 4.261276253 4.272483396 4.290254949 4.524391198 4.358937038 4.823370697 4.605011129 4.350192502 4.227658304 4.276851456 4.483142894 4.314094479 4.53918902 4.664924285 4.679002048 4.152138843 4.362717012 4.70044696 4.294819723 4.268013607 4.29730056 4.569311052 4.282688043 4.304149961 4.540233857 3.978125463 4.112360743 4.32872294 4.324125157 4.128062632 4.119042891 4.596261541 4.165608906 4.400481278 4.28174612 4.862713716 4.345228433 4.591878337 4.412990324 4.522522487 4.33521362 4.358693155 4.296745073 4.432679788 4.31700049 4.330714569 4.436922163 4.435223895 4.620595793 4.578777899 4.393555171 4.585059966 4.452743756 4.4321268 4.202907407 4.513644747 4.304526526 4.468465885 4.646686653 4.42680567 4.37927932 4.907265664 4.119344288 4.724543017 4.361924746 4.275842717 4.44911699 4.24966425 4.108964537 4.593140705 4.451319279 4.281276962 4.141019312 4.565297616 4.708509693 5.121321992 4.697802032 4.284989455 4.287321075 4.30616777 4.113395415 4.251029927 4.480673553 4.724307576 4.301950391 4.262383161 4.12529641 4.202929034 4.21232733 4.278974312 4.267965681 4.303580459 4.552510385 4.363657314 4.27163218 4.642877753 4.703771355 4.517390792 +Tryptophan 4.006518145 4.421590182 4.438305654 4.542105055 4.217120084 4.558530841 4.594285494 4.602582155 3.755448638 4.083327977 4.467260181 4.284253921 4.452736695 4.446745751 4.406250496 4.456603341 4.20467154 4.175133053 4.6988231 4.216690457 3.910997629 4.066861191 3.853908267 4.695474358 4.764997907 3.844000704 4.420374814 4.698198386 4.521445049 4.366663903 4.385478917 4.392199746 4.211792156 4.095357552 3.94274881 3.756232105 4.121063743 4.156756006 4.138501463 4.011422868 4.253853088 4.0396714 4.3676362 3.998399116 4.374581498 4.112124927 4.429130327 4.144981471 4.183132004 4.330408034 4.250363737 3.93164585 4.10717991 4.331926998 4.449487538 4.632162155 4.191232135 4.452904661 4.448646469 4.653087422 4.789200277 4.040434369 4.701754649 4.177189259 4.556233089 4.080013895 4.454273054 4.442816755 3.890305772 4.715000449 3.477374706 4.138223864 4.366033195 4.591547913 4.299657277 4.160235652 4.120551464 4.790969937 4.480853062 4.48320933 4.478147668 4.389225818 4.324417293 4.295483557 4.169535669 3.583912128 4.228694252 4.501577773 3.967997274 3.757025058 4.771293412 4.714692339 4.492840968 4.519807664 4.567994119 4.008612707 4.40410005 4.752453045 4.759380991 4.309832422 4.394063032 4.237659167 4.568966709 4.398508214 4.756375291 4.168442308 4.677272939 3.978031284 4.663793577 4.674684628 4.298287976 4.364220357 4.333705715 4.252375568 4.460680174 4.511418991 4.312606536 4.320831296 4.129001852 4.263505413 4.704249397 4.526287391 4.471569145 4.383089254 4.105092009 4.428899202 3.467422776 4.34639618 3.997745312 4.223471472 4.412224645 4.256111314 3.864810023 4.34681087 4.523609898 4.092748709 4.458011022 4.535423092 3.965900639 4.222450568 4.716494414 4.364600597 4.425823439 4.584698587 4.327148979 4.229307543 4.694991016 3.804089921 4.263901695 4.507756435 4.436409541 4.127606922 4.532252064 4.070376229 4.604743245 4.600031277 4.103990486 4.09763683 4.242916532 4.233038844 5.044019048 4.491745119 4.871133581 3.90322846 4.203132965 4.609026883 4.328277289 4.500697925 4.534672662 4.110936043 4.550227727 4.185437714 4.416729048 4.076709694 4.516014135 4.342583031 4.448587677 4.35091576 4.123865415 4.044296166 3.99916971 4.6873815 4.495757177 +Valerylglycine isomer 1 4.016260966 3.881005467 4.187176209 4.147544157 4.10449814 4.065452493 4.195771335 4.365553185 4.221221437 4.048706906 4.662549001 4.512595612 4.309422115 4.116851447 4.286686806 4.072967385 4.261706936 4.113702658 4.726028449 4.634412635 4.087797642 4.353756472 4.297211714 3.930559687 4.14833566 3.867298004 4.393248184 3.920066317 4.051276242 4.064649411 4.089873573 4.379006337 4.257290867 3.946490611 4.139446873 3.802748605 4.094913988 4.128372529 4.080243278 3.934470169 4.338898054 4.29544982 4.123837747 4.018987536 3.972859303 4.518104281 4.426399478 4.039166596 4.398027926 4.567846669 3.882498396 4.456261633 4.305525218 4.501831402 4.535017824 3.690047373 4.424362946 4.705606934 4.123640663 4.318823951 4.345941723 4.326056957 4.261045783 4.463031674 4.487175686 4.739448228 4.485993002 4.605754206 4.188100764 4.345645845 4.502777005 4.676812618 4.590849327 4.578742449 4.498112109 4.209994056 4.489593095 5.105139235 4.335035952 4.512776609 3.819530946 4.239369153 4.345227856 4.438637985 4.151023539 4.069495644 4.001636171 4.289563059 4.44463779 4.332423245 4.42209126 4.158625045 4.140618014 4.737429181 4.605328542 4.770893466 4.177843226 4.38072755 4.384436576 4.3036776 4.277542571 4.45586256 4.799206287 4.345462192 4.604132752 4.295548881 4.331294808 4.403530577 4.124398366 4.190615061 3.768626221 3.967950268 4.365055601 4.639460672 4.25929984 4.526081835 4.065621299 4.4578692 4.24011565 4.603380032 3.977609797 4.514553432 4.613591421 4.71347876 4.542861335 4.261765774 4.564014341 4.249556733 4.485123192 4.913916221 4.599588909 4.382972992 4.232318164 4.216276302 4.567372109 4.52031209 4.301255404 4.528325901 3.983551093 4.347386257 4.408110607 4.731154051 4.355978564 4.668527874 4.830977039 4.524930045 4.38520582 4.365996623 4.599009189 4.450875729 4.519916222 4.609242596 4.554090331 4.255125993 4.583035562 4.362465329 4.351628819 4.730888095 4.547088843 4.345854504 4.568109389 4.327210176 4.369962576 4.527475795 4.479201193 4.516097677 4.235344227 3.519476484 4.622131561 4.470330451 4.672129338 3.958931766 4.375629967 4.555918016 4.40903929 4.015765819 4.708088568 4.259459416 4.158079759 3.928620189 4.739685824 4.439139434 4.470200623 +Valerylglycine isomer 2 3.889078716 4.181765852 4.254694804 4.290660491 4.138196474 4.300929631 4.267335235 4.273554372 4.026459018 4.117726076 4.391506546 4.327061846 4.319591936 3.959436787 4.302327307 4.111199307 4.234801947 4.405743336 4.782640641 4.475097443 3.950485409 4.579432672 4.271695364 4.182347358 4.34619879 4.069431557 4.388545701 4.241584222 4.191744654 4.160850517 4.43226049 4.330382886 4.100121431 4.320047243 4.239744811 4.150606181 4.124659917 4.375400222 4.251030211 3.777775091 4.361487807 4.082842319 4.083917302 4.325269835 4.010354674 4.462516251 4.472209609 4.259480191 4.392390039 4.395272253 4.305664387 4.179207569 4.396834579 4.31087313 4.419271137 4.039056214 4.393125083 4.675851363 4.364602525 4.466913655 4.481694872 4.318407645 4.289313676 4.446749448 4.571755159 4.580876703 4.472186105 4.571326085 4.256571368 4.39667478 4.528005839 4.541201304 4.406940498 4.545197346 4.391907474 4.344684431 4.477778512 4.450207826 4.417370227 4.386250441 4.085408476 4.379901509 4.215423793 4.406536979 4.163083399 3.963043381 4.187628652 4.320252412 4.545904132 4.157495172 4.5392129 4.355912516 4.32104914 4.595052116 4.387708897 4.434185544 4.060156974 4.416837064 4.417398742 4.332046944 4.248920107 4.318558306 4.675950075 4.188599527 4.654017827 4.398818689 4.448725636 4.565013209 4.273248747 4.353604308 4.056089953 4.261860182 4.366973197 4.451823465 4.375387491 4.392784813 4.187746104 4.182184758 4.06300237 4.433683963 4.494079796 4.423765189 4.646938456 4.487248568 4.175523204 4.322262883 4.314792833 4.211783408 4.348925516 4.245849039 4.482311354 4.365509618 4.44930672 4.232880823 4.441521421 4.563517091 4.331946693 4.200062175 4.208486129 4.241824508 4.445903314 4.60948463 4.517829053 4.578649469 4.916165933 4.654804445 4.551715167 4.291265754 4.874321475 4.400847348 4.38994431 4.303778936 4.373744009 4.302854884 4.598405731 4.568087675 4.461992655 4.464836218 4.625734497 4.584892798 4.662890116 4.339637524 4.497000889 3.983841809 4.283440095 4.488303133 4.296996312 4.19346948 4.727898398 4.28073709 4.513542781 4.421895016 4.313514034 4.453121704 4.303450906 4.055802163 4.602680714 4.27076319 4.224132258 4.276186679 4.652756637 4.634338821 4.47194762 +Xanthosine 4.075879575 4.195761901 4.12449321 4.2502583 4.361708565 4.199196067 4.196265732 4.404987211 4.41064782 4.175794892 4.258855541 4.172714224 4.016015657 4.100203052 4.384366912 4.112921255 4.399534645 4.332193324 4.208322622 4.379464496 4.265560718 4.418307991 4.087210986 4.354190761 3.978396839 4.172345295 4.106312026 4.113942504 4.558528094 4.405650867 3.683591924 4.26118478 4.282118008 3.858642232 4.299616596 4.314749151 4.065692925 4.144560403 4.103564195 3.790628566 4.416095358 3.700313782 4.265516105 4.289286398 4.302147514 4.38354181 4.218737122 4.241238791 4.415874314 4.120532172 4.291457181 4.432756525 4.239834416 4.385267423 4.203494903 4.352140139 4.353667915 4.211041989 4.471329543 4.407096124 4.335026554 4.295258417 4.360194162 4.244628342 4.523107299 4.680727647 4.380119407 4.50434686 4.101784524 4.190726746 4.702793616 4.283539498 4.491848445 4.628062354 4.405671691 4.158371484 4.227722032 4.320367885 4.415241512 4.640270467 4.21985738 4.150109329 4.265318291 4.540761333 4.261018241 4.151723361 4.259370091 4.393426673 4.870015557 4.19378655 4.10780659 4.016284523 4.107217721 4.31688128 4.49131669 4.562464053 4.50079102 4.281917446 4.487327505 4.133987874 4.186924379 4.447610934 4.384756495 4.455984384 4.431190839 4.272439619 4.515910771 4.35224905 4.249140203 4.126305817 4.025207129 4.144468584 4.370255637 4.480739473 4.363577911 4.194958282 3.950238979 4.197796158 4.489707246 4.395211284 4.589147194 4.410919138 4.26922062 4.315277915 4.516084092 4.26149305 5.535146698 4.244361054 4.422768199 4.078743662 4.434466561 4.090579617 4.085780689 4.48828568 4.610716761 4.159093884 4.139057245 3.674563769 4.65106654 4.176384186 4.301494215 4.241053606 3.94529113 4.123354762 3.765637618 4.203290621 4.40791255 4.150929571 4.289863493 4.178743871 4.123566885 4.345336878 4.279958081 4.063705348 4.069319014 4.200426656 4.00966354 4.200744339 4.061326655 4.093155495 4.514761467 4.227698791 4.527880359 4.507718263 4.375752047 4.28503905 4.235141509 4.534792548 4.394130646 4.523847631 4.352227778 4.233160334 4.253659257 4.031631259 4.426082168 4.500371235 4.186340083 4.629825565 4.408696151 4.3878006 4.256140724 4.487781609 4.222953354 diff --git a/examples/sacurine/input/sampleMetadata.tsv b/examples/sacurine/input/sampleMetadata.tsv new file mode 100644 index 0000000..f370fc9 --- /dev/null +++ b/examples/sacurine/input/sampleMetadata.tsv @@ -0,0 +1,184 @@ +sampleMetadata age bmi gender +HU_011 29 19.75 M +HU_014 59 22.64 F +HU_015 42 22.72 M +HU_017 41 23.03 M +HU_018 34 20.96 M +HU_019 35 23.41 M +HU_020 59 17.1 M +HU_021 34 23.36 M +HU_022 51 28.23 F +HU_023 51 29.55 M +HU_024 57 29.86 M +HU_025 53 21.6 M +HU_026 34 23.46 F +HU_027 37 24.82 M +HU_028 41 23.92 F +HU_029 37 27.78 M +HU_030 49 25.88 M +HU_031 25 20.76 M +HU_032 38 24.09 F +HU_033 44 18.36 F +HU_034 52 23.37 M +HU_035 37 20.7 F +HU_036 47 29.51 M +HU_037 35 25.62 M +HU_038 52 22.72 M +HU_039 45 24.9 M +HU_040 24 26.54 M +HU_041 28 23.67 M +HU_042 36 19.75 M +HU_043 42 29.04 M +HU_044 57 25.46 F +HU_045 46 20.81 F +HU_046 35 24.84 M +HU_047 43 25 F +HU_048 39 19.49 F +HU_049 50 27.85 M +HU_050 30 24.21 M +HU_051 24 23.23 F +HU_052 51 20.06 F +HU_053 49 25.88 M +HU_054 29 20.76 M +HU_055 58 24.89 F +HU_056 41 21.15 M +HU_057 57 27.16 M +HU_058 45 26.7 M +HU_060 55 28.72 F +HU_061 44 25.35 F +HU_062 34 22.22 M +HU_063 35 21.01 F +HU_064 32 21.94 F +HU_065 54 21.87 M +HU_066 25 22.53 F +HU_067 40 19.31 F +HU_068 37 27.22 F +HU_069 39 24.38 M +HU_070 58 18.71 M +HU_072 47 27.13 M +HU_073 35 25.38 M +HU_074 42 20.94 F +HU_075 38 21.05 M +HU_076 47 26.7 M +HU_077 27 21.15 M +HU_078 46 25.18 M +HU_079 47 23.55 M +HU_080 21 19.72 F +HU_081 25 17.84 F +HU_082 49 23.15 M +HU_083 50 29.76 M +HU_084 62 23.8 F +HU_085 23 22.86 M +HU_086 33 23.51 M +HU_087 38 23.8 F +HU_088 50 21.78 F +HU_089 31 23.7 M +HU_090 46 19.79 M +HU_091 61 26.12 M +HU_092 40 21.83 M +HU_093 53 21.71 M +HU_094 32 23.29 M +HU_095 27 27.33 M +HU_097 50 26.78 M +HU_098 46 20.45 M +HU_099 23 21.3 M +HU_100 47 21.22 F +HU_101 39 23.7 M +HU_102 59 24.03 F +HU_103 49 26.79 M +HU_105 47 22.96 M +HU_106 42 27.34 M +HU_107 46 24.22 M +HU_108 25 23.81 M +HU_109 32 22.68 M +HU_110 50 20.9 F +HU_112 55 25.36 M +HU_113 44 23.05 M +HU_114 58 29.38 M +HU_115 46 27.24 F +HU_116 28 20.96 F +HU_117 24 22.86 M +HU_118 30 21.64 F +HU_119 50 24.44 F +HU_120 32 23.88 F +HU_121 26 20.57 M +HU_122 48 23.03 M +HU_123 49 24.39 M +HU_124 34 22.22 M +HU_125 58 25.47 M +HU_126 45 24.7 M +HU_127 45 25.62 M +HU_129 47 29.32 M +HU_130 33 26.06 M +HU_131 42 23.12 M +HU_132 38 26.67 F +HU_133 53 25.43 M +HU_134 48 22.89 M +HU_135 31 24.93 M +HU_136 52 20.81 F +HU_137 28 22.22 M +HU_138 42 21.88 M +HU_139 47 23.03 M +HU_140 49 26.59 M +HU_142 25 20.98 M +HU_143 52 23.15 F +HU_144 38 29.54 M +HU_145 27 29.09 M +HU_146 42 24.21 M +HU_147 60 31.74 M +HU_148 55 30.48 F +HU_149 35 19.49 F +HU_150 49 27.24 F +HU_152 26 17.58 F +HU_154 35 27.71 F +HU_155 48 20.45 F +HU_156 36 16.85 F +HU_157 43 21.95 F +HU_158 50 25.48 F +HU_159 37 21.72 F +HU_160 31 24.17 F +HU_162 50 29.03 F +HU_163 49 23.15 F +HU_164 45 25.63 F +HU_166 40 19.72 F +HU_167 55 20.57 F +HU_168 37 20.76 F +HU_169 53 19.14 F +HU_170 50 24.61 F +HU_171 29 21.37 F +HU_172 55 21.36 F +HU_173 55 20.28 F +HU_174 42 31.64 F +HU_175 35 21.26 F +HU_177 59 28.58 F +HU_179 33 26.57 F +HU_180 53 23.74 F +HU_181 49 22.46 F +HU_182 43 23.74 F +HU_183 46 19.13 F +HU_184 37 25.33 F +HU_185 42 21.09 F +HU_186 44 22.1 F +HU_187 21 19.95 F +HU_188 22 24.22 F +HU_189 39 19.43 F +HU_190 28 25.93 M +HU_191 36 26.12 M +HU_192 31 24.22 M +HU_193 35 21.78 F +HU_194 40 28.04 F +HU_195 26 18.42 F +HU_196 27 21.1 F +HU_197 26 20.72 M +HU_198 35 22.98 M +HU_199 33 21.04 M +HU_200 46 23.89 M +HU_201 34 20.24 M +HU_202 42 28.06 M +HU_203 25 19.95 F +HU_204 31 29.06 M +HU_205 33 28.37 M +HU_206 45 22.15 F +HU_207 33 19.47 F +HU_208 27 18.61 F +HU_209 17.5 21.48 F diff --git a/examples/sacurine/input/variableMetadata.tsv b/examples/sacurine/input/variableMetadata.tsv new file mode 100644 index 0000000..a7793ae --- /dev/null +++ b/examples/sacurine/input/variableMetadata.tsv @@ -0,0 +1,110 @@ +variableMetadata msiLevel hmdb chemicalClass +(2-methoxyethoxy)propanoic acid isomer 2 Organi +(gamma)Glu-Leu/Ile 2 AA-pep +1-Methyluric acid 1 HMDB03099 AroHeP:Xenobi +1-Methylxanthine 1 HMDB10738 AroHeP +1,3-Dimethyluric acid 1 HMDB01857 AroHeP +1,7-Dimethyluric acid 1 HMDB11103 AroHeP +2-acetamido-4-methylphenyl acetate 2 AroHoM +2-Aminoadipic acid 1 HMDB00510 AA-pep +2-Hydroxybenzyl alcohol 1 HMDB59709 AroHoM +2-Isopropylmalic acid 1 HMDB00402 Organi +2-Methylhippuric acid 1 HMDB11723 AA-pep:AcyGly +2,2-Dimethylglutaric acid 1 Lipids +3-Hydroxybenzyl alcohol 1 HMDB59712 AroHoM +3-Hydroxyphenylacetic acid 1 HMDB00440 AroHoM +3-Indole carboxylic acid glucuronide 2 HMDB13189 Carboh +3-Methyl-2-oxovaleric acid 1 HMDB00491 Lipids +3-Methylcrotonylglycine 1 HMDB00459 AA-pep:AcyGly +3,3-Dimethylglutaric acid 1 HMDB02441 Lipids +3,4-Dihydroxybenzeneacetic acid 1 HMDB01336 AroHoM +3,5-dihydroxybenzoic acid/3,4-dihydroxybenzoic acid 2 AroHoM +3,7-Dimethyluric acid 1 HMDB01982 AroHeP +4-Acetamidobutanoic acid isomer 2 2 Lipids +4-Acetamidobutanoic acid isomer 3 2 Lipids +4-Hydroxybenzoic acid 1 HMDB00500 AroHoM +4-Methylhippuric acid/3-Methylhippuric acid 1 AA-pep:AcyGly +5-Hydroxyindoleacetic acid 1 HMDB00763 AroHeP +5-Sulfosalicylic acid 1 HMDB11725 AroHoM +6-(2-hydroxyethoxy)-6-oxohexanoic acid 2 Organi +6-(carboxymethoxy)-hexanoic acid 2 Organi +9-Methylxanthine 2 HMDB59716 AroHeP +Acetaminophen glucuronide 1 HMDB10316 Carboh +Acetylphenylalanine 1 HMDB00512 AA-pep +alpha-N-Phenylacetyl-glutamine 1 HMDB06344 AA-pep +Aminosalicyluric acid 2 AA-pep:AcyGly +Asp-Leu/Ile isomer 1 2 AA-pep +Asp-Leu/Ile isomer 2 2 AA-pep +Aspartic acid 1 HMDB00191 AA-pep +Azelaic acid 1 HMDB00784 Organi +Benzoic acid isomer 2 AroHoM +Chenodeoxycholic acid isomer 2 Lipids:Steroi +Cinnamoylglycine 1 HMDB11621 AA-pep:AcyGly +Citric acid 1 HMDB00094 Organi +Dehydroepiandrosterone 3-glucuronide 1 HMDB10348 Lipids:Steroi +Dehydroepiandrosterone sulfate 1 HMDB01032 Lipids:Steroi +Deoxyhexose 1 HMDB00849 Carboh +Dimethylguanosine 2 HMDB04824 Nucleo +FMNH2 2 HMDB01142 AroHeP +Fumaric acid 1 HMDB00134 Lipids +Gentisic acid 1 HMDB00152 AroHoM +Glu-Val 2 HMDB59717 AA-pep +Gluconic acid and/or isomers 2 Carboh +Glucuronic acid and/or isomers 2 Carboh +Glyceric acid 1 HMDB00139 Carboh +Glycocholic acid isomer 2 2 Lipids:Steroi +Glycocholic acid isomer 3 2 Lipids:Steroi +Heptylmalonic acid 2 HMDB59719 Lipids +Hexanoylglycine 1 HMDB00701 AA-pep:AcyGly +Hippuric acid 1 HMDB00714 AA-pep:AcyGly +Hydroxybenzyl alcohol isomer 2 AroHeM +Hydroxyphenyllactic acid 1 HMDB00755 AroHoM +Hydroxysuberic acid isomer 1 2 Organi +Hydroxysuberic acid isomer 2 2 Organi +Isovalerylalanine isomer 2 AA-pep +Ketoleucine 1 HMDB00695 Lipids +Kynurenic acid 1 HMDB00715 AA-pep +Malic acid 1 HMDB00156 Organi +Methoxysalicylic acid isomer 2 AroHoM +Methyl (hydroxymethyl)pyrrolidine-carboxylate/Methyl (hydroxy)piperidine-carboxylate 2 AA-pep +Methylinosine 2 Nucleo +Mevalonic acid isomer 1 2 Organi +Monoethyl phthalate 2 HMDB02120 AroHoM:Xenobi +N-Acetyl-aspartic acid 1 HMDB00812 AA-pep +N-Acetylisoleucine 1 AA-pep +N-Acetylleucine 1 HMDB11756 AA-pep +N-Acetyltryptophan 1 HMDB13713 AA-pep +N-Acetyltryptophan isomer 3 2 AA-pep +N2-Acetylaminoadipic acid 2 AA-pep +N4-Acetylcytidine 1 HMDB05923 Nucleo +Nicotinuric acid isomer 2 AA-pep +Ortho-Hydroxyphenylacetic acid 1 HMDB00669 AroHoM +Oxoglutaric acid 2 HMDB00208 Organi +p-Anisic acid 1 HMDB01101 AroHoM +p-Hydroxyhippuric acid 2 HMDB13678 AA-pep:AcyGly +p-Hydroxymandelic acid 1 HMDB00822 AroHoM +p-Hydroxyphenylacetic acid 1 HMDB00020 AroHoM +Pantothenic acid 1 HMDB00210 AliAcy +Pentose 2 Carboh +Phe-Tyr-Asp (and isomers) 2 AA-pep +Porphobilinogen 1 HMDB00245 Organi +Pyridoxic acid isomer 1 2 AroHeM +Pyridylacetylglycine 2 HMDB59723 AA-pep:AcyGly:Xenobi +Pyrocatechol sulfate 2 HMDB59724 AroHoM +Pyroglutamic acid 1 HMDB00267 AliHeM +Pyrroledicarboxylic acid 2 AroHeM +Pyruvic acid 1 HMDB00243 Organi +Quinic acid 1 HMDB03072 AliHoM +Salicylic acid 1 HMDB01895 AroHoM:Xenobi +Sebacic acid 1 HMDB00792 Organi +Suberic acid 1 HMDB00893 Organi +Sulfosalicylic acid isomer 2 AroHoM +Taurine 1 HMDB00251 Organi +Testosterone glucuronide 2 HMDB03193 Lipids:Steroi +Tetrahydrohippuric acid 2 AA-pep:AcyGly +Threo-3-Phenylserine 1 HMDB02184 AA-pep +Threonic acid/Erythronic acid 2 Carboh +Tryptophan 1 HMDB00929 AA-pep +Valerylglycine isomer 1 2 AA-pep:AcyGly +Valerylglycine isomer 2 2 AA-pep:AcyGly +Xanthosine 1 HMDB00299 Nucleo diff --git a/examples/sacurine/workflow-test.yml b/examples/sacurine/workflow-test.yml new file mode 100644 index 0000000..c4726c4 --- /dev/null +++ b/examples/sacurine/workflow-test.yml @@ -0,0 +1,31 @@ +########################################################################################## +# Global settings +########################################################################################## +# galaxy_url: "http://192.168.64.8:30700" # default is GALAXY_URL +# galaxy_api_key: "4b86f51252b5f220012b3e259d0877f9" # default is GALAXY_API_KEY +#enable_logger: True +#enable_debug: True +#output_folder: "results" +#disable_cleanup: True + +########################################################################################## +# Workflow tests +########################################################################################## +workflows: + sacurine: + file: "workflow.ga" + params: + 3: + "orthoI": "NA" + "predI": "1" + "respC": "gender" + "testL": "FALSE" + inputs: + "DataMatrix": "input/dataMatrix.tsv" + "SampleMetadata": "input/sampleMetadata.tsv" + "VariableMetadata": "input/variableMetadata.tsv" + expected: + Univariate_variableMetadata: "expected/Univariate_variableMetadata.tsv" + Multivariate_sampleMetadata: "expected/Multivariate_sampleMetadata.tsv" + Multivariate_variableMetadata: "expected/Multivariate_variableMetadata.tsv" + Biosigner_variableMetadata: "expected/Biosigner_variableMetadata.tsv" diff --git a/examples/sacurine/workflow.ga b/examples/sacurine/workflow.ga new file mode 100644 index 0000000..d56c5ed --- /dev/null +++ b/examples/sacurine/workflow.ga @@ -0,0 +1,376 @@ +{ + "a_galaxy_workflow": "true", + "annotation": "", + "format-version": "0.1", + "name": "w4m-sacurine-statistics", + "steps": { + "0": { + "annotation": "", + "content_id": null, + "id": 0, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "DataMatrix" + } + ], + "label": null, + "name": "Input dataset", + "outputs": [], + "position": { + "left": 108.5, + "top": 269.859375 + }, + "tool_errors": null, + "tool_id": null, + "tool_state": "{\"name\": \"DataMatrix\"}", + "tool_version": null, + "type": "data_input", + "uuid": "cd230378-55ed-4601-8606-acaa4aa4c641", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "1d91cd42-3e6a-45c1-b812-84d03a52a343" + } + ] + }, + "1": { + "annotation": "", + "content_id": null, + "id": 1, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "SampleMetadata" + } + ], + "label": null, + "name": "Input dataset", + "outputs": [], + "position": { + "left": 111.5, + "top": 360.875 + }, + "tool_errors": null, + "tool_id": null, + "tool_state": "{\"name\": \"SampleMetadata\"}", + "tool_version": null, + "type": "data_input", + "uuid": "be3e4bb5-62d1-4cc9-b13d-6431632fed59", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "040a7788-3c3a-4d81-8646-28fb39db861c" + } + ] + }, + "2": { + "annotation": "", + "content_id": null, + "id": 2, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "VariableMetadata" + } + ], + "label": null, + "name": "Input dataset", + "outputs": [], + "position": { + "left": 111.5, + "top": 448.859375 + }, + "tool_errors": null, + "tool_id": null, + "tool_state": "{\"name\": \"VariableMetadata\"}", + "tool_version": null, + "type": "data_input", + "uuid": "34d0e840-da06-4cc0-8e1f-9d03b231e644", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "9e7620e2-05b0-4ff9-aa19-d1818ffab2e8" + } + ] + }, + "3": { + "annotation": "", + "content_id": "Univariate", + "id": 3, + "input_connections": { + "dataMatrix_in": { + "id": 0, + "output_name": "output" + }, + "sampleMetadata_in": { + "id": 1, + "output_name": "output" + }, + "variableMetadata_in": { + "id": 2, + "output_name": "output" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool Univariate", + "name": "sampleMetadata_in" + }, + { + "description": "runtime parameter for tool Univariate", + "name": "variableMetadata_in" + }, + { + "description": "runtime parameter for tool Univariate", + "name": "dataMatrix_in" + } + ], + "label": null, + "name": "Univariate", + "outputs": [ + { + "name": "variableMetadata_out", + "type": "tabular" + }, + { + "name": "information", + "type": "txt" + } + ], + "position": { + "left": 544.5, + "top": 609.875 + }, + "post_job_actions": { + "HideDatasetActioninformation": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "information" + }, + "RenameDatasetActionvariableMetadata_out": { + "action_arguments": { + "newname": "Univariate_variableMetadata" + }, + "action_type": "RenameDatasetAction", + "output_name": "variableMetadata_out" + } + }, + "tool_errors": null, + "tool_id": "Univariate", + "tool_state": "{\"thrN\": \"\\\"0.05\\\"\", \"__page__\": 0, \"facC\": \"\\\"gender\\\"\", \"__rerun_remap_job_id__\": null, \"sampleMetadata_in\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"tesC\": \"\\\"ttest\\\"\", \"variableMetadata_in\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"adjC\": \"\\\"fdr\\\"\", \"dataMatrix_in\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\"}", + "tool_version": "2.1.1", + "type": "tool", + "uuid": "79d9a6e9-694e-499d-837f-77ce3752558c", + "workflow_outputs": [ + { + "label": "Univariate_variableMetadata", + "output_name": "variableMetadata_out", + "uuid": "4ccd0ed4-8814-46fa-8e5b-fb9ccd5bcc95" + } + ] + }, + "4": { + "annotation": "", + "content_id": "Multivariate", + "id": 4, + "input_connections": { + "dataMatrix_in": { + "id": 0, + "output_name": "output" + }, + "sampleMetadata_in": { + "id": 1, + "output_name": "output" + }, + "variableMetadata_in": { + "id": 3, + "output_name": "variableMetadata_out" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool Multivariate", + "name": "sampleMetadata_in" + }, + { + "description": "runtime parameter for tool Multivariate", + "name": "variableMetadata_in" + }, + { + "description": "runtime parameter for tool Multivariate", + "name": "dataMatrix_in" + } + ], + "label": null, + "name": "Multivariate", + "outputs": [ + { + "name": "sampleMetadata_out", + "type": "tabular" + }, + { + "name": "variableMetadata_out", + "type": "tabular" + }, + { + "name": "figure", + "type": "pdf" + }, + { + "name": "information", + "type": "txt" + } + ], + "position": { + "left": 833.5, + "top": 447.875 + }, + "post_job_actions": { + "HideDatasetActionfigure": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "figure" + }, + "HideDatasetActioninformation": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "information" + }, + "RenameDatasetActionsampleMetadata_out": { + "action_arguments": { + "newname": "Multivariate_sampleMetadata" + }, + "action_type": "RenameDatasetAction", + "output_name": "sampleMetadata_out" + }, + "RenameDatasetActionvariableMetadata_out": { + "action_arguments": { + "newname": "Multivariate_variableMetadata" + }, + "action_type": "RenameDatasetAction", + "output_name": "variableMetadata_out" + } + }, + "tool_errors": null, + "tool_id": "Multivariate", + "tool_state": "{\"advGph\": \"{\\\"__current_case__\\\": 0, \\\"opgC\\\": \\\"default\\\"}\", \"__page__\": 0, \"sampleMetadata_in\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"__rerun_remap_job_id__\": null, \"predI\": \"\\\"1\\\"\", \"respC\": \"\\\"gender\\\"\", \"orthoI\": \"\\\"NA\\\"\", \"advCpt\": \"{\\\"opcC\\\": \\\"default\\\", \\\"__current_case__\\\": 0}\", \"variableMetadata_in\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"dataMatrix_in\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"testL\": \"\\\"FALSE\\\"\"}", + "tool_version": "2.3.2", + "type": "tool", + "uuid": "cff48e13-a4ea-4e77-860b-86941632f984", + "workflow_outputs": [ + { + "label": "Multivariate_variableMetadata", + "output_name": "variableMetadata_out", + "uuid": "ab6b3005-11ee-47b0-9bd6-99f29b4a85dd" + }, + { + "label": "Multivariate_sampleMetad", + "output_name": "sampleMetadata_out", + "uuid": "145e2b6b-3622-4bfb-958c-f54c14a2916d" + } + ] + }, + "5": { + "annotation": "", + "content_id": "biosigner", + "id": 5, + "input_connections": { + "dataMatrix_in": { + "id": 0, + "output_name": "output" + }, + "sampleMetadata_in": { + "id": 4, + "output_name": "sampleMetadata_out" + }, + "variableMetadata_in": { + "id": 4, + "output_name": "variableMetadata_out" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool Biosigner", + "name": "sampleMetadata_in" + }, + { + "description": "runtime parameter for tool Biosigner", + "name": "dataMatrix_in" + }, + { + "description": "runtime parameter for tool Biosigner", + "name": "variableMetadata_in" + } + ], + "label": null, + "name": "Biosigner", + "outputs": [ + { + "name": "variableMetadata_out", + "type": "tabular" + }, + { + "name": "figure_tier", + "type": "pdf" + }, + { + "name": "figure_boxplot", + "type": "pdf" + }, + { + "name": "information", + "type": "txt" + } + ], + "position": { + "left": 1232.5, + "top": 268.875 + }, + "post_job_actions": { + "HideDatasetActionfigure_boxplot": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "figure_boxplot" + }, + "HideDatasetActionfigure_tier": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "figure_tier" + }, + "HideDatasetActioninformation": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "information" + }, + "RenameDatasetActionvariableMetadata_out": { + "action_arguments": { + "newname": "Biosigner_variableMetadata" + }, + "action_type": "RenameDatasetAction", + "output_name": "variableMetadata_out" + } + }, + "tool_errors": null, + "tool_id": "biosigner", + "tool_state": "{\"__page__\": 0, \"sampleMetadata_in\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"__rerun_remap_job_id__\": null, \"respC\": \"\\\"gender\\\"\", \"variableMetadata_in\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\", \"advCpt\": \"{\\\"seedI\\\": \\\"123\\\", \\\"tierC\\\": \\\"S\\\", \\\"pvalN\\\": \\\"0.05\\\", \\\"methodC\\\": \\\"all\\\", \\\"__current_case__\\\": 0, \\\"bootI\\\": \\\"50\\\", \\\"opcC\\\": \\\"full\\\"}\", \"dataMatrix_in\": \"{\\\"__class__\\\": \\\"RuntimeValue\\\"}\"}", + "tool_version": "2.2.2", + "type": "tool", + "uuid": "bc78ef41-6eee-4fe2-9fdf-e423b1ba33c7", + "workflow_outputs": [ + { + "label": "Biosigner_variableMetadata", + "output_name": "variableMetadata_out", + "uuid": "fd01c7c6-2bfb-47c8-9036-ac1a9f00ac57" + } + ] + } + }, + "uuid": "56f5af54-1026-41f0-9bdd-a9fde6f534a2" +} \ No newline at end of file diff --git a/examples/workflow-test-suite-full.yml b/examples/workflow-test-suite-full.yml new file mode 100644 index 0000000..7371071 --- /dev/null +++ b/examples/workflow-test-suite-full.yml @@ -0,0 +1,57 @@ +########################################################################################## +# Global settings +########################################################################################## +# galaxy_url: "http://192.168.64.8:30700" # default is GALAXY_URL +# galaxy_api_key: "4b86f51252b5f220012b3e259d0877f9" # default is GALAXY_API_KEY +enable_logger: False +# enable_debug: True +# output_folder: "results" + +########################################################################################## +# Workflow tests +########################################################################################## +workflows: + + # workflow test "change case" + change_case: + file: "change_case/workflow.ga" + inputs: + InputText: "change_case/input" + expected: + OutputText: "change_case/expected_output" + + # workflow test "multivariate" + multivariate: + file: "multivariate/workflow.ga" + params: + 3: + "orthoI": "NA" + "predI": "1" + "respC": "gender" + "testL": "FALSE" + inputs: + "DataMatrix": "multivariate/dataMatrix.tsv" + "SampleMetadata": "multivariate/sampleMetadata.tsv" + "VariableMetadata": "multivariate/variableMetadata.tsv" + expected: + sampleMetadata_out: "multivariate/sampleMetadata_out" + variableMetadata_out: "multivariate/variableMetadata_out" + + # workflow test "sacurine" + sacurine: + file: "sacurine/workflow.ga" + params: + 3: + "orthoI": "NA" + "predI": "1" + "respC": "gender" + "testL": "FALSE" + inputs: + "DataMatrix": "sacurine/input/dataMatrix.tsv" + "SampleMetadata": "sacurine/input/sampleMetadata.tsv" + "VariableMetadata": "sacurine/input/variableMetadata.tsv" + expected: + Univariate_variableMetadata: "sacurine/expected/Univariate_variableMetadata.tsv" + Multivariate_sampleMetadata: "sacurine/expected/Multivariate_sampleMetadata.tsv" + Multivariate_variableMetadata: "sacurine/expected/Multivariate_variableMetadata.tsv" + Biosigner_variableMetadata: "sacurine/expected/Biosigner_variableMetadata.tsv" \ No newline at end of file diff --git a/examples/workflow-test-suite-min.yml b/examples/workflow-test-suite-min.yml new file mode 100644 index 0000000..da53e6c --- /dev/null +++ b/examples/workflow-test-suite-min.yml @@ -0,0 +1,38 @@ +########################################################################################## +# Global settings +########################################################################################## +# galaxy_url: "http://192.168.64.8:30700" # default is GALAXY_URL +# galaxy_api_key: "4b86f51252b5f220012b3e259d0877f9" # default is GALAXY_API_KEY +enable_logger: False +# enable_debug: True +# output_folder: "results" + +########################################################################################## +# Workflow tests +########################################################################################## +workflows: + + # workflow test "change case" + change_case: + file: "change_case/workflow.ga" + inputs: + InputText: "change_case/input" + expected: + OutputText: "change_case/expected_output" + + # workflow test "multivariate" + multivariate: + file: "multivariate/workflow.ga" + params: + 3: + "orthoI": "NA" + "predI": "1" + "respC": "gender" + "testL": "FALSE" + inputs: + "DataMatrix": "multivariate/dataMatrix.tsv" + "SampleMetadata": "multivariate/sampleMetadata.tsv" + "VariableMetadata": "multivariate/variableMetadata.tsv" + expected: + sampleMetadata_out: "multivariate/sampleMetadata_out" + variableMetadata_out: "multivariate/variableMetadata_out" diff --git a/examples/workflow-test-suite.yml b/examples/workflow-test-suite.yml new file mode 120000 index 0000000..ac9a91f --- /dev/null +++ b/examples/workflow-test-suite.yml @@ -0,0 +1 @@ +workflow-test-suite-min.yml \ No newline at end of file diff --git a/examples/workflows.json b/examples/workflows.json new file mode 100644 index 0000000..fa9df84 --- /dev/null +++ b/examples/workflows.json @@ -0,0 +1,96 @@ +{ + "galaxy_url": null, + "enable_logger": false, + "galaxy_api_key": null, + "output_folder": "results", + "workflows": { + "change_case": { + "expected": { + "output2": { + "name": "output2", + "file": "change_case/expected_output_2", + "comparator": null + }, + "output1": { + "name": "output1", + "file": "change_case/expected_output_1", + "comparator": null + } + }, + "inputs": { + "Input Dataset": "change_case/input" + }, + "params": {}, + "name": "change_case", + "file": "change_case/workflow.ga" + }, + "multivariate": { + "expected": { + "variableMetadata_out": { + "name": "variableMetadata_out", + "file": "multivariate/variableMetadata_out", + "comparator": null + }, + "sampleMetadata_out": { + "name": "sampleMetadata_out", + "file": "multivariate/sampleMetadata_out", + "comparator": null + } + }, + "inputs": { + "DataMatrix": "multivariate/dataMatrix.tsv", + "SampleMetadata": "multivariate/sampleMetadata.tsv", + "VariableMetadata": "multivariate/variableMetadata.tsv" + }, + "params": { + "3": { + "predI": "1", + "respC": "gender", + "orthoI": "NA", + "testL": "FALSE" + } + }, + "name": "multivariate", + "file": "multivariate/workflow.ga" + }, + "sacurine": { + "expected": { + "Univariate_variableMetadata": { + "name": "Univariate_variableMetadata", + "file": "sacurine/expected/Univariate_variableMetadata.tsv", + "comparator": null + }, + "Multivariate_variableMetadata": { + "name": "Multivariate_variableMetadata", + "file": "sacurine/expected/Multivariate_variableMetadata.tsv", + "comparator": null + }, + "Biosigner_variableMetadata": { + "name": "Biosigner_variableMetadata", + "file": "sacurine/expected/Biosigner_variableMetadata.tsv", + "comparator": null + }, + "Multivariate_sampleMetadata": { + "name": "Multivariate_sampleMetadata", + "file": "sacurine/expected/Multivariate_sampleMetadata.tsv", + "comparator": null + } + }, + "inputs": { + "DataMatrix": "sacurine/input/dataMatrix.tsv", + "SampleMetadata": "sacurine/input/sampleMetadata.tsv", + "VariableMetadata": "sacurine/input/variableMetadata.tsv" + }, + "params": { + "3": { + "predI": "1", + "respC": "gender", + "orthoI": "NA", + "testL": "FALSE" + } + }, + "name": "sacurine", + "file": "sacurine/workflow.ga" + } + } +} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..38f454e --- /dev/null +++ b/requirements.txt @@ -0,0 +1,13 @@ +setuptools +future>=0.16.0 +#ruamel.yaml==0.13.14 +lxml +pyyaml +sphinx_rtd_theme +Jinja2>=2.9 +docker>=2.1.0 +dockerpty>=0.4.1 +unittest-xml-reporting + +# Bioblend (latest version on the master branch) +git+https://github.com/galaxyproject/bioblend.git/@master#egg=bioblend \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..946cca4 --- /dev/null +++ b/setup.py @@ -0,0 +1,161 @@ +import os +import shutil +from setuptools import setup +import subprocess as _subprocess +from json import dump as _json_dump +from pip.req import parse_requirements +from distutils.command.clean import clean +from setuptools.command.build_py import build_py + + +def _run_txt_cmd(cmd): + # Using universal_newlines=True causes subprocess to always + # handle the output as a str. This should be compatible with + # all versions of Python >= 2.7. Remeber that check_output in + # Python 3 returns a binary stream, unless called with + # universal_newlines=True + return _subprocess.check_output(cmd, universal_newlines=True).strip("\n") + + +def _check_is_git_repo(): + """ + Check whether the current project directory is a Git repository or not. + + :rtype: bool + :return: ``True`` if the current project directory is a Git repository; ``False`` otherwise + """ + if _subprocess.call(["git", "branch"], stderr=_subprocess.STDOUT, stdout=open(os.devnull, 'w')) != 0: + return False + else: + return True + + +def update_properties(config): + # do not write properties file if the current project directory + # is not a Git repository + if not _check_is_git_repo(): + print("Not a Git repository") + return False + + first_remote = _run_txt_cmd(['git', 'remote']).split('\n')[0] + repo_url = _run_txt_cmd(['git', 'config', '--get', 'remote.{}.url'.format(first_remote)]) + branch = _run_txt_cmd(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) + last_commit = _run_txt_cmd(['git', 'log', '--format=%H', '-n', '1']) + + # get tags + tags = [] + try: + # Git repository could not contain tags + # and the following command fails in such a case. + # We simply ignore this failure + tags = _run_txt_cmd(['git', 'show-ref', '--tags', '-s']) + except: + pass + + # extract Git repository info + if repo_url.startswith("git@"): + # ssh protocol + info = repo_url.split(":") + owner_repo = info[1].split("/") + owner = owner_repo[0].strip() + repo = owner_repo[1].strip("\n.git") + elif repo_url.startswith("https://"): + # https protocol + info = repo_url.split("https://") + owner_repo = info[1].split("/") + owner = owner_repo[1].strip() + repo = owner_repo[2].strip("\n.git") + else: + raise ValueError("Unknown Git repository scheme") + + # map the git phnmnl repository to the Crs4 DockerHub repository + if owner == "phnmnl": + owner = "crs4" + + # git & docker tag + tag = None + if last_commit in tags: + tag = _run_txt_cmd(['git', 'describe', '--contains', last_commit]) + docker_tag = "alpine-{0}".format(tag) + else: + docker_tag = "alpine-{0}".format(branch) + + # Git repository info + config["Repository"] = { + "url": repo_url, + "branch": branch, + "owner": owner, + "repo": repo, + "last commit": last_commit, + "tag": tag + } + + # Docker info + config["Docker"] = { + # uncomment to set a registry different from the DockerHub + # "registry": "", + "owner": owner, + "tag": docker_tag + } + return True + + +class BuildCommand(build_py): + """Custom build command.""" + + def run(self): + config = dict() + update_properties(config) + + with open("wft4galaxy/wft4galaxy.properties", "w") as fp: + _json_dump(config, fp, indent=4) + build_py.run(self) + + +class CleanCommand(clean): + def _rmrf(self, path): + """ + Remove a file or directory. + """ + try: + if os.path.isdir(path) and not os.path.islink(path): + shutil.rmtree(path) + else: + os.remove(path) + except OSError: + pass + + def run(self): + clean.run(self) + garbage_list = [ + "DEFAULT_HADOOP_HOME", + "build", + "dist", + "wft4galaxy.egg-info", + "wft4galaxy/wft4galaxy.properties", + "results" + ] + for p in garbage_list: + self._rmrf(p) + + +install_reqs = parse_requirements("requirements.txt", session="hack") +requirements = [str(ir.req) for ir in install_reqs] +setup( + name='wft4galaxy', + description='Utility module for testing Galaxy workflows', + url='https://github.com/phnmnl/wft4galaxy', + version='0.1', + install_requires=requirements, + package_data={'wft4galaxy': ['wft4galaxy.properties'], 'templates': ['*']}, + packages=["wft4galaxy", "wft4galaxy.comparators", "wft4galaxy.app", "templates"], + entry_points={'console_scripts': [ + 'wft4galaxy = wft4galaxy.app.runner:main', + 'wft4galaxy-wizard = wft4galaxy.app.wizard:main', + 'wft4galaxy-docker = wft4galaxy.app.docker_runner:main' + ]}, + cmdclass={ + "build_py": BuildCommand, + "clean": CleanCommand + }, +) diff --git a/templates/workflow-test-template.yaml b/templates/workflow-test-template.yaml new file mode 100644 index 0000000..2245d5b --- /dev/null +++ b/templates/workflow-test-template.yaml @@ -0,0 +1,51 @@ +########################################################################################## +# Global settings +########################################################################################## +{{ "galaxy_url:".ljust(15) }} {{ '"{0}"'.format(config.galaxy_url).ljust(40) }} # default is GALAXY_URL +{{ "galaxy_api_key:".ljust(15) }} {{ '"{0}"'.format(config.galaxy_api_key).ljust(40) }} # default is GALAXY_API_KEY +{{ "enable_debug:".ljust(15) }} {{ '"{0}"'.format(config.enable_debug).ljust(40) }} # enable debug level +{{ "output_folder:".ljust(15) }} {{ '"{0}"'.format(config.output_folder).ljust(40) }} # path folder for outputs + +########################################################################################## +# Workflow tests +########################################################################################## +workflows: +{% for wf in config.workflow_tests.values() %} + + ######################################################################################## + # workflow test case: "{{ wf.name }}" + ######################################################################################## + {{ wf.name }}: + + # worflow definition file (i.e., `.ga`file) + file: "{{ wf.filename }}" + + # input section + ####################################################################################### + inputs: + {% for _input in wf.inputs.values() %} + + # short form + # {{ _input.name }}: "{{ _input.file[0] }}" + + # extended form + {{ _input.name }}: + file: "{{ _input.file[0] }}" + type: "{{ _input.type }}" + {% endfor %} + + # expected outputs + ####################################################################################### + expected: + {% for _output in wf.expected_outputs.values() %} + + # short form + # {{ _output.name }}: "{{ _output.file }}" + + # extended form + {{ _output.name }}: + file: "{{ _output.file }}" + comparator: "{{ _output.comparator }}" + {% endfor %} + +{% endfor %} \ No newline at end of file diff --git a/tests/comparators/csv_row_col_lengths/__init__.py b/tests/comparators/csv_row_col_lengths/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/comparators/csv_row_col_lengths/csv_test_file_actual.csv b/tests/comparators/csv_row_col_lengths/csv_test_file_actual.csv new file mode 100644 index 0000000..2faf4c2 --- /dev/null +++ b/tests/comparators/csv_row_col_lengths/csv_test_file_actual.csv @@ -0,0 +1,4 @@ +headerA,headerB,headerC +1,0,1 +a,b,c +d,e,f \ No newline at end of file diff --git a/tests/comparators/csv_row_col_lengths/csv_test_file_expected.csv b/tests/comparators/csv_row_col_lengths/csv_test_file_expected.csv new file mode 100644 index 0000000..13aa39f --- /dev/null +++ b/tests/comparators/csv_row_col_lengths/csv_test_file_expected.csv @@ -0,0 +1,4 @@ +headerA,headerB,headerC +1,0,2 +a,x,c +d,y,f \ No newline at end of file diff --git a/tests/comparators/csv_row_col_lengths/csv_test_file_expected_fail.csv b/tests/comparators/csv_row_col_lengths/csv_test_file_expected_fail.csv new file mode 100644 index 0000000..274e1b6 --- /dev/null +++ b/tests/comparators/csv_row_col_lengths/csv_test_file_expected_fail.csv @@ -0,0 +1,4 @@ +headerA,headerB,headerC,headerD +1,0,1,3 +a,b,c,m +d,e,f,n \ No newline at end of file diff --git a/tests/comparators/csv_row_col_lengths/csv_test_file_expected_fail_2.csv b/tests/comparators/csv_row_col_lengths/csv_test_file_expected_fail_2.csv new file mode 100644 index 0000000..d3c6c2a --- /dev/null +++ b/tests/comparators/csv_row_col_lengths/csv_test_file_expected_fail_2.csv @@ -0,0 +1,5 @@ +headerA,headerB,headerC +1,0,1 +a,b,c +d,e,f +e,e,e \ No newline at end of file diff --git a/tests/comparators/csv_row_col_lengths/test_comparator.py b/tests/comparators/csv_row_col_lengths/test_comparator.py new file mode 100644 index 0000000..c676146 --- /dev/null +++ b/tests/comparators/csv_row_col_lengths/test_comparator.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +__author__ = 'pmoreno' + +import os +import sys +import unittest +import pkg_resources + +sys.path.append( os.path.join(os.path.dirname(__file__), '../../') ) + +from wft4galaxy.comparators import csv_same_row_and_col_lengths + + +class TestCSVSameRowAndColLengthsComp(unittest.TestCase): + def test_run_success(self): + path_actual = self.__get_resource_path('csv_test_file_actual.csv') + path_expected = self.__get_resource_path('csv_test_file_expected.csv') + self.assertTrue(csv_same_row_and_col_lengths(path_actual, path_expected), + "Actual and expected file have the same number of rows and cols") + + def test_run_fail_num_cols(self): + path_actual = self.__get_resource_path('csv_test_file_actual.csv') + path_expected = self.__get_resource_path('csv_test_file_expected_fail.csv') + self.assertFalse(csv_same_row_and_col_lengths(path_actual, path_expected), + "Actual and expected file have different number of cols") + + def test_run_fail_num_rows(self): + path_actual = self.__get_resource_path('csv_test_file_actual.csv') + path_expected = self.__get_resource_path('csv_test_file_expected_fail_2.csv') + self.assertFalse(csv_same_row_and_col_lengths(path_actual, path_expected), + "Actual and expected file have different number of rows") + + @staticmethod + def __get_resource_path(file_name_in_test_dir): + resource_path = os.path.join(file_name_in_test_dir) + return pkg_resources.resource_filename(__name__, resource_path) + + +def suite(): + return unittest.TestLoader().loadTestsFromTestCase(TestCSVSameRowAndColLengthsComp) + + +def main(): + result = unittest.TextTestRunner(verbosity=2).run(suite()) + return 0 if result.wasSuccessful() else 1 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/tests/comparators/rounded_comparison_csv/__init__.py b/tests/comparators/rounded_comparison_csv/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/comparators/rounded_comparison_csv/correlation_table.csv b/tests/comparators/rounded_comparison_csv/correlation_table.csv new file mode 100644 index 0000000..0819392 --- /dev/null +++ b/tests/comparators/rounded_comparison_csv/correlation_table.csv @@ -0,0 +1,10 @@ +"spec","r1","r2","r3","r4" +"Br",0.538284659385681,0.347380578517914,0.984475374221802,0.858644068241119 +"Cc",0.972778141498566,0.821589231491089,0.667640388011932,0.982909619808197 +"Ft",0.711512565612793,0.79552161693573,0.820532739162445,0.348022520542145 +"Gp",0.916094779968262,0.286471843719482,0.93779468536377,0.787193953990936 +"Hc",0.64589512348175,0.552187442779541,0.625308692455292,0.823695063591003 +"Mp",0.997475743293762,-0.0424592085182667,0.997138321399689,0.989661455154419 +"Pu",0.68191522359848,0.419826716184616,0.923761785030365,0.409022688865662 +"Po",0.900495171546936,0.641049265861511,0.985500574111938,0.607609212398529 +"Rs",0.977232158184052,0,0.677042424678802,0.854979515075684 diff --git a/tests/comparators/rounded_comparison_csv/diff_field.csv b/tests/comparators/rounded_comparison_csv/diff_field.csv new file mode 100644 index 0000000..ea5b77b --- /dev/null +++ b/tests/comparators/rounded_comparison_csv/diff_field.csv @@ -0,0 +1,10 @@ +"spec","r1","r2","r3","r4" +"Br",1.538284659385681,0.347380578517914,0.984475374221802,0.858644068241119 +"Cc",0.972778141498566,0.821589231491089,0.667640388011932,0.982909619808197 +"Ft",0.711512565612793,0.79552161693573,0.820532739162445,0.348022520542145 +"Gp",0.916094779968262,0.286471843719482,0.93779468536377,0.787193953990936 +"Hc",0.64589512348175,0.552187442779541,0.625308692455292,0.823695063591003 +"Mp",0.997475743293762,-0.0424592085182667,0.997138321399689,0.989661455154419 +"Pu",0.68191522359848,0.419826716184616,0.923761785030365,0.409022688865662 +"Po",0.900495171546936,0.641049265861511,0.985500574111938,0.607609212398529 +"Rs",0.977232158184052,0,0.677042424678802,0.854979515075684 diff --git a/tests/comparators/rounded_comparison_csv/diff_heading.csv b/tests/comparators/rounded_comparison_csv/diff_heading.csv new file mode 100644 index 0000000..75425e0 --- /dev/null +++ b/tests/comparators/rounded_comparison_csv/diff_heading.csv @@ -0,0 +1,10 @@ +"spec","Wrong","r2","r3","r4" +"Br",0.538284659385681,0.347380578517914,0.984475374221802,0.858644068241119 +"Cc",0.972778141498566,0.821589231491089,0.667640388011932,0.982909619808197 +"Ft",0.711512565612793,0.79552161693573,0.820532739162445,0.348022520542145 +"Gp",0.916094779968262,0.286471843719482,0.93779468536377,0.787193953990936 +"Hc",0.64589512348175,0.552187442779541,0.625308692455292,0.823695063591003 +"Mp",0.997475743293762,-0.0424592085182667,0.997138321399689,0.989661455154419 +"Pu",0.68191522359848,0.419826716184616,0.923761785030365,0.409022688865662 +"Po",0.900495171546936,0.641049265861511,0.985500574111938,0.607609212398529 +"Rs",0.977232158184052,0,0.677042424678802,0.854979515075684 diff --git a/tests/comparators/rounded_comparison_csv/diff_under_round.csv b/tests/comparators/rounded_comparison_csv/diff_under_round.csv new file mode 100644 index 0000000..8d43618 --- /dev/null +++ b/tests/comparators/rounded_comparison_csv/diff_under_round.csv @@ -0,0 +1,10 @@ +"spec","r1","r2","r3","r4" +"Br",0.538284659385689,0.347380578517914,0.984475374221802,0.858644068241119 +"Cc",0.972778141498566,0.821589231491089,0.667640388011932,0.982909619808197 +"Ft",0.711512565612793,0.79552161693573,0.820532739162445,0.348022520542145 +"Gp",0.916094779968262,0.286471843719482,0.93779468536377,0.787193953990936 +"Hc",0.64589512348175,0.552187442779541,0.625308692455292,0.823695063591003 +"Mp",0.997475743293762,-0.0424592085182667,0.997138321399689,0.989661455154419 +"Pu",0.68191522359848,0.419826716184616,0.923761785030365,0.409022688865662 +"Po",0.900495171546936,0.641049265861511,0.985500574111938,0.607609212398529 +"Rs",0.977232158184052,0,0.677042424678802,0.854979515075684 diff --git a/tests/comparators/rounded_comparison_csv/test_comparator.py b/tests/comparators/rounded_comparison_csv/test_comparator.py new file mode 100644 index 0000000..6e765d2 --- /dev/null +++ b/tests/comparators/rounded_comparison_csv/test_comparator.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +import os +import sys +import unittest + +TestDir = os.path.abspath(os.path.dirname(__file__)) + + +class TestRoundedCsvComparator(unittest.TestCase): + CorrelationFile = os.path.join(TestDir, 'correlation_table.csv') + + def test_identical_files(self): + from wft4galaxy.comparators import rounded_comparison_csv + self.assertTrue(rounded_comparison_csv(self.CorrelationFile, self.CorrelationFile)) + + def test_diff_heading(self): + from wft4galaxy.comparators import rounded_comparison_csv + different_file = os.path.join(TestDir, 'diff_heading.csv') + self.assertFalse(rounded_comparison_csv(different_file, self.CorrelationFile)) + + def test_diff_field(self): + from wft4galaxy.comparators import rounded_comparison_csv + different_file = os.path.join(TestDir, 'diff_field.csv') + self.assertFalse(rounded_comparison_csv(different_file, self.CorrelationFile)) + + def test_diff_field_less_than_roundoff(self): + from wft4galaxy.comparators import rounded_comparison_csv + # A number in a field is different, but at a higher precision than required + # by comparison function + different_file = os.path.join(TestDir, 'diff_under_round.csv') + self.assertTrue(rounded_comparison_csv(different_file, self.CorrelationFile)) + + +def suite(): + return unittest.TestLoader().loadTestsFromTestCase(TestRoundedCsvComparator) + + +def main(): + result = unittest.TextTestRunner(verbosity=2).run(suite()) + return 0 if result.wasSuccessful() else 1 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/tests/comparators/rounded_comparison_csv/wrong_correlation.csv b/tests/comparators/rounded_comparison_csv/wrong_correlation.csv new file mode 100644 index 0000000..c862984 --- /dev/null +++ b/tests/comparators/rounded_comparison_csv/wrong_correlation.csv @@ -0,0 +1,10 @@ +"spec","l1","r2","r3","r4" +"Br",0.538284659385682,0.347380578517914,0.984475374221802,0.858644068241119 +"Cc",0.972778141498566,0.821589231491089,0.667640388011932,0.982909619808197 +"Ft",0.711512565612793,0.79552161693573,0.820532739162445,0.348022520542145 +"Gp",0.916094779968262,0.286471843719482,0.93779468536377,0.787193953990936 +"Hc",0.64589512348175,0.552187442779541,0.625308692455292,0.823695063591003 +"Mp",0.997475743293762,-0.0424592085182667,0.997138321399689,0.989661455154419 +"Pu",0.68191522359848,0.419826716184616,0.923761785030365,0.409022688865662 +"Po",0.900495171546936,0.641049265861511,0.985500574111938,0.607609212398529 +"Rs",0.977232158184052,0,0.677042424678802,0.854979515075684 diff --git a/tests/comparators/run_all b/tests/comparators/run_all new file mode 100755 index 0000000..63ab1c2 --- /dev/null +++ b/tests/comparators/run_all @@ -0,0 +1,69 @@ +#!/usr/bin/env python + +from __future__ import print_function +from future.utils import iteritems as _iteritems + +import os +import sys +import time +import unittest +import xmlrunner +import importlib +import logging +import argparse + +# configure paths +TestComparatorFilename = "test_comparator" +TestDir = os.path.abspath(os.path.dirname(__file__)) +sys.path.insert(0, TestDir) + +# configure loggers +_logger = logging.getLogger("ComparatorTests") +logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(name)s] [%(levelname)+4.5s] %(message)s") + +from wft4galaxy.core import OutputFormat + +def _make_parser(): + parser = argparse.ArgumentParser(add_help=True) + parser.add_argument('--verbosity', help='Set verbosity level', choices=range(0, 3), default=2) + parser.add_argument('--output-format', choices=OutputFormat, help='Choose output type', default=OutputFormat.text) + parser.add_argument('--xunit-file', default=None, metavar="FILE_PATH", + help='Set the path of the xUnit report file (absolute or relative to the output folder)') + return parser + + +def suite(): + """ + Define the suite to be executed. + + :return: suite object + """ + test_folders = [td_name for td_name in os.listdir(TestDir) if os.path.isdir(os.path.join(TestDir, td_name))] + _logger.debug("Test folders: %s" % test_folders) + # prepare suite + suites = [] + for test_dir in test_folders: + module_name = "{}.{}".format(test_dir, TestComparatorFilename) + m = importlib.import_module(module_name) + _logger.debug("Found module: %s", module_name) + if hasattr(m, "suite"): + suites.append(getattr(m, "suite")()) + else: + _logger.warn("No suite found on module '%s'", module_name) + return suites + + +def main(): + # parse arguments + parser = _make_parser() + options = parser.parse_args(sys.argv[1:]) + output_filename = options.xunit_file or "test-comparators-{}.xml".format(time.strftime("%Y%m%d%H%M%S")) + output = open(os.devnull, "wb") if options.output_format == OutputFormat.text else open(output_filename, "wb") + # execute tests + runner = xmlrunner.XMLTestRunner(verbosity=options.verbosity, output=output) + _result = runner.run(unittest.TestSuite(suite())) + sys.exit(0 if _result.wasSuccessful() else -1) + + +if __name__ == '__main__': + main() diff --git a/tests/docker/run-all.sh b/tests/docker/run-all.sh new file mode 100755 index 0000000..96a6712 --- /dev/null +++ b/tests/docker/run-all.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + + +set -o nounset + +# with errexit, if any of the tests should result in a non-zero exit code +set -o errexit + +# absolute path of the current script +script_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# test minimal image +${script_path}/test-image.sh minimal "$@" + +# test develop image +${script_path}/test-image.sh develop "$@" diff --git a/tests/docker/test-image.sh b/tests/docker/test-image.sh new file mode 100755 index 0000000..ea4deea --- /dev/null +++ b/tests/docker/test-image.sh @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +set -o nounset +set -o errexit + +# absolute path of the current script +script_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# base path for Docker images +image_root_path="${script_path}/../../utils/docker" + +# print help +function print_usage(){ + ( echo "USAGE: $0 [--server URL] [--api-key API-KEY] [--network ADDRESS] " + echo " [-r|--image-registry REGISTRY] [-o|--image-owner OWNER] [-n|--image-name NAME] [-t|--image-tag TAG]" + echo " {minimal,develop}" + echo "" + echo "If no options related to the Docker image are provided, this script will try to get the" + echo "required image information from the local repository itself") >&2 +} + +# init argument variables +image_type='' +GALAXY_URL='' +GALAXY_API_KEY='' +GALAXY_NETWORK='' +repo_url='' +GIT_BRANCH='' +repo_branch='' + +# options +opts="$@" + +# disable debug +debug="" + +# parse args +while test $# -gt 0 +do + case "$1" in + -h|--help) + print_usage + exit 0 + ;; + --server ) + [ $# -ge 2 ] || { echo "Missing value for '$1'"; exit 1; } + GALAXY_URL="$2" + shift + ;; + --api-key) + [ $# -ge 2 ] || { echo "Missing value for '$1'"; exit 1; } + GALAXY_API_KEY="$2" + shift + ;; + --network ) + [ $# -ge 2 ] || { echo "Missing value for '$1'"; exit 1; } + GALAXY_NETWORK="$2" + shift + ;; + --url|--repo-url) + [ $# -ge 2 ] || { echo "Missing value for '$1'"; exit 1; } + repo_url="--url $2" + shift + ;; + --branch|--repo-branch) + [ $# -ge 2 ] || { echo "Missing value for '$1'"; exit 1; } + GIT_BRANCH=$2 + repo_branch="--branch $2" + shift + ;; + --debug ) + debug="--debug" + shift + ;; + --*) + print_usage + exit -1 + ;; + *) + # support only the first argument; skip all remaining + if [[ -z ${image_type} ]]; then + image_type=${1} + fi + ;; + esac + shift +done + +# check required options +settings=(image_type GALAXY_URL GALAXY_API_KEY) +for s in ${settings[@]}; do + if [[ -z ${!s} ]]; then + echo "No ${s} provided." >&2 + exit 99 + fi +done + +# check image type +if [[ -z ${image_type} ]]; then + image_type="minimal" + echo "No image type provided. Using the default : ${image_type}">&2 +elif [[ ${image_type} != "minimal" && ${image_type} != "develop" ]]; then + echo -e "\nERROR: '${image_type}' not supported! Use 'minimal' or 'develop'." + exit 99 +else + export IMAGE_TYPE="${image_type}" +fi + +# extract git info & Docker image name +source ${image_root_path}/set-git-repo-info.sh ${repo_url} ${repo_branch} +source ${image_root_path}/set-docker-image-info.sh + +# download wft4galaxy script +owner=${GIT_OWNER:-"phnmnl"} +branch=${GIT_BRANCH:-"develop"} +curl -s https://raw.githubusercontent.com/${owner}/wft4galaxy/${branch}/utils/docker/install.sh | bash /dev/stdin --repo "${owner}/wft4galaxy" --branch ${branch} . +echo "Downloaded 'wft4galaxy-docker' Github repository: ${owner}/wft4galaxy (branch: ${branch})" >&2 + +# switch the Docker image context +cd ${image_root_path} > /dev/null + +# build docker image +echo "${image_root_path}/${image_type}/build.sh ${opts}" >&2 +"${image_root_path}/${image_type}/build.sh" ${repo_branch} +cd - > /dev/null + +# set optional arguments +cmd_other_opts="--repository ${IMAGE_REPOSITORY} --skip-update ${debug}" +if [[ -n ${IMAGE_TAG} ]]; then + cmd_other_opts="${cmd_other_opts} --tag ${IMAGE_TAG}" +fi +if [[ -n ${GALAXY_NETWORK} ]]; then + cmd_other_opts="${cmd_other_opts} --network ${GALAXY_NETWORK}" +fi + +# uncomment for debug +#echo "Trying to contact Galaxy sever..." +#docker run --rm --network ${GALAXY_NETWORK} \ +# ubuntu bash -c "apt-get update && apt-get install -y iputils-ping && timeout 5 ping 172.18.0.22" + +# build cmd +base_cmd="./wft4galaxy-docker ${cmd_other_opts} --server ${GALAXY_URL} --api-key ${GALAXY_API_KEY}" +cmd="${base_cmd} -f examples/change_case/workflow-test.yml" +echo -e "CMD: ${cmd}\n">&2 + +# turn off command error checking +set +o errexit + +# run test +${cmd} +exit_code=$? + +# cleanup +rm -f wft4galaxy-docker + +if [ ${exit_code} -ne 0 ]; then + echo "Test failed (exit code: ${exit_code}" >&2 +fi + +exit ${exit_code} diff --git a/utils/docker/build-image.sh b/utils/docker/build-image.sh new file mode 100755 index 0000000..a216bcc --- /dev/null +++ b/utils/docker/build-image.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + + +function print_usage(){ + ( echo "USAGE: $0 [-o|--image-owner OWNER] [-n|--image-name NAME] [-t|--image-tag TAG] < minimal | develop >" + echo + echo "If no arguments are provided, this script will try to get the" + echo "required repository information from the local repository itself") >&2 +} + +# parse args +while test $# -gt 0 +do + case "$1" in + -h|--help) + print_usage + exit 0 + ;; + -r|--image-registry) + export IMAGE_REGISTRY=$2 + shift + ;; + -o|--image-owner) + export IMAGE_OWNER=$2 + shift + ;; + -n|--image-name) + export IMAGE_NAME=$2 + shift + ;; + -t|--image-tag) + export IMAGE_TAG=$2 + shift + ;; + --url|--repo-url) + repo_url="--url $2" + shift + ;; + --branch|--repo-branch) + repo_branch="--branch $2" + shift + ;; + --*) + print_usage + exit 99 + ;; + *) + # support only the first argument; skip all remaining + if [[ -z ${image_type} ]]; then + image_type=${1} + fi + ;; + esac + shift +done + +if [[ -z ${image_type} ]]; then + image_type="minimal" + echo "No image type provided. Using the default : ${image_type}">&2 +elif [[ ${image_type} != "minimal" && ${image_type} != "develop" ]]; then + echo -e "\nERROR: '${image_type}' not supported! Use 'minimal' or 'develop'." + exit 99 +else + export IMAGE_TYPE="${image_type}" +fi + +# absolute path of the current script +script_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# absolute path of the image folder +image_path="${script_path}/${image_type}" +# check whether the image type exists +if [[ ! -d ${image_path} ]]; then + echo -e "\nThe image type '${image_type}' doen't exist!!!" + exit 99 +fi + +# set git && image info +source ${script_path}/set-git-repo-info.sh ${repo_url} ${repo_branch} +source ${script_path}/set-docker-image-info.sh + +# Need to cd into this script's directory because image-config assumes it's running within it +cd "${image_path}" > /dev/null + +# build the Docker image +docker build --build-arg git_branch=${GIT_BRANCH} --build-arg git_url=${GIT_HTTPS} -t ${IMAGE} . + +# restore the original path +cd - > /dev/null diff --git a/utils/docker/create-galaxy-user.py b/utils/docker/create-galaxy-user.py new file mode 100755 index 0000000..c570c6d --- /dev/null +++ b/utils/docker/create-galaxy-user.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python +from __future__ import print_function + +import os as _os +import sys as _sys +import json as _json +import logging as _logging +import argparse as _argparse + +from bioblend import ConnectionError +from bioblend.galaxy import GalaxyInstance as _GalaxyInstance + +# create a module level logger +_logger = _logging.getLogger("UserManager") + + +class _CustomFormatter(_argparse.RawTextHelpFormatter): + """ Customize settings of the default RawTextHelpFormatter """ + + def __init__(self, prog, indent_increment=2, max_help_position=40, width=None): + super(_CustomFormatter, self).__init__(prog, indent_increment, max_help_position, width) + + +def _make_parser(): + parser = _argparse.ArgumentParser(add_help=True, formatter_class=_CustomFormatter, + description="Create a new Galaxy user programmatically.") + parser.add_argument('--server', help='Galaxy Server URL', default=_os.environ["GALAXY_URL"]) + parser.add_argument('--api-key', help='Galaxy Admin\'s API KEY', required=True) + parser.add_argument('--debug', help='Enable debug messages', action="store_true", default=False) + parser.add_argument('--file', default=None, help='Set a custom output files (default = ".info")') + parser.add_argument('username', help='User(name) to add') + parser.add_argument('password', help='User\'s password') + parser.add_argument('email', help='User\'s email ') + parser.add_argument('--with-api-key', action="store_true", + default=False, help='Create an API KEY for the new user') + return parser + + +class GalaxyException(ConnectionError): + def __init__(self, e): + super(GalaxyException, self).__init__(self.get_message(e.message, e.body), e.body, e.status_code) + + @staticmethod + def get_message(message, body): + if body: + return _json.loads(body)["err_msg"] + return message + + +class CreateUserException(GalaxyException): + pass + + +class CreateApiKeyException(GalaxyException): + pass + + +def create_user(galaxy_instance, username, password, user_email): + try: + user_info = galaxy_instance.users.create_local_user(username=username, password=password, user_email=user_email) + if user_info is None or "id" not in user_info: + raise RuntimeError("Possible issue when creating the user: no user ID ca be found!") + return user_info + except ConnectionError as e: + raise CreateUserException(e) + + +def create_api_key(galaxy_instance, user_id): + try: + return galaxy_instance.users.create_user_apikey(user_id) + except ConnectionError as e: + raise CreateApiKeyException(e) + + +def main(): + # configure logger + _logging.basicConfig(level=_logging.ERROR, format="%(asctime)s [%(name)s] [%(levelname)+4.5s] %(message)s") + + # parse args + parser = _make_parser() + options = parser.parse_args(_sys.argv[1:]) + + # update log level + if options.debug: + _logging.basicConfig(level=_logging.DEBUG) + _logger.debug("Configuration: %s", options) + + # galaxy instance configuration + gi = _GalaxyInstance(url=options.server, key=options.api_key) + + # user + user_info = create_user(gi, options.username, options.password, options.email) + + _logger.info("User created: %s" % user_info) + + # add API KEY if required + if options.with_api_key: + api_key = create_api_key(galaxy_instance=gi, user_id=user_info["id"]) + user_info["api-key"] = api_key + _logger.info("Created API KEY: %s", api_key) + + filename = options.file + if filename is None: + filename = user_info["username"] + ".info" + with open(filename, "w") as out: + _json.dump(user_info, out, indent=4) + filename = user_info["username"] + ".id" + with open(filename, "w") as out: + out.write(user_info["api-key"]) + + # write to stdout the "api-key" + print(user_info["api-key"]) + +if __name__ == "__main__": + try: + main() + except StandardError as e: + _logger.error(e) + if _logger.isEnabledFor(_logging.DEBUG): + _logger.exception(e) + _sys.exit(99) diff --git a/utils/docker/develop/Dockerfile b/utils/docker/develop/Dockerfile new file mode 100644 index 0000000..395b635 --- /dev/null +++ b/utils/docker/develop/Dockerfile @@ -0,0 +1,66 @@ +FROM alpine:3.6 + +# metadata +MAINTAINER PhenoMeNal-H2020 Project ( phenomenal-h2020-users@googlegroups.com ) + +# allow user defined Git repository +ARG git_url +ARG git_branch + +# set the term var +ENV TERM xterm-256color + +# wft4galaxy path +ENV WFT4GALAXY_PATH /opt/wft4galaxy + +# set Git repository url +ENV WFT4GALAXY_REPOSITORY_URL ${git_url:-"https://github.com/phnmnl/wft4galaxy"} + +# wft4galaxy branch +ENV WFT4GALAXY_BRANCH ${git_branch:-develop} + +# install base packages +RUN echo "Installing dependencies" >&2 \ + && apk update && apk add \ + bash \ + build-base \ + gcc \ + git \ + iputils \ + make \ + nano \ + py-lxml \ + py-pip \ + py-setuptools \ + python \ + python-dev \ + vim \ + && pip install --upgrade pip \ + && pip install ipython jupyter bash_kernel \ + && echo "Cloning wft4galaxy: branch=${WFT4GALAXY_BRANCH} url=${WFT4GALAXY_REPOSITORY_URL}" >&2 \ + && git clone -b ${WFT4GALAXY_BRANCH} ${WFT4GALAXY_REPOSITORY_URL} ${WFT4GALAXY_PATH} \ + && cd ${WFT4GALAXY_PATH} \ + && pip install -r requirements.txt \ + && python -m bash_kernel.install \ + && echo "Building and installing wft4galaxy" >&2 \ + && python setup.py install \ + && rm -rf /var/cache/apk/* + +# setup bash custom prompt (PS1) +ADD bashrc /root/.bashrc + +# build a tutorial folder within the user's home +RUN mkdir ${HOME}/tutorial && \ + ln -s ${WFT4GALAXY_PATH}/examples ${HOME}/tutorial/examples && \ + ln -s ${WFT4GALAXY_PATH}/docs/notebooks ${HOME}/tutorial/notebooks && \ + ln -s ${WFT4GALAXY_PATH}/docs/images ${HOME}/tutorial/images + +# update the working dir +WORKDIR /root + +# add container entrypoint +COPY entrypoint.sh /bin/entrypoint.sh +COPY entrypoint-argparser.sh /usr/local/bin/entrypoint-argparser.sh + +# set the entrypoint +ENTRYPOINT ["entrypoint.sh"] diff --git a/utils/docker/develop/bashrc b/utils/docker/develop/bashrc new file mode 100644 index 0000000..4e5bcf2 --- /dev/null +++ b/utils/docker/develop/bashrc @@ -0,0 +1,7 @@ +parse_git_branch() { + git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' +} + +export PS1="\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\[\e[1;31m\]$(parse_git_branch)\[\e[0m\]$ " +export CLICOLOR=1 +export LSCOLORS=ExFxBxDxCxegedabagacad \ No newline at end of file diff --git a/utils/docker/develop/build-local.sh b/utils/docker/develop/build-local.sh new file mode 100755 index 0000000..28a66d6 --- /dev/null +++ b/utils/docker/develop/build-local.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +# Use this script to build an image with the version of wft4galaxy that's in the +# current project. This is useful for development. +# + +set -o errexit +set -o nounset + +function log() { + echo $@ >&2 +} + +function usage() { + log "$(basename $0) [ IMAGE_NAME ]" +} + +# work_dir: temporary work directory that will be deleted when the script exits +work_dir= + +function cleanup() { + if [ -n "${work_dir}" ]; then + log "Cleaning up ${work_dir}" + rm -rf "${work_dir}" + fi +} + +if [ $# -ne 1 ]; then + usage + exit 1 +fi + +image_name="${1}" + +# absolute path of the current script +script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +proj_dir="${script_dir}/../../../" + +# On exit, for whatever reason, try to clean up +trap "cleanup" EXIT INT ERR + +work_dir="$(mktemp -d)" + +log "copying project dir to work directory ${work_dir}" +if [ $(ls "${proj_dir}" | grep 'wft4galaxy\|setup.py' | wc -l) -lt 2 ] ; then + log "There seems to be a problem with the project directory ${proj_dir}" + log "We're not seeing the expected wft4galaxy directory and the setup.py" + log "file. Is something wrong?" + exit 1 +fi + +cp -a ${proj_dir}/* "${work_dir}" +cp ${script_dir}/bashrc "${work_dir}" +cp ${script_dir}/*.sh "${work_dir}" + +sed_script="${work_dir}/Dockerfile.sed" +# subtle thing: when ADDing multiple things to a directory, the directory's +# path must end with a slash +cat < "${sed_script}" +/git *clone .*\${WFT4GALAXY/d +/echo "Cloning wft4galaxy:/d +/^RUN *echo *"Installing dependencies"/i\\ +ADD . "\${WFT4GALAXY_PATH}\/" +END + +sed -f "${sed_script}" "${proj_dir}/utils/docker/minimal/Dockerfile" > "${work_dir}/Dockerfile" + +log "New Dockerfile" +cat "${work_dir}/Dockerfile" + +cd "${work_dir}" +docker build -t ${image_name} . + +exit 0 diff --git a/utils/docker/develop/build.sh b/utils/docker/develop/build.sh new file mode 100755 index 0000000..f377228 --- /dev/null +++ b/utils/docker/develop/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +# absolute path of the current script +script_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# call the build script +${script_path}/../build-image.sh -n "wft4galaxy-develop" "develop" "$@" \ No newline at end of file diff --git a/utils/docker/develop/entrypoint-argparser.sh b/utils/docker/develop/entrypoint-argparser.sh new file mode 100755 index 0000000..14b145e --- /dev/null +++ b/utils/docker/develop/entrypoint-argparser.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# parse arguments +while [ -n "$1" ]; do + # Copy so we can modify it (can't modify $1) + OPT="$1" + # Detect argument termination + if [ x"$OPT" = x"--" ]; then + shift + for OPT ; do + OTHER_OPTS="$OTHER_OPTS \"$OPT\"" + done + break + fi + # Parse current opt + while [ x"$OPT" != x"-" ] ; do + case "$OPT" in + bash | ipython | jupyter | wft4galaxy | runtest | wizard ) + ENTRYPOINT="$1" + ;; + --server=* ) + GALAXY_SERVER="${OPT#*=}" + shift + ;; + --server ) + GALAXY_SERVER="$2" + shift + ;; + --api-key=* ) + GALAXY_API_KEY="${OPT#*=}" + shift + ;; + --api-key ) + GALAXY_API_KEY="$2" + shift + ;; + * ) + OTHER_OPTS="$OTHER_OPTS $OPT" + break + ;; + esac + # Check for multiple short options + # NOTICE: be sure to update this pattern to match valid options + NEXTOPT="${OPT#-[cfr]}" # try removing single short opt + if [ x"$OPT" != x"$NEXTOPT" ] ; then + OPT="-$NEXTOPT" # multiple short opts, keep going + else + break # long form, exit inner loop + fi + done + # move to the next param + shift +done + +# set BIOBLEND +export GALAXY_URL=${GALAXY_SERVER} +export GALAXY_API_KEY=${GALAXY_API_KEY} + +# export wft4galaxy arguments +export ENTRYPOINT +export ENTRYPOINT_ARGS=${OTHER_OPTS} \ No newline at end of file diff --git a/utils/docker/develop/entrypoint.sh b/utils/docker/develop/entrypoint.sh new file mode 100755 index 0000000..8bcaf37 --- /dev/null +++ b/utils/docker/develop/entrypoint.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +source entrypoint-argparser.sh "$@" + +if [[ ! ${ENTRYPOINT} =~ ^(bash|ipython|jupyter|wft4galaxy|runtest|wizard)$ ]]; then + echo -e "\nERROR: Command \"${ENTRYPOINT_ARGS} \" not supported !" + echo -e " Supported commands: bash | ipython| jupyter | wft4galaxy | runtest | wizard \n" + exit 99 +fi + +if [[ ${ENTRYPOINT} == "wft4galaxy" ]] || [[ ${ENTRYPOINT} == "runtest" ]]; then + wft4galaxy ${ENTRYPOINT_ARGS} +elif [[ ${ENTRYPOINT} == "wizard" ]]; then + wft4galaxy-wizard ${ENTRYPOINT_ARGS} +elif [[ ${ENTRYPOINT} == "ipython" ]]; then + ipython ${ENTRYPOINT_ARGS} +elif [[ ${ENTRYPOINT} == "jupyter" ]]; then + ipython notebook --ip=$(hostname) --no-browser --allow-root ${ENTRYPOINT_ARGS} +else + /bin/bash ${ENTRYPOINT_ARGS} +fi \ No newline at end of file diff --git a/utils/docker/develop/hooks/build b/utils/docker/develop/hooks/build new file mode 100755 index 0000000..8417ac4 --- /dev/null +++ b/utils/docker/develop/hooks/build @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +# absolute path of the current script +script_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# call the build script +${script_path}/../build.sh -t ${DOCKER_TAG} \ No newline at end of file diff --git a/utils/docker/install.sh b/utils/docker/install.sh new file mode 100755 index 0000000..130bb16 --- /dev/null +++ b/utils/docker/install.sh @@ -0,0 +1,125 @@ +#!/bin/bash + +set -o errexit +set -o nounset + +# set default repo owner +DEFAULT_REPO="phnmnl/wft4galaxy" + +# set default repo owner +DEFAULT_REPO_BRANCH="master" + +# set default target folder +DEFAULT_TARGET_FOLDER="/usr/local/bin" + +# empty temporary folder +TEMP_DIR="" + +# print usage +function print_usage(){ + echo -e "\nUSAGE: ${0} [--repo ] [--branch ] [TARGET_FOLDER]" + echo -e "\n\t Options:" + echo -e "\t - REPOSITORY: the name of the GitHub repository (default: \"${DEFAULT_REPO}\")" + echo -e "\t - REPOSITORY_BRANCH: the branch name of the GitHub repository (default: \"${DEFAULT_REPO_BRANCH}\")" + echo -e "\t - TARGET_FOLDER: the path where to store the wft4galaxy-docker script (default: \"${DEFAULT_TARGET_FOLDER}\")" +} + +# delete temporary files +function cleanup() { + if [[ -n "${TEMP_DIR}" && -d "${TEMP_DIR}" ]]; then + rm -rf "${TEMP_DIR}" + fi +} + +# set default values +REPO=${DEFAULT_REPO} +REPO_BRANCH=${DEFAULT_REPO_BRANCH} +TARGET_FOLDER=${DEFAULT_TARGET_FOLDER} + +# parse arguments +OTHER_OPTS='' +while [ $# -gt 0 ]; do + # Copy so we can modify it (can't modify $1) + OPT="$1" + # Detect argument termination + if [ x"$OPT" = x"--" ]; then + shift + for OPT ; do + OTHER_OPTS="$OTHER_OPTS \"$OPT\"" + done + break + fi + # Parse current opt + while [ x"$OPT" != x"-" ] ; do + case "$OPT" in + --repo=* ) + REPO="${OPT#*=}" + shift + ;; + --repo ) + REPO="$2" + shift + ;; + --branch=* ) + REPO_BRANCH="${OPT#*=}" + shift + ;; + --branch ) + REPO_BRANCH="$2" + shift + ;; + * ) + OTHER_OPTS="$OTHER_OPTS $OPT" + break + ;; + esac + # Check for multiple short options + # NOTICE: be sure to update this pattern to match valid options + NEXTOPT="${OPT#-[cfr]}" # try removing single short opt + if [ x"$OPT" != x"$NEXTOPT" ] ; then + OPT="-$NEXTOPT" # multiple short opts, keep going + else + break # long form, exit inner loop + fi + done + # move to the next param + shift +done + +# update target folder if provided +ARGS=(${OTHER_OPTS}) +if [[ ${#ARGS[@]} -eq 1 ]]; then + TARGET_FOLDER=${ARGS[0]} +elif [[ ${#ARGS[@]} -gt 1 ]]; then + echo -e "\nERROR: invalid syntax !!" + print_usage + exit 99 +fi + +# On exit, for whatever reason, try to clean up +trap "cleanup" EXIT INT ERR + +# set source script +SOURCE_SCRIPT="https://raw.githubusercontent.com/${REPO}/${REPO_BRANCH}/wft4galaxy/app/docker_runner.py" + +# download script +TEMP_DIR=$(mktemp -d) +TEMP_SCRIPT="${TEMP_DIR}/wft4galaxy-docker" +STATUS_CODE=$(curl --silent --output ${TEMP_SCRIPT} --write-out "%{http_code}" ${SOURCE_SCRIPT}) +if [[ ${STATUS_CODE} -ne 200 ]]; then + echo -e "\nERROR: Script ${SOURCE_SCRIPT} not found!" + echo -e " Check if you are using the proper REPOSITORY and BRANCH." + print_usage + exit 99 +else + chmod +x ${TEMP_SCRIPT} + if [[ -w ${TARGET_FOLDER} ]]; then + mv ${TEMP_SCRIPT} ${TARGET_FOLDER}/ + else + echo -e "\nTo install 'wft4galaxy-docker' within the '${TARGET_FOLDER}' you need root permissions" + sudo mv ${TEMP_SCRIPT} ${TARGET_FOLDER}/ + fi + exit 0; +fi + + diff --git a/utils/docker/minimal/Dockerfile b/utils/docker/minimal/Dockerfile new file mode 100644 index 0000000..43c2a82 --- /dev/null +++ b/utils/docker/minimal/Dockerfile @@ -0,0 +1,64 @@ +FROM alpine:3.6 + +# metadata +MAINTAINER PhenoMeNal-H2020 Project ( phenomenal-h2020-users@googlegroups.com ) + +# allow user defined Git repository +ARG git_url +ARG git_branch + +# set the term var +ENV TERM xterm-256color + +# wft4galaxy path +ENV WFT4GALAXY_PATH /opt/wft4galaxy + +# set Git repository url +ENV WFT4GALAXY_REPOSITORY_URL ${git_url:-"https://github.com/phnmnl/wft4galaxy"} + +# wft4galaxy branch +ENV WFT4GALAXY_BRANCH ${git_branch:-develop} + +# install base packages +RUN echo "Installing dependencies" >&2 \ + && apk update && apk add \ + build-base \ + gcc \ + make \ + git \ + py-pip \ + bash \ + python \ + py-setuptools \ + python-dev \ + py-lxml \ + && pip install --upgrade pip \ + && echo "Cloning wft4galaxy: branch=${WFT4GALAXY_BRANCH} url=${WFT4GALAXY_REPOSITORY_URL}" >&2 \ + && git clone --single-branch --depth 1 -b ${WFT4GALAXY_BRANCH} ${WFT4GALAXY_REPOSITORY_URL} ${WFT4GALAXY_PATH} \ + && cd ${WFT4GALAXY_PATH} \ + && pip install -r requirements.txt \ + && echo "Building and installing wft4galaxy" >&2 \ + && python setup.py install \ + && echo "Removing build-time dependencies" >&2 \ + && apk del \ + build-base \ + gcc \ + make \ + git \ + py-pip \ + python-dev \ + && rm -rf ${WFT4GALAXY_PATH} \ + && rm -rf /var/cache/apk/* + +# setup bash custom prompt (PS1) +ADD bashrc /root/.bashrc + +# update the working dir +WORKDIR /root + +# add container entrypoint +COPY entrypoint.sh /bin/entrypoint.sh +COPY entrypoint-argparser.sh /usr/local/bin/entrypoint-argparser.sh + +# set the entrypoint +ENTRYPOINT ["entrypoint.sh"] diff --git a/utils/docker/minimal/bashrc b/utils/docker/minimal/bashrc new file mode 100644 index 0000000..4e5bcf2 --- /dev/null +++ b/utils/docker/minimal/bashrc @@ -0,0 +1,7 @@ +parse_git_branch() { + git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' +} + +export PS1="\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\[\e[1;31m\]$(parse_git_branch)\[\e[0m\]$ " +export CLICOLOR=1 +export LSCOLORS=ExFxBxDxCxegedabagacad \ No newline at end of file diff --git a/utils/docker/minimal/build.sh b/utils/docker/minimal/build.sh new file mode 100755 index 0000000..909e4d8 --- /dev/null +++ b/utils/docker/minimal/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +# absolute path of the current script +script_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# call the build script +${script_path}/../build-image.sh -n "wft4galaxy" "minimal" "$@" \ No newline at end of file diff --git a/utils/docker/minimal/entrypoint-argparser.sh b/utils/docker/minimal/entrypoint-argparser.sh new file mode 100755 index 0000000..14b145e --- /dev/null +++ b/utils/docker/minimal/entrypoint-argparser.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +# parse arguments +while [ -n "$1" ]; do + # Copy so we can modify it (can't modify $1) + OPT="$1" + # Detect argument termination + if [ x"$OPT" = x"--" ]; then + shift + for OPT ; do + OTHER_OPTS="$OTHER_OPTS \"$OPT\"" + done + break + fi + # Parse current opt + while [ x"$OPT" != x"-" ] ; do + case "$OPT" in + bash | ipython | jupyter | wft4galaxy | runtest | wizard ) + ENTRYPOINT="$1" + ;; + --server=* ) + GALAXY_SERVER="${OPT#*=}" + shift + ;; + --server ) + GALAXY_SERVER="$2" + shift + ;; + --api-key=* ) + GALAXY_API_KEY="${OPT#*=}" + shift + ;; + --api-key ) + GALAXY_API_KEY="$2" + shift + ;; + * ) + OTHER_OPTS="$OTHER_OPTS $OPT" + break + ;; + esac + # Check for multiple short options + # NOTICE: be sure to update this pattern to match valid options + NEXTOPT="${OPT#-[cfr]}" # try removing single short opt + if [ x"$OPT" != x"$NEXTOPT" ] ; then + OPT="-$NEXTOPT" # multiple short opts, keep going + else + break # long form, exit inner loop + fi + done + # move to the next param + shift +done + +# set BIOBLEND +export GALAXY_URL=${GALAXY_SERVER} +export GALAXY_API_KEY=${GALAXY_API_KEY} + +# export wft4galaxy arguments +export ENTRYPOINT +export ENTRYPOINT_ARGS=${OTHER_OPTS} \ No newline at end of file diff --git a/utils/docker/minimal/entrypoint.sh b/utils/docker/minimal/entrypoint.sh new file mode 100755 index 0000000..1d0b136 --- /dev/null +++ b/utils/docker/minimal/entrypoint.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +source entrypoint-argparser.sh "$@" + +if [[ ! ${ENTRYPOINT} =~ ^(bash|wft4galaxy|runtest|wizard)$ ]]; then + echo -e "\nERROR: Command \"${ENTRYPOINT_ARGS} \" not supported !" + echo -e " Supported commands: bash | wft4galaxy | runtest | wizard \n" + exit 99 +fi + +if [[ ${ENTRYPOINT} == "bash" ]]; then + /bin/bash ${ENTRYPOINT_ARGS} +elif [[ ${ENTRYPOINT} == "wizard" ]]; then + wft4galaxy-wizard ${ENTRYPOINT_ARGS} +else + wft4galaxy ${ENTRYPOINT_ARGS} +fi diff --git a/utils/docker/minimal/hooks/build b/utils/docker/minimal/hooks/build new file mode 100755 index 0000000..8417ac4 --- /dev/null +++ b/utils/docker/minimal/hooks/build @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +# absolute path of the current script +script_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# call the build script +${script_path}/../build.sh -t ${DOCKER_TAG} \ No newline at end of file diff --git a/utils/docker/set-docker-image-info.sh b/utils/docker/set-docker-image-info.sh new file mode 100755 index 0000000..8d2ea01 --- /dev/null +++ b/utils/docker/set-docker-image-info.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash + +# Define all the variables that this script can set +# (if they don't already exist) +export IMAGE="${IMAGE:-}" +export IMAGE_NAME="${IMAGE_NAME:-}" +export IMAGE_OWNER="${IMAGE_OWNER:-}" +export IMAGE_REGISTRY="${IMAGE_REGISTRY:-}" +export IMAGE_REPOSITORY="${IMAGE_REPOSITORY:-}" +export IMAGE_TAG="${IMAGE_TAG:-}" +export IMAGE_TYPE="${IMAGE_TYPE:-}" + +# configure image suffix +image_suffix="" +if [[ ${IMAGE_TYPE} == "develop" ]]; then + image_suffix="-${IMAGE_TYPE}" +fi + +# parse existing IMAGE or IMAGE_REPOSITORY env variable +pattern="((([[:alnum:]]*)\/)|((([[:alnum:]]*)\/)(([[:alnum:]]*)\/)))?([[:alnum:]]*)(\:([[:alnum:]]*))?$" +if [[ -n ${IMAGE} && ${IMAGE} =~ ${pattern} || -n ${IMAGE_REPOSITORY} && ${IMAGE_REPOSITORY} =~ ${pattern} ]]; then + + # log + if [[ -n ${IMAGE} ]]; then + echo "Using IMAGE=${IMAGE} to generate image info...">&2 + elif [[ -n ${IMAGE_REPOSITORY} ]]; then + echo "Using IMAGE_REPOSITORY=${IMAGE_REPOSITORY} to generate image info...">&2 + fi + + # set minimal image info + IMAGE_NAME="${BASH_REMATCH[9]}" + IMAGE_TAG="${BASH_REMATCH[11]}" # it can be empty, but we fix it below + + # form with owner and image name + if [[ -n ${BASH_REMATCH[2]} ]]; then + IMAGE_OWNER="${BASH_REMATCH[3]}" + IMAGE_REPOSITORY="${IMAGE_OWNER}/${IMAGE_NAME}" + + # extend form with registry and owner + elif [[ -n ${BASH_REMATCH[4]} ]]; then + IMAGE_REGISTRY="${BASH_REMATCH[6]}" + IMAGE_OWNER="${BASH_REMATCH[8]}" + IMAGE_REPOSITORY="${IMAGE_REGISTRY}/${IMAGE_OWNER}/${IMAGE_NAME}" + fi + +else # neither IMAGE nor IMAGE_REPOSITORY are setted + # set image owner + if [[ -z "${IMAGE_OWNER}" ]]; then + # map the git phnmnl repository to the Crs4 DockerHub repository + if [[ ${GIT_OWNER} == "phnmnl" ]]; then + IMAGE_OWNER="crs4" + else + IMAGE_OWNER="${GIT_OWNER}" + fi + fi + + # set IMAGE_NAME if not defined + if [[ -z "${IMAGE_NAME}" ]]; then + IMAGE_NAME="wft4galaxy" + + # append image suffix + IMAGE_NAME="${IMAGE_NAME}${image_suffix}" + fi + + + # if image tag isn't set, trying getting it from git + if [[ -z "${IMAGE_TAG}" ]]; then + if [[ -n ${GIT_BRANCH} || -n ${GIT_TAG} ]]; then + IMAGE_TAG="${GIT_BRANCH}" + if [[ -n ${GIT_TAG} ]]; then + IMAGE_TAG="${GIT_TAG}" # preference to git tag name over branch + fi + fi + fi + + # set image repository + if [[ -z "${IMAGE_REPOSITORY}" ]]; then + if [[ -n "${IMAGE_OWNER}" ]]; then + IMAGE_REPOSITORY="${IMAGE_OWNER}/${IMAGE_NAME}" + else + IMAGE_REPOSITORY="${IMAGE_NAME}" + fi + fi +fi + +# replace not valid forward and backward slashes with dashes +IMAGE_TAG="${IMAGE_TAG//[\/\\]/-}" + +# set image tag if not specified or detected +if [[ -z "${IMAGE_TAG}" ]]; then + IMAGE_TAG="latest" +fi + +# set image if not specified or detected +if [[ -z "${IMAGE}" ]]; then + image="" + if [[ -n ${IMAGE_REGISTRY} ]]; then + image="${IMAGE_REGISTRY}/" + fi + if [[ -n ${IMAGE_OWNER} ]]; then + image="${image}${IMAGE_OWNER}/" + fi + image="${image}${IMAGE_NAME}" + if [[ -n ${IMAGE_TAG} ]]; then + image="${image}:${IMAGE_TAG}" + fi + IMAGE="${image}" +fi + +# log Docker image info +echo " - Docker image: ${IMAGE}" >&2 +echo " - Docker image owner: ${IMAGE_OWNER}" >&2 +echo " - Docker image name: ${IMAGE_NAME}" >&2 +echo " - Docker image tag: ${IMAGE_TAG}" >&2 +echo " - Docker image registry: ${IMAGE_REGISTRY}" >&2 +echo " - Docker image repository: ${IMAGE_REPOSITORY}" >&2 + diff --git a/utils/docker/set-git-repo-info.sh b/utils/docker/set-git-repo-info.sh new file mode 100755 index 0000000..2b0a8f9 --- /dev/null +++ b/utils/docker/set-git-repo-info.sh @@ -0,0 +1,141 @@ +#!/usr/bin/env bash + +function print_usage(){ + ( echo "USAGE: $0 [--url URL] [--owner OWNER] [--branch BRANCH] [--tag TAG]" + echo + echo "If no arguments are provided, this script will try to get the" + echo "required repository information from the local repository itself") >&2 +} + +# Initialize argument variables +git_repo_name='' +git_branch='' +git_owner='' +git_tag='' +git_url='' +OTHER_OPTS='' + +# parse arguments +while [ $# -gt 0 ]; do + OPT="$1" + # Detect argument termination + if [ x"$OPT" = x"--" ]; then + shift + for OPT ; do + OTHER_OPTS="$OTHER_OPTS \"$OPT\"" + done + break + fi + # Parse current opt + case "$OPT" in + -h ) + print_usage + exit 0 + ;; + --repo-name=* ) + git_repo_name="${OPT#*=}" + ;; + --repo-name ) + [ $# -ge 2 ] || { echo "Missing value for '$1'"; exit 1; } + git_repo_name="$2" + shift + ;; + --url=* ) + git_url="${OPT#*=}" + ;; + --url ) + [ $# -ge 2 ] || { echo "Missing value for '$1'"; exit 1; } + git_url="$2" + shift + ;; + --owner=* ) + git_owner="${OPT#*=}" + ;; + --owner ) + [ $# -ge 2 ] || { echo "Missing value for '$1'"; exit 1; } + git_owner="$2" + shift + ;; + --branch=* ) + git_branch="${OPT#*=}" + ;; + --branch ) + [ $# -ge 2 ] || { echo "Missing value for '$1'"; exit 1; } + git_branch="$2" + shift + ;; + --tag=* ) + git_tag="${OPT#*=}" + ;; + --tag ) + [ $# -ge 2 ] || { echo "Missing value for '$1'"; exit 1; } + git_tag="$2" + shift + ;; + * ) + OTHER_OPTS="$OTHER_OPTS $OPT" + break + ;; + esac + # move to the next param + shift +done + +if [[ -d .git || -d $(git rev-parse --git-dir 2> /dev/null) ]]; then + # last commit + last_commit=$(git log --format="%H" -n 1) + + # repository URL + if [ -z "${git_url}" ]; then + echo "Getting git repository URL from local repository" >&2 + first_remote=$(git remote | head -n 1) + echo "Using git remote '${first_remote}'" >&2 + git_url=$(git config --get remote.${first_remote}.url) + fi + + # branch + if [ -z "${git_branch}" ] ; then + echo "Git branch not specified. Using local repository's current branch" >&2 + git_branch=$(git rev-parse --abbrev-ref HEAD) + git_branch=$(git branch | grep \* | cut -d ' ' -f2) + fi + + # owner + if [ -z "${git_owner}" ]; then + git_owner=$(echo ${git_url} | sed -E "s/.*[:\/](.*)\/(.*)(\.git)/\1/") + fi + + # repo name + if [ -z "${git_repo_name}" ]; then + git_repo_name=$(echo ${git_url} | sed -E "s/.*[:\/](.*)\/(.*)(\.git)/\2/") + fi + + # tag + if [ -z "${git_tag}" ]; then + git_tag=$(git name-rev --tags --name-only $(git rev-parse HEAD)) + if [[ ${git_tag} == "undefined" ]]; then git_tag=""; fi; + fi + + # export settings + export GIT_LAST_COMMIT=${last_commit} + export GIT_URL=${git_url} + export GIT_BRANCH=${git_branch} + export GIT_OWNER=${git_owner} + export GIT_REPO_NAME=${git_repo_name} + export GIT_TAG=${git_tag} + export GIT_SSH="git@github.com:${git_owner}/${git_repo_name}.git" + export GIT_HTTPS="https://github.com/${git_owner}/${git_repo_name}.git" + + # log git/docker info + echo " - Git Repository URL: ${git_url}" >&2 + echo " - Git owner: ${git_owner}" >&2 + echo " - Git repo name: ${git_repo_name}" >&2 + echo " - Git branch: ${git_branch}" >&2 + echo " - Git tag : ${git_tag}" >&2 + echo " - Git last commit: ${last_commit}" >&2 + echo " - Git repo URL: ${git_url}" >&2 + echo " - Git repo URL (ssh): ${GIT_SSH}" >&2 + echo " - Git repo URL (https): ${GIT_HTTPS}" >&2 +else + echo "WARNING: this is not a Git repository" >&2 +fi diff --git a/utils/docker/start-galaxy.sh b/utils/docker/start-galaxy.sh new file mode 100755 index 0000000..d24a62c --- /dev/null +++ b/utils/docker/start-galaxy.sh @@ -0,0 +1,183 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset + +# Docker settings +docker_image="bgruening/galaxy-stable" +docker_host="localhost" +network="" +ip="" +master_api_key="" +port=80 +container_name="galaxy-server" +debug="false" +max_wait_time=$((5*60)) # seconds + + +function print_usage(){ + (echo -e "\n USAGE: start-galaxy.sh [--docker-host ] [--container-name ] [--master-api-key ]" + echo -e " [--network ] [--ip ] [--port ]" + echo -e " [-h|--help]\n ") >&2 +} + +function usage_error() { + print_usage + exit 1 +} + +function get_opt_value() { + if [ $# -le 1 ]; then + echo "Missing value for option ${1}" >&2 + usage_error # never returns + fi + + local value="${2}" + if [[ "${value}" == --* ]]; then # need [[ for wildcard matching + echo "Missing value for option ${1} (found other option '${value}')" >&2 + usage_error # never returns + fi + + echo ${value} + return 0 +} + +######### main ########## + +OTHER_OPTS='' +while [ $# -gt 0 ]; do + OPT="$1" + # Detect argument termination + if [ x"$OPT" == x"--" ]; then + shift + for OPT ; do + OTHER_OPTS="$OTHER_OPTS \"$OPT\"" + done + break + fi + # Parse current opt + case "$OPT" in + --docker-host=* ) + docker_host="${OPT#*=}" + ;; + --docker-host ) + docker_host="$(get_opt_value "${@}")" + shift + ;; + --network=* ) + network="${OPT#*=}" + ;; + --network ) + network="$(get_opt_value "${@}")" + shift + ;; + --ip=* ) + ip="${OPT#*=}" + ;; + --ip ) + ip="$(get_opt_value "${@}")" + shift + ;; + --port=* ) + port="${OPT#*=}" + ;; + --port ) + port="$(get_opt_value "${@}")" + shift + ;; + --master-api-key=* ) + master_api_key="${OPT#*=}" + ;; + --master-api-key ) + master_api_key="$(get_opt_value "${@}")" + shift + ;; + --container-name=* ) + container_name="${OPT#*=}" + ;; + --container-name ) + container_name="$(get_opt_value "${@}")" + shift + ;; + --debug ) + debug="true" + ;; + -h|--help ) + print_usage + exit 0 + ;; + *) + OTHER_OPTS="$OTHER_OPTS $OPT" + break + ;; + esac + + # move to the next param + shift +done + + +# Docker options +docker_options="" +if [[ -n ${master_api_key} ]]; then + docker_options="${docker_options} -e GALAXY_CONFIG_MASTER_API_KEY=${master_api_key}" +fi + +if [[ -n ${network} ]]; then + docker_options="${docker_options} --network ${network}" +fi + +if [[ -n ${ip} ]]; then + docker_options="${docker_options} --ip ${ip}" +fi + +if [[ -n ${container_name} ]]; then + docker_options="${docker_options} --name ${container_name}" +fi + + +# set the Galaxy URL +galaxy_exposed="${docker_host}:${port}" +#export GALAXY_URL=${GALAXY_URL//[[:blank:]]/} + +# Build Docker command +docker_cmd="docker run -d ${docker_options} -p ${galaxy_exposed}:80 ${docker_image}" + +if [[ ${debug} == "true" ]]; then + echo "docker_image= ${docker_image}" + echo "docker_host= ${docker_host}" + echo "network= ${network}" + echo "ip= ${ip}" + echo "master_api_key= ${master_api_key}" + echo "port= ${port}" + echo "container_name= ${container_name}" + echo "debug= ${debug}" + echo "max_wait_time= ${max_wait_time}" + echo -e "\nDocker Command: ${docker_cmd}" +fi + +# start Dockerized Galaxy +# If this fails the script should exit with non-zero because of errexit +${docker_cmd} + +# wait for Galaxy +wait_time=0 +sleep_time=5 +printf "\nWaiting for Galaxy @ ${GALAXY_URL} ..." +until $(curl --output /dev/null --silent --head --fail ${GALAXY_URL}); do + printf '.' + sleep ${sleep_time} + wait_time=$((${wait_time} + ${sleep_time})) + if [ ${wait_time} -ge ${max_wait_time} ]; then + (printf "There seems to be a problem starting Galaxy.\n" + printf "We've waitedf or %d seconds so far and it's still not answering\n" + printf "Giving up\n" ) >&2 + exit 2 + fi +done +printf ' Started\n' + +# Galaxy info +printf "\nGalaxy server running @ ${GALAXY_URL}\n" + +exit 0 diff --git a/wft4galaxy/__init__.py b/wft4galaxy/__init__.py new file mode 100644 index 0000000..a71a16c --- /dev/null +++ b/wft4galaxy/__init__.py @@ -0,0 +1,4 @@ +from wft4galaxy import app +from wft4galaxy import core +from wft4galaxy import common +from wft4galaxy import wrapper diff --git a/wft4galaxy/app/__init__.py b/wft4galaxy/app/__init__.py new file mode 100644 index 0000000..6f7ef02 --- /dev/null +++ b/wft4galaxy/app/__init__.py @@ -0,0 +1,3 @@ +from . import runner +from . import wizard +from . import docker_runner diff --git a/wft4galaxy/app/docker_runner.py b/wft4galaxy/app/docker_runner.py new file mode 100755 index 0000000..a568406 --- /dev/null +++ b/wft4galaxy/app/docker_runner.py @@ -0,0 +1,538 @@ +#!/usr/bin/env python +from __future__ import print_function + +import re as _re +import os as _os +import sys as _sys +import json as _json +import logging as _logging +import argparse as _argparse +import subprocess as _subprocess + +# configure logger +_log_format = "%(asctime)s [wft4galaxy-docker] [%(levelname)-5.5s] %(message)s" +_logger = _logging.getLogger("WorkflowTest-Docker") +_logger_handler = _logging.StreamHandler() +_logger_formatter = _logging.Formatter(_log_format) +_logger_handler.setFormatter(_logger_formatter) +_logger.addHandler(_logger_handler) + +# try to load modules required for running container interactively +try: + import docker as _docker + import dockerpty as _dockerpty +except ImportError: + _logger.debug("Packages 'docker' and 'dockerpty' are not available") + +# Exit codes +_SUCCESS_EXIT = 0 +_FAILURE_EXIT = -1 + +# Jupyter port +DEFAULT_JUPYTER_PORT = 9876 + +# absolute path of this script +_script_path = _os.path.realpath(__file__) +_logger.debug("Script path: %s" % _script_path) + +# try to load wft4galaxy.properties if the script belongs to an installed instance of wft4galaxy +_properties = None +try: + _properties_file_path = _os.path.abspath(_os.path.join(_script_path, _os.pardir, _os.pardir)) + with open(_os.path.join(_properties_file_path, "wft4galaxy.properties")) as fp: + _properties = _json.load(fp) + _logger.debug("wft4galaxy.properties: %r", _properties) +except: + _logger.debug("No wft4galaxy.properties found! Use default settings!") + +# Docker image settings +DOCKER_IMAGE_SETTINGS = { + "registry": None, + "owner": "crs4", + "production": "wft4galaxy", + "develop": "wft4galaxy-develop", + "default_tag_version": "latest", + "repository": _properties["Docker"]["repository"] \ + if _properties is not None and "Docker" in _properties and "repository" in _properties["Docker"] else "crs4" +} + +# Docker container settings +DOCKER_CONTAINER_SETTINGS = { + "modes": ("production", "develop"), + "entrypoints": { + "runtest": ("runtest", 'Execute the "wft4galaxy" tool as entrypoint', DOCKER_IMAGE_SETTINGS["production"]), + "generate-template": ("wizard", 'Execute the "generate-template" wizard ' + 'command as entrypoint', DOCKER_IMAGE_SETTINGS["production"]), + "generate-test": ("wizard", 'Execute the "generate-test" wizard ' + 'command as entrypoint', DOCKER_IMAGE_SETTINGS["production"]), + "bash": ("bash", 'Execute the "Bash" shell as entrypoint', DOCKER_IMAGE_SETTINGS["develop"]), + "ipython": ("ipython", 'Execute the "Ipython" shell as entrypoint', DOCKER_IMAGE_SETTINGS["develop"]), + "jupyter": ("jupyter", 'Execute the "Jupyter" server as entrypoint', DOCKER_IMAGE_SETTINGS["develop"]) + } +} +# WorkflowTest configuration defaults +DEFAULT_HISTORY_NAME_PREFIX = "_WorkflowTestHistory_" +DEFAULT_WORKFLOW_NAME_PREFIX = "_WorkflowTest_" +DEFAULT_OUTPUT_FOLDER = "results" +DEFAULT_CONFIG_FILENAME = "workflow-test-suite.yml" +DEFAULT_WORKFLOW_CONFIG = { + "file": "workflow.ga", + "output_folder": DEFAULT_OUTPUT_FOLDER, + "inputs": { + "Input Dataset": {"name": "Input Dataset", "file": ["input"]} + }, + "expected": { + "output1": {"file": "expected_output", "comparator": "filecmp.cmp", "name": "output1"}, + "output2": {"file": "expected_output", "comparator": "filecmp.cmp", "name": "output2"} + } +} + + +class _CustomFormatter(_argparse.RawTextHelpFormatter): + """ Customize settings of the default RawTextHelpFormatter """ + + def __init__(self, prog, indent_increment=2, max_help_position=40, width=None): + super(_CustomFormatter, self).__init__(prog, indent_increment, max_help_position, width) + + +class _CommandLineHelper: + def __init__(self, omit_subparsers=False): + self._parser, self._entrypoint_parsers = self.setup(omit_subparsers) + + def setup(self, omit_subparsers=False): + + main_parser = _argparse.ArgumentParser(add_help=True, formatter_class=_argparse.RawTextHelpFormatter) + main_parser.add_argument('--repository', default=None, metavar="REPO", dest="repository", + help='Alternative Docker image repository of ' + 'the "wft4galaxy" Docker image (default is "crs4/wft4galaxy[-develop]")') + main_parser.add_argument('--tag', default=None, metavar="VERSION_TAG", + help='Alternative version tag of the "wft4galaxy" Docker image ' + '(default is "{}")'.format(DOCKER_IMAGE_SETTINGS["default_tag_version"])) + main_parser.add_argument('--skip-update', action="store_true", default=False, + help='Skip the update of the "wft4galaxy" Docker image ' + 'and use the local version if it is available') + main_parser.add_argument('--server', help='Galaxy server URL', default=None) + main_parser.add_argument('--api-key', help='Galaxy server API KEY', default=None) + main_parser.add_argument('--port', help='Docker port to expose', action="append", default=[]) + main_parser.add_argument('--volume', help='Docker volume to mount', type=str, action="append", default=[]) + main_parser.add_argument('--network', help='Docker network to join', default=None) + main_parser.add_argument('--debug', help='Enable debug mode', action='store_true') + + # reference to the global options + epilog = "NOTICE: Type \"{0} -h\" to see the global options.".format("wft4galaxy-docker") + + # add entrypoint subparsers + entrypoint_parsers = None + if omit_subparsers: + main_parser.add_argument('--entrypoint', help='Absolute path of a log file.', default="runtest") + else: + entrypoint_parsers = {} + entrypoint_subparsers_factory = \ + main_parser.add_subparsers(title="Container entrypoint", dest="entrypoint", + description="Available entrypoints for the 'wft4galaxy' Docker image.", + help="Choose one of the following options:") + for ep_name in DOCKER_CONTAINER_SETTINGS["entrypoints"].keys(): + ep_cmd, ep_help, ep_image = DOCKER_CONTAINER_SETTINGS["entrypoints"][ep_name] + entrypoint_parsers[ep_name] = \ + entrypoint_subparsers_factory.add_parser(ep_name, help=ep_help, epilog=epilog) + + # add bash options + entrypoint_parsers["bash"].add_argument("cmd", nargs="*", help="BASH commands") + + # add jupyter options + entrypoint_parsers["jupyter"].add_argument("--web-port", default=DEFAULT_JUPYTER_PORT, type=int, + help="Jupyter port (default is {0})".format( + DEFAULT_JUPYTER_PORT)) + + # add generate-test options + entrypoint_parsers["generate-test"].add_argument("history", help="History name") + entrypoint_parsers["generate-test"].add_argument( + "-o", "--output", dest="output", default="test-config", + help="absolute path of the output folder (default is \"test-config\")") + entrypoint_parsers["generate-test"].add_argument( + "-f", "--file", default="workflow-test-suite.yml", + help="YAML configuration file of workflow tests (default is\"workflow-test-suite.yml\"") + + # add generate-test options + entrypoint_parsers["generate-template"].add_argument( + "-o", "--output", dest="output", default="test-config", + help="absolute path of the output folder (default is \"test-config\")") + entrypoint_parsers["generate-template"].add_argument( + "-f", "--file", default="workflow-test-suite.yml", + help="YAML configuration file of workflow tests (default is\"workflow-test-suite.yml\"") + + # add wft4galaxy options to a subparser or directly to the main_parser + wft4g_parser = main_parser if omit_subparsers else entrypoint_parsers["runtest"] + wft4g_parser.add_argument("-f", "--file", + default=DEFAULT_CONFIG_FILENAME, + help="YAML configuration file of workflow tests (default is \"{0}\")" + .format(DEFAULT_CONFIG_FILENAME)) + wft4g_parser.add_argument("-o", "--output", metavar="PATH", + default=DEFAULT_OUTPUT_FOLDER, + help="Absolute path of the output folder (default is \"{0}\")" + .format(DEFAULT_OUTPUT_FOLDER)) + wft4g_parser.add_argument('--enable-logger', help='Enable log messages', action='store_true') + wft4g_parser.add_argument('--disable-cleanup', help='Disable cleanup', action='store_true') + + # here we hardcode the possible values of wft4galaxy.core.OutputFormat because we don't + # want to require installing the package to use the docker runner. + wft4g_parser.add_argument('--output-format', choices=('text', 'xunit'), help='Choose output type', + default='text') + wft4g_parser.add_argument('--xunit-file', default=None, metavar="PATH", + help='Set the path of the xUnit report file (absolute or relative to the output folder)') + wft4g_parser.add_argument("test", help="Workflow Test Name", nargs="*") + + return main_parser, entrypoint_parsers + + def parse_args(self): + args = self._parser.parse_args() + # add port Jupyter web port + if "web_port" in args: + args.port.append("{0}:{1}".format(args.web_port, args.web_port)) + _logger.debug("Parsed arguments %r", args) + return args + + def print_usage(self): + self._parser.print_usage() + + def print_help(self): + self._parser.print_help() + + +class ContainerRunner: + @staticmethod + def run(options): + if options.entrypoint in ("runtest", "generate-test", "generate-template"): + return NonInteractiveContainer().run(options) + else: + return InteractiveContainer().run(options) + + +class Container(): + def get_image_name(self, options, skip_update=False): + + # base default config + config = DOCKER_CONTAINER_SETTINGS["entrypoints"][options.entrypoint] + + image_repository = None + if options.repository is not None: + image_repository = options.repository + + else: + # + img_name_parts = [] + + # set registry + if _properties and "registry" in _properties["Docker"]: + img_name_parts.append(_properties["Docker"]["registry"]) + elif DOCKER_IMAGE_SETTINGS["registry"]: # set default registry if exists + img_name_parts.append(DOCKER_IMAGE_SETTINGS["registry"]) + # set repository + if _properties and "owner" in _properties["Docker"]: + img_name_parts.append(_properties["Docker"]["owner"]) + elif DOCKER_IMAGE_SETTINGS["owner"]: # set default registry if exists + img_name_parts.append(DOCKER_IMAGE_SETTINGS["owner"]) + # set image name + img_name_parts.append(config[2]) + + # build the fully qualified Docker image name + image_repository = "/".join(img_name_parts) + _logger.debug("Using Docker image: %s", image_repository) + + # try to use the version tag provided by user + image_tag = DOCKER_IMAGE_SETTINGS["default_tag_version"] + if options.tag is not None: + image_tag = options.tag + # if the user doesn't provide a version + else: + # if wft4galaxy has installed, try to use its metadata + if _properties is not None and "Repository" in _properties: + # if the installed version has tag, use it + image_tag = _properties["Repository"]["tag"] if "tag" in _properties["Repository"] else None + # if the installed version has not a tag, use the branch of the Git repository as version + if image_tag is None \ + and _properties["Repository"]["branch"] and "branch" in _properties["Repository"]: + image_tag = _properties["Repository"]["branch"] + + # replace not valid forward, backward slashes and other not valid characters with dashes + image_tag = _re.sub('[\\\\/:*?"<>|]', '-', image_tag) + + # build the fully qualified image name + docker_image_fqn = "{0}:{1}".format(image_repository, image_tag) + + # if the user doesn't disable this option, + # try to pull the last version the required image + if not skip_update: + _logger.info("Updating Docker imge '{0}'".format(docker_image_fqn)) + p = _subprocess.Popen(["docker", "pull", docker_image_fqn], shell=False, close_fds=False) + try: + p.communicate() + except KeyboardInterrupt: + print("\n") + _logger.warn("Pull of Docker image %s interrupted by user", docker_image_fqn) + else: + _logger.info("Using the local version of the Docker image '{0}'".format(docker_image_fqn)) + + return docker_image_fqn + + +class InteractiveContainer(Container): + def _parse_volumes(self, volumes): + mounts = [] + result = {} + if volumes: + for v_str in volumes: + v_info = v_str.split(":") + if len(v_info) != 2: + raise ValueError( + "Invalid volume parameter '{0}'. See 'docker run' syntax for more details.".format(v_str)) + if not _os.path.isabs(v_info[0]): + v_info[0] = _os.path.abspath(v_info[0]) + result[v_info[0]] = {"bind": v_info[1], "mode": "rw"} + mounts.append(v_info[1]) + return mounts, result + + def _parse_ports(self, ports): + result = {} + if ports: + for p_str in ports: + p_info = p_str.split(":") + if len(p_info) == 1: + result[p_info[0]] = None + elif len(p_info) == 2: + result[p_info[0]] = p_info[1] + else: + raise ValueError( + "Invalid port parameter '{0}'. See 'docker run' syntax for more details.".format(p_str)) + return result + + def run(self, options): + """ + + :param options: + :return: + """ + if options.entrypoint == "runtest": + raise ValueError("You cannot use the entrypoint 'runtest' in interactive mode!") + try: + + # prepare the Docker image (updating it if required) + docker_image = self.get_image_name(options, options.skip_update) + + # volumes + vmounts, volumes = self._parse_volumes(options.volume) + + # ports + ports = self._parse_ports(options.port) + + # environment + environment = ["GALAXY_URL={0}".format(options.server), + "GALAXY_API_KEY={0}".format(options.api_key)] + + # command + command = [ + options.entrypoint, + "--server", options.server, + "--api-key", options.api_key + ] + if "web_port" in options: + command.extend(["--port", "{}".format(options.web_port)]) + import socket + # create and run Docker containers + client = _docker.APIClient() + container = client.create_container( + image=docker_image, + stdin_open=True, + tty=True, + hostname=socket.gethostname(), + command=command, + environment=environment, + volumes=vmounts, + ports=list(ports.keys()), + host_config=client.create_host_config(binds=volumes, port_bindings=ports) + ) + _logger.info("Started Docker container %s", container["Id"]) + _dockerpty.start(client, container) + client.remove_container(container["Id"]) + _logger.info("Removed Docker container %s", container["Id"]) + return _SUCCESS_EXIT + except NameError as ne: + if options and options.debug: + _logger.exception(ne) + print("\n ERROR: To use wft4galaxy-docker in development mode " + "you need to install 'docker' and 'dockerpty' Python libries \n" + "\tType \"pip install docker dockerpty\" to install the required libraries.\n") + return _FAILURE_EXIT + except Exception as e: + _logger.error("ERROR: Unable to start the Docker container: {0}".format(str(e))) + if options and options.debug: + _logger.exception(e) + return _FAILURE_EXIT + + +class NonInteractiveContainer(Container): + def run(self, options): + """ + + :param options: + :return: + """ + # set absolute path of container mount points for IO + container_input_path = _os.path.join("/", "data_input") + container_output_path = _os.path.join("/", "data_output") + + # extract folder of the configuration file + options.volume.append("{0}:{1}".format( + _os.path.abspath(_os.path.dirname(options.file)), container_input_path)) + options.volume.append("{0}:{1}".format( + _os.path.abspath(_os.path.dirname(options.output)), container_output_path)) + + # prepare the Docker image (updating it if required) + docker_image = self.get_image_name(options, options.skip_update) + + ######################################################## + # build docker cmd + ######################################################## + # main command + cmd = ['docker', 'run', '-i', '--rm'] + # add Docker volumes + for v in options.volume: + cmd += ["-v", v] + # add Docker ports + for p in options.port: + cmd += ["-p", p] + # attach container to a specific Docker network + if options.network: + cmd.extend(["--network", options.network]) + + # Galaxy environment variables + cmd.extend(["-e", "GALAXY_URL={0}".format(options.server)]) + cmd.extend(["-e", "GALAXY_API_KEY={0}".format(options.api_key)]) + # image + cmd.append(docker_image) + # entrypoint + cmd.append(DOCKER_CONTAINER_SETTINGS["entrypoints"][options.entrypoint][0]) + # log debug option + if options.debug: + cmd.append("--debug") + # Galaxy settings server (redundant) + cmd += ["--server ", options.server] + cmd += ["--api-key ", options.api_key] + # configuration file + cmd += ["-f", + options.file if options.entrypoint in ("generate-test", "generate-template") + else _os.path.join(container_input_path, _os.path.basename(options.file))] + # output folder + cmd += ["-o", _os.path.join(container_output_path, options.output)] + + # wft4galaxy entrypoint specific options + if options.entrypoint in ("wft4galaxy", "runtest"): + # enable logger option + if options.enable_logger: + cmd.append("--enable-logger") + # cleanup option + if options.disable_cleanup: + cmd.append("--disable-cleanup") + # output format options + cmd.extend(('--output-format', options.output_format)) + if options.xunit_file: + cmd.extend(("--xunit-file", options.xunit_file)) + # add test filter + cmd += options.test + + # append "wizard" subcommand + if options.entrypoint in ("generate-test", "generate-template"): + cmd.append(options.entrypoint) + + # 'generate-test' entrypoint specific options + if options.entrypoint == "generate-test": + cmd.append(options.history) + + # output the Docker command (just for debugging) + _logger.debug("Command parts: %r", cmd) + _logger.debug("Command string: %s", ' '.join(cmd)) + ######################################################### + + # launch the Docker container + p = _subprocess.Popen(cmd, close_fds=False) + try: + p.communicate() + # wait for termination and report the exit code + return p.wait() + except KeyboardInterrupt: + p.kill() + _logger.warn("wft4galaxy terminated by user") + return _FAILURE_EXIT + + +def _set_galaxy_env(options): + ENV_KEY_GALAXY_URL = "GALAXY_URL" + if options.server is None: + if ENV_KEY_GALAXY_URL in _os.environ: + options.server = _os.environ[ENV_KEY_GALAXY_URL] + else: + raise ValueError("Galaxy URL not defined! " + "Use --server or the environment variable {}.\n".format(ENV_KEY_GALAXY_URL)) + ENV_KEY_GALAXY_API_KEY = "GALAXY_API_KEY" + if options.api_key is None: + if ENV_KEY_GALAXY_API_KEY in _os.environ: + options.api_key = _os.environ[ENV_KEY_GALAXY_API_KEY] + else: + raise ValueError("Galaxy API key not defined! " + "Use --api-key or the environment variable {}.\n".format(ENV_KEY_GALAXY_API_KEY)) + + +def main(): + options = None + try: + # arguments set + args = set(_sys.argv[1:]) + + # check if we need to print help + print_help = len(args & set(["-h", "--help"])) != 0 + + # check at list one entrypoint is specified + # if not, it is assumed to be "runtest" + omit_subparsers = len(args & set(DOCKER_CONTAINER_SETTINGS["entrypoints"])) == 0 and not print_help + + # initialize the CLI helper + p = _CommandLineHelper(omit_subparsers=omit_subparsers) + + # print help and exit + if print_help and omit_subparsers: + p.print_help() + _sys.exit(_SUCCESS_EXIT) + + # parse cli options/arguments + options = p.parse_args() + + # update logger + if options.debug: + _logger.setLevel(_logging.DEBUG) + + # print CLI options + _logger.debug("Command line options %r", options) + + # set galaxy_env + _set_galaxy_env(options) + + # log Python version + _logger.debug("Python version: %s", _sys.version) + + # run container + ctr = ContainerRunner() + exit_code = ctr.run(options) + _logger.debug("Docker container terminated with %d exit code", exit_code) + + # report the Docker container exit code + _sys.exit(exit_code) + + except Exception as e: + _logger.error("ERROR: {0}".format(str(e))) + if options and options.debug: + _logger.exception(e) + _sys.exit(_FAILURE_EXIT) + + +if __name__ == '__main__': + main() diff --git a/wft4galaxy/app/runner.py b/wft4galaxy/app/runner.py new file mode 100644 index 0000000..fcb331f --- /dev/null +++ b/wft4galaxy/app/runner.py @@ -0,0 +1,181 @@ +from __future__ import print_function + +import os as _os +import sys as _sys +import argparse as _argparse +import logging as _logging + +import wft4galaxy.core as _core +import wft4galaxy.common as _common +from wft4galaxy.core import OutputFormat + +# set logger +_logger = _common.LoggerManager.get_logger(__name__) + + +class _CustomFormatter(_argparse.RawTextHelpFormatter): + """ Customize settings of the default RawTextHelpFormatter """ + + def __init__(self, prog, indent_increment=2, max_help_position=40, width=None): + super(_CustomFormatter, self).__init__(prog, indent_increment, max_help_position, width) + + +def _make_parser(): + parser = _argparse.ArgumentParser(add_help=True, formatter_class=_CustomFormatter) + parser.add_argument("test", help="Workflow Test Name", nargs="*") + parser.add_argument('--server', help='Galaxy server URL', dest="galaxy_url") + parser.add_argument('--api-key', help='Galaxy server API KEY', dest="galaxy_api_key") + parser.add_argument('-f', '--file', default=_core.WorkflowTestCase.DEFAULT_CONFIG_FILENAME, + help='YAML configuration file of workflow tests (default is {0})'.format( + _core.WorkflowTestCase.DEFAULT_CONFIG_FILENAME)) + parser.add_argument('--enable-logger', help='Enable log messages', action='store_true', default=None) + parser.add_argument('--debug', help='Enable debug mode', action='store_true', default=None) + parser.add_argument('--disable-cleanup', help='Disable cleanup', action='store_true', default=None) + + parser.add_argument('--output-format', choices=OutputFormat, help='Choose output type', default=OutputFormat.text) + + parser.add_argument('--xunit-file', default=None, metavar="FILE_PATH", + help='Set the path of the xUnit report file (absolute or relative to the output folder)') + parser.add_argument('-o', '--output', dest="output_folder", metavar="PATH", help='Path of the output folder') + return parser + + +def _parse_cli_arguments(parser, cmd_args): + args = parser.parse_args(cmd_args) + _logger.debug("Parsed arguments %r", args) + + if not _os.path.isfile(args.file): + parser.error("Test file {} doesn't exist or isn't a file".format(args.file)) + if not _os.access(args.file, _os.R_OK): + parser.error("Permission error. Test file {} isn't accessible for reading".format(args.file)) + if args.xunit_file and args.output_format != OutputFormat.xunit: + parser.error("--xunit-file can only be specified when using the xUnit output format") + + return args + + +def _configure_test(galaxy_url, galaxy_api_key, suite, output_folder, tests, + enable_logger, enable_debug, disable_cleanup, disable_assertions): + # configure `galaxy_url` + suite.galaxy_url = galaxy_url or suite.galaxy_url or _os.environ.get(_common.ENV_KEY_GALAXY_URL) + if not suite.galaxy_url: + raise _common.TestConfigError("Galaxy URL not defined! Use --server or the environment variable {} " + "or specify it in the test configuration".format(_common.ENV_KEY_GALAXY_URL)) + # configure `galaxy_api_key` + suite.galaxy_api_key = galaxy_api_key \ + or suite.galaxy_api_key \ + or _os.environ.get(_common.ENV_KEY_GALAXY_API_KEY) + if not suite.galaxy_api_key: + raise _common.TestConfigError("Galaxy API key not defined! Use --api-key or the environment variable {} " + "or specify it in the test configuration".format(_common.ENV_KEY_GALAXY_API_KEY)) + # configure `output_folder` + suite.output_folder = output_folder \ + or suite.output_folder \ + or _core.WorkflowTestCase.DEFAULT_OUTPUT_FOLDER + + if enable_logger is not None: + suite.enable_logger = enable_logger + + if enable_debug is not None: + suite.enable_debug = enable_debug + + if disable_cleanup is not None: + suite.disable_cleanup = disable_cleanup + + if disable_assertions is not None: + suite.disable_assertions = disable_assertions + + for test_config in suite.workflow_tests.values(): + test_config.disable_cleanup = suite.disable_cleanup + test_config.disable_assertions = suite.disable_assertions + + # enable the logger with the proper detail level + if suite.enable_logger or suite.enable_debug: + _common.LoggerManager.update_log_level(_logging.DEBUG if suite.enable_debug else _logging.INFO) + + # log Python version + _logger.debug("Python version: %s", _sys.version) + + # log the current configuration + _logger.info("Configuration: %s", suite) + + +def run_tests(filename, + galaxy_url=None, galaxy_api_key=None, + enable_logger=None, enable_debug=None, + disable_cleanup=None, disable_assertions=None, + output_folder=None, enable_xunit=False, xunit_file=None, tests=None): + """ + Run a workflow test suite defined in a configuration file. + + :type enable_logger: bool + :param enable_logger: ``True`` to enable INFO messages; ``False`` (default) otherwise. + + :type enable_debug: bool + :param enable_debug: ``True`` to enable DEBUG messages; ``False`` (default) otherwise. + + :type disable_cleanup: bool + :param disable_cleanup: ``True`` to avoid the clean up of the workflow and history created on the Galaxy server; + ``False`` (default) otherwise. + + :type disable_assertions: bool + :param disable_assertions: ``True`` to disable assertions during the execution of the workflow test; + ``False`` (default) otherwise. + """ + + # load suite configuration + suite = _core.WorkflowTestSuite.load(filename, + output_folder=output_folder) # FIXME: do we need output_folder here ? + _configure_test(galaxy_url=galaxy_url, galaxy_api_key=galaxy_api_key, + suite=suite, tests=tests, output_folder=output_folder, + enable_logger=enable_logger, enable_debug=enable_debug, + disable_cleanup=disable_cleanup, disable_assertions=disable_assertions) + + # run the configured test suite + result = suite.run(galaxy_url=galaxy_url, galaxy_api_key=galaxy_api_key, verbosity=2, + enable_xunit=enable_xunit or (xunit_file != None), xunit_file=xunit_file, + enable_logger=enable_logger, enable_debug=enable_debug, disable_cleanup=disable_cleanup) + # compute exit code + exit_code = len([r for r in result.test_case_results if r.failed()]) + _logger.debug("wft4galaxy.run_tests exiting with code: %s", exit_code) + return exit_code + + +def main(): + try: + # parse arguments + parser = _make_parser() + options = _parse_cli_arguments(parser, _sys.argv[1:]) + + # setup logging + _common.LoggerManager.configure_logging( + level=_logging.DEBUG if options.debug else _logging.INFO if options.enable_logger else _logging.ERROR, + show_logger_name=True if options.debug else False + ) + + # run tests and collect exit code + code = run_tests(filename=options.file, + galaxy_url=options.galaxy_url, + galaxy_api_key=options.galaxy_api_key, + output_folder=options.output_folder, + enable_logger=options.enable_logger, + enable_debug=options.debug, + disable_cleanup=options.disable_cleanup, + enable_xunit=(options.output_format == OutputFormat.xunit), + xunit_file=options.xunit_file, + tests=options.test) + + # report exit code to the system + _sys.exit(code) + except _common.RunnerStandardError as e: + # in some cases we exit with an exception even for rather "normal" + # situations, such as configuration errors. For this reason we only display + # the exception's stack trace if debug logging is enabled. + _logger.error(e) + if _logger.isEnabledFor(_logging.DEBUG): + _logger.exception(e) + _sys.exit(99) + + +if __name__ == '__main__': + main() diff --git a/wft4galaxy/app/wizard.py b/wft4galaxy/app/wizard.py new file mode 100644 index 0000000..74fa796 --- /dev/null +++ b/wft4galaxy/app/wizard.py @@ -0,0 +1,269 @@ +from __future__ import print_function + +import os as _os +import sys as _sys +import jinja2 as _jinja2 +import logging as _logging +import argparse as _argparse +import datetime as _datetime + +# wft4galaxy dependencies +import wft4galaxy.core as _core +import wft4galaxy.common as _common +import wft4galaxy.wrapper as _wrapper + +# default output settings +DEFAULT_OUTPUT_FOLDER = "test-config" +DEFAULT_INPUTS_FOLDER = "inputs" +DEFAULT_EXPECTED_FOLDER = "expected" +DEFAULT_WORFLOW_DEFINITION_FILENAME = "workflow.ga" +DEFAULT_TEST_DEFINITION_FILENAME = "workflow-test-suite.yml" + +# command string +_OPTION_CMD = "command" +_TEST_CMD = "generate-test" +_TEMPLATE_CMD = "generate-template" + +# templates directory +_TEMPLATE_DIR = _os.path.join(_os.path.dirname(_os.path.abspath(__file__)), _os.pardir, _os.pardir, "templates") + +# configure module logger +_logger = _common.LoggerManager.get_logger(__name__) + + +# fix an issue related to the output buffering +# when the wizard is running within a Docker container +def disable_output_buffering(): + if _sys.version_info[0] == 2: + _logger.debug("Disabling output buffering...") + _sys.stdout = _os.fdopen(_sys.stdout.fileno(), 'w', 0) + + +def write_test_suite_definition_file(output_file, suite_config): + j2_env = _jinja2.Environment(loader=_jinja2.FileSystemLoader(_TEMPLATE_DIR), trim_blocks=True) + try: + file_content = j2_env.get_template('workflow-test-template.yaml').render(config=suite_config) + _logger.debug("Workflow test definition file:%s\n\n%s", output_file, file_content) + with open(output_file, "w") as out: + out.write(file_content) + except _jinja2.exceptions.UndefinedError as e: + print(e.message) + + +def make_dir_structure(output_folder): + # make directory structure of the test definition + _common.makedirs(output_folder) + _common.makedirs(_os.path.join(output_folder, DEFAULT_INPUTS_FOLDER)) + _common.makedirs(_os.path.join(output_folder, DEFAULT_EXPECTED_FOLDER)) + + +def download_dataset(datasets, output_folder, labels=None): + for ds in datasets: + ds_filename = _os.path.join(output_folder, + "{0}.{1}".format(labels[ds.id], ds.file_ext) if labels is not None else ds.name) + _logger.debug("Downloading dataset \"%s\" from \"%s\" ...", ds.id, ds.wrapped["url"]) + with open(ds_filename, "wb") as ds_in_fp: + ds.download(ds_in_fp) + _logger.debug("Dataset \"%s\" downloaded to \"%s\: done", ds.id, ds_filename) + + +def generate_template(config): + _logger.info("Generating test definition template folder...") + # config a sample suite + suite = _core.WorkflowTestSuite(config["galaxy_url"], config["galaxy_api_key"]) + cfg = _core.WorkflowTestCase(name="workflow_test_case_1") + cfg.output_folder = config["output_folder"] + cfg.enable_debug = config["enable_debug"] + cfg.add_input("input_1", "{0}/".format(DEFAULT_INPUTS_FOLDER), "txt") + cfg.add_expected_output("output_1", "{0}/".format(DEFAULT_EXPECTED_FOLDER)) + suite.add_workflow_test(cfg) + output_folder = _os.path.abspath(config["output_folder"]) + output_filename = _os.path.join(output_folder, config["file"]) + # make directory structure of the test definition + make_dir_structure(output_folder) + # write the definition file + _logger.info("Writing workflow test definition file to %s ...", output_filename) + write_test_suite_definition_file(output_filename, suite) + _logger.debug("Writing workflow test definition file to %s: done", output_filename) + _logger.info("Test definition template folder correctly generated.\n ===> See folder: %s", output_folder) + + +def generate_test_case(config): + # instantiate the history wrapper + hw = _wrapper.History(config["history-id"], + galaxy_url=config["galaxy_url"], galaxy_api_key=config["galaxy_api_key"]) + + # set the output folder + output_folder = _os.path.abspath(config["output_folder"]) + + # make directory structure of the test definition + make_dir_structure(output_folder) + + # extract workflow + workflow_definition_filename = _os.path.join(output_folder, DEFAULT_WORFLOW_DEFINITION_FILENAME) + wf_def = hw.extract_workflow(workflow_definition_filename) + + # download input datasets + _logger.info("Downloading input datasets...") + download_dataset(hw.input_datasets.values(), _os.path.join(output_folder, DEFAULT_INPUTS_FOLDER)) + _logger.info("Downloading input datasets: done") + + # download output datasets + _logger.info("Downloading output datasets...") + download_dataset(hw.output_datasets.values(), _os.path.join(output_folder, DEFAULT_EXPECTED_FOLDER), + labels=hw.output_dataset_labels) + _logger.info("Downloading output datasets: done") + + # load the wf wrapper + wf = _wrapper.Workflow.load(workflow_definition_filename) + + suite = _core.WorkflowTestSuite(config["galaxy_url"], config["galaxy_api_key"]) + cfg = _core.WorkflowTestCase(name="workflow_test_case_1") + cfg.output_folder = _core.WorkflowTestCase.DEFAULT_OUTPUT_FOLDER + cfg.enable_debug = config["enable_debug"] + + # configure input + for ds in hw.input_datasets.values(): + cfg.add_input(hw.input_dataset_labels[ds.id], + "{0}/{1}".format(DEFAULT_INPUTS_FOLDER, ds.wrapped["name"]), ds.file_ext) + + # configure output + for ds in hw.output_datasets.values(): + cfg.add_expected_output(hw.output_dataset_labels[ds.id], + "{0}/{1}".format(DEFAULT_EXPECTED_FOLDER, + "{0}.{1}".format(hw.output_dataset_labels[ds.id], ds.file_ext))) + + # append test case to the test suite + suite.add_workflow_test(cfg) + + # write the definition file + _logger.info("Saving workflow test definition ...") + wf_test_file = _os.path.join(output_folder, config["file"]) + write_test_suite_definition_file(wf_test_file, suite) + _logger.debug("Workflow test definition saved to %s", wf_test_file) + _logger.info("Saving workflow test definition: done") + + +def _get_history_info(config): + result = None + gi = _common.get_galaxy_instance(config["galaxy_url"], config["galaxy_api_key"]) + _logger.info("Loading Galaxy history info ...") + candidate_histories = [h for h in gi.histories.list() if config["history"] in h.name] + candidate_count = len(candidate_histories) + if candidate_count == 0: + print("\n No history found with name: \"{0}\"".format(config["history"])) + elif candidate_count == 1: + result = candidate_histories[0] + else: + while True: + print("\nNOTICE:".ljust(10), + "More than one history matches the name \"{0}\".".format(config["history"])) + print("".ljust(9), "Please select one of the following options:\n") + + for opt, h in enumerate(candidate_histories): + print("".ljust(3), "{0})".format(opt + 1).ljust(4), h.name.ljust(30), + "".ljust(4), "create-time:", + _datetime.datetime.strptime(h.wrapped["create_time"], "%Y-%m-%dT%H:%M:%S.%f").strftime( + "%Y-%m-%d %H:%M:%S")) + print("\n".ljust(4), "0)".ljust(4), "Exit") + + try: + # get the user choice as int + # notice that `input` in python3 is equivalent to `raw_input` in python2 + choice = int(input("\n ==> Choice: ")) + if choice in range(0, candidate_count + 1): + if choice > 0: + result = candidate_histories[choice - 1] + print("\n") + break + except ValueError: + print("\nWARNING: ".ljust(10), "Your choice is not valid!!!") + except NameError: + print("\nWARNING: ".ljust(10), "Your choice is not valid!!!") + except SyntaxError: + print("\nWARNING: ".ljust(10), "Your choice is not valid!!!") + except KeyboardInterrupt: + break + else: + print("\nWARNING: ".ljust(10), "Your choice is not valid!!!") + return result + + +def _make_parser(): + main_parser = _argparse.ArgumentParser() + # log settings + main_parser.add_argument('--debug', help='Enable debug mode', action='store_true', default=False, + dest="enable_debug") + # Galaxy instance settings + main_parser.add_argument('--server', help='Galaxy server URL (default $GALAXY_URL)', dest="galaxy_url") + main_parser.add_argument('--api-key', help='Galaxy server API KEY (default $GALAXY_API_KEY)', dest="galaxy_api_key") + # output settings + main_parser.add_argument('-o', '--output', dest="output_folder", default=DEFAULT_OUTPUT_FOLDER, + help='absolute path of the output folder (default is "{0}")'.format(DEFAULT_OUTPUT_FOLDER)) + main_parser.add_argument("-f", "--file", default=DEFAULT_TEST_DEFINITION_FILENAME, + help="YAML configuration file of workflow tests (default is \"{0}\")" + .format(DEFAULT_TEST_DEFINITION_FILENAME)) + # reference to the global options + epilog = "NOTICE: Type \"{0} -h\" to see the global options.".format(main_parser.prog) + + # add entrypoint subparsers + command_subparsers_factory = \ + main_parser.add_subparsers(title="command", + description="command", dest=_OPTION_CMD, + help="Wizard tool command: [generate-test | generate-template]") + + # add wizard options + test_parser = command_subparsers_factory.add_parser(_TEST_CMD, + help="Generate a test definition file from a history", + epilog=epilog) + + # test_parser.add_argument('workflow-name', help='Workflow name') + test_parser.add_argument('history', help='History name') + + template_parser = command_subparsers_factory.add_parser(_TEMPLATE_CMD, + help="Generate a test definition template", + epilog=epilog) + return main_parser + + +def main(args=None): + # set args + args = args if args else _sys.argv[1:] + try: + # disable output buffering + disable_output_buffering() + + # process CLI args and opts + parser = _make_parser() + options = parser.parse_args(args) + config = _common.Configuration(vars(options)) + + # setup logging + _common.LoggerManager.configure_logging( + level=_logging.DEBUG if options.enable_debug else _logging.INFO, + show_logger_name=True if options.enable_debug else False) + + # log the configuration + _logger.debug("CLI config %r", config) + # update defaults + _common.configure_env_galaxy_server_instance(config, options) + # log the configuration + if options.enable_debug: + _logger.debug("Configuration...") + print(_common.pformat(config)) + if options.command == _TEMPLATE_CMD: + generate_template(config) + elif options.command == _TEST_CMD: + history = _get_history_info(config) + if history is not None: + _logger.info("Selected history: %s (id: %r)", history.name, history.id) + config["history-id"] = history.id + generate_test_case(config) + except Exception as e: + _logger.error(e) + if _logger.isEnabledFor(_logging.DEBUG): + _logger.exception(e) + + +if __name__ == '__main__': + main() diff --git a/wft4galaxy/common.py b/wft4galaxy/common.py new file mode 100644 index 0000000..468ab51 --- /dev/null +++ b/wft4galaxy/common.py @@ -0,0 +1,320 @@ +from __future__ import print_function +from future.utils import iteritems as _iteritems +from past.builtins import basestring as _basestring + +import os as _os +import json as _json +import types as _types +import logging as _logging +import datetime as _datetime + +# bioblend dependencies +from bioblend.galaxy.objects import GalaxyInstance as ObjGalaxyInstance + +# Galaxy ENV variable names +ENV_KEY_GALAXY_URL = "GALAXY_URL" +ENV_KEY_GALAXY_API_KEY = "GALAXY_API_KEY" + +# configure logger + + + +# map `StandardError` to `Exception` to allow compatibility both with Python2 and Python3 +RunnerStandardError = Exception +try: + RunnerStandardError = StandardError +except NameError: + pass + + +class TestConfigError(RuntimeError): + pass + + +class DynamicObject(dict): + """ Represents a dynamic object """ + + def __init__(self, initial_properties=None): + self.__dict__ = self + if initial_properties: + self.update(initial_properties) + + def __setattr__(self, name, value): + if isinstance(value, _types.FunctionType): + self[name] = _types.MethodType(value, self) + else: + super(DynamicObject, self).__setattr__(name, value) + + +class Configuration(DynamicObject): + pass + + +class LoggerManager(object): + @staticmethod + def get_string_format(show_logger_name=False): + return "%(asctime)s [{0}] [%(levelname)+5.5s] %(message)s".format( + "%(name)s" if show_logger_name else "wft4galaxy") + + @staticmethod + def new_log_file(output_folder): + makedirs(output_folder) + return _os.path.join(output_folder, "{0}.log".format( + _datetime.datetime.now().strftime("%Y%m%d@%H%M%S"))) + + @staticmethod + def configure_logging(level=_logging.ERROR, show_logger_name=False, + log_to_folder=None, disable_console_output=False): + root = _logging.getLogger() + root.propagate = True + log_format = LoggerManager.get_string_format(show_logger_name) + if log_to_folder is not None: + filename = LoggerManager.new_log_file(log_to_folder) + if disable_console_output: + _logging.basicConfig(level=level, format=log_format, filename=filename) + else: + _logging.basicConfig(level=level, format=log_format) + LoggerManager.enable_log_to_file(filename) + else: + _logging.basicConfig(level=level, format=log_format) + + @staticmethod + def update_log_level(level): + root = _logging.getLogger() + root.setLevel(level) + log_format = LoggerManager.get_string_format(level == _logging.DEBUG) + for h in root.handlers: + h.setFormatter(_logging.Formatter(log_format)) + + @staticmethod + def get_logger(name_or_class): + if not isinstance(name_or_class, _basestring): + name_or_class = "{}.{}".format(name_or_class.__module__, name_or_class.__class__.__name__) + return _logging.getLogger(name_or_class) + + @staticmethod + def enable_log_to_file(log_filename=None, output_folder=None): + logger = _logging.getLogger() + if output_folder is None and log_filename is None: + raise ValueError("You must provide at least one the arguments: log_filename or output_folder") + if log_filename is None: + log_filename = LoggerManager.new_log_file(output_folder) + elif not _os.path.isabs(log_filename): + log_filename = _os.path.join(output_folder, log_filename) + if not _os.path.exists(output_folder): + logger.debug("Creating folder '%s' of log file %s", output_folder, log_filename) + _os.makedirs(output_folder) + logger.debug("Enabling LOG file: '%s'", log_filename) + fileHandler = _logging.FileHandler(log_filename) + log_format = LoggerManager.get_string_format(logger.getEffectiveLevel() == _logging.DEBUG) + fileHandler.setFormatter(_logging.Formatter(log_format)) + logger.addHandler(fileHandler) + return fileHandler + + @staticmethod + def remove_file_handler(handler, remove_file=False): + logger = _logging.getLogger() + if isinstance(handler, _logging.FileHandler): + logger.debug("Removing log file: %s", handler.baseFilename) + logger.removeHandler(handler) + handler.close() + # remove log file + if remove_file: + _os.remove(handler.baseFilename) + + +def pformat(obj): + return _json.dumps(obj, sort_keys=True, indent=4) + + +def cmp(a, b): + return (a > b) - (a < b) + + +def makedirs(path, check_if_exists=False): + try: + _os.makedirs(path) + except OSError as e: + if check_if_exists: + raise OSError(e.message) + + +def configure_env_galaxy_server_instance(config, options, base_config=None): + config["galaxy_url"] = options.galaxy_url \ + or base_config and base_config.get("galaxy_url") \ + or _os.environ.get(ENV_KEY_GALAXY_URL) + if not config["galaxy_url"]: + raise TestConfigError("Galaxy URL not defined! Use --server or the environment variable {} " + "or specify it in the test configuration".format(ENV_KEY_GALAXY_URL)) + + config["galaxy_api_key"] = options.galaxy_api_key \ + or base_config and base_config.get("galaxy_api_key") \ + or _os.environ.get(ENV_KEY_GALAXY_API_KEY) + if not config["galaxy_api_key"]: + raise TestConfigError("Galaxy API key not defined! Use --api-key or the environment variable {} " + "or specify it in the test configuration".format(ENV_KEY_GALAXY_API_KEY)) + + +def get_galaxy_instance(galaxy_url=None, galaxy_api_key=None): + """ + Private utility function to instantiate and configure a :class:`bioblend.GalaxyInstance` + + :type galaxy_url: str + :param galaxy_url: the URL of the Galaxy server + + :type galaxy_api_key: str + :param galaxy_api_key: a registered Galaxy API KEY + + :rtype: :class:`bioblend.objects.GalaxyInstance` + :return: a new :class:`bioblend.objects.GalaxyInstance` instance + """ + # configure `galaxy_url` + if galaxy_url is None: + if ENV_KEY_GALAXY_URL not in _os.environ: + raise TestConfigError("Galaxy URL not defined! Use --server or the environment variable {} " + "or specify it in the test configuration".format(ENV_KEY_GALAXY_URL)) + else: + galaxy_url = _os.environ[ENV_KEY_GALAXY_URL] + + # configure `galaxy_api_key` + if galaxy_api_key is None: + if ENV_KEY_GALAXY_API_KEY not in _os.environ: + raise TestConfigError("Galaxy API key not defined! Use --api-key or the environment variable {} " + "or specify it in the test configuration".format(ENV_KEY_GALAXY_API_KEY)) + else: + galaxy_api_key = _os.environ[ENV_KEY_GALAXY_API_KEY] + + # initialize the galaxy instance + return ObjGalaxyInstance(galaxy_url, galaxy_api_key) + + +class WorkflowLoader(object): + """ + Singleton utility class responsible for loading (unloading) workflows to (from) a Galaxy server. + """ + + _instance = None + + _logger = LoggerManager.get_logger(__name__) + + @classmethod + def get_instance(cls, galaxy_instance=None): + """ + Return the singleton instance of this class. + + :rtype: :class:`WorkflowLoader` + :return: a :class:`WorkflowLoader` instance + """ + if not WorkflowLoader._instance: + cls._logger.debug("Creating a new WorflowLoader instance...") + WorkflowLoader._instance = WorkflowLoader(galaxy_instance) + elif galaxy_instance: + cls._logger.debug("Initializing the existing WorkflowLoader instance...") + WorkflowLoader._instance._initialize(galaxy_instance) + return WorkflowLoader._instance + + def __init__(self, galaxy_instance=None): + """ + Create a new instance of this class + It requires a ``galaxy_instance`` (:class:`bioblend.GalaxyInstance`) which can be provided + as a constructor parameter (if it has already been instantiated) or configured (and instantiated) + by means of the method ``initialize``. + + :type galaxy_instance: :class:`bioblend.GalaxyInstance` + :param galaxy_instance: a galaxy instance object + """ + self._galaxy_instance = None + self._workflows = {} + # if galaxy_instance exists, complete initialization + if galaxy_instance: + self._initialize(galaxy_instance) + + def initialize(self, galaxy_url, galaxy_api_key): + """ + Initialize the connection to a Galaxy server instance. + + :type galaxy_url: str + :param galaxy_url: url of your Galaxy server instance. If ``none``, the environment variable + ``GALAXY_URL`` is used. An error is raised when such a variable cannot be found. + + :type galaxy_api_key: str + :param galaxy_api_key: an API key from your Galaxy server instance. If ``none``, the environment variable + ``GALAXY_API_KEY`` is used. An error is raised when such a variable cannot be found. + """ + if not self._galaxy_instance: + # initialize the galaxy instance + self._initialize(get_galaxy_instance(galaxy_url, galaxy_api_key)) + + def _initialize(self, galaxy_instance): + if not self._galaxy_instance: + # initialize the galaxy instance + self._galaxy_instance = galaxy_instance + + def load_workflow(self, workflow_test_config, + workflow_name=None, workflow_name_prefix="", workflow_name_suffix=""): + """ + Load the workflow defined in a :class:`WorkflowTestConfig` instance to the configured Galaxy server. + ``workflow_name`` overrides the default workflow name. + + :type workflow_test_config: :class:`WorkflowTestConfig` + :param workflow_test_config: the instance of :class:`WorkflowTestCase` + representing the workflow test configuration + + :type workflow_name: str + :param workflow_name: an optional name which overrides the default workflow name + """ + if not self._galaxy_instance: + raise RuntimeError("WorkflowLoader not initialized") + workflow_filename = workflow_test_config.filename \ + if not workflow_test_config.base_path or _os.path.isabs(workflow_test_config.filename) \ + else _os.path.join(workflow_test_config.base_path, workflow_test_config.filename) + return self.load_workflow_by_filename(workflow_filename, + workflow_name, workflow_name_prefix, workflow_name_suffix) + + def load_workflow_by_filename(self, workflow_filename, + workflow_name=None, workflow_name_prefix="", workflow_name_suffix=""): + """ + Load the workflow defined within the file named as `workflow_filename` to the connected Galaxy server. + + :type workflow_filename: str + :param workflow_filename: the path of workflow definition file + + :type workflow_name: str + :param workflow_name: an optional name which overrides the default workflow name + """ + if not self._galaxy_instance: + raise RuntimeError("WorkflowLoader not initialized") + self._logger.debug("Loading workflow definition from file: %s", workflow_filename) + with open(workflow_filename) as f: + wf_json = _json.load(f) + self._logger.debug("Workflow definition loaded from file: done") + wf_json["name"] = "-".join([workflow_name_prefix, + (workflow_name if workflow_name else wf_json["name"]).replace(" ", ""), + workflow_name_suffix]) + self._logger.debug("Uploading the Workflow to the Galaxy instance ...") + wf = self._galaxy_instance.workflows.import_new(wf_json) + self._logger.debug("Uploading the Workflow to the Galaxy instance: done") + self._workflows[wf.id] = wf + return wf + + def unload_workflow(self, workflow_id): + """ + Unload the workflow identified by ``workflow_id`` from the configured Galaxy server. + + :type workflow_id: str + :param workflow_id: the ID of the workflow to unload from the connected Galaxy server. + """ + if not self._galaxy_instance: + raise RuntimeError("WorkflowLoader not initialized") + self._galaxy_instance.workflows.delete(workflow_id) + if workflow_id in self._workflows: + del self._workflows[workflow_id] + + def unload_workflows(self): + """ + Unload all workflows loaded by this :class:`WorkflowLoader` instance. + """ + if not self._galaxy_instance: + raise RuntimeError("WorkflowLoader not initialized") + for _, wf in _iteritems(self._workflows): + self.unload_workflow(wf.id) diff --git a/wft4galaxy/comparators/__init__.py b/wft4galaxy/comparators/__init__.py new file mode 100644 index 0000000..1194ce3 --- /dev/null +++ b/wft4galaxy/comparators/__init__.py @@ -0,0 +1,113 @@ +from __future__ import print_function + +import os as _os +import sys as _sys +import logging as _logging +from difflib import unified_diff as _unified_diff +from wft4galaxy import common as _common + +_logger = _common.LoggerManager.get_logger(__name__) + + +def load_comparator(fully_qualified_comparator_function): + """ + Utility function responsible for dynamically loading a comparator function + given its fully qualified name. + + :type fully_qualified_comparator_function: str + :param fully_qualified_comparator_function: fully qualified name of a comparator function + + :return: a callable reference to the loaded comparator function + """ + mod = None + try: + components = fully_qualified_comparator_function.split('.') + mod = __import__(components[0]) + for comp in components[1:]: + mod = getattr(mod, comp) + except ImportError as e: + _logger.error(e) + except AttributeError as e: + _logger.error(e) + except: + _logger.error("Unexpected error: %s", _sys.exc_info()[0]) + return mod + + +def base_comparator(actual_output_filename, expected_output_filename): + _logger.debug("Using default comparator....") + with open(actual_output_filename) as aout, open(expected_output_filename) as eout: + diff = _unified_diff(aout.readlines(), eout.readlines(), actual_output_filename, expected_output_filename) + ldiff = list(diff) + if len(ldiff) > 0: + print("\n{0}\n...\n".format("".join(ldiff[:20]))) + diff_filename = _os.path.join(_os.path.dirname(actual_output_filename), + _os.path.basename(actual_output_filename) + ".diff") + with open(diff_filename, "w") as out_fp: + out_fp.writelines("%r\n" % item.rstrip('\n') for item in ldiff) + return len(ldiff) == 0 + + +def csv_same_row_and_col_lengths(actual_output_filename, expected_output_filename): + import csv + + with open(actual_output_filename) as af, open(expected_output_filename) as ef: + aout = csv.reader(af) + eout = csv.reader(ef) + colsActual = [] + colsExpected = [] + for row in aout: + colsActual.append(len(row)) + + for row in eout: + colsExpected.append(len(row)) + + if colsActual and colsExpected: + return _common.cmp(colsActual, colsExpected) == 0 + return False + + +def _get_float(s): + try: + return float(s) + except ValueError: + return None + + +def _compare_strings_as_floats(precision, a, b): + a_float = _get_float(a) + b_float = _get_float(b) + if a_float is not None and b_float is not None: + return round(a_float, precision) == round(b_float, precision) + else: + return False + + +def rounded_comparison_csv(actual_output, expected_output): + import csv + try: + from itertools import izip + except ImportError: + # in Python 3 zip() function returns an iterator + izip = zip + precision = 2 + try: + with open(actual_output) as actual, open(expected_output) as expected: + aout = csv.reader(actual) + eout = csv.reader(expected) + for expected_row in eout: + actual_row = next(aout) + for actual_field, expected_field in izip(actual_row, expected_row): + if not _compare_strings_as_floats(precision, actual_field, expected_field) \ + and actual_field != expected_field: + print("Difference found between expected and actual output", file=_sys.stderr) + print("Expected field text:", expected_field, file=_sys.stderr) + print("Actual field text:", actual_field, file=_sys.stderr) + print("Expected row:", expected_row, file=_sys.stderr) + print("Actual row:", actual_row, file=_sys.stderr) + return False + except StopIteration: + print("Actual output is shorted than expected output", file=_sys.stderr) + return False + + return True diff --git a/wft4galaxy/core.py b/wft4galaxy/core.py new file mode 100644 index 0000000..f6e34a2 --- /dev/null +++ b/wft4galaxy/core.py @@ -0,0 +1,792 @@ +#!/usr/bin/env python + +from __future__ import print_function +from future.utils import iteritems as _iteritems +from past.builtins import basestring as _basestring + +import os as _os +import logging as _logging +from json import dumps as _json_dumps +from uuid import uuid1 as _uuid1 + +from yaml import dump as _yaml_dump +from yaml import load as _yaml_load + +# wft4galaxy dependencies +import wft4galaxy.common as _common + +# set logger +_logger = _common.LoggerManager.get_logger(__name__) + + +# Enum magic for Python < 3.4 +class Enum(object): + def __init__(self, **enums): + for name, val in _iteritems(enums): + self.__dict__[name] = val + + def __setattr__(self, name, v): + raise StandardError("Setting enum value not allowed") + + def __iter__(self): + try: + return self.__dict__.iterkeys() + except: + # in Python3 iterkeys() doesn't exist; + # .keys() returns a `dict_keys` object which is not a new list + # but a suitable object for creating iterators, which are also automatically created + # when the `dict_key` object is involved in a loop + return iter(self.__dict__.keys()) + + +# Define an Enum for supported output types +OutputFormat = Enum(text='text', xunit='xunit') + + +class FileFormats(object): + YAML = "YAML" + JSON = "JSON" + + @staticmethod + def is_yaml(file_format): + return isinstance(file_format, _basestring) and file_format.upper() == FileFormats.YAML + + @staticmethod + def is_json(file_format): + return isinstance(file_format, _basestring) and file_format.upper() == FileFormats.JSON + + +class WorkflowTestCase(object): + """ + A representation of the configuration of a workflow test. + + :type base_path: str + :param base_path: base path for workflow and dataset files (the current working path is assumed as default) + + :type workflow_filename: str + :param workflow_filename: the path (relative to ``base_path``) of the file containing + the workflow definition (i.e., the ``.ga`` file which can be downloaded from a Galaxy server) + + :type name: str + :param name: a name for the workflow test + + :type inputs: dict + :param inputs: a dictionary which defines the mapping between a workflow input and a test dataset. + + :Example: + + {"DataMatrix": "dataMatrix.tsv"} where `DataMatrix` is the name of a workflow input + and `dataMatrix.tsv` is the file containing the dataset to be used as input for the workflow test. + + :type params: dict + :param params: a dictionary which defines the mapping between steps and the set of parameters which has to be + used to configure the corresponding tools of each step. + + + :Example: + + .. code-block:: python + + params = { + 3: { + "orthoI": "NA" + "predI": "1" + "respC": "gender" + "testL": "FALSE" + } + } + + :type expected_outputs: dict + :param expected_outputs: a dictionary to configure the expected output, i.e., the output which has to be compared + to the actual one produced by a workflow execution. Each output of a workflow step is eligible to be compared + with an expected output. It is also possible to specify the python function which has to be used + to perform the actual comparison. Such a function takes two parameters, i.e., ``actual_output_filename`` and + ``expected_output_filename``, and returns ``True`` whether the comparison between the two files succeeds and + ``False`` otherwise. + + + :Example: Skeleton of a user-defined comparator: + + .. code-block:: python + + def compare_outputs(actual_output_filename, expected_output_filename): + .... + return True | False + + + :Example: The example below shows an ``expected_outputs`` dictionary that configures + the expected output datasets for the two actual workflow outputs ``output1`` and ``output2``. + A user defined 'comparator' is also given to compare the expected to the actual ``output2``. + + .. code-block:: python + + { + 'output1': 'change_case/expected_output_1', + 'output2': { + 'comparator': 'filecmp.cmp', + 'file': 'change_case_2/expected_output_2' + } + } + + + + :type output_folder: str + :param output_folder: path (relative to ``base_path``) of the folder where workflow outputs are written. + By default, it is the folder ``results/`` within the ``base_path`` + (where ``name`` is the name of the workflow test). + + :type disable_cleanup: bool + :param disable_cleanup: ``True`` to avoid the clean up of the workflow and history created on the Galaxy server; + ``False`` (default) otherwise. + + :type disable_assertions: bool + :param disable_assertions: ``True`` to disable assertions during the execution of the workflow test; + ``False`` (default) otherwise. + + """ + # Default settings + DEFAULT_HISTORY_NAME_PREFIX = "WorkflowTestCase" + DEFAULT_WORKFLOW_NAME_PREFIX = "WorkflowTest" + DEFAULT_OUTPUT_FOLDER = "results" + DEFAULT_CONFIG_FILENAME = "workflow-test-suite.yml" + DEFAULT_WORKFLOW_CONFIG = { + "name": "workflow_test_case", + "file": "workflow.ga", + "output_folder": DEFAULT_OUTPUT_FOLDER, + "inputs": { + "Input Dataset": {"name": "Input Dataset", "file": ["input"]} + }, + "expected": { + "output1": {"file": "expected_output", "comparator": "filecmp.cmp", "name": "output1"}, + "output2": {"file": "expected_output", "comparator": "filecmp.cmp", "name": "output2"} + } + } + + def __init__(self, name=None, base_path=".", workflow_filename="workflow.ga", inputs=None, params=None, + expected_outputs=None, output_folder=None, disable_cleanup=False, disable_assertions=False, + enable_logger=False, enable_debug=False): + + # init properties + self._base_path = None + self._filename = None + self._inputs = {} + self._params = {} + self._expected_outputs = {} + + self.enable_logger = enable_logger + self.enable_debug = enable_debug + + # set parameters + self.name = str(_uuid1()) if not name else name + self.set_base_path(base_path) + self.set_filename(workflow_filename) + if inputs is not None: + self.set_inputs(inputs) + if params is not None: + self.set_params(params) + if expected_outputs is not None: + self.set_expected_outputs(expected_outputs) + self.output_folder = _os.path.join(self.DEFAULT_OUTPUT_FOLDER, self.name) \ + if output_folder is None else output_folder + self.disable_cleanup = disable_cleanup + self.disable_assertions = disable_assertions + + def __str__(self): + return "WorkflowTestConfig: name={0}, file={1}, inputs=[{2}], expected_outputs=[{3}]".format( + self.name, self.filename, ",".join(list(self.inputs)), ",".join(list(self.expected_outputs))) + + def __repr__(self): + return self.__str__() + + @property + def base_path(self): + """ + The base path of the workflow file definition and the input and output datasets. + """ + return self._base_path + + def set_base_path(self, base_path): + """ Set the base path of the workflow file definition and the input and output datasets. + + :type base_path: str + :param base_path: a path within the local file system + """ + self._base_path = base_path + + @property + def filename(self): + """ + The filename (relative to ``base_paht``) of the workflow definition. + """ + return self._filename + + def set_filename(self, filename): + """ Set the filename (relative to ``base_path``) containing the workflow definition. + + :type filename: str + :param filename: the path (relative to the ``base_path``) to the ``.ga`` file + """ + self._filename = filename + + @property + def inputs(self): + """ + Return the dictionary which defines the mapping between workflow inputs and test datasets. + """ + return self._inputs + + def set_inputs(self, inputs): + """ + Update the mapping between workflow inputs and test datasets. + + :param inputs: dict + :return: a dictionary of mappings (see :class:`WorkflowTestCase`) + """ + for name, config in _iteritems(inputs): + self.add_input(name, config["file"], config["type"] if "type" in config else None) + + def add_input(self, name, path, type_=None): + """ + Add a new input mapping. + + :type name: str + :param name: the Galaxy label of an input + + :type path: str + :param path: the path (relative to the ``base_path``) of the file containing an input dataset + + :type type_: str + :param type_: the type of the input dataset + """ + if not name: + raise ValueError("Input name not defined") + self._inputs[name] = {"name": name, "file": path if isinstance(path, list) else [path], "type": type_} + + def remove_input(self, name): + """ + Remove an input mapping. + + :type name: str + :param name: the Galaxy label of an input + + """ + if name in self._inputs: + del self._inputs[name] + + def get_input(self, name): + """ + Return the input mapping for the input labeled as ``name``. + + :type name: str + :param name: the Galaxy label of the input + + :rtype: dict + :return: input configuration as dict (e.g., {'name': 'Input Dataset', 'file': "input.txt"}) + """ + return self._inputs.get(name) + + @property + def params(self): + """ + Return the dictionary containing the configured parameters (see :class:`WorkflowTestCase`) + + :rtype: dict + :return: a dictionary of configured parameters + """ + return self._params + + def set_params(self, params): + """ + Add a new set of parameters. + + :type params: dict + :param params: dictionary of parameters indexed by step id (see :class:`WorkflowTestCase`) + """ + for step_id, step_params in _iteritems(params): + for name, value in _iteritems(step_params): + self.add_param(step_id, name, value) + + def add_param(self, step_id, name, value): + """ + Add a new parameter to the step identified by ``step_id``. + + :type step_id: int + :param step_id: step index + + :type name: str + :param name: parameter name + + :type value: str + :param value: parameter value + """ + if step_id not in self._params: + self._params[step_id] = {} + self._params[step_id][name] = value + + def remove_param(self, step_id, name): + """ + Remove the parameter labeled ``name`` from the step identified by ``step_id``. + + :type step_id: int + :param step_id: step index + + :type name: str + :param name: name of the parameter to be removed + """ + if step_id in self._params: + del self._params[step_id][name] + + def get_params(self, step_id): + """ + Return the dictionary of parameters related to the step identified by 'step_id'. + + :type step_id: int + :param step_id: the step index + + :rtype: dict + :return: the dictionary of parameters related to the step identified by 'step_id' + """ + return self._params.get(step_id) + + def get_param(self, step_id, name): + """ + Return the value of a specific step parameter. + + :type step_id: int + :param step_id: the index of the step which the parameter is related to + + :type name: str + :param name: the name of the parameter to be returned + + :return: the value of the requested parameter + """ + step_params = self._params.get(step_id) + return step_params.get(name) if step_params else None + + @property + def expected_outputs(self): + """ + A dictionary to configure the expected output, i.e., the output which has to be compared + to the actual one produced by a workflow execution (see :class:`WorkflowTestCase`). + """ + return self._expected_outputs + + def set_expected_outputs(self, expected_outputs): + """ + Add a new set of expected outputs (see :class:`WorkflowTestCase`). + + :type expected_outputs: dict + :param expected_outputs: a dictionary structured as specified in :class:`WorkflowTestCase` + """ + for name, config in _iteritems(expected_outputs): + self.add_expected_output(name, config["file"], config.get("comparator")) + + def add_expected_output(self, name, filename, comparator="filecmp.cmp"): + """ + Add a new expected output to the workflow test configuration. + + :type name: str + :param name: the Galaxy name of the output which the expected dataset has to be mapped. + + :type filename: str + :param filename: the path (relative to the ``base_path``) of the file containing the expected output dataset + + :type comparator: str + :param comparator: a fully qualified name of a `comparator`function (see :class:`WorkflowTestCase`) + """ + if not name: + raise ValueError("Input name not defined") + self._expected_outputs[name] = {"name": name, "file": filename, "comparator": comparator} + + def remove_expected_output(self, name): + """ + Remove an expected output from the workflow test configuration. + + :type name: str + :param name: the Galaxy name of the output which the expected output has to be mapped + """ + if name in self._expected_outputs: + del self._expected_outputs[name] + + def get_expected_output(self, name): + """ + Return the configuration of an expected output. + + :type name: str + :param name: the Galaxy name of the output which the expected output has to be mapped. + + :rtype: dict + :return: a dictionary containing the configuration of the expected output as specified + in :class:`WorkflowTestCase` + """ + return self._expected_outputs.get(name) + + def to_dict(self): + """ + Return a dictionary representation of the current class instance. + + :rtype: dict + :return: + """ + return dict({ + "name": self.name, + "file": self.filename, + "inputs": {name: input_["file"][0] for name, input_ in _iteritems(self.inputs)}, + "params": self.params, + "expected": self.expected_outputs + }) + + def save(self, filename=None, file_format=FileFormats.YAML): + """ + Serialize this workflow test configuration to a file (YAML or JSON). + + :type filename: str + :param filename: absolute path of the file + + :type file_format: str + :param file_format: ``YAML`` or ``JSON`` + """ + if not filename and not self.filename: + filename = _os.path.splitext(self.DEFAULT_CONFIG_FILENAME)[0] + \ + "json" if FileFormats.is_json(file_format) else "yml" + if not filename: + filename, _ = _os.path.splitext(self.filename) + filename += "json" if FileFormats.is_json(file_format) else "yml" + self.dump(filename=filename, worflow_tests_config=self.to_dict(), file_format=file_format) + + @staticmethod + def load(filename=DEFAULT_CONFIG_FILENAME, + workflow_test_name=DEFAULT_WORKFLOW_CONFIG["name"], output_folder=None): + """ + Load the configuration of a workflow test suite or a single workflow test + from a YAML or JSON configuration file. + + :type filename: str + :param filename: the path of the file containing the suite definition + + :type workflow_test_name: str + :param workflow_test_name: the optional name of a workflow test (default is "workflow-test-case") + + :type output_folder: str + :param output_folder: the path of the output folder + + :rtype: :class:`WorkflowTestCase` + :return: the :class:`WorkflowTestCase` instance which matches the name + provided by the argument `workflow_test_name_` + """ + if _os.path.exists(filename): + file_configuration = _load_configuration(filename) + base_path = file_configuration.get("base_path", _os.path.dirname(_os.path.abspath(filename))) + output_folder = output_folder \ + or file_configuration.get("output_folder") \ + or WorkflowTestCase.DEFAULT_OUTPUT_FOLDER + # raise an exception if the workflow test we are searching for + # cannot be found within the configuration file. + if workflow_test_name not in file_configuration["workflows"]: + raise KeyError("WorkflowTest with name '{}' not found".format(workflow_test_name)) + + wft_config = file_configuration["workflows"][workflow_test_name] + wft_base_path = _os.path.join(base_path, wft_config.get("base_path", "")) + wft_output_folder = _os.path.join(output_folder, + wft_config.get("output_folder", workflow_test_name)) + # add the workflow + return WorkflowTestCase(name=workflow_test_name, + base_path=wft_base_path, workflow_filename=wft_config["file"], + inputs=wft_config["inputs"], params=wft_config.get("params", {}), + expected_outputs=wft_config["expected"], + output_folder=wft_output_folder, + enable_logger=file_configuration.get("enable_logger", False), + enable_debug=file_configuration.get("enable_debug", False)) + else: + raise ValueError("Filename '{0}' not found".format(filename)) + + @staticmethod + def dump(filename, worflow_tests_config, file_format=FileFormats.YAML): + """ + Write the configuration of a workflow test suite to a YAML or JSON file. + + :type filename: str + :param filename: the absolute path of the YAML or JSON configuration file + + :type worflow_tests_config: dict or list + :param worflow_tests_config: a dictionary which maps a workflow test name + to the corresponding configuration (:class:`WorkflowTestCase`) + or a list of :class:`WorkflowTestCase` instances + + :type file_format: str + :param file_format: ``YAML`` or ``JSON`` + """ + workflows = {} + config = worflow_tests_config.copy() if isinstance(worflow_tests_config, dict) else {} + config["workflows"] = workflows + + if isinstance(worflow_tests_config, dict): + worflow_tests_config = worflow_tests_config["workflows"].values() + elif not isinstance(worflow_tests_config, list): + raise ValueError( + "'workflow_tests_config' must be a configuration dict " + "or a list of 'WorkflowTestCase' instances") + + for worlflow in worflow_tests_config: + workflows[worlflow.name] = worlflow.to_dict() + with open(filename, "w") as f: + if FileFormats.is_yaml(file_format): + _yaml_dump(config, f) + else: + f.write(_json_dumps(config, indent=2)) + return config + + def run(self, galaxy_url=None, galaxy_api_key=None, output_folder=None, + enable_xunit=False, xunit_file=None, verbosity=0, + enable_logger=None, enable_debug=None, disable_cleanup=None): + _common.LoggerManager.configure_logging( + _logging.DEBUG if enable_debug is True else _logging.INFO if enable_logger is True else _logging.ERROR) + import wft4galaxy.runner as _runner + return _runner.WorkflowTestsRunner( + galaxy_url, galaxy_api_key).run(self, verbosity=verbosity, + output_folder=output_folder or self.output_folder, + report_format="xunit" if enable_xunit else None, + report_filename=xunit_file, + enable_logger=enable_logger, enable_debug=enable_debug, + disable_cleanup=disable_cleanup) + + +class WorkflowTestSuite(object): + """ + Represent a test suite. + """ + + def __init__(self, galaxy_url=None, galaxy_api_key=None, + output_folder=WorkflowTestCase.DEFAULT_OUTPUT_FOLDER, + enable_logger=True, enable_debug=False, disable_cleanup=False, disable_assertions=False): + """ + Create an instance of :class:`WorkflowTestSuite`. + + :type galaxy_url: str + :param galaxy_url: url of your Galaxy server instance. If ``none``, the environment variable + ``GALAXY_URL`` is used. An error is raised when such a variable cannot be found. + + :type galaxy_api_key: str + :param galaxy_api_key: an API key from your Galaxy server instance. If ``none``, the environment variable + ``GALAXY_API_KEY`` is used. An error is raised when such a variable cannot be found. + """ + + self.galaxy_url = galaxy_url + self.galaxy_api_key = galaxy_api_key + self.enable_logger = enable_logger + self.enable_debug = enable_debug + self.disable_cleanup = disable_cleanup + self.disable_assertions = disable_assertions + self.output_folder = output_folder + # instantiate the dict for worklofws + self._workflows = {} + + @property + def workflow_tests(self): + """ + Return the configuration of workflow tests associated to this test suite. + + :rtype: dict + :return: a dictionary which maps a `workflow test name` to the :class:`WorkflowTestCase` instance + representing its configuration + """ + return self._workflows.copy() + + def add_workflow_test(self, workflow_test_configuration): + """ + Add a new workflow test to this suite. + + :type workflow_test_configuration: :class:"WorkflowTestCase" + :param workflow_test_configuration: the :class:`WorkflowTestCase` instance + representing the workflow test configuration + """ + self._workflows[workflow_test_configuration.name] = workflow_test_configuration + + def remove_workflow_test(self, workflow_test): + """ + Remove a workflow test from this suite. + + :type workflow_test: str or :class:"WorkflowTestCase" + :param workflow_test: the name of the workflow test to be removed + or the :class:`WorkflowTestCase` instance representing the workflow test configuration + """ + if isinstance(workflow_test, WorkflowTestCase): + del self._workflows[workflow_test.name] + elif isinstance(workflow_test, _basestring): + del self._workflows[workflow_test] + + def dump(self, filename): + """ + Write a suite configuration to a file. + + :type filename: str + :param filename: the absolute path of the file + """ + # WorkflowTestCase.dump(filename, self._workflow_test_suite_configuration) + raise Exception("Not implemented yet!") + + @staticmethod + def load(filename, output_folder=None): + if _os.path.exists(filename): + # TODO: catch YAML parsing errors + file_configuration = _load_configuration(filename) + + base_path = file_configuration.get("base_path", _os.path.dirname(_os.path.abspath(filename))) + suite = WorkflowTestSuite( + galaxy_url=file_configuration.get("galaxy_url"), + galaxy_api_key=file_configuration.get("galaxy_api_key"), + enable_logger=file_configuration.get("enable_logger", False), + enable_debug=file_configuration.get("enable_debug", False), + disable_cleanup=file_configuration.get("disable_cleanup", False), + disable_assertions=file_configuration.get("disable_assertions", False), + output_folder=output_folder \ + or file_configuration.get("output_folder") \ + or WorkflowTestCase.DEFAULT_OUTPUT_FOLDER + ) + for wf_name, wf_config in _iteritems(file_configuration.get("workflows")): + wf_base_path = _os.path.join(base_path, wf_config.get("base_path", "")) + wf_config["output_folder"] = _os.path.join(suite.output_folder, + wf_config.get("output_folder", wf_name)) + # add the workflow + w = WorkflowTestCase(name=wf_name, base_path=wf_base_path, workflow_filename=wf_config["file"], + inputs=wf_config["inputs"], params=wf_config.get("params", {}), + expected_outputs=wf_config["expected"], + output_folder=wf_config["output_folder"]) + suite.add_workflow_test(w) + return suite + else: + raise ValueError("Filename '{0}' not found".format(filename)) + + def run(self, galaxy_url=None, galaxy_api_key=None, tests=None, output_folder=None, + enable_xunit=False, xunit_file=None, verbosity=0, + enable_logger=None, enable_debug=None, disable_cleanup=None): + _common.LoggerManager.configure_logging( + _logging.DEBUG if enable_debug is True else _logging.INFO if enable_logger is True else _logging.ERROR) + import wft4galaxy.runner as _runner + return _runner.WorkflowTestsRunner( + galaxy_url, galaxy_api_key).run(self, filter=tests, verbosity=verbosity, + output_folder=output_folder or self.output_folder, + report_format="xunit" if enable_xunit else None, + report_filename=xunit_file, + enable_logger=enable_logger, enable_debug=enable_debug, + disable_cleanup=disable_cleanup) + + +class WorkflowTestResult(object): + """ + Class for representing the result of a workflow test. + """ + + def __init__(self, test_id, workflow, inputs, outputs, output_history, expected_outputs, + missing_tools, results, output_file_map, + output_folder=WorkflowTestCase.DEFAULT_OUTPUT_FOLDER, errors=None): + self.test_id = test_id + self.workflow = workflow + self.inputs = inputs + self.outputs = outputs + self.errors = [] if errors is None else errors + self.output_history = output_history + self.expected_outputs = expected_outputs + self.output_folder = output_folder + self.missing_tools = missing_tools + self.output_file_map = output_file_map + self.results = results + + self.failed_outputs = {out[0]: out[1] + for out in _iteritems(self.results) + if not out[1]} + + def __str__(self): + return "Test {0}: workflow {1}, intputs=[{2}], outputs=[{3}]" \ + .format(self.test_id, self.workflow.name, + ",".join([i for i in self.inputs]), + ", ".join(["{0}: {1}".format(x[0], "OK" if x[1] else "ERROR") + for x in _iteritems(self.results)])) + + def __repr__(self): + return self.__str__() + + def failed(self): + """ + Assert whether the test is failed. + + :rtype: bool + :return: ``True`` if the test is failed; ``False`` otherwise. + """ + return len(self.failed_outputs) > 0 or len(self.errors) > 0 + + def passed(self): + """ + Assert whether the test is passed. + + :rtype: bool + :return: ``True`` if the test is passed; ``False`` otherwise. + """ + return not self.failed() + + def check_output(self, output): + """ + Assert whether the actual `output` is equal to the expected accordingly + to its associated `comparator` function. + + :type output: str or dict + :param output: output name + + :rtype: bool + :return: ``True`` if the test is passed; ``False`` otherwise. + """ + return self.results[output if isinstance(output, _basestring) else output.name] + + def check_outputs(self): + """ + Return a map of pairs :, where is ``True`` + if the actual `OUTPUT_NAME` is equal to the expected accordingly + to its associated `comparator` function. + + :rtype: dict + :return: map of output results + """ + return self.results + + +class WorkflowTestReportGenerator(object): + def generate_report(self, stream, report_format="plaintext"): + raise NotImplementedError() + + +class WorkflowTestSuiteResult(WorkflowTestReportGenerator, WorkflowTestResult): + def __init__(self, test_case_results): + self.test_case_results = test_case_results + + +class WorkflowTestCaseResult(WorkflowTestReportGenerator, WorkflowTestResult): + pass + + +def _load_configuration(config_filename): + with open(config_filename) as config_file: + workflows_conf = None + try: + workflows_conf = _yaml_load(config_file) + except ValueError as e: + _logger.error("Configuration file '%s' is not a valid YAML or JSON file", config_filename) + raise ValueError("Not valid format for the configuration file '%s'.", config_filename) + # update inputs/expected fields + for wf_name, wf in _iteritems(workflows_conf["workflows"]): + wf["inputs"] = _parse_dict(wf["inputs"]) + wf["expected"] = _parse_dict(wf["expected"]) + return workflows_conf + + +def _parse_dict(elements): + results = {} + for name, value in _iteritems(elements): + result = value + if isinstance(value, _basestring): + result = {"name": name, "file": value} + elif isinstance(value, dict): + result["name"] = name + else: + raise ValueError("Configuration error: %r", elements) + results[name] = result + return results diff --git a/wft4galaxy/runner.py b/wft4galaxy/runner.py new file mode 100644 index 0000000..09e01de --- /dev/null +++ b/wft4galaxy/runner.py @@ -0,0 +1,902 @@ +from __future__ import print_function +from future.utils import iteritems as _iteritems + +import os as _os +import sys as _sys +import copy as _copy +import time as _time +import shutil as _shutil +import logging as _logging +import unittest as _unittest +from uuid import uuid1 as _uuid1 +try: + from StringIO import StringIO as _StringIO +except ImportError: + from io import StringIO as _StringIO + +# XMLRunner dependencies +from xmlrunner.runner import XMLTestRunner +from xmlrunner.result import _XMLTestResult + +# wft4galaxy dependencies +import wft4galaxy.core as _core +from wft4galaxy import common as _common +from wft4galaxy import comparators as _comparators + +# the encoding name needs to be one of +# http://www.iana.org/assignments/character-sets/character-sets.xhtml +_UTF8 = 'UTF-8' + +# package level logger +_logger = _common.LoggerManager.get_logger(__name__) +_empty_logger = _common.LoggerManager.get_logger("aux_logger") +_h = _logging.StreamHandler() +_h.setFormatter(_logging.Formatter("%(message)s")) +_empty_logger.addHandler(_h) + + +class UnsupportedTestCaseException(Exception): + """ Represents an unsupported type of TestCase """ + + +class UnsupportedOuputFormatException(Exception): + """ Represents an format which the report generator doesn't support. """ + + +_SUPPORTED_REPORT_FORMATS = { + "plaintext": "txt", + "xunit": "xml" +} + + +class WorkflowTestsRunner(): + """ + Class responsible for running `WorkflowTestCase` and `WorkflowTestSuite` instances. + """ + + def __init__(self, galaxy_url=None, galaxy_api_key=None, + output_folder='.', stream=_sys.stderr, + descriptions=True, verbosity=1, elapsed_times=True): + self.galaxy_api_key = galaxy_api_key + + # create Galaxy instance + self._galaxy_instance = _common.get_galaxy_instance(galaxy_url, galaxy_api_key) + + # create WorkflowLoader + self._workflow_loader = _common.WorkflowLoader.get_instance(self._galaxy_instance) + + # logger + self._logger = _common.LoggerManager.get_logger(self) + + # runner reference + self._runner = _ExtendedXMLTestRunner(output=output_folder, + stream=stream, verbosity=verbosity, + descriptions=descriptions, elapsed_times=elapsed_times) + + def _setup(self, test, output_folder=None, verbosity=2, + disable_assertions=None, disable_cleanup=None, enable_logger=None, enable_debug=None): + """ Update runner configuration accordingly to the test configuration""" + + if enable_logger is not None: + test.enable_logger = enable_logger + if enable_debug is not None: + test.enable_debug = enable_debug + if disable_cleanup is not None: + test.disable_cleanup = disable_cleanup + if disable_assertions is not None: + test.disable_assertions = disable_assertions + + # update verbosity level + self._runner.verbosity = verbosity + + # update output folder + self._runner.output = test.output_folder if output_folder is None else output_folder + + # configure logger + _common.LoggerManager.configure_logging(_logging.ERROR) + if test.enable_logger or test.enable_debug: + _common.LoggerManager.configure_logging(_logging.DEBUG if test.enable_debug else _logging.INFO) + + def _make_wrappers(self, test, filter=None, output_folder=None, + disable_assertions=None, disable_cleanup=None, enable_logger=None, enable_debug=None): + + if isinstance(test, _core.WorkflowTestCase): + return WorkflowTestCaseRunner(self._galaxy_instance, self._workflow_loader, test) + elif isinstance(test, _core.WorkflowTestSuite): + return WorkflowTestSuiteRunner(self._galaxy_instance, self._workflow_loader, test, filter, + # output_folder=output_folder, + disable_assertions=disable_assertions, disable_cleanup=disable_cleanup, + enable_logger=enable_logger, enable_debug=enable_debug) + else: + raise UnsupportedTestCaseException("{} not supported".format(test.__class__.name)) + + def run(self, test, filter=None, stream=_sys.stderr, verbosity=2, + output_folder=None, output_suffix=None, + report_format=None, report_filename=None, + disable_assertions=None, disable_cleanup=None, enable_logger=None, enable_debug=None): + + """ Run a single test case or a suite of test cases. """ + + # deepcopy to avoid side effects + test = _copy.deepcopy(test) + + # update configuration + self._setup(test, output_folder=output_folder, verbosity=verbosity, + disable_assertions=disable_assertions, disable_cleanup=disable_cleanup, + enable_logger=enable_logger, enable_debug=enable_debug) + + # prepare wrappers + self._logger.debug("Creating unittest wrappers...") + test_wrapper = self._make_wrappers(test, filter, output_folder=output_folder, + disable_assertions=disable_assertions, disable_cleanup=disable_cleanup, + enable_logger=enable_logger, enable_debug=enable_debug) + self._logger.debug("Creating unittest wrappers: done") + + # run tests + test_result = None + try: + if report_filename and \ + not _os.path.isabs(report_filename) and not report_filename.startswith("./"): + report_filename = _os.path.join(output_folder, report_filename) + result = self._runner.run(test_wrapper, + report_format=report_format, + report_filename=report_filename) + + test_result = test_wrapper.test_result + if isinstance(test_wrapper, WorkflowTestSuiteRunner): + test_result = _core.WorkflowTestSuiteResult(test_wrapper.test_result) + + test_result.__class__ = type('Impl', ( + _core.WorkflowTestSuiteResult, _WorkflowTestResultReporterImpl, _core.WorkflowTestResult), + {"_test_result": result}) + except Exception as e: + self._logger.error(e) + if enable_debug: + self._logger.exception(e) + + finally: + if not test.disable_cleanup: + test_wrapper.cleanup(test.output_folder) + + # build and return the result wrapper + return test_result + + +class _WorkflowTestResultReporterImpl(_core.WorkflowTestReportGenerator): + """ Concrete class which implements the `generate_report` method.""" + + def __init__(self, test_result=None): + super(_WorkflowTestResultReporterImpl, self).__init__() + self._test_result = test_result + setattr(self, "generate_report", self.generate_report) + + def generate_report(self, output_file, report_format=list(_SUPPORTED_REPORT_FORMATS.keys())[0]): + self._test_result.generate_report(output_file, report_format) + + +class _ExtendedXMLTestRunner(XMLTestRunner): + """ Extends the XMLTestRunner to offer a custom XMLUnit support """ + + def __init__(self, output='.', outsuffix=None, stream=_sys.stderr, + descriptions=True, verbosity=2, elapsed_times=True): + super(_ExtendedXMLTestRunner, self).__init__(output, outsuffix, stream, descriptions, verbosity, elapsed_times) + self.encoding = _UTF8 + self.report_stream = self.stream + + def _make_result(self, test, report_format): + """ + Creates a TestResult object which will be used to store + information about the executed tests. + """ + return _ExtendedXMLTestResult( + test=test, + stream=self.report_stream, descriptions=self.descriptions, + verbosity=self.verbosity, elapsed_times=self.elapsed_times + ) + + def run(self, test, report_filename=None, report_format=None): + """ + Runs the given test case or test suite. + """ + report_data = None + try: + # Prepare the test execution + self._patch_standard_output(verbosity=self.verbosity) + result = self._make_result(test, report_format) + + # Print a nice header + self.report_stream.writeln() + self.report_stream.writeln('Running tests...') + self.report_stream.writeln(result.separator2) + + # Execute tests + start_time = _time.time() + test(result) + stop_time = _time.time() + time_taken = stop_time - start_time + + # Print results + result.printErrors() + self.report_stream.writeln(result.separator2) + run = result.testsRun + self.report_stream.writeln("Ran %d test%s in %.3fs" % (run, run != 1 and "s" or "", time_taken)) + self.report_stream.writeln() + + expectedFails = unexpectedSuccesses = skipped = 0 + try: + results = map(len, (result.expectedFailures, + result.unexpectedSuccesses, + result.skipped)) + except AttributeError: + pass + else: + expectedFails, unexpectedSuccesses, skipped = results + + # Error traces + infos = [] + if not result.wasSuccessful(): + self.report_stream.write("FAILED") + failed, errored = map(len, (result.failures, result.errors)) + if failed: + infos.append("failures={0}".format(failed)) + if errored: + infos.append("errors={0}".format(errored)) + else: + self.report_stream.write("OK") + + if skipped: + infos.append("skipped={0}".format(skipped)) + if expectedFails: + infos.append("expected failures={0}".format(expectedFails)) + if unexpectedSuccesses: + infos.append("unexpected successes={0}".format(unexpectedSuccesses)) + + if infos: + self.report_stream.writeln(" ({0})".format(", ".join(infos))) + else: + self.report_stream.write("\n") + + # Generate reports + if report_format is not None: + self.report_stream.writeln() + _logger.info('Generating reports (format: \'{}\') ...'.format(report_format)) + if not _os.path.exists(self.output): + _os.makedirs(self.output) + if report_filename is None: + report_filename = self._output_filename(test, report_format) + with open(report_filename, "w") as output_file: + result.generate_report(output_file, report_format) + _logger.info('Generated \'{}\' report available @ {}'.format(report_format, report_filename)) + finally: + self._restore_standard_output() + + return result + + def _patch_standard_output(self, verbosity=2): + self.report_stream = _DelegateIO(self.stream, verbosity) + + def _restore_standard_output(self): + self.report_stream = self.stream + + def _output_filename(self, test, report_format): + report_name = "WorkflowTest" + \ + ("Suite" if isinstance(test, WorkflowTestSuiteRunner) else "Case") + "Report-" + test.uuid + filename = _os.path.join( + self.output, + '%s.%s' % (report_name, _SUPPORTED_REPORT_FORMATS[report_format])) + _logger.debug("Output FILENAME: %s", filename) + return filename + + +class _ExtendedXMLTestResult(_XMLTestResult): + """ + Customize the `xmlrunner._XMLTestResult` class to support new features. + """ + + def __init__(self, test, stream=_sys.stderr, descriptions=1, verbosity=1, elapsed_times=True): + super(_ExtendedXMLTestResult, self).__init__( + stream, descriptions, verbosity, elapsed_times) + # store a reference to the test + self.test = test + # store output handlers + self._output_handlers = {} + # register base handlers + self.register_output_handler("xunit", self._generate_xml_report) + self.register_output_handler("plaintext", self._generate_txt_report) + + def register_output_handler(self, report_format, output_handler): + self._output_handlers[report_format] = output_handler + + def generate_report(self, stream, report_format=list(_SUPPORTED_REPORT_FORMATS.keys())[0]): + """ + Write a report, formatted accordingly to the param `report_format`, + to `stream`. Currently supported format are XML and plaintext. + + :param stream: the stream which the report has to be written to. + :param report_format: the format of the report to write. + :return: + """ + try: + self._output_handlers[report_format](stream) + except KeyError: + raise UnsupportedOuputFormatException("'{}' format not supported!".format(report_format)) + + def _generate_txt_report(self, stream): + """ + Write to `stream` the TEXT report for this `result` instance. + """ + stream.write(self.stream.getvalue()) + + def _generate_xml_report(self, stream): + """ + Generate and write to `stream` the XML report for this `result` instance. + """ + from xml.dom.minidom import Document + all_results = self._get_info_by_testcase() + + doc = Document() + parentElement = doc + + for suite, tests in all_results.items(): + suite_name = self.test.uuid + + # Build the XML file + testsuite = _XMLTestResult._report_testsuite( + suite_name, tests, doc, parentElement, self.properties + ) + xml_content = doc.toprettyxml( + indent='\t', + encoding=_UTF8 + ) + + # Assume that test_runner.output is a stream + stream.write(xml_content) + + +class WorkflowTestCaseRunner(_unittest.TestCase): + """ + Class responsible for launching a workflow test. + """ + + def __init__(self, galaxy_instance, workflow_loader, workflow_test_config, test_suite_runner=None): + self._galaxy_instance = galaxy_instance + self._workflow_loader = workflow_loader + self._workflow_test_config = workflow_test_config + self._test_suite_runner = test_suite_runner + self._disable_cleanup = workflow_test_config.disable_cleanup + self._disable_assertions = workflow_test_config.disable_assertions + self._output_folder = workflow_test_config.output_folder + self._base_path = workflow_test_config.base_path + self._test_cases = {} + self._uuid = None + self._galaxy_workflow = None + self._file_handler = None + self.test_result = None + + setattr(self, "test_" + workflow_test_config.name, self.run_test) + super(WorkflowTestCaseRunner, self).__init__("test_" + workflow_test_config.name) + + @property + def workflow_test_config(self): + """ + :rtype: :class:`WorkflowTestCase` + :return: the :class:`WorkflowTestCase` instance associated to this runner + """ + return self._workflow_test_config + + @property + def worflow_test_name(self): + return self._workflow_test_config.name + + def __str__(self): + return "Workflow Test: '{0}'".format(self._workflow_test_config.name) + + def to_string(self): + return "Workflow Test '{0}': testId={1}, workflow='{2}', input=[{3}], output=[{4}]" \ + .format(self._workflow_test_config.name, + self.uuid, + self._workflow_test_config.name, + ",".join(self._workflow_test_config.inputs), + ",".join(self._workflow_test_config.expected_outputs)) + + @property + def uuid(self): + """ + Get the current UUID or generate a new one. + + :type update: bool + :param update: ``True`` to force the generation of a new UUID + + :rtype: str + :return: a generated UUID + """ + if not self._uuid: + self._uuid = self._test_suite_runner.uuid if self._test_suite_runner is not None else str(_uuid1()) + return self._uuid + + def get_galaxy_workflow(self): + """ + Return the :class:`bioblend.galaxy.objects.wrappers.Workflow` instance associated to this runner. + + :rtype: :class:`bioblend.galaxy.objects.wrappers.Workflow` + :return: a :class:`bioblend.galaxy.objects.wrappers.Workflow` instance + """ + if not self._galaxy_workflow: + self._galaxy_workflow = self._workflow_loader.load_workflow( + self._workflow_test_config, + workflow_name_prefix=_core.WorkflowTestCase.DEFAULT_WORKFLOW_NAME_PREFIX, + workflow_name_suffix=self.uuid + ) + return self._galaxy_workflow + + def run_test(self, base_path=None, inputs=None, params=None, expected_outputs=None, + output_folder=None, disable_assertions=None, disable_cleanup=None, + enable_logger=None, enable_debug=None): + """ + Run the workflow test which this runner is associated to. + The parameters ``base_path``, ``inputs``, ``outputs``, ``expected_outputs`` + ``output_folder``, ``disable_assertions``, ``disable_cleanup``, ``enable_logger``, ``enable_debug`` + can be provided to override the corresponding defined in the :class:`WorkflowTestCase` instance + which this runner is related to (see :class:`WorkflowTestCase` for more details). + + :rtype: :class:`WorkflowTestResult` + :return: the :class:`WorkflowTestResult` instance which represents the test result + """ + + # update test settings + if enable_logger is None \ + and self._workflow_test_config is not None \ + and hasattr(self._workflow_test_config, "enable_logger"): + enable_logger = self._workflow_test_config.enable_logger + if enable_debug is None \ + and self._workflow_test_config is not None \ + and hasattr(self._workflow_test_config, "enable_debug"): + enable_debug = self._workflow_test_config.enable_debug + if disable_cleanup is None: + disable_cleanup = self._workflow_test_config.disable_cleanup + if disable_assertions is None: + disable_assertions = self._workflow_test_config.disable_assertions + + # set basepath + base_path = self._base_path if not base_path else base_path + + # load workflow + workflow = self.get_galaxy_workflow() + + # output folder + if output_folder is None: + output_folder = self._workflow_test_config.output_folder + + # update logger + if enable_logger or enable_debug: + _common.LoggerManager.update_log_level(_logging.DEBUG if enable_debug else _logging.INFO) + if disable_cleanup: + self._file_handler = _common.LoggerManager.enable_log_to_file( + output_folder=output_folder, + log_filename="-".join(["WorkflowTestCase", self.worflow_test_name, self.uuid]) + ".log") + else: + _common.LoggerManager.update_log_level(_logging.ERROR) + + _empty_logger.info("") + _logger.info("Running workflow testcase: %r", self._workflow_test_config.name) + _logger.debug("TestCase configuration: %r", self._workflow_test_config.__dict__) + + # check input_map + if inputs is None: + if len(self._workflow_test_config.inputs) > 0: + inputs = self._workflow_test_config.inputs + else: + raise ValueError("No input configured !!!") + + # check params + if params is None: + params = self._workflow_test_config.params + _logger.debug("Using default params") + + # check expected_output_map + if expected_outputs is None: + if len(self._workflow_test_config.expected_outputs) > 0: + expected_outputs = self._workflow_test_config.expected_outputs + else: + raise ValueError("No output configured !!!") + + # update config options + disable_cleanup = disable_cleanup if disable_cleanup is not None else self._disable_cleanup + disable_assertions = disable_assertions if disable_assertions is not None else self._disable_assertions + output_folder = output_folder if output_folder is not None else self._output_folder + + # uuid of the current test + test_uuid = self.uuid + + # store the current message + error_msg = None + + # test restul + test_result = None + + # check tools + errors = [] + missing_tools = self.find_missing_tools() + if len(missing_tools) == 0: + + try: + + # create a new history for the current test + history = self._galaxy_instance.histories.create( + "-".join([_core.WorkflowTestCase.DEFAULT_HISTORY_NAME_PREFIX, + self._workflow_test_config.name.replace(" ", ""), test_uuid])) + _logger.info("Create a history '%s' (id: %r)", history.name, history.id) + + # upload input data to the current history + # and generate the datamap INPUT --> DATASET + datamap = {} + for label, config in _iteritems(inputs): + datamap[label] = [] + for filename in config["file"]: + dataset_filename = filename if _os.path.isabs(filename) else _os.path.join(base_path, filename) + if config["type"]: + datamap[label].append( + history.upload_dataset(dataset_filename, file_type=config["type"])) + else: + datamap[label].append(history.upload_dataset(dataset_filename)) + + # run the workflow + _logger.info("Workflow '%s' (id: %s) running ...", workflow.name, workflow.id) + outputs, output_history = workflow.run(datamap, history, params=params, wait=True, polling_interval=0.5) + _logger.info("Workflow '%s' (id: %s) executed", workflow.name, workflow.id) + + # check outputs + results, output_file_map = self._check_outputs(base_path, outputs, expected_outputs, output_folder) + + # instantiate the result object + test_result = _core.WorkflowTestResult(test_uuid, workflow, inputs, outputs, output_history, + expected_outputs, missing_tools, results, output_file_map, + output_folder) + if test_result.failed(): + error_msg = "The actual output{0} {2} differ{1} from the expected one{0}." \ + .format("" if len(test_result.failed_outputs) == 1 else "s", + "" if len(test_result.failed_outputs) > 1 else "s", + ", ".join(["'{0}'".format(n) for n in test_result.failed_outputs])) + + except RuntimeError as e: + error_msg = "Runtime error: {0}".format(e.message) + errors.append(error_msg) + _logger.debug(error_msg) + + else: + error_msg = "Some workflow tools are not available in Galaxy: {0}".format( + ", ".join(["{0} (ver. {1})".format(t[0], t[1]) for t in missing_tools])) + errors.append(error_msg) + _logger.debug(error_msg) + + # instantiate the result object + if not test_result: + test_result = _core.WorkflowTestResult(test_uuid, workflow, inputs, [], None, + expected_outputs, missing_tools, {}, {}, output_folder, errors) + + # store result + self._test_cases[test_uuid] = test_result + if self._test_suite_runner: + self._test_suite_runner._add_test_result(test_result) + # FIXME + self.test_result = test_result + + # cleanup + if not disable_cleanup: + self.cleanup(output_folder) + + # disable file logger + if self._file_handler is not None: + _common.LoggerManager.remove_file_handler(self._file_handler, not disable_cleanup) + self._file_handler = None + + # raise error message + if error_msg: + if not disable_assertions: + raise AssertionError(error_msg) + + return test_result + + def find_missing_tools(self, workflow=None): + """ + Find tools required by the workflow to test and not installed on the configured Galaxy server. + + :type workflow: :class:`bioblend.galaxy.objects.wrappers.Workflow` + :param workflow: an optional instance of :class:`bioblend.galaxy.objects.wrappers.Workflow` + + :rtype: list + :return: the list of missing tools + """ + _logger.debug("Checking required tools ...") + workflow = self.get_galaxy_workflow() if not workflow else workflow + available_tools = self._galaxy_instance.tools.list() + missing_tools = [] + _logger.debug("Available tools: %s", ", ".join(["{0}, {1}".format(t.id, t.version) for t in available_tools])) + for order, step in _iteritems(workflow.steps): + if step.tool_id and len([t for t in available_tools + if t.id == step.tool_id and t.version == step.tool_version]) == 0: + missing_tools.append((step.tool_id, step.tool_version)) + _logger.debug("Missing tools: {0}".format("None" + if len(missing_tools) == 0 + else ", ".join(["{0} (version {1})" + .format(x[0], x[1]) for x in missing_tools]))) + _logger.debug("Checking required tools: DONE") + return missing_tools + + def _check_outputs(self, base_path, actual_outputs, expected_output_map, output_folder): + """ + Private method responsible for comparing actual to current outputs + + :param base_path: + :param actual_outputs: + :param expected_output_map: + :param output_folder: + + :rtype: tuple + :return: a tuple containing a :class:`WorkflowTestResult` as first element + and a map : as a second. + """ + results = {} + output_file_map = {} + + if not _os.path.isdir(output_folder): + _os.makedirs(output_folder) + + _logger.info("Checking test output: ...") + for output in actual_outputs: + if output.name in expected_output_map: + _logger.debug("Checking OUTPUT '%s' ...", output.name) + output_filename = _os.path.join(output_folder, output.name) + with open(output_filename, "wb") as out_file: + output.download(out_file) + output_file_map[output.name] = {"dataset": output, "filename": output_filename} + _logger.debug( + "Downloaded output {0}: dataset_id '{1}', filename '{2}'".format(output.name, output.id, + output_filename)) + config = expected_output_map[output.name] + comparator_fn = config.get("comparator", None) + _logger.debug("Configured comparator function: %s", comparator_fn) + comparator = _comparators.load_comparator(comparator_fn) \ + if comparator_fn else _comparators.base_comparator + if comparator: + expected_output_filename = config["file"] if _os.path.isabs(config["file"]) \ + else _os.path.join(base_path, config["file"]) + result = comparator(output_filename, expected_output_filename) + _logger.debug( + "Output '{0}' {1} the expected: dataset '{2}', actual-output '{3}', expected-output '{4}'" + .format(output.name, "is equal to" if result else "differs from", + output.id, output_filename, expected_output_filename)) + results[output.name] = result + _logger.debug("Checking OUTPUT '%s': DONE", output.name) + _logger.info("Checking test output: DONE") + return results, output_file_map + + def cleanup(self, output_folder=None): + """ + Perform a complete clean up of the data produced during the execution of a workflow test, + i.e., the uploaded workflow and the created history are removed from Galaxy and the actual + output datasets (downloaded from Galaxy) are deleted from the output path of the local file system. + """ + _logger.debug("Cleanup of workflow test '%s'...", self._uuid) + for test_uuid, test_result in _iteritems(self._test_cases): + if test_result.output_history: + self._galaxy_instance.histories.delete(test_result.output_history.id) + self.cleanup_output_folder(test_result) + if self._galaxy_workflow: + self._workflow_loader.unload_workflow(self._galaxy_workflow.id) + self._galaxy_workflow = None + _logger.debug("Cleanup of workflow test '%s': DONE", self._uuid) + if output_folder and _os.path.exists(output_folder): + _shutil.rmtree(output_folder) + _logger.debug("Deleted WF output folder '%s': DONE", output_folder) + + def cleanup_output_folder(self, test_result=None): + """ + Perform a clean up of the temporary files produced during the workflow test execution. + """ + test_results = self._test_cases.values() if not test_result else [test_result] + for _test in test_results: + for output_name, output_map in _iteritems(_test.output_file_map): + _logger.debug("Cleaning output folder: %s", output_name) + if _os.path.exists(output_map["filename"]): + _os.remove(output_map["filename"]) + _logger.debug("Deleted output file '%s'.", output_map["filename"]) + + +class WorkflowTestSuiteRunner(_unittest.TestSuite): + """ + Represent a test suite. + """ + + def __init__(self, galaxy_instance, workflow_loader, suite, filter=None, output_folder=".", + enable_logger=None, enable_debug=None, disable_cleanup=None, disable_assertions=None): + + """ + Create an instance of :class:`WorkflowTestSuite`. + + :type galaxy_url: str + :param galaxy_url: url of your Galaxy server instance. If ``none``, the environment variable + ``GALAXY_URL`` is used. An error is raised when such a variable cannot be found. + + :type galaxy_api_key: str + :param galaxy_api_key: an API key from your Galaxy server instance. If ``none``, the environment variable + ``GALAXY_API_KEY`` is used. An error is raised when such a variable cannot be found. + """ + + super(WorkflowTestSuiteRunner, self).__init__() + self._uuid = str(_uuid1()) + self._suite = suite + self._workflows = {} + self._workflow_runners = [] + self._workflow_test_results = [] + self._galaxy_instance = None + + # log file handler + self._file_handler = None + # initialize the galaxy instance + self._galaxy_instance = galaxy_instance + # initialize the workflow loader + self._workflow_loader = workflow_loader + + self.disable_cleanup = suite.disable_cleanup + self.disable_assertions = suite.disable_assertions + self.enable_logger = suite.enable_logger + self.enable_debug = suite.enable_debug + + _update_config(self, output_folder=output_folder, enable_logger=enable_logger, enable_debug=enable_debug, + disable_cleanup=disable_cleanup, disable_assertions=disable_assertions) + + for test_config in suite.workflow_tests.values(): + test_config.disable_assertions = False + if not filter or len(filter) == 0 or test_config.name in filter: + runner = self._create_test_runner(test_config, + enable_logger=enable_logger, enable_debug=enable_debug, + disable_cleanup=disable_cleanup, + disable_assertions=disable_assertions) + self.addTest(runner) + + @property + def uuid(self): + return self._uuid + + def __str__(self): + return "Suite-{}".format(self.uuid) + + @property + def galaxy_instance(self): + """ + :rtype: :class:`bioblend.galaxy.objects.GalaxyInstance` + :return: the :class:`bioblend.galaxy.objects.GalaxyInstance` instance used to communicate with a Galaxy server + """ + return self._galaxy_instance + + @property + def workflow_loader(self): + """ + :rtype: :class:`WorkflowTestLoader` + :return: the :class:`WorkflowTestLoader` instance used by this suite + """ + return self._workflow_loader + + def _add_test_result(self, test_result): + """ + Private method to publish a test result. + + :type test_result: :class:'WorkflowTestResult' + :param test_result: an instance of :class:'WorkflowTestResult' + """ + self._workflow_test_results.append(test_result) + + def _create_test_runner(self, workflow_test_config, + enable_logger=None, enable_debug=None, disable_cleanup=None, disable_assertions=None): + """ + Private method which creates a test runner associated to this suite. + + :type workflow_test_config: :class:'WorkflowTestConfig' + :param workflow_test_config: + + :rtype: :class:'WorkflowTestCaseRunner' + :return: the created :class:'WorkflowTestResult' instance + """ + # update test config + _update_config(workflow_test_config, + enable_logger=enable_logger, enable_debug=enable_debug, + disable_cleanup=disable_cleanup, disable_assertions=disable_assertions) + # create a new runner instance + runner = WorkflowTestCaseRunner(self.galaxy_instance, self.workflow_loader, workflow_test_config, self) + self._workflow_runners.append(runner) + return runner + + @property + def test_result(self): + return self.get_workflow_test_results() + + def get_workflow_test_results(self, workflow_id=None): + """ + Return the list of :class:`WorkflowTestResult` instances representing the results of + the workflow tests executed by this suite. Such a list can be filtered by workflow, + specified as ``workflow_id``. + + :type workflow_id: str + :param workflow_id: the optional ID of a workflow + + :rtype: list + :return: a list of :class:`WorkflowTestResult` instances + """ + return list([w for w in self._workflow_test_results if w.id == workflow_id] if workflow_id + else self._workflow_test_results) + + def cleanup(self, output_folder=None): + """ + Perform the clean up of the workflow and history created on the Galaxy server + """ + for runner in self._workflow_runners: + runner.cleanup() + if self._file_handler is not None: + _common.LoggerManager.remove_file_handler(self._file_handler, True) + # remove output folder if empty + if output_folder and _os.path.exists(output_folder) and \ + _os.path.isdir(output_folder) and len(_os.listdir(output_folder)) == 0: + try: + _os.rmdir(output_folder) + _logger.debug("Deleted empty output folder: '%s'", output_folder) + except OSError as e: + _logger.debug("Deleted empty output folder '%s' failed: ", e.message) + + +class _DelegateIO(object): + """ + This class defines an object that captures whatever is written to a stream or file. + """ + + def __init__(self, delegate, verbosity=2): + self._captured = _StringIO() + self.delegate = delegate + self.verbosity = verbosity + + def write(self, text): + self._captured.write(text) + if self.verbosity > 0: + self.delegate.write(text) + + def writeln(self, text=None): + if text is not None: + self._captured.write(text) + self._captured.write('\n') + if self.verbosity > 0: + self.delegate.writeln(text) + + def __getattr__(self, attr): + return getattr(self._captured, attr) + + +def _update_config(config, enable_logger=None, output_folder=None, + enable_debug=None, disable_cleanup=None, disable_assertions=None): + if enable_logger is not None: + config.enable_logger = enable_logger + if enable_debug is not None: + config.enable_debug = enable_debug + if disable_cleanup is not None: + config.disable_cleanup = disable_cleanup + if disable_assertions is not None: + config.disable_assertions = disable_assertions + if output_folder is not None: + config.output = output_folder + + +def cleanup_test_workflows(galaxy_url=None, galaxy_api_key=None): + _logger.debug("Cleaning workflow library ...") + galaxy_instance = _common.get_galaxy_instance(galaxy_url, galaxy_api_key) + workflow_loader = _common.WorkflowLoader.get_instance(galaxy_instance) + wflist = galaxy_instance.workflows.list() + workflows = [w for w in wflist if _core.WorkflowTestCase.DEFAULT_WORKFLOW_NAME_PREFIX in w.name] + for wf in workflows: + workflow_loader.unload_workflow(wf.id) + + +def cleanup_test_workflow_data(galaxy_url=None, galaxy_api_key=None): + _logger.debug("Cleaning saved histories ...") + galaxy_instance = _common.get_galaxy_instance(galaxy_url, galaxy_api_key) + hslist = galaxy_instance.histories.list() + for history in [h for h in hslist if _core.WorkflowTestCase.DEFAULT_HISTORY_NAME_PREFIX in h.name]: + galaxy_instance.histories.delete(history.id) diff --git a/wft4galaxy/wrapper.py b/wft4galaxy/wrapper.py new file mode 100644 index 0000000..6b92a2f --- /dev/null +++ b/wft4galaxy/wrapper.py @@ -0,0 +1,622 @@ +from __future__ import print_function +from future.utils import iteritems as _iteritems + +import os as _os +import sys as _sys +import uuid as _uuid +import json as _json +import operator as _operator +import collections as _collections + +from bioblend import ConnectionError +# from ruamel.yaml import round_trip_dump as _round_trip_dump +#from ruamel.yaml.comments import CommentedMap as _CommentedMap +from .common import DynamicObject as _CommentedMap + +# BioBlend dependecies +from bioblend.galaxy.tools import ToolClient as _ToolClient + +# wft4galaxy dependencies +import wft4galaxy.common as _common + +# set logger +from wft4galaxy.common import TestConfigError + +_logger = _common.LoggerManager.get_logger(__name__) + +# Default folder where tool configuration is downloaded +DEFAULT_TOOLS_FOLDER = ".tools" + + +class Workflow(object): + """ + Display workflow information which are relevant to configure a workflow test. + """ + + def __init__(self, definition, inputs, params, outputs): + self.definition = definition + self.inputs = inputs + self.params = params + self.outputs = outputs + self._logger = _common.LoggerManager.get_logger(self.__class__.__name__) + + def show_inputs(self, stream=_sys.stdout): + """ + Print workflow inputs to file. + """ + max_chars = max([len(x["name"]) for x in self.inputs]) + for i in self.inputs: + print("- ", i["name"].ljust(max_chars), + (" # " + i["description"] if len(i["description"]) > 0 else ""), file=stream) + + def show_params(self, stream=_sys.stdout): + """ + Print parameters needed by workflow tools to file. + """ + # print(_round_trip_dump(self.params), file=stream) + print(_json.dumps(self.params, indent=4), file=stream) + + def show_outputs(self, stream=_sys.stdout): + """ + Print workflow outputs (indexed by workflow step) to file. + """ + for step_id, step_outputs in _iteritems(self.outputs): + print( + "'{0}': {1}".format(step_id, ", ".join([x["label"] for x in step_outputs.values()])), + file=stream) + + @staticmethod + def load(filename, galaxy_url=None, galaxy_api_key=None, tools_folder=DEFAULT_TOOLS_FOLDER): + """ + Return the :class:`Workflow` instance related to the workflow defined in ``filename`` + + :type filename: str + :param filename: the path of the ``.ga`` workflow definition + + :type galaxy_url: str + :param galaxy_url: url of your Galaxy server instance. + + :type galaxy_api_key: str + :param galaxy_api_key: an API key from your Galaxy server instance. + + :type tools_folder: str + :param tools_folder: optional temp folder where tool definitions are downloaded (``.tools`` by default) + + :rtype: :class:`Workflow` + :return: the :class:`Workflow` instance related to the workflow defined in ``filename`` + """ + return get_workflow_info(filename=filename, tools_folder=tools_folder, + galaxy_url=galaxy_url, galaxy_api_key=galaxy_api_key) + + +def get_workflow_info(filename, tools_folder=DEFAULT_TOOLS_FOLDER, galaxy_url=None, + galaxy_api_key=None): + definition, inputs, params, expected_outputs = _get_workflow_info(filename=filename, + tool_folder=tools_folder, + galaxy_url=galaxy_url, + galaxy_api_key=galaxy_api_key) + return Workflow(definition, inputs, params, expected_outputs) + + +def _get_workflow_info(filename, galaxy_url, galaxy_api_key, tool_folder=DEFAULT_TOOLS_FOLDER): + inputs = [] + params = _CommentedMap() + outputs = {} + + # loading wf info start + _logger.debug("Loading workflow definition from %s file...", filename) + + # setup galaxy instance + galaxy_instance = _common.get_galaxy_instance(galaxy_url, galaxy_api_key) + galaxy_tool_client = _ToolClient(galaxy_instance.gi) # get the non-object version of the GI + + if not _os.path.exists(DEFAULT_TOOLS_FOLDER): + _os.makedirs(DEFAULT_TOOLS_FOLDER) + + with open(filename) as fp: + wf_config = _json.load(fp) + + for sid, step in _iteritems(wf_config["steps"]): + # tool = gi.tools.get() + + _logger.debug("Processing step '%s' -- '%s'", sid, step["name"]) + + # an input step.... + if not step["tool_id"] and step["type"] == "data_input": + for input_ in step["inputs"]: + _logger.debug("Processing input: '%s' (%s)", input_["name"], input_["description"]) + inputs.append(input_) + + # a processing step (with outputs) ... + if step["tool_id"] and step["type"] == "tool": + + # tool parameters + tool_params = _CommentedMap() + + # process tool info to extract parameters + tool_id = step["tool_id"] + # tool = galaxy_instance.tools.get(tool_id) + ## LP: re-write this using the bioblend.objects API to fetch the tool + # inputs. See the comment above `def _process_tool_param_element` + # tool_config_xml = _os.path.basename(tool.wrapped["config_file"]) + # _logger.debug("Processing step tool '%s'", tool_id) + # + # try: + # _logger.debug("Download TOOL '%s' definition file XML: %s....", tool_id, tool_config_xml) + # targz_filename = _os.path.join(DEFAULT_TOOLS_FOLDER, tool_id + ".tar.gz") + # targz_content = galaxy_tool_client._get(_os.path.join(tool_id, "download"), json=False) + # if targz_content.status_code == 200: + # with open(targz_filename, "w") as tfp: + # tfp.write(targz_content.content) + # tar = _tarfile.open(targz_filename) + # tar.extractall(path=tool_folder) + # tar.close() + # _os.remove(targz_filename) + # _logger.debug("Download TOOL '%s' definition file XML: %s....: DONE", tool_id, tool_config_xml) + # else: + # _logger.debug("Download TOOL '%s' definition file XML: %s....: ERROR %r", + # tool_id, tool_config_xml, targz_content.status_code) + # + # tool_config_xml = _os.path.join(DEFAULT_TOOLS_FOLDER, tool_config_xml) + # if _os.path.exists(tool_config_xml): + # tree = _etree.parse(tool_config_xml) + # root = tree.getroot() + # inputs_el = root.find("inputs") + # for input_el in inputs_el: + # _process_tool_param_element(input_el, tool_params) + # if len(tool_params) > 0: + # params.insert(int(sid), sid, tool_params) + # + # except _StandardError as e: + # _logger.debug("Download TOOL '%s' definition file XML: %s....: ERROR", tool_id, tool_config_xml) + # _logger.error(e) + + # process + outputs[str(sid)] = {} + for output in step["workflow_outputs"]: + outputs[str(sid)][output["uuid"]] = output + + # loading wf info end + _logger.debug("Workflow definition loaded from %s file...", filename) + + # return loaded info + return wf_config, inputs, params, outputs + + +# XXX: TODO +# This can be replaced by using the object oriented bioblend API to fetch +# the tool inputs directly through the API. +# +# Try something like: +# t = gi.tools.get("ChangeCase", io_details=True) +# The process t.wrapped['inputs'] to get this information. +# +def _process_tool_param_element(input_el, tool_params): + """ + Parameter types: + 1) text X + 2) integer and float X + 3) boolean X + 4) data X (no default option) + 5) select ~ (not with OPTIONS) + 6) data_column X (uses the default_value attribute) + 7) data_collection X (no default option) + 8) drill_down X (no default option) + 9) color X + + Tag