fastpdb
Advanced tools
| --- | ||
| name: "CI & CD" | ||
| on: | ||
| workflow_dispatch: | ||
| pull_request: | ||
| release: | ||
| types: | ||
| - published | ||
| jobs: | ||
| wheels: | ||
| name: "Build & test wheel" | ||
| strategy: | ||
| matrix: | ||
| os: [ubuntu-latest, windows-latest, macos-latest] | ||
| py-version: ["3.9", "3.10", "3.11"] | ||
| runs-on: ${{ matrix.os }} | ||
| defaults: | ||
| run: | ||
| shell: bash | ||
| steps: | ||
| - uses: actions/checkout@v3 | ||
| - uses: actions/setup-python@v3 | ||
| with: | ||
| python-version: ${{ matrix.py-version }} | ||
| - name: Install Rust toolchain | ||
| uses: actions-rs/toolchain@v1 | ||
| with: | ||
| toolchain: stable | ||
| override: true | ||
| - name: Install dependencies | ||
| run: pip install "maturin>=0.14,<0.15" "oldest-supported-numpy" pytest | ||
| - name: Build wheel | ||
| run: maturin build --release -i python -o dist | ||
| - name: Install wheel | ||
| run: pip install .//dist//*.whl | ||
| - name: Test wheel | ||
| run: pytest --assert=plain | ||
| - uses: actions/upload-artifact@v3 | ||
| with: | ||
| path: .//dist//*.whl | ||
| sdist: | ||
| name: Build & test source distribution | ||
| runs-on: ubuntu-latest | ||
| defaults: | ||
| run: | ||
| shell: bash | ||
| steps: | ||
| - uses: actions/checkout@v3 | ||
| - uses: actions/setup-python@v3 | ||
| with: | ||
| python-version: "3.11" | ||
| - name: Install dependencies | ||
| run: pip install "maturin>=0.14,<0.15" pytest | ||
| - name: Build source distribution | ||
| run: maturin sdist -o dist | ||
| - name: Install source distribution | ||
| run: pip install .//dist//*.tar.gz | ||
| - name: Test source distribution | ||
| run: pytest --assert=plain | ||
| - uses: actions/upload-artifact@v3 | ||
| with: | ||
| path: dist//*.tar.gz | ||
| upload: | ||
| name: Upload to GitHub Releases & PyPI | ||
| permissions: | ||
| contents: write | ||
| needs: [wheels, sdist] | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - uses: actions/download-artifact@v3 | ||
| with: | ||
| name: artifact | ||
| path: dist | ||
| - name: List distributions to be uploaded | ||
| run: ls dist | ||
| - name: Upload to GitHub Releases | ||
| uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 | ||
| if: github.event_name == 'release' && github.event.action == 'published' | ||
| with: | ||
| files: dist//* | ||
| - name: Upload to PyPI | ||
| uses: pypa/gh-action-pypi-publish@c7f29f7adef1a245bd91520e94867e5c6eedddcc | ||
| if: github.event_name == 'release' && github.event.action == 'published' | ||
| with: | ||
| password: ${{ secrets.PYPI_TOKEN }} |
+342
| # This file is automatically @generated by Cargo. | ||
| # It is not intended for manual editing. | ||
| version = 3 | ||
| [[package]] | ||
| name = "autocfg" | ||
| version = "1.1.0" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" | ||
| [[package]] | ||
| name = "bitflags" | ||
| version = "1.3.2" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" | ||
| [[package]] | ||
| name = "cfg-if" | ||
| version = "0.1.10" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" | ||
| [[package]] | ||
| name = "cfg-if" | ||
| version = "1.0.0" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" | ||
| [[package]] | ||
| name = "fastpdb" | ||
| version = "1.1.0" | ||
| dependencies = [ | ||
| "ndarray", | ||
| "numpy", | ||
| "pyo3", | ||
| ] | ||
| [[package]] | ||
| name = "indoc" | ||
| version = "0.3.6" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "47741a8bc60fb26eb8d6e0238bbb26d8575ff623fdc97b1a2c00c050b9684ed8" | ||
| dependencies = [ | ||
| "indoc-impl", | ||
| "proc-macro-hack", | ||
| ] | ||
| [[package]] | ||
| name = "indoc-impl" | ||
| version = "0.3.6" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "ce046d161f000fffde5f432a0d034d0341dc152643b2598ed5bfce44c4f3a8f0" | ||
| dependencies = [ | ||
| "proc-macro-hack", | ||
| "proc-macro2", | ||
| "quote", | ||
| "syn", | ||
| "unindent", | ||
| ] | ||
| [[package]] | ||
| name = "instant" | ||
| version = "0.1.12" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" | ||
| dependencies = [ | ||
| "cfg-if 1.0.0", | ||
| ] | ||
| [[package]] | ||
| name = "libc" | ||
| version = "0.2.139" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" | ||
| [[package]] | ||
| name = "lock_api" | ||
| version = "0.4.9" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" | ||
| dependencies = [ | ||
| "autocfg", | ||
| "scopeguard", | ||
| ] | ||
| [[package]] | ||
| name = "matrixmultiply" | ||
| version = "0.3.2" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "add85d4dd35074e6fedc608f8c8f513a3548619a9024b751949ef0e8e45a4d84" | ||
| dependencies = [ | ||
| "rawpointer", | ||
| ] | ||
| [[package]] | ||
| name = "ndarray" | ||
| version = "0.15.6" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" | ||
| dependencies = [ | ||
| "matrixmultiply", | ||
| "num-complex", | ||
| "num-integer", | ||
| "num-traits", | ||
| "rawpointer", | ||
| ] | ||
| [[package]] | ||
| name = "num-complex" | ||
| version = "0.4.3" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" | ||
| dependencies = [ | ||
| "num-traits", | ||
| ] | ||
| [[package]] | ||
| name = "num-integer" | ||
| version = "0.1.45" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" | ||
| dependencies = [ | ||
| "autocfg", | ||
| "num-traits", | ||
| ] | ||
| [[package]] | ||
| name = "num-traits" | ||
| version = "0.2.15" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" | ||
| dependencies = [ | ||
| "autocfg", | ||
| ] | ||
| [[package]] | ||
| name = "numpy" | ||
| version = "0.14.1" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "09c15af63aa0c74e0f7230d4e95d9a3d71a23449905f30f50b055df9a6a6a3e6" | ||
| dependencies = [ | ||
| "cfg-if 0.1.10", | ||
| "libc", | ||
| "ndarray", | ||
| "num-complex", | ||
| "num-traits", | ||
| "pyo3", | ||
| ] | ||
| [[package]] | ||
| name = "once_cell" | ||
| version = "1.17.0" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" | ||
| [[package]] | ||
| name = "parking_lot" | ||
| version = "0.11.2" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" | ||
| dependencies = [ | ||
| "instant", | ||
| "lock_api", | ||
| "parking_lot_core", | ||
| ] | ||
| [[package]] | ||
| name = "parking_lot_core" | ||
| version = "0.8.6" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" | ||
| dependencies = [ | ||
| "cfg-if 1.0.0", | ||
| "instant", | ||
| "libc", | ||
| "redox_syscall", | ||
| "smallvec", | ||
| "winapi", | ||
| ] | ||
| [[package]] | ||
| name = "paste" | ||
| version = "0.1.18" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880" | ||
| dependencies = [ | ||
| "paste-impl", | ||
| "proc-macro-hack", | ||
| ] | ||
| [[package]] | ||
| name = "paste-impl" | ||
| version = "0.1.18" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6" | ||
| dependencies = [ | ||
| "proc-macro-hack", | ||
| ] | ||
| [[package]] | ||
| name = "proc-macro-hack" | ||
| version = "0.5.20+deprecated" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" | ||
| [[package]] | ||
| name = "proc-macro2" | ||
| version = "1.0.51" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" | ||
| dependencies = [ | ||
| "unicode-ident", | ||
| ] | ||
| [[package]] | ||
| name = "pyo3" | ||
| version = "0.14.5" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "35100f9347670a566a67aa623369293703322bb9db77d99d7df7313b575ae0c8" | ||
| dependencies = [ | ||
| "cfg-if 1.0.0", | ||
| "indoc", | ||
| "libc", | ||
| "parking_lot", | ||
| "paste", | ||
| "pyo3-build-config", | ||
| "pyo3-macros", | ||
| "unindent", | ||
| ] | ||
| [[package]] | ||
| name = "pyo3-build-config" | ||
| version = "0.14.5" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "d12961738cacbd7f91b7c43bc25cfeeaa2698ad07a04b3be0aa88b950865738f" | ||
| dependencies = [ | ||
| "once_cell", | ||
| ] | ||
| [[package]] | ||
| name = "pyo3-macros" | ||
| version = "0.14.5" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "fc0bc5215d704824dfddddc03f93cb572e1155c68b6761c37005e1c288808ea8" | ||
| dependencies = [ | ||
| "pyo3-macros-backend", | ||
| "quote", | ||
| "syn", | ||
| ] | ||
| [[package]] | ||
| name = "pyo3-macros-backend" | ||
| version = "0.14.5" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "71623fc593224afaab918aa3afcaf86ed2f43d34f6afde7f3922608f253240df" | ||
| dependencies = [ | ||
| "proc-macro2", | ||
| "pyo3-build-config", | ||
| "quote", | ||
| "syn", | ||
| ] | ||
| [[package]] | ||
| name = "quote" | ||
| version = "1.0.23" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" | ||
| dependencies = [ | ||
| "proc-macro2", | ||
| ] | ||
| [[package]] | ||
| name = "rawpointer" | ||
| version = "0.2.1" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" | ||
| [[package]] | ||
| name = "redox_syscall" | ||
| version = "0.2.16" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" | ||
| dependencies = [ | ||
| "bitflags", | ||
| ] | ||
| [[package]] | ||
| name = "scopeguard" | ||
| version = "1.1.0" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" | ||
| [[package]] | ||
| name = "smallvec" | ||
| version = "1.10.0" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" | ||
| [[package]] | ||
| name = "syn" | ||
| version = "1.0.107" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" | ||
| dependencies = [ | ||
| "proc-macro2", | ||
| "quote", | ||
| "unicode-ident", | ||
| ] | ||
| [[package]] | ||
| name = "unicode-ident" | ||
| version = "1.0.6" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" | ||
| [[package]] | ||
| name = "unindent" | ||
| version = "0.1.11" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c" | ||
| [[package]] | ||
| name = "winapi" | ||
| version = "0.3.9" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" | ||
| dependencies = [ | ||
| "winapi-i686-pc-windows-gnu", | ||
| "winapi-x86_64-pc-windows-gnu", | ||
| ] | ||
| [[package]] | ||
| name = "winapi-i686-pc-windows-gnu" | ||
| version = "0.4.0" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" | ||
| [[package]] | ||
| name = "winapi-x86_64-pc-windows-gnu" | ||
| version = "0.4.0" | ||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||
| checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" |
+1
-4
| [package] | ||
| name = "fastpdb" | ||
| version = "1.0.1" | ||
| version = "1.1.0" | ||
| edition = "2018" | ||
| [package.metadata.maturin] | ||
| python-source = "python-src" | ||
| [dependencies] | ||
@@ -10,0 +7,0 @@ numpy = "0.14" |
+2
-2
| Metadata-Version: 2.1 | ||
| Name: fastpdb | ||
| Version: 1.0.1 | ||
| Version: 1.1.0 | ||
| Classifier: Development Status :: 5 - Production/Stable | ||
@@ -21,4 +21,4 @@ Classifier: Intended Audience :: Science/Research | ||
| Description-Content-Type: text/x-rst; charset=UTF-8 | ||
| Project-URL: homepage, https://github.com/biotite-dev/fastpdb | ||
| Project-URL: repository, https://github.com/biotite-dev/fastpdb | ||
| Project-URL: homepage, https://github.com/biotite-dev/fastpdb | ||
@@ -25,0 +25,0 @@ .. image:: https://raw.githubusercontent.com/biotite-dev/fastpdb/main/logo.svg |
+8
-2
| [project] | ||
| name = "fastpdb" | ||
| version = "1.0.1" | ||
| version = "1.1.0" | ||
| description = "A high performance drop-in replacement for Biotite's PDBFile." | ||
@@ -34,5 +34,11 @@ readme = "README.rst" | ||
| [tool.maturin] | ||
| exclude = ["*.svg", "tests/"] | ||
| python-source = "python-src" | ||
| [build-system] | ||
| requires = ["maturin>=0.11,<0.12"] | ||
| requires = [ | ||
| "maturin>=0.14,<0.15", | ||
| "oldest-supported-numpy" | ||
| ] | ||
| build-backend = "maturin" |
| __name__ = "fastpdb" | ||
| __author__ = "Patrick Kunzmann" | ||
| __all__ = ["PDBFile"] | ||
| __version__ = "1.0.1" | ||
| __version__ = "1.1.0" | ||
| import os | ||
| import numpy as np | ||
| import biotite | ||
| from biotite.file import is_text | ||
| import biotite.structure as struc | ||
| import biotite.structure.io.pdb as pdb | ||
| from biotite.structure.io.pdb import PDBFile as BiotitePDBFile | ||
| from .fastpdb import PDBFile as RustPDBFile | ||
| class PDBFile(biotite.TextFile): | ||
| r""" | ||
| This class represents a PDB file. | ||
| This class only provides support for reading/writing the pure atom | ||
| information (``ATOM``, ``HETATM``, ``MODEL`` and ``ENDMDL`` | ||
| records). | ||
| ``TER`` records cannot be written. | ||
| See also | ||
| -------- | ||
| PDBxFile | ||
| Examples | ||
| -------- | ||
| Load a ``\\*.pdb`` file, modify the structure and save the new | ||
| structure into a new file: | ||
| >>> import os.path | ||
| >>> file = PDBFile.read(os.path.join(path_to_structures, "1l2y.pdb")) | ||
| >>> array_stack = file.get_structure() | ||
| >>> array_stack_mod = rotate(array_stack, [1,2,3]) | ||
| >>> file = PDBFile() | ||
| >>> file.set_structure(array_stack_mod) | ||
| >>> file.write(os.path.join(path_to_directory, "1l2y_mod.pdb")) | ||
| """ | ||
| class PDBFile(BiotitePDBFile): | ||
@@ -44,93 +20,27 @@ def __init__(self): | ||
| @classmethod | ||
| def read(cls, file): | ||
| file = super().read(file) | ||
| file._pdb_file = RustPDBFile(file.lines) | ||
| return file | ||
| @staticmethod | ||
| def read(file): | ||
| pdb_file = PDBFile() | ||
| if isinstance(file, str): | ||
| pdb_file._pdb_file = RustPDBFile.read(file) | ||
| elif isinstance(file, bytes): | ||
| pdb_file._pdb_file = RustPDBFile.read(file.decode("utf-8")) | ||
| elif isinstance(file, os.PathLike): | ||
| pdb_file._pdb_file = RustPDBFile.read(str(file)) | ||
| else: | ||
| if not is_text(file): | ||
| raise TypeError("A file opened in 'text' mode is required") | ||
| pdb_file._pdb_file = RustPDBFile(file.read().splitlines()) | ||
| # Synchronize with PDB file representation in Rust | ||
| pdb_file.lines = pdb_file._pdb_file.lines | ||
| return pdb_file | ||
| def get_model_count(self): | ||
| """ | ||
| Get the number of models contained in the PDB file. | ||
| Returns | ||
| ------- | ||
| model_count : int | ||
| The number of models. | ||
| """ | ||
| return self._pdb_file.get_model_count() | ||
| def get_remark(self, number): | ||
| return self._pdb_file.parse_remark(int(number)) | ||
| def get_coord(self, model=None): | ||
| """ | ||
| Get only the coordinates of the PDB file. | ||
| Parameters | ||
| ---------- | ||
| model : int, optional | ||
| If this parameter is given, the function will return a | ||
| 2D coordinate array from the atoms corresponding to the | ||
| given model number (starting at 1). | ||
| Negative values are used to index models starting from the | ||
| last model insted of the first model. | ||
| If this parameter is omitted, an 2D coordinate array | ||
| containing all models will be returned, even if | ||
| the structure contains only one model. | ||
| Returns | ||
| ------- | ||
| coord : ndarray, shape=(m,n,3) or shape=(n,2), dtype=float | ||
| The coordinates read from the ``ATOM`` and ``HETATM`` | ||
| records of the file. | ||
| Notes | ||
| ----- | ||
| Note that :func:`get_coord()` may output more coordinates than | ||
| the atom array (stack) from the corresponding | ||
| :func:`get_structure()` call has. | ||
| The reason for this is, that :func:`get_structure()` filters | ||
| *altloc* IDs, while `get_coord()` does not. | ||
| Examples | ||
| -------- | ||
| Read an :class:`AtomArrayStack` from multiple PDB files, where | ||
| each PDB file contains the same atoms but different positions. | ||
| This is an efficient approach when a trajectory is spread into | ||
| multiple PDB files, as done e.g. by the *Rosetta* modeling | ||
| software. | ||
| For the purpose of this example, the PDB files are created from | ||
| an existing :class:`AtomArrayStack`. | ||
| >>> import os.path | ||
| >>> from tempfile import gettempdir | ||
| >>> file_names = [] | ||
| >>> for i in range(atom_array_stack.stack_depth()): | ||
| ... pdb_file = PDBFile() | ||
| ... pdb_file.set_structure(atom_array_stack[i]) | ||
| ... file_name = os.path.join(gettempdir(), f"model_{i+1}.pdb") | ||
| ... pdb_file.write(file_name) | ||
| ... file_names.append(file_name) | ||
| >>> print(file_names) | ||
| ['...model_1.pdb', '...model_2.pdb', ..., '...model_38.pdb'] | ||
| Now the PDB files are used to create an :class:`AtomArrayStack`, | ||
| where each model represents a different model. | ||
| Construct a new :class:`AtomArrayStack` with annotations taken | ||
| from one of the created files used as template and coordinates | ||
| from all of the PDB files. | ||
| >>> template_file = PDBFile.read(file_names[0]) | ||
| >>> template = template_file.get_structure() | ||
| >>> coord = [] | ||
| >>> for i, file_name in enumerate(file_names): | ||
| ... pdb_file = PDBFile.read(file_name) | ||
| ... coord.append(pdb_file.get_coord(model=1)) | ||
| >>> new_stack = from_template(template, np.array(coord)) | ||
| The newly created :class:`AtomArrayStack` should now be equal to | ||
| the :class:`AtomArrayStack` the PDB files were created from. | ||
| >>> print(np.allclose(new_stack.coord, atom_array_stack.coord)) | ||
| True | ||
| """ | ||
| if model is None: | ||
@@ -411,3 +321,3 @@ coord = self._pdb_file.parse_coord_multi_model() | ||
| # Synchronize with PDB file representation in Rust | ||
| self.lines = self._pdb_file.lines |
+78
-31
| //! Low-level PDB file parsing and writing. | ||
| use std::fs; | ||
| use std::str::FromStr; | ||
@@ -10,8 +11,11 @@ use std::convert::TryInto; | ||
| use pyo3::exceptions; | ||
| use pyo3::create_exception; | ||
| use numpy::PyArray; | ||
| create_exception!(fastpdb, InvalidFileError, exceptions::PyException); | ||
| create_exception!(fastpdb, BadStructureError, exceptions::PyException); | ||
| pyo3::import_exception!(biotite, InvalidFileError); | ||
| // Label as a separate module to indicate that this exception comes | ||
| // from biotite | ||
| mod biotite { | ||
| pyo3::import_exception!(biotite, InvalidFileError); | ||
| } | ||
@@ -47,5 +51,18 @@ | ||
| fn new(lines: Vec<String>) -> Self { | ||
| PDBFile { lines } | ||
| //let ljust_lines = lines.iter().map(|line| format!("{:<80}", line)).collect(); | ||
| PDBFile { lines: lines } | ||
| } | ||
| /// Read a [`PDBFile`] from a file. | ||
| /// The file is indicated by its file path as `String`. | ||
| #[staticmethod] | ||
| fn read(file_path: &str) -> PyResult<Self> { | ||
| let contents = fs::read_to_string(file_path).map_err( | ||
| |_| exceptions::PyOSError::new_err(format!("'{}' cannot be read", file_path)) | ||
| )?; | ||
| let lines = contents.lines().map(|line| format!("{:<80}", line)).collect(); | ||
| Ok(PDBFile { lines: lines }) | ||
| } | ||
@@ -58,2 +75,22 @@ /// Get the number of models contained in the file. | ||
| /// Parse the given `REMARK` record of the PDB file to obtain its content as strings | ||
| fn parse_remark(&self, number: i64) -> PyResult<Option<Vec<String>>> { | ||
| const CONTENT_START_COLUMN: usize = 11; | ||
| if number < 0 || number > 999 { | ||
| return Err(exceptions::PyValueError::new_err("The number must be in range 0-999")); | ||
| } | ||
| let remark_string = format!("REMARK {:>3}", number); | ||
| let mut remark_lines: Vec<String> = self.lines.iter() | ||
| .filter(|line| line.starts_with(&remark_string)) | ||
| .map(|line| line[CONTENT_START_COLUMN..].to_owned()) | ||
| .collect(); | ||
| match remark_lines.len() { | ||
| 0 => Ok(None), | ||
| // Remove first empty line | ||
| _ => { remark_lines.remove(0); Ok(Some(remark_lines)) } | ||
| } | ||
| } | ||
| /// Parse the `CRYST1` record of the PDB file to obtain the unit cell lengths | ||
@@ -65,3 +102,3 @@ /// and angles (in degrees). | ||
| if line.len() < 80 { | ||
| return Err(InvalidFileError::new_err("Line is too short")) | ||
| return Err(biotite::InvalidFileError::new_err("Line is too short")) | ||
| } | ||
@@ -87,3 +124,3 @@ let len_a = parse_number(&line[ 6..15])?; | ||
| Python::with_gil(|py| { | ||
| match array{ | ||
| match array { | ||
| CoordArray::Single(array) => Ok(PyArray::from_array(py, &array).to_owned()), | ||
@@ -101,3 +138,3 @@ CoordArray::Multi(_) => panic!("No multi-model coordinates should be returned"), | ||
| Python::with_gil(|py| { | ||
| match array{ | ||
| match array { | ||
| CoordArray::Single(_) => panic!("No single-model coordinates should be returned"), | ||
@@ -194,3 +231,3 @@ CoordArray::Multi(array) => Ok(PyArray::from_array(py, &array).to_owned()), | ||
| if line.len() < 80 { | ||
| return Err(InvalidFileError::new_err("Line is too short")) | ||
| return Err(biotite::InvalidFileError::new_err("Line is too short")) | ||
| } | ||
@@ -217,18 +254,16 @@ write_string_to_array(&mut chain_id, atom_i, line[21..22].trim()); | ||
| if include_charge { | ||
| let mut charge_raw = line[78..80].chars(); | ||
| let raw_number = charge_raw.next().unwrap(); | ||
| let raw_sign = charge_raw.next().unwrap(); | ||
| let number; | ||
| if raw_number == ' ' { | ||
| number = 0; | ||
| let charge_raw = line[78..80].as_bytes(); | ||
| // Allow both "X+" and "+X" | ||
| charge[atom_i] = match charge_raw[0] { | ||
| b' ' => 0, | ||
| b'+' => parse_digit(&charge_raw[1])?, | ||
| b'-' => -parse_digit(&charge_raw[1])?, | ||
| _ => match charge_raw[1] { | ||
| b'+' => parse_digit(&charge_raw[0])?, | ||
| b'-' => -parse_digit(&charge_raw[0])?, | ||
| _ => Err(biotite::InvalidFileError::new_err(format!( | ||
| "'{}' is not a valid charge identifier", &line[78..80] | ||
| )))?, | ||
| } | ||
| } | ||
| else { | ||
| number = raw_number.to_digit(10).ok_or_else( || | ||
| InvalidFileError::new_err(format!( | ||
| "'{}' cannot be parsed into a number", raw_number | ||
| )) | ||
| )?; | ||
| } | ||
| let sign = if raw_sign == '-' { -1 } else { 1 }; | ||
| charge[atom_i] = number as i64 * sign; | ||
| } | ||
@@ -310,3 +345,3 @@ } | ||
| format!( | ||
| "CRYST1{:>9.3}{:>9.3}{:>9.3}{:>7.2}{:>7.2}{:>7.2} P 1 1", | ||
| "CRYST1{:>9.3}{:>9.3}{:>9.3}{:>7.2}{:>7.2}{:>7.2} P 1 1 ", | ||
| len_a, len_b, len_c, alpha, beta, gamma | ||
@@ -475,6 +510,6 @@ ) | ||
| if line.len() < 80 { | ||
| return Err(InvalidFileError::new_err("Line is too short")) | ||
| return Err(biotite::InvalidFileError::new_err("Line is too short")) | ||
| } | ||
| coord[[atom_i, 0]] = line[30..38].trim().parse().map_err(|_| | ||
| InvalidFileError::new_err(format!( | ||
| biotite::InvalidFileError::new_err(format!( | ||
| "'{}' cannot be parsed into a float", line[30..38].trim() | ||
@@ -484,3 +519,3 @@ )) | ||
| coord[[atom_i, 1]] = line[38..46].trim().parse().map_err(|_| | ||
| InvalidFileError::new_err(format!( | ||
| biotite::InvalidFileError::new_err(format!( | ||
| "'{}' cannot be parsed into a float", line[38..46].trim() | ||
@@ -490,3 +525,3 @@ )) | ||
| coord[[atom_i, 2]] = line[46..54].trim().parse().map_err(|_| | ||
| InvalidFileError::new_err(format!( | ||
| biotite::InvalidFileError::new_err(format!( | ||
| "'{}' cannot be parsed into a float", line[46..54].trim() | ||
@@ -586,3 +621,3 @@ )) | ||
| None => length = Some(model_length), | ||
| Some(l) => if model_length != l { return Err(InvalidFileError::new_err( | ||
| Some(l) => if model_length != l { return Err(biotite::InvalidFileError::new_err( | ||
| "Inconsistent number of models" | ||
@@ -635,3 +670,3 @@ )); } | ||
| string.trim().parse().map_err(|_| | ||
| InvalidFileError::new_err(format!( | ||
| biotite::InvalidFileError::new_err(format!( | ||
| "'{}' cannot be parsed into a number", string.trim() | ||
@@ -642,3 +677,15 @@ )) | ||
| /// Parse a byte into a digit. | ||
| /// Returns a ``PyErr`` if the parsing fails. | ||
| #[inline(always)] | ||
| fn parse_digit(digit: &u8) -> PyResult<i64> { | ||
| (*digit as char).to_digit(10).map_or_else( | ||
| || Err(biotite::InvalidFileError::new_err(format!( | ||
| "'{}' cannot be parsed into a number", digit) | ||
| )), | ||
| |v| Ok(v as i64) | ||
| ) | ||
| } | ||
| /// If a given `id` exceeds `max_id` the returned ID restarts counting at 1. | ||
@@ -663,2 +710,2 @@ /// Otherwise, `id` is returned. | ||
| Ok(()) | ||
| } | ||
| } |
@@ -10,3 +10,2 @@ # This source code is part of the Biotite package and is distributed | ||
| from tempfile import TemporaryFile | ||
| import itertools | ||
@@ -22,6 +21,15 @@ import glob | ||
| DATA_PATH = join(dirname(realpath(__file__)), "data") | ||
| TEST_STRUCTURES = glob.glob(join(DATA_PATH, "*.pdb")) | ||
| TEST_STRUCTURES = glob.glob(join(dirname(realpath(__file__)), "data", "*.pdb")) | ||
| def test_get_remark(): | ||
| ref_file = pdb.PDBFile.read(join(DATA_PATH, "1aki.pdb")) | ||
| test_file = fastpdb.PDBFile.read(join(DATA_PATH, "1aki.pdb")) | ||
| for remark in np.arange(0, 1000): | ||
| assert test_file.get_remark(remark) == ref_file.get_remark(remark) | ||
| @pytest.mark.parametrize( | ||
@@ -162,2 +170,15 @@ "path", TEST_STRUCTURES | ||
| assert test_file_content.getvalue() == ref_file_content.getvalue() | ||
| assert test_file_content.getvalue() == ref_file_content.getvalue() | ||
| def test_get_assembly(): | ||
| """ | ||
| Effectively, this test checks whether inheritance works properly, | ||
| as `get_assembly()` is not explicitly implemented in | ||
| `fastpdb.PDBFile`. | ||
| """ | ||
| ref_file = pdb.PDBFile.read(join(DATA_PATH, "1aki.pdb")) | ||
| test_file = fastpdb.PDBFile.read(join(DATA_PATH, "1aki.pdb")) | ||
| assert test_file.get_assembly() == ref_file.get_assembly() |
| name: Builds | ||
| on: | ||
| release: | ||
| types: [published] | ||
| workflow_dispatch: {} | ||
| jobs: | ||
| build: | ||
| name: Building distribution | ||
| strategy: | ||
| matrix: | ||
| include: | ||
| - os: ubuntu-latest | ||
| python: '3.8' | ||
| numpy: '1.16' | ||
| source: false | ||
| - os: ubuntu-latest | ||
| python: '3.9' | ||
| numpy: '1.19' | ||
| source: false | ||
| - os: ubuntu-latest | ||
| python: '3.10' | ||
| numpy: '1.21' | ||
| source: true | ||
| - os: macos-latest | ||
| python: '3.8' | ||
| numpy: '1.16' | ||
| source: false | ||
| - os: macos-latest | ||
| python: '3.9' | ||
| numpy: '1.19' | ||
| source: false | ||
| - os: macos-latest | ||
| python: '3.10' | ||
| numpy: '1.21' | ||
| source: false | ||
| - os: windows-latest | ||
| python: '3.8' | ||
| numpy: '1.16' | ||
| source: false | ||
| - os: windows-latest | ||
| python: '3.9' | ||
| numpy: '1.19' | ||
| source: false | ||
| - os: windows-latest | ||
| python: '3.10' | ||
| numpy: '1.21' | ||
| source: false | ||
| runs-on: ${{ matrix.os }} | ||
| defaults: | ||
| run: | ||
| shell: bash -l {0} | ||
| steps: | ||
| - uses: actions/checkout@v2 | ||
| - uses: conda-incubator/setup-miniconda@v2 | ||
| with: | ||
| activate-environment: fastpdb-dev | ||
| auto-update-conda: true | ||
| python-version: ${{ matrix.python }} | ||
| - name: Installing dependencies | ||
| run: conda install -c conda-forge numpy=$NUMPY_VERSION maturin | ||
| env: | ||
| NUMPY_VERSION: ${{ matrix.numpy }} | ||
| - if: ${{ !matrix.source }} | ||
| name: Building distribution | ||
| run: maturin build --release --no-sdist -i python -o dist | ||
| - if: ${{ matrix.source }} | ||
| name: Building distribution | ||
| run: maturin build --release -i python -o dist | ||
| - uses: actions/upload-artifact@v2 | ||
| with: | ||
| name: fastpdb distribution | ||
| path: dist//* | ||
| if-no-files-found: error |
| name: Tests | ||
| on: [push, pull_request] | ||
| jobs: | ||
| test-simple: | ||
| name: Testing | ||
| strategy: | ||
| matrix: | ||
| include: | ||
| - os: ubuntu-latest | ||
| python: '3.8' | ||
| numpy: '1.16' | ||
| - os: ubuntu-latest | ||
| python: '3.9' | ||
| numpy: '1.19' | ||
| - os: ubuntu-latest | ||
| python: '3.10' | ||
| numpy: '1.21' | ||
| - os: macos-latest | ||
| python: '3.8' | ||
| numpy: '1.16' | ||
| - os: macos-latest | ||
| python: '3.9' | ||
| numpy: '1.19' | ||
| - os: macos-latest | ||
| python: '3.10' | ||
| numpy: '1.21' | ||
| - os: windows-latest | ||
| python: '3.8' | ||
| numpy: '1.16' | ||
| - os: windows-latest | ||
| python: '3.9' | ||
| numpy: '1.19' | ||
| - os: windows-latest | ||
| python: '3.10' | ||
| numpy: '1.21' | ||
| runs-on: ${{ matrix.os }} | ||
| defaults: | ||
| run: | ||
| shell: bash -l {0} | ||
| steps: | ||
| - uses: actions/checkout@v2 | ||
| - uses: conda-incubator/setup-miniconda@v2 | ||
| with: | ||
| activate-environment: fastpdb-test | ||
| auto-update-conda: true | ||
| python-version: ${{ matrix.python }} | ||
| - name: Installing dependencies | ||
| run: conda install -c conda-forge numpy=$NUMPY_VERSION "biotite>=0.33" maturin pytest | ||
| env: | ||
| NUMPY_VERSION: ${{ matrix.numpy }} | ||
| - name: Building distribution | ||
| run: maturin build --release -i python -o dist | ||
| - name: Installing distribution | ||
| run: pip install .//dist//*.whl | ||
| - name: Testing code | ||
| run: pytest --assert=plain |
-1132
| <?xml version="1.0" encoding="utf-8" standalone="no"?> | ||
| <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" | ||
| "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | ||
| <svg height="288pt" version="1.1" viewBox="0 0 576 288" width="576pt" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> | ||
| <metadata> | ||
| <rdf:RDF xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> | ||
| <cc:Work> | ||
| <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/> | ||
| <dc:date>2022-04-28T11:55:52.602501</dc:date> | ||
| <dc:format>image/svg+xml</dc:format> | ||
| <dc:creator> | ||
| <cc:Agent> | ||
| <dc:title>Matplotlib v3.4.3, https://matplotlib.org/</dc:title> | ||
| </cc:Agent> | ||
| </dc:creator> | ||
| </cc:Work> | ||
| </rdf:RDF> | ||
| </metadata> | ||
| <defs> | ||
| <style type="text/css">*{stroke-linecap:butt;stroke-linejoin:round;}</style> | ||
| </defs> | ||
| <g id="figure_1"> | ||
| <g id="patch_1"> | ||
| <path d="M 0 288 | ||
| L 576 288 | ||
| L 576 0 | ||
| L 0 0 | ||
| z | ||
| " style="fill:#ffffff;"/> | ||
| </g> | ||
| <g id="axes_1"> | ||
| <g id="patch_2"> | ||
| <path d="M 61.175 256.16 | ||
| L 563.04 256.16 | ||
| L 563.04 12.96 | ||
| L 61.175 12.96 | ||
| z | ||
| " style="fill:#ffffff;"/> | ||
| </g> | ||
| <g id="patch_3"> | ||
| <path clip-path="url(#pdde81a6178)" d="M 83.987045 256.16 | ||
| L 129.611136 256.16 | ||
| L 129.611136 176.306068 | ||
| L 83.987045 176.306068 | ||
| z | ||
| " style="fill:#0a6efd;stroke:#000000;stroke-linejoin:miter;"/> | ||
| </g> | ||
| <g id="patch_4"> | ||
| <path clip-path="url(#pdde81a6178)" d="M 266.483409 256.16 | ||
| L 312.1075 256.16 | ||
| L 312.1075 143.384126 | ||
| L 266.483409 143.384126 | ||
| z | ||
| " style="fill:#0a6efd;stroke:#000000;stroke-linejoin:miter;"/> | ||
| </g> | ||
| <g id="patch_5"> | ||
| <path clip-path="url(#pdde81a6178)" d="M 448.979773 256.16 | ||
| L 494.603864 256.16 | ||
| L 494.603864 35.069091 | ||
| L 448.979773 35.069091 | ||
| z | ||
| " style="fill:#0a6efd;stroke:#000000;stroke-linejoin:miter;"/> | ||
| </g> | ||
| <g id="patch_6"> | ||
| <path clip-path="url(#pdde81a6178)" d="M 129.611136 256.16 | ||
| L 175.235227 256.16 | ||
| L 175.235227 232.784664 | ||
| L 129.611136 232.784664 | ||
| z | ||
| " style="fill:#e1301d;stroke:#000000;stroke-linejoin:miter;"/> | ||
| </g> | ||
| <g id="patch_7"> | ||
| <path clip-path="url(#pdde81a6178)" d="M 312.1075 256.16 | ||
| L 357.731591 256.16 | ||
| L 357.731591 232.784664 | ||
| L 312.1075 232.784664 | ||
| z | ||
| " style="fill:#e1301d;stroke:#000000;stroke-linejoin:miter;"/> | ||
| </g> | ||
| <g id="patch_8"> | ||
| <path clip-path="url(#pdde81a6178)" d="M 494.603864 256.16 | ||
| L 540.227955 256.16 | ||
| L 540.227955 232.784664 | ||
| L 494.603864 232.784664 | ||
| z | ||
| " style="fill:#e1301d;stroke:#000000;stroke-linejoin:miter;"/> | ||
| </g> | ||
| <g id="matplotlib.axis_1"> | ||
| <g id="xtick_1"> | ||
| <g id="line2d_1"> | ||
| <defs> | ||
| <path d="M 0 0 | ||
| L 0 3.5 | ||
| " id="m5a13ee7696" style="stroke:#000000;stroke-width:0.8;"/> | ||
| </defs> | ||
| <g> | ||
| <use style="stroke:#000000;stroke-width:0.8;" x="129.611136" xlink:href="#m5a13ee7696" y="256.16"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_1"> | ||
| <!-- Read coord --> | ||
| <g transform="translate(95.815199 272.278125)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 2841 2188 | ||
| Q 3044 2119 3236 1894 | ||
| Q 3428 1669 3622 1275 | ||
| L 4263 0 | ||
| L 3584 0 | ||
| L 2988 1197 | ||
| Q 2756 1666 2539 1819 | ||
| Q 2322 1972 1947 1972 | ||
| L 1259 1972 | ||
| L 1259 0 | ||
| L 628 0 | ||
| L 628 4666 | ||
| L 2053 4666 | ||
| Q 2853 4666 3247 4331 | ||
| Q 3641 3997 3641 3322 | ||
| Q 3641 2881 3436 2590 | ||
| Q 3231 2300 2841 2188 | ||
| z | ||
| M 1259 4147 | ||
| L 1259 2491 | ||
| L 2053 2491 | ||
| Q 2509 2491 2742 2702 | ||
| Q 2975 2913 2975 3322 | ||
| Q 2975 3731 2742 3939 | ||
| Q 2509 4147 2053 4147 | ||
| L 1259 4147 | ||
| z | ||
| " id="DejaVuSans-52" transform="scale(0.015625)"/> | ||
| <path d="M 3597 1894 | ||
| L 3597 1613 | ||
| L 953 1613 | ||
| Q 991 1019 1311 708 | ||
| Q 1631 397 2203 397 | ||
| Q 2534 397 2845 478 | ||
| Q 3156 559 3463 722 | ||
| L 3463 178 | ||
| Q 3153 47 2828 -22 | ||
| Q 2503 -91 2169 -91 | ||
| Q 1331 -91 842 396 | ||
| Q 353 884 353 1716 | ||
| Q 353 2575 817 3079 | ||
| Q 1281 3584 2069 3584 | ||
| Q 2775 3584 3186 3129 | ||
| Q 3597 2675 3597 1894 | ||
| z | ||
| M 3022 2063 | ||
| Q 3016 2534 2758 2815 | ||
| Q 2500 3097 2075 3097 | ||
| Q 1594 3097 1305 2825 | ||
| Q 1016 2553 972 2059 | ||
| L 3022 2063 | ||
| z | ||
| " id="DejaVuSans-65" transform="scale(0.015625)"/> | ||
| <path d="M 2194 1759 | ||
| Q 1497 1759 1228 1600 | ||
| Q 959 1441 959 1056 | ||
| Q 959 750 1161 570 | ||
| Q 1363 391 1709 391 | ||
| Q 2188 391 2477 730 | ||
| Q 2766 1069 2766 1631 | ||
| L 2766 1759 | ||
| L 2194 1759 | ||
| z | ||
| M 3341 1997 | ||
| L 3341 0 | ||
| L 2766 0 | ||
| L 2766 531 | ||
| Q 2569 213 2275 61 | ||
| Q 1981 -91 1556 -91 | ||
| Q 1019 -91 701 211 | ||
| Q 384 513 384 1019 | ||
| Q 384 1609 779 1909 | ||
| Q 1175 2209 1959 2209 | ||
| L 2766 2209 | ||
| L 2766 2266 | ||
| Q 2766 2663 2505 2880 | ||
| Q 2244 3097 1772 3097 | ||
| Q 1472 3097 1187 3025 | ||
| Q 903 2953 641 2809 | ||
| L 641 3341 | ||
| Q 956 3463 1253 3523 | ||
| Q 1550 3584 1831 3584 | ||
| Q 2591 3584 2966 3190 | ||
| Q 3341 2797 3341 1997 | ||
| z | ||
| " id="DejaVuSans-61" transform="scale(0.015625)"/> | ||
| <path d="M 2906 2969 | ||
| L 2906 4863 | ||
| L 3481 4863 | ||
| L 3481 0 | ||
| L 2906 0 | ||
| L 2906 525 | ||
| Q 2725 213 2448 61 | ||
| Q 2172 -91 1784 -91 | ||
| Q 1150 -91 751 415 | ||
| Q 353 922 353 1747 | ||
| Q 353 2572 751 3078 | ||
| Q 1150 3584 1784 3584 | ||
| Q 2172 3584 2448 3432 | ||
| Q 2725 3281 2906 2969 | ||
| z | ||
| M 947 1747 | ||
| Q 947 1113 1208 752 | ||
| Q 1469 391 1925 391 | ||
| Q 2381 391 2643 752 | ||
| Q 2906 1113 2906 1747 | ||
| Q 2906 2381 2643 2742 | ||
| Q 2381 3103 1925 3103 | ||
| Q 1469 3103 1208 2742 | ||
| Q 947 2381 947 1747 | ||
| z | ||
| " id="DejaVuSans-64" transform="scale(0.015625)"/> | ||
| <path id="DejaVuSans-20" transform="scale(0.015625)"/> | ||
| <path d="M 3122 3366 | ||
| L 3122 2828 | ||
| Q 2878 2963 2633 3030 | ||
| Q 2388 3097 2138 3097 | ||
| Q 1578 3097 1268 2742 | ||
| Q 959 2388 959 1747 | ||
| Q 959 1106 1268 751 | ||
| Q 1578 397 2138 397 | ||
| Q 2388 397 2633 464 | ||
| Q 2878 531 3122 666 | ||
| L 3122 134 | ||
| Q 2881 22 2623 -34 | ||
| Q 2366 -91 2075 -91 | ||
| Q 1284 -91 818 406 | ||
| Q 353 903 353 1747 | ||
| Q 353 2603 823 3093 | ||
| Q 1294 3584 2113 3584 | ||
| Q 2378 3584 2631 3529 | ||
| Q 2884 3475 3122 3366 | ||
| z | ||
| " id="DejaVuSans-63" transform="scale(0.015625)"/> | ||
| <path d="M 1959 3097 | ||
| Q 1497 3097 1228 2736 | ||
| Q 959 2375 959 1747 | ||
| Q 959 1119 1226 758 | ||
| Q 1494 397 1959 397 | ||
| Q 2419 397 2687 759 | ||
| Q 2956 1122 2956 1747 | ||
| Q 2956 2369 2687 2733 | ||
| Q 2419 3097 1959 3097 | ||
| z | ||
| M 1959 3584 | ||
| Q 2709 3584 3137 3096 | ||
| Q 3566 2609 3566 1747 | ||
| Q 3566 888 3137 398 | ||
| Q 2709 -91 1959 -91 | ||
| Q 1206 -91 779 398 | ||
| Q 353 888 353 1747 | ||
| Q 353 2609 779 3096 | ||
| Q 1206 3584 1959 3584 | ||
| z | ||
| " id="DejaVuSans-6f" transform="scale(0.015625)"/> | ||
| <path d="M 2631 2963 | ||
| Q 2534 3019 2420 3045 | ||
| Q 2306 3072 2169 3072 | ||
| Q 1681 3072 1420 2755 | ||
| Q 1159 2438 1159 1844 | ||
| L 1159 0 | ||
| L 581 0 | ||
| L 581 3500 | ||
| L 1159 3500 | ||
| L 1159 2956 | ||
| Q 1341 3275 1631 3429 | ||
| Q 1922 3584 2338 3584 | ||
| Q 2397 3584 2469 3576 | ||
| Q 2541 3569 2628 3553 | ||
| L 2631 2963 | ||
| z | ||
| " id="DejaVuSans-72" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-52"/> | ||
| <use x="64.982422" xlink:href="#DejaVuSans-65"/> | ||
| <use x="126.505859" xlink:href="#DejaVuSans-61"/> | ||
| <use x="187.785156" xlink:href="#DejaVuSans-64"/> | ||
| <use x="251.261719" xlink:href="#DejaVuSans-20"/> | ||
| <use x="283.048828" xlink:href="#DejaVuSans-63"/> | ||
| <use x="338.029297" xlink:href="#DejaVuSans-6f"/> | ||
| <use x="399.210938" xlink:href="#DejaVuSans-6f"/> | ||
| <use x="460.392578" xlink:href="#DejaVuSans-72"/> | ||
| <use x="499.755859" xlink:href="#DejaVuSans-64"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="xtick_2"> | ||
| <g id="line2d_2"> | ||
| <g> | ||
| <use style="stroke:#000000;stroke-width:0.8;" x="312.1075" xlink:href="#m5a13ee7696" y="256.16"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_2"> | ||
| <!-- Read model --> | ||
| <g transform="translate(276.440312 272.278125)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 3328 2828 | ||
| Q 3544 3216 3844 3400 | ||
| Q 4144 3584 4550 3584 | ||
| Q 5097 3584 5394 3201 | ||
| Q 5691 2819 5691 2113 | ||
| L 5691 0 | ||
| L 5113 0 | ||
| L 5113 2094 | ||
| Q 5113 2597 4934 2840 | ||
| Q 4756 3084 4391 3084 | ||
| Q 3944 3084 3684 2787 | ||
| Q 3425 2491 3425 1978 | ||
| L 3425 0 | ||
| L 2847 0 | ||
| L 2847 2094 | ||
| Q 2847 2600 2669 2842 | ||
| Q 2491 3084 2119 3084 | ||
| Q 1678 3084 1418 2786 | ||
| Q 1159 2488 1159 1978 | ||
| L 1159 0 | ||
| L 581 0 | ||
| L 581 3500 | ||
| L 1159 3500 | ||
| L 1159 2956 | ||
| Q 1356 3278 1631 3431 | ||
| Q 1906 3584 2284 3584 | ||
| Q 2666 3584 2933 3390 | ||
| Q 3200 3197 3328 2828 | ||
| z | ||
| " id="DejaVuSans-6d" transform="scale(0.015625)"/> | ||
| <path d="M 603 4863 | ||
| L 1178 4863 | ||
| L 1178 0 | ||
| L 603 0 | ||
| L 603 4863 | ||
| z | ||
| " id="DejaVuSans-6c" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-52"/> | ||
| <use x="64.982422" xlink:href="#DejaVuSans-65"/> | ||
| <use x="126.505859" xlink:href="#DejaVuSans-61"/> | ||
| <use x="187.785156" xlink:href="#DejaVuSans-64"/> | ||
| <use x="251.261719" xlink:href="#DejaVuSans-20"/> | ||
| <use x="283.048828" xlink:href="#DejaVuSans-6d"/> | ||
| <use x="380.460938" xlink:href="#DejaVuSans-6f"/> | ||
| <use x="441.642578" xlink:href="#DejaVuSans-64"/> | ||
| <use x="505.119141" xlink:href="#DejaVuSans-65"/> | ||
| <use x="566.642578" xlink:href="#DejaVuSans-6c"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="xtick_3"> | ||
| <g id="line2d_3"> | ||
| <g> | ||
| <use style="stroke:#000000;stroke-width:0.8;" x="494.603864" xlink:href="#m5a13ee7696" y="256.16"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_3"> | ||
| <!-- Write model --> | ||
| <g transform="translate(458.173551 272.278125)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 213 4666 | ||
| L 850 4666 | ||
| L 1831 722 | ||
| L 2809 4666 | ||
| L 3519 4666 | ||
| L 4500 722 | ||
| L 5478 4666 | ||
| L 6119 4666 | ||
| L 4947 0 | ||
| L 4153 0 | ||
| L 3169 4050 | ||
| L 2175 0 | ||
| L 1381 0 | ||
| L 213 4666 | ||
| z | ||
| " id="DejaVuSans-57" transform="scale(0.015625)"/> | ||
| <path d="M 603 3500 | ||
| L 1178 3500 | ||
| L 1178 0 | ||
| L 603 0 | ||
| L 603 3500 | ||
| z | ||
| M 603 4863 | ||
| L 1178 4863 | ||
| L 1178 4134 | ||
| L 603 4134 | ||
| L 603 4863 | ||
| z | ||
| " id="DejaVuSans-69" transform="scale(0.015625)"/> | ||
| <path d="M 1172 4494 | ||
| L 1172 3500 | ||
| L 2356 3500 | ||
| L 2356 3053 | ||
| L 1172 3053 | ||
| L 1172 1153 | ||
| Q 1172 725 1289 603 | ||
| Q 1406 481 1766 481 | ||
| L 2356 481 | ||
| L 2356 0 | ||
| L 1766 0 | ||
| Q 1100 0 847 248 | ||
| Q 594 497 594 1153 | ||
| L 594 3053 | ||
| L 172 3053 | ||
| L 172 3500 | ||
| L 594 3500 | ||
| L 594 4494 | ||
| L 1172 4494 | ||
| z | ||
| " id="DejaVuSans-74" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-57"/> | ||
| <use x="94.376953" xlink:href="#DejaVuSans-72"/> | ||
| <use x="135.490234" xlink:href="#DejaVuSans-69"/> | ||
| <use x="163.273438" xlink:href="#DejaVuSans-74"/> | ||
| <use x="202.482422" xlink:href="#DejaVuSans-65"/> | ||
| <use x="264.005859" xlink:href="#DejaVuSans-20"/> | ||
| <use x="295.792969" xlink:href="#DejaVuSans-6d"/> | ||
| <use x="393.205078" xlink:href="#DejaVuSans-6f"/> | ||
| <use x="454.386719" xlink:href="#DejaVuSans-64"/> | ||
| <use x="517.863281" xlink:href="#DejaVuSans-65"/> | ||
| <use x="579.386719" xlink:href="#DejaVuSans-6c"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="matplotlib.axis_2"> | ||
| <g id="ytick_1"> | ||
| <g id="line2d_4"> | ||
| <defs> | ||
| <path d="M 0 0 | ||
| L -3.5 0 | ||
| " id="mc26de41ad9" style="stroke:#000000;stroke-width:0.8;"/> | ||
| </defs> | ||
| <g> | ||
| <use style="stroke:#000000;stroke-width:0.8;" x="61.175" xlink:href="#mc26de41ad9" y="232.784664"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_4"> | ||
| <!-- 1× --> | ||
| <g transform="translate(36.484375 237.343727)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 794 531 | ||
| L 1825 531 | ||
| L 1825 4091 | ||
| L 703 3866 | ||
| L 703 4441 | ||
| L 1819 4666 | ||
| L 2450 4666 | ||
| L 2450 531 | ||
| L 3481 531 | ||
| L 3481 0 | ||
| L 794 0 | ||
| L 794 531 | ||
| z | ||
| " id="DejaVuSans-31" transform="scale(0.015625)"/> | ||
| <path d="M 4488 3438 | ||
| L 3059 2003 | ||
| L 4488 575 | ||
| L 4116 197 | ||
| L 2681 1631 | ||
| L 1247 197 | ||
| L 878 575 | ||
| L 2303 2003 | ||
| L 878 3438 | ||
| L 1247 3816 | ||
| L 2681 2381 | ||
| L 4116 3816 | ||
| L 4488 3438 | ||
| z | ||
| " id="DejaVuSans-d7" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-31"/> | ||
| <use x="63.623047" xlink:href="#DejaVuSans-d7"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="ytick_2"> | ||
| <g id="line2d_5"> | ||
| <g> | ||
| <use style="stroke:#000000;stroke-width:0.8;" x="61.175" xlink:href="#mc26de41ad9" y="209.409329"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_5"> | ||
| <!-- 2× --> | ||
| <g transform="translate(36.484375 213.968391)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 1228 531 | ||
| L 3431 531 | ||
| L 3431 0 | ||
| L 469 0 | ||
| L 469 531 | ||
| Q 828 903 1448 1529 | ||
| Q 2069 2156 2228 2338 | ||
| Q 2531 2678 2651 2914 | ||
| Q 2772 3150 2772 3378 | ||
| Q 2772 3750 2511 3984 | ||
| Q 2250 4219 1831 4219 | ||
| Q 1534 4219 1204 4116 | ||
| Q 875 4013 500 3803 | ||
| L 500 4441 | ||
| Q 881 4594 1212 4672 | ||
| Q 1544 4750 1819 4750 | ||
| Q 2544 4750 2975 4387 | ||
| Q 3406 4025 3406 3419 | ||
| Q 3406 3131 3298 2873 | ||
| Q 3191 2616 2906 2266 | ||
| Q 2828 2175 2409 1742 | ||
| Q 1991 1309 1228 531 | ||
| z | ||
| " id="DejaVuSans-32" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-32"/> | ||
| <use x="63.623047" xlink:href="#DejaVuSans-d7"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="ytick_3"> | ||
| <g id="line2d_6"> | ||
| <g> | ||
| <use style="stroke:#000000;stroke-width:0.8;" x="61.175" xlink:href="#mc26de41ad9" y="186.033993"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_6"> | ||
| <!-- 3× --> | ||
| <g transform="translate(36.484375 190.593056)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 2597 2516 | ||
| Q 3050 2419 3304 2112 | ||
| Q 3559 1806 3559 1356 | ||
| Q 3559 666 3084 287 | ||
| Q 2609 -91 1734 -91 | ||
| Q 1441 -91 1130 -33 | ||
| Q 819 25 488 141 | ||
| L 488 750 | ||
| Q 750 597 1062 519 | ||
| Q 1375 441 1716 441 | ||
| Q 2309 441 2620 675 | ||
| Q 2931 909 2931 1356 | ||
| Q 2931 1769 2642 2001 | ||
| Q 2353 2234 1838 2234 | ||
| L 1294 2234 | ||
| L 1294 2753 | ||
| L 1863 2753 | ||
| Q 2328 2753 2575 2939 | ||
| Q 2822 3125 2822 3475 | ||
| Q 2822 3834 2567 4026 | ||
| Q 2313 4219 1838 4219 | ||
| Q 1578 4219 1281 4162 | ||
| Q 984 4106 628 3988 | ||
| L 628 4550 | ||
| Q 988 4650 1302 4700 | ||
| Q 1616 4750 1894 4750 | ||
| Q 2613 4750 3031 4423 | ||
| Q 3450 4097 3450 3541 | ||
| Q 3450 3153 3228 2886 | ||
| Q 3006 2619 2597 2516 | ||
| z | ||
| " id="DejaVuSans-33" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-33"/> | ||
| <use x="63.623047" xlink:href="#DejaVuSans-d7"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="ytick_4"> | ||
| <g id="line2d_7"> | ||
| <g> | ||
| <use style="stroke:#000000;stroke-width:0.8;" x="61.175" xlink:href="#mc26de41ad9" y="162.658657"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_7"> | ||
| <!-- 4× --> | ||
| <g transform="translate(36.484375 167.21772)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 2419 4116 | ||
| L 825 1625 | ||
| L 2419 1625 | ||
| L 2419 4116 | ||
| z | ||
| M 2253 4666 | ||
| L 3047 4666 | ||
| L 3047 1625 | ||
| L 3713 1625 | ||
| L 3713 1100 | ||
| L 3047 1100 | ||
| L 3047 0 | ||
| L 2419 0 | ||
| L 2419 1100 | ||
| L 313 1100 | ||
| L 313 1709 | ||
| L 2253 4666 | ||
| z | ||
| " id="DejaVuSans-34" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-34"/> | ||
| <use x="63.623047" xlink:href="#DejaVuSans-d7"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="ytick_5"> | ||
| <g id="line2d_8"> | ||
| <g> | ||
| <use style="stroke:#000000;stroke-width:0.8;" x="61.175" xlink:href="#mc26de41ad9" y="139.283322"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_8"> | ||
| <!-- 5× --> | ||
| <g transform="translate(36.484375 143.842384)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 691 4666 | ||
| L 3169 4666 | ||
| L 3169 4134 | ||
| L 1269 4134 | ||
| L 1269 2991 | ||
| Q 1406 3038 1543 3061 | ||
| Q 1681 3084 1819 3084 | ||
| Q 2600 3084 3056 2656 | ||
| Q 3513 2228 3513 1497 | ||
| Q 3513 744 3044 326 | ||
| Q 2575 -91 1722 -91 | ||
| Q 1428 -91 1123 -41 | ||
| Q 819 9 494 109 | ||
| L 494 744 | ||
| Q 775 591 1075 516 | ||
| Q 1375 441 1709 441 | ||
| Q 2250 441 2565 725 | ||
| Q 2881 1009 2881 1497 | ||
| Q 2881 1984 2565 2268 | ||
| Q 2250 2553 1709 2553 | ||
| Q 1456 2553 1204 2497 | ||
| Q 953 2441 691 2322 | ||
| L 691 4666 | ||
| z | ||
| " id="DejaVuSans-35" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-35"/> | ||
| <use x="63.623047" xlink:href="#DejaVuSans-d7"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="ytick_6"> | ||
| <g id="line2d_9"> | ||
| <g> | ||
| <use style="stroke:#000000;stroke-width:0.8;" x="61.175" xlink:href="#mc26de41ad9" y="115.907986"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_9"> | ||
| <!-- 6× --> | ||
| <g transform="translate(36.484375 120.467049)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 2113 2584 | ||
| Q 1688 2584 1439 2293 | ||
| Q 1191 2003 1191 1497 | ||
| Q 1191 994 1439 701 | ||
| Q 1688 409 2113 409 | ||
| Q 2538 409 2786 701 | ||
| Q 3034 994 3034 1497 | ||
| Q 3034 2003 2786 2293 | ||
| Q 2538 2584 2113 2584 | ||
| z | ||
| M 3366 4563 | ||
| L 3366 3988 | ||
| Q 3128 4100 2886 4159 | ||
| Q 2644 4219 2406 4219 | ||
| Q 1781 4219 1451 3797 | ||
| Q 1122 3375 1075 2522 | ||
| Q 1259 2794 1537 2939 | ||
| Q 1816 3084 2150 3084 | ||
| Q 2853 3084 3261 2657 | ||
| Q 3669 2231 3669 1497 | ||
| Q 3669 778 3244 343 | ||
| Q 2819 -91 2113 -91 | ||
| Q 1303 -91 875 529 | ||
| Q 447 1150 447 2328 | ||
| Q 447 3434 972 4092 | ||
| Q 1497 4750 2381 4750 | ||
| Q 2619 4750 2861 4703 | ||
| Q 3103 4656 3366 4563 | ||
| z | ||
| " id="DejaVuSans-36" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-36"/> | ||
| <use x="63.623047" xlink:href="#DejaVuSans-d7"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="ytick_7"> | ||
| <g id="line2d_10"> | ||
| <g> | ||
| <use style="stroke:#000000;stroke-width:0.8;" x="61.175" xlink:href="#mc26de41ad9" y="92.53265"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_10"> | ||
| <!-- 7× --> | ||
| <g transform="translate(36.484375 97.091713)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 525 4666 | ||
| L 3525 4666 | ||
| L 3525 4397 | ||
| L 1831 0 | ||
| L 1172 0 | ||
| L 2766 4134 | ||
| L 525 4134 | ||
| L 525 4666 | ||
| z | ||
| " id="DejaVuSans-37" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-37"/> | ||
| <use x="63.623047" xlink:href="#DejaVuSans-d7"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="ytick_8"> | ||
| <g id="line2d_11"> | ||
| <g> | ||
| <use style="stroke:#000000;stroke-width:0.8;" x="61.175" xlink:href="#mc26de41ad9" y="69.157315"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_11"> | ||
| <!-- 8× --> | ||
| <g transform="translate(36.484375 73.716377)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 2034 2216 | ||
| Q 1584 2216 1326 1975 | ||
| Q 1069 1734 1069 1313 | ||
| Q 1069 891 1326 650 | ||
| Q 1584 409 2034 409 | ||
| Q 2484 409 2743 651 | ||
| Q 3003 894 3003 1313 | ||
| Q 3003 1734 2745 1975 | ||
| Q 2488 2216 2034 2216 | ||
| z | ||
| M 1403 2484 | ||
| Q 997 2584 770 2862 | ||
| Q 544 3141 544 3541 | ||
| Q 544 4100 942 4425 | ||
| Q 1341 4750 2034 4750 | ||
| Q 2731 4750 3128 4425 | ||
| Q 3525 4100 3525 3541 | ||
| Q 3525 3141 3298 2862 | ||
| Q 3072 2584 2669 2484 | ||
| Q 3125 2378 3379 2068 | ||
| Q 3634 1759 3634 1313 | ||
| Q 3634 634 3220 271 | ||
| Q 2806 -91 2034 -91 | ||
| Q 1263 -91 848 271 | ||
| Q 434 634 434 1313 | ||
| Q 434 1759 690 2068 | ||
| Q 947 2378 1403 2484 | ||
| z | ||
| M 1172 3481 | ||
| Q 1172 3119 1398 2916 | ||
| Q 1625 2713 2034 2713 | ||
| Q 2441 2713 2670 2916 | ||
| Q 2900 3119 2900 3481 | ||
| Q 2900 3844 2670 4047 | ||
| Q 2441 4250 2034 4250 | ||
| Q 1625 4250 1398 4047 | ||
| Q 1172 3844 1172 3481 | ||
| z | ||
| " id="DejaVuSans-38" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-38"/> | ||
| <use x="63.623047" xlink:href="#DejaVuSans-d7"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="ytick_9"> | ||
| <g id="line2d_12"> | ||
| <g> | ||
| <use style="stroke:#000000;stroke-width:0.8;" x="61.175" xlink:href="#mc26de41ad9" y="45.781979"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_12"> | ||
| <!-- 9× --> | ||
| <g transform="translate(36.484375 50.341042)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 703 97 | ||
| L 703 672 | ||
| Q 941 559 1184 500 | ||
| Q 1428 441 1663 441 | ||
| Q 2288 441 2617 861 | ||
| Q 2947 1281 2994 2138 | ||
| Q 2813 1869 2534 1725 | ||
| Q 2256 1581 1919 1581 | ||
| Q 1219 1581 811 2004 | ||
| Q 403 2428 403 3163 | ||
| Q 403 3881 828 4315 | ||
| Q 1253 4750 1959 4750 | ||
| Q 2769 4750 3195 4129 | ||
| Q 3622 3509 3622 2328 | ||
| Q 3622 1225 3098 567 | ||
| Q 2575 -91 1691 -91 | ||
| Q 1453 -91 1209 -44 | ||
| Q 966 3 703 97 | ||
| z | ||
| M 1959 2075 | ||
| Q 2384 2075 2632 2365 | ||
| Q 2881 2656 2881 3163 | ||
| Q 2881 3666 2632 3958 | ||
| Q 2384 4250 1959 4250 | ||
| Q 1534 4250 1286 3958 | ||
| Q 1038 3666 1038 3163 | ||
| Q 1038 2656 1286 2365 | ||
| Q 1534 2075 1959 2075 | ||
| z | ||
| " id="DejaVuSans-39" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-39"/> | ||
| <use x="63.623047" xlink:href="#DejaVuSans-d7"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="ytick_10"> | ||
| <g id="line2d_13"> | ||
| <g> | ||
| <use style="stroke:#000000;stroke-width:0.8;" x="61.175" xlink:href="#mc26de41ad9" y="22.406643"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_13"> | ||
| <!-- 10× --> | ||
| <g transform="translate(28.849375 26.965706)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 2034 4250 | ||
| Q 1547 4250 1301 3770 | ||
| Q 1056 3291 1056 2328 | ||
| Q 1056 1369 1301 889 | ||
| Q 1547 409 2034 409 | ||
| Q 2525 409 2770 889 | ||
| Q 3016 1369 3016 2328 | ||
| Q 3016 3291 2770 3770 | ||
| Q 2525 4250 2034 4250 | ||
| z | ||
| M 2034 4750 | ||
| Q 2819 4750 3233 4129 | ||
| Q 3647 3509 3647 2328 | ||
| Q 3647 1150 3233 529 | ||
| Q 2819 -91 2034 -91 | ||
| Q 1250 -91 836 529 | ||
| Q 422 1150 422 2328 | ||
| Q 422 3509 836 4129 | ||
| Q 1250 4750 2034 4750 | ||
| z | ||
| " id="DejaVuSans-30" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-31"/> | ||
| <use x="63.623047" xlink:href="#DejaVuSans-30"/> | ||
| <use x="127.246094" xlink:href="#DejaVuSans-d7"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="text_14"> | ||
| <!-- Speedup --> | ||
| <g transform="translate(22.35375 160.9825)rotate(-90)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 3425 4513 | ||
| L 3425 3897 | ||
| Q 3066 4069 2747 4153 | ||
| Q 2428 4238 2131 4238 | ||
| Q 1616 4238 1336 4038 | ||
| Q 1056 3838 1056 3469 | ||
| Q 1056 3159 1242 3001 | ||
| Q 1428 2844 1947 2747 | ||
| L 2328 2669 | ||
| Q 3034 2534 3370 2195 | ||
| Q 3706 1856 3706 1288 | ||
| Q 3706 609 3251 259 | ||
| Q 2797 -91 1919 -91 | ||
| Q 1588 -91 1214 -16 | ||
| Q 841 59 441 206 | ||
| L 441 856 | ||
| Q 825 641 1194 531 | ||
| Q 1563 422 1919 422 | ||
| Q 2459 422 2753 634 | ||
| Q 3047 847 3047 1241 | ||
| Q 3047 1584 2836 1778 | ||
| Q 2625 1972 2144 2069 | ||
| L 1759 2144 | ||
| Q 1053 2284 737 2584 | ||
| Q 422 2884 422 3419 | ||
| Q 422 4038 858 4394 | ||
| Q 1294 4750 2059 4750 | ||
| Q 2388 4750 2728 4690 | ||
| Q 3069 4631 3425 4513 | ||
| z | ||
| " id="DejaVuSans-53" transform="scale(0.015625)"/> | ||
| <path d="M 1159 525 | ||
| L 1159 -1331 | ||
| L 581 -1331 | ||
| L 581 3500 | ||
| L 1159 3500 | ||
| L 1159 2969 | ||
| Q 1341 3281 1617 3432 | ||
| Q 1894 3584 2278 3584 | ||
| Q 2916 3584 3314 3078 | ||
| Q 3713 2572 3713 1747 | ||
| Q 3713 922 3314 415 | ||
| Q 2916 -91 2278 -91 | ||
| Q 1894 -91 1617 61 | ||
| Q 1341 213 1159 525 | ||
| z | ||
| M 3116 1747 | ||
| Q 3116 2381 2855 2742 | ||
| Q 2594 3103 2138 3103 | ||
| Q 1681 3103 1420 2742 | ||
| Q 1159 2381 1159 1747 | ||
| Q 1159 1113 1420 752 | ||
| Q 1681 391 2138 391 | ||
| Q 2594 391 2855 752 | ||
| Q 3116 1113 3116 1747 | ||
| z | ||
| " id="DejaVuSans-70" transform="scale(0.015625)"/> | ||
| <path d="M 544 1381 | ||
| L 544 3500 | ||
| L 1119 3500 | ||
| L 1119 1403 | ||
| Q 1119 906 1312 657 | ||
| Q 1506 409 1894 409 | ||
| Q 2359 409 2629 706 | ||
| Q 2900 1003 2900 1516 | ||
| L 2900 3500 | ||
| L 3475 3500 | ||
| L 3475 0 | ||
| L 2900 0 | ||
| L 2900 538 | ||
| Q 2691 219 2414 64 | ||
| Q 2138 -91 1772 -91 | ||
| Q 1169 -91 856 284 | ||
| Q 544 659 544 1381 | ||
| z | ||
| M 1991 3584 | ||
| L 1991 3584 | ||
| z | ||
| " id="DejaVuSans-75" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-53"/> | ||
| <use x="63.476562" xlink:href="#DejaVuSans-70"/> | ||
| <use x="126.953125" xlink:href="#DejaVuSans-65"/> | ||
| <use x="188.476562" xlink:href="#DejaVuSans-65"/> | ||
| <use x="250" xlink:href="#DejaVuSans-64"/> | ||
| <use x="313.476562" xlink:href="#DejaVuSans-75"/> | ||
| <use x="376.855469" xlink:href="#DejaVuSans-70"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <g id="patch_9"> | ||
| <path d="M 61.175 256.16 | ||
| L 61.175 12.96 | ||
| " style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> | ||
| </g> | ||
| <g id="patch_10"> | ||
| <path d="M 563.04 256.16 | ||
| L 563.04 12.96 | ||
| " style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> | ||
| </g> | ||
| <g id="patch_11"> | ||
| <path d="M 61.175 256.16 | ||
| L 563.04 256.16 | ||
| " style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> | ||
| </g> | ||
| <g id="patch_12"> | ||
| <path d="M 61.175 12.96 | ||
| L 563.04 12.96 | ||
| " style="fill:none;stroke:#000000;stroke-linecap:square;stroke-linejoin:miter;stroke-width:0.8;"/> | ||
| </g> | ||
| <g id="text_15"> | ||
| <!-- 3.4× --> | ||
| <g transform="translate(92.229403 170.810443)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 684 794 | ||
| L 1344 794 | ||
| L 1344 0 | ||
| L 684 0 | ||
| L 684 794 | ||
| z | ||
| " id="DejaVuSans-2e" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-33"/> | ||
| <use x="63.623047" xlink:href="#DejaVuSans-2e"/> | ||
| <use x="95.410156" xlink:href="#DejaVuSans-34"/> | ||
| <use x="159.033203" xlink:href="#DejaVuSans-d7"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_16"> | ||
| <!-- 4.8× --> | ||
| <g transform="translate(274.725767 137.888501)scale(0.12 -0.12)"> | ||
| <use xlink:href="#DejaVuSans-34"/> | ||
| <use x="63.623047" xlink:href="#DejaVuSans-2e"/> | ||
| <use x="95.410156" xlink:href="#DejaVuSans-38"/> | ||
| <use x="159.033203" xlink:href="#DejaVuSans-d7"/> | ||
| </g> | ||
| </g> | ||
| <g id="text_17"> | ||
| <!-- 9.5× --> | ||
| <g transform="translate(457.222131 29.573466)scale(0.12 -0.12)"> | ||
| <use xlink:href="#DejaVuSans-39"/> | ||
| <use x="63.623047" xlink:href="#DejaVuSans-2e"/> | ||
| <use x="95.410156" xlink:href="#DejaVuSans-35"/> | ||
| <use x="159.033203" xlink:href="#DejaVuSans-d7"/> | ||
| </g> | ||
| </g> | ||
| <g id="legend_1"> | ||
| <g id="patch_13"> | ||
| <path d="M 71.975 32.878125 | ||
| L 95.975 32.878125 | ||
| L 95.975 24.478125 | ||
| L 71.975 24.478125 | ||
| z | ||
| " style="fill:#0a6efd;stroke:#000000;stroke-linejoin:miter;"/> | ||
| </g> | ||
| <g id="text_18"> | ||
| <!-- fastpdb --> | ||
| <g transform="translate(105.575 32.878125)scale(0.12 -0.12)"> | ||
| <defs> | ||
| <path d="M 2375 4863 | ||
| L 2375 4384 | ||
| L 1825 4384 | ||
| Q 1516 4384 1395 4259 | ||
| Q 1275 4134 1275 3809 | ||
| L 1275 3500 | ||
| L 2222 3500 | ||
| L 2222 3053 | ||
| L 1275 3053 | ||
| L 1275 0 | ||
| L 697 0 | ||
| L 697 3053 | ||
| L 147 3053 | ||
| L 147 3500 | ||
| L 697 3500 | ||
| L 697 3744 | ||
| Q 697 4328 969 4595 | ||
| Q 1241 4863 1831 4863 | ||
| L 2375 4863 | ||
| z | ||
| " id="DejaVuSans-66" transform="scale(0.015625)"/> | ||
| <path d="M 2834 3397 | ||
| L 2834 2853 | ||
| Q 2591 2978 2328 3040 | ||
| Q 2066 3103 1784 3103 | ||
| Q 1356 3103 1142 2972 | ||
| Q 928 2841 928 2578 | ||
| Q 928 2378 1081 2264 | ||
| Q 1234 2150 1697 2047 | ||
| L 1894 2003 | ||
| Q 2506 1872 2764 1633 | ||
| Q 3022 1394 3022 966 | ||
| Q 3022 478 2636 193 | ||
| Q 2250 -91 1575 -91 | ||
| Q 1294 -91 989 -36 | ||
| Q 684 19 347 128 | ||
| L 347 722 | ||
| Q 666 556 975 473 | ||
| Q 1284 391 1588 391 | ||
| Q 1994 391 2212 530 | ||
| Q 2431 669 2431 922 | ||
| Q 2431 1156 2273 1281 | ||
| Q 2116 1406 1581 1522 | ||
| L 1381 1569 | ||
| Q 847 1681 609 1914 | ||
| Q 372 2147 372 2553 | ||
| Q 372 3047 722 3315 | ||
| Q 1072 3584 1716 3584 | ||
| Q 2034 3584 2315 3537 | ||
| Q 2597 3491 2834 3397 | ||
| z | ||
| " id="DejaVuSans-73" transform="scale(0.015625)"/> | ||
| <path d="M 3116 1747 | ||
| Q 3116 2381 2855 2742 | ||
| Q 2594 3103 2138 3103 | ||
| Q 1681 3103 1420 2742 | ||
| Q 1159 2381 1159 1747 | ||
| Q 1159 1113 1420 752 | ||
| Q 1681 391 2138 391 | ||
| Q 2594 391 2855 752 | ||
| Q 3116 1113 3116 1747 | ||
| z | ||
| M 1159 2969 | ||
| Q 1341 3281 1617 3432 | ||
| Q 1894 3584 2278 3584 | ||
| Q 2916 3584 3314 3078 | ||
| Q 3713 2572 3713 1747 | ||
| Q 3713 922 3314 415 | ||
| Q 2916 -91 2278 -91 | ||
| Q 1894 -91 1617 61 | ||
| Q 1341 213 1159 525 | ||
| L 1159 0 | ||
| L 581 0 | ||
| L 581 4863 | ||
| L 1159 4863 | ||
| L 1159 2969 | ||
| z | ||
| " id="DejaVuSans-62" transform="scale(0.015625)"/> | ||
| </defs> | ||
| <use xlink:href="#DejaVuSans-66"/> | ||
| <use x="35.205078" xlink:href="#DejaVuSans-61"/> | ||
| <use x="96.484375" xlink:href="#DejaVuSans-73"/> | ||
| <use x="148.583984" xlink:href="#DejaVuSans-74"/> | ||
| <use x="187.792969" xlink:href="#DejaVuSans-70"/> | ||
| <use x="251.269531" xlink:href="#DejaVuSans-64"/> | ||
| <use x="314.746094" xlink:href="#DejaVuSans-62"/> | ||
| </g> | ||
| </g> | ||
| <g id="patch_14"> | ||
| <path d="M 71.975 50.491875 | ||
| L 95.975 50.491875 | ||
| L 95.975 42.091875 | ||
| L 71.975 42.091875 | ||
| z | ||
| " style="fill:#e1301d;stroke:#000000;stroke-linejoin:miter;"/> | ||
| </g> | ||
| <g id="text_19"> | ||
| <!-- biotite --> | ||
| <g transform="translate(105.575 50.491875)scale(0.12 -0.12)"> | ||
| <use xlink:href="#DejaVuSans-62"/> | ||
| <use x="63.476562" xlink:href="#DejaVuSans-69"/> | ||
| <use x="91.259766" xlink:href="#DejaVuSans-6f"/> | ||
| <use x="152.441406" xlink:href="#DejaVuSans-74"/> | ||
| <use x="191.650391" xlink:href="#DejaVuSans-69"/> | ||
| <use x="219.433594" xlink:href="#DejaVuSans-74"/> | ||
| <use x="258.642578" xlink:href="#DejaVuSans-65"/> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| </g> | ||
| <defs> | ||
| <clipPath id="pdde81a6178"> | ||
| <rect height="243.2" width="501.865" x="61.175" y="12.96"/> | ||
| </clipPath> | ||
| </defs> | ||
| </svg> |
-139
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
| <svg | ||
| xmlns:dc="http://purl.org/dc/elements/1.1/" | ||
| xmlns:cc="http://creativecommons.org/ns#" | ||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||
| xmlns:svg="http://www.w3.org/2000/svg" | ||
| xmlns="http://www.w3.org/2000/svg" | ||
| xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||
| width="512" | ||
| height="512" | ||
| viewBox="0 0 135.46667 135.46666" | ||
| version="1.1" | ||
| id="svg8" | ||
| inkscape:version="1.0.2 (1.0.2+r75+1)" | ||
| sodipodi:docname="icon.svg" | ||
| inkscape:export-filename="/home/kunzmann/data/coding/fastpdb/logo.png" | ||
| inkscape:export-xdpi="96" | ||
| inkscape:export-ydpi="96"> | ||
| <defs | ||
| id="defs2"> | ||
| <marker | ||
| inkscape:stockid="Arrow1Lstart" | ||
| orient="auto" | ||
| refY="0" | ||
| refX="0" | ||
| id="Arrow1Lstart" | ||
| style="overflow:visible" | ||
| inkscape:isstock="true"> | ||
| <path | ||
| id="path5415" | ||
| d="M 0,0 5,-5 -12.5,0 5,5 Z" | ||
| style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt" | ||
| transform="matrix(0.8,0,0,0.8,10,0)" /> | ||
| </marker> | ||
| </defs> | ||
| <sodipodi:namedview | ||
| id="base" | ||
| pagecolor="#ffffff" | ||
| bordercolor="#666666" | ||
| borderopacity="1.0" | ||
| inkscape:pageopacity="0.0" | ||
| inkscape:pageshadow="2" | ||
| inkscape:zoom="0.70710678" | ||
| inkscape:cx="355.23663" | ||
| inkscape:cy="402.66706" | ||
| inkscape:document-units="px" | ||
| inkscape:current-layer="layer1" | ||
| showgrid="false" | ||
| units="px" | ||
| inkscape:window-width="2493" | ||
| inkscape:window-height="1385" | ||
| inkscape:window-x="67" | ||
| inkscape:window-y="27" | ||
| inkscape:window-maximized="1" | ||
| showguides="true" | ||
| inkscape:guide-bbox="true" | ||
| inkscape:lockguides="false" | ||
| inkscape:measure-start="145.66,389.051" | ||
| inkscape:measure-end="69.1955,256.216" | ||
| inkscape:snap-global="true" | ||
| inkscape:document-rotation="0"> | ||
| <sodipodi:guide | ||
| position="223.0097,67.733332" | ||
| orientation="0,1" | ||
| id="guide1444" | ||
| inkscape:label="" | ||
| inkscape:locked="false" | ||
| inkscape:color="rgb(0,0,255)" /> | ||
| </sodipodi:namedview> | ||
| <metadata | ||
| id="metadata5"> | ||
| <rdf:RDF> | ||
| <cc:Work | ||
| rdf:about=""> | ||
| <dc:format>image/svg+xml</dc:format> | ||
| <dc:type | ||
| rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||
| <dc:title></dc:title> | ||
| </cc:Work> | ||
| </rdf:RDF> | ||
| </metadata> | ||
| <g | ||
| inkscape:label="Layer 1" | ||
| inkscape:groupmode="layer" | ||
| id="layer1" | ||
| transform="translate(0,-161.53336)"> | ||
| <g | ||
| id="g1007" | ||
| transform="matrix(0.87087794,0,0,0.87087794,0,29.621848)" | ||
| style="stroke-width:1.14827"> | ||
| <path | ||
| id="path4599" | ||
| d="M 25.823956,252.3405 51.528652,297.00003 90.596627,229.33231 39.1457,229.26651 Z" | ||
| style="fill:#dc7000;fill-opacity:1;stroke:none;stroke-width:0.810893;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| <path | ||
| id="path4573" | ||
| d="m 25.823956,252.3405 -25.782405,44.52493 51.528313,0.0682 z" | ||
| style="fill:#b45c00;fill-opacity:1;stroke:none;stroke-width:0.810893;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| <path | ||
| id="path4593" | ||
| d="m 0,161.60254 25.782158,44.52408 25.745927,-44.59326 z" | ||
| style="fill:#ff982d;fill-opacity:1;stroke:none;stroke-width:0.810893;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| <path | ||
| id="rect4514" | ||
| d="m 51.528085,161.53336 -25.70413,44.65922 13.321745,23.07394 51.450367,-0.0654 z" | ||
| style="fill:#ff8405;fill-opacity:1;stroke:none;stroke-width:0.810893;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| </g> | ||
| <g | ||
| id="g1017" | ||
| transform="matrix(0.87087794,0,0,0.87087794,56.568061,29.621848)" | ||
| style="stroke-width:1.14827"> | ||
| <path | ||
| id="path1009" | ||
| d="M 25.823956,252.3405 51.528652,297.00003 90.596627,229.33231 39.1457,229.26651 Z" | ||
| style="fill:#dc7000;fill-opacity:1;stroke:none;stroke-width:0.810893;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| <path | ||
| id="path1011" | ||
| d="m 25.823956,252.3405 -25.782405,44.52493 51.528313,0.0682 z" | ||
| style="fill:#b45c00;fill-opacity:1;stroke:none;stroke-width:0.810893;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| <path | ||
| id="path1013" | ||
| d="m 0,161.60254 25.782158,44.52408 25.745927,-44.59326 z" | ||
| style="fill:#ff982d;fill-opacity:1;stroke:none;stroke-width:0.810893;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| <path | ||
| id="path1015" | ||
| d="m 51.528085,161.53336 -25.70413,44.65922 13.321745,23.07394 51.450367,-0.0654 z" | ||
| style="fill:#ff8405;fill-opacity:1;stroke:none;stroke-width:0.810893;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| </g> | ||
| </g> | ||
| </svg> |
-175
| <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
| <svg | ||
| xmlns:dc="http://purl.org/dc/elements/1.1/" | ||
| xmlns:cc="http://creativecommons.org/ns#" | ||
| xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||
| xmlns:svg="http://www.w3.org/2000/svg" | ||
| xmlns="http://www.w3.org/2000/svg" | ||
| xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||
| xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||
| width="1024" | ||
| height="512" | ||
| viewBox="0 0 270.93334 135.46666" | ||
| version="1.1" | ||
| id="svg8" | ||
| inkscape:version="1.0.2 (1.0.2+r75+1)" | ||
| sodipodi:docname="logo.svg" | ||
| inkscape:export-filename="/home/kunzmann/data/coding/fastpdb/logo.png" | ||
| inkscape:export-xdpi="96" | ||
| inkscape:export-ydpi="96"> | ||
| <defs | ||
| id="defs2"> | ||
| <marker | ||
| inkscape:stockid="Arrow1Lstart" | ||
| orient="auto" | ||
| refY="0.0" | ||
| refX="0.0" | ||
| id="Arrow1Lstart" | ||
| style="overflow:visible" | ||
| inkscape:isstock="true"> | ||
| <path | ||
| id="path5415" | ||
| d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " | ||
| style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" | ||
| transform="scale(0.8) translate(12.5,0)" /> | ||
| </marker> | ||
| </defs> | ||
| <sodipodi:namedview | ||
| id="base" | ||
| pagecolor="#ffffff" | ||
| bordercolor="#666666" | ||
| borderopacity="1.0" | ||
| inkscape:pageopacity="0.0" | ||
| inkscape:pageshadow="2" | ||
| inkscape:zoom="0.70710678" | ||
| inkscape:cx="352.25774" | ||
| inkscape:cy="296.7534" | ||
| inkscape:document-units="px" | ||
| inkscape:current-layer="layer1" | ||
| showgrid="false" | ||
| units="px" | ||
| inkscape:window-width="1853" | ||
| inkscape:window-height="1025" | ||
| inkscape:window-x="67" | ||
| inkscape:window-y="27" | ||
| inkscape:window-maximized="1" | ||
| showguides="true" | ||
| inkscape:guide-bbox="true" | ||
| inkscape:lockguides="false" | ||
| inkscape:measure-start="145.66,389.051" | ||
| inkscape:measure-end="69.1955,256.216" | ||
| inkscape:snap-global="true" | ||
| inkscape:document-rotation="0"> | ||
| <sodipodi:guide | ||
| position="217.07488,178.22888" | ||
| orientation="1,0" | ||
| id="guide1033" /> | ||
| <sodipodi:guide | ||
| position="176.23753,67.740565" | ||
| orientation="0,-1" | ||
| id="guide1035" /> | ||
| </sodipodi:namedview> | ||
| <metadata | ||
| id="metadata5"> | ||
| <rdf:RDF> | ||
| <cc:Work | ||
| rdf:about=""> | ||
| <dc:format>image/svg+xml</dc:format> | ||
| <dc:type | ||
| rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||
| <dc:title /> | ||
| </cc:Work> | ||
| </rdf:RDF> | ||
| </metadata> | ||
| <g | ||
| inkscape:label="Layer 1" | ||
| inkscape:groupmode="layer" | ||
| id="layer1" | ||
| transform="translate(0,-161.53336)"> | ||
| <g | ||
| id="g1007"> | ||
| <path | ||
| id="path4599" | ||
| d="M 25.823956,252.3405 51.528652,297.00003 90.596627,229.33231 39.1457,229.26651 Z" | ||
| style="fill:#dc7000;fill-opacity:1;stroke:none;stroke-width:0.706189;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| <path | ||
| id="path4573" | ||
| d="m 25.823956,252.3405 -25.782405,44.52493 51.528313,0.0682 z" | ||
| style="fill:#b45c00;fill-opacity:1;stroke:none;stroke-width:0.706189;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| <path | ||
| id="path4593" | ||
| d="m 0,161.60254 25.782158,44.52408 25.745927,-44.59326 z" | ||
| style="fill:#ff982d;fill-opacity:1;stroke:none;stroke-width:0.706189;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| <path | ||
| id="rect4514" | ||
| d="m 51.528085,161.53336 -25.70413,44.65922 13.321745,23.07394 51.450367,-0.0654 z" | ||
| style="fill:#ff8405;fill-opacity:1;stroke:none;stroke-width:0.706189;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| </g> | ||
| <g | ||
| id="g1017" | ||
| transform="translate(64.955212)"> | ||
| <path | ||
| id="path1009" | ||
| d="M 25.823956,252.3405 51.528652,297.00003 90.596627,229.33231 39.1457,229.26651 Z" | ||
| style="fill:#dc7000;fill-opacity:1;stroke:none;stroke-width:0.706189;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| <path | ||
| id="path1011" | ||
| d="m 25.823956,252.3405 -25.782405,44.52493 51.528313,0.0682 z" | ||
| style="fill:#b45c00;fill-opacity:1;stroke:none;stroke-width:0.706189;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| <path | ||
| id="path1013" | ||
| d="m 0,161.60254 25.782158,44.52408 25.745927,-44.59326 z" | ||
| style="fill:#ff982d;fill-opacity:1;stroke:none;stroke-width:0.706189;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| <path | ||
| id="path1015" | ||
| d="m 51.528085,161.53336 -25.70413,44.65922 13.321745,23.07394 51.450367,-0.0654 z" | ||
| style="fill:#ff8405;fill-opacity:1;stroke:none;stroke-width:0.706189;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" | ||
| inkscape:connector-curvature="0" /> | ||
| </g> | ||
| <g | ||
| aria-label="fast" | ||
| id="text1023" | ||
| style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:70.5556px;line-height:1.25;font-family:Iceland;-inkscape-font-specification:'Iceland, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#dc7000;fill-opacity:1;stroke-width:0.264583"> | ||
| <path | ||
| d="m 187.11504,179.57298 -4.30389,4.23334 h -11.9239 v 13.40556 l 2.89278,-2.82222 h 12.62945 l -4.30389,4.23334 h -11.21834 v 20.46112 h -4.93889 v -34.57224 q 0,-2.04612 1.41111,-3.45723 1.48167,-1.48167 3.52778,-1.48167 z" | ||
| style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:70.5556px;font-family:Iceland;-inkscape-font-specification:'Iceland, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#dc7000;fill-opacity:1;stroke-width:0.264583" | ||
| id="path854" /> | ||
| <path | ||
| d="m 214.64826,219.08412 h -4.93889 v -3.59833 l -4.23334,3.59833 h -10.58334 q -2.04611,0 -3.52778,-1.41111 -1.41111,-1.48167 -1.41111,-3.52778 v -4.93889 q 0,-2.04612 1.41111,-3.45723 1.48167,-1.48166 3.52778,-1.48166 h 14.11112 l -4.23333,4.16278 h -9.87779 v 6.42056 h 14.81668 V 198.623 H 189.9538 l 4.23333,-4.23334 h 15.52224 q 2.04611,0 3.45722,1.48167 1.48167,1.41111 1.48167,3.45722 z" | ||
| style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:70.5556px;font-family:Iceland;-inkscape-font-specification:'Iceland, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#dc7000;fill-opacity:1;stroke-width:0.264583" | ||
| id="path856" /> | ||
| <path | ||
| d="m 244.60683,194.38966 -4.30389,4.23334 h -11.9239 v 5.64445 h 9.87779 q 2.04611,0 3.45722,1.48166 1.48167,1.41111 1.48167,3.45723 v 4.93889 q 0,2.04611 -1.48167,3.52778 -1.41111,1.41111 -3.45722,1.41111 h -14.81668 v -4.23333 h 14.81668 v -6.35001 h -9.87779 q -2.04611,0 -3.52778,-1.41111 -1.41111,-1.48167 -1.41111,-3.52778 v -4.23334 q 0,-2.04611 1.41111,-3.45722 1.48167,-1.48167 3.52778,-1.48167 z" | ||
| style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:70.5556px;font-family:Iceland;-inkscape-font-specification:'Iceland, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#dc7000;fill-opacity:1;stroke-width:0.264583" | ||
| id="path858" /> | ||
| <path | ||
| d="m 268.28706,219.08412 h -9.87779 q -2.04611,0 -3.52778,-1.41111 -1.41111,-1.48167 -1.41111,-3.52778 V 198.623 h -7.05556 l 4.23334,-4.23334 h 2.82222 v -4.93889 l 4.93889,-4.93889 v 9.87778 h 9.87779 v 4.23334 h -9.87779 v 16.22779 h 9.87779 z" | ||
| style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:70.5556px;font-family:Iceland;-inkscape-font-specification:'Iceland, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#dc7000;fill-opacity:1;stroke-width:0.264583" | ||
| id="path860" /> | ||
| </g> | ||
| <g | ||
| aria-label="pdb" | ||
| id="text1031" | ||
| style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:70.5556px;line-height:1.25;font-family:Iceland;-inkscape-font-specification:'Iceland, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ff8405;fill-opacity:1;stroke-width:0.264583"> | ||
| <path | ||
| d="m 194.17054,265.47413 q 0,2.04612 -1.48167,3.52778 -1.41111,1.41111 -3.45722,1.41111 h -14.81668 v 14.81668 h -4.93889 v -39.51114 h 4.93889 v 3.52778 l 3.52778,-3.52778 h 11.2889 q 2.04611,0 3.45722,1.48167 1.48167,1.41111 1.48167,3.45723 z m -4.93889,0.70556 V 249.9519 h -14.81668 v 19.75557 l 3.52778,-3.52778 z" | ||
| style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:70.5556px;font-family:Iceland;-inkscape-font-specification:'Iceland, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ff8405;fill-opacity:1;stroke-width:0.264583" | ||
| id="path863" /> | ||
| <path | ||
| d="m 228.75932,270.41302 h -4.93889 v -3.52778 l -3.52778,3.52778 h -11.2889 q -2.04611,0 -3.52778,-1.41111 -1.41111,-1.48166 -1.41111,-3.52778 v -14.81667 q 0,-2.04612 1.41111,-3.45723 1.48167,-1.48167 3.52778,-1.48167 h 14.81668 v -11.28889 l 4.93889,-4.93889 z m -4.93889,-4.23333 v -19.75557 l -3.52778,3.52778 h -11.2889 v 16.22779 z" | ||
| style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:70.5556px;font-family:Iceland;-inkscape-font-specification:'Iceland, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ff8405;fill-opacity:1;stroke-width:0.264583" | ||
| id="path865" /> | ||
| <path | ||
| d="m 264.74268,265.47413 q 0,2.04612 -1.48167,3.52778 -1.41111,1.41111 -3.45722,1.41111 h -14.81668 v -4.16278 l -4.93889,4.86834 v -36.68891 l 4.93889,-4.93889 v 19.75556 l 3.52778,-3.52778 h 11.2889 q 2.04611,0 3.45722,1.48167 1.48167,1.41111 1.48167,3.45723 z m -4.93889,0.70556 V 249.9519 h -14.81668 v 16.22779 z" | ||
| style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:70.5556px;font-family:Iceland;-inkscape-font-specification:'Iceland, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ff8405;fill-opacity:1;stroke-width:0.264583" | ||
| id="path867" /> | ||
| </g> | ||
| </g> | ||
| </svg> |
Alert delta unavailable
Currently unable to show alert delta for PyPI packages.
13236562
-0.28%28
-9.68%514
-10.61%