diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..fd59a97bbf --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly + groups: + dependencies: + patterns: + - "*" diff --git a/.github/workflows/test_pytest.yml b/.github/workflows/test_pytest.yml index 4e9322f40e..e4c624e909 100644 --- a/.github/workflows/test_pytest.yml +++ b/.github/workflows/test_pytest.yml @@ -2,101 +2,101 @@ name: tests_pytest on: [push, pull_request, workflow_dispatch] defaults: - run: - shell: bash -l {0} + run: + shell: bash -l {0} jobs: - check_versions_matches: - name: Check deeptools version matches galaxy tools - runs-on: ubuntu-latest - if: github.base_ref == 'master' - steps: - - uses: actions/checkout@v4 - - name: Check path - run: find /home/runner/work/deepTools/deepTools -name "pyproject.toml" - - name: Get Version of Deeptools - run: echo "deeptools_version=$(grep "version" /home/runner/work/deepTools/deepTools/pyproject.toml | awk '{print substr($NF, 2, length($NF) - 2)}')" >> $GITHUB_ENV - - name: Get Version of Galaxy tools - run: echo "galaxy_deeptools_version=$(grep "token.*TOOL_VERSION" /home/runner/work/deepTools/deepTools/galaxy/wrapper/deepTools_macros.xml | awk -F '>|<' '{print $3}')" >> $GITHUB_ENV - - name: Versions - run: | - echo deeptools version=${deeptools_version} - echo deeptools version in galaxy=${galaxy_deeptools_version} - - name: Fail PR if versions not matching - run: | - if [ -z $galaxy_deeptools_version ]; then - echo "galaxy_deeptools_version not defined change the github action" - exit 1 - fi - if [ -z $deeptools_version ]; then - echo "deeptools_version not defined change the github action" - exit 1 - fi - if [ "$galaxy_deeptools_version" != "$deeptools_version" ]; then - echo "versions do not match" - exit 1 - fi - build-linux: - name: Test on Linux - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ['3.9','3.10', '3.11', '3.12', '3.13'] - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - cache: 'pip' - - name: Install Rust - uses: actions-rust-lang/setup-rust-toolchain@v1 - - name: build deeptools - run: | - python -m venv venv - source venv/bin/activate - pip install maturin - maturin develop --release --extras actions - - name: test deeptools - run: | - source venv/bin/activate - pytest -v - - name: build wheel - run: | - source venv/bin/activate - python -m build - - name: test wheel - run: | - source venv/bin/activate - pip install dist/*whl - build-osx: - name: Test on OSX - runs-on: macOS-latest - strategy: - matrix: - python-version: ['3.9','3.10', '3.11', '3.12', '3.13'] - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - cache: 'pip' - - name: Install Rust - uses: actions-rust-lang/setup-rust-toolchain@v1 - - name: build deeptools - run: | - python -m venv venv - source venv/bin/activate - pip install maturin - maturin develop --release --extras actions - - name: test deeptools - run: | - source venv/bin/activate - pytest -v - - name: build wheel - run: | - source venv/bin/activate - python -m build - - name: test wheel - run: | - source venv/bin/activate - pip install dist/*whl \ No newline at end of file + check_versions_matches: + name: Check deeptools version matches galaxy tools + runs-on: ubuntu-latest + if: github.base_ref == 'master' + steps: + - uses: actions/checkout@v7 + - name: Check path + run: find /home/runner/work/deepTools/deepTools -name "pyproject.toml" + - name: Get Version of Deeptools + run: echo "deeptools_version=$(grep "version" /home/runner/work/deepTools/deepTools/pyproject.toml | awk '{print substr($NF, 2, length($NF) - 2)}')" >> $GITHUB_ENV + - name: Get Version of Galaxy tools + run: echo "galaxy_deeptools_version=$(grep "token.*TOOL_VERSION" /home/runner/work/deepTools/deepTools/galaxy/wrapper/deepTools_macros.xml | awk -F '>|<' '{print $3}')" >> $GITHUB_ENV + - name: Versions + run: | + echo deeptools version=${deeptools_version} + echo deeptools version in galaxy=${galaxy_deeptools_version} + - name: Fail PR if versions not matching + run: | + if [ -z $galaxy_deeptools_version ]; then + echo "galaxy_deeptools_version not defined change the github action" + exit 1 + fi + if [ -z $deeptools_version ]; then + echo "deeptools_version not defined change the github action" + exit 1 + fi + if [ "$galaxy_deeptools_version" != "$deeptools_version" ]; then + echo "versions do not match" + exit 1 + fi + build-linux: + name: Test on Linux + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.12", "3.13", "3.14"] + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python-version }} + cache: "pip" + - name: Install Rust + uses: actions-rust-lang/setup-rust-toolchain@v1 + - name: build deeptools + run: | + python -m venv venv + source venv/bin/activate + pip install maturin + maturin develop --release --extras actions + - name: test deeptools + run: | + source venv/bin/activate + pytest -v + - name: build wheel + run: | + source venv/bin/activate + python -m build + - name: test wheel + run: | + source venv/bin/activate + pip install dist/*whl + build-osx: + name: Test on OSX + runs-on: macOS-latest + strategy: + matrix: + python-version: ["3.12", "3.13", "3.14"] + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python-version }} + cache: "pip" + - name: Install Rust + uses: actions-rust-lang/setup-rust-toolchain@v1 + - name: build deeptools + run: | + python -m venv venv + source venv/bin/activate + pip install maturin + maturin develop --release --extras actions + - name: test deeptools + run: | + source venv/bin/activate + pytest -v + - name: build wheel + run: | + source venv/bin/activate + python -m build + - name: test wheel + run: | + source venv/bin/activate + pip install dist/*whl diff --git a/.github/workflows/test_rust.yml b/.github/workflows/test_rust.yml index 47728e18b5..438148ba11 100644 --- a/.github/workflows/test_rust.yml +++ b/.github/workflows/test_rust.yml @@ -1,14 +1,19 @@ name: tests_rust -on: [push, pull_request, workflow_dispatch] +on: + push: + pull_request: + workflow_dispatch: + schedule: + - cron: "0 0 * * 0" jobs: - cargo_test: - name: run cargo test - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - run: rustup update stable && rustup default stable - - name: cargo build - run: cargo build --verbose - - name: cargo test - run: cargo test --verbose \ No newline at end of file + cargo_test: + name: run cargo test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + - run: rustup update stable && rustup default stable + - name: cargo build + run: cargo build --verbose + - name: cargo test + run: cargo test --verbose diff --git a/.gitignore b/.gitignore index f6d59b9041..461ed4db1b 100755 --- a/.gitignore +++ b/.gitignore @@ -69,4 +69,7 @@ target* # jupyter notebooks .ipynb_checkpoints *.ipynb_checkpoints -*.ipynb \ No newline at end of file +*.ipynb + +# pixi +.pixi* diff --git a/Cargo.toml b/Cargo.toml index 3ceb5991e6..67ef0af27c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,13 +10,13 @@ crate-type = ["cdylib"] [dependencies] openssl-sys = { version = "*", features = ["vendored"] } -pyo3 = { version = "0.23.4", features = ["extension-module"] } -rust-htslib = "0.49.0" -rayon = "1.10.0" -itertools = "0.14.0" -bigtools = "0.5.3" +pyo3 = { version = "*", features = ["extension-module"] } +rust-htslib = "*" +rayon = "*" tokio = "*" +itertools = "*" +bigtools = "*" flate2 = "*" tempfile = "*" -ndarray = "0.16.1" -ndarray-npy = "*" \ No newline at end of file +ndarray = "*" +ndarray-npy = "*" diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 0000000000..13d75d908f --- /dev/null +++ b/pixi.lock @@ -0,0 +1,5681 @@ +version: 7 +platforms: +- name: linux-64 +- name: osx-64 +- name: osx-arm64 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + - url: https://conda.anaconda.org/bioconda/ + indexes: + - https://pypi.org/simple + packages: + linux-64: + - conda: https://conda.anaconda.org/bioconda/linux-64/htslib-1.19-h81da01d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-bootstrap_h59bd682_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-18-18.1.7-default_h9bb3924_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-18.1.7-default_h90ac42e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-18-18.1.7-default_h9bb3924_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-18.1.7-default_h9bb3924_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-tools-18.1.7-default_h9bb3924_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clangdev-18.1.7-default_h9bb3924_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx-18.1.7-default_h127d8a8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-bootstrap_ha15bf96_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-18.1.7-default_h9bb3924_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp-18.1.7-default_h9bb3924_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.7-default_h9bb3924_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.7-default_h087397f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.7-hb77312f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-tools-18.1.7-hb77312f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmdev-18.1.7-hb77312f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.8.3-ha02ee65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.8.3-ha02ee65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_119.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - pypi: . + - pypi: https://files.pythonhosted.org/packages/00/01/4001033457f25ecdc2b1ffd513ca0b76200b9ea009dd64f6c1aad2dde133/boltons-26.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/08/f6/af32e23e563971ffb0fb86be52bc5be5c2c118858ffc119bf6a9039b173d/lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/0b/35/1cceccc5fcb50fa2ed53e2aa278cd032f3902682a73e763fb1ac3be8e6fa/rich_argparse-1.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/c2/6604a71269e0c1bd75656d5a001432d16f2cc5b8c057140ec797155c295e/rdflib-7.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/37/a065dc3bd6e49423a6532c642ca7378d3f467b1ef44c2800c937af7f9739/filelock-3.29.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/14/15/5574111ae50dd6e879456888c0eadd4c5a869959775854e18e18a6b345f3/propcache-0.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/15/1c/991e414e4305e5aef60c8ebb51f35a2e1b12cf80b9fc41733bbdd070c037/galaxy_tool_util-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/3e/4253fa84dd1947207033df2fecd52781e7e2f6d65c4360f38d739bb3c8c9/galaxy_util-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/82/a70006589557f267f15bd384c0642ad49f0d97b690c3a05b166b9dcbad3b/python_discovery-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/bd/9c0d5d6983905ce2c9edaa073a7e89355a9cf7f396988e05d32f1c37785d/maturin-1.14.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/20/9c/d445818389df371f56d141d881153ba23183c4735a03f7356ffb43f7757d/aiohttp-3.14.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/02/3623e6169bed617ed1e2d372f7c69f92ec28d54c4dfc997055c8578ec148/virtualenv-21.5.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/8e/b94ec25fcd4384de2a1f5e0403284f005ec743c04bafdb6698c851df5c6d/tuspy-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/aa/111610d8bf5b1bb7a295a048fc648cec346347a8b0be5881defd2d1b4a52/oyaml-1.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3a/7a/882d99539b19b1490cac5d77c67338d126e4122c8276bf640e411650c830/twine-6.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/3c/6b/72e5f22f3c5069bd950f107110cd17468cdb43abda3c55b48c4013e7b667/bioblend-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/6f/221654a39431edc7e9685702ab06fbb22bb313629e0187c0ed4462ba8af7/schema_salad-8.9.20260417192335-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/77/de194443bf38daed9452139e960c632b0ef9f9a5dd9ce605fdf18ca9f1b1/id-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/48/ca/36339329c4604adbcc99c899b7eb1ce1a555c499b6a6860757dc9bfed36d/narwhals-2.22.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/53/78/ddd0affa881b1e09bc59f11ab829a7904f4bca29d25c34cbb9395e8e0061/allure_python_commons-2.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/55/0f/e7f1ff3a1cabc6c4486a7ee1b0506aedf2f5f8329760ac1f4e8032feef2b/pysam-0.24.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/58/9d/40b6267367182187139a4000b82a3b287d84d745bccd808e75d916920e9d/bleach-6.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/5b/67/314f6151bad77a93d751978a344033e1fc890822f05f0416079338e34231/nh3-0.3.6-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5f/fc/a7bf5b6e4e617b45f90f2d9d2a68519c249c81dd4fc2658c7a2a61c4f4b7/aiohappyeyeballs-2.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/65/b6/09b01cdbc15224e2850365192d17b7bdebb8bdbd8780ed221fcdf0d9a515/pandas-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6a/fd/6adabd4f6d5e686f97dd02ce7fce3fe4cf672cbac36b8f67ff4040e8ad8b/msgpack-1.2.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6b/67/6ea73b2173bcb1abe3a947fbd090cf96ee1b0a75f3f690e8902dc8ffdbfa/py2bit-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6b/b2/d17b2722c636d64b4e77ddc68d8d0625719d39f94021be8719a218af4c0a/backports_zstd-1.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/6c/c2/63fdda36c56437eeb44aaf9493c8bcd62ce230ab1598924fc626ffbfa943/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/74/f5/9373290775639cb67a2fce7f629a1c240dce9f12fe927bc32b2736e16dfc/argcomplete-3.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/78/17/853354204e1ca022d6b7d011ca7f3206c4f8faa3cc743e92609b49c1d83f/tinydb-4.8.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7a/da/323a01c349bd5fb01bb6652e314d9bb218cee630a736bdb810ad50e4013f/yarl-1.24.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7a/f6/51d8a97116de23c9280c1fa3b813bc088f8571ce5936ba84af1ecf13ed45/pybigwig-0.3.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/32/a7125fb28c4261a627f999d5fb4afff25b523800faed2c30979949d6facd/pydot-4.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/59/208f71d70ddc6184f79b8c6d87d46eb7d7b12c19186a817dec9c9c3f3693/tifffile-2026.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/f3/d7b4c8c9b6657ff0db27b739894ed0665fa8f3c78a7452bf74d6447f6865/zipstream_new-1.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/0c/b3288ee003c344356cd505ba8d85286e8f0d4d4177a13d8eed7db6e7c688/planemo-0.75.44-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/8e/b4/23f8462c72e514563f5fd949e38a9e45bcc86fb59bf4b88240ba0ef02026/cwl_utils-0.42-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/fb/2c4c618185be2bda327f9dacd16b3122cc938809f19df7be840595d0e584/prov-1.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/7a/8017d45e513c720ee82bf062b1be3ae39087db3024571b4a00773e17c235/galaxy_job_config_init-0.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/94/95/7f522393c88313336b20d70fc849555757b2e5febc22b83b3a3f0fd4bce9/matplotlib-3.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/96/9a/982e48afcffcd727a9144506720ffd4224b6b7e355c98641866f38b7c043/jaraco_functools-4.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/1b/295bf2fa3e740131778065e5ffa2c481f0e7210182d408e9a2c244ff5b0c/readme_renderer-45.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9f/27/3c3e5398fa49227b2dd67211b4402c84ed9d5b48a4257bf5b1196f9b6a8e/ct3-3.4.0.post5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ac/1f/d10d6ad23c86c62d90d867d0506881a392ec6ef06885b858eaab868dd356/deeptoolsintervals-0.1.9.tar.gz + - pypi: https://files.pythonhosted.org/packages/ac/3e/61d11b779e4e83ee8661439af070f6f138060cd41f0346a0a70432f9e55c/cwl_upgrader-1.2.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/97/0535f7d3f45d3853f79a11988d8faf798de684d902579126449455506e2f/ephemeris-0.10.11-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b8/0c/51f6841f1d84f404f92463fc2b1ba0da357ca1e3db6b7fbda26956c3b82a/ruamel_yaml-0.19.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bb/6b/f4a3d0637692c49da8ef99d72d52526f92e0a8d6ac4f0ca9f31441b9d9ea/numpy-2.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/2f/7229e91cfa37459622808002bec6eb019c7189bfc59788b3eaba5f273671/conda_package_streaming-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/74/3d6534c6ce0802bf085a32908b093e6a4123443050299bcc6e3828a9bf3e/cwltool-3.2.20260413085819-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/a5/bbbc3b74a94fbdbd7915e7ad030f16539bfdc1362f7e9003b594f0537950/glob2-0.7.tar.gz + - pypi: https://files.pythonhosted.org/packages/d9/b0/1e05aa4e0124cbc6509641353f513fc29c2b5e5197dbd5dfade810a521cf/galaxy_tool_util_models-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dd/aa/1b939f6c67ed68635bb538e6752d3dacc02f66535182e939a89581a44e9c/scipy-1.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e3/78/47a205b5921bd86ef8d174fcda3daf23d65ad2887b38771935a064acd348/gxformat2-0.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/17/d9ad109c8d7f05e6e78a79c4ec410ad3d38877b3efe18896eae6c446b534/edam_ontology-1.25.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/79/c45f2d53efe6ada1110cf6f9fca095e4ff47a0454444aefdde6ac4789179/cachecontrol-0.14.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/38/8b6fc7a8153cb49eb3a9a13acfa9eeb6cc476e37888781e593e6f02ac05e/spython-0.3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl + osx-64: + - conda: https://conda.anaconda.org/bioconda/osx-64/htslib-1.10-h9f635df_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-18-18.1.7-default_h4c8afb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-18.1.7-default_ha3b9224_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-format-18-18.1.7-default_h4c8afb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-format-18.1.7-default_h4c8afb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clang-tools-18.1.7-default_h4c8afb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clangdev-18.1.7-default_h4c8afb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx-18.1.7-default_ha3b9224_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h3ddfcb2_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-18.1.7-default_h4c8afb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp-18.1.7-default_h4c8afb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp18.1-18.1.7-default_h4c8afb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-18.1.7-default_h0449792_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.20.0-h8f0b9e4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.8-h19cb2f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.1-hcc62823_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm18-18.1.7-hd5e122f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-devel-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.13.9-he1bc88e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.7-hd5e122f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvmdev-18.1.7-hd5e122f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.3-h1411813_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.8.3-h6a5a847_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-gpl-tools-5.8.3-h6a5a847_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-tools-5.8.3-hbb4bfdb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.2-hbb4bfdb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda + - pypi: . + - pypi: https://files.pythonhosted.org/packages/00/01/4001033457f25ecdc2b1ffd513ca0b76200b9ea009dd64f6c1aad2dde133/boltons-26.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0b/35/1cceccc5fcb50fa2ed53e2aa278cd032f3902682a73e763fb1ac3be8e6fa/rich_argparse-1.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl + - pypi: https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/c2/6604a71269e0c1bd75656d5a001432d16f2cc5b8c057140ec797155c295e/rdflib-7.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/37/a065dc3bd6e49423a6532c642ca7378d3f467b1ef44c2800c937af7f9739/filelock-3.29.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/14/27/cc422d11961a00bd04aa9a8d9a63683a1083fe2e6a491c285a94998d6751/pysam-0.24.0-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/15/1c/991e414e4305e5aef60c8ebb51f35a2e1b12cf80b9fc41733bbdd070c037/galaxy_tool_util-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/3e/4253fa84dd1947207033df2fecd52781e7e2f6d65c4360f38d739bb3c8c9/galaxy_util-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/82/a70006589557f267f15bd384c0642ad49f0d97b690c3a05b166b9dcbad3b/python_discovery-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/bb/009af3a9532d4cc66d5385391c512210fae32ab2442605f26aca1d8d2957/backports_zstd-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz + - pypi: https://files.pythonhosted.org/packages/22/00/ff3009c88e65de8011630acf8ab5a09cb2becd2aaf47fba2f3449f6224e9/lxml-6.1.1-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/24/f1/392f8c5bfc16f66a0d2d41561c01627c228fe7ed2a0d056ef11315042570/pandas-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/02/3623e6169bed617ed1e2d372f7c69f92ec28d54c4dfc997055c8578ec148/virtualenv-21.5.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/8e/b94ec25fcd4384de2a1f5e0403284f005ec743c04bafdb6698c851df5c6d/tuspy-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/aa/111610d8bf5b1bb7a295a048fc648cec346347a8b0be5881defd2d1b4a52/oyaml-1.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3a/7a/882d99539b19b1490cac5d77c67338d126e4122c8276bf640e411650c830/twine-6.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3c/6b/72e5f22f3c5069bd950f107110cd17468cdb43abda3c55b48c4013e7b667/bioblend-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3d/6f/221654a39431edc7e9685702ab06fbb22bb313629e0187c0ed4462ba8af7/schema_salad-8.9.20260417192335-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/77/de194443bf38daed9452139e960c632b0ef9f9a5dd9ce605fdf18ca9f1b1/id-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/a0/c815bea63117fa63e4e1c01f8a1110d2112fa003f838e6467094ec2432ce/fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/46/3b/9dedd2e35cebcd4eb3539514b5ac674fd45654404839e6f9eff6e25d67c7/py2bit-1.0.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/48/ca/36339329c4604adbcc99c899b7eb1ce1a555c499b6a6860757dc9bfed36d/narwhals-2.22.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/53/78/ddd0affa881b1e09bc59f11ab829a7904f4bca29d25c34cbb9395e8e0061/allure_python_commons-2.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/58/9d/40b6267367182187139a4000b82a3b287d84d745bccd808e75d916920e9d/bleach-6.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/5f/fc/a7bf5b6e4e617b45f90f2d9d2a68519c249c81dd4fc2658c7a2a61c4f4b7/aiohappyeyeballs-2.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/6a/19/ca10ead60b0acc80b2b833c2c4a4f2ff753d0f58b811f70d911c7e94a25c/scipy-1.18.0-cp312-cp312-macosx_10_15_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/74/f5/9373290775639cb67a2fce7f629a1c240dce9f12fe927bc32b2736e16dfc/argcomplete-3.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/17/853354204e1ca022d6b7d011ca7f3206c4f8faa3cc743e92609b49c1d83f/tinydb-4.8.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7e/32/a7125fb28c4261a627f999d5fb4afff25b523800faed2c30979949d6facd/pydot-4.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/59/208f71d70ddc6184f79b8c6d87d46eb7d7b12c19186a817dec9c9c3f3693/tifffile-2026.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/f3/d7b4c8c9b6657ff0db27b739894ed0665fa8f3c78a7452bf74d6447f6865/zipstream_new-1.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/0c/b3288ee003c344356cd505ba8d85286e8f0d4d4177a13d8eed7db6e7c688/planemo-0.75.44-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/b4/23f8462c72e514563f5fd949e38a9e45bcc86fb59bf4b88240ba0ef02026/cwl_utils-0.42-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/fb/2c4c618185be2bda327f9dacd16b3122cc938809f19df7be840595d0e584/prov-1.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/7a/8017d45e513c720ee82bf062b1be3ae39087db3024571b4a00773e17c235/galaxy_job_config_init-0.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/9a/982e48afcffcd727a9144506720ffd4224b6b7e355c98641866f38b7c043/jaraco_functools-4.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/c2/2a1605af41829cd2a247271b5b6f6b2dbc2e9407df2dd9bcafdceafcd4b3/ct3-3.4.0.post5.tar.gz + - pypi: https://files.pythonhosted.org/packages/97/1b/295bf2fa3e740131778065e5ffa2c481f0e7210182d408e9a2c244ff5b0c/readme_renderer-45.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ac/1f/d10d6ad23c86c62d90d867d0506881a392ec6ef06885b858eaab868dd356/deeptoolsintervals-0.1.9.tar.gz + - pypi: https://files.pythonhosted.org/packages/ac/20/75f915ff375d6249e6550ac740fdbbd66159a068fd3af1400ff62036b07a/scikit_learn-1.9.0-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ac/3e/61d11b779e4e83ee8661439af070f6f138060cd41f0346a0a70432f9e55c/cwl_upgrader-1.2.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/97/0535f7d3f45d3853f79a11988d8faf798de684d902579126449455506e2f/ephemeris-0.10.11-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b8/0c/51f6841f1d84f404f92463fc2b1ba0da357ca1e3db6b7fbda26956c3b82a/ruamel_yaml-0.19.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bc/dd/9e8cbd8f5582ca4b590336f2b91ee5662f6a6ca562b565abaf696a0f81ff/msgpack-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/bf/1d/fcefb70922ea2268a8971d8e5874d9a8218644200fb8465f1dcad55e6851/yarl-1.24.2-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c2/82/280619e0bd7bf2454987e19282616e84762255dd9c8468f62382e8c191f1/aiohttp-3.14.1-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c8/c0/5d4119dba94093bbafede500d3defd2f5eab7897732998c04b54021e530b/h5py-3.16.0-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/2f/7229e91cfa37459622808002bec6eb019c7189bfc59788b3eaba5f273671/conda_package_streaming-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/cf/f4/672930ad51bbc135f51cac89577155f1d0c2d120375fc77978d3aa071bb7/pybigwig-0.3.25.tar.gz + - pypi: https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/d4/74/3d6534c6ce0802bf085a32908b093e6a4123443050299bcc6e3828a9bf3e/cwltool-3.2.20260413085819-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/a5/bbbc3b74a94fbdbd7915e7ad030f16539bfdc1362f7e9003b594f0537950/glob2-0.7.tar.gz + - pypi: https://files.pythonhosted.org/packages/d9/b0/1e05aa4e0124cbc6509641353f513fc29c2b5e5197dbd5dfade810a521cf/galaxy_tool_util_models-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/17/f5276b496c61477a6c4fc5e7401f4bfe1c2e5ef7c6cd67896f2ade3809cb/matplotlib-3.11.0-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e3/78/47a205b5921bd86ef8d174fcda3daf23d65ad2887b38771935a064acd348/gxformat2-0.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e6/13/b8ae04c59392f8d11c6cd9fb4011d1dc7c86b81225c770280300e259ffe1/propcache-0.5.2-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ec/17/d9ad109c8d7f05e6e78a79c4ec410ad3d38877b3efe18896eae6c446b534/edam_ontology-1.25.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/79/c45f2d53efe6ada1110cf6f9fca095e4ff47a0454444aefdde6ac4789179/cachecontrol-0.14.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f3/ab/a7653bce9a3b204be6a6931767a9e23595807bb84790ce6685e4d7e5bd08/nh3-0.3.6-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/38/8b6fc7a8153cb49eb3a9a13acfa9eeb6cc476e37888781e593e6f02ac05e/spython-0.3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fa/0a/11486d02add7b1384dff7374d124b1cfbb0ee864dcc9f6a2c0380638cf84/numpy-2.5.0-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fe/83/294bca639b0e052f1e2f65199b3db258780c7d4e31408b934c9c974a1379/maturin-1.14.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl + - pypi: https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl + - pypi: https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl + osx-arm64: + - conda: https://conda.anaconda.org/bioconda/osx-arm64/htslib-1.10-hfcd771d_2.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-format-19-19.1.7-default_hf3020a7_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-format-19.1.7-default_hf3020a7_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-tools-19.1.7-default_h1589341_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangdev-19.1.7-default_hf3020a7_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_ha2625f7_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-19.1.7-default_hf3020a7_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp-19.1.7-default_hf3020a7_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.7-default_h13b06bd_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.22-hd74edd7_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.8-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmdev-19.1.7-h91fd4e7_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-h156bc91_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + - pypi: . + - pypi: https://files.pythonhosted.org/packages/00/01/4001033457f25ecdc2b1ffd513ca0b76200b9ea009dd64f6c1aad2dde133/boltons-26.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0b/35/1cceccc5fcb50fa2ed53e2aa278cd032f3902682a73e763fb1ac3be8e6fa/rich_argparse-1.8.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/10/c2/6604a71269e0c1bd75656d5a001432d16f2cc5b8c057140ec797155c295e/rdflib-7.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/37/a065dc3bd6e49423a6532c642ca7378d3f467b1ef44c2800c937af7f9739/filelock-3.29.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/13/e2/2e325795566de01d0d7c3bb57d3c370616b2d07b01214e84eec5d3b10963/lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/15/1c/991e414e4305e5aef60c8ebb51f35a2e1b12cf80b9fc41733bbdd070c037/galaxy_tool_util-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/3e/4253fa84dd1947207033df2fecd52781e7e2f6d65c4360f38d739bb3c8c9/galaxy_util-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1a/82/a70006589557f267f15bd384c0642ad49f0d97b690c3a05b166b9dcbad3b/python_discovery-1.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/27/d2/23d25e3f247b328be58d04a4c9f894178a0d1eda7d42867cfb388adaf416/fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2c/02/3623e6169bed617ed1e2d372f7c69f92ec28d54c4dfc997055c8578ec148/virtualenv-21.5.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/8e/b94ec25fcd4384de2a1f5e0403284f005ec743c04bafdb6698c851df5c6d/tuspy-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/37/aa/111610d8bf5b1bb7a295a048fc648cec346347a8b0be5881defd2d1b4a52/oyaml-1.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3a/7a/882d99539b19b1490cac5d77c67338d126e4122c8276bf640e411650c830/twine-6.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3c/6b/72e5f22f3c5069bd950f107110cd17468cdb43abda3c55b48c4013e7b667/bioblend-1.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3c/a7/552a7821597c632b907f7bfe8f36f9f572777af8ef8a48353041cf8e091a/scikit_learn-1.9.0-cp314-cp314-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/3d/6f/221654a39431edc7e9685702ab06fbb22bb313629e0187c0ed4462ba8af7/schema_salad-8.9.20260417192335-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/42/77/de194443bf38daed9452139e960c632b0ef9f9a5dd9ce605fdf18ca9f1b1/id-1.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/46/3b/9dedd2e35cebcd4eb3539514b5ac674fd45654404839e6f9eff6e25d67c7/py2bit-1.0.1.tar.gz + - pypi: https://files.pythonhosted.org/packages/48/ca/36339329c4604adbcc99c899b7eb1ce1a555c499b6a6860757dc9bfed36d/narwhals-2.22.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/53/78/ddd0affa881b1e09bc59f11ab829a7904f4bca29d25c34cbb9395e8e0061/allure_python_commons-2.16.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/58/9d/40b6267367182187139a4000b82a3b287d84d745bccd808e75d916920e9d/bleach-6.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/5d/39/b72e168daf9c00fb20c9fc996d00437ccecdef3102387775d29d7a62576d/numpy-2.5.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/5f/fc/a7bf5b6e4e617b45f90f2d9d2a68519c249c81dd4fc2658c7a2a61c4f4b7/aiohappyeyeballs-2.6.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/60/5c/15b4c7a0182f75ffa90751958ba36a9c01cafee367d49a3edc10ed140b01/msgpack-1.2.1-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/63/b1/4260d67d6bd85e58a66b72d54ce15d5de789b6f3870cc6bedf8ff9667401/propcache-0.5.2-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/6a/b7/9366ed44ced9b7ef357ab48c94205280276db9d7f064aa3012a97227e966/h5py-3.16.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/72/65/a4559d4ff4a210d2a26d7ca0712e4e738cbfc963135f86e8ae807ca420eb/pysam-0.24.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/74/f5/9373290775639cb67a2fce7f629a1c240dce9f12fe927bc32b2736e16dfc/argcomplete-3.6.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/17/853354204e1ca022d6b7d011ca7f3206c4f8faa3cc743e92609b49c1d83f/tinydb-4.8.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7c/03/b8cdb625a21f710dfa11bbca1f48fb4057d2c0286975f8b415bf80942c99/matplotlib-3.11.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/7e/32/a7125fb28c4261a627f999d5fb4afff25b523800faed2c30979949d6facd/pydot-4.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/81/59/208f71d70ddc6184f79b8c6d87d46eb7d7b12c19186a817dec9c9c3f3693/tifffile-2026.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/81/f3/d7b4c8c9b6657ff0db27b739894ed0665fa8f3c78a7452bf74d6447f6865/zipstream_new-1.1.8-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/84/0c/b3288ee003c344356cd505ba8d85286e8f0d4d4177a13d8eed7db6e7c688/planemo-0.75.44-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/b4/23f8462c72e514563f5fd949e38a9e45bcc86fb59bf4b88240ba0ef02026/cwl_utils-0.42-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/8e/fb/2c4c618185be2bda327f9dacd16b3122cc938809f19df7be840595d0e584/prov-1.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/92/7a/8017d45e513c720ee82bf062b1be3ae39087db3024571b4a00773e17c235/galaxy_job_config_init-0.1.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/96/9a/982e48afcffcd727a9144506720ffd4224b6b7e355c98641866f38b7c043/jaraco_functools-4.5.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/1b/295bf2fa3e740131778065e5ffa2c481f0e7210182d408e9a2c244ff5b0c/readme_renderer-45.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl + - pypi: https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9b/22/adf66990e63584a68dfb50c24f48a125c07b1699899381c8151e63ed458c/cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ac/1f/d10d6ad23c86c62d90d867d0506881a392ec6ef06885b858eaab868dd356/deeptoolsintervals-0.1.9.tar.gz + - pypi: https://files.pythonhosted.org/packages/ac/3e/61d11b779e4e83ee8661439af070f6f138060cd41f0346a0a70432f9e55c/cwl_upgrader-1.2.15-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/97/0535f7d3f45d3853f79a11988d8faf798de684d902579126449455506e2f/ephemeris-0.10.11-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b4/c9/7d293a9ea42ef05d6260714f8cf641ba64fab438be55312b1c719d4e7cc6/fissix-24.4.24-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/b8/0c/51f6841f1d84f404f92463fc2b1ba0da357ca1e3db6b7fbda26956c3b82a/ruamel_yaml-0.19.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ba/b1/5297bb6a7df4782f7605bffc43b31f5044070935fbbcaa6c705a07e6ac65/yarl-1.24.2-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cc/2f/7229e91cfa37459622808002bec6eb019c7189bfc59788b3eaba5f273671/conda_package_streaming-0.13.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/cf/f4/672930ad51bbc135f51cac89577155f1d0c2d120375fc77978d3aa071bb7/pybigwig-0.3.25.tar.gz + - pypi: https://files.pythonhosted.org/packages/d4/74/3d6534c6ce0802bf085a32908b093e6a4123443050299bcc6e3828a9bf3e/cwltool-3.2.20260413085819-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/d7/88/b72def7262e150d16be13fca37a96481138d624e700340bc3362a7588929/scipy-1.18.0-cp314-cp314-macosx_12_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/d7/a5/bbbc3b74a94fbdbd7915e7ad030f16539bfdc1362f7e9003b594f0537950/glob2-0.7.tar.gz + - pypi: https://files.pythonhosted.org/packages/d9/b0/1e05aa4e0124cbc6509641353f513fc29c2b5e5197dbd5dfade810a521cf/galaxy_tool_util_models-26.0.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e3/78/47a205b5921bd86ef8d174fcda3daf23d65ad2887b38771935a064acd348/gxformat2-0.27.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/e9/a7/248e1aebe0c7810b0271e021a0f2a5eb6e78a051885b3c9df49f42a5802d/aiohttp-3.14.1-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/ec/17/d9ad109c8d7f05e6e78a79c4ec410ad3d38877b3efe18896eae6c446b534/edam_ontology-1.25.3-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/ef/79/c45f2d53efe6ada1110cf6f9fca095e4ff47a0454444aefdde6ac4789179/cachecontrol-0.14.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f3/ab/a7653bce9a3b204be6a6931767a9e23595807bb84790ce6685e4d7e5bd08/nh3-0.3.6-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl + - pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/f9/38/8b6fc7a8153cb49eb3a9a13acfa9eeb6cc476e37888781e593e6f02ac05e/spython-0.3.14-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/fd/99/757a48b4ace0097b63550597db28f58da0b91d89889f98b34b30f272c0bf/ct3-3.4.0.post5-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl + - pypi: https://files.pythonhosted.org/packages/fe/83/294bca639b0e052f1e2f65199b3db258780c7d4e31408b934c9c974a1379/maturin-1.14.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl + - pypi: https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl +packages: +- conda: https://conda.anaconda.org/bioconda/linux-64/htslib-1.19-h81da01d_0.tar.bz2 + sha256: 70a43fdc3e81fde05e8cee0b1880d9929c00b2581e162e7c21926deb379b31b3 + md5: 70a467e903079d86316ed9ecff262582 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.5.0,<9.0a0 + - libdeflate >=1.18,<1.26.0a0 + - libgcc-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + - openssl >=3.2.0,<4.0a0 + - xz >=5.2.6,<6.0a0 + license: MIT + size: 3008383 + timestamp: 1702415814448 +- conda: https://conda.anaconda.org/bioconda/osx-64/htslib-1.10-h9f635df_2.tar.bz2 + sha256: 4291d3afc950832676b1281391d99fcce0cb3f9cab24bc7e3ffc8eba903bdcdf + md5: d9ed52c8cc2dbb9de7425bbedb8e8be6 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.14.1,<9.0a0 + - libdeflate >=1.22,<1.26.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + purls: [] + size: 1544219 + timestamp: 1750325113614 +- conda: https://conda.anaconda.org/bioconda/osx-arm64/htslib-1.10-hfcd771d_2.tar.bz2 + sha256: 3c275175a8c6d16eb25a20123cec349490b1a01df26b1a6ac0c7d9fb11f0b523 + md5: 597f543aab548d638c9e6f1cc01514fd + depends: + - bzip2 >=1.0.8,<2.0a0 + - libcurl >=8.14.1,<9.0a0 + - libdeflate >=1.22,<1.23.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + purls: [] + size: 1411277 + timestamp: 1750324139516 +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + build_number: 20 + sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 + md5: a9f577daf3de00bca7c3c76c0ecbd1de + depends: + - __glibc >=2.17,<3.0.a0 + - libgomp >=7.5.0 + constrains: + - openmp_impl <0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + strong: + - _openmp_mutex >=4.5 + size: 28948 + timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-bootstrap_h59bd682_2.conda + sha256: a439e3c858547c9ee5b3b53a93e1aa4ddbbf7e918f51e2b0747e1f1f83a799c3 + md5: 89572c6f5e6c24375ffd022c5d790628 + depends: + - ld_impl_linux-64 2.45.1 bootstrap_ha15bf96_2 + - sysroot_linux-64 + license: GPL-3.0-only + license_family: GPL + purls: [] + run_exports: {} + size: 3717952 + timestamp: 1774197461353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 + md5: d2ffd7602c02f2b316fd921d39876885 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 260182 + timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + sha256: cc9accf72fa028d31c2a038460787751127317dcfa991f8d1f1babf216bb454e + md5: 920bb03579f15389b9e512095ad995b7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - c-ares >=1.34.6,<2.0a0 + size: 207882 + timestamp: 1765214722852 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-18-18.1.7-default_h9bb3924_0.conda + sha256: 894cf911d8a05319a1ebc89f239d1d4a7b4c239390d6f1060d496a31f5967c7f + md5: 9ca51acbe9841139edeff1a0e09d08b5 + depends: + - libclang-cpp18.1 18.1.7 default_h9bb3924_0 + - libgcc-ng >=12 + - libllvm18 >=18.1.7,<18.2.0a0 + - libstdcxx-ng >=12 + constrains: + - clangdev 18.1.7 + - clangxx 18.1.7 + - llvm-tools 18.1.7 + - clang-tools 18.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 773872 + timestamp: 1717818924402 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-18.1.7-default_h90ac42e_0.conda + sha256: 5b1116c7ebcb54c3b52078def1b7794fdd0148d36ab4820e334a348f96f23f60 + md5: 787439d32fd248f2deb7fabb0138d063 + depends: + - binutils_impl_linux-64 + - clang-18 18.1.7 default_h9bb3924_0 + - libgcc-devel_linux-64 + - sysroot_linux-64 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 22601 + timestamp: 1717819018422 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-18-18.1.7-default_h9bb3924_0.conda + sha256: 47aa360b6a1f488cf3de4e032f30136e27e11029d4e6c583d0af43fbcdf9b9db + md5: 11870f57d7d3ae9415d7df325595b3fa + depends: + - libclang-cpp18.1 >=18.1.7,<18.2.0a0 + - libgcc-ng >=12 + - libllvm18 >=18.1.7,<18.2.0a0 + - libstdcxx-ng >=12 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 65851 + timestamp: 1717819189499 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-18.1.7-default_h9bb3924_0.conda + sha256: 59c3f0e8e60a14c908bd39d7c3f41d8ae0592299b06346f3cf2b9da01f1df31b + md5: 13a578aae81d919f4fba0278b1040946 + depends: + - clang-format-18 18.1.7 default_h9bb3924_0 + - libclang-cpp18.1 >=18.1.7,<18.2.0a0 + - libgcc-ng >=12 + - libllvm18 >=18.1.7,<18.2.0a0 + - libstdcxx-ng >=12 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 22637 + timestamp: 1717819242710 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clang-tools-18.1.7-default_h9bb3924_0.conda + sha256: 4a7bcf3f7ea0f69091ca7d359b1557e5a507f2b9e7a3a41956b2680fb7c551c5 + md5: 540b026c132b76312e0186c94c45b514 + depends: + - clang-format 18.1.7 default_h9bb3924_0 + - libclang-cpp18.1 >=18.1.7,<18.2.0a0 + - libclang13 >=18.1.7 + - libgcc-ng >=12 + - libllvm18 >=18.1.7,<18.2.0a0 + - libstdcxx-ng >=12 + - libxml2 >=2.12.7,<2.14.0a0 + constrains: + - clangdev 18.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 28986750 + timestamp: 1717819296860 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clangdev-18.1.7-default_h9bb3924_0.conda + sha256: 23c4bc99a91042b3ad79189599365adee612df089f05b2c070011c72a06151ad + md5: 9b9f7b0e0edd09239794090ffa75fff4 + depends: + - clang 18.1.7 default_h90ac42e_0 + - clang-tools 18.1.7 default_h9bb3924_0 + - clangxx 18.1.7 default_h127d8a8_0 + - libclang 18.1.7 default_h9bb3924_0 + - libclang-cpp 18.1.7 default_h9bb3924_0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - llvmdev 18.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 49786226 + timestamp: 1717819415233 +- conda: https://conda.anaconda.org/conda-forge/linux-64/clangxx-18.1.7-default_h127d8a8_0.conda + sha256: ff611c7d5a52b21df93d4ef4f6de7bf0804b1ddbef3ba48aee7e64a9176476b3 + md5: b4befb65199865d55bcbd378c13bc317 + depends: + - clang 18.1.7 default_h90ac42e_0 + - libstdcxx-devel_linux-64 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 22673 + timestamp: 1717819030224 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda + sha256: e12fd90ef6601da2875ebc432452590bc82a893041473bc1c13ef29001a73ea8 + md5: cc47e1facc155f91abd89b11e48e72ff + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - icu >=73.2,<74.0a0 + size: 12089150 + timestamp: 1692900650789 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 + md5: b38117a3c920364aff79f870c984b4a3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - keyutils >=1.6.3,<2.0a0 + size: 134088 + timestamp: 1754905959823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + depends: + - keyutils >=1.6.1,<2.0a0 + - libedit >=3.1.20191231,<3.2.0a0 + - libedit >=3.1.20191231,<4.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - openssl >=3.3.1,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - krb5 >=1.21.3,<1.22.0a0 + size: 1370023 + timestamp: 1719463201255 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-bootstrap_ha15bf96_2.conda + sha256: ffc8fb61b32f421687a35b1b6bdd7e73278da0ea1a0d616b624eb3760ed21742 + md5: bafc61899c34054d1f5e7cd85a2f81e9 + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - binutils_impl_linux-64 2.45.1 + license: GPL-3.0-only + license_family: GPL + purls: [] + run_exports: {} + size: 730756 + timestamp: 1774197447552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-18.1.7-default_h9bb3924_0.conda + sha256: fd7116df16ba9c04e81fb45b24c2e3be5740435f0ddc2385bf7a51af47d41227 + md5: c587de8d5140487d7c021daa6bb69a6c + depends: + - libclang13 18.1.7 default_h087397f_0 + - libgcc-ng >=12 + - libllvm18 >=18.1.7,<18.2.0a0 + - libstdcxx-ng >=12 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libclang13 >=18.1.7 + size: 22600 + timestamp: 1717819141085 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp-18.1.7-default_h9bb3924_0.conda + sha256: 2bedab94a3fc45e67ad8c35c74899369030bd3ccb34ed1336ddc7896324ea574 + md5: 16ce01ff0eee850924312043482b39ae + depends: + - libclang-cpp18.1 18.1.7 default_h9bb3924_0 + - libgcc-ng >=12 + - libllvm18 >=18.1.7,<18.2.0a0 + - libstdcxx-ng >=12 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libclang-cpp18.1 >=18.1.7,<18.2.0a0 + size: 22599 + timestamp: 1717818973121 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.7-default_h9bb3924_0.conda + sha256: 710556634edf342cbfcb01d454e8644d4a0ac674eed0a9aebfc1fe86ea8c0bf6 + md5: bff3d36fbd1b1a2f1e6d34aa3eb6b58c + depends: + - libgcc-ng >=12 + - libllvm18 >=18.1.7,<18.2.0a0 + - libstdcxx-ng >=12 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libclang-cpp18.1 >=18.1.7,<18.2.0a0 + size: 19272701 + timestamp: 1717818801492 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.7-default_h087397f_0.conda + sha256: d981a2734c3af6217dd42c1bccc13b99fc3ca5a64c379739612d6cf67f992a1d + md5: 536526073c2e7f9056fdce8584da779e + depends: + - libgcc-ng >=12 + - libllvm18 >=18.1.7,<18.2.0a0 + - libstdcxx-ng >=12 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libclang13 >=18.1.7 + size: 11057579 + timestamp: 1717819075043 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda + sha256: 6b5b64cdcdb643368ebe236de07eedee99b025bb95129bbe317c46e5bdc693f3 + md5: b8afb3e3cb3423cc445cf611ab95fdb0 + depends: + - krb5 >=1.21.3,<1.22.0a0 + - libgcc-ng >=12 + - libnghttp2 >=1.58.0,<2.0a0 + - libssh2 >=1.11.0,<2.0a0 + - libzlib >=1.2.13,<2.0a0 + - openssl >=3.3.1,<4.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + run_exports: + weak: + - libcurl >=8.8.0,<9.0a0 + size: 410158 + timestamp: 1719602718702 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 + md5: 6c77a605a7a689d17d4819c0f8ac9a00 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libdeflate >=1.25,<1.26.0a0 + size: 73490 + timestamp: 1761979956660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libev >=4.33,<4.34.0a0 + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + sha256: 16feffd9ddbbe5b718515d38ee376c685ba95491cd901244e24671d20b952a77 + md5: b24d3c612f71e7aa74158d92106318b2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.8.1.* + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 77856 + timestamp: 1781203599810 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 + md5: a360c33a5abe61c07959e449fa1453eb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libffi >=3.5.2,<3.6.0a0 + size: 58592 + timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 + md5: 57736f29cc2b0ec0b6c2952d3f101b6a + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 he0feb66_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 1041084 + timestamp: 1778269013026 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + sha256: 9dcf54adfaa5e861123c2da4f2f0451a685464ea7e5a41ad91cf67b31d658d98 + md5: 331ee9b72b9dff570d56b1302c5ab37d + depends: + - libgcc 15.2.0 he0feb66_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - libgcc + size: 27694 + timestamp: 1778269016987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b + md5: faac990cb7aedc7f3a2224f2c9b0c26c + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - _openmp_mutex >=4.5 + size: 603817 + timestamp: 1778268942614 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + md5: 915f5995e94f60e9a4826e0b0920ee88 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-only + purls: [] + run_exports: + weak: + - libiconv >=1.18,<2.0a0 + size: 790176 + timestamp: 1754908768807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.7-hb77312f_0.conda + sha256: 9a9167b3e8e05abc517671fe45e5d40ae866d3e8195865ddad3c68131d059e25 + md5: bc0ea7e1f75a9b1c8467597fbbd9f86b + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libxml2 >=2.12.7,<2.14.0a0 + - libzlib >=1.2.13,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libllvm18 >=18.1.7,<18.2.0a0 + size: 38423980 + timestamp: 1717781615068 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d + md5: b88d90cad08e6bc8ad540cb310a761fb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - xz 5.8.3.* + license: 0BSD + purls: [] + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 113478 + timestamp: 1775825492909 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.3-hb03c661_0.conda + sha256: 7858f6a173206bc8a5bdc8e75690483bb66c0dcc3809ac1cb43c561a4723623a + md5: 55c20edec8e90c4703787acaade60808 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - liblzma 5.8.3 hb03c661_0 + license: 0BSD + purls: [] + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 491429 + timestamp: 1775825511214 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda + sha256: 1910c5306c6aa5bcbd623c3c930c440e9c77a5a019008e1487810e3c1d3716cb + md5: 700ac6ea6d53d5510591c4344d5c989a + depends: + - c-ares >=1.23.0,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.2.0,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libnghttp2 >=1.58.0,<2.0a0 + size: 631936 + timestamp: 1702130036271 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 + md5: d864d34357c3b65a4b731f78c0801dc4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + license_family: GPL + purls: [] + run_exports: + weak: + - libnsl >=2.0.1,<2.1.0a0 + size: 33731 + timestamp: 1750274110928 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda + sha256: daee3f68786231dad457d0dfde3f7f1f9a7f2018adabdbb864226775101341a8 + md5: 18aa975d2094c34aef978060ae7da7d8 + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0a0 + license: Unlicense + purls: [] + run_exports: + weak: + - libsqlite >=3.46.0,<4.0a0 + size: 865346 + timestamp: 1718050628718 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda + sha256: 50e47fd9c4f7bf841a11647ae7486f65220cfc988ec422a4475fe8d5a823824d + md5: 1f5a58e686b13bcfde88b93f547d23fe + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libssh2 >=1.11.0,<2.0a0 + size: 271133 + timestamp: 1685837707056 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc + md5: 5794b3bdc38177caf969dabd3af08549 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 he0feb66_19 + constrains: + - libstdcxx-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 5852044 + timestamp: 1778269036376 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + sha256: 0672b6b6e1791c92e8eccad58081a99d614fcf82bca5841f9dfa3c3e658f83b9 + md5: e5ce228e579726c07255dbf90dc62101 + depends: + - libstdcxx 15.2.0 h934c35e_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: + strong: + - libstdcxx + size: 27776 + timestamp: 1778269074600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + sha256: 9b1bdce27a7e31f7d241aeecff67a1f3101d52a2b1e33ccc2cdf2613072bf81f + md5: 01bb81d12c957de066ea7362007df642 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libuuid >=2.42.2,<3.0a0 + size: 40017 + timestamp: 1781625522462 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + run_exports: + weak: + - libxcrypt >=4.4.36 + size: 100393 + timestamp: 1702724383534 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda + sha256: 576ea9134176636283ff052897bf7a91ffd8ac35b2c505dfde2890ec52849698 + md5: 340278ded8b0dc3a73f3660bbb0adbc6 + depends: + - icu >=73.2,<74.0a0 + - libgcc-ng >=12 + - libiconv >=1.17,<2.0a0 + - libzlib >=1.2.13,<2.0a0 + - xz >=5.2.6,<6.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libxml2 >=2.12.7,<3.0a0 + size: 704984 + timestamp: 1717546454837 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda + sha256: 8ced4afed6322172182af503f21725d072a589a6eb918f8a58135c1e00d35980 + md5: 27329162c0dc732bcf67a4e0cd488125 + depends: + - libgcc-ng >=12 + constrains: + - zlib 1.2.13 *_6 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - libzlib >=1.2.13,<2.0a0 + size: 61571 + timestamp: 1716874066944 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvm-tools-18.1.7-hb77312f_0.conda + sha256: bd402e4792a6c5604a7364fbc81098fd7751f87ef98c816dd217c1396913129e + md5: 691d40e402c76d003125d382abd6e7bf + depends: + - libgcc-ng >=12 + - libllvm18 18.1.7 hb77312f_0 + - libstdcxx-ng >=12 + - libxml2 >=2.12.7,<2.14.0a0 + - libzlib >=1.2.13,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - llvmdev 18.1.7 + - clang 18.1.7 + - clang-tools 18.1.7 + - llvm 18.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 32657444 + timestamp: 1717781906587 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvmdev-18.1.7-hb77312f_0.conda + sha256: 18ac173d4525486923248be2eb1075d80624c7ac9cf80d2d5e3ce4d318a59d6e + md5: 6ac11f45bdcd0d5c8d596b8d3a266dab + depends: + - libgcc-ng >=12 + - libllvm18 18.1.7 hb77312f_0 + - libstdcxx-ng >=12 + - libxml2 >=2.12.7,<2.14.0a0 + - libzlib >=1.2.13,<2.0a0 + - llvm-tools 18.1.7 hb77312f_0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - llvm-tools 18.1.7 + - clang 18.1.7 + - clang-tools 18.1.7 + - llvm 18.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 58236201 + timestamp: 1717782018749 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 + md5: fc21868a1a5aacc937e7a18747acb8a5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: X11 AND BSD-3-Clause + purls: [] + run_exports: + weak: + - ncurses >=6.6,<7.0a0 + size: 918956 + timestamp: 1777422145199 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda + sha256: d48f5c22b9897c01e4dff3680f1f57ceb02711ab9c62f74339b080419dfad34b + md5: 79dd2074b5cd5c5c6b2930514a11e22d + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - openssl >=3.6.3,<4.0a0 + size: 3159683 + timestamp: 1781069855778 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda + sha256: f9865bcbff69f15fd89a33a2da12ad616e98d65ce7c83c644b92e66e5016b227 + md5: 2540b74d304f71d3e89c81209db4db84 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc-ng >=12 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.2.13,<2.0.0a0 + - ncurses >=6.4.20240210,<7.0a0 + - openssl >=3.2.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + run_exports: + weak: + - python_abi 3.12.* *_cp312 + noarch: + - python + size: 31991381 + timestamp: 1713208036041 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 + md5: d7d95fc8287ea7bf33e0e7116d2b95ec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + run_exports: + weak: + - readline >=8.3,<9.0a0 + size: 345073 + timestamp: 1765813471974 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 + size: 3318875 + timestamp: 1699202167581 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.8.3-ha02ee65_0.conda + sha256: 2553fd3ec0a1020b2ca05ca10b0036a596cb0d4bf3645922fcf69dacce0e6679 + md5: 6a1b6af49a334e4e06b9f103367762bf + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - liblzma 5.8.3 hb03c661_0 + - liblzma-devel 5.8.3 hb03c661_0 + - xz-gpl-tools 5.8.3 ha02ee65_0 + - xz-tools 5.8.3 hb03c661_0 + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 24360 + timestamp: 1775825568523 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-gpl-tools-5.8.3-ha02ee65_0.conda + sha256: 8f139666ea18dc8340a44a54056627dd4e89e242e8cd136ab2467d6dc2c192ba + md5: 8f5e2c6726c1339287a3c76a2c138ac7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - liblzma 5.8.3 hb03c661_0 + constrains: + - xz 5.8.3.* + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 34213 + timestamp: 1775825548743 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xz-tools-5.8.3-hb03c661_0.conda + sha256: 162ebd76803464b8c8ebc7d45df32edf0ec717b3bf369a437ae3b0254f22dc2e + md5: b62b615caa60812640f24db3a8d0fc87 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - liblzma 5.8.3 hb03c661_0 + constrains: + - xz 5.8.3.* + license: 0BSD AND LGPL-2.1-or-later + purls: [] + run_exports: {} + size: 95955 + timestamp: 1775825530484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda + sha256: 534824ea44939f3e59ca8ebb95e3ece6f50f9d2a0e69999fbc692311252ed6ac + md5: 559d338a4234c2ad6e676f460a093e67 + depends: + - libgcc-ng >=12 + - libzlib 1.2.13 h4ab18f5_6 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - libzlib >=1.2.13,<2.0a0 + size: 92883 + timestamp: 1716874088980 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda + sha256: c558b9cc01d9c1444031bd1ce4b9cff86f9085765f17627a6cd85fc623c8a02b + md5: 4d056880988120e29d75bfff282e0f45 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - zstd >=1.5.6,<1.6.0a0 + size: 554846 + timestamp: 1714722996770 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + sha256: f8e3c730fa14ee3f170493779f06522c4acf89169f43db4f039727709b6419cf + md5: a9965dd99f683c5f444428f896635716 + depends: + - __unix + license: ISC + purls: [] + run_exports: {} + size: 128866 + timestamp: 1781708962055 +- conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-19.1.7-he32a8d3_1.conda + sha256: 8c32a3db8adf18ed58197e8895ce4f24a83ed63c817512b9a26724753b116f2a + md5: 8d99c82e0f5fed6cc36fcf66a11e03f0 + depends: + - clang 19.1.7.* + constrains: + - compiler-rt 19.1.7 + - clangxx 19.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + run_exports: {} + size: 10490535 + timestamp: 1757411851093 +- conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda + sha256: 41557eeadf641de6aeae49486cef30d02a6912d8da98585d687894afd65b356a + md5: 86d9cba083cd041bfbf242a01a7a1999 + constrains: + - sysroot_linux-64 ==2.28 + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + purls: [] + run_exports: {} + size: 1278712 + timestamp: 1765578681495 +- conda: https://conda.anaconda.org/conda-forge/noarch/libcxx-headers-19.1.7-h707e725_2.conda + sha256: 36485e6807e03a4f15a8018ec982457a9de0a1318b4b49a44c5da75849dbe24f + md5: de91b5ce46dc7968b6e311f9add055a2 + depends: + - __unix + constrains: + - libcxx-devel 19.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 830747 + timestamp: 1764647922410 +- conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_119.conda + sha256: e1815bb11d5abe886979e95889d84310d83d078d36a3567ca67cbf57a3876d88 + md5: 7d517e32d656a8880d98c0e4fc8ddc2c + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 3091520 + timestamp: 1778268364856 +- conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_119.conda + sha256: 1b4263aa5d8c8c659e8e38b66868f42867347e0c8941513ee77269afc00a5186 + md5: d1a866495b9654ccfef5392b8541dc58 + depends: + - __unix + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + run_exports: {} + size: 20199810 + timestamp: 1778268389428 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + build_number: 8 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 0539938c55b6b1a59b560e843ad864a4 + constrains: + - python 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 6989 + timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda + sha256: c47299fe37aebb0fcf674b3be588e67e4afb86225be4b0d452c7eb75c086b851 + md5: 13dc3adbc692664cd3beabd216434749 + depends: + - __glibc >=2.28 + - kernel-headers_linux-64 4.18.0 he073ed8_9 + - tzdata + license: LGPL-2.0-or-later AND LGPL-2.0-or-later WITH exceptions AND GPL-2.0-or-later + license_family: GPL + purls: [] + run_exports: + strong: + - __glibc >=2.28,<3.0.a0 + size: 24008591 + timestamp: 1765578833462 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 + license: LicenseRef-Public-Domain + purls: [] + run_exports: {} + size: 119135 + timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda + sha256: 9f242f13537ef1ce195f93f0cc162965d6cc79da578568d6d8e50f70dd025c42 + md5: 4173ac3b19ec0a4f400b4f782910368b + depends: + - __osx >=10.13 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 133427 + timestamp: 1771350680709 +- conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda + sha256: 2f5bc0292d595399df0d168355b4e9820affc8036792d6984bd751fdda2bcaea + md5: fc9a153c57c9f070bebaa7eef30a8f17 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - c-ares >=1.34.6,<2.0a0 + size: 186122 + timestamp: 1765215100384 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clang-18-18.1.7-default_h4c8afb6_0.conda + sha256: 9e92d1c1234390ae2a47c34805f25d4bd7b58d9c8c60d72cae86d218b7196e00 + md5: afece857d99d5729372ad7fac3a95d2e + depends: + - __osx >=10.13 + - libclang-cpp18.1 18.1.7 default_h4c8afb6_0 + - libcxx >=16.0.6 + - libllvm18 >=18.1.7,<18.2.0a0 + constrains: + - clang-tools 18.1.7 + - clangxx 18.1.7 + - llvm-tools 18.1.7 + - clangdev 18.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 759958 + timestamp: 1717813819070 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clang-18.1.7-default_ha3b9224_0.conda + sha256: 507ea10018ff607b7b3ba6f6efca4c5b897bb6a262464d83222c650b0f467b16 + md5: f3d140dbce64634d0c77665d9a4e7ccb + depends: + - clang-18 18.1.7 default_h4c8afb6_0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 22588 + timestamp: 1717813901304 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clang-format-18-18.1.7-default_h4c8afb6_0.conda + sha256: 185dc3bdd67a438c7760ef446681d46a10ea73c7e8eef7f59c3770d387f73de3 + md5: 8b32920be1534ae49ea54d20bfed0c12 + depends: + - __osx >=10.13 + - libclang-cpp18.1 >=18.1.7,<18.2.0a0 + - libcxx >=16.0.6 + - libllvm18 >=18.1.7,<18.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 62212 + timestamp: 1717814131492 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clang-format-18.1.7-default_h4c8afb6_0.conda + sha256: 105457f602193cbea41ee3c23d3e0ef76dca0c9fa3fbe3dd24a4c4039802c755 + md5: 28e497580c0c89a619dab901cf3a550a + depends: + - __osx >=10.13 + - clang-format-18 18.1.7 default_h4c8afb6_0 + - libclang-cpp18.1 >=18.1.7,<18.2.0a0 + - libcxx >=16.0.6 + - libllvm18 >=18.1.7,<18.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 22876 + timestamp: 1717814196419 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clang-tools-18.1.7-default_h4c8afb6_0.conda + sha256: c78f1cb0472ff7a8221726d8b7c661ebac20b7e289846b8bfcaa088fb64402e2 + md5: c7be23fca3da1d8080946b1e5b84404a + depends: + - __osx >=10.13 + - clang-format 18.1.7 default_h4c8afb6_0 + - libclang-cpp18.1 >=18.1.7,<18.2.0a0 + - libclang13 >=18.1.7 + - libcxx >=16.0.6 + - libllvm18 >=18.1.7,<18.2.0a0 + - libxml2 >=2.12.7,<2.14.0a0 + constrains: + - clangdev 18.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 19771872 + timestamp: 1717814713981 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clangdev-18.1.7-default_h4c8afb6_0.conda + sha256: 2d6964bcc42c8f19593a2aca90e41d437cafc6c15d96035b62907505f07a7e6c + md5: 39ffb42d6df2957d55c2d62413a45ec8 + depends: + - __osx >=10.13 + - clang 18.1.7 default_ha3b9224_0 + - clang-tools 18.1.7 default_h4c8afb6_0 + - clangxx 18.1.7 default_ha3b9224_0 + - libclang 18.1.7 default_h4c8afb6_0 + - libclang-cpp 18.1.7 default_h4c8afb6_0 + - libcxx >=16.0.6 + - llvmdev 18.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 26136783 + timestamp: 1717814816532 +- conda: https://conda.anaconda.org/conda-forge/osx-64/clangxx-18.1.7-default_ha3b9224_0.conda + sha256: 1a8c83972531299dba368eae5a0dc01a9ce877c98554a40d24cd2d48579a336e + md5: a0432972cebd01c75aba04f1983e9919 + depends: + - clang 18.1.7 default_ha3b9224_0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 22662 + timestamp: 1717813914190 +- conda: https://conda.anaconda.org/conda-forge/osx-64/icu-75.1-h120a0e1_0.conda + sha256: 2e64307532f482a0929412976c8450c719d558ba20c0962832132fd0d07ba7a7 + md5: d68d48a3060eb5abdc1cdc8e2a3a5966 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - icu >=75.1,<76.0a0 + size: 11761697 + timestamp: 1720853679409 +- conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h3ddfcb2_1.conda + sha256: c6342c340b18651d14b6134e223904da6f6099665e45449efb683d4c68b28432 + md5: e070b249c4f9c6bddb7984a1a794e8df + depends: + - __osx >=11.0 + - libcxx >=19 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 1195956 + timestamp: 1781860554632 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-18.1.7-default_h4c8afb6_0.conda + sha256: bb06a36b790b58643525d37ad4da9e116197fe261f6bcf82e2920f8e351a08de + md5: 44aaa57742042772d253d057a34883a6 + depends: + - __osx >=10.13 + - libclang13 18.1.7 default_h0449792_0 + - libcxx >=16.0.6 + - libllvm18 >=18.1.7,<18.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libclang13 >=18.1.7 + size: 22898 + timestamp: 1717814062566 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp-18.1.7-default_h4c8afb6_0.conda + sha256: ea2ab4d652b21bd454e0d3412d142635a2d5bae5887f4abd82ab972cc1bfa2c0 + md5: 24760f4e0135a795d4dff139184d69b4 + depends: + - __osx >=10.13 + - libclang-cpp18.1 18.1.7 default_h4c8afb6_0 + - libcxx >=16.0.6 + - libllvm18 >=18.1.7,<18.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libclang-cpp18.1 >=18.1.7,<18.2.0a0 + size: 22921 + timestamp: 1717813887590 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libclang-cpp18.1-18.1.7-default_h4c8afb6_0.conda + sha256: 22b64ad7f04ccee346c043ee6bf44c56c1e489b88788693a82f9ca9f3d39c3ab + md5: 41f0f6a496dfda7a7731005f9120fc08 + depends: + - __osx >=10.13 + - libcxx >=16.0.6 + - libllvm18 >=18.1.7,<18.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libclang-cpp18.1 >=18.1.7,<18.2.0a0 + size: 13773485 + timestamp: 1717813542661 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libclang13-18.1.7-default_h0449792_0.conda + sha256: 9bfec881038994d1a71fe587c226f6971f7bc5220e8024312ea8acb6ebb6c47d + md5: be4f24df1938154adcb08673fbce71be + depends: + - __osx >=10.13 + - libcxx >=16.0.6 + - libllvm18 >=18.1.7,<18.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libclang13 >=18.1.7 + size: 8119469 + timestamp: 1717813984475 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.20.0-h8f0b9e4_0.conda + sha256: 5d3d8a82ca43347e96f1d79048921f3a7c25e32514bc7feb53ed2a040dcca54d + md5: 4a0085ccf90dc514f0fc0909a874045e + depends: + - __osx >=11.0 + - krb5 >=1.22.2,<1.23.0a0 + - libnghttp2 >=1.68.1,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + run_exports: + weak: + - libcurl >=8.20.0,<9.0a0 + size: 419676 + timestamp: 1777462238769 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-22.1.8-h19cb2f5_0.conda + sha256: 57ee997f1f800cf38abc743c0f0a9ddfe6a101c697c35510452ce6f4ddf96361 + md5: 0f600157f28fc7bc9549ecafdfa5bc12 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 566717 + timestamp: 1781672189697 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda + sha256: 025f8b1e85dd8254e0ca65f011919fb1753070eb507f03bca317871a884d24de + md5: 31aa65919a729dc48180893f62c25221 + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libdeflate >=1.25,<1.26.0a0 + size: 70840 + timestamp: 1761980008502 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda + sha256: 6cc49785940a99e6a6b8c6edbb15f44c2dd6c789d9c283e5ee7bdfedd50b4cd6 + md5: 1f4ed31220402fcddc083b4bff406868 + depends: + - ncurses + - __osx >=10.13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 + size: 115563 + timestamp: 1738479554273 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda + sha256: 0d238488564a7992942aa165ff994eca540f687753b4f0998b29b4e4d030ff43 + md5: 899db79329439820b7e8f8de41bca902 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libev >=4.33,<4.34.0a0 + size: 106663 + timestamp: 1702146352558 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.8.1-hcc62823_1.conda + sha256: 9c96cc05e056e1bba5b545cbbd57b6e01db622dc2c82934caaaa25cfb22fe666 + md5: dcfdea7b7013beef0a4d744d776ea38f + depends: + - __osx >=11.0 + constrains: + - expat 2.8.1.* + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 76020 + timestamp: 1781204303305 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda + sha256: 951958d1792238006fdc6fce7f71f1b559534743b26cc1333497d46e5903a2d6 + md5: 66a0dc7464927d0853b590b6f53ba3ea + depends: + - __osx >=10.13 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libffi >=3.5.2,<3.6.0a0 + size: 53583 + timestamp: 1769456300951 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda + sha256: a1c8cecdf9966921e13f0ae921309a1f415dfbd2b791f2117cf7e8f5e61a48b6 + md5: 210a85a1119f97ea7887188d176db135 + depends: + - __osx >=10.13 + license: LGPL-2.1-only + purls: [] + run_exports: + weak: + - libiconv >=1.18,<2.0a0 + size: 737846 + timestamp: 1754908900138 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm18-18.1.7-hd5e122f_0.conda + sha256: dc9397be88e0b5d0e14765b98ea7bbea79b9110447e43b28a0f1e994514f6350 + md5: bc138883a1fbb4d446b8a5565b1c1bc0 + depends: + - __osx >=10.13 + - libcxx >=16 + - libxml2 >=2.12.7,<2.14.0a0 + - libzlib >=1.2.13,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libllvm18 >=18.1.7,<18.2.0a0 + size: 27583991 + timestamp: 1717771655947 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda + sha256: d9e2006051529aec5578c6efeb13bb6a7200a014b2d5a77a579e83a8049d5f3c + md5: becdfbfe7049fa248e52aa37a9df09e2 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.3.* + license: 0BSD + purls: [] + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 105724 + timestamp: 1775826029494 +- conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-devel-5.8.3-hbb4bfdb_0.conda + sha256: 05f845d7f29691f8410665297a4fd168261aaa2710993e9e21effd66365c080d + md5: a59a33afff299f2d95fdabbd1214f4f1 + depends: + - __osx >=11.0 + - liblzma 5.8.3 hbb4bfdb_0 + license: 0BSD + purls: [] + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 118185 + timestamp: 1775826064340 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.68.1-h70048d4_0.conda + sha256: 899551e16aac9dfb85bfc2fd98b655f4d1b7fea45720ec04ccb93d95b4d24798 + md5: dba4c95e2fe24adcae4b77ebf33559ae + depends: + - __osx >=11.0 + - c-ares >=1.34.6,<2.0a0 + - libcxx >=19 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libnghttp2 >=1.68.1,<2.0a0 + size: 606749 + timestamp: 1773854765508 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.46.0-h1b8f9f3_0.conda + sha256: 63af1a9e3284c7e4952364bafe7267e41e2d9d8bcc0e85a4ea4b0ec02d3693f6 + md5: 5dadfbc1a567fe6e475df4ce3148be09 + depends: + - __osx >=10.13 + - libzlib >=1.2.13,<2.0a0 + license: Unlicense + purls: [] + run_exports: + weak: + - libsqlite >=3.46.0,<4.0a0 + size: 908643 + timestamp: 1718050720117 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda + sha256: 00654ba9e5f73aa1f75c1f69db34a19029e970a4aeb0fa8615934d8e9c369c3c + md5: a6cb15db1c2dc4d3a5f6cf3772e09e81 + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 + size: 284216 + timestamp: 1745608575796 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.13.9-he1bc88e_0.conda + sha256: 151e653e72b9de48bdeb54ae0664b490d679d724e618649997530a582a67a5fb + md5: af41ebf4621373c4eeeda69cc703f19c + depends: + - __osx >=10.13 + - icu >=75.1,<76.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.1,<6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libxml2 >=2.13.9,<2.14.0a0 + size: 609937 + timestamp: 1761766325697 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + sha256: 4c6da089952b2d70150c74234679d6f7ac04f4a98f9432dec724968f912691e7 + md5: 30439ff30578e504ee5e0b390afc8c65 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 59000 + timestamp: 1774073052242 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-tools-18.1.7-hd5e122f_0.conda + sha256: 000a66921285d993aa748b0c9f39aa207331c9e5b7e2f86a57c42e79f92da9ed + md5: c8f3c58497f799f4d617282903d1cab0 + depends: + - __osx >=10.13 + - libllvm18 18.1.7 hd5e122f_0 + - libxml2 >=2.12.7,<2.14.0a0 + - libzlib >=1.2.13,<2.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - clang 18.1.7 + - llvmdev 18.1.7 + - clang-tools 18.1.7 + - llvm 18.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 24448916 + timestamp: 1717772227513 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvmdev-18.1.7-hd5e122f_0.conda + sha256: b9320209088189641ed50f02d6abc55418b73523a1817507ef0ed21fb5d767c2 + md5: 43a0f9e29406cc07593d95e8d5d6a416 + depends: + - __osx >=10.13 + - libcxx >=16 + - libllvm18 18.1.7 hd5e122f_0 + - libxml2 >=2.12.7,<2.14.0a0 + - libzlib >=1.2.13,<2.0a0 + - llvm-tools 18.1.7 hd5e122f_0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - clang 18.1.7 + - clang-tools 18.1.7 + - llvm-tools 18.1.7 + - llvm 18.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 44033239 + timestamp: 1717772482811 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda + sha256: f5f7e006ff4271305ab4cc08eedd855c67a571793c3d18aff73f645f088a8cae + md5: 31b8740cf1b2588d4e61c81191004061 + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + run_exports: + weak: + - ncurses >=6.6,<7.0a0 + size: 831711 + timestamp: 1777423052277 +- conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.3-hc881268_0.conda + sha256: 819d4368d6b5b298fa40d4bc836c1250842489002cacf3fb918a13ee2033b7c6 + md5: 46be42ab403712fd349d007d763bf767 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - openssl >=3.6.3,<4.0a0 + size: 2775300 + timestamp: 1781071391999 +- conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.12.3-h1411813_0_cpython.conda + sha256: 3b327ffc152a245011011d1d730781577a8274fde1cf6243f073749ead8f1c2a + md5: df1448ec6cbf8eceb03d29003cf72ae6 + depends: + - __osx >=10.9 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - ncurses >=6.4.20240210,<7.0a0 + - openssl >=3.2.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + run_exports: + weak: + - python_abi 3.12.* *_cp312 + noarch: + - python + size: 14557341 + timestamp: 1713208068012 +- conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda + sha256: 4614af680aa0920e82b953fece85a03007e0719c3399f13d7de64176874b80d5 + md5: eefd65452dfe7cce476a519bece46704 + depends: + - __osx >=10.13 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + run_exports: + weak: + - readline >=8.3,<9.0a0 + size: 317819 + timestamp: 1765813692798 +- conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda + sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 + md5: bf830ba5afc507c6232d4ef0fb1a882d + depends: + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + purls: [] + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 + size: 3270220 + timestamp: 1699202389792 +- conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.8.3-h6a5a847_0.conda + sha256: ba5ad03c1c99c0bc62b92fb4630a33839e07b41f1b64c2d224f63a36b6ac1c00 + md5: 65aa14eb080715ecf13b15e5d85acde2 + depends: + - __osx >=11.0 + - liblzma 5.8.3 hbb4bfdb_0 + - liblzma-devel 5.8.3 hbb4bfdb_0 + - xz-gpl-tools 5.8.3 h6a5a847_0 + - xz-tools 5.8.3 hbb4bfdb_0 + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 24261 + timestamp: 1775826189380 +- conda: https://conda.anaconda.org/conda-forge/osx-64/xz-gpl-tools-5.8.3-h6a5a847_0.conda + sha256: e9bbba55933e2d962f65b689796561e9b687c36fb388b42eba5c0c561c6fe574 + md5: f2d1a60e16eb0da1cac4f9d0129957da + depends: + - __osx >=11.0 + - liblzma 5.8.3 hbb4bfdb_0 + constrains: + - xz 5.8.3.* + license: 0BSD AND LGPL-2.1-or-later AND GPL-2.0-or-later + purls: [] + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 34168 + timestamp: 1775826151739 +- conda: https://conda.anaconda.org/conda-forge/osx-64/xz-tools-5.8.3-hbb4bfdb_0.conda + sha256: 57fc818b986bf86c5dec503047d5ba2f97bf76f2de225a3e6fea0c87c6e973dd + md5: 0a8d7aa810e8bef50429295f485fb14c + depends: + - __osx >=11.0 + - liblzma 5.8.3 hbb4bfdb_0 + constrains: + - xz 5.8.3.* + license: 0BSD AND LGPL-2.1-or-later + purls: [] + run_exports: {} + size: 86264 + timestamp: 1775826113228 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.2-hbb4bfdb_2.conda + sha256: 5dd728cebca2e96fa48d41661f1a35ed0ee3cb722669eee4e2d854c6745655eb + md5: 6276aa61ffc361cbf130d78cfb88a237 + depends: + - __osx >=11.0 + - libzlib 1.3.2 hbb4bfdb_2 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 92411 + timestamp: 1774073075482 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda + sha256: 47101a4055a70a4876ffc87b750ab2287b67eca793f21c8224be5e1ee6394d3f + md5: 727109b184d680772e3122f40136d5ca + depends: + - __osx >=10.13 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - zstd >=1.5.7,<1.6.0a0 + size: 528148 + timestamp: 1764777156963 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df + md5: 620b85a3f45526a8bc4d23fd78fc22f0 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 124834 + timestamp: 1771350416561 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + sha256: 2995f2aed4e53725e5efbc28199b46bf311c3cab2648fc4f10c2227d6d5fa196 + md5: bcb3cba70cf1eec964a03b4ba7775f01 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - c-ares >=1.34.6,<2.0a0 + size: 180327 + timestamp: 1765215064054 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools-1030.6.3-llvm19_1_hd01ab73_4.conda + sha256: 4f408036b5175be0d2c7940250d00dae5ea7a71d194a1ffb35881fb9df6211fc + md5: caf7c8e48827c2ad0c402716159fe0a2 + depends: + - cctools_impl_osx-arm64 1030.6.3 llvm19_1_he8a363d_4 + - ld64 956.6 llvm19_1_he86490a_4 + - libllvm19 >=19.1.7,<19.2.0a0 + license: APSL-2.0 + license_family: Other + purls: [] + run_exports: {} + size: 24313 + timestamp: 1768852906882 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cctools_impl_osx-arm64-1030.6.3-llvm19_1_he8a363d_4.conda + sha256: c444442e0c01de92a75b58718a100f2e272649658d4f3dd915bbfc2316b25638 + md5: 76c651b923e048f3f3e0ecb22c966f70 + depends: + - __osx >=11.0 + - ld64_osx-arm64 >=956.6,<956.7.0a0 + - libcxx + - libllvm19 >=19.1.7,<19.2.0a0 + - libzlib >=1.3.1,<2.0a0 + - llvm-tools 19.1.* + - sigtool-codesign + constrains: + - ld64 956.6.* + - cctools 1030.6.3.* + - clang 19.1.* + license: APSL-2.0 + license_family: Other + purls: [] + run_exports: {} + size: 749918 + timestamp: 1768852866532 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19-19.1.7-default_hf3020a7_9.conda + sha256: a1449c64f455d43153036f54c68cb075a52c1d9f3350a91f4a8936ecf1675c6b + md5: 5a77d772c22448f6ab340fbfff55db48 + depends: + - __osx >=11.0 + - libclang-cpp19.1 19.1.7 default_hf3020a7_9 + - libcxx >=19.1.7 + - libllvm19 >=19.1.7,<19.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 763361 + timestamp: 1776988759708 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-19.1.7-default_hf9bcbb7_9.conda + sha256: 8268c23a000cfeee1b83e19c59eb018ec07583905f69bfee01beac8aedd8c4df + md5: 20056c993a8c9df01e04a0e165579ec1 + depends: + - cctools + - clang-19 19.1.7.* default_* + - clang_impl_osx-arm64 19.1.7 default_hc11f16d_9 + - ld64 + - ld64_osx-arm64 * llvm19_1_* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 24962 + timestamp: 1776989044302 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-format-19-19.1.7-default_hf3020a7_9.conda + sha256: ecb87f79f8377445fcd901060fb2a9af187ac91c098c1a444d833d4ae41cf2ea + md5: 03fc00f8bce94befe6b8e9ce56ccec56 + depends: + - __osx >=11.0 + - libclang-cpp19.1 >=19.1.7,<19.2.0a0 + - libcxx >=19.1.7 + - libllvm19 >=19.1.7,<19.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 62553 + timestamp: 1776988899878 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-format-19.1.7-default_hf3020a7_9.conda + sha256: a6dac903ec7d02e0c38a6e0a6bb4a6bad2811892bf339ac2e6cb4b4a78f249b3 + md5: 8a9e72cc9f23409110fd882ae3a805df + depends: + - __osx >=11.0 + - clang-format-19 19.1.7 default_hf3020a7_9 + - libclang-cpp19.1 >=19.1.7,<19.2.0a0 + - libcxx >=19.1.7 + - libllvm19 >=19.1.7,<19.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 25270 + timestamp: 1776989009705 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang-tools-19.1.7-default_h1589341_9.conda + sha256: 0b3cdea6573996c35e80ca9d743349e71108703be79a6329c3dbb22be1f5d491 + md5: 1d58e84155ff0993fd7d58357c77b320 + depends: + - __osx >=11.0 + - clang-format 19.1.7 default_hf3020a7_9 + - libclang-cpp19.1 >=19.1.7,<19.2.0a0 + - libclang13 >=19.1.7 + - libcxx >=19.1.7 + - libllvm19 >=19.1.7,<19.2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + constrains: + - clangdev 19.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 15026501 + timestamp: 1776989117787 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clang_impl_osx-arm64-19.1.7-default_hc11f16d_9.conda + sha256: 56db3a98eda7032a0aefe38f146a4b29df9d75d08c71bf7f7d6412effe775dd1 + md5: 2aec2e39be3b4999bda2a3e5bd4cd2e6 + depends: + - cctools_impl_osx-arm64 + - clang-19 19.1.7.* default_* + - compiler-rt 19.1.7.* + - compiler-rt_osx-arm64 + - ld64_osx-arm64 * llvm19_1_* + - llvm-openmp >=19.1.7 + - llvm-tools 19.1.7.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 24905 + timestamp: 1776989025990 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangdev-19.1.7-default_hf3020a7_9.conda + sha256: 72d0f6d07c8b5324bc95ac3849346340337f889711993a0bd7a08d59cd5a6d14 + md5: 2d790dd1a13dd2e03b785bdbaab9d0f7 + depends: + - __osx >=11.0 + - clang 19.1.7 default_hf9bcbb7_9 + - clang-tools 19.1.7 default_h1589341_9 + - clangxx 19.1.7 default_hc995acf_9 + - libclang 19.1.7 default_hf3020a7_9 + - libclang-cpp 19.1.7 default_hf3020a7_9 + - libcxx >=19.1.7 + - llvmdev 19.1.7.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 29034862 + timestamp: 1776989261367 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx-19.1.7-default_hc995acf_9.conda + sha256: 88697ecd1e5689e15c12d334bae2bb3900dffd91efd4686cd9eea9e1095ee986 + md5: 9a1ac8e5124fcc201adb20a103d51cc6 + depends: + - clang 19.1.7 default_hf9bcbb7_9 + - clangxx_impl_osx-arm64 19.1.7.* default_* + - libcxx-devel 19.1.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 24924 + timestamp: 1776989215095 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/clangxx_impl_osx-arm64-19.1.7-default_hc11f16d_9.conda + sha256: 6b5ebc5f369ad5373091edc3d4c4d2e1f39169b7adb080395965646eb8aee7c9 + md5: 8b7425e84f940861653c919142435bde + depends: + - clang-19 19.1.7.* default_* + - clang_impl_osx-arm64 19.1.7 default_hc11f16d_9 + - libcxx-devel 19.1.* + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 24861 + timestamp: 1776989199328 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/compiler-rt-19.1.7-h855ad52_1.conda + sha256: b58a481828aee699db7f28bfcbbe72fb133277ac60831dfe70ee2465541bcb93 + md5: 39451684370ae65667fa5c11222e43f7 + depends: + - __osx >=11.0 + - clang 19.1.7.* + - compiler-rt_osx-arm64 19.1.7.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + run_exports: {} + size: 97085 + timestamp: 1757411887557 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + sha256: 3a7907a17e9937d3a46dfd41cffaf815abad59a569440d1e25177c15fd0684e5 + md5: f1182c91c0de31a7abd40cedf6a5ebef + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 12361647 + timestamp: 1773822915649 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda + sha256: c740e4a2e7247776a9883158fdab50ae0732c8f67f96d8f1db8ad9da5e0b5222 + md5: 8780f41b013d19219faef9c82260744b + depends: + - __osx >=11.0 + - libcxx >=19 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 1159780 + timestamp: 1781859501654 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64-956.6-llvm19_1_he86490a_4.conda + sha256: d6197b4825ece12ab63097bd677294126439a1a6222c7098885aa23464ef280c + md5: 22eb76f8d98f4d3b8319d40bda9174de + depends: + - ld64_osx-arm64 956.6 llvm19_1_ha2625f7_4 + - libllvm19 >=19.1.7,<19.2.0a0 + constrains: + - cctools_osx-arm64 1030.6.3.* + - cctools 1030.6.3.* + license: APSL-2.0 + license_family: Other + purls: [] + run_exports: {} + size: 21592 + timestamp: 1768852886875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ld64_osx-arm64-956.6-llvm19_1_ha2625f7_4.conda + sha256: 4161eec579cea07903ee2fafdde6f8f9991dabd54f3ca6609a1bf75bed3dc788 + md5: eaf3d06e3a8a10dee7565e8d76ae618d + depends: + - __osx >=11.0 + - libcxx + - libllvm19 >=19.1.7,<19.2.0a0 + - sigtool-codesign + - tapi >=1600.0.11.8,<1601.0a0 + constrains: + - cctools_impl_osx-arm64 1030.6.3.* + - ld64 956.6.* + - cctools 1030.6.3.* + - clang 19.1.* + license: APSL-2.0 + license_family: Other + purls: [] + run_exports: {} + size: 1040464 + timestamp: 1768852821767 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-19.1.7-default_hf3020a7_9.conda + sha256: dc65ecec056b11b1606ca1d0bcd84310c23f644fd2fc579ad164eca4493af899 + md5: 2d27183e11c25e3d91138e11d2580b91 + depends: + - __osx >=11.0 + - libclang13 19.1.7 default_h13b06bd_9 + - libcxx >=19.1.7 + - libllvm19 >=19.1.7,<19.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libclang13 >=19.1.7 + size: 25224 + timestamp: 1776988937989 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp-19.1.7-default_hf3020a7_9.conda + sha256: 0d69dababfbddbe5dca1e90be56f42cc5e34a11bba8087b782cadf612b0de882 + md5: 37feb902c281c7c50c49254ffe757cdc + depends: + - __osx >=11.0 + - libclang-cpp19.1 19.1.7 default_hf3020a7_9 + - libcxx >=19.1.7 + - libllvm19 >=19.1.7,<19.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libclang-cpp19.1 >=19.1.7,<19.2.0a0 + size: 25253 + timestamp: 1776988972648 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang-cpp19.1-19.1.7-default_hf3020a7_9.conda + sha256: e05c4830a117492996bac1ad55cd7ee3e57f63b46da8a324862efbee9279ab44 + md5: ddb70ebdcbf3a44bddc2657a51faf490 + depends: + - __osx >=11.0 + - libcxx >=19.1.7 + - libllvm19 >=19.1.7,<19.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libclang-cpp19.1 >=19.1.7,<19.2.0a0 + size: 14064699 + timestamp: 1776988581784 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libclang13-19.1.7-default_h13b06bd_9.conda + sha256: 03bba9893f94d7cbf7e2d11dbb1736f70ce0af044be63e180895401a2dc9d65d + md5: 0bfbfaee8a27ada3ebc2977c5e00acd0 + depends: + - __osx >=11.0 + - libcxx >=19.1.7 + - libllvm19 >=19.1.7,<19.2.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libclang13 >=19.1.7 + size: 8439763 + timestamp: 1776988685803 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.20.0-hd5a2499_0.conda + sha256: 38c0bc634b61e542776e97cfd15d5d41edd304d4e47c333004d2d622439b2381 + md5: 2f57b7d0c6adda88957586b7afd78438 + depends: + - __osx >=11.0 + - krb5 >=1.22.2,<1.23.0a0 + - libnghttp2 >=1.68.1,<2.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + purls: [] + run_exports: + weak: + - libcurl >=8.20.0,<9.0a0 + size: 400568 + timestamp: 1777462251987 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda + sha256: a2e7abab5add9750fab064c024394de48e49f97631c605ad5db5c8ac3fc769ef + md5: 89f76a2a21a3ec3ec983b5eb237c4113 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 569349 + timestamp: 1781670209146 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-devel-19.1.7-h6dc3340_2.conda + sha256: ec07ebaa226792f4e2bf0f5dba50325632a7474d5f04b951d8291be70af215da + md5: 9f7810b7c0a731dbc84d46d6005890ef + depends: + - libcxx >=19.1.7 + - libcxx-headers >=19.1.7,<19.1.8.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 23000 + timestamp: 1764648270121 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.22-hd74edd7_0.conda + sha256: 3552894ca62bebc33d05982937cda25a4fa19e56a82af2ff20944ff4c2532fda + md5: 2d3e3f3d8ab315748420ef58d5a3ae0f + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libdeflate >=1.22,<1.23.0a0 + size: 54089 + timestamp: 1728177149927 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libev >=4.33,<4.34.0a0 + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + sha256: 5af74261101e3c777399c6294b2b5d290e508153268eb2e9ff99c4d69834612f + md5: a915151d5d3c5bf039f5ccc8402a436f + depends: + - __osx >=11.0 + constrains: + - expat 2.8.1.* + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 69362 + timestamp: 1781203631990 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 + md5: 43c04d9cb46ef176bb2a4c77e324d599 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libffi >=3.5.2,<3.6.0a0 + size: 40979 + timestamp: 1769456747661 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 + md5: 4d5a7445f0b25b6a3ddbb56e790f5251 + depends: + - __osx >=11.0 + license: LGPL-2.1-only + purls: [] + run_exports: + weak: + - libiconv >=1.18,<2.0a0 + size: 750379 + timestamp: 1754909073836 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libllvm19-19.1.7-h8e0c9ce_2.conda + sha256: 46f8ff3d86438c0af1bebe0c18261ce5de9878d58b4fe399a3a125670e4f0af5 + md5: d1d9b233830f6631800acc1e081a9444 + depends: + - __osx >=11.0 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.5 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: + weak: + - libllvm19 >=19.1.7,<19.2.0a0 + size: 26914852 + timestamp: 1757353228286 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + sha256: 34878d87275c298f1a732c6806349125cebbf340d24c6c23727268184bba051e + md5: b1fd823b5ae54fbec272cea0811bd8a9 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.3.* + license: 0BSD + purls: [] + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 92472 + timestamp: 1775825802659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 + md5: 57c4be259f5e0b99a5983799a228ae55 + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + purls: [] + run_exports: {} + size: 73690 + timestamp: 1769482560514 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda + sha256: 2bc7bc3978066f2c274ebcbf711850cc9ab92e023e433b9631958a098d11e10a + md5: 6ea18834adbc3b33df9bd9fb45eaf95b + depends: + - __osx >=11.0 + - c-ares >=1.34.6,<2.0a0 + - libcxx >=19 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libnghttp2 >=1.68.1,<2.0a0 + size: 576526 + timestamp: 1773854624224 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsigtool-0.1.3-h98dc951_0.conda + sha256: 421f7bd7caaa945d9cd5d374cc3f01e75637ca7372a32d5e7695c825a48a30d1 + md5: c08557d00807785decafb932b5be7ef5 + depends: + - __osx >=11.0 + - openssl >=3.5.4,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 36416 + timestamp: 1767045062496 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_0.conda + sha256: 862463917e8ef5ac3ebdaf8f19914634b457609cc27ba678b7197124cefeb1f7 + md5: 1ebde5c677f00765233a17e278571177 + depends: + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libzlib >=1.3.2,<2.0a0 + license: blessing + purls: [] + run_exports: + weak: + - libsqlite >=3.53.2,<4.0a0 + size: 927724 + timestamp: 1780575223548 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + sha256: 8bfe837221390ffc6f111ecca24fa12d4a6325da0c8d131333d63d6c37f27e0a + md5: b68e8f66b94b44aaa8de4583d3d4cc40 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 + size: 279193 + timestamp: 1745608793272 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda + sha256: ff75b84cdb9e8d123db2fa694a8ac2c2059516b6cbc98ac21fb68e235d0fd354 + md5: 19edaa53885fc8205614b03da2482282 + depends: + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - libxml2 2.15.3 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 466360 + timestamp: 1776377102261 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_0.conda + sha256: 2fe1d8de0854342ae9cabe408b476935f82f5636e153b3b497456264dc8ff3a1 + md5: 8e037d73747d6fe34e12d7bcac10cf21 + depends: + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 h5ef1a60_0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: + weak: + - libxml2 + - libxml2-16 >=2.15.3 + size: 41102 + timestamp: 1776377119495 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 + md5: bc5a5721b6439f2f62a84f2548136082 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 47759 + timestamp: 1774072956767 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.8-hc7d1edf_0.conda + sha256: ccbaad6bbc88f135ab849bc36af5fa6eda36a9ed18ce6f58e3dde3d11784c156 + md5: a9c118f6343fb6301b6f3b4e94c4c562 + depends: + - __osx >=11.0 + constrains: + - intel-openmp <0.0a0 + - openmp 22.1.8|22.1.8.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + purls: [] + run_exports: + strong: + - llvm-openmp >=22.1.8 + size: 286313 + timestamp: 1781736516782 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19-19.1.7-h91fd4e7_2.conda + sha256: 73f9506f7c32a448071340e73a0e8461e349082d63ecc4849e3eb2d1efc357dd + md5: 8237b150fcd7baf65258eef9a0fc76ef + depends: + - __osx >=11.0 + - libcxx >=19 + - libllvm19 19.1.7 h8e0c9ce_2 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 16376095 + timestamp: 1757353442671 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-tools-19.1.7-h855ad52_2.conda + sha256: 09750c33b5d694c494cad9eafda56c61a62622264173d760341b49fb001afe82 + md5: 3e3ac06efc5fdc1aa675ca30bf7d53df + depends: + - __osx >=11.0 + - libllvm19 19.1.7 h8e0c9ce_2 + - llvm-tools-19 19.1.7 h91fd4e7_2 + constrains: + - llvm 19.1.7 + - llvmdev 19.1.7 + - clang-tools 19.1.7 + - clang 19.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 88390 + timestamp: 1757353535760 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmdev-19.1.7-h91fd4e7_2.conda + sha256: 321c651f0ba81ed0df3a6d7bbdf1de02ba13679ce1c880382fb73fbd245b4ae1 + md5: 46d3c0cdc4e2361ace6d6014d6e94d64 + depends: + - __osx >=11.0 + - libcxx >=19 + - libllvm19 19.1.7 h8e0c9ce_2 + - libzlib >=1.3.1,<2.0a0 + - llvm-tools 19.1.7 h855ad52_2 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - llvm 19.1.7 + - llvm-tools 19.1.7 + - clang-tools 19.1.7 + - clang 19.1.7 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + run_exports: {} + size: 45637337 + timestamp: 1757353673840 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d + md5: 343d10ed5b44030a2f67193905aea159 + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + purls: [] + run_exports: + weak: + - ncurses >=6.6,<7.0a0 + size: 805509 + timestamp: 1777423252320 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda + sha256: b3e3ca895c336d4eb91c5d2f244a312bdb59a0de8cfa0cc4c179225ab2f6bbfb + md5: 8187a86242741725bfa74785fe812979 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + purls: [] + run_exports: + weak: + - openssl >=3.6.3,<4.0a0 + size: 3102584 + timestamp: 1781069820667 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-h156bc91_100_cp314.conda + build_number: 100 + sha256: 984081c9fae3a3944c6f2707bbbbc70e8b961f02cdb7c640d9745e2636235632 + md5: 4841be3d0cf616a860efc6e60af66f8b + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.53.2,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.7,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + purls: [] + run_exports: + weak: + - python_abi 3.14.* *_cp314 + noarch: + - python + size: 14059371 + timestamp: 1781254578985 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 + depends: + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + run_exports: + weak: + - readline >=8.3,<9.0a0 + size: 313930 + timestamp: 1765813902568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-codesign-0.1.3-h98dc951_0.conda + sha256: f3d006e2441f110160a684744d90921bbedbffa247d7599d7e76b5cd048116dc + md5: ade77ad7513177297b1d75e351e136ce + depends: + - __osx >=11.0 + - libsigtool 0.1.3 h98dc951_0 + - openssl >=3.5.4,<4.0a0 + license: MIT + license_family: MIT + purls: [] + run_exports: {} + size: 114331 + timestamp: 1767045086274 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1600.0.11.8-h997e182_2.conda + sha256: de6893e53664e769c1b1c4103a666d436e3d307c0eb6a09a164e749d116e80f7 + md5: 555070ad1e18b72de36e9ee7ed3236b3 + depends: + - libcxx >=19.0.0.a0 + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: NCSA + purls: [] + run_exports: {} + size: 200192 + timestamp: 1775657222120 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3 + md5: a9d86bc62f39b94c4661716624eb21b0 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + purls: [] + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 + size: 3127137 + timestamp: 1769460817696 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda + sha256: 8dd2ac25f0ba714263aac5832d46985648f4bfb9b305b5021d702079badc08d2 + md5: f1c0bce276210bed45a04949cfe8dc20 + depends: + - __osx >=11.0 + - libzlib 1.3.2 h8088a28_2 + license: Zlib + license_family: Other + purls: [] + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 81123 + timestamp: 1774072974535 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 + md5: ab136e4c34e97f34fb621d2592a393d8 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + purls: [] + run_exports: + weak: + - zstd >=1.5.7,<1.6.0a0 + size: 433413 + timestamp: 1764777166076 +- pypi: . + name: deeptools + requires_dist: + - numpy>=2.0 + - scipy>=1.13 + - matplotlib>=3.9 + - pysam>=0.23 + - pybigwig>=0.3 + - py2bit>=0.3 + - pandas>=2.2 + - scikit-learn>=1.6 + - deeptoolsintervals>=0.1 + - maturin + - flake8 ; extra == 'actions' + - pytest ; extra == 'actions' + - twine ; extra == 'actions' + - build ; extra == 'actions' + - planemo ; extra == 'actions' + - matplotlib==3.11 ; extra == 'actions' + requires_python: '>=3.12' +- pypi: https://files.pythonhosted.org/packages/00/01/4001033457f25ecdc2b1ffd513ca0b76200b9ea009dd64f6c1aad2dde133/boltons-26.0.0-py3-none-any.whl + name: boltons + version: 26.0.0 + sha256: ba077cac51b27532299634f87f5589b4080fa94a011b4d43a9247f775e9215c7 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl + name: distlib + version: 0.4.3 + sha256: 4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b +- pypi: https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl + name: docutils + version: 0.22.4 + sha256: d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/08/f6/af32e23e563971ffb0fb86be52bc5be5c2c118858ffc119bf6a9039b173d/lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl + name: lxml + version: 6.1.1 + sha256: ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818 + requires_dist: + - cssselect>=0.7 ; extra == 'cssselect' + - html5lib ; extra == 'html5' + - beautifulsoup4 ; extra == 'htmlsoup' + - lxml-html-clean ; extra == 'html-clean' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/0b/35/1cceccc5fcb50fa2ed53e2aa278cd032f3902682a73e763fb1ac3be8e6fa/rich_argparse-1.8.0-py3-none-any.whl + name: rich-argparse + version: 1.8.0 + sha256: d2a3ce7854654e2253c578763ab0a32f05016f23a55fadba7b9a91b6c0e92142 + requires_dist: + - rich>=11.0.0 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl + name: pycparser + version: '3.0' + sha256: b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl + name: charset-normalizer + version: 3.4.7 + sha256: eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/0d/fe/6bea5c9162869c5beba5d9c8abbed835ec85bf1ec1fba05a3822325c45f3/build-1.5.0-py3-none-any.whl + name: build + version: 1.5.0 + sha256: 13f3eecb844759ab66efec90ca17639bbf14dc06cb2fdf37a9010322d9c50a6f + requires_dist: + - packaging>=24.0 + - pyproject-hooks + - colorama ; os_name == 'nt' + - importlib-metadata>=4.6 ; python_full_version < '3.10.2' + - tomli>=1.1.0 ; python_full_version < '3.11' + - keyring ; extra == 'keyring' + - uv>=0.1.18 ; extra == 'uv' + - virtualenv>=20.17 ; python_full_version >= '3.10' and python_full_version < '3.14' and extra == 'virtualenv' + - virtualenv>=20.31 ; python_full_version >= '3.14' and extra == 'virtualenv' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl + name: pyparsing + version: 3.3.2 + sha256: 850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d + requires_dist: + - railroad-diagrams ; extra == 'diagrams' + - jinja2 ; extra == 'diagrams' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/10/c2/6604a71269e0c1bd75656d5a001432d16f2cc5b8c057140ec797155c295e/rdflib-7.6.0-py3-none-any.whl + name: rdflib + version: 7.6.0 + sha256: 30c0a3ebf4c0e09215f066be7246794b6492e054e782d7ac2a34c9f70a15e0dd + requires_dist: + - berkeleydb>=18.1.0,<19.0.0 ; extra == 'berkeleydb' + - html5rdf>=1.2,<2 ; extra == 'html' + - httpx>=0.28.1,<0.29.0 ; extra == 'graphdb' or extra == 'rdf4j' + - isodate>=0.7.2,<1.0.0 ; python_full_version < '3.11' + - lxml>=4.3,<6.0 ; extra == 'lxml' + - networkx>=2,<4 ; extra == 'networkx' + - orjson>=3.9.14,<4 ; extra == 'orjson' + - pyparsing>=2.1.0,<4 + requires_python: '>=3.8.1' +- pypi: https://files.pythonhosted.org/packages/13/37/a065dc3bd6e49423a6532c642ca7378d3f467b1ef44c2800c937af7f9739/filelock-3.29.4-py3-none-any.whl + name: filelock + version: 3.29.4 + sha256: dac1648087d5115554850d113e7dd8c83ab2d38e3435dde2d4f163847e57b767 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/13/e2/2e325795566de01d0d7c3bb57d3c370616b2d07b01214e84eec5d3b10963/lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl + name: lxml + version: 6.1.1 + sha256: 19b7ab10b210b0b3ad7985d9ac4eb66ab09a90b20fe6e2f7ba55d01a234345d0 + requires_dist: + - cssselect>=0.7 ; extra == 'cssselect' + - html5lib ; extra == 'html5' + - beautifulsoup4 ; extra == 'htmlsoup' + - lxml-html-clean ; extra == 'html-clean' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/14/15/5574111ae50dd6e879456888c0eadd4c5a869959775854e18e18a6b345f3/propcache-0.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: propcache + version: 0.5.2 + sha256: 6f328175a2cde1f0ff2c4ed8ce968b9dcfb55f3a7153f39e2957ed994da13476 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/14/27/cc422d11961a00bd04aa9a8d9a63683a1083fe2e6a491c285a94998d6751/pysam-0.24.0-cp312-cp312-macosx_10_13_x86_64.whl + name: pysam + version: 0.24.0 + sha256: 38d5cc5dff4bdaceabbb58c0700c41b132aacf783432b1d16060b46ac7d866e2 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/15/1c/991e414e4305e5aef60c8ebb51f35a2e1b12cf80b9fc41733bbdd070c037/galaxy_tool_util-26.0.1-py3-none-any.whl + name: galaxy-tool-util + version: 26.0.1 + sha256: 8e96969e2ced926bededa90ac137aa3a939500eb521ec7f64edc0f39f48b180a + requires_dist: + - galaxy-tool-util-models + - galaxy-util[image-util,template]>=22.1 + - conda-package-streaming + - lxml!=4.2.2 + - markupsafe + - packaging + - pydantic>=2.7.4 + - pyyaml + - requests + - sortedcontainers + - typing-extensions + - cwl-utils ; extra == 'cwl' + - cwltool>=3.1.20230624081518 ; extra == 'cwl' + - jinja2 ; extra == 'mulled' + - whoosh ; extra == 'mulled' + - edam-ontology ; extra == 'edam' + - numpy ; extra == 'extended-assertions' + - pysam ; extra == 'extended-assertions' + - pillow ; extra == 'extended-assertions' + - tifffile ; extra == 'extended-assertions' + - beaker ; extra == 'test' + - pytest ; extra == 'test' + - pytest-mock ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/18/3e/4253fa84dd1947207033df2fecd52781e7e2f6d65c4360f38d739bb3c8c9/galaxy_util-26.0.1-py3-none-any.whl + name: galaxy-util + version: 26.0.1 + sha256: 62185001f2295338e45aa7376f30bbefd0ee69f08875892170c9831901a0310d + requires_dist: + - bleach + - boltons + - docutils!=0.17,!=0.17.1 + - importlib-resources>=5.10.0 ; python_full_version < '3.12' + - packaging + - pyparsing>=3.0.0 + - pyyaml + - requests + - typing-extensions + - zipstream-new + - pillow ; extra == 'image-util' + - dictobj ; extra == 'jstree' + - ct3>=3.3.3 ; extra == 'template' + - fissix ; python_full_version >= '3.13' and extra == 'template' + - future>=1.0.0 ; extra == 'template' + - galaxy-tool-util-models ; extra == 'config-template' + - jinja2 ; extra == 'config-template' + - pydantic>=2.7.4 ; extra == 'config-template' + - pytest ; extra == 'test' + - pytest-httpserver ; extra == 'test' + - responses ; extra == 'test' + - werkzeug ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl + name: typing-extensions + version: 4.15.0 + sha256: f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/1a/82/a70006589557f267f15bd384c0642ad49f0d97b690c3a05b166b9dcbad3b/python_discovery-1.4.2-py3-none-any.whl + name: python-discovery + version: 1.4.2 + sha256: 475803f53b7b2ed6e490e27373f9d8340f7d2eebf9acdaf645d7d714c97bb500 + requires_dist: + - filelock>=3.15.4 + - platformdirs>=4.3.6,<5 + - furo>=2025.12.19 ; extra == 'docs' + - sphinx-autodoc-typehints>=3.6.3 ; extra == 'docs' + - sphinx>=9.1 ; extra == 'docs' + - sphinxcontrib-mermaid>=2 ; extra == 'docs' + - sphinxcontrib-towncrier>=0.4 ; extra == 'docs' + - towncrier>=25.8 ; extra == 'docs' + - covdefaults>=2.3 ; extra == 'testing' + - coverage>=7.5.4 ; extra == 'testing' + - pytest-mock>=3.14 ; extra == 'testing' + - pytest>=8.3.5 ; extra == 'testing' + - setuptools>=75.1 ; extra == 'testing' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/1a/bd/9c0d5d6983905ce2c9edaa073a7e89355a9cf7f396988e05d32f1c37785d/maturin-1.14.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.musllinux_1_1_x86_64.whl + name: maturin + version: 1.14.1 + sha256: dfc54ae32e6fcb18302193ab9a30b0b25eefffba994ae13238974805533ef75e + requires_dist: + - tomli>=1.1.0 ; python_full_version < '3.11' + - patchelf ; extra == 'patchelf' + - ziglang>=0.10.0 ; extra == 'zig' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl + name: idna + version: '3.18' + sha256: 7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2 + requires_dist: + - ruff>=0.6.2 ; extra == 'all' + - mypy>=1.11.2 ; extra == 'all' + - pytest>=8.3.2 ; extra == 'all' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/1e/bb/009af3a9532d4cc66d5385391c512210fae32ab2442605f26aca1d8d2957/backports_zstd-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl + name: backports-zstd + version: 1.6.0 + sha256: 0466b14723f3b7697669c00ee66fe16e30e25636b286b0a923fa86fa3d8a753c + requires_python: '>=3.10,<3.14' +- pypi: https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz + name: cryptography + version: 49.0.0 + sha256: f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493 + requires_dist: + - cffi>=2.0.0 ; platform_python_implementation != 'PyPy' + - typing-extensions>=4.13.2 ; python_full_version < '3.11' + - bcrypt>=3.1.5 ; extra == 'ssh' + requires_python: '>=3.9,!=3.9.0,!=3.9.1' +- pypi: https://files.pythonhosted.org/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl + name: cryptography + version: 49.0.0 + sha256: 2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6 + requires_dist: + - cffi>=2.0.0 ; platform_python_implementation != 'PyPy' + - typing-extensions>=4.13.2 ; python_full_version < '3.11' + - bcrypt>=3.1.5 ; extra == 'ssh' + requires_python: '>=3.9,!=3.9.0,!=3.9.1' +- pypi: https://files.pythonhosted.org/packages/20/9c/d445818389df371f56d141d881153ba23183c4735a03f7356ffb43f7757d/aiohttp-3.14.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: aiohttp + version: 3.14.1 + sha256: 3e6fc1a85fa7194a1a7d19f44e8609180f4a8eb5fa4c7ed8b4355f080fad235c + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - typing-extensions>=4.4 ; python_full_version < '3.13' + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; sys_platform != 'android' and sys_platform != 'ios' and extra == 'speedups' + - brotli>=1.2 ; platform_python_implementation == 'CPython' and sys_platform != 'android' and sys_platform != 'ios' and extra == 'speedups' + - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and sys_platform != 'android' and sys_platform != 'ios' and extra == 'speedups' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/22/00/ff3009c88e65de8011630acf8ab5a09cb2becd2aaf47fba2f3449f6224e9/lxml-6.1.1-cp312-cp312-macosx_10_13_x86_64.whl + name: lxml + version: 6.1.1 + sha256: 25c6997a9a534e016695a0ba06b2f07945de682731ff01065b6d5a4474179da1 + requires_dist: + - cssselect>=0.7 ; extra == 'cssselect' + - html5lib ; extra == 'html5' + - beautifulsoup4 ; extra == 'htmlsoup' + - lxml-html-clean ; extra == 'html-clean' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl + name: pytest + version: 9.1.1 + sha256: 37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c + requires_dist: + - colorama>=0.4 ; sys_platform == 'win32' + - exceptiongroup>=1 ; python_full_version < '3.11' + - iniconfig>=1.0.1 + - packaging>=22 + - pluggy>=1.5,<2 + - pygments>=2.7.2 + - tomli>=1 ; python_full_version < '3.11' + - argcomplete ; extra == 'dev' + - attrs>=19.2 ; extra == 'dev' + - hypothesis>=3.56 ; extra == 'dev' + - mock ; extra == 'dev' + - requests ; extra == 'dev' + - setuptools ; extra == 'dev' + - xmlschema ; extra == 'dev' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/24/f1/392f8c5bfc16f66a0d2d41561c01627c228fe7ed2a0d056ef11315042570/pandas-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl + name: pandas + version: 3.0.3 + sha256: fed2ff7fd9779120e388e285fc029bd5cf9490cdd2e4166a9ee22c0e49a9ab09 + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; extra == 'sql-other' + - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' + - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' + - beautifulsoup4>=4.12.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2020.1 ; extra == 'timezone' + - adbc-driver-postgresql>=1.2.0 ; extra == 'all' + - adbc-driver-sqlite>=1.2.0 ; extra == 'all' + - beautifulsoup4>=4.12.3 ; extra == 'all' + - bottleneck>=1.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2020.1 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl + name: mccabe + version: 0.7.0 + sha256: 6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/27/d2/23d25e3f247b328be58d04a4c9f894178a0d1eda7d42867cfb388adaf416/fonttools-4.63.0-cp314-cp314-macosx_10_15_universal2.whl + name: fonttools + version: 4.63.0 + sha256: fd1e3094f42d806d3d7c79162fc59e5910fcbe3a7360c385b8da969bc4493745 + requires_dist: + - lxml>=4.0 ; extra == 'lxml' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - zopfli>=0.1.4 ; extra == 'woff' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'unicode' + - lz4>=1.7.4.2 ; extra == 'graphite' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - pycairo ; extra == 'interpolatable' + - matplotlib ; extra == 'plot' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - skia-pathops>=0.5.0 ; extra == 'pathops' + - uharfbuzz>=0.45.0 ; extra == 'repacker' + - lxml>=4.0 ; extra == 'all' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - zopfli>=0.1.4 ; extra == 'all' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'all' + - lz4>=1.7.4.2 ; extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - skia-pathops>=0.5.0 ; extra == 'all' + - uharfbuzz>=0.45.0 ; extra == 'all' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl + name: mistune + version: 3.2.1 + sha256: 78cdb0ba5e938053ccf63651b352508d2efa9411dc8810bfb05f2dc5140c0048 + requires_dist: + - typing-extensions ; python_full_version < '3.11' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/2c/02/3623e6169bed617ed1e2d372f7c69f92ec28d54c4dfc997055c8578ec148/virtualenv-21.5.1-py3-none-any.whl + name: virtualenv + version: 21.5.1 + sha256: 55aa670b67bbfb991b03fda39bd3276d92c419d702376e98c5df1c9989a26783 + requires_dist: + - distlib>=0.3.7,<1 + - filelock>=3.24.2,<4 ; python_full_version >= '3.10' + - filelock>=3.16.1,<=3.19.1 ; python_full_version < '3.10' + - platformdirs>=3.9.1,<5 + - python-discovery>=1.4.2 + - typing-extensions>=4.13.2 ; python_full_version < '3.11' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl + name: sortedcontainers + version: 2.4.0 + sha256: a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 +- pypi: https://files.pythonhosted.org/packages/32/8e/b94ec25fcd4384de2a1f5e0403284f005ec743c04bafdb6698c851df5c6d/tuspy-1.1.0-py3-none-any.whl + name: tuspy + version: 1.1.0 + sha256: 7fc5ac8fb25de37c96c90213f83a1ffdede7f48a471cb5a15a2f57846828a79a + requires_dist: + - requests>=2.18.4 + - tinydb>=3.5.0 + - aiohttp>=3.6.2 + - responses>=0.5.1 ; extra == 'test' + - aioresponses>=0.6.2 ; extra == 'test' + - coverage>=4.2 ; extra == 'test' + - pytest>=3.0.3 ; extra == 'test' + - pytest-cov>=2.3.1,<2.6 ; extra == 'test' + - parametrize>=0.1.1 ; extra == 'test' + - tox>=2.3.1 ; extra == 'dev' + - sphinx-autobuild==2021.3.14 ; extra == 'dev' + - sphinx==1.7.1 ; extra == 'dev' + requires_python: '>=3.5.3' +- pypi: https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl + name: threadpoolctl + version: 3.6.0 + sha256: 43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/37/aa/111610d8bf5b1bb7a295a048fc648cec346347a8b0be5881defd2d1b4a52/oyaml-1.0-py2.py3-none-any.whl + name: oyaml + version: '1.0' + sha256: 3a378747b7fb2425533d1ce41962d6921cda075d46bb480a158d45242d156323 + requires_dist: + - pyyaml +- pypi: https://files.pythonhosted.org/packages/3a/7a/882d99539b19b1490cac5d77c67338d126e4122c8276bf640e411650c830/twine-6.2.0-py3-none-any.whl + name: twine + version: 6.2.0 + sha256: 418ebf08ccda9a8caaebe414433b0ba5e25eb5e4a927667122fbe8f829f985d8 + requires_dist: + - readme-renderer>=35.0 + - requests>=2.20 + - requests-toolbelt>=0.8.0,!=0.9.0 + - urllib3>=1.26.0 + - importlib-metadata>=3.6 ; python_full_version < '3.10' + - keyring>=21.2.0 ; platform_machine != 'ppc64le' and platform_machine != 's390x' + - rfc3986>=1.4.0 + - rich>=12.0.0 + - packaging>=24.0 + - id + - keyring>=21.2.0 ; extra == 'keyring' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl + name: appdirs + version: 1.4.4 + sha256: a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128 +- pypi: https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: markupsafe + version: 3.0.3 + sha256: d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/3c/6b/72e5f22f3c5069bd950f107110cd17468cdb43abda3c55b48c4013e7b667/bioblend-1.9.0-py3-none-any.whl + name: bioblend + version: 1.9.0 + sha256: 573d6e8e8f1ee3f5a5630a05e561ca5c69ecfa2cf93d7e81d472ec8fe53abc49 + requires_dist: + - pyyaml + - requests>=2.20.0 + - requests-toolbelt>=0.5.1,!=0.9.0 + - tuspy + - pytest ; extra == 'testing' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/3c/a7/552a7821597c632b907f7bfe8f36f9f572777af8ef8a48353041cf8e091a/scikit_learn-1.9.0-cp314-cp314-macosx_12_0_arm64.whl + name: scikit-learn + version: 1.9.0 + sha256: 24360002ae845e7866522b0a5bbf690802e7bc388cac8663502e78aa98598aa2 + requires_dist: + - numpy>=1.24.1 + - scipy>=1.10.0 + - joblib>=1.4.0 + - narwhals>=2.0.1 + - threadpoolctl>=3.5.0 + - numpy>=1.24.1 ; extra == 'build' + - scipy>=1.10.0 ; extra == 'build' + - cython>=3.1.2 ; extra == 'build' + - meson-python>=0.17.1 ; extra == 'build' + - numpy>=1.24.1 ; extra == 'install' + - scipy>=1.10.0 ; extra == 'install' + - joblib>=1.4.0 ; extra == 'install' + - narwhals>=2.0.1 ; extra == 'install' + - threadpoolctl>=3.5.0 ; extra == 'install' + - matplotlib>=3.6.1 ; extra == 'benchmark' + - pandas>=1.5.0 ; extra == 'benchmark' + - memory-profiler>=0.57.0 ; extra == 'benchmark' + - matplotlib>=3.6.1 ; extra == 'docs' + - scikit-image>=0.22.0 ; extra == 'docs' + - pandas>=1.5.0 ; extra == 'docs' + - rich>=14.1.0 ; extra == 'docs' + - seaborn>=0.13.0 ; extra == 'docs' + - memory-profiler>=0.57.0 ; extra == 'docs' + - sphinx>=7.3.7 ; extra == 'docs' + - sphinx-copybutton>=0.5.2 ; extra == 'docs' + - sphinx-gallery>=0.17.1 ; extra == 'docs' + - numpydoc>=1.2.0 ; extra == 'docs' + - pillow>=12.1.1 ; extra == 'docs' + - pooch>=1.8.0 ; extra == 'docs' + - sphinx-prompt>=1.4.0 ; extra == 'docs' + - sphinxext-opengraph>=0.9.1 ; extra == 'docs' + - plotly>=5.22.0 ; extra == 'docs' + - polars>=0.20.30 ; extra == 'docs' + - sphinx-design>=0.6.0 ; extra == 'docs' + - sphinxcontrib-sass>=0.3.4 ; extra == 'docs' + - pydata-sphinx-theme>=0.15.3 ; extra == 'docs' + - sphinx-remove-toctrees>=1.0.0.post1 ; extra == 'docs' + - towncrier>=24.8.0 ; extra == 'docs' + - matplotlib>=3.6.1 ; extra == 'examples' + - scikit-image>=0.22.0 ; extra == 'examples' + - pandas>=1.5.0 ; extra == 'examples' + - rich>=14.1.0 ; extra == 'examples' + - seaborn>=0.13.0 ; extra == 'examples' + - pooch>=1.8.0 ; extra == 'examples' + - plotly>=5.22.0 ; extra == 'examples' + - matplotlib>=3.6.1 ; extra == 'tests' + - pandas>=1.5.0 ; extra == 'tests' + - rich>=14.1.0 ; extra == 'tests' + - pytest>=7.1.2 ; extra == 'tests' + - pytest-cov>=2.9.0 ; extra == 'tests' + - ruff>=0.12.2 ; extra == 'tests' + - mypy>=1.15 ; extra == 'tests' + - pyamg>=5.0.0 ; extra == 'tests' + - polars>=0.20.30 ; extra == 'tests' + - pyarrow>=13.0.0 ; extra == 'tests' + - numpydoc>=1.2.0 ; extra == 'tests' + - pooch>=1.8.0 ; extra == 'tests' + - conda-lock==3.0.1 ; extra == 'maintenance' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/3d/6f/221654a39431edc7e9685702ab06fbb22bb313629e0187c0ed4462ba8af7/schema_salad-8.9.20260417192335-py3-none-any.whl + name: schema-salad + version: 8.9.20260417192335 + sha256: dd7f5b1aa4d6f3ab61e7fd83d942af22d83afecc5f24f48b2027810efe6bd76f + requires_dist: + - requests>=1.0 + - ruamel-yaml>=0.17.6,<0.20 + - rdflib>=4.2.2,<8.0.0 + - mistune>=3,<3.3 + - cachecontrol[filecache]>=0.13.1,<0.15 + - mypy-extensions + - rich-argparse + - sphinx>=2.2 ; extra == 'docs' + - sphinx-rtd-theme>=1 ; extra == 'docs' + - pytest<10 ; extra == 'docs' + - sphinx-autoapi ; extra == 'docs' + - sphinx-autodoc-typehints ; extra == 'docs' + - sphinxcontrib-autoprogram ; extra == 'docs' + - black ; extra == 'pycodegen' + requires_python: '>=3.10,<3.15' +- pypi: https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl + name: requests-toolbelt + version: 1.0.0 + sha256: cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 + requires_dist: + - requests>=2.0.1,<3.0.0 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' +- pypi: https://files.pythonhosted.org/packages/42/77/de194443bf38daed9452139e960c632b0ef9f9a5dd9ce605fdf18ca9f1b1/id-1.6.1-py3-none-any.whl + name: id + version: 1.6.1 + sha256: f5ec41ed2629a508f5d0988eda142e190c9c6da971100612c4de9ad9f9b237ca + requires_dist: + - urllib3>=2,<3 + - build ; extra == 'dev' + - bump>=1.3.2 ; extra == 'dev' + - id[test,lint] ; extra == 'dev' + - bandit ; extra == 'lint' + - interrogate ; extra == 'lint' + - mypy ; extra == 'lint' + - ruff<0.14.15 ; extra == 'lint' + - pytest ; extra == 'test' + - pytest-cov ; extra == 'test' + - pretend ; extra == 'test' + - coverage[toml] ; extra == 'test' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: pillow + version: 12.2.0 + sha256: 62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780 + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/44/a0/c815bea63117fa63e4e1c01f8a1110d2112fa003f838e6467094ec2432ce/fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl + name: fonttools + version: 4.63.0 + sha256: a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0 + requires_dist: + - lxml>=4.0 ; extra == 'lxml' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - zopfli>=0.1.4 ; extra == 'woff' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'unicode' + - lz4>=1.7.4.2 ; extra == 'graphite' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - pycairo ; extra == 'interpolatable' + - matplotlib ; extra == 'plot' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - skia-pathops>=0.5.0 ; extra == 'pathops' + - uharfbuzz>=0.45.0 ; extra == 'repacker' + - lxml>=4.0 ; extra == 'all' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - zopfli>=0.1.4 ; extra == 'all' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'all' + - lz4>=1.7.4.2 ; extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - skia-pathops>=0.5.0 ; extra == 'all' + - uharfbuzz>=0.45.0 ; extra == 'all' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/46/3b/9dedd2e35cebcd4eb3539514b5ac674fd45654404839e6f9eff6e25d67c7/py2bit-1.0.1.tar.gz + name: py2bit + version: 1.0.1 + sha256: 4972f85eb3844cdfba43eb54ab3c8349a0536e03dfd7db07ca8d3447285ad20c +- pypi: https://files.pythonhosted.org/packages/48/ca/36339329c4604adbcc99c899b7eb1ce1a555c499b6a6860757dc9bfed36d/narwhals-2.22.1-py3-none-any.whl + name: narwhals + version: 2.22.1 + sha256: 60567d774edf77db53906f89d9fbd164e66e56d66d388e1e6990f17ac33cfb53 + requires_dist: + - cudf-cu12>=24.10.0 ; sys_platform == 'linux' and extra == 'cudf' + - dask[dataframe]>=2024.8 ; extra == 'dask' + - duckdb>=1.1 ; extra == 'duckdb' + - ibis-framework>=6.0.0 ; extra == 'ibis' + - rich>=12.4.4 ; extra == 'ibis' + - packaging>=21.3 ; extra == 'ibis' + - pyarrow-hotfix>=0.7 ; extra == 'ibis' + - modin>=0.22.0 ; extra == 'modin' + - pandas>=1.3.4 ; extra == 'pandas' + - polars>=0.20.4 ; extra == 'polars' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - pyspark>=3.5.0 ; extra == 'pyspark' + - pyspark[connect]>=3.5.0 ; extra == 'pyspark-connect' + - narwhals[duckdb] ; extra == 'sql' + - sqlparse>=0.5.5 ; extra == 'sql' + - sqlframe>=3.22.0,!=3.39.3 ; extra == 'sqlframe' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl + name: kiwisolver + version: 1.5.0 + sha256: 0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: charset-normalizer + version: 3.4.7 + sha256: 5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/53/78/ddd0affa881b1e09bc59f11ab829a7904f4bca29d25c34cbb9395e8e0061/allure_python_commons-2.16.0-py3-none-any.whl + name: allure-python-commons + version: 2.16.0 + sha256: 6d42a500078aca8a2e68823075c1ffc2396987bb268d62b19af82390b205ce88 + requires_dist: + - attrs>=16.0.0 + - pluggy>=0.4.0 + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl + name: pluggy + version: 1.6.0 + sha256: e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 + requires_dist: + - pre-commit ; extra == 'dev' + - tox ; extra == 'dev' + - pytest ; extra == 'testing' + - pytest-benchmark ; extra == 'testing' + - coverage ; extra == 'testing' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/55/0f/e7f1ff3a1cabc6c4486a7ee1b0506aedf2f5f8329760ac1f4e8032feef2b/pysam-0.24.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: pysam + version: 0.24.0 + sha256: 4a642f18649e59817de272173e9c27c031dceaca199809e4f8b338ebfc5d6698 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/58/9d/40b6267367182187139a4000b82a3b287d84d745bccd808e75d916920e9d/bleach-6.4.0-py3-none-any.whl + name: bleach + version: 6.4.0 + sha256: 4b6b6a54fff2e69a3dde9d21cc6301220bee3c3cb792187d11403fd795031081 + requires_dist: + - webencodings + - tinycss2>=1.1.0 ; extra == 'css' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl + name: pillow + version: 12.2.0 + sha256: 2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5 + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl + name: cffi + version: 2.0.0 + sha256: c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13 + requires_dist: + - pycparser ; implementation_name != 'PyPy' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl + name: markupsafe + version: 3.0.3 + sha256: d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/5b/67/314f6151bad77a93d751978a344033e1fc890822f05f0416079338e34231/nh3-0.3.6-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: nh3 + version: 0.3.6 + sha256: 905f877dc66dd7aea4a76e54bcb26acb5ff8216f720c0017ccf63e0e6035698e + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/5d/39/b72e168daf9c00fb20c9fc996d00437ccecdef3102387775d29d7a62576d/numpy-2.5.0-cp314-cp314-macosx_11_0_arm64.whl + name: numpy + version: 2.5.0 + sha256: 28e7137057d551e4a83c4ae414e3451f50568409db7569aacc7f9811ee06a446 + requires_python: '>=3.12' +- pypi: https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: pydantic-core + version: 2.46.4 + sha256: 926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/5f/fc/a7bf5b6e4e617b45f90f2d9d2a68519c249c81dd4fc2658c7a2a61c4f4b7/aiohappyeyeballs-2.6.2-py3-none-any.whl + name: aiohappyeyeballs + version: 2.6.2 + sha256: 4708045e2d7a6c6bdf8aafa8ed39649eaf926a4543b54560659129e3365953c4 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/60/5c/15b4c7a0182f75ffa90751958ba36a9c01cafee367d49a3edc10ed140b01/msgpack-1.2.1-cp314-cp314-macosx_11_0_arm64.whl + name: msgpack + version: 1.2.1 + sha256: 810b916696c86ef0deb3b74588480224df4c1b071136c34183e4a2a4284d7ac7 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl + name: jinja2 + version: 3.1.6 + sha256: 85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 + requires_dist: + - markupsafe>=2.0 + - babel>=2.7 ; extra == 'i18n' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/63/b1/4260d67d6bd85e58a66b72d54ce15d5de789b6f3870cc6bedf8ff9667401/propcache-0.5.2-cp314-cp314-macosx_11_0_arm64.whl + name: propcache + version: 0.5.2 + sha256: 97797ebb098e670a2f92dd66f32897e30d7615b14e7f59711de23e30a9072539 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl + name: frozenlist + version: 1.8.0 + sha256: 229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl + name: attrs + version: 26.1.0 + sha256: c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/65/b6/09b01cdbc15224e2850365192d17b7bdebb8bdbd8780ed221fcdf0d9a515/pandas-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl + name: pandas + version: 3.0.3 + sha256: 6dc0b3fd2169c9157deed50b4d519553a3655c8c6a96027136d654592be973a9 + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; extra == 'sql-other' + - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' + - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' + - beautifulsoup4>=4.12.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2020.1 ; extra == 'timezone' + - adbc-driver-postgresql>=1.2.0 ; extra == 'all' + - adbc-driver-sqlite>=1.2.0 ; extra == 'all' + - beautifulsoup4>=4.12.3 ; extra == 'all' + - bottleneck>=1.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2020.1 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/68/10/bf2d6738d72748b961a3751ab89522d58c54efc36a8e1a12161216cd45cf/pandas-3.0.3-cp314-cp314-macosx_11_0_arm64.whl + name: pandas + version: 3.0.3 + sha256: bab900348131a7db1f69a7309ef141fd5680f1487094193bcbbb61791573bf8f + requires_dist: + - numpy>=1.26.0 ; python_full_version < '3.14' + - numpy>=2.3.3 ; python_full_version >= '3.14' + - python-dateutil>=2.8.2 + - tzdata ; sys_platform == 'win32' + - tzdata ; sys_platform == 'emscripten' + - hypothesis>=6.116.0 ; extra == 'test' + - pytest>=8.3.4 ; extra == 'test' + - pytest-xdist>=3.6.1 ; extra == 'test' + - pyarrow>=13.0.0 ; extra == 'pyarrow' + - bottleneck>=1.4.2 ; extra == 'performance' + - numba>=0.60.0 ; extra == 'performance' + - numexpr>=2.10.2 ; extra == 'performance' + - scipy>=1.14.1 ; extra == 'computation' + - xarray>=2024.10.0 ; extra == 'computation' + - fsspec>=2024.10.0 ; extra == 'fss' + - s3fs>=2024.10.0 ; extra == 'aws' + - gcsfs>=2024.10.0 ; extra == 'gcp' + - odfpy>=1.4.1 ; extra == 'excel' + - openpyxl>=3.1.5 ; extra == 'excel' + - python-calamine>=0.3.0 ; extra == 'excel' + - pyxlsb>=1.0.10 ; extra == 'excel' + - xlrd>=2.0.1 ; extra == 'excel' + - xlsxwriter>=3.2.0 ; extra == 'excel' + - pyarrow>=13.0.0 ; extra == 'parquet' + - pyarrow>=13.0.0 ; extra == 'feather' + - pyiceberg>=0.8.1 ; extra == 'iceberg' + - tables>=3.10.1 ; extra == 'hdf5' + - pyreadstat>=1.2.8 ; extra == 'spss' + - sqlalchemy>=2.0.36 ; extra == 'postgresql' + - psycopg2>=2.9.10 ; extra == 'postgresql' + - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' + - sqlalchemy>=2.0.36 ; extra == 'mysql' + - pymysql>=1.1.1 ; extra == 'mysql' + - sqlalchemy>=2.0.36 ; extra == 'sql-other' + - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' + - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' + - beautifulsoup4>=4.12.3 ; extra == 'html' + - html5lib>=1.1 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'html' + - lxml>=5.3.0 ; extra == 'xml' + - matplotlib>=3.9.3 ; extra == 'plot' + - jinja2>=3.1.5 ; extra == 'output-formatting' + - tabulate>=0.9.0 ; extra == 'output-formatting' + - pyqt5>=5.15.9 ; extra == 'clipboard' + - qtpy>=2.4.2 ; extra == 'clipboard' + - zstandard>=0.23.0 ; extra == 'compression' + - pytz>=2020.1 ; extra == 'timezone' + - adbc-driver-postgresql>=1.2.0 ; extra == 'all' + - adbc-driver-sqlite>=1.2.0 ; extra == 'all' + - beautifulsoup4>=4.12.3 ; extra == 'all' + - bottleneck>=1.4.2 ; extra == 'all' + - fastparquet>=2024.11.0 ; extra == 'all' + - fsspec>=2024.10.0 ; extra == 'all' + - gcsfs>=2024.10.0 ; extra == 'all' + - html5lib>=1.1 ; extra == 'all' + - hypothesis>=6.116.0 ; extra == 'all' + - jinja2>=3.1.5 ; extra == 'all' + - lxml>=5.3.0 ; extra == 'all' + - matplotlib>=3.9.3 ; extra == 'all' + - numba>=0.60.0 ; extra == 'all' + - numexpr>=2.10.2 ; extra == 'all' + - odfpy>=1.4.1 ; extra == 'all' + - openpyxl>=3.1.5 ; extra == 'all' + - psycopg2>=2.9.10 ; extra == 'all' + - pyarrow>=13.0.0 ; extra == 'all' + - pyiceberg>=0.8.1 ; extra == 'all' + - pymysql>=1.1.1 ; extra == 'all' + - pyqt5>=5.15.9 ; extra == 'all' + - pyreadstat>=1.2.8 ; extra == 'all' + - pytest>=8.3.4 ; extra == 'all' + - pytest-xdist>=3.6.1 ; extra == 'all' + - python-calamine>=0.3.0 ; extra == 'all' + - pytz>=2020.1 ; extra == 'all' + - pyxlsb>=1.0.10 ; extra == 'all' + - qtpy>=2.4.2 ; extra == 'all' + - scipy>=1.14.1 ; extra == 'all' + - s3fs>=2024.10.0 ; extra == 'all' + - sqlalchemy>=2.0.36 ; extra == 'all' + - tables>=3.10.1 ; extra == 'all' + - tabulate>=0.9.0 ; extra == 'all' + - xarray>=2024.10.0 ; extra == 'all' + - xlrd>=2.0.1 ; extra == 'all' + - xlsxwriter>=3.2.0 ; extra == 'all' + - zstandard>=0.23.0 ; extra == 'all' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/6a/19/ca10ead60b0acc80b2b833c2c4a4f2ff753d0f58b811f70d911c7e94a25c/scipy-1.18.0-cp312-cp312-macosx_10_15_x86_64.whl + name: scipy + version: 1.18.0 + sha256: 7bd21faaf5a1a3b2eff922d02db5f191b99a6518db9078a8fb23169f6d22259a + requires_dist: + - numpy>=2.0.0,<2.8 + - pytest>=8.0.0 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-xdist ; extra == 'test' + - asv ; extra == 'test' + - mpmath ; extra == 'test' + - gmpy2 ; extra == 'test' + - threadpoolctl ; extra == 'test' + - scikit-umfpack ; extra == 'test' + - pooch ; extra == 'test' + - hypothesis>=6.30 ; extra == 'test' + - array-api-strict>=2.3.1 ; extra == 'test' + - cython ; extra == 'test' + - meson ; extra == 'test' + - ninja ; sys_platform != 'emscripten' and extra == 'test' + - scipy-doctest>=2.0.0 ; extra == 'test' + - sphinx>=5.0.0,<8.2.0 ; extra == 'doc' + - intersphinx-registry ; extra == 'doc' + - pydata-sphinx-theme>=0.15.2 ; extra == 'doc' + - sphinx-copybutton ; extra == 'doc' + - sphinx-design>=0.4.0 ; extra == 'doc' + - matplotlib>=3.5 ; extra == 'doc' + - numpydoc ; extra == 'doc' + - jupytext ; extra == 'doc' + - myst-nb>=1.2.0 ; extra == 'doc' + - pooch ; extra == 'doc' + - jupyterlite-sphinx>=0.19.1 ; extra == 'doc' + - jupyterlite-pyodide-kernel ; extra == 'doc' + - linkify-it-py ; extra == 'doc' + - tabulate ; extra == 'doc' + - click<8.3.0 ; extra == 'dev' + - spin ; extra == 'dev' + - mypy==1.19.1 ; extra == 'dev' + - pyrefly==0.63.0 ; extra == 'dev' + - typing-extensions ; extra == 'dev' + - types-psutil ; extra == 'dev' + - pycodestyle ; extra == 'dev' + - ruff>=0.12.0 ; extra == 'dev' + - cython-lint>=0.12.2 ; extra == 'dev' + requires_python: '>=3.12' +- pypi: https://files.pythonhosted.org/packages/6a/b7/9366ed44ced9b7ef357ab48c94205280276db9d7f064aa3012a97227e966/h5py-3.16.0-cp314-cp314-macosx_11_0_arm64.whl + name: h5py + version: 3.16.0 + sha256: 8c1eff849cdd53cbc73c214c30ebdb6f1bb8b64790b4b4fc36acdb5e43570210 + requires_dist: + - numpy>=1.21.2 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl + name: frozenlist + version: 1.8.0 + sha256: 494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/6a/fd/6adabd4f6d5e686f97dd02ce7fce3fe4cf672cbac36b8f67ff4040e8ad8b/msgpack-1.2.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: msgpack + version: 1.2.1 + sha256: 020e881a764b20d8d7ca1a54fc01b8175519d108e3c3f194fddc200bda95951a + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/6b/67/6ea73b2173bcb1abe3a947fbd090cf96ee1b0a75f3f690e8902dc8ffdbfa/py2bit-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: py2bit + version: 1.0.1 + sha256: 0cbd9754342dc9595f46b18e655af01d89e78d9762b0b541fcd4e96076523275 +- pypi: https://files.pythonhosted.org/packages/6b/b2/d17b2722c636d64b4e77ddc68d8d0625719d39f94021be8719a218af4c0a/backports_zstd-1.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: backports-zstd + version: 1.6.0 + sha256: 1a99710fbb225d459d66def4dc2bb2cd4a9a0bdc8b799fc0621cfdd863be9c93 + requires_python: '>=3.10,<3.14' +- pypi: https://files.pythonhosted.org/packages/6c/c2/63fdda36c56437eeb44aaf9493c8bcd62ce230ab1598924fc626ffbfa943/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: scikit-learn + version: 1.9.0 + sha256: 056c92bb67ad4c28463c2f2653d9701449201e7e7a9e94e321be0f71c4fef2b8 + requires_dist: + - numpy>=1.24.1 + - scipy>=1.10.0 + - joblib>=1.4.0 + - narwhals>=2.0.1 + - threadpoolctl>=3.5.0 + - numpy>=1.24.1 ; extra == 'build' + - scipy>=1.10.0 ; extra == 'build' + - cython>=3.1.2 ; extra == 'build' + - meson-python>=0.17.1 ; extra == 'build' + - numpy>=1.24.1 ; extra == 'install' + - scipy>=1.10.0 ; extra == 'install' + - joblib>=1.4.0 ; extra == 'install' + - narwhals>=2.0.1 ; extra == 'install' + - threadpoolctl>=3.5.0 ; extra == 'install' + - matplotlib>=3.6.1 ; extra == 'benchmark' + - pandas>=1.5.0 ; extra == 'benchmark' + - memory-profiler>=0.57.0 ; extra == 'benchmark' + - matplotlib>=3.6.1 ; extra == 'docs' + - scikit-image>=0.22.0 ; extra == 'docs' + - pandas>=1.5.0 ; extra == 'docs' + - rich>=14.1.0 ; extra == 'docs' + - seaborn>=0.13.0 ; extra == 'docs' + - memory-profiler>=0.57.0 ; extra == 'docs' + - sphinx>=7.3.7 ; extra == 'docs' + - sphinx-copybutton>=0.5.2 ; extra == 'docs' + - sphinx-gallery>=0.17.1 ; extra == 'docs' + - numpydoc>=1.2.0 ; extra == 'docs' + - pillow>=12.1.1 ; extra == 'docs' + - pooch>=1.8.0 ; extra == 'docs' + - sphinx-prompt>=1.4.0 ; extra == 'docs' + - sphinxext-opengraph>=0.9.1 ; extra == 'docs' + - plotly>=5.22.0 ; extra == 'docs' + - polars>=0.20.30 ; extra == 'docs' + - sphinx-design>=0.6.0 ; extra == 'docs' + - sphinxcontrib-sass>=0.3.4 ; extra == 'docs' + - pydata-sphinx-theme>=0.15.3 ; extra == 'docs' + - sphinx-remove-toctrees>=1.0.0.post1 ; extra == 'docs' + - towncrier>=24.8.0 ; extra == 'docs' + - matplotlib>=3.6.1 ; extra == 'examples' + - scikit-image>=0.22.0 ; extra == 'examples' + - pandas>=1.5.0 ; extra == 'examples' + - rich>=14.1.0 ; extra == 'examples' + - seaborn>=0.13.0 ; extra == 'examples' + - pooch>=1.8.0 ; extra == 'examples' + - plotly>=5.22.0 ; extra == 'examples' + - matplotlib>=3.6.1 ; extra == 'tests' + - pandas>=1.5.0 ; extra == 'tests' + - rich>=14.1.0 ; extra == 'tests' + - pytest>=7.1.2 ; extra == 'tests' + - pytest-cov>=2.9.0 ; extra == 'tests' + - ruff>=0.12.2 ; extra == 'tests' + - mypy>=1.15 ; extra == 'tests' + - pyamg>=5.0.0 ; extra == 'tests' + - polars>=0.20.30 ; extra == 'tests' + - pyarrow>=13.0.0 ; extra == 'tests' + - numpydoc>=1.2.0 ; extra == 'tests' + - pooch>=1.8.0 ; extra == 'tests' + - conda-lock==3.0.1 ; extra == 'maintenance' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/72/65/a4559d4ff4a210d2a26d7ca0712e4e738cbfc963135f86e8ae807ca420eb/pysam-0.24.0-cp314-cp314-macosx_11_0_arm64.whl + name: pysam + version: 0.24.0 + sha256: f6f95d44efb4ee1dcfd18fcd11b26ba00bc1afaba9128a1b56c4c8887208fb07 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/74/f5/9373290775639cb67a2fce7f629a1c240dce9f12fe927bc32b2736e16dfc/argcomplete-3.6.3-py3-none-any.whl + name: argcomplete + version: 3.6.3 + sha256: f5007b3a600ccac5d25bbce33089211dfd49eab4a7718da3f10e3082525a92ce + requires_dist: + - coverage ; extra == 'test' + - mypy ; extra == 'test' + - pexpect ; extra == 'test' + - ruff ; extra == 'test' + - wheel ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: fonttools + version: 4.63.0 + sha256: 58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8 + requires_dist: + - lxml>=4.0 ; extra == 'lxml' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'woff' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'woff' + - zopfli>=0.1.4 ; extra == 'woff' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'unicode' + - lz4>=1.7.4.2 ; extra == 'graphite' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'interpolatable' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'interpolatable' + - pycairo ; extra == 'interpolatable' + - matplotlib ; extra == 'plot' + - sympy ; extra == 'symfont' + - xattr ; sys_platform == 'darwin' and extra == 'type1' + - skia-pathops>=0.5.0 ; extra == 'pathops' + - uharfbuzz>=0.45.0 ; extra == 'repacker' + - lxml>=4.0 ; extra == 'all' + - brotli>=1.0.1 ; platform_python_implementation == 'CPython' and extra == 'all' + - brotlicffi>=0.8.0 ; platform_python_implementation != 'CPython' and extra == 'all' + - zopfli>=0.1.4 ; extra == 'all' + - unicodedata2>=17.0.0 ; python_full_version < '3.15' and extra == 'all' + - lz4>=1.7.4.2 ; extra == 'all' + - scipy ; platform_python_implementation != 'PyPy' and extra == 'all' + - munkres ; platform_python_implementation == 'PyPy' and extra == 'all' + - pycairo ; extra == 'all' + - matplotlib ; extra == 'all' + - sympy ; extra == 'all' + - xattr ; sys_platform == 'darwin' and extra == 'all' + - skia-pathops>=0.5.0 ; extra == 'all' + - uharfbuzz>=0.45.0 ; extra == 'all' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/78/17/853354204e1ca022d6b7d011ca7f3206c4f8faa3cc743e92609b49c1d83f/tinydb-4.8.2-py3-none-any.whl + name: tinydb + version: 4.8.2 + sha256: f97030ee5cbc91eeadd1d7af07ab0e48ceb04aa63d4a983adbaca4cba16e86c3 + requires_python: '>=3.8,<4.0' +- pypi: https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: cffi + version: 2.0.0 + sha256: 3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba + requires_dist: + - pycparser ; implementation_name != 'PyPy' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl + name: annotated-types + version: 0.7.0 + sha256: 1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 + requires_dist: + - typing-extensions>=4.0.0 ; python_full_version < '3.9' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl + name: mypy-extensions + version: 1.1.0 + sha256: 1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/7a/da/323a01c349bd5fb01bb6652e314d9bb218cee630a736bdb810ad50e4013f/yarl-1.24.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: yarl + version: 1.24.2 + sha256: 7e7ebcdef69dec6c6451e616f32b622a6d4a2e92b445c992f7c8e5274a6bbc4c + requires_dist: + - idna>=2.0 + - multidict>=4.0 + - propcache>=0.2.1 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/7a/f6/51d8a97116de23c9280c1fa3b813bc088f8571ce5936ba84af1ecf13ed45/pybigwig-0.3.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + name: pybigwig + version: 0.3.25 + sha256: 852c41f00afc610322eb3c5aba74068d05b340d09db4573db2deca330ad48f30 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl + name: joblib + version: 1.5.3 + sha256: 5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/7c/03/b8cdb625a21f710dfa11bbca1f48fb4057d2c0286975f8b415bf80942c99/matplotlib-3.11.0-cp314-cp314-macosx_11_0_arm64.whl + name: matplotlib + version: 3.11.0 + sha256: 25c2e5455efd8d99f41fb79871a31feb7d301569642e332ec58d72cfe9282bc3 + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.25 + - packaging>=20.0 + - pillow>=9 + - pyparsing>=3 + - python-dateutil>=2.7 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/7e/32/a7125fb28c4261a627f999d5fb4afff25b523800faed2c30979949d6facd/pydot-4.0.1-py3-none-any.whl + name: pydot + version: 4.0.1 + sha256: 869c0efadd2708c0be1f916eb669f3d664ca684bc57ffb7ecc08e70d5e93fee6 + requires_dist: + - pyparsing>=3.1.0 + - ruff ; extra == 'lint' + - mypy ; extra == 'types' + - pydot[lint] ; extra == 'dev' + - pydot[types] ; extra == 'dev' + - chardet ; extra == 'dev' + - parameterized ; extra == 'dev' + - pydot[dev] ; extra == 'tests' + - tox ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-xdist[psutil] ; extra == 'tests' + - zest-releaser[recommended] ; extra == 'release' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl + name: urllib3 + version: 2.7.0 + sha256: 9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897 + requires_dist: + - brotli>=1.2.0 ; platform_python_implementation == 'CPython' and extra == 'brotli' + - brotlicffi>=1.2.0.0 ; platform_python_implementation != 'CPython' and extra == 'brotli' + - h2>=4,<5 ; extra == 'h2' + - pysocks>=1.5.6,!=1.5.7,<2.0 ; extra == 'socks' + - backports-zstd>=1.0.0 ; python_full_version < '3.14' and extra == 'zstd' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl + name: jaraco-classes + version: 3.4.0 + sha256: f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790 + requires_dist: + - more-itertools + - sphinx>=3.5 ; extra == 'docs' + - jaraco-packaging>=9.3 ; extra == 'docs' + - rst-linker>=1.9 ; extra == 'docs' + - furo ; extra == 'docs' + - sphinx-lint ; extra == 'docs' + - jaraco-tidelift>=1.4 ; extra == 'docs' + - pytest>=6 ; extra == 'testing' + - pytest-checkdocs>=2.4 ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - pytest-mypy ; extra == 'testing' + - pytest-enabler>=2.2 ; extra == 'testing' + - pytest-ruff>=0.2.1 ; extra == 'testing' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl + name: psutil + version: 7.2.2 + sha256: 1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979 + requires_dist: + - psleak ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-instafail ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - setuptools ; extra == 'dev' + - abi3audit ; extra == 'dev' + - black ; extra == 'dev' + - check-manifest ; extra == 'dev' + - coverage ; extra == 'dev' + - packaging ; extra == 'dev' + - pylint ; extra == 'dev' + - pyperf ; extra == 'dev' + - pypinfo ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - requests ; extra == 'dev' + - rstcheck ; extra == 'dev' + - ruff ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx-rtd-theme ; extra == 'dev' + - toml-sort ; extra == 'dev' + - twine ; extra == 'dev' + - validate-pyproject[all] ; extra == 'dev' + - virtualenv ; extra == 'dev' + - vulture ; extra == 'dev' + - wheel ; extra == 'dev' + - colorama ; os_name == 'nt' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - psleak ; extra == 'test' + - pytest ; extra == 'test' + - pytest-instafail ; extra == 'test' + - pytest-xdist ; extra == 'test' + - setuptools ; extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/81/59/208f71d70ddc6184f79b8c6d87d46eb7d7b12c19186a817dec9c9c3f3693/tifffile-2026.6.1-py3-none-any.whl + name: tifffile + version: 2026.6.1 + sha256: 0d7382d2769b855b81ce358528e2b40c16d48aa39031746efa81215205332a8d + requires_dist: + - numpy>=2.1 + - imagecodecs>=2026.5.10 ; extra == 'codecs' + - lxml ; extra == 'xml' + - zarr>=3.2.0 ; extra == 'zarr' + - fsspec ; extra == 'zarr' + - kerchunk ; extra == 'zarr' + - matplotlib ; extra == 'plot' + - imagecodecs>=2026.5.10 ; extra == 'all' + - matplotlib ; extra == 'all' + - lxml ; extra == 'all' + - zarr>=3.2.0 ; extra == 'all' + - xarray ; extra == 'all' + - fsspec ; extra == 'all' + - kerchunk ; extra == 'all' + - cmapfile ; extra == 'test' + - czifile ; extra == 'test' + - dask ; extra == 'test' + - fsspec ; extra == 'test' + - imagecodecs ; extra == 'test' + - kerchunk ; extra == 'test' + - lfdfiles ; extra == 'test' + - lxml ; extra == 'test' + - ndtiff ; extra == 'test' + - oiffile ; extra == 'test' + - psdtags ; extra == 'test' + - pytest ; extra == 'test' + - requests ; extra == 'test' + - roifile ; extra == 'test' + - xarray ; extra == 'test' + - zarr>=3.2.0 ; extra == 'test' + requires_python: '>=3.12' +- pypi: https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl + name: keyring + version: 25.7.0 + sha256: be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f + requires_dist: + - pywin32-ctypes>=0.2.0 ; sys_platform == 'win32' + - secretstorage>=3.2 ; sys_platform == 'linux' + - jeepney>=0.4.2 ; sys_platform == 'linux' + - importlib-metadata>=4.11.4 ; python_full_version < '3.12' + - jaraco-classes + - jaraco-functools + - jaraco-context + - pytest>=6,!=8.1.* ; extra == 'test' + - pyfakefs ; extra == 'test' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pytest-checkdocs>=2.4 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - pytest-cov ; extra == 'cover' + - pytest-enabler>=3.4 ; extra == 'enabler' + - pytest-mypy>=1.0.1 ; extra == 'type' + - pygobject-stubs ; extra == 'type' + - shtab ; extra == 'type' + - types-pywin32 ; extra == 'type' + - shtab>=1.1.0 ; extra == 'completion' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl + name: platformdirs + version: 4.10.0 + sha256: fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/81/f3/d7b4c8c9b6657ff0db27b739894ed0665fa8f3c78a7452bf74d6447f6865/zipstream_new-1.1.8-py3-none-any.whl + name: zipstream-new + version: 1.1.8 + sha256: 0662eb3ebe764fa168a5883cd8819ef83b94bd9e39955537188459d2264a7f60 +- pypi: https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl + name: rich + version: 15.0.0 + sha256: 33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb + requires_dist: + - ipywidgets>=7.5.1,<9 ; extra == 'jupyter' + - markdown-it-py>=2.2.0 + - pygments>=2.13.0,<3.0.0 + requires_python: '>=3.9.0' +- pypi: https://files.pythonhosted.org/packages/84/0c/b3288ee003c344356cd505ba8d85286e8f0d4d4177a13d8eed7db6e7c688/planemo-0.75.44-py3-none-any.whl + name: planemo + version: 0.75.44 + sha256: 9c167c35f84fd15227ef5af81c80c761768b6a2feecf99724e8eb12b8a146906 + requires_dist: + - allure-python-commons + - bioblend>=1.6.0 + - click!=8.0.2 + - cryptography>=46.0.3 + - cwltool>=1.0.20191225192155 + - ephemeris>=0.10.3 + - galaxy-job-config-init>=0.1.4 + - galaxy-tool-util[edam,extended-assertions]>=25.1,<26.1 + - galaxy-util[template]>=24.1,<26.1 + - glob2 + - gxformat2>=0.25.0 + - h5py + - jinja2 + - lxml + - oyaml + - packaging + - pathvalidate + - pydantic>=2 + - pyyaml + - ruamel-yaml + - virtualenv + - stdlib-list ; python_full_version < '3.10' + - tabulate + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: pyyaml + version: 6.0.3 + sha256: ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/8e/b4/23f8462c72e514563f5fd949e38a9e45bcc86fb59bf4b88240ba0ef02026/cwl_utils-0.42-py3-none-any.whl + name: cwl-utils + version: '0.42' + sha256: 3ded53f626268d1113895f59e91a6ce2d8a1568823b4db506b4814ae2e4904c4 + requires_dist: + - cwl-upgrader>=1.2.3 + - packaging + - rdflib + - requests + - ruamel-yaml>=0.17.6,<0.20 + - schema-salad>=8.8.20250205075315,<9 + - typing-extensions>=4.10.0 + - cwlformat ; extra == 'pretty' + - cwlformat ; extra == 'testing' + - cwltool ; extra == 'testing' + - jsonschema>=4.21.1 ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - pytest-mock>=1.10.0 ; extra == 'testing' + - pytest-xdist[psutil] ; extra == 'testing' + - pytest<10 ; extra == 'testing' + - udocker ; extra == 'testing' + requires_python: '>=3.10,<3.15' +- pypi: https://files.pythonhosted.org/packages/8e/fb/2c4c618185be2bda327f9dacd16b3122cc938809f19df7be840595d0e584/prov-1.5.1-py2.py3-none-any.whl + name: prov + version: 1.5.1 + sha256: 5c930cbbd05424aa3066d336dc31d314dd9fa0280caeab064288e592ed716bea + requires_dist: + - lxml + - networkx + - python-dateutil + - rdflib>=4.2.1 + - six>=1.9.0 + - pydot>=1.2.0 ; extra == 'dot' +- pypi: https://files.pythonhosted.org/packages/92/7a/8017d45e513c720ee82bf062b1be3ae39087db3024571b4a00773e17c235/galaxy_job_config_init-0.1.4-py3-none-any.whl + name: galaxy-job-config-init + version: 0.1.4 + sha256: d9db27a0dee86da4adc22a35ec9a97b631a921d9a4eb9fba199cbfdc6cbaf35f + requires_dist: + - typing-extensions + - jinja2 + - pyyaml + - backports-strenum ; python_full_version < '3.11' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/94/95/7f522393c88313336b20d70fc849555757b2e5febc22b83b3a3f0fd4bce9/matplotlib-3.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: matplotlib + version: 3.11.0 + sha256: be5f93a1d21981bfb802ded0d77a0caa92d4342a47d45754fac77e314a506344 + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.25 + - packaging>=20.0 + - pillow>=9 + - pyparsing>=3 + - python-dateutil>=2.7 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/96/9a/982e48afcffcd727a9144506720ffd4224b6b7e355c98641866f38b7c043/jaraco_functools-4.5.0-py3-none-any.whl + name: jaraco-functools + version: 4.5.0 + sha256: 79ce39246eddbde4b3a03b77ea5f0f7878dc669b166a66cf3fa8e266aa3fa2f4 + requires_dist: + - more-itertools + - pytest>=6,!=8.1.* ; extra == 'test' + - jaraco-classes ; extra == 'test' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pytest-checkdocs>=2.14 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - pytest-cov ; extra == 'cover' + - pytest-enabler>=3.4 ; extra == 'enabler' + - pytest-mypy>=1.0.1 ; platform_python_implementation != 'PyPy' and extra == 'type' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/96/c2/2a1605af41829cd2a247271b5b6f6b2dbc2e9407df2dd9bcafdceafcd4b3/ct3-3.4.0.post5.tar.gz + name: ct3 + version: 3.4.0.post5 + sha256: 1c5f2000d52d591703c74f6f5f7ef427ed1b6501be28e3f1634f62c3a5d792e1 + requires_dist: + - markdown ; extra == 'filters' + - markdown ; extra == 'markdown' + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' +- pypi: https://files.pythonhosted.org/packages/97/1b/295bf2fa3e740131778065e5ffa2c481f0e7210182d408e9a2c244ff5b0c/readme_renderer-45.0-py3-none-any.whl + name: readme-renderer + version: '45.0' + sha256: 3385ed220117104a2bceb4a9dac8c5fdf6d1f96890d7ea2a9c7174fd5c84091f + requires_dist: + - nh3>=0.2.14 + - docutils>=0.21.2 + - pygments>=2.5.1 + - comrak>=0.0.11 ; extra == 'md' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl + name: charset-normalizer + version: 3.4.7 + sha256: c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl + name: tabulate + version: 0.10.0 + sha256: f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3 + requires_dist: + - wcwidth ; extra == 'widechars' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl + name: pathvalidate + version: 3.3.1 + sha256: 5263baab691f8e1af96092fa5137ee17df5bdfbd6cff1fcac4d6ef4bc2e1735f + requires_dist: + - sphinx-rtd-theme>=1.2.2 ; extra == 'docs' + - sphinx>=2.4 ; extra == 'docs' + - urllib3<2 ; extra == 'docs' + - readmemaker>=1.2.0 ; extra == 'readme' + - path>=13,<18 ; extra == 'readme' + - allpairspy>=2 ; extra == 'test' + - click>=6.2 ; extra == 'test' + - faker>=1.0.8 ; extra == 'test' + - pytest>=6.0.1 ; extra == 'test' + - pytest-md-report>=0.6.2 ; extra == 'test' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/9b/22/adf66990e63584a68dfb50c24f48a125c07b1699899381c8151e63ed458c/cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl + name: cryptography + version: 49.0.0 + sha256: 966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db + requires_dist: + - cffi>=2.0.0 ; platform_python_implementation != 'PyPy' + - typing-extensions>=4.13.2 ; python_full_version < '3.11' + - bcrypt>=3.1.5 ; extra == 'ssh' + requires_python: '>=3.9,!=3.9.0,!=3.9.1' +- pypi: https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl + name: setuptools + version: 82.0.1 + sha256: a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb + requires_dist: + - pytest>=6,!=8.1.* ; extra == 'test' + - virtualenv>=13.0.0 ; extra == 'test' + - wheel>=0.44.0 ; extra == 'test' + - pip>=19.1 ; extra == 'test' + - packaging>=24.2 ; extra == 'test' + - jaraco-envs>=2.2 ; extra == 'test' + - pytest-xdist>=3 ; extra == 'test' + - jaraco-path>=3.7.2 ; extra == 'test' + - build[virtualenv]>=1.0.3 ; extra == 'test' + - filelock>=3.4.0 ; extra == 'test' + - ini2toml[lite]>=0.14 ; extra == 'test' + - tomli-w>=1.0.0 ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-perf ; sys_platform != 'cygwin' and extra == 'test' + - jaraco-develop>=7.21 ; python_full_version >= '3.9' and sys_platform != 'cygwin' and extra == 'test' + - pytest-home>=0.5 ; extra == 'test' + - pytest-subprocess ; extra == 'test' + - pyproject-hooks!=1.1 ; extra == 'test' + - jaraco-test>=5.5 ; extra == 'test' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pygments-github-lexers==0.0.5 ; extra == 'doc' + - sphinx-favicon ; extra == 'doc' + - sphinx-inline-tabs ; extra == 'doc' + - sphinx-reredirects ; extra == 'doc' + - sphinxcontrib-towncrier ; extra == 'doc' + - sphinx-notfound-page>=1,<2 ; extra == 'doc' + - pyproject-hooks!=1.1 ; extra == 'doc' + - towncrier<24.7 ; extra == 'doc' + - packaging>=24.2 ; extra == 'core' + - more-itertools>=8.8 ; extra == 'core' + - jaraco-text>=3.7 ; extra == 'core' + - importlib-metadata>=6 ; python_full_version < '3.10' and extra == 'core' + - tomli>=2.0.1 ; python_full_version < '3.11' and extra == 'core' + - wheel>=0.43.0 ; extra == 'core' + - jaraco-functools>=4 ; extra == 'core' + - more-itertools ; extra == 'core' + - pytest-checkdocs>=2.4 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - ruff>=0.13.0 ; sys_platform != 'cygwin' and extra == 'check' + - pytest-cov ; extra == 'cover' + - pytest-enabler>=2.2 ; extra == 'enabler' + - pytest-mypy ; extra == 'type' + - mypy==1.18.* ; extra == 'type' + - importlib-metadata>=7.0.2 ; python_full_version < '3.10' and extra == 'type' + - jaraco-develop>=7.21 ; sys_platform != 'cygwin' and extra == 'type' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl + name: networkx + version: 3.6.1 + sha256: d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762 + requires_dist: + - asv ; extra == 'benchmarking' + - virtualenv ; extra == 'benchmarking' + - numpy>=1.25 ; extra == 'default' + - scipy>=1.11.2 ; extra == 'default' + - matplotlib>=3.8 ; extra == 'default' + - pandas>=2.0 ; extra == 'default' + - pre-commit>=4.1 ; extra == 'developer' + - mypy>=1.15 ; extra == 'developer' + - sphinx>=8.0 ; extra == 'doc' + - pydata-sphinx-theme>=0.16 ; extra == 'doc' + - sphinx-gallery>=0.18 ; extra == 'doc' + - numpydoc>=1.8.0 ; extra == 'doc' + - pillow>=10 ; extra == 'doc' + - texext>=0.6.7 ; extra == 'doc' + - myst-nb>=1.1 ; extra == 'doc' + - intersphinx-registry ; extra == 'doc' + - osmnx>=2.0.0 ; extra == 'example' + - momepy>=0.7.2 ; extra == 'example' + - contextily>=1.6 ; extra == 'example' + - seaborn>=0.13 ; extra == 'example' + - cairocffi>=1.7 ; extra == 'example' + - igraph>=0.11 ; extra == 'example' + - scikit-learn>=1.5 ; extra == 'example' + - iplotx>=0.9.0 ; extra == 'example' + - lxml>=4.6 ; extra == 'extra' + - pygraphviz>=1.14 ; extra == 'extra' + - pydot>=3.0.1 ; extra == 'extra' + - sympy>=1.10 ; extra == 'extra' + - build>=0.10 ; extra == 'release' + - twine>=4.0 ; extra == 'release' + - wheel>=0.40 ; extra == 'release' + - changelist==0.5 ; extra == 'release' + - pytest>=7.2 ; extra == 'test' + - pytest-cov>=4.0 ; extra == 'test' + - pytest-xdist>=3.0 ; extra == 'test' + - pytest-mpl ; extra == 'test-extras' + - pytest-randomly ; extra == 'test-extras' + requires_python: '>=3.11,!=3.14.1' +- pypi: https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl + name: h5py + version: 3.16.0 + sha256: dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e + requires_dist: + - numpy>=1.21.2 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/9f/27/3c3e5398fa49227b2dd67211b4402c84ed9d5b48a4257bf5b1196f9b6a8e/ct3-3.4.0.post5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.whl + name: ct3 + version: 3.4.0.post5 + sha256: 3be2cd9d24b6c6741e90c3f854b20dd019b0c47f7887962972a515b92c35204e + requires_dist: + - markdown ; extra == 'filters' + - markdown ; extra == 'markdown' + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' +- pypi: https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl + name: flake8 + version: 7.3.0 + sha256: b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e + requires_dist: + - mccabe>=0.7.0,<0.8.0 + - pycodestyle>=2.14.0,<2.15.0 + - pyflakes>=3.4.0,<3.5.0 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl + name: requests + version: 2.34.2 + sha256: 2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0 + requires_dist: + - charset-normalizer>=2,<4 + - idna>=2.5,<4 + - urllib3>=1.26,<3 + - certifi>=2023.5.7 + - pysocks>=1.5.6,!=1.5.7 ; extra == 'socks' + - chardet>=3.0.2,<8 ; extra == 'use-chardet-on-py3' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl + name: frozenlist + version: 1.8.0 + sha256: 4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl + name: coloredlogs + version: 15.0.1 + sha256: 612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934 + requires_dist: + - humanfriendly>=9.1 + - capturer>=2.4 ; extra == 'cron' + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*' +- pypi: https://files.pythonhosted.org/packages/ac/1f/d10d6ad23c86c62d90d867d0506881a392ec6ef06885b858eaab868dd356/deeptoolsintervals-0.1.9.tar.gz + name: deeptoolsintervals + version: 0.1.9 + sha256: 7d94c36fd2b6f10d8b99e536d2672e8228971f1fc810497d33527bba2c40d4f6 +- pypi: https://files.pythonhosted.org/packages/ac/20/75f915ff375d6249e6550ac740fdbbd66159a068fd3af1400ff62036b07a/scikit_learn-1.9.0-cp312-cp312-macosx_10_13_x86_64.whl + name: scikit-learn + version: 1.9.0 + sha256: 2bd41b0d201bc81575531b96b713d3eb5e5f50fb0b82101ff0f92294fdc236ac + requires_dist: + - numpy>=1.24.1 + - scipy>=1.10.0 + - joblib>=1.4.0 + - narwhals>=2.0.1 + - threadpoolctl>=3.5.0 + - numpy>=1.24.1 ; extra == 'build' + - scipy>=1.10.0 ; extra == 'build' + - cython>=3.1.2 ; extra == 'build' + - meson-python>=0.17.1 ; extra == 'build' + - numpy>=1.24.1 ; extra == 'install' + - scipy>=1.10.0 ; extra == 'install' + - joblib>=1.4.0 ; extra == 'install' + - narwhals>=2.0.1 ; extra == 'install' + - threadpoolctl>=3.5.0 ; extra == 'install' + - matplotlib>=3.6.1 ; extra == 'benchmark' + - pandas>=1.5.0 ; extra == 'benchmark' + - memory-profiler>=0.57.0 ; extra == 'benchmark' + - matplotlib>=3.6.1 ; extra == 'docs' + - scikit-image>=0.22.0 ; extra == 'docs' + - pandas>=1.5.0 ; extra == 'docs' + - rich>=14.1.0 ; extra == 'docs' + - seaborn>=0.13.0 ; extra == 'docs' + - memory-profiler>=0.57.0 ; extra == 'docs' + - sphinx>=7.3.7 ; extra == 'docs' + - sphinx-copybutton>=0.5.2 ; extra == 'docs' + - sphinx-gallery>=0.17.1 ; extra == 'docs' + - numpydoc>=1.2.0 ; extra == 'docs' + - pillow>=12.1.1 ; extra == 'docs' + - pooch>=1.8.0 ; extra == 'docs' + - sphinx-prompt>=1.4.0 ; extra == 'docs' + - sphinxext-opengraph>=0.9.1 ; extra == 'docs' + - plotly>=5.22.0 ; extra == 'docs' + - polars>=0.20.30 ; extra == 'docs' + - sphinx-design>=0.6.0 ; extra == 'docs' + - sphinxcontrib-sass>=0.3.4 ; extra == 'docs' + - pydata-sphinx-theme>=0.15.3 ; extra == 'docs' + - sphinx-remove-toctrees>=1.0.0.post1 ; extra == 'docs' + - towncrier>=24.8.0 ; extra == 'docs' + - matplotlib>=3.6.1 ; extra == 'examples' + - scikit-image>=0.22.0 ; extra == 'examples' + - pandas>=1.5.0 ; extra == 'examples' + - rich>=14.1.0 ; extra == 'examples' + - seaborn>=0.13.0 ; extra == 'examples' + - pooch>=1.8.0 ; extra == 'examples' + - plotly>=5.22.0 ; extra == 'examples' + - matplotlib>=3.6.1 ; extra == 'tests' + - pandas>=1.5.0 ; extra == 'tests' + - rich>=14.1.0 ; extra == 'tests' + - pytest>=7.1.2 ; extra == 'tests' + - pytest-cov>=2.9.0 ; extra == 'tests' + - ruff>=0.12.2 ; extra == 'tests' + - mypy>=1.15 ; extra == 'tests' + - pyamg>=5.0.0 ; extra == 'tests' + - polars>=0.20.30 ; extra == 'tests' + - pyarrow>=13.0.0 ; extra == 'tests' + - numpydoc>=1.2.0 ; extra == 'tests' + - pooch>=1.8.0 ; extra == 'tests' + - conda-lock==3.0.1 ; extra == 'maintenance' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/ac/3e/61d11b779e4e83ee8661439af070f6f138060cd41f0346a0a70432f9e55c/cwl_upgrader-1.2.15-py3-none-any.whl + name: cwl-upgrader + version: 1.2.15 + sha256: 42ae4546a433a7439f56282942e3a9369d08d9a2ad31d86cddb1bb298e28640d + requires_dist: + - ruamel-yaml>=0.16.0,<0.20 + - schema-salad + - pytest<10 ; extra == 'testing' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl + name: pydantic-core + version: 2.46.4 + sha256: 23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462 + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl + name: jeepney + version: 0.9.0 + sha256: 97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683 + requires_dist: + - pytest ; extra == 'test' + - pytest-trio ; extra == 'test' + - pytest-asyncio>=0.17 ; extra == 'test' + - testpath ; extra == 'test' + - trio ; extra == 'test' + - async-timeout ; python_full_version < '3.11' and extra == 'test' + - trio ; extra == 'trio' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl + name: mdurl + version: 0.1.2 + sha256: 84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl + name: markdown-it-py + version: 4.2.0 + sha256: 9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a + requires_dist: + - mdurl~=0.1 + - psutil ; extra == 'benchmarking' + - pytest ; extra == 'benchmarking' + - pytest-benchmark ; extra == 'benchmarking' + - commonmark~=0.9 ; extra == 'compare' + - markdown~=3.4 ; extra == 'compare' + - mistletoe~=1.0 ; extra == 'compare' + - mistune~=3.0 ; extra == 'compare' + - panflute~=2.3 ; extra == 'compare' + - markdown-it-pyrs ; extra == 'compare' + - linkify-it-py>=1,<3 ; extra == 'linkify' + - mdit-py-plugins>=0.5.0 ; extra == 'plugins' + - gprof2dot ; extra == 'profiling' + - mdit-py-plugins>=0.5.0 ; extra == 'rtd' + - myst-parser ; extra == 'rtd' + - pyyaml ; extra == 'rtd' + - sphinx ; extra == 'rtd' + - sphinx-copybutton ; extra == 'rtd' + - sphinx-design ; extra == 'rtd' + - sphinx-book-theme~=1.0 ; extra == 'rtd' + - jupyter-sphinx ; extra == 'rtd' + - ipykernel ; extra == 'rtd' + - coverage ; extra == 'testing' + - pytest ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - pytest-regressions ; extra == 'testing' + - pytest-timeout ; extra == 'testing' + - requests ; extra == 'testing' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/b4/97/0535f7d3f45d3853f79a11988d8faf798de684d902579126449455506e2f/ephemeris-0.10.11-py2.py3-none-any.whl + name: ephemeris + version: 0.10.11 + sha256: a6ec62371ccc519ebab9aefa1d49bd1d396218a3ebced1760ae5ace77dd93f2f + requires_dist: + - six>=1.9.0 + - pyyaml + - bioblend>=0.10.0 + - jinja2 + - galaxy-tool-util>=20.9.1 + - galaxy-util>=20.9.0 + - pysam + - rich + - setuptools + - pydantic>=2.0 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/b4/c9/7d293a9ea42ef05d6260714f8cf641ba64fab438be55312b1c719d4e7cc6/fissix-24.4.24-py3-none-any.whl + name: fissix + version: 24.4.24 + sha256: be7f5c66e9e212bd9b3365c9e8f2453e973d0a645f31c8eba842724adb4c0c50 + requires_dist: + - appdirs>=1.4.4 + - attribution==1.7.1 ; extra == 'dev' + - black==24.4.0 ; extra == 'dev' + - flit==3.9.0 ; extra == 'dev' + - isort==5.8.0 ; extra == 'dev' + - pytest==8.1.1 ; extra == 'dev' + - sphinx==7.3.7 ; extra == 'docs' + - sphinx-mdinclude==0.6.0 ; extra == 'docs' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl + name: markupsafe + version: 3.0.3 + sha256: c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl + name: psutil + version: 7.2.2 + sha256: 076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9 + requires_dist: + - psleak ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-instafail ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - setuptools ; extra == 'dev' + - abi3audit ; extra == 'dev' + - black ; extra == 'dev' + - check-manifest ; extra == 'dev' + - coverage ; extra == 'dev' + - packaging ; extra == 'dev' + - pylint ; extra == 'dev' + - pyperf ; extra == 'dev' + - pypinfo ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - requests ; extra == 'dev' + - rstcheck ; extra == 'dev' + - ruff ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx-rtd-theme ; extra == 'dev' + - toml-sort ; extra == 'dev' + - twine ; extra == 'dev' + - validate-pyproject[all] ; extra == 'dev' + - virtualenv ; extra == 'dev' + - vulture ; extra == 'dev' + - wheel ; extra == 'dev' + - colorama ; os_name == 'nt' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - psleak ; extra == 'test' + - pytest ; extra == 'test' + - pytest-instafail ; extra == 'test' + - pytest-xdist ; extra == 'test' + - setuptools ; extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl + name: secretstorage + version: 3.5.0 + sha256: 0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137 + requires_dist: + - cryptography>=2.0 + - jeepney>=0.6 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl + name: six + version: 1.17.0 + sha256: 4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- pypi: https://files.pythonhosted.org/packages/b8/0c/51f6841f1d84f404f92463fc2b1ba0da357ca1e3db6b7fbda26956c3b82a/ruamel_yaml-0.19.1-py3-none-any.whl + name: ruamel-yaml + version: 0.19.1 + sha256: 27592957fedf6e0b62f281e96effd28043345e0e66001f97683aa9a40c667c93 + requires_dist: + - ruamel-yaml-clib ; platform_python_implementation == 'CPython' and extra == 'oldlibyaml' + - ruamel-yaml-clibz>=0.3.7 ; platform_python_implementation == 'CPython' and extra == 'libyaml' + - ruamel-yaml-jinja2>=0.2 ; extra == 'jinja2' + - ryd ; extra == 'docs' + - mercurial>5.7 ; extra == 'docs' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl + name: pillow + version: 12.2.0 + sha256: 80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae + requires_dist: + - furo ; extra == 'docs' + - olefile ; extra == 'docs' + - sphinx>=8.2 ; extra == 'docs' + - sphinx-autobuild ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - sphinx-inline-tabs ; extra == 'docs' + - sphinxext-opengraph ; extra == 'docs' + - olefile ; extra == 'fpx' + - olefile ; extra == 'mic' + - arro3-compute ; extra == 'test-arrow' + - arro3-core ; extra == 'test-arrow' + - nanoarrow ; extra == 'test-arrow' + - pyarrow ; extra == 'test-arrow' + - check-manifest ; extra == 'tests' + - coverage>=7.4.2 ; extra == 'tests' + - defusedxml ; extra == 'tests' + - markdown2 ; extra == 'tests' + - olefile ; extra == 'tests' + - packaging ; extra == 'tests' + - pyroma>=5 ; extra == 'tests' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-timeout ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + - trove-classifiers>=2024.10.12 ; extra == 'tests' + - defusedxml ; extra == 'xmp' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ba/b1/5297bb6a7df4782f7605bffc43b31f5044070935fbbcaa6c705a07e6ac65/yarl-1.24.2-cp314-cp314-macosx_11_0_arm64.whl + name: yarl + version: 1.24.2 + sha256: 0c3063e5c0a8e8e62fae6c2596fa01da1561e4cd1da6fec5789f5cf99a8aefd8 + requires_dist: + - idna>=2.0 + - multidict>=4.0 + - propcache>=0.2.1 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/bb/6b/f4a3d0637692c49da8ef99d72d52526f92e0a8d6ac4f0ca9f31441b9d9ea/numpy-2.5.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: numpy + version: 2.5.0 + sha256: aaa760137137e8d3c920d27927748215b56014f92667dc9b6c27dfc61249255a + requires_python: '>=3.12' +- pypi: https://files.pythonhosted.org/packages/bc/dd/9e8cbd8f5582ca4b590336f2b91ee5662f6a6ca562b565abaf696a0f81ff/msgpack-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl + name: msgpack + version: 1.2.1 + sha256: 2ef59c659f289eddf8aa6623823f19fa2f40a4029266889eac7a2505dd210c35 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl + name: pyproject-hooks + version: 1.2.0 + sha256: 9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913 + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl + name: pyyaml + version: 6.0.3 + sha256: 34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl + name: contourpy + version: 1.3.3 + sha256: b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb + requires_dist: + - numpy>=1.25 + - furo ; extra == 'docs' + - sphinx>=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - bokeh ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy==1.17.0 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - pytest-rerunfailures ; extra == 'test-no-images' + - pytest-xdist ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/bf/1d/fcefb70922ea2268a8971d8e5874d9a8218644200fb8465f1dcad55e6851/yarl-1.24.2-cp312-cp312-macosx_10_13_x86_64.whl + name: yarl + version: 1.24.2 + sha256: 3b075301a2836a0e297b1b658cb6d6135df535d62efefdd60366bd589c2c82f2 + requires_dist: + - idna>=2.0 + - multidict>=4.0 + - propcache>=0.2.1 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl + name: kiwisolver + version: 1.5.0 + sha256: 72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl + name: pyflakes + version: 3.4.0 + sha256: f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/c2/82/280619e0bd7bf2454987e19282616e84762255dd9c8468f62382e8c191f1/aiohttp-3.14.1-cp312-cp312-macosx_10_13_x86_64.whl + name: aiohttp + version: 3.14.1 + sha256: bcfb80a2cc36fba2534e5e5b5264dc7ae6fcd9bf15256da3e53d2f499e6fa29d + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - typing-extensions>=4.4 ; python_full_version < '3.13' + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; sys_platform != 'android' and sys_platform != 'ios' and extra == 'speedups' + - brotli>=1.2 ; platform_python_implementation == 'CPython' and sys_platform != 'android' and sys_platform != 'ios' and extra == 'speedups' + - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and sys_platform != 'android' and sys_platform != 'ios' and extra == 'speedups' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl + name: kiwisolver + version: 1.5.0 + sha256: bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl + name: click + version: 8.4.1 + sha256: 482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2 + requires_dist: + - colorama ; sys_platform == 'win32' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/c8/c0/5d4119dba94093bbafede500d3defd2f5eab7897732998c04b54021e530b/h5py-3.16.0-cp312-cp312-macosx_10_13_x86_64.whl + name: h5py + version: 3.16.0 + sha256: c5313566f4643121a78503a473f0fb1e6dcc541d5115c44f05e037609c565c4d + requires_dist: + - numpy>=1.21.2 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl + name: iniconfig + version: 2.3.0 + sha256: f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/cc/2f/7229e91cfa37459622808002bec6eb019c7189bfc59788b3eaba5f273671/conda_package_streaming-0.13.0-py3-none-any.whl + name: conda-package-streaming + version: 0.13.0 + sha256: 806ea3f2f7ac272873242e6253d543ac8aaf224e5c76d794e5fee9c63776fb5c + requires_dist: + - requests + - backports-zstd ; python_full_version < '3.14' + - furo ; extra == 'docs' + - sphinx ; extra == 'docs' + - myst-parser ; extra == 'docs' + - mdit-py-plugins>=0.3.0 ; extra == 'docs' + - pytest>=7 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-mock ; extra == 'test' + - boto3 ; extra == 'test' + - boto3-stubs[essential] ; extra == 'test' + - bottle ; extra == 'test' + - conda ; extra == 'test' + - conda-package-handling>=2 ; extra == 'test' + - responses ; extra == 'test' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: contourpy + version: 1.3.3 + sha256: 4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1 + requires_dist: + - numpy>=1.25 + - furo ; extra == 'docs' + - sphinx>=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - bokeh ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy==1.17.0 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - pytest-rerunfailures ; extra == 'test-no-images' + - pytest-xdist ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl + name: pydantic-core + version: 2.46.4 + sha256: 3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2 + requires_dist: + - typing-extensions>=4.14.1 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/cf/f4/672930ad51bbc135f51cac89577155f1d0c2d120375fc77978d3aa071bb7/pybigwig-0.3.25.tar.gz + name: pybigwig + version: 0.3.25 + sha256: 8c717b0222e6677956fd659c8a21650983679ffb3314427d7f68d2910fad202a + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl + name: pyyaml + version: 6.0.3 + sha256: 7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/d4/74/3d6534c6ce0802bf085a32908b093e6a4123443050299bcc6e3828a9bf3e/cwltool-3.2.20260413085819-py3-none-any.whl + name: cwltool + version: 3.2.20260413085819 + sha256: 2ed9b586b2d9cda0870a3c2b9cba958943ef3fde53805f935cb20888dc8b87a3 + requires_dist: + - requests>=2.6.1 + - ruamel-yaml>=0.16,<0.20 + - rdflib>=4.2.2,<7.7.0 + - schema-salad>=8.9,<9 + - prov==1.5.1 + - mypy-extensions + - psutil>=5.6.6 + - coloredlogs + - pydot>=1.4.1 + - argcomplete>=1.12.0 + - pyparsing!=3.0.2 + - cwl-utils>=0.41 + - spython>=0.3.0 + - rich-argparse + - pygments>=2.20.0 + - typing-extensions>=4.1.0 + - galaxy-tool-util>=22.1.2,!=23.0.1,!=23.0.2,!=23.0.3,!=23.0.4,!=23.0.5,<26.1 ; extra == 'deps' + - galaxy-util<26.1 ; extra == 'deps' + - pillow ; extra == 'deps' + requires_python: '>=3.10,<3.15' +- pypi: https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl + name: pycodestyle + version: 2.14.0 + sha256: dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/d7/88/b72def7262e150d16be13fca37a96481138d624e700340bc3362a7588929/scipy-1.18.0-cp314-cp314-macosx_12_0_arm64.whl + name: scipy + version: 1.18.0 + sha256: 2ef3abc54a4ffc53765374b0d5728532dfdd2585ed23f6b11c206a1f0b1b9af8 + requires_dist: + - numpy>=2.0.0,<2.8 + - pytest>=8.0.0 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-xdist ; extra == 'test' + - asv ; extra == 'test' + - mpmath ; extra == 'test' + - gmpy2 ; extra == 'test' + - threadpoolctl ; extra == 'test' + - scikit-umfpack ; extra == 'test' + - pooch ; extra == 'test' + - hypothesis>=6.30 ; extra == 'test' + - array-api-strict>=2.3.1 ; extra == 'test' + - cython ; extra == 'test' + - meson ; extra == 'test' + - ninja ; sys_platform != 'emscripten' and extra == 'test' + - scipy-doctest>=2.0.0 ; extra == 'test' + - sphinx>=5.0.0,<8.2.0 ; extra == 'doc' + - intersphinx-registry ; extra == 'doc' + - pydata-sphinx-theme>=0.15.2 ; extra == 'doc' + - sphinx-copybutton ; extra == 'doc' + - sphinx-design>=0.4.0 ; extra == 'doc' + - matplotlib>=3.5 ; extra == 'doc' + - numpydoc ; extra == 'doc' + - jupytext ; extra == 'doc' + - myst-nb>=1.2.0 ; extra == 'doc' + - pooch ; extra == 'doc' + - jupyterlite-sphinx>=0.19.1 ; extra == 'doc' + - jupyterlite-pyodide-kernel ; extra == 'doc' + - linkify-it-py ; extra == 'doc' + - tabulate ; extra == 'doc' + - click<8.3.0 ; extra == 'dev' + - spin ; extra == 'dev' + - mypy==1.19.1 ; extra == 'dev' + - pyrefly==0.63.0 ; extra == 'dev' + - typing-extensions ; extra == 'dev' + - types-psutil ; extra == 'dev' + - pycodestyle ; extra == 'dev' + - ruff>=0.12.0 ; extra == 'dev' + - cython-lint>=0.12.2 ; extra == 'dev' + requires_python: '>=3.12' +- pypi: https://files.pythonhosted.org/packages/d7/a5/bbbc3b74a94fbdbd7915e7ad030f16539bfdc1362f7e9003b594f0537950/glob2-0.7.tar.gz + name: glob2 + version: '0.7' + sha256: 85c3dbd07c8aa26d63d7aacee34fa86e9a91a3873bc30bf62ec46e531f92ab8c +- pypi: https://files.pythonhosted.org/packages/d9/b0/1e05aa4e0124cbc6509641353f513fc29c2b5e5197dbd5dfade810a521cf/galaxy_tool_util_models-26.0.1-py3-none-any.whl + name: galaxy-tool-util-models + version: 26.0.1 + sha256: b14e5619cec2fc4375dc355ec2d812168935cd97e4249dcd8ffa5c8d592db843 + requires_dist: + - pydantic>=2.7.4 + - typing-extensions + - pytest ; extra == 'test' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/da/17/f5276b496c61477a6c4fc5e7401f4bfe1c2e5ef7c6cd67896f2ade3809cb/matplotlib-3.11.0-cp312-cp312-macosx_10_13_x86_64.whl + name: matplotlib + version: 3.11.0 + sha256: 06b5872e9cf11adc8f589ded3ce11bc3e1061ad498259664fabc1f6615beb918 + requires_dist: + - contourpy>=1.0.1 + - cycler>=0.10 + - fonttools>=4.22.0 + - kiwisolver>=1.3.1 + - numpy>=1.25 + - packaging>=20.0 + - pillow>=9 + - pyparsing>=3 + - python-dateutil>=2.7 + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl + name: future + version: 1.0.0 + sha256: 929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216 + requires_python: '>=2.6,!=3.0.*,!=3.1.*,!=3.2.*' +- pypi: https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl + name: typing-inspection + version: 0.4.2 + sha256: 4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7 + requires_dist: + - typing-extensions>=4.12.0 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/dd/aa/1b939f6c67ed68635bb538e6752d3dacc02f66535182e939a89581a44e9c/scipy-1.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl + name: scipy + version: 1.18.0 + sha256: 1f55797419e16e7f30cf88ffb3113ce0467f00cfe3f70d5c281730b21769bfc2 + requires_dist: + - numpy>=2.0.0,<2.8 + - pytest>=8.0.0 ; extra == 'test' + - pytest-cov ; extra == 'test' + - pytest-timeout ; extra == 'test' + - pytest-xdist ; extra == 'test' + - asv ; extra == 'test' + - mpmath ; extra == 'test' + - gmpy2 ; extra == 'test' + - threadpoolctl ; extra == 'test' + - scikit-umfpack ; extra == 'test' + - pooch ; extra == 'test' + - hypothesis>=6.30 ; extra == 'test' + - array-api-strict>=2.3.1 ; extra == 'test' + - cython ; extra == 'test' + - meson ; extra == 'test' + - ninja ; sys_platform != 'emscripten' and extra == 'test' + - scipy-doctest>=2.0.0 ; extra == 'test' + - sphinx>=5.0.0,<8.2.0 ; extra == 'doc' + - intersphinx-registry ; extra == 'doc' + - pydata-sphinx-theme>=0.15.2 ; extra == 'doc' + - sphinx-copybutton ; extra == 'doc' + - sphinx-design>=0.4.0 ; extra == 'doc' + - matplotlib>=3.5 ; extra == 'doc' + - numpydoc ; extra == 'doc' + - jupytext ; extra == 'doc' + - myst-nb>=1.2.0 ; extra == 'doc' + - pooch ; extra == 'doc' + - jupyterlite-sphinx>=0.19.1 ; extra == 'doc' + - jupyterlite-pyodide-kernel ; extra == 'doc' + - linkify-it-py ; extra == 'doc' + - tabulate ; extra == 'doc' + - click<8.3.0 ; extra == 'dev' + - spin ; extra == 'dev' + - mypy==1.19.1 ; extra == 'dev' + - pyrefly==0.63.0 ; extra == 'dev' + - typing-extensions ; extra == 'dev' + - types-psutil ; extra == 'dev' + - pycodestyle ; extra == 'dev' + - ruff>=0.12.0 ; extra == 'dev' + - cython-lint>=0.12.2 ; extra == 'dev' + requires_python: '>=3.12' +- pypi: https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl + name: packaging + version: '26.2' + sha256: 5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/e3/78/47a205b5921bd86ef8d174fcda3daf23d65ad2887b38771935a064acd348/gxformat2-0.27.0-py3-none-any.whl + name: gxformat2 + version: 0.27.0 + sha256: 2e8a90b649ddecc7d1662b2ab75b942b895bae9536fec1f8b6f71e27fe4fe4c6 + requires_dist: + - eval-type-backport ; python_full_version < '3.10' + - pydantic>=2.0 + - pyyaml + - requests + - schema-salad>8.7.20241010092723 + - typing-extensions + - bioblend ; extra == 'bioblend' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/e6/13/b8ae04c59392f8d11c6cd9fb4011d1dc7c86b81225c770280300e259ffe1/propcache-0.5.2-cp312-cp312-macosx_10_13_x86_64.whl + name: propcache + version: 0.5.2 + sha256: db2b80ea58eab4f86b2beec3cc8b39e8ff9276ac20e96b7cce43c8ae84cd6b5a + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl + name: cycler + version: 0.12.1 + sha256: 85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 + requires_dist: + - ipython ; extra == 'docs' + - matplotlib ; extra == 'docs' + - numpydoc ; extra == 'docs' + - sphinx ; extra == 'docs' + - pytest ; extra == 'tests' + - pytest-cov ; extra == 'tests' + - pytest-xdist ; extra == 'tests' + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl + name: psutil + version: 7.2.2 + sha256: ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486 + requires_dist: + - psleak ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-instafail ; extra == 'dev' + - pytest-xdist ; extra == 'dev' + - setuptools ; extra == 'dev' + - abi3audit ; extra == 'dev' + - black ; extra == 'dev' + - check-manifest ; extra == 'dev' + - coverage ; extra == 'dev' + - packaging ; extra == 'dev' + - pylint ; extra == 'dev' + - pyperf ; extra == 'dev' + - pypinfo ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - requests ; extra == 'dev' + - rstcheck ; extra == 'dev' + - ruff ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx-rtd-theme ; extra == 'dev' + - toml-sort ; extra == 'dev' + - twine ; extra == 'dev' + - validate-pyproject[all] ; extra == 'dev' + - virtualenv ; extra == 'dev' + - vulture ; extra == 'dev' + - wheel ; extra == 'dev' + - colorama ; os_name == 'nt' and extra == 'dev' + - pyreadline3 ; os_name == 'nt' and extra == 'dev' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'dev' + - psleak ; extra == 'test' + - pytest ; extra == 'test' + - pytest-instafail ; extra == 'test' + - pytest-xdist ; extra == 'test' + - setuptools ; extra == 'test' + - pywin32 ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wheel ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + - wmi ; implementation_name != 'pypy' and os_name == 'nt' and extra == 'test' + requires_python: '>=3.6' +- pypi: https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl + name: more-itertools + version: 11.1.0 + sha256: 4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192 + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/e9/a7/248e1aebe0c7810b0271e021a0f2a5eb6e78a051885b3c9df49f42a5802d/aiohttp-3.14.1-cp314-cp314-macosx_11_0_arm64.whl + name: aiohttp + version: 3.14.1 + sha256: 07eabb979d236335fed927e137a928c9adfb7df3b9ec7aa31726f133a62be983 + requires_dist: + - aiohappyeyeballs>=2.5.0 + - aiosignal>=1.4.0 + - async-timeout>=4.0,<6.0 ; python_full_version < '3.11' + - attrs>=17.3.0 + - frozenlist>=1.1.1 + - multidict>=4.5,<7.0 + - propcache>=0.2.0 + - typing-extensions>=4.4 ; python_full_version < '3.13' + - yarl>=1.17.0,<2.0 + - aiodns>=3.3.0 ; sys_platform != 'android' and sys_platform != 'ios' and extra == 'speedups' + - brotli>=1.2 ; platform_python_implementation == 'CPython' and sys_platform != 'android' and sys_platform != 'ios' and extra == 'speedups' + - brotlicffi>=1.2 ; platform_python_implementation != 'CPython' and extra == 'speedups' + - backports-zstd ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and sys_platform != 'android' and sys_platform != 'ios' and extra == 'speedups' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl + name: cffi + version: 2.0.0 + sha256: 6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d + requires_dist: + - pycparser ; implementation_name != 'PyPy' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/ec/17/d9ad109c8d7f05e6e78a79c4ec410ad3d38877b3efe18896eae6c446b534/edam_ontology-1.25.3-py3-none-any.whl + name: edam-ontology + version: 1.25.3 + sha256: cdea906b7885b5e553e924425ba4fb708826dfcb8a2cf186af57725998fcf8c5 + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl + name: python-dateutil + version: 2.9.0.post0 + sha256: a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + requires_dist: + - six>=1.5 + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*' +- pypi: https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl + name: certifi + version: 2026.6.17 + sha256: 2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/ef/79/c45f2d53efe6ada1110cf6f9fca095e4ff47a0454444aefdde6ac4789179/cachecontrol-0.14.4-py3-none-any.whl + name: cachecontrol + version: 0.14.4 + sha256: b7ac014ff72ee199b5f8af1de29d60239954f223e948196fa3d84adaffc71d2b + requires_dist: + - requests>=2.16.0 + - msgpack>=0.5.2,<2.0.0 + - cachecontrol[filecache,redis] ; extra == 'dev' + - cherrypy ; extra == 'dev' + - cheroot>=11.1.2 ; extra == 'dev' + - codespell ; extra == 'dev' + - furo ; extra == 'dev' + - mypy ; extra == 'dev' + - pytest ; extra == 'dev' + - pytest-cov ; extra == 'dev' + - ruff ; extra == 'dev' + - sphinx ; extra == 'dev' + - sphinx-copybutton ; extra == 'dev' + - types-redis ; extra == 'dev' + - types-requests ; extra == 'dev' + - filelock>=3.8.0 ; extra == 'filecache' + - redis>=2.10.5 ; extra == 'redis' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl + name: humanfriendly + version: '10.0' + sha256: 1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477 + requires_dist: + - monotonic ; python_full_version == '2.7.*' + - pyreadline ; python_full_version < '3.8' and sys_platform == 'win32' + - pyreadline3 ; python_full_version >= '3.8' and sys_platform == 'win32' + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*' +- pypi: https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl + name: multidict + version: 6.7.1 + sha256: 0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1 + requires_dist: + - typing-extensions>=4.1.0 ; python_full_version < '3.11' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl + name: jaraco-context + version: 6.1.2 + sha256: bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535 + requires_dist: + - backports-tarfile ; python_full_version < '3.12' + - pytest>=6,!=8.1.* ; extra == 'test' + - jaraco-test>=5.6.0 ; extra == 'test' + - portend ; extra == 'test' + - sphinx>=3.5 ; extra == 'doc' + - jaraco-packaging>=9.3 ; extra == 'doc' + - rst-linker>=1.9 ; extra == 'doc' + - furo ; extra == 'doc' + - sphinx-lint ; extra == 'doc' + - jaraco-tidelift>=1.4 ; extra == 'doc' + - pytest-checkdocs>=2.14 ; extra == 'check' + - pytest-ruff>=0.2.1 ; sys_platform != 'cygwin' and extra == 'check' + - pytest-cov ; extra == 'cover' + - pytest-enabler>=3.4 ; extra == 'enabler' + - pytest-mypy>=1.0.1 ; platform_python_implementation != 'PyPy' and extra == 'type' + requires_python: '>=3.10' +- pypi: https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl + name: multidict + version: 6.7.1 + sha256: bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961 + requires_dist: + - typing-extensions>=4.1.0 ; python_full_version < '3.11' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/f3/ab/a7653bce9a3b204be6a6931767a9e23595807bb84790ce6685e4d7e5bd08/nh3-0.3.6-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl + name: nh3 + version: 0.3.6 + sha256: a43ebd7543555c3ac1bc353023d0794e75cb76f6f18f19c32e95441496c0cc25 + requires_python: '>=3.8' +- pypi: https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl + name: webencodings + version: 0.5.1 + sha256: a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 +- pypi: https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl + name: pygments + version: 2.20.0 + sha256: 81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176 + requires_dist: + - colorama>=0.4.6 ; extra == 'windows-terminal' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/f9/38/8b6fc7a8153cb49eb3a9a13acfa9eeb6cc476e37888781e593e6f02ac05e/spython-0.3.14-py3-none-any.whl + name: spython + version: 0.3.14 + sha256: 72968583e498bc2a51f9acd0ed6bc0d7d1f7ccd491feaba5e2f7d944bc51da3a +- pypi: https://files.pythonhosted.org/packages/fa/0a/11486d02add7b1384dff7374d124b1cfbb0ee864dcc9f6a2c0380638cf84/numpy-2.5.0-cp312-cp312-macosx_10_13_x86_64.whl + name: numpy + version: 2.5.0 + sha256: 489780423903667933b4ed6197b6ec3b75ea5dd17d1d8f0f38d798feb6921561 + requires_python: '>=3.12' +- pypi: https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl + name: aiosignal + version: 1.4.0 + sha256: 053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e + requires_dist: + - frozenlist>=1.1.0 + - typing-extensions>=4.2 ; python_full_version < '3.13' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl + name: pydantic + version: 2.13.4 + sha256: 45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba + requires_dist: + - annotated-types>=0.6.0 + - pydantic-core==2.46.4 + - typing-extensions>=4.14.1 + - typing-inspection>=0.4.2 + - email-validator>=2.0.0 ; extra == 'email' + - tzdata ; python_full_version >= '3.9' and sys_platform == 'win32' and extra == 'timezone' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/fd/99/757a48b4ace0097b63550597db28f58da0b91d89889f98b34b30f272c0bf/ct3-3.4.0.post5-cp314-cp314-macosx_11_0_arm64.whl + name: ct3 + version: 3.4.0.post5 + sha256: 9611a4052fd76df8bd8961be0f8d94150908f712f910fcf22b2ceddae8f1882a + requires_dist: + - markdown ; extra == 'filters' + - markdown ; extra == 'markdown' + requires_python: '>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*' +- pypi: https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl + name: contourpy + version: 1.3.3 + sha256: cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77 + requires_dist: + - numpy>=1.25 + - furo ; extra == 'docs' + - sphinx>=7.2 ; extra == 'docs' + - sphinx-copybutton ; extra == 'docs' + - bokeh ; extra == 'bokeh' + - selenium ; extra == 'bokeh' + - contourpy[bokeh,docs] ; extra == 'mypy' + - bokeh ; extra == 'mypy' + - docutils-stubs ; extra == 'mypy' + - mypy==1.17.0 ; extra == 'mypy' + - types-pillow ; extra == 'mypy' + - contourpy[test-no-images] ; extra == 'test' + - matplotlib ; extra == 'test' + - pillow ; extra == 'test' + - pytest ; extra == 'test-no-images' + - pytest-cov ; extra == 'test-no-images' + - pytest-rerunfailures ; extra == 'test-no-images' + - pytest-xdist ; extra == 'test-no-images' + - wurlitzer ; extra == 'test-no-images' + requires_python: '>=3.11' +- pypi: https://files.pythonhosted.org/packages/fe/83/294bca639b0e052f1e2f65199b3db258780c7d4e31408b934c9c974a1379/maturin-1.14.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl + name: maturin + version: 1.14.1 + sha256: ffe5ad71f21d1e6603c4dd75f7fee34adf5ed5ebcebb692886549888ebb329ed + requires_dist: + - tomli>=1.1.0 ; python_full_version < '3.11' + - patchelf ; extra == 'patchelf' + - ziglang>=0.10.0 ; extra == 'zig' + requires_python: '>=3.7' +- pypi: https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl + name: multidict + version: 6.7.1 + sha256: 3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd + requires_dist: + - typing-extensions>=4.1.0 ; python_full_version < '3.11' + requires_python: '>=3.9' +- pypi: https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl + name: rfc3986 + version: 2.0.0 + sha256: 50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd + requires_dist: + - idna ; extra == 'idna2008' + requires_python: '>=3.7' diff --git a/pydeeptools/deeptools/bamPEFragmentSize.py b/pydeeptools/deeptools/bamPEFragmentSize.py index fab0b96022..9569abbe66 100755 --- a/pydeeptools/deeptools/bamPEFragmentSize.py +++ b/pydeeptools/deeptools/bamPEFragmentSize.py @@ -3,114 +3,152 @@ import argparse import sys -import numpy as np import matplotlib -matplotlib.use('Agg') -matplotlib.rcParams['pdf.fonttype'] = 42 -matplotlib.rcParams['svg.fonttype'] = 'none' +import numpy as np + +matplotlib.use("Agg") +matplotlib.rcParams["pdf.fonttype"] = 42 +matplotlib.rcParams["svg.fonttype"] = "none" +from importlib.metadata import version + import matplotlib.pyplot as plt +from deeptools.getFragmentAndReadSize import get_read_and_fragment_length + # own tools from deeptools.parserCommon import writableFile -from deeptools.getFragmentAndReadSize import get_read_and_fragment_length -from importlib.metadata import version + def parse_arguments(): parser = argparse.ArgumentParser( - description='This tool calculates the fragment sizes for read pairs given a BAM file from paired-end sequencing.' - 'Several regions are sampled depending on the ' - 'size of the genome and number of processors to estimate the' - 'summary statistics on the fragment lengths. ' - 'Properly paired reads are preferred for computation, i.e., ' - 'it will only use discordant pairs if no concordant alignments ' - 'overlap with a given region. ' - 'The default setting simply prints the summary statistics to the screen.', - usage='bamPEFragmentSize -b sample1.bam sample2.bam -o hist.png\n' - 'help: bamPEFragmentSize -h / bamPEFragmentSize --help' + description="This tool calculates the fragment sizes for read pairs given a BAM file from paired-end sequencing." + "Several regions are sampled depending on the " + "size of the genome and number of processors to estimate the" + "summary statistics on the fragment lengths. " + "Properly paired reads are preferred for computation, i.e., " + "it will only use discordant pairs if no concordant alignments " + "overlap with a given region. " + "The default setting simply prints the summary statistics to the screen.", + usage="bamPEFragmentSize -b sample1.bam sample2.bam -o hist.png\n" + "help: bamPEFragmentSize -h / bamPEFragmentSize --help", + ) + parser.add_argument( + "--bamfiles", + "-b", + help="List of BAM files to process", + nargs="+", + metavar="bam files", + ) + + parser.add_argument( + "--histogram", + "-hist", + "-o", + help="Save a .png file with a histogram of the fragment length distribution.", + metavar="FILE", + ) + + parser.add_argument( + "--plotFileFormat", + metavar="FILETYPE", + help="Image format type. If given, this option " + "overrides the image format based on the plotFile " + "ending. The available options are: png, " + "eps, pdf, svg and plotly.", + default=None, + choices=["png", "pdf", "svg", "eps"], + ) + parser.add_argument( + "--ggplot", help="Use ggplot theme for figures", action="store_true" + ) + + parser.add_argument( + "--numberOfProcessors", + "-p", + help="Number of processors to use. The default is " + "to use 1. (Default: %(default)s)", + metavar="INT", + type=int, + default=1, + required=False, + ) + parser.add_argument( + "--samplesLabel", + help="Labels for the samples plotted. The " + "default is to use the file name of the " + "sample. The sample labels should be separated " + "by spaces and quoted if a label itself" + 'contains a space E.g. --samplesLabel label-1 "label 2" ', + nargs="+", + ) + parser.add_argument( + "--plotTitle", + "-T", + help="Title of the plot, to be printed on top of " + "the generated image. Leave blank for no title. (Default: %(default)s)", + default="", + ) + parser.add_argument( + "--maxFragmentLength", + help="The maximum fragment length in the histogram. A value of 0 (the default) indicates to use twice the mean fragment length. (Default: %(default)s)", + default=0, + type=int, + ) + parser.add_argument("--logScale", help="Plot on the log scale", action="store_true") + parser.add_argument( + "--binSize", + "-bs", + metavar="INT", + help="Length in bases of the window used to sample the genome. (Default: %(default)s)", + default=1000, + type=int, + ) + parser.add_argument( + "--distanceBetweenBins", + "-n", + metavar="INT", + help="To reduce the computation time, not every possible genomic " + "bin is sampled. This option allows you to set the distance " + "between bins actually sampled from. Larger numbers are sufficient " + "for high coverage samples, while smaller values are useful for " + "lower coverage samples. Note that if you specify a value that " + "results in too few (<1000) reads sampled, the value will be " + "decreased. (Default: %(default)s)", + default=1000000, + type=int, + ) + parser.add_argument( + "--blackListFileName", + "-bl", + help="A BED file containing regions that should be excluded from all analyses. Currently this works by rejecting genomic chunks that happen to overlap an entry. Consequently, for BAM files, if a read partially overlaps a blacklisted region or a fragment spans over it, then the read/fragment might still be considered.", + metavar="BED file", + required=False, + ) + parser.add_argument( + "--table", + metavar="FILE", + help="In addition to printing read and fragment length metrics to the screen, write them to the given file in tabular format.", + required=False, + ) + parser.add_argument( + "--outRawFragmentLengths", + metavar="FILE", + required=False, + type=writableFile, + help="Save the fragment (or read if the input is single-end) length and their associated number of occurrences to a tab-separated file. Columns are length, number of occurrences, and the sample label.", + ) + parser.add_argument( + "--verbose", + help="Set if processing data messages are wanted.", + action="store_true", + required=False, + ) + parser.add_argument( + "--version", + action="version", + version="%(prog)s {}".format(version("deeptools")), ) - parser.add_argument('--bamfiles', '-b', - help='List of BAM files to process', - nargs='+', - metavar='bam files') - - parser.add_argument('--histogram', '-hist', '-o', - help='Save a .png file with a histogram ' - 'of the fragment length distribution.', - metavar='FILE') - - parser.add_argument('--plotFileFormat', - metavar='FILETYPE', - help='Image format type. If given, this option ' - 'overrides the image format based on the plotFile ' - 'ending. The available options are: png, ' - 'eps, pdf, svg and plotly.', - default=None, - choices=['png', 'pdf', 'svg', 'eps']) - parser.add_argument('--ggplot', - help='Use ggplot theme for figures', - action='store_true') - - parser.add_argument('--numberOfProcessors', '-p', - help='Number of processors to use. The default is ' - 'to use 1. (Default: %(default)s)', - metavar="INT", - type=int, - default=1, - required=False) - parser.add_argument('--samplesLabel', - help='Labels for the samples plotted. The ' - 'default is to use the file name of the ' - 'sample. The sample labels should be separated ' - 'by spaces and quoted if a label itself' - 'contains a space E.g. --samplesLabel label-1 "label 2" ', - nargs='+') - parser.add_argument('--plotTitle', '-T', - help='Title of the plot, to be printed on top of ' - 'the generated image. Leave blank for no title. (Default: %(default)s)', - default='') - parser.add_argument('--maxFragmentLength', - help='The maximum fragment length in the histogram. A value of 0 (the default) indicates to use twice the mean fragment length. (Default: %(default)s)', - default=0, - type=int) - parser.add_argument('--logScale', - help='Plot on the log scale', - action='store_true') - parser.add_argument('--binSize', '-bs', - metavar='INT', - help='Length in bases of the window used to sample the genome. (Default: %(default)s)', - default=1000, - type=int) - parser.add_argument('--distanceBetweenBins', '-n', - metavar='INT', - help='To reduce the computation time, not every possible genomic ' - 'bin is sampled. This option allows you to set the distance ' - 'between bins actually sampled from. Larger numbers are sufficient ' - 'for high coverage samples, while smaller values are useful for ' - 'lower coverage samples. Note that if you specify a value that ' - 'results in too few (<1000) reads sampled, the value will be ' - 'decreased. (Default: %(default)s)', - default=1000000, - type=int) - parser.add_argument('--blackListFileName', '-bl', - help="A BED file containing regions that should be excluded from all analyses. Currently this works by rejecting genomic chunks that happen to overlap an entry. Consequently, for BAM files, if a read partially overlaps a blacklisted region or a fragment spans over it, then the read/fragment might still be considered.", - metavar="BED file", - required=False) - parser.add_argument('--table', - metavar='FILE', - help='In addition to printing read and fragment length metrics to the screen, write them to the given file in tabular format.', - required=False) - parser.add_argument('--outRawFragmentLengths', - metavar='FILE', - required=False, - type=writableFile, - help='Save the fragment (or read if the input is single-end) length and their associated number of occurrences to a tab-separated file. Columns are length, number of occurrences, and the sample label.') - parser.add_argument('--verbose', - help='Set if processing data messages are wanted.', - action='store_true', - required=False) - parser.add_argument('--version', action='version', - version='%(prog)s {}'.format(version('deeptools'))) return parser @@ -126,23 +164,33 @@ def getDensity(lengths, minVal, maxVal): def getFragSize(bam, args, idx, outRawFrags): - fragment_len_dict, read_len_dict = get_read_and_fragment_length(bam, return_lengths=True, - blackListFileName=args.blackListFileName, - numberOfProcessors=args.numberOfProcessors, - verbose=args.verbose, - binSize=args.binSize, - distanceBetweenBins=args.distanceBetweenBins) + fragment_len_dict, read_len_dict = get_read_and_fragment_length( + bam, + return_lengths=True, + blackListFileName=args.blackListFileName, + numberOfProcessors=args.numberOfProcessors, + verbose=args.verbose, + binSize=args.binSize, + distanceBetweenBins=args.distanceBetweenBins, + ) if outRawFrags: label = bam if args.samplesLabel and idx < len(args.samplesLabel): label = args.samplesLabel[idx] if fragment_len_dict: - fragment_len_dict['lengths'] = [int(x) for x in fragment_len_dict['lengths']] - cnts = np.bincount(fragment_len_dict['lengths'], minlength=int(fragment_len_dict['max']) + 1) + fragment_len_dict["lengths"] = [ + int(x) for x in fragment_len_dict["lengths"] + ] + cnts = np.bincount( + fragment_len_dict["lengths"], + minlength=int(fragment_len_dict["max"]) + 1, + ) else: - read_len_dict['lengths'] = [int(x) for x in read_len_dict['lengths']] - cnts = np.bincount(read_len_dict['lengths'], minlength=int(read_len_dict['max']) + 1) + read_len_dict["lengths"] = [int(x) for x in read_len_dict["lengths"]] + cnts = np.bincount( + read_len_dict["lengths"], minlength=int(read_len_dict["max"]) + 1 + ) for idx, v in enumerate(cnts): if v > 0: outRawFrags.write("{}\t{}\t{}\n".format(idx, v, label)) @@ -153,74 +201,98 @@ def getFragSize(bam, args, idx, outRawFrags): print("\n\nBAM file : {}".format(bam)) if fragment_len_dict: - if fragment_len_dict['mean'] == 0: - print("No pairs were found. Is the data from a paired-end sequencing experiment?") + if fragment_len_dict["mean"] == 0: + print( + "No pairs were found. Is the data from a paired-end sequencing experiment?" + ) - print("Sample size: {}\n".format(fragment_len_dict['sample_size'])) + print("Sample size: {}\n".format(fragment_len_dict["sample_size"])) print("Fragment lengths:") - print("Min.: {}\n1st Qu.: {}\nMean: {}\nMedian: {}\n" - "3rd Qu.: {}\nMax.: {}\nStd: {}".format(fragment_len_dict['min'], - fragment_len_dict['qtile25'], - fragment_len_dict['mean'], - fragment_len_dict['median'], - fragment_len_dict['qtile75'], - fragment_len_dict['max'], - fragment_len_dict['std'])) - print("MAD: {}\nLen. 10%: {}\nLen. 20%: {}\nLen. 30%: {}\nLen. 40%: {}\nLen. 60%: {}\nLen. 70%: {}\nLen. 80%: {}\nLen. 90%: {}\nLen. 99%: {}\n".format(fragment_len_dict['mad'], - fragment_len_dict['qtile10'], - fragment_len_dict['qtile20'], - fragment_len_dict['qtile30'], - fragment_len_dict['qtile40'], - fragment_len_dict['qtile60'], - fragment_len_dict['qtile70'], - fragment_len_dict['qtile80'], - fragment_len_dict['qtile90'], - fragment_len_dict['qtile99'])) + print( + "Min.: {}\n1st Qu.: {}\nMean: {}\nMedian: {}\n" + "3rd Qu.: {}\nMax.: {}\nStd: {}".format( + fragment_len_dict["min"], + fragment_len_dict["qtile25"], + fragment_len_dict["mean"], + fragment_len_dict["median"], + fragment_len_dict["qtile75"], + fragment_len_dict["max"], + fragment_len_dict["std"], + ) + ) + print( + "MAD: {}\nLen. 10%: {}\nLen. 20%: {}\nLen. 30%: {}\nLen. 40%: {}\nLen. 60%: {}\nLen. 70%: {}\nLen. 80%: {}\nLen. 90%: {}\nLen. 99%: {}\n".format( + fragment_len_dict["mad"], + fragment_len_dict["qtile10"], + fragment_len_dict["qtile20"], + fragment_len_dict["qtile30"], + fragment_len_dict["qtile40"], + fragment_len_dict["qtile60"], + fragment_len_dict["qtile70"], + fragment_len_dict["qtile80"], + fragment_len_dict["qtile90"], + fragment_len_dict["qtile99"], + ) + ) else: - print("No pairs were found. Is the data from a paired-end sequencing experiment?") + print( + "No pairs were found. Is the data from a paired-end sequencing experiment?" + ) print("\nRead lengths:") - print("Sample size: {}\n".format(read_len_dict['sample_size'])) - print("Min.: {}\n1st Qu.: {}\nMean: {}\nMedian: {}\n" - "3rd Qu.: {}\nMax.: {}\nStd: {}".format(read_len_dict['min'], - read_len_dict['qtile25'], - read_len_dict['mean'], - read_len_dict['median'], - read_len_dict['qtile75'], - read_len_dict['max'], - read_len_dict['std'])) - print("MAD: {}\nLen. 10%: {}\nLen. 20%: {}\nLen. 30%: {}\nLen. 40%: {}\nLen. 60%: {}\nLen. 70%: {}\nLen. 80%: {}\nLen. 90%: {}\nLen. 99%: {}\n".format(read_len_dict['mad'], - read_len_dict['qtile10'], - read_len_dict['qtile20'], - read_len_dict['qtile30'], - read_len_dict['qtile40'], - read_len_dict['qtile60'], - read_len_dict['qtile70'], - read_len_dict['qtile80'], - read_len_dict['qtile90'], - read_len_dict['qtile99'])) + print("Sample size: {}\n".format(read_len_dict["sample_size"])) + print( + "Min.: {}\n1st Qu.: {}\nMean: {}\nMedian: {}\n" + "3rd Qu.: {}\nMax.: {}\nStd: {}".format( + read_len_dict["min"], + read_len_dict["qtile25"], + read_len_dict["mean"], + read_len_dict["median"], + read_len_dict["qtile75"], + read_len_dict["max"], + read_len_dict["std"], + ) + ) + print( + "MAD: {}\nLen. 10%: {}\nLen. 20%: {}\nLen. 30%: {}\nLen. 40%: {}\nLen. 60%: {}\nLen. 70%: {}\nLen. 80%: {}\nLen. 90%: {}\nLen. 99%: {}\n".format( + read_len_dict["mad"], + read_len_dict["qtile10"], + read_len_dict["qtile20"], + read_len_dict["qtile30"], + read_len_dict["qtile40"], + read_len_dict["qtile60"], + read_len_dict["qtile70"], + read_len_dict["qtile80"], + read_len_dict["qtile90"], + read_len_dict["qtile99"], + ) + ) # The read and fragment lists will just eat up memory if not removed! if args.histogram: if fragment_len_dict: - maxVal = fragment_len_dict['mean'] * 2 - minVal = fragment_len_dict['min'] + maxVal = fragment_len_dict["mean"] * 2 + minVal = fragment_len_dict["min"] else: - maxVal = read_len_dict['mean'] * 2 - minVal = read_len_dict['min'] + maxVal = read_len_dict["mean"] * 2 + minVal = read_len_dict["min"] if args.maxFragmentLength > 0: maxVal = args.maxFragmentLength if fragment_len_dict: - fragment_len_dict['lengths'] = getDensity(fragment_len_dict['lengths'], minVal, maxVal) + fragment_len_dict["lengths"] = getDensity( + fragment_len_dict["lengths"], minVal, maxVal + ) if read_len_dict: - read_len_dict['lengths'] = getDensity(read_len_dict['lengths'], minVal, maxVal) + read_len_dict["lengths"] = getDensity( + read_len_dict["lengths"], minVal, maxVal + ) else: if fragment_len_dict: - del fragment_len_dict['lengths'] + del fragment_len_dict["lengths"] if read_len_dict: - del read_len_dict['lengths'] + del read_len_dict["lengths"] return (fragment_len_dict, read_len_dict) @@ -231,11 +303,19 @@ def printTable(args, fragDict, readDict): """ of = open(args.table, "w") of.write("\tFrag. Sampled") - of.write("\tFrag. Len. Min.\tFrag. Len. 1st. Qu.\tFrag. Len. Mean\tFrag. Len. Median\tFrag. Len. 3rd Qu.\tFrag. Len. Max\tFrag. Len. Std.") - of.write("\tFrag. Med. Abs. Dev.\tFrag. Len. 10%\tFrag. Len. 20%\tFrag. Len. 30%\tFrag. Len. 40%\tFrag. Len. 60%\tFrag. Len. 70%\tFrag. Len. 80%\tFrag. Len. 90%\tFrag. Len. 99%") + of.write( + "\tFrag. Len. Min.\tFrag. Len. 1st. Qu.\tFrag. Len. Mean\tFrag. Len. Median\tFrag. Len. 3rd Qu.\tFrag. Len. Max\tFrag. Len. Std." + ) + of.write( + "\tFrag. Med. Abs. Dev.\tFrag. Len. 10%\tFrag. Len. 20%\tFrag. Len. 30%\tFrag. Len. 40%\tFrag. Len. 60%\tFrag. Len. 70%\tFrag. Len. 80%\tFrag. Len. 90%\tFrag. Len. 99%" + ) of.write("\tReads Sampled") - of.write("\tRead Len. Min.\tRead Len. 1st. Qu.\tRead Len. Mean\tRead Len. Median\tRead Len. 3rd Qu.\tRead Len. Max\tRead Len. Std.") - of.write("\tRead Med. Abs. Dev.\tRead Len. 10%\tRead Len. 20%\tRead Len. 30%\tRead Len. 40%\tRead Len. 60%\tRead Len. 70%\tRead Len. 80%\tRead Len. 90%\tRead Len. 99%\n") + of.write( + "\tRead Len. Min.\tRead Len. 1st. Qu.\tRead Len. Mean\tRead Len. Median\tRead Len. 3rd Qu.\tRead Len. Max\tRead Len. Std." + ) + of.write( + "\tRead Med. Abs. Dev.\tRead Len. 10%\tRead Len. 20%\tRead Len. 30%\tRead Len. 40%\tRead Len. 60%\tRead Len. 70%\tRead Len. 80%\tRead Len. 90%\tRead Len. 99%\n" + ) for idx, bam in enumerate(args.bamfiles): if args.samplesLabel and idx < len(args.samplesLabel): @@ -244,57 +324,74 @@ def printTable(args, fragDict, readDict): of.write(bam) if fragDict is not None and fragDict[bam] is not None: d = fragDict[bam] - of.write("\t{}".format(d['sample_size'])) - of.write("\t{}\t{}\t{}\t{}\t{}\t{}\t{}".format(d['min'], - d['qtile25'], - d['mean'], - d['median'], - d['qtile75'], - d['max'], - d['std'])) - of.write("\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}".format(d['mad'], - d['qtile10'], - d['qtile20'], - d['qtile30'], - d['qtile40'], - d['qtile60'], - d['qtile70'], - d['qtile80'], - d['qtile90'], - d['qtile99'])) + of.write("\t{}".format(d["sample_size"])) + of.write( + "\t{}\t{}\t{}\t{}\t{}\t{}\t{}".format( + d["min"], + d["qtile25"], + d["mean"], + d["median"], + d["qtile75"], + d["max"], + d["std"], + ) + ) + of.write( + "\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}".format( + d["mad"], + d["qtile10"], + d["qtile20"], + d["qtile30"], + d["qtile40"], + d["qtile60"], + d["qtile70"], + d["qtile80"], + d["qtile90"], + d["qtile99"], + ) + ) else: of.write("\t0") of.write("\t0\t0\t0\t0\t0\t0\t0") of.write("\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0") d = readDict[bam] - of.write("\t{}".format(d['sample_size'])) - of.write("\t{}\t{}\t{}\t{}\t{}\t{}\t{}".format(d['min'], - d['qtile25'], - d['mean'], - d['median'], - d['qtile75'], - d['max'], - d['std'])) - of.write("\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\n".format(d['mad'], - d['qtile10'], - d['qtile20'], - d['qtile30'], - d['qtile40'], - d['qtile60'], - d['qtile70'], - d['qtile80'], - d['qtile90'], - d['qtile99'])) + of.write("\t{}".format(d["sample_size"])) + of.write( + "\t{}\t{}\t{}\t{}\t{}\t{}\t{}".format( + d["min"], + d["qtile25"], + d["mean"], + d["median"], + d["qtile75"], + d["max"], + d["std"], + ) + ) + of.write( + "\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\n".format( + d["mad"], + d["qtile10"], + d["qtile20"], + d["qtile30"], + d["qtile40"], + d["qtile60"], + d["qtile70"], + d["qtile80"], + d["qtile90"], + d["qtile99"], + ) + ) of.close() def main(args=None): - args = parse_arguments().parse_args(args) - - if len(sys.argv) == 1: - parse_arguments().print_help() - sys.exit() - + parser = parse_arguments() + if args is None: + if len(sys.argv) == 1: + parser.print_help() + return + args = parser.parse_args(args) + print(args) fraglengths = {} readlengths = {} of = None @@ -310,7 +407,7 @@ def main(args=None): printTable(args, fraglengths, readlengths) if args.ggplot: - plt.style.use('ggplot') + plt.style.use("ggplot") if args.histogram: if args.samplesLabel: @@ -330,17 +427,22 @@ def main(args=None): if args.maxFragmentLength > 0: maxVal = args.maxFragmentLength else: - maxVal = d['mean'] * 2 - - plt.bar(d['lengths'][1][:-1], height=d['lengths'][0], - width=d['lengths'][1][1:] - d['lengths'][1][:-1], - align='edge', log=args.logScale, - alpha=0.5, label=labels[i]) + maxVal = d["mean"] * 2 + + plt.bar( + d["lengths"][1][:-1], + height=d["lengths"][0], + width=d["lengths"][1][1:] - d["lengths"][1][:-1], + align="edge", + log=args.logScale, + alpha=0.5, + label=labels[i], + ) i += 1 - plt.xlabel('Fragment Length') - plt.ylabel('Frequency') - plt.legend(loc='upper right') + plt.xlabel("Fragment Length") + plt.ylabel("Frequency") + plt.legend(loc="upper right") plt.title(args.plotTitle) plt.savefig(args.histogram, bbox_inches=0, format=args.plotFileFormat) plt.close() diff --git a/pydeeptools/deeptools/bigwigAverage.py b/pydeeptools/deeptools/bigwigAverage.py index 5228ddf08f..fb60612491 100644 --- a/pydeeptools/deeptools/bigwigAverage.py +++ b/pydeeptools/deeptools/bigwigAverage.py @@ -2,9 +2,10 @@ # -*- coding: utf-8 -*- import argparse import sys + import numpy as np -from deeptools import parserCommon -from deeptools import writeBedGraph_bam_and_bw + +from deeptools import parserCommon, writeBedGraph_bam_and_bw debug = 0 @@ -15,40 +16,49 @@ def parse_arguments(args=None): parser = argparse.ArgumentParser( parents=[parentParser, outputParser], formatter_class=argparse.ArgumentDefaultsHelpFormatter, - description='This tool average multiple bigWig files based on the number ' - 'of mapped reads. To average the bigWig files, the genome is ' - 'partitioned into bins of equal size, then the scores ' - 'in each bigwig file are computed per bin.' - 'These scores are averaged and scaleFactors can be applied before the average.', - usage='bigwigAverage -b sample1.bw sample2.bw -o outfile.bw\n' - 'help: bigwigAverage -h / bigwigAverage --help') + description="This tool average multiple bigWig files based on the number " + "of mapped reads. To average the bigWig files, the genome is " + "partitioned into bins of equal size, then the scores " + "in each bigwig file are computed per bin." + "These scores are averaged and scaleFactors can be applied before the average.", + usage="bigwigAverage -b sample1.bw sample2.bw -o outfile.bw\n" + "help: bigwigAverage -h / bigwigAverage --help", + ) # define the arguments - parser.add_argument('--bigwigs', '-b', - metavar='Bigwig files', - help='Bigwig files separated by space.', - nargs='+', - required=True) - - parser.add_argument('--scaleFactors', - help='Set this parameter to multipy the bigwig values ' - 'by a constant. The format is ' - 'scaleFactor1:scaleFactor2:scaleFactor3 etc. ' - 'For example 0.7:1 to scale the first bigwig file ' - 'by 0.7 while not scaling the second bigwig file', - default=None, - required=False) - - parser.add_argument('--skipNonCoveredRegions', '--skipNAs', - help='This parameter determines if non-covered regions (regions without a score) ' - 'in the bigWig files should be skipped. The default is to treat those ' - 'regions as having a value of zero. ' - 'The decision to skip non-covered regions ' - 'depends on the interpretation of the data. Non-covered regions ' - 'in a bigWig file may represent repetitive regions that should ' - 'be skipped. Alternatively, the interpretation of non-covered regions as ' - 'zeros may be wrong and this option should be used ', - action='store_true') + parser.add_argument( + "--bigwigs", + "-b", + metavar="Bigwig files", + help="Bigwig files separated by space.", + nargs="+", + required=True, + ) + + parser.add_argument( + "--scaleFactors", + help="Set this parameter to multipy the bigwig values " + "by a constant. The format is " + "scaleFactor1:scaleFactor2:scaleFactor3 etc. " + "For example 0.7:1 to scale the first bigwig file " + "by 0.7 while not scaling the second bigwig file", + default=None, + required=False, + ) + + parser.add_argument( + "--skipNonCoveredRegions", + "--skipNAs", + help="This parameter determines if non-covered regions (regions without a score) " + "in the bigWig files should be skipped. The default is to treat those " + "regions as having a value of zero. " + "The decision to skip non-covered regions " + "depends on the interpretation of the data. Non-covered regions " + "in a bigWig file may represent repetitive regions that should " + "be skipped. Alternatively, the interpretation of non-covered regions as " + "zeros may be wrong and this option should be used ", + action="store_true", + ) return parser @@ -84,16 +94,18 @@ def average(tileCoverage, args): nan """ - norm_values = [args['scaleFactors'][i] * cov for i, cov in enumerate(tileCoverage)] + norm_values = [args["scaleFactors"][i] * cov for i, cov in enumerate(tileCoverage)] return np.mean(norm_values) def main(args=None): - args = parse_arguments().parse_args(args) - if len(sys.argv) == 1: - parse_arguments().print_help() - sys.exit() + parser = parse_arguments() + if args is None: + if len(sys.argv) == 1: + parser.print_help() + return + args = parser.parse_args(args) nFiles = len(args.bigwigs) @@ -105,19 +117,26 @@ def main(args=None): raise argparse.ArgumentTypeError( "Format of scaleFactors is factor or factor1:factor2... as many as bigwig files. " "There are {} bigwigs and {} factors." - "The value given ( {} ) is not valid".format(nFiles, len(scaleFactors), args.scaleFactors)) + "The value given ( {} ) is not valid".format( + nFiles, len(scaleFactors), args.scaleFactors + ) + ) else: scaleFactors = [1] * nFiles # the average function is called and receives # the function_args per each tile that is considered FUNC = average - function_args = {'scaleFactors': scaleFactors} + function_args = {"scaleFactors": scaleFactors} writeBedGraph_bam_and_bw.writeBedGraph( [(b, getType(b)) for b in args.bigwigs], - args.outFileName, 0, FUNC, - function_args, tileSize=args.binSize, region=args.region, + args.outFileName, + 0, + FUNC, + function_args, + tileSize=args.binSize, + region=args.region, blackListFileName=args.blackListFileName, verbose=args.verbose, numberOfProcessors=args.numberOfProcessors, @@ -125,4 +144,5 @@ def main(args=None): format=args.outFileFormat, smoothLength=False, missingDataAsZero=not args.skipNonCoveredRegions, - extendPairedEnds=False) + extendPairedEnds=False, + ) diff --git a/pydeeptools/deeptools/computeMatrix2.py b/pydeeptools/deeptools/computeMatrix2.py index a2b123e7e6..4b6081e481 100644 --- a/pydeeptools/deeptools/computeMatrix2.py +++ b/pydeeptools/deeptools/computeMatrix2.py @@ -1,17 +1,17 @@ - import argparse +import signal import sys -from deeptools.parserCommon import writableFile, numberOfProcessors -from deeptools import parserCommon from importlib.metadata import version + +from deeptools import parserCommon from deeptools.hp import r_computematrix -import signal +from deeptools.parserCommon import numberOfProcessors, writableFile + def parse_arguments(args=None): - parser = \ - argparse.ArgumentParser( - formatter_class=argparse.RawDescriptionHelpFormatter, - description=""" + parser = argparse.ArgumentParser( + formatter_class=argparse.RawDescriptionHelpFormatter, + description=""" This tool calculates scores per genome regions and prepares an intermediate file that can be used with ``plotHeatmap`` and ``plotProfiles``. Typically, the genome regions are genes, but any other regions defined in a BED file can be used. @@ -26,329 +26,425 @@ def parse_arguments(args=None): $ computeMatrix scale-regions --help """, - epilog='An example usage is:\n computeMatrix reference-point -S ' - ' -R -b 1000\n \n') + epilog="An example usage is:\n computeMatrix reference-point -S " + " -R -b 1000\n \n", + ) - parser.add_argument('--version', action='version', - version='%(prog)s {}'.format(version('deeptools'))) + parser.add_argument( + "--version", + action="version", + version="%(prog)s {}".format(version("deeptools")), + ) - subparsers = parser.add_subparsers( - title='Commands', - dest='command', - metavar='') + subparsers = parser.add_subparsers(title="Commands", dest="command", metavar="") # scale-regions mode options subparsers.add_parser( - 'scale-regions', + "scale-regions", formatter_class=argparse.ArgumentDefaultsHelpFormatter, parents=[ computeMatrixRequiredArgs(), computeMatrixOutputArgs(), - computeMatrixOptArgs(case='scale-regions'), - parserCommon.gtf_options() + computeMatrixOptArgs(case="scale-regions"), + parserCommon.gtf_options(), ], help="In the scale-regions mode, all regions in the BED file are " "stretched or shrunken to the length (in bases) indicated by the user.", - usage='An example usage is:\n computeMatrix scale-regions -S ' - ' -R -b 1000\n\n') + usage="An example usage is:\n computeMatrix scale-regions -S " + " -R -b 1000\n\n", + ) # reference point arguments subparsers.add_parser( - 'reference-point', + "reference-point", formatter_class=argparse.ArgumentDefaultsHelpFormatter, - parents=[computeMatrixRequiredArgs(), - computeMatrixOutputArgs(), - computeMatrixOptArgs(case='reference-point'), - parserCommon.gtf_options() - ], + parents=[ + computeMatrixRequiredArgs(), + computeMatrixOutputArgs(), + computeMatrixOptArgs(case="reference-point"), + parserCommon.gtf_options(), + ], help="Reference-point refers to a position within a BED region " "(e.g., the starting point). In this mode, only those genomic" "positions before (upstream) and/or after (downstream) of the " "reference point will be plotted.", - usage='An example usage is:\n computeMatrix reference-point -S ' - ' -R -a 3000 -b 3000\n\n') + usage="An example usage is:\n computeMatrix reference-point -S " + " -R -a 3000 -b 3000\n\n", + ) return parser def computeMatrixRequiredArgs(args=None): parser = argparse.ArgumentParser(add_help=False) - required = parser.add_argument_group('Required arguments') - required.add_argument('--regionsFileName', '-R', - metavar='File', - help='File name or names, in BED or GTF format, containing ' - 'the regions to plot. If multiple bed files are given, each one is considered a ' - 'group that can be plotted separately.', - nargs='+', - required=True) - required.add_argument('--scoreFileName', '-S', - help='bigWig file(s) containing ' - 'the scores to be plotted. Multiple files should be separated by spaced. BigWig ' - 'files can be obtained by using the bamCoverage ' - 'or bamCompare tools. More information about ' - 'the bigWig file format can be found at ' - 'http://genome.ucsc.edu/goldenPath/help/bigWig.html ', - metavar='File', - nargs='+', - required=True) + required = parser.add_argument_group("Required arguments") + required.add_argument( + "--regionsFileName", + "-R", + metavar="File", + help="File name or names, in BED or GTF format, containing " + "the regions to plot. If multiple bed files are given, each one is considered a " + "group that can be plotted separately.", + nargs="+", + required=True, + ) + required.add_argument( + "--scoreFileName", + "-S", + help="bigWig file(s) containing " + "the scores to be plotted. Multiple files should be separated by spaced. BigWig " + "files can be obtained by using the bamCoverage " + "or bamCompare tools. More information about " + "the bigWig file format can be found at " + "http://genome.ucsc.edu/goldenPath/help/bigWig.html ", + metavar="File", + nargs="+", + required=True, + ) return parser def computeMatrixOutputArgs(args=None): parser = argparse.ArgumentParser(add_help=False) - output = parser.add_argument_group('Output options') - output.add_argument('--outFileName', '-out', '-o', - help='File name to save the gzipped matrix file ' - 'needed by the "plotHeatmap" and "plotProfile" tools.', - type=writableFile, - required=True) - - output.add_argument('--outFileNameMatrix', - help='If this option is given, then the matrix ' - 'of values underlying the heatmap will be saved ' - 'using the indicated name, e.g. IndividualValues.tab.' - 'This matrix can easily be loaded into R or ' - 'other programs.', - metavar='FILE', - type=writableFile) - output.add_argument('--outFileSortedRegions', - help='File name in which the regions are saved ' - 'after skiping zeros or min/max threshold values. The ' - 'order of the regions in the file follows the sorting ' - 'order selected. This is useful, for example, to ' - 'generate other heatmaps keeping the sorting of the ' - 'first heatmap. Example: Heatmap1sortedRegions.bed', - metavar='BED file', - type=argparse.FileType('w')) + output = parser.add_argument_group("Output options") + output.add_argument( + "--outFileName", + "-out", + "-o", + help="File name to save the gzipped matrix file " + 'needed by the "plotHeatmap" and "plotProfile" tools.', + type=writableFile, + required=True, + ) + + output.add_argument( + "--outFileNameMatrix", + help="If this option is given, then the matrix " + "of values underlying the heatmap will be saved " + "using the indicated name, e.g. IndividualValues.tab." + "This matrix can easily be loaded into R or " + "other programs.", + metavar="FILE", + type=writableFile, + ) + output.add_argument( + "--outFileSortedRegions", + help="File name in which the regions are saved " + "after skiping zeros or min/max threshold values. The " + "order of the regions in the file follows the sorting " + "order selected. This is useful, for example, to " + "generate other heatmaps keeping the sorting of the " + "first heatmap. Example: Heatmap1sortedRegions.bed", + metavar="BED file", + type=argparse.FileType("w"), + ) return parser -def computeMatrixOptArgs(case=['scale-regions', 'reference-point'][0]): +def computeMatrixOptArgs(case=["scale-regions", "reference-point"][0]): parser = argparse.ArgumentParser(add_help=False) - optional = parser.add_argument_group('Optional arguments') - optional.add_argument('--version', action='version', - version='%(prog)s {}'.format(version('deeptools'))) - - if case == 'scale-regions': - optional.add_argument('--regionBodyLength', '-m', - default=1000, - type=int, - help='Distance in bases to which all regions will ' - 'be fit. (Default: %(default)s)') - optional.add_argument('--startLabel', - default='TSS', - help='Label shown in the plot for the start of ' - 'the region. Default is TSS (transcription ' - 'start site), but could be changed to anything, ' - 'e.g. "peak start". Note that this is only ' - 'useful if you plan to plot the results yourself ' - 'and not, for example, with plotHeatmap, which ' - 'will override this. (Default: %(default)s)') - optional.add_argument('--endLabel', - default='TES', - help='Label shown in the plot for the region ' - 'end. Default is TES (transcription end site). ' - 'See the --startLabel option for more ' - 'information. (Default: %(default)s) ') - optional.add_argument('--beforeRegionStartLength', '-b', '--upstream', - default=0, - type=int, - help='Distance upstream of the start site of ' - 'the regions defined in the region file. If the ' - 'regions are genes, this would be the distance ' - 'upstream of the transcription start site. (Default: %(default)s)') - optional.add_argument('--afterRegionStartLength', '-a', '--downstream', - default=0, - type=int, - help='Distance downstream of the end site ' - 'of the given regions. If the ' - 'regions are genes, this would be the distance ' - 'downstream of the transcription end site. (Default: %(default)s)') - optional.add_argument("--unscaled5prime", - default=0, - type=int, - help='Number of bases at the 5-prime end of the ' - 'region to exclude from scaling. By default, ' - 'each region is scaled to a given length (see the --regionBodyLength option). In some cases it is useful to look at unscaled signals around region boundaries, so this setting specifies the number of unscaled bases on the 5-prime end of each boundary. (Default: %(default)s)') - optional.add_argument("--unscaled3prime", - default=0, - type=int, - help='Like --unscaled5prime, but for the 3-prime ' - 'end. (Default: %(default)s)') - - elif case == 'reference-point': - optional.add_argument('--referencePoint', - default='TSS', - choices=['TSS', 'TES', 'center'], - help='The reference point for the plotting ' - 'could be either the region start (TSS), the ' - 'region end (TES) or the center of the region. ' - 'Note that regardless of what you specify, ' - 'plotHeatmap/plotProfile will default to using "TSS" as the ' - 'label. (Default: %(default)s)') + optional = parser.add_argument_group("Optional arguments") + optional.add_argument( + "--version", + action="version", + version="%(prog)s {}".format(version("deeptools")), + ) + + if case == "scale-regions": + optional.add_argument( + "--regionBodyLength", + "-m", + default=1000, + type=int, + help="Distance in bases to which all regions will " + "be fit. (Default: %(default)s)", + ) + optional.add_argument( + "--startLabel", + default="TSS", + help="Label shown in the plot for the start of " + "the region. Default is TSS (transcription " + "start site), but could be changed to anything, " + 'e.g. "peak start". Note that this is only ' + "useful if you plan to plot the results yourself " + "and not, for example, with plotHeatmap, which " + "will override this. (Default: %(default)s)", + ) + optional.add_argument( + "--endLabel", + default="TES", + help="Label shown in the plot for the region " + "end. Default is TES (transcription end site). " + "See the --startLabel option for more " + "information. (Default: %(default)s) ", + ) + optional.add_argument( + "--beforeRegionStartLength", + "-b", + "--upstream", + default=0, + type=int, + help="Distance upstream of the start site of " + "the regions defined in the region file. If the " + "regions are genes, this would be the distance " + "upstream of the transcription start site. (Default: %(default)s)", + ) + optional.add_argument( + "--afterRegionStartLength", + "-a", + "--downstream", + default=0, + type=int, + help="Distance downstream of the end site " + "of the given regions. If the " + "regions are genes, this would be the distance " + "downstream of the transcription end site. (Default: %(default)s)", + ) + optional.add_argument( + "--unscaled5prime", + default=0, + type=int, + help="Number of bases at the 5-prime end of the " + "region to exclude from scaling. By default, " + "each region is scaled to a given length (see the --regionBodyLength option). In some cases it is useful to look at unscaled signals around region boundaries, so this setting specifies the number of unscaled bases on the 5-prime end of each boundary. (Default: %(default)s)", + ) + optional.add_argument( + "--unscaled3prime", + default=0, + type=int, + help="Like --unscaled5prime, but for the 3-prime " + "end. (Default: %(default)s)", + ) + + elif case == "reference-point": + optional.add_argument( + "--referencePoint", + default="TSS", + choices=["TSS", "TES", "center"], + help="The reference point for the plotting " + "could be either the region start (TSS), the " + "region end (TES) or the center of the region. " + "Note that regardless of what you specify, " + 'plotHeatmap/plotProfile will default to using "TSS" as the ' + "label. (Default: %(default)s)", + ) # set region body length to zero for reference point mode - optional.add_argument('--regionBodyLength', help=argparse.SUPPRESS, - default=0, type=int) - optional.add_argument('--unscaled5prime', default=0, type=int, help=argparse.SUPPRESS) - optional.add_argument('--unscaled3prime', default=0, type=int, help=argparse.SUPPRESS) - optional.add_argument('--beforeRegionStartLength', '-b', '--upstream', - default=500, - type=int, - metavar='INT bp', - help='Distance upstream of the reference-point ' - 'selected. (Default: %(default)s)') - optional.add_argument('--afterRegionStartLength', '-a', '--downstream', - default=1500, - metavar='INT bp', - type=int, - help='Distance downstream of the ' - 'reference-point selected. (Default: %(default)s)') - optional.add_argument('--nanAfterEnd', - action='store_true', - help='If set, any values after the region end ' - 'are discarded. This is useful to visualize ' - 'the region end when not using the ' - 'scale-regions mode and when the reference-' - 'point is set to the TSS.') - - optional.add_argument('--binSize', '-bs', - help='Length, in bases, of the non-overlapping ' - 'bins for averaging the score over the ' - 'regions length. (Default: %(default)s)', - type=int, - default=10) - - optional.add_argument('--sortRegions', - help='Whether the output file should present the ' - 'regions sorted. The default (keep) retains order as in -R.' - 'Note that this is only useful if you plan to plot ' - 'the results yourself and not, for example, with ' - 'plotHeatmap, which will override this. (Default: %(default)s)', - choices=["descend", "ascend", "keep"], - default='keep') - - optional.add_argument('--sortUsing', - help='Indicate which method should be used for ' - 'sorting. The value is computed for each row.' - 'Note that the region_length option will lead ' - 'to a dotted line within the heatmap that indicates ' - 'the end of the regions. (Default: %(default)s)', - choices=["mean", "median", "max", "min", "sum", - "region_length"], - default='mean') - - optional.add_argument('--sortUsingSamples', - help='List of sample numbers (order as in matrix), ' - 'that are used for sorting by --sortUsing, ' - 'no value uses all samples, ' - 'example: --sortUsingSamples 1 3', - type=int, nargs='+') - - optional.add_argument('--averageTypeBins', - default='mean', - choices=["mean", "median", "min", - "max", "std", "sum"], - help='Define the type of statistic that should be ' - 'used over the bin size range. The ' - 'options are: "mean", "median", "min", "max", "sum" ' - 'and "std". The default is "mean". (Default: %(default)s)') - - optional.add_argument('--missingDataAsZero', - help='If set, missing data (NAs) will be treated as zeros. ' - 'The default is to ignore such cases, which will be depicted as black areas in ' - 'a heatmap. (see the --missingDataColor argument ' - 'of the plotHeatmap command for additional options).', - action='store_true') - - optional.add_argument('--skipZeros', - help='Whether regions with only scores of zero ' - 'should be included or not. Default is to include ' - 'them.', - action='store_true') - - optional.add_argument('--minThreshold', - default=None, - type=float, - help='Numeric value. Any region containing a ' - 'value that is less than or equal to this ' - 'will be skipped. This is useful to skip, ' - 'for example, genes where the read count is zero ' - 'for any of the bins. This could be the result of ' - 'unmappable areas and can bias the overall results. (Default: %(default)s)') - - optional.add_argument('--maxThreshold', - default=None, - type=float, - help='Numeric value. Any region containing a value ' - 'greater than or equal to this ' - 'will be skipped. The maxThreshold is useful to ' - 'skip those few regions with very high read counts ' - '(e.g. micro satellites) that may bias the average ' - 'values. (Default: %(default)s)') - - optional.add_argument('--blackListFileName', '-bl', - help="A BED file containing regions that should be excluded from all analyses. Currently this works by rejecting genomic chunks that happen to overlap an entry. Consequently, for BAM files, if a read partially overlaps a blacklisted region or a fragment spans over it, then the read/fragment might still be considered.", - metavar="BED file", - required=False) - - optional.add_argument('--samplesLabel', - help='Labels for the samples. This will then be passed to plotHeatmap and plotProfile. The ' - 'default is to use the file name of the ' - 'sample. The sample labels should be separated ' - 'by spaces and quoted if a label itself' - 'contains a space E.g. --samplesLabel label-1 "label 2" ', - nargs='+') - - optional.add_argument('--verbose', - help='Being VERY verbose in the status messages. --quiet will disable this.', - action='store_true') - - optional.add_argument('--scale', - help='If set, all values are multiplied by ' - 'this number. (Default: %(default)s)', - type=float, - default=1) - optional.add_argument('--numberOfProcessors', '-p', - help='Number of processors to use. Type "max/2" to ' - 'use half the maximum number of processors or "max" ' - 'to use all available processors. (Default: %(default)s)', - metavar="INT", - type=numberOfProcessors, - default=1, - required=False) + optional.add_argument( + "--regionBodyLength", help=argparse.SUPPRESS, default=0, type=int + ) + optional.add_argument( + "--unscaled5prime", default=0, type=int, help=argparse.SUPPRESS + ) + optional.add_argument( + "--unscaled3prime", default=0, type=int, help=argparse.SUPPRESS + ) + optional.add_argument( + "--beforeRegionStartLength", + "-b", + "--upstream", + default=500, + type=int, + metavar="INT bp", + help="Distance upstream of the reference-point " + "selected. (Default: %(default)s)", + ) + optional.add_argument( + "--afterRegionStartLength", + "-a", + "--downstream", + default=1500, + metavar="INT bp", + type=int, + help="Distance downstream of the " + "reference-point selected. (Default: %(default)s)", + ) + optional.add_argument( + "--nanAfterEnd", + action="store_true", + help="If set, any values after the region end " + "are discarded. This is useful to visualize " + "the region end when not using the " + "scale-regions mode and when the reference-" + "point is set to the TSS.", + ) + + optional.add_argument( + "--binSize", + "-bs", + help="Length, in bases, of the non-overlapping " + "bins for averaging the score over the " + "regions length. (Default: %(default)s)", + type=int, + default=10, + ) + + optional.add_argument( + "--sortRegions", + help="Whether the output file should present the " + "regions sorted. The default (keep) retains order as in -R." + "Note that this is only useful if you plan to plot " + "the results yourself and not, for example, with " + "plotHeatmap, which will override this. (Default: %(default)s)", + choices=["descend", "ascend", "keep"], + default="keep", + ) + + optional.add_argument( + "--sortUsing", + help="Indicate which method should be used for " + "sorting. The value is computed for each row." + "Note that the region_length option will lead " + "to a dotted line within the heatmap that indicates " + "the end of the regions. (Default: %(default)s)", + choices=["mean", "median", "max", "min", "sum", "region_length"], + default="mean", + ) + + optional.add_argument( + "--sortUsingSamples", + help="List of sample numbers (order as in matrix), " + "that are used for sorting by --sortUsing, " + "no value uses all samples, " + "example: --sortUsingSamples 1 3", + type=int, + nargs="+", + ) + + optional.add_argument( + "--averageTypeBins", + default="mean", + choices=["mean", "median", "min", "max", "std", "sum"], + help="Define the type of statistic that should be " + "used over the bin size range. The " + 'options are: "mean", "median", "min", "max", "sum" ' + 'and "std". The default is "mean". (Default: %(default)s)', + ) + + optional.add_argument( + "--missingDataAsZero", + help="If set, missing data (NAs) will be treated as zeros. " + "The default is to ignore such cases, which will be depicted as black areas in " + "a heatmap. (see the --missingDataColor argument " + "of the plotHeatmap command for additional options).", + action="store_true", + ) + + optional.add_argument( + "--skipZeros", + help="Whether regions with only scores of zero " + "should be included or not. Default is to include " + "them.", + action="store_true", + ) + + optional.add_argument( + "--minThreshold", + default=None, + type=float, + help="Numeric value. Any region containing a " + "value that is less than or equal to this " + "will be skipped. This is useful to skip, " + "for example, genes where the read count is zero " + "for any of the bins. This could be the result of " + "unmappable areas and can bias the overall results. (Default: %(default)s)", + ) + + optional.add_argument( + "--maxThreshold", + default=None, + type=float, + help="Numeric value. Any region containing a value " + "greater than or equal to this " + "will be skipped. The maxThreshold is useful to " + "skip those few regions with very high read counts " + "(e.g. micro satellites) that may bias the average " + "values. (Default: %(default)s)", + ) + + optional.add_argument( + "--blackListFileName", + "-bl", + help="A BED file containing regions that should be excluded from all analyses. Currently this works by rejecting genomic chunks that happen to overlap an entry. Consequently, for BAM files, if a read partially overlaps a blacklisted region or a fragment spans over it, then the read/fragment might still be considered.", + metavar="BED file", + required=False, + ) + + optional.add_argument( + "--samplesLabel", + help="Labels for the samples. This will then be passed to plotHeatmap and plotProfile. The " + "default is to use the file name of the " + "sample. The sample labels should be separated " + "by spaces and quoted if a label itself" + 'contains a space E.g. --samplesLabel label-1 "label 2" ', + nargs="+", + ) + + optional.add_argument( + "--verbose", + help="Being VERY verbose in the status messages. --quiet will disable this.", + action="store_true", + ) + + optional.add_argument( + "--scale", + help="If set, all values are multiplied by this number. (Default: %(default)s)", + type=float, + default=1, + ) + optional.add_argument( + "--numberOfProcessors", + "-p", + help='Number of processors to use. Type "max/2" to ' + 'use half the maximum number of processors or "max" ' + "to use all available processors. (Default: %(default)s)", + metavar="INT", + type=numberOfProcessors, + default=1, + required=False, + ) return parser def process_args(args=None): - args = parse_arguments().parse_args(args) - - if len(sys.argv) == 1: - parse_arguments().print_help() - sys.exit() + parser = parse_arguments() + if args is None: + if len(sys.argv) == 1: + parser.print_help() + return + args = parser.parse_args(args) # Ensure before and after region length is positive if args.beforeRegionStartLength < 0: - print(f"beforeRegionStartLength changed from {args.beforeRegionStartLength} into {abs(args.beforeRegionStartLength)}") + print( + f"beforeRegionStartLength changed from {args.beforeRegionStartLength} into {abs(args.beforeRegionStartLength)}" + ) args.beforeRegionStartLength = abs(args.beforeRegionStartLength) if args.afterRegionStartLength < 0: - print(f"afterRegionStartLength changed from {args.afterRegionStartLength} into {abs(args.afterRegionStartLength)}") + print( + f"afterRegionStartLength changed from {args.afterRegionStartLength} into {abs(args.afterRegionStartLength)}" + ) args.afterRegionStartLength = abs(args.afterRegionStartLength) - if args.command == 'scale-regions': + if args.command == "scale-regions": args.nanAfterEnd = False args.referencePoint = "" - elif args.command == 'reference-point': - if args.beforeRegionStartLength == 0 and \ - args.afterRegionStartLength == 0: - sys.exit("\nUpstrean and downstream regions are both " - "set to 0. Nothing to output. Maybe you want to " - "use the scale-regions mode?\n") + elif args.command == "reference-point": + if args.beforeRegionStartLength == 0 and args.afterRegionStartLength == 0: + sys.exit( + "\nUpstrean and downstream regions are both " + "set to 0. Nothing to output. Maybe you want to " + "use the scale-regions mode?\n" + ) if args.beforeRegionStartLength % args.binSize != 0: - sys.exit("\nThe --beforeRegionStartLength value must be a multiple of the --binSize value.") + sys.exit( + "\nThe --beforeRegionStartLength value must be a multiple of the --binSize value." + ) if args.afterRegionStartLength % args.binSize != 0: - sys.exit("\nThe --afterRegionStartLength value must be a multiple of the --binSize value.") + sys.exit( + "\nThe --afterRegionStartLength value must be a multiple of the --binSize value." + ) if not args.samplesLabel: args.samplesLabel = [] if not args.sortUsingSamples: @@ -364,25 +460,26 @@ def main(args=None): args = process_args(args) - parameters = {'upstream': args.beforeRegionStartLength, - 'downstream': args.afterRegionStartLength, - 'body': args.regionBodyLength, - 'bin size': args.binSize, - 'ref point': args.referencePoint, - 'verbose': args.verbose, - 'bin avg type': args.averageTypeBins, - 'missing data as zero': args.missingDataAsZero, - 'min threshold': args.minThreshold, - 'max threshold': args.maxThreshold, - 'scale': args.scale, - 'skip zeros': args.skipZeros, - 'nan after end': args.nanAfterEnd, - 'proc number': args.numberOfProcessors, - 'sort regions': args.sortRegions, - 'sort using': args.sortUsing, - 'unscaled 5 prime': args.unscaled5prime, - 'unscaled 3 prime': args.unscaled3prime - } + parameters = { + "upstream": args.beforeRegionStartLength, + "downstream": args.afterRegionStartLength, + "body": args.regionBodyLength, + "bin size": args.binSize, + "ref point": args.referencePoint, + "verbose": args.verbose, + "bin avg type": args.averageTypeBins, + "missing data as zero": args.missingDataAsZero, + "min threshold": args.minThreshold, + "max threshold": args.maxThreshold, + "scale": args.scale, + "skip zeros": args.skipZeros, + "nan after end": args.nanAfterEnd, + "proc number": args.numberOfProcessors, + "sort regions": args.sortRegions, + "sort using": args.sortUsing, + "unscaled 5 prime": args.unscaled5prime, + "unscaled 3 prime": args.unscaled3prime, + } signal.signal(signal.SIGINT, signal.SIG_DFL) r_computematrix( args.command, @@ -396,7 +493,7 @@ def main(args=None): args.regionBodyLength, args.binSize, args.missingDataAsZero, - args.keepExons, # --metagene or not. + args.keepExons, # --metagene or not. args.transcriptID, args.exonID, args.transcript_id_designator, @@ -412,5 +509,5 @@ def main(args=None): args.referencePoint, args.numberOfProcessors, args.verbose, - args.outFileName - ) \ No newline at end of file + args.outFileName, + ) diff --git a/pydeeptools/deeptools/multiBamSummary2.py b/pydeeptools/deeptools/multiBamSummary2.py index 25766acdc9..8096c9b292 100644 --- a/pydeeptools/deeptools/multiBamSummary2.py +++ b/pydeeptools/deeptools/multiBamSummary2.py @@ -1,25 +1,27 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +import argparse import os +import signal import sys -import argparse +from importlib.metadata import version + import numpy as np -import signal import deeptools.countReadsPerBin as countR from deeptools import parserCommon from deeptools.utilities import smartLabels -from importlib.metadata import version -old_settings = np.seterr(all='ignore') + +old_settings = np.seterr(all="ignore") from deeptools.hp import r_mbams + def parse_arguments(args=None): - parser = \ - argparse.ArgumentParser( - formatter_class=argparse.RawDescriptionHelpFormatter, - description=""" + parser = argparse.ArgumentParser( + formatter_class=argparse.RawDescriptionHelpFormatter, + description=""" ``multiBamSummary`` computes the read coverages for genomic regions for typically two or more BAM files. The analysis can be performed for the entire genome by running the program in 'bins' mode. @@ -37,167 +39,206 @@ def parse_arguments(args=None): """, - epilog='example usages:\n' - 'multiBamSummary bins --bamfiles file1.bam file2.bam -o results.npz \n\n' - 'multiBamSummary BED-file --BED selection.bed --bamfiles file1.bam file2.bam \n' - '-o results.npz' - ' \n\n', - conflict_handler='resolve') - - parser.add_argument('--version', action='version', - version='%(prog)s {}'.format(version('deeptools'))) + epilog="example usages:\n" + "multiBamSummary bins --bamfiles file1.bam file2.bam -o results.npz \n\n" + "multiBamSummary BED-file --BED selection.bed --bamfiles file1.bam file2.bam \n" + "-o results.npz" + " \n\n", + conflict_handler="resolve", + ) + + parser.add_argument( + "--version", + action="version", + version="%(prog)s {}".format(version("deeptools")), + ) subparsers = parser.add_subparsers( title="commands", - dest='command', - description='subcommands', - help='subcommands', - metavar='') + dest="command", + description="subcommands", + help="subcommands", + metavar="", + ) parent_parser = parserCommon.getParentArgParse(binSize=False) read_options_parser = parserCommon.read_options() # bins mode options subparsers.add_parser( - 'bins', + "bins", formatter_class=argparse.ArgumentDefaultsHelpFormatter, - parents=[bamcorrelate_args(case='bins'), - parent_parser, read_options_parser, - parserCommon.gtf_options(suppress=True) - ], + parents=[ + bamcorrelate_args(case="bins"), + parent_parser, + read_options_parser, + parserCommon.gtf_options(suppress=True), + ], help="The coverage calculation is done for consecutive bins of equal " - "size (10 kilobases by default). This mode is useful to assess the " - "genome-wide similarity of BAM files. The bin size and " - "distance between bins can be adjusted.", + "size (10 kilobases by default). This mode is useful to assess the " + "genome-wide similarity of BAM files. The bin size and " + "distance between bins can be adjusted.", add_help=False, - usage='%(prog)s ' - '--bamfiles file1.bam file2.bam ' - '-o results.npz \n' - 'help: multiBamSummary bins -h / multiBamSummary bins --help\n') + usage="%(prog)s " + "--bamfiles file1.bam file2.bam " + "-o results.npz \n" + "help: multiBamSummary bins -h / multiBamSummary bins --help\n", + ) # BED file arguments subparsers.add_parser( - 'BED-file', + "BED-file", formatter_class=argparse.ArgumentDefaultsHelpFormatter, - parents=[bamcorrelate_args(case='BED-file'), - parent_parser, read_options_parser, - parserCommon.gtf_options() - ], + parents=[ + bamcorrelate_args(case="BED-file"), + parent_parser, + read_options_parser, + parserCommon.gtf_options(), + ], help="The user provides a BED file that contains all regions " - "that should be considered for the coverage analysis. A " - "common use is to compare ChIP-seq coverages between two " - "different samples for a set of peak regions.", - usage='%(prog)s --BED selection.bed --bamfiles file1.bam file2.bam -o results.npz\n' - 'help: multiBamSummary BED-file -h / multiBamSummary bins --help\n', - add_help=False) + "that should be considered for the coverage analysis. A " + "common use is to compare ChIP-seq coverages between two " + "different samples for a set of peak regions.", + usage="%(prog)s --BED selection.bed --bamfiles file1.bam file2.bam -o results.npz\n" + "help: multiBamSummary BED-file -h / multiBamSummary bins --help\n", + add_help=False, + ) return parser -def bamcorrelate_args(case='bins'): +def bamcorrelate_args(case="bins"): parser = argparse.ArgumentParser(add_help=False) - required = parser.add_argument_group('Required arguments') + required = parser.add_argument_group("Required arguments") # define the arguments - required.add_argument('--bamfiles', '-b', - metavar='FILE1 FILE2', - help='List of indexed bam files separated by spaces.', - nargs='+', - required=True) - - required.add_argument('--outFileName', '-out', '-o', - help='File name to save the coverage matrix. This matrix ' - 'can be subsequently plotted using plotCorrelation or ' - 'or plotPCA.', - type=parserCommon.writableFile) - - optional = parser.add_argument_group('Optional arguments') - - optional.add_argument("--help", "-h", action="help", - help="show this help message and exit") - optional.add_argument('--labels', '-l', - metavar='sample1 sample2', - help='User defined labels instead of default labels from ' - 'file names. ' - 'Multiple labels have to be separated by a space, e.g. ' - '--labels sample1 sample2 sample3', - nargs='+') - optional.add_argument('--smartLabels', - action='store_true', - help='Instead of manually specifying labels for the input ' - 'BAM files, this causes deepTools to use the file name ' - 'after removing the path and extension.') - - optional.add_argument('--genomeChunkSize', - type=int, - default=None, - help='Manually specify the size of the genome provided to each processor. ' - 'The default value of None specifies that this is determined by read ' - 'density of the BAM file.') - - if case == 'bins': - optional.add_argument('--binSize', '-bs', - metavar='INT', - help='Length in bases of the window used ' - 'to sample the genome. (Default: %(default)s)', - default=10000, - type=int) - - optional.add_argument('--distanceBetweenBins', '-n', - metavar='INT', - help='By default, multiBamSummary considers consecutive ' - 'bins of the specified --binSize. However, to ' - 'reduce the computation time, a larger distance ' - 'between bins can by given. Larger distances ' - 'result in fewer bins considered. (Default: %(default)s)', - default=0, - type=int) - - required.add_argument('--BED', - help=argparse.SUPPRESS, - default=None) + required.add_argument( + "--bamfiles", + "-b", + metavar="FILE1 FILE2", + help="List of indexed bam files separated by spaces.", + nargs="+", + required=True, + ) + + required.add_argument( + "--outFileName", + "-out", + "-o", + help="File name to save the coverage matrix. This matrix " + "can be subsequently plotted using plotCorrelation or " + "or plotPCA.", + type=parserCommon.writableFile, + ) + + optional = parser.add_argument_group("Optional arguments") + + optional.add_argument( + "--help", "-h", action="help", help="show this help message and exit" + ) + optional.add_argument( + "--labels", + "-l", + metavar="sample1 sample2", + help="User defined labels instead of default labels from " + "file names. " + "Multiple labels have to be separated by a space, e.g. " + "--labels sample1 sample2 sample3", + nargs="+", + ) + optional.add_argument( + "--smartLabels", + action="store_true", + help="Instead of manually specifying labels for the input " + "BAM files, this causes deepTools to use the file name " + "after removing the path and extension.", + ) + + optional.add_argument( + "--genomeChunkSize", + type=int, + default=None, + help="Manually specify the size of the genome provided to each processor. " + "The default value of None specifies that this is determined by read " + "density of the BAM file.", + ) + + if case == "bins": + optional.add_argument( + "--binSize", + "-bs", + metavar="INT", + help="Length in bases of the window used " + "to sample the genome. (Default: %(default)s)", + default=10000, + type=int, + ) + + optional.add_argument( + "--distanceBetweenBins", + "-n", + metavar="INT", + help="By default, multiBamSummary considers consecutive " + "bins of the specified --binSize. However, to " + "reduce the computation time, a larger distance " + "between bins can by given. Larger distances " + "result in fewer bins considered. (Default: %(default)s)", + default=0, + type=int, + ) + + required.add_argument("--BED", help=argparse.SUPPRESS, default=None) else: - optional.add_argument('--binSize', '-bs', - help=argparse.SUPPRESS, - default=10000, - type=int) - - optional.add_argument('--distanceBetweenBins', '-n', - help=argparse.SUPPRESS, - metavar='INT', - default=0, - type=int) - - required.add_argument('--BED', - help='Limits the coverage analysis to ' - 'the regions specified in these files.', - metavar='FILE1.bed FILE2.bed', - nargs='+', - required=True) - - group = parser.add_argument_group('Output optional options') - - group.add_argument('--outRawCounts', - help='Save the counts per region to a tab-delimited file.', - type=parserCommon.writableFile, - metavar='FILE') - - group.add_argument('--scalingFactors', - help='Compute scaling factors (in the DESeq2 manner) ' - 'compatible for use with bamCoverage and write them to a ' - 'file. The file has tab-separated columns "sample" and ' - '"scalingFactor".', - type=parserCommon.writableFile, - metavar='FILE') + optional.add_argument( + "--binSize", "-bs", help=argparse.SUPPRESS, default=10000, type=int + ) + + optional.add_argument( + "--distanceBetweenBins", + "-n", + help=argparse.SUPPRESS, + metavar="INT", + default=0, + type=int, + ) + + required.add_argument( + "--BED", + help="Limits the coverage analysis to " + "the regions specified in these files.", + metavar="FILE1.bed FILE2.bed", + nargs="+", + required=True, + ) + + group = parser.add_argument_group("Output optional options") + + group.add_argument( + "--outRawCounts", + help="Save the counts per region to a tab-delimited file.", + type=parserCommon.writableFile, + metavar="FILE", + ) + + group.add_argument( + "--scalingFactors", + help="Compute scaling factors (in the DESeq2 manner) " + "compatible for use with bamCoverage and write them to a " + 'file. The file has tab-separated columns "sample" and ' + '"scalingFactor".', + type=parserCommon.writableFile, + metavar="FILE", + ) return parser def process_args(args=None): - args = parse_arguments().parse_args(args) - - if len(sys.argv) == 1: - parse_arguments().print_help() - sys.exit() + parser = parse_arguments() + if args is None: + if len(sys.argv) == 1: + parser.print_help() + return + args = parser.parse_args(args) if args.labels and len(args.bamfiles) != len(args.labels): print("The number of labels does not match the number of bam files.") @@ -215,7 +256,7 @@ def process_args(args=None): if not args.region: args.region = "None" if not args.blackListFileName: - args.blackListFileName = 'None' + args.blackListFileName = "None" else: if len(args.blackListFileName) != 1: print("Please only provide one blacklist file.") @@ -257,7 +298,7 @@ def main(args=None): """ args = process_args(args) - + signal.signal(signal.SIGINT, signal.SIG_DFL) r_mbams( args.command, @@ -284,5 +325,5 @@ def main(args=None): args.keepExons, args.transcriptID, args.exonID, - args.transcript_id_designator + args.transcript_id_designator, ) diff --git a/pydeeptools/deeptools/multiBigwigSummary.py b/pydeeptools/deeptools/multiBigwigSummary.py index 3a5bda19ab..bcf277ecc2 100644 --- a/pydeeptools/deeptools/multiBigwigSummary.py +++ b/pydeeptools/deeptools/multiBigwigSummary.py @@ -1,23 +1,24 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import sys import argparse import os.path +import sys +from importlib.metadata import version + import numpy as np + +import deeptools.getScorePerBigWigBin as score_bw from deeptools import parserCommon from deeptools.utilities import smartLabels -import deeptools.getScorePerBigWigBin as score_bw -from importlib.metadata import version -old_settings = np.seterr(all='ignore') +old_settings = np.seterr(all="ignore") def parse_arguments(args=None): - parser = \ - argparse.ArgumentParser( - formatter_class=argparse.RawDescriptionHelpFormatter, - description=""" + parser = argparse.ArgumentParser( + formatter_class=argparse.RawDescriptionHelpFormatter, + description=""" Given typically two or more bigWig files, ``multiBigwigSummary`` computes the average scores for each of the files in every genomic region. This analysis is performed for the entire genome by running the program in ``bins`` mode, or for certain user selected regions in ``BED-file`` @@ -33,77 +34,87 @@ def parse_arguments(args=None): """, - epilog='example usage:\n multiBigwigSummary bins ' - '-b file1.bw file2.bw -o results.npz\n\n' - 'multiBigwigSummary BED-file -b file1.bw file2.bw -o results.npz\n' - '--BED selection.bed' - ' \n\n', - conflict_handler='resolve') - - parser.add_argument('--version', action='version', - version='%(prog)s {}'.format(version('deeptools'))) - subparsers = parser.add_subparsers( - title="commands", - dest='command', - metavar='') + epilog="example usage:\n multiBigwigSummary bins " + "-b file1.bw file2.bw -o results.npz\n\n" + "multiBigwigSummary BED-file -b file1.bw file2.bw -o results.npz\n" + "--BED selection.bed" + " \n\n", + conflict_handler="resolve", + ) + + parser.add_argument( + "--version", + action="version", + version="%(prog)s {}".format(version("deeptools")), + ) + + subparsers = parser.add_subparsers(title="commands", dest="command", metavar="") parent_parser = parserCommon.getParentArgParse(binSize=False) # bins mode options subparsers.add_parser( - 'bins', + "bins", formatter_class=argparse.ArgumentDefaultsHelpFormatter, parents=[ - multiBigwigSummaryArgs(case='bins'), + multiBigwigSummaryArgs(case="bins"), parent_parser, - parserCommon.gtf_options(suppress=True) + parserCommon.gtf_options(suppress=True), ], help="The average score is based on equally sized bins " - "(10 kilobases by default), which consecutively cover the " - "entire genome. The only exception is the last bin of a chromosome, which " - "is often smaller. The output of this mode is commonly used to assess the " - "overall similarity of different bigWig files.", + "(10 kilobases by default), which consecutively cover the " + "entire genome. The only exception is the last bin of a chromosome, which " + "is often smaller. The output of this mode is commonly used to assess the " + "overall similarity of different bigWig files.", add_help=False, - usage='multiBigwigSummary bins ' - '-b file1.bw file2.bw ' - '-o results.npz\n' - 'help: multiBigwigSummary bins -h / multiBigwigSummary bins --help\n') + usage="multiBigwigSummary bins " + "-b file1.bw file2.bw " + "-o results.npz\n" + "help: multiBigwigSummary bins -h / multiBigwigSummary bins --help\n", + ) # BED file arguments subparsers.add_parser( - 'BED-file', + "BED-file", formatter_class=argparse.ArgumentDefaultsHelpFormatter, parents=[ - multiBigwigSummaryArgs(case='BED-file'), + multiBigwigSummaryArgs(case="BED-file"), parent_parser, - parserCommon.gtf_options() + parserCommon.gtf_options(), ], help="The user provides a BED file that contains all regions " - "that should be considered for the analysis. A " - "common use is to compare scores (e.g. ChIP-seq scores) between " - "different samples over a set of pre-defined peak regions.", - usage='multiBigwigSummary BED-file ' - '-b file1.bw file2.bw ' - '-o results.npz --BED selection.bed\n' - 'help: multiBigwigSummary BED-file -h / multiBigwigSummary BED-file --help\n', - add_help=False) + "that should be considered for the analysis. A " + "common use is to compare scores (e.g. ChIP-seq scores) between " + "different samples over a set of pre-defined peak regions.", + usage="multiBigwigSummary BED-file " + "-b file1.bw file2.bw " + "-o results.npz --BED selection.bed\n" + "help: multiBigwigSummary BED-file -h / multiBigwigSummary BED-file --help\n", + add_help=False, + ) return parser def process_args(args=None): - args = parse_arguments().parse_args(args) - if len(sys.argv) == 1: - parse_arguments().print_help() - sys.exit() + parser = parse_arguments() + if args is None: + if len(sys.argv) == 1: + parser.print_help() + return + args = parser.parse_args(args) if not args.labels and args.smartLabels: args.labels = smartLabels(args.bwfiles) elif not args.labels: args.labels = [] for f in args.bwfiles: - if f.startswith("http://") or f.startswith("https://") or f.startswith("ftp://"): + if ( + f.startswith("http://") + or f.startswith("https://") + or f.startswith("ftp://") + ): args.labels.append(f.split("/")[-1]) else: args.labels.append(os.path.basename(f)) @@ -114,92 +125,116 @@ def process_args(args=None): return args -def multiBigwigSummaryArgs(case='bins'): +def multiBigwigSummaryArgs(case="bins"): parser = argparse.ArgumentParser(add_help=False) - required = parser.add_argument_group('Required arguments') + required = parser.add_argument_group("Required arguments") # define the arguments - required.add_argument('--bwfiles', '-b', - metavar='FILE1 FILE2', - help='List of bigWig files, separated by spaces.', - nargs='+', - required=True) - - required.add_argument('--outFileName', '-out', '-o', - help='File name to save the compressed matrix file (npz format) ' - 'needed by the "plotPCA" and "plotCorrelation" tools.', - type=parserCommon.writableFile, - required=True) - - optional = parser.add_argument_group('Optional arguments') - - optional.add_argument("--help", "-h", action="help", - help="show this help message and exit") - optional.add_argument('--labels', '-l', - metavar='sample1 sample2', - help='User defined labels instead of default labels from ' - 'file names. ' - 'Multiple labels have to be separated by spaces, e.g., ' - '--labels sample1 sample2 sample3', - nargs='+') - optional.add_argument('--smartLabels', - action='store_true', - help='Instead of manually specifying labels for the input ' - 'bigWig files, this causes deepTools to use the file name ' - 'after removing the path and extension.') - - optional.add_argument('--chromosomesToSkip', - metavar='chr1 chr2', - help='List of chromosomes that you do not want to be included. ' - ' Useful to remove "random" or "extra" chr.', - nargs='+') - - if case == 'bins': - optional.add_argument('--binSize', '-bs', - metavar='INT', - help='Size (in bases) of the windows sampled ' - 'from the genome. (Default: %(default)s)', - default=10000, - type=int) - - optional.add_argument('--distanceBetweenBins', '-n', - metavar='INT', - help='By default, multiBigwigSummary considers adjacent ' - 'bins of the specified --binSize. However, to ' - 'reduce the computation time, a larger distance ' - 'between bins can be given. Larger distances ' - 'results in fewer considered bins. (Default: %(default)s)', - default=0, - type=int) - - required.add_argument('--BED', - help=argparse.SUPPRESS, - default=None) + required.add_argument( + "--bwfiles", + "-b", + metavar="FILE1 FILE2", + help="List of bigWig files, separated by spaces.", + nargs="+", + required=True, + ) + + required.add_argument( + "--outFileName", + "-out", + "-o", + help="File name to save the compressed matrix file (npz format) " + 'needed by the "plotPCA" and "plotCorrelation" tools.', + type=parserCommon.writableFile, + required=True, + ) + + optional = parser.add_argument_group("Optional arguments") + + optional.add_argument( + "--help", "-h", action="help", help="show this help message and exit" + ) + optional.add_argument( + "--labels", + "-l", + metavar="sample1 sample2", + help="User defined labels instead of default labels from " + "file names. " + "Multiple labels have to be separated by spaces, e.g., " + "--labels sample1 sample2 sample3", + nargs="+", + ) + optional.add_argument( + "--smartLabels", + action="store_true", + help="Instead of manually specifying labels for the input " + "bigWig files, this causes deepTools to use the file name " + "after removing the path and extension.", + ) + + optional.add_argument( + "--chromosomesToSkip", + metavar="chr1 chr2", + help="List of chromosomes that you do not want to be included. " + ' Useful to remove "random" or "extra" chr.', + nargs="+", + ) + + if case == "bins": + optional.add_argument( + "--binSize", + "-bs", + metavar="INT", + help="Size (in bases) of the windows sampled " + "from the genome. (Default: %(default)s)", + default=10000, + type=int, + ) + + optional.add_argument( + "--distanceBetweenBins", + "-n", + metavar="INT", + help="By default, multiBigwigSummary considers adjacent " + "bins of the specified --binSize. However, to " + "reduce the computation time, a larger distance " + "between bins can be given. Larger distances " + "results in fewer considered bins. (Default: %(default)s)", + default=0, + type=int, + ) + + required.add_argument("--BED", help=argparse.SUPPRESS, default=None) else: - optional.add_argument('--binSize', '-bs', - help=argparse.SUPPRESS, - default=10000, - type=int) - - optional.add_argument('--distanceBetweenBins', '-n', - help=argparse.SUPPRESS, - metavar='INT', - default=0, - type=int) - - required.add_argument('--BED', - help='Limits the analysis to ' - 'the regions specified in this file.', - metavar='file1.bed file2.bed', - nargs='+', - required=True) - - group = parser.add_argument_group('Output optional options') - - group.add_argument('--outRawCounts', - help='Save average scores per region for each bigWig file to a single tab-delimited file.', - type=parserCommon.writableFile, - metavar='FILE') + optional.add_argument( + "--binSize", "-bs", help=argparse.SUPPRESS, default=10000, type=int + ) + + optional.add_argument( + "--distanceBetweenBins", + "-n", + help=argparse.SUPPRESS, + metavar="INT", + default=0, + type=int, + ) + + required.add_argument( + "--BED", + help="Limits the analysis to the regions specified in this file.", + metavar="file1.bed file2.bed", + nargs="+", + required=True, + ) + + group = parser.add_argument_group("Output optional options") + + group.add_argument( + "--outRawCounts", + help="Save average scores per region for each bigWig file to a single tab-delimited file.", + type=parserCommon.writableFile, + metavar="FILE", + ) return parser @@ -214,15 +249,17 @@ def main(args=None): """ args = process_args(args) - if 'BED' in args: + if "BED" in args: bed_regions = args.BED else: bed_regions = None if len(args.bwfiles) == 1 and not args.outRawCounts: - sys.stderr.write("You've input a single bigWig file and not specified " - "--outRawCounts. The resulting output will NOT be " - "useful with any deepTools program!\n") + sys.stderr.write( + "You've input a single bigWig file and not specified " + "--outRawCounts. The resulting output will NOT be " + "useful with any deepTools program!\n" + ) num_reads_per_bin = score_bw.getScorePerBin( args.bwfiles, @@ -235,20 +272,20 @@ def main(args=None): bedFile=bed_regions, chrsToSkip=args.chromosomesToSkip, out_file_for_raw_data=args.outRawCounts, - allArgs=args) + allArgs=args, + ) - sys.stderr.write("Number of bins " - "found: {}\n".format(num_reads_per_bin.shape[0])) + sys.stderr.write("Number of bins found: {}\n".format(num_reads_per_bin.shape[0])) if num_reads_per_bin.shape[0] < 2: - exit("ERROR: too few non zero bins found.\n" - "If using --region please check that this " - "region is covered by reads.\n") + exit( + "ERROR: too few non zero bins found.\n" + "If using --region please check that this " + "region is covered by reads.\n" + ) f = open(args.outFileName, "wb") - np.savez_compressed(f, - matrix=num_reads_per_bin, - labels=args.labels) + np.savez_compressed(f, matrix=num_reads_per_bin, labels=args.labels) f.close() if args.outRawCounts: diff --git a/pydeeptools/deeptools/test/test_bamPEFragmentSize.py b/pydeeptools/deeptools/test/test_bamPEFragmentSize.py index f06ed5da47..92e9287457 100644 --- a/pydeeptools/deeptools/test/test_bamPEFragmentSize.py +++ b/pydeeptools/deeptools/test/test_bamPEFragmentSize.py @@ -1,9 +1,9 @@ -import deeptools.bamPEFragmentSize -from matplotlib.testing.compare import compare_images import os.path -import filecmp from os import unlink -from tempfile import NamedTemporaryFile + +from matplotlib.testing.compare import compare_images + +import deeptools.bamPEFragmentSize ROOT = os.path.dirname(os.path.abspath(__file__)) + "/test_data" @@ -12,34 +12,43 @@ def test_bamPEFragmentSize_histogram(): """ Test histogram plot for bamPEFragmentSize """ - outfile = '/tmp/test_histogram.png' - args = "--bamfiles {}/bowtie2_test1.bam --samplesLabel bowtie2_test1.bam --plotFileFormat png --plotTitle Test-Plot --histogram {}".format(ROOT, outfile).split() + outfile = "/tmp/test_histogram.png" + args = "--bamfiles {}/bowtie2_test1.bam --samplesLabel bowtie2_test1.bam --plotFileFormat png --plotTitle Test-Plot --histogram {}".format( + ROOT, outfile + ).split() deeptools.bamPEFragmentSize.main(args) - res = compare_images(ROOT + '/bamPEFragmentSize_histogram_result1.png', outfile, 10) + res = compare_images(ROOT + "/bamPEFragmentSize_histogram_result1.png", outfile, 10) assert res is None, res unlink(outfile) + def test_bamPEFragmentSize_fr_sizes(): """ Test fragment length information for bamPEFragmentSize """ - out_lengths = '/tmp/test_raw_frag_lengths.txt' - out_metrics = '/tmp/test_metrics_table.txt' - args = "--bamfiles {}/bowtie2_test1.bam --outRawFragmentLengths {} --table {}".format(ROOT, out_lengths, out_metrics).split() + out_lengths = "/tmp/test_raw_frag_lengths.txt" + out_metrics = "/tmp/test_metrics_table.txt" + args = ( + "--bamfiles {}/bowtie2_test1.bam --outRawFragmentLengths {} --table {}".format( + ROOT, out_lengths, out_metrics + ).split() + ) deeptools.bamPEFragmentSize.main(args) - l = open(out_lengths, 'r') + l = open(out_lengths, "r") l_resp = l.readlines() l.close() - l_expected = ['241\t1', '242\t1', '251\t1'] - matches = [expected for expected in l_expected if any(expected in resp for resp in l_resp)] + l_expected = ["241\t1", "242\t1", "251\t1"] + matches = [ + expected for expected in l_expected if any(expected in resp for resp in l_resp) + ] assert matches == l_expected - m = open(out_metrics, 'r') + m = open(out_metrics, "r") m_resp = m.readlines()[1] m.close() - m_expected = '3\t241.0\t241.5\t244.66666666666666\t242.0\t246.5\t251.0\t4.496912521077347\t1.0\t241.2\t241.4\t241.6\t241.8\t243.8\t245.6\t247.4\t249.2\t250.82\t3\t251.0\t251.0\t251.0\t251.0\t251.0\t251.0\t0.0\t0.0\t251.0\t251.0\t251.0\t251.0\t251.0\t251.0\t251.0\t251.0\t251.0\n' + m_expected = "3\t241.0\t241.5\t244.66666666666666\t242.0\t246.5\t251.0\t4.496912521077347\t1.0\t241.2\t241.4\t241.6\t241.8\t243.8\t245.6\t247.4\t249.2\t250.82\t3\t251.0\t251.0\t251.0\t251.0\t251.0\t251.0\t0.0\t0.0\t251.0\t251.0\t251.0\t251.0\t251.0\t251.0\t251.0\t251.0\t251.0\n" assert m_expected in f"{m_resp}" unlink(out_lengths) - unlink(out_metrics) \ No newline at end of file + unlink(out_metrics) diff --git a/pydeeptools/deeptools/test/test_data/bamPEFragmentSize_histogram_result1.png b/pydeeptools/deeptools/test/test_data/bamPEFragmentSize_histogram_result1.png index fd10ccb091..8268288a32 100644 Binary files a/pydeeptools/deeptools/test/test_data/bamPEFragmentSize_histogram_result1.png and b/pydeeptools/deeptools/test/test_data/bamPEFragmentSize_histogram_result1.png differ diff --git a/pydeeptools/deeptools/test/test_plotCoverage/plotCoverage_default.png b/pydeeptools/deeptools/test/test_plotCoverage/plotCoverage_default.png index b72642f9e0..f0f57324ef 100644 Binary files a/pydeeptools/deeptools/test/test_plotCoverage/plotCoverage_default.png and b/pydeeptools/deeptools/test/test_plotCoverage/plotCoverage_default.png differ diff --git a/pydeeptools/deeptools/test/test_plotEnrichment/plotEnrichment_defaults.png b/pydeeptools/deeptools/test/test_plotEnrichment/plotEnrichment_defaults.png index 176e3dc3fa..6f0f6f3caf 100644 Binary files a/pydeeptools/deeptools/test/test_plotEnrichment/plotEnrichment_defaults.png and b/pydeeptools/deeptools/test/test_plotEnrichment/plotEnrichment_defaults.png differ diff --git a/pydeeptools/deeptools/test/test_plotHeatmap/plotHeatmap_default.png b/pydeeptools/deeptools/test/test_plotHeatmap/plotHeatmap_default.png index fedc808fd1..606c1b4e22 100644 Binary files a/pydeeptools/deeptools/test/test_plotHeatmap/plotHeatmap_default.png and b/pydeeptools/deeptools/test/test_plotHeatmap/plotHeatmap_default.png differ diff --git a/pydeeptools/deeptools/test/test_plotProfile/plotProfile_default.png b/pydeeptools/deeptools/test/test_plotProfile/plotProfile_default.png index 338357505f..f7ba808a38 100644 Binary files a/pydeeptools/deeptools/test/test_plotProfile/plotProfile_default.png and b/pydeeptools/deeptools/test/test_plotProfile/plotProfile_default.png differ diff --git a/pyproject.toml b/pyproject.toml index c218cb5687..ffc2e8c6da 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,18 +26,18 @@ authors = [ {name="Thomas Manke"}, {email="bioinfo-core@ie-freiburg.mpg.de"} ] -requires-python = "> 3.9" +requires-python = ">= 3.12" dependencies = [ "numpy >= 2.0", "scipy >= 1.13", "matplotlib >= 3.9", "pysam >= 0.23", - "numpydoc >= 1.8", "pyBigWig >= 0.3", "py2bit >= 0.3", "pandas >= 2.2", "scikit-learn >= 1.6", - "deeptoolsintervals >= 0.1" + "deeptoolsintervals >= 0.1", + "maturin" ] description = "Useful tools for exploring deep sequencing data." license = {file = "LICENSE.txt"} @@ -52,7 +52,8 @@ actions = [ "pytest", "twine", "build", - "planemo" + "planemo", + "matplotlib == 3.11", # pin matplotlib version to avoid plots changing in pytests (font size defaults etc.) ] [project.urls] homepage = "https://pypi.python.org/pypi/deepTools/" @@ -90,3 +91,16 @@ bamCompare = "deeptools.bamCompare2:main" computeMatrix = "deeptools.computeMatrix2:main" #alignmentSieve = "deeptools.alignmentSieve2:main" multiBamSummary = "deeptools.multiBamSummary2:main" + +[tool.pixi.workspace] +channels = ["conda-forge", "bioconda"] +platforms = ["linux-64", "osx-arm64", "osx-64"] +[tool.pixi.dependencies] +libclang = "<22" +clangdev = "<22" +htslib = "<=1.19" +zlib = "*" +[tool.pixi.pypi-dependencies] +deeptools = { path = ".", editable = true, extras = ['actions'] } +[tool.pixi.activation.env] +LIBCLANG_PATH = "$CONDA_PREFIX/lib" diff --git a/src/alignmentsieve.rs b/src/alignmentsieve.rs index c8998c588e..d680c8eb21 100644 --- a/src/alignmentsieve.rs +++ b/src/alignmentsieve.rs @@ -1,35 +1,35 @@ +use crate::covcalc::{parse_regions, Region}; +use crate::filehandler::{is_bed_or_gtf, read_bedfile}; +use crate::filtering::Alignmentfilters; use pyo3::prelude::*; use pyo3::types::PyList; use rayon::prelude::*; use rayon::ThreadPoolBuilder; use rust_htslib::bam::{self, Header, IndexedReader, Read, Reader, Writer}; -use tempfile::{Builder, TempPath}; use std::fs::File; use std::io::Write; -use crate::covcalc::{parse_regions, Region}; -use crate::filtering::Alignmentfilters; -use crate::filehandler::{is_bed_or_gtf, read_bedfile}; +use tempfile::{Builder, TempPath}; #[pyfunction] pub fn r_alignmentsieve( - bamifile: &str, // input bamfile - ofile: &str, // output file - nproc: usize, // threads - filter_metrics: &str, // filter metrics file. + py: Python, + bamifile: &str, // input bamfile + ofile: &str, // output file + nproc: usize, // threads + filter_metrics: &str, // filter metrics file. filtered_out_readsfile: &str, // filtered_out_reads bam/bedfile. - verbose: bool, // verbose - shift: Py, // python list of the shift to perform. - _bed: bool, // output format in BEDPE. - filterrnastrand: &str, // "forward", "reverse" or "None". - minmappingquality: u8, // minimum mapping quality. - samflaginclude: u16, // sam flag include - samflagexclude: u16, // sam flag exclude - blacklist: &str, // blacklist file name. - minfraglen: u32, // minimum fragment length. - maxfraglen: u32, // maximum fragment length. + verbose: bool, // verbose + shift: Py, // python list of the shift to perform. + _bed: bool, // output format in BEDPE. + filterrnastrand: &str, // "forward", "reverse" or "None". + minmappingquality: u8, // minimum mapping quality. + samflaginclude: u16, // sam flag include + samflagexclude: u16, // sam flag exclude + blacklist: &str, // blacklist file name. + minfraglen: u32, // minimum fragment length. + maxfraglen: u32, // maximum fragment length. _extend_reads: u32, _center_reads: bool, - ) -> PyResult<()> { // Input bam file let bam = Reader::from_path(bamifile).unwrap(); @@ -40,13 +40,10 @@ pub fn r_alignmentsieve( if filtered_out_readsfile != "None" { write_filters = true; } - let mut readshift: Vec = Vec::new(); - Python::with_gil(|py| { - readshift = shift.extract(py).expect("Failed to extract shift."); - }); + let readshift: Vec = shift.extract(py).expect("Failed to extract shift"); // shift is of length 0, 2, or 4. - // Define regions + // Define regions let (regions, chromsizes) = parse_regions("None", vec![bamifile]); // If there is a blacklist, read it. let mut backlistregions: Option> = None; @@ -56,10 +53,11 @@ pub fn r_alignmentsieve( match isbed.as_str() { "gtf" => panic!("Error: Please provide a bed file for the blacklist."), "bed" => { - let (bls, _) = read_bedfile(&blacklist.to_string(), false, chromsizes.keys().collect()); + let (bls, _) = + read_bedfile(&blacklist.to_string(), false, chromsizes.keys().collect()); backlistregions = Some(bls); - }, - _ => panic!("Error: Cannot determine filetype of blacklist file.") + } + _ => panic!("Error: Cannot determine filetype of blacklist file."), } } @@ -79,17 +77,29 @@ pub fn r_alignmentsieve( ); let pool = ThreadPoolBuilder::new().num_threads(1).build().unwrap(); let (sieve, filtersieve, totalreads, filteredreads) = pool.install(|| { - regions.par_iter() - .map(|i| sieve_bamregion(bamifile, i, &filters, &readshift, write_filters, nproc, verbose)) + regions + .par_iter() + .map(|i| { + sieve_bamregion( + bamifile, + i, + &filters, + &readshift, + write_filters, + nproc, + verbose, + ) + }) .reduce( || (Vec::new(), Vec::new(), 0, 0), - |(mut _sieve, mut _filtersieve, mut _total, mut _filter), (sieve, filtersieve, total, filter)| { + |(mut _sieve, mut _filtersieve, mut _total, mut _filter), + (sieve, filtersieve, total, filter)| { _sieve.extend(sieve); _filtersieve.extend(filtersieve); _total += total; _filter += filter; (_sieve, _filtersieve, _total, _filter) - } + }, ) }); @@ -107,7 +117,8 @@ pub fn r_alignmentsieve( } // write filtered reads if necessary if write_filters { - let mut ofilterbam = Writer::from_path(filtered_out_readsfile, &header, bam::Format::Bam).unwrap(); + let mut ofilterbam = + Writer::from_path(filtered_out_readsfile, &header, bam::Format::Bam).unwrap(); let _ = ofilterbam.set_threads(nproc); for sb in filtersieve.into_iter() { if let Some(sb) = sb { @@ -127,15 +138,33 @@ pub fn r_alignmentsieve( // write header writeln!(of, "#bamFilterReads --filterMetrics").unwrap(); writeln!(of, "#File\tReads\tRemaining Total\tInitial Reads").unwrap(); - writeln!(of, "{}\t{}\t{}", bamifile, totalreads-filteredreads, totalreads).unwrap(); + writeln!( + of, + "{}\t{}\t{}", + bamifile, + totalreads - filteredreads, + totalreads + ) + .unwrap(); } Ok(()) } - -fn sieve_bamregion(ibam: &str, regstruct: &Region, alfilters: &Alignmentfilters, _shift: &Vec, write_filters: bool, nproc: usize, verbose: bool) -> (Vec>, Vec>, u64, u64) { - let region = (regstruct.chrom.clone(), regstruct.get_startu(), regstruct.get_endu()); +fn sieve_bamregion( + ibam: &str, + regstruct: &Region, + alfilters: &Alignmentfilters, + _shift: &Vec, + write_filters: bool, + nproc: usize, + verbose: bool, +) -> (Vec>, Vec>, u64, u64) { + let region = ( + regstruct.chrom.clone(), + regstruct.get_startu(), + regstruct.get_endu(), + ); let mut total_reads: u64 = 0; let mut filtered_reads: u64 = 0; let mut bam = IndexedReader::from_path(ibam).unwrap(); @@ -201,7 +230,7 @@ fn sieve_bamregion(ibam: &str, regstruct: &Region, alfilters: &Alignmentfilters, } continue; } - + // SAM flags if alfilters.samflaginclude != 0 && (record.flags() & alfilters.samflaginclude) == 0 { filtered_reads += 1; @@ -223,7 +252,9 @@ fn sieve_bamregion(ibam: &str, regstruct: &Region, alfilters: &Alignmentfilters, // fragment length if alfilters.minfraglen != 0 || alfilters.maxfraglen != 0 { if record.is_paired() { - if record.insert_size().abs() < alfilters.minfraglen as i64 || record.insert_size().abs() > alfilters.maxfraglen as i64 { + if record.insert_size().abs() < alfilters.minfraglen as i64 + || record.insert_size().abs() > alfilters.maxfraglen as i64 + { filtered_reads += 1; if let Some(filterbamout) = &mut filterbamout { filterbamout.write(&record).unwrap(); @@ -264,7 +295,7 @@ fn sieve_bamregion(ibam: &str, regstruct: &Region, alfilters: &Alignmentfilters, } continue; } - }, + } ("forward", false) => { if !(record.flags() & 16 == 16) { filtered_reads += 1; @@ -274,7 +305,7 @@ fn sieve_bamregion(ibam: &str, regstruct: &Region, alfilters: &Alignmentfilters, } continue; } - }, + } ("reverse", true) => { if !((record.flags() & 144 == 144) || (record.flags() & 96 == 96)) { filtered_reads += 1; @@ -284,7 +315,7 @@ fn sieve_bamregion(ibam: &str, regstruct: &Region, alfilters: &Alignmentfilters, } continue; } - }, + } ("reverse", false) => { if !(record.flags() & 16 == 0) { filtered_reads += 1; @@ -294,8 +325,8 @@ fn sieve_bamregion(ibam: &str, regstruct: &Region, alfilters: &Alignmentfilters, } continue; } - }, - _ => {}, + } + _ => {} } } sievebamout.write(&record).unwrap(); @@ -303,18 +334,24 @@ fn sieve_bamregion(ibam: &str, regstruct: &Region, alfilters: &Alignmentfilters, } match (written, filterwritten) { - (true, true) => { - (vec![Some(sievebam_path)], vec![Some(filterbam_path)], total_reads, filtered_reads) - }, - (true, false) => { - (vec![Some(sievebam_path)], vec![None], total_reads, filtered_reads) - }, - (false, true) => { - (vec![None], vec![Some(filterbam_path)], total_reads, filtered_reads) - }, - (false, false) => { - (vec![None], vec![None], total_reads, filtered_reads) - } + (true, true) => ( + vec![Some(sievebam_path)], + vec![Some(filterbam_path)], + total_reads, + filtered_reads, + ), + (true, false) => ( + vec![Some(sievebam_path)], + vec![None], + total_reads, + filtered_reads, + ), + (false, true) => ( + vec![None], + vec![Some(filterbam_path)], + total_reads, + filtered_reads, + ), + (false, false) => (vec![None], vec![None], total_reads, filtered_reads), } - -} \ No newline at end of file +} diff --git a/src/bamcompare.rs b/src/bamcompare.rs index 959d31ad11..32d0c1a709 100644 --- a/src/bamcompare.rs +++ b/src/bamcompare.rs @@ -1,25 +1,26 @@ +use crate::calc::{calc_ratio, median}; +use crate::covcalc::{bam_pileup, parse_regions, region_divider, Region, TempZip}; +use crate::filehandler::{bam_ispaired, is_bed_or_gtf, read_bedfile, write_covfile}; +use crate::filtering::Alignmentfilters; +use crate::normalization::scale_factor_bamcompare; +use bigtools::Value; +use itertools::Itertools; use pyo3::prelude::*; use pyo3::types::PyList; use rayon::prelude::*; use rayon::ThreadPoolBuilder; -use std::io::prelude::*; -use std::io::{BufReader}; use std::fs::File; -use itertools::Itertools; -use bigtools::{Value}; -use crate::filehandler::{bam_ispaired, write_covfile, is_bed_or_gtf, read_bedfile}; -use crate::covcalc::{bam_pileup, parse_regions, TempZip, region_divider, Region}; -use crate::filtering::Alignmentfilters; -use crate::normalization::{scale_factor_bamcompare}; -use crate::calc::{median, calc_ratio}; -use tempfile::{TempPath}; +use std::io::prelude::*; +use std::io::BufReader; +use tempfile::TempPath; #[pyfunction] pub fn r_bamcompare( + py: Python, // input and output bamifile1: &str, // input bamfile 1 bamifile2: &str, // input bamfile 2 - ofile: &str, // output file + ofile: &str, // output file ofiletype: &str, // ouput file type, bedgraph or bigwig // norm options norm: &str, @@ -31,11 +32,11 @@ pub fn r_bamcompare( pseudocount1: f32, pseudocount2: f32, // filtering options - extendreads: bool, // if 0, no extension + extendreads: bool, // if 0, no extension extendreadslen: u32, // length of extension (0 if PE or if not extending) centerreads: bool, - blacklist: &str, // path to blacklist filename, or 'None' - minmappingquality: u8, // + blacklist: &str, // path to blacklist filename, or 'None' + minmappingquality: u8, // samflaginclude: u16, samflagexclude: u16, minfraglen: u32, @@ -47,7 +48,7 @@ pub fn r_bamcompare( binsize: u32, supregion: &str, verbose: bool, - collapse: bool + collapse: bool, ) -> PyResult<()> { let ispe1 = bam_ispaired(bamifile1); let ispe2 = bam_ispaired(bamifile2); @@ -56,14 +57,12 @@ pub fn r_bamcompare( println!("Sample1: {} is-paired: {}", bamifile1, ispe1); println!("Sample2: {} is-paired: {}", bamifile2, ispe2); } - let mut ignorechr: Vec = Vec::new(); - Python::with_gil(|py| { - ignorechr = _ignorechr.extract(py).expect("Failed to retrieve ignorechr."); - }); + let ignorechr: Vec = _ignorechr + .extract(py) + .expect("Failed to retrieve ignorechr."); - - // Parse regions & calculate coverage. Note that - let (regions, chromsizes) = parse_regions(supregion, vec![bamifile1, bamifile2]); + // Parse regions & calculate coverage. Note that + let (regions, chromsizes) = parse_regions(supregion, vec![bamifile1, bamifile2]); let regionblocks = region_divider(®ions); // If there is a blacklist, read it. @@ -74,13 +73,14 @@ pub fn r_bamcompare( match isbed.as_str() { "gtf" => panic!("Error: Please provide a bed file for the blacklist."), "bed" => { - let (bls, _) = read_bedfile(&blacklist.to_string(), false, chromsizes.keys().collect()); + let (bls, _) = + read_bedfile(&blacklist.to_string(), false, chromsizes.keys().collect()); blacklistregions = Some(bls); - }, - _ => panic!("Error: Cannot determine filetype of blacklist file.") + } + _ => panic!("Error: Cannot determine filetype of blacklist file."), } } - // + // // Set alignment filters let mut filter1 = Alignmentfilters::new( blacklistregions, @@ -107,37 +107,51 @@ pub fn r_bamcompare( // We need a pass over the bamfile already to get the mean fragment length. filter1.set_extendreadslen(bamifile1, nproc, ®ions); if verbose { - println!("fragment length for read extension set as: {} for bamfile 1", filter1.extendreadslen); + println!( + "fragment length for read extension set as: {} for bamfile 1", + filter1.extendreadslen + ); } } if filter2.extendreads && filter2.extendreadslen == 0 && ispe2 { // We need a pass over the bamfile already to get the mean fragment length. filter2.set_extendreadslen(bamifile2, nproc, ®ions); if verbose { - println!("fragment length for read extension set as: {} for bamfile 2", filter2.extendreadslen); + println!( + "fragment length for read extension set as: {} for bamfile 2", + filter2.extendreadslen + ); } } let pool = ThreadPoolBuilder::new().num_threads(nproc).build().unwrap(); - + // Set up the bam files in a Vec. - let bamfiles: Vec<(&str, bool, &Alignmentfilters)> = vec![(bamifile1, ispe1, &filter1), (bamifile2, ispe2, &filter2)]; + let bamfiles: Vec<(&str, bool, &Alignmentfilters)> = + vec![(bamifile1, ispe1, &filter1), (bamifile2, ispe2, &filter2)]; let mut covcalcs: Vec = pool.install(|| { - bamfiles.par_iter() + bamfiles + .par_iter() .map(|(bamfile, ispe, alfilter)| { - let (bg, mapped, unmapped, readlen, fraglen) = regionblocks.par_iter() - .map(|i| bam_pileup(bamfile, &i, &binsize, &ispe, &ignorechr, alfilter , false, false, true)) + let (bg, mapped, unmapped, readlen, fraglen) = regionblocks + .par_iter() + .map(|i| { + bam_pileup( + bamfile, &i, &binsize, &ispe, &ignorechr, alfilter, false, false, true, + ) + }) .reduce( || (vec![], 0, 0, vec![], vec![]), - |(mut _bg, mut _mapped, mut _unmapped, mut _readlen, mut _fraglen), (bg, mapped, unmapped, readlen, fraglen)| { + |(mut _bg, mut _mapped, mut _unmapped, mut _readlen, mut _fraglen), + (bg, mapped, unmapped, readlen, fraglen)| { _bg.extend(bg); _readlen.extend(readlen); _fraglen.extend(fraglen); _mapped += mapped; _unmapped += unmapped; (_bg, _mapped, _unmapped, _readlen, _fraglen) - } + }, ); ParsedBamFile { bamfile: bamfile, @@ -146,25 +160,46 @@ pub fn r_bamcompare( mapped: mapped, unmapped: unmapped, readlen: median(readlen), - fraglen: median(fraglen) + fraglen: median(fraglen), } }) - .collect() + .collect() }); // Print out some stats if verbose if verbose { println!("bamfile\tPE\tmapped\tunmapped\tmed_readlen\tmed_fraglen"); - println!("{}\t{}\t{}\t{}\t{}\t{}", covcalcs[0].bamfile, covcalcs[0].ispe, covcalcs[0].mapped, covcalcs[0].unmapped, covcalcs[0].readlen, covcalcs[0].fraglen); - println!("{}\t{}\t{}\t{}\t{}\t{}", covcalcs[1].bamfile, covcalcs[1].ispe, covcalcs[1].mapped, covcalcs[1].unmapped, covcalcs[1].readlen, covcalcs[1].fraglen); + println!( + "{}\t{}\t{}\t{}\t{}\t{}", + covcalcs[0].bamfile, + covcalcs[0].ispe, + covcalcs[0].mapped, + covcalcs[0].unmapped, + covcalcs[0].readlen, + covcalcs[0].fraglen + ); + println!( + "{}\t{}\t{}\t{}\t{}\t{}", + covcalcs[1].bamfile, + covcalcs[1].ispe, + covcalcs[1].mapped, + covcalcs[1].unmapped, + covcalcs[1].readlen, + covcalcs[1].fraglen + ); } // Calculate scale factors. - + let mut sf = scale_factor_bamcompare( scalefactorsmethod, - covcalcs[0].mapped, covcalcs[1].mapped, - binsize, effective_genome_size, norm, - covcalcs[0].readlen, covcalcs[1].readlen, - covcalcs[0].fraglen, covcalcs[1].fraglen, + covcalcs[0].mapped, + covcalcs[1].mapped, + binsize, + effective_genome_size, + norm, + covcalcs[0].readlen, + covcalcs[1].readlen, + covcalcs[0].fraglen, + covcalcs[1].fraglen, ); if given_sf1 != 0.0 || given_sf2 != 0.0 { if verbose { @@ -174,33 +209,55 @@ pub fn r_bamcompare( } else if verbose { println!("scale factor1 = {}, scale factor2 = {}", sf.0, sf.1); } - + // Extract both vecs of TempPaths into a single vector let its = vec![ covcalcs[0].bg.drain(..).collect::>(), - covcalcs[1].bg.drain(..).collect::>() + covcalcs[1].bg.drain(..).collect::>(), ]; let its: Vec<_> = its.iter().map(|x| x.into_iter()).collect(); let zips = TempZip { iterators: its }; let zips_vec: Vec<_> = zips.collect(); if collapse { - let lines = zips_vec - .into_iter() - .flat_map(|c| { - let readers: Vec<_> = c.into_iter().map(|x| BufReader::new(File::open(x).unwrap()).lines()).collect(); - let temp_zip = TempZip { iterators: readers }; - temp_zip.into_iter().filter_map(|mut _l| { + let lines = zips_vec.into_iter().flat_map(|c| { + let readers: Vec<_> = c + .into_iter() + .map(|x| BufReader::new(File::open(x).unwrap()).lines()) + .collect(); + let temp_zip = TempZip { iterators: readers }; + temp_zip + .into_iter() + .filter_map(|mut _l| { let lines: Vec<_> = _l .iter_mut() .map(|x| x.as_mut().unwrap()) .map(|x| x.split('\t').collect()) - .map(|x: Vec<&str>| (x[0].to_string(), x[1].parse::().unwrap(), x[2].parse::().unwrap(), x[3].parse::().unwrap())) + .map(|x: Vec<&str>| { + ( + x[0].to_string(), + x[1].parse::().unwrap(), + x[2].parse::().unwrap(), + x[3].parse::().unwrap(), + ) + }) .collect(); assert_eq!(lines.len(), 2); - assert_eq!(lines[0].0, lines[1].0, "Error: Chromosome mismatch in bam files. {} != {}", lines[0].0, lines[1].0); - assert_eq!(lines[0].1, lines[1].1, "Error: Start position mismatch in bam files. {} != {}", lines[0].1, lines[1].1); - assert_eq!(lines[0].2, lines[1].2, "Error: End position mismatch in bam files. {} != {}", lines[0].2, lines[1].2); + assert_eq!( + lines[0].0, lines[1].0, + "Error: Chromosome mismatch in bam files. {} != {}", + lines[0].0, lines[1].0 + ); + assert_eq!( + lines[0].1, lines[1].1, + "Error: Start position mismatch in bam files. {} != {}", + lines[0].1, lines[1].1 + ); + assert_eq!( + lines[0].2, lines[1].2, + "Error: End position mismatch in bam files. {} != {}", + lines[0].2, lines[1].2 + ); // Calculate the coverage. if skip_zero_over_zero && lines[0].3 == 0.0 && lines[1].3 == 0.0 { return None; @@ -209,12 +266,35 @@ pub fn r_bamcompare( } else if skip_non_covered_regions && lines[1].3 == 0.0 { return None; } else { - let cov = calc_ratio(lines[0].3, lines[1].3, &sf.0, &sf.1, &pseudocount1, &pseudocount2, operation); - Some((lines[0].0.clone(), Value { start: lines[0].1, end: lines[0].2, value: cov })) + let cov = calc_ratio( + lines[0].3, + lines[1].3, + &sf.0, + &sf.1, + &pseudocount1, + &pseudocount2, + operation, + ); + Some(( + lines[0].0.clone(), + Value { + start: lines[0].1, + end: lines[0].2, + value: cov, + }, + )) } - }).coalesce(|p, c| { + }) + .coalesce(|p, c| { if p.1.value == c.1.value && p.0 == c.0 { - Ok((p.0, Value {start: p.1.start, end: c.1.end, value: p.1.value})) + Ok(( + p.0, + Value { + start: p.1.start, + end: c.1.end, + value: p.1.value, + }, + )) } else { Err((p, c)) } @@ -222,34 +302,69 @@ pub fn r_bamcompare( }); write_covfile(lines, ofile, ofiletype, chromsizes); } else { - let lines = zips_vec - .into_iter() - .flat_map(|c| { - let readers: Vec<_> = c.into_iter().map(|x| BufReader::new(File::open(x).unwrap()).lines()).collect(); - let temp_zip = TempZip { iterators: readers }; - temp_zip.into_iter().filter_map(|mut _l| { - let lines: Vec<_> = _l - .iter_mut() - .map(|x| x.as_mut().unwrap()) - .map(|x| x.split('\t').collect()) - .map(|x: Vec<&str>| (x[0].to_string(), x[1].parse::().unwrap(), x[2].parse::().unwrap(), x[3].parse::().unwrap())) - .collect(); - assert_eq!(lines.len(), 2); - assert_eq!(lines[0].0, lines[1].0, "Error: Chromosome mismatch in bam files. {} != {}", lines[0].0, lines[1].0); - assert_eq!(lines[0].1, lines[1].1, "Error: Start position mismatch in bam files. {} != {}", lines[0].1, lines[1].1); - assert_eq!(lines[0].2, lines[1].2, "Error: End position mismatch in bam files. {} != {}", lines[0].2, lines[1].2); - // Calculate the coverage. - if skip_zero_over_zero && lines[0].3 == 0.0 && lines[1].3 == 0.0 { - return None; - } else if skip_non_covered_regions && lines[0].3 == 0.0 { - return None; - } else if skip_non_covered_regions && lines[1].3 == 0.0 { - return None; - } else { - let cov = calc_ratio(lines[0].3, lines[1].3, &sf.0, &sf.1, &pseudocount1, &pseudocount2, operation); - Some((lines[0].0.clone(), Value { start: lines[0].1, end: lines[0].2, value: cov })) - } - }) + let lines = zips_vec.into_iter().flat_map(|c| { + let readers: Vec<_> = c + .into_iter() + .map(|x| BufReader::new(File::open(x).unwrap()).lines()) + .collect(); + let temp_zip = TempZip { iterators: readers }; + temp_zip.into_iter().filter_map(|mut _l| { + let lines: Vec<_> = _l + .iter_mut() + .map(|x| x.as_mut().unwrap()) + .map(|x| x.split('\t').collect()) + .map(|x: Vec<&str>| { + ( + x[0].to_string(), + x[1].parse::().unwrap(), + x[2].parse::().unwrap(), + x[3].parse::().unwrap(), + ) + }) + .collect(); + assert_eq!(lines.len(), 2); + assert_eq!( + lines[0].0, lines[1].0, + "Error: Chromosome mismatch in bam files. {} != {}", + lines[0].0, lines[1].0 + ); + assert_eq!( + lines[0].1, lines[1].1, + "Error: Start position mismatch in bam files. {} != {}", + lines[0].1, lines[1].1 + ); + assert_eq!( + lines[0].2, lines[1].2, + "Error: End position mismatch in bam files. {} != {}", + lines[0].2, lines[1].2 + ); + // Calculate the coverage. + if skip_zero_over_zero && lines[0].3 == 0.0 && lines[1].3 == 0.0 { + return None; + } else if skip_non_covered_regions && lines[0].3 == 0.0 { + return None; + } else if skip_non_covered_regions && lines[1].3 == 0.0 { + return None; + } else { + let cov = calc_ratio( + lines[0].3, + lines[1].3, + &sf.0, + &sf.1, + &pseudocount1, + &pseudocount2, + operation, + ); + Some(( + lines[0].0.clone(), + Value { + start: lines[0].1, + end: lines[0].2, + value: cov, + }, + )) + } + }) }); write_covfile(lines, ofile, ofiletype, chromsizes); } @@ -263,5 +378,5 @@ pub struct ParsedBamFile<'a> { pub mapped: u32, pub unmapped: u32, pub readlen: f32, - pub fraglen: f32 -} \ No newline at end of file + pub fraglen: f32, +} diff --git a/src/bamcoverage.rs b/src/bamcoverage.rs index 905641400d..2ca0e260d6 100644 --- a/src/bamcoverage.rs +++ b/src/bamcoverage.rs @@ -1,43 +1,43 @@ +use crate::calc::median; +use crate::covcalc::{bam_pileup, parse_regions, region_divider, Region}; +use crate::filehandler::{bam_ispaired, is_bed_or_gtf, read_bedfile, write_covfile}; +use crate::filtering::Alignmentfilters; +use crate::normalization::scale_factor; +use bigtools::Value; +use core::panic; use pyo3::prelude::*; use pyo3::types::PyList; use rayon::prelude::*; use rayon::ThreadPoolBuilder; -use core::panic; +use std::fs::File; use std::io::prelude::*; use std::io::BufReader; -use std::fs::File; -use bigtools::Value; -use crate::covcalc::{bam_pileup, parse_regions, region_divider, Region}; -use crate::filtering::Alignmentfilters; -use crate::filehandler::{bam_ispaired, write_covfile, is_bed_or_gtf, read_bedfile}; -use crate::normalization::scale_factor; -use crate::calc::median; - #[pyfunction] pub fn r_bamcoverage( + py: Python, // input and output - bamifile: &str, // input bamfile - ofile: &str, // output file + bamifile: &str, // input bamfile + ofile: &str, // output file ofiletype: &str, // output file type, bedgraph or bigwig // norm options - norm: &str, // normalization mode RPKM, CPM, BPM, RPGC - effectivegenomesize: u64, // default is 0, when not set. - scalefactor: f32, // default 1.0 + norm: &str, // normalization mode RPKM, CPM, BPM, RPGC + effectivegenomesize: u64, // default is 0, when not set. + scalefactor: f32, // default 1.0 // processing options mnase: bool, _offset: Py, // list of 2 [offset 5', offset 3'], if no offset is required we have [0, 0] - extendreads: bool, // true for extension of reads + extendreads: bool, // true for extension of reads extendreadslen: u32, // if extendreads is set, and SE, this length is used for extension. - centerreads: bool, // to center the reads or not. + centerreads: bool, // to center the reads or not. filterrnastrand: &str, // forward, reverse or 'None' - blacklist: &str, // path to blacklist filename, or 'None' + blacklist: &str, // path to blacklist filename, or 'None' _ignorechr: Py, // list of chromosomes to ignore. Is empty if none. skipnoncovregions: bool, _smoothlength: u32, // 0 = no smoothing, else it's a strictly larger then binsize binsize: u32, // filtering options - minmappingquality: u8, // + minmappingquality: u8, // samflaginclude: u16, samflagexclude: u16, mut minfraglen: u32, // default 0 -> no filter @@ -47,17 +47,19 @@ pub fn r_bamcoverage( verbose: bool, collapse: bool, ) -> PyResult<()> { - let mut offset: (i32, i32) = (0, 0); - let mut ignorechr: Vec = Vec::new(); - Python::with_gil(|py| { - let offsetv: Vec = _offset.extract(py).expect("Failed to retrieve offset."); - if offsetv.len() == 2 { - offset = (offsetv[0], offsetv[1]); - } else { - panic!("Error: Offset should be a list of 2. Received: {:?}", offsetv); - } - ignorechr = _ignorechr.extract(py).expect("Failed to retrieve ignorechr."); - }); + let offsetv: Vec = _offset.extract(py).expect("Failed to retrieve offset"); + + let offset = match offsetv.as_slice() { + [a, b] => (*a, *b), + _ => panic!( + "Error: Offset should be a list of 2. Received: {:?}", + offsetv + ), + }; + + let ignorechr: Vec = _ignorechr + .extract(py) + .expect("Failed to retrieve ignorechr"); let ispe = bam_ispaired(bamifile); // If mnase, library should be PE ! @@ -93,23 +95,32 @@ pub fn r_bamcoverage( if mnase { if minfraglen == 0 { minfraglen = 130; - } else if minfraglen != 130{ - println!("Note that MNase mode is set, but minfraglen is set at {}. Recommended is 130.", minfraglen); + } else if minfraglen != 130 { + println!( + "Note that MNase mode is set, but minfraglen is set at {}. Recommended is 130.", + minfraglen + ); } if maxfraglen == 0 { maxfraglen = 200; } else if maxfraglen != 200 { - println!("Note that MNase mode is set, but maxfraglen is set at {}. Recommended is 200.", maxfraglen); + println!( + "Note that MNase mode is set, but maxfraglen is set at {}. Recommended is 200.", + maxfraglen + ); } if binsize != 1 { - println!("Note that MNase mode is set, but binsize is set at {}. Recommended is 1.", binsize); + println!( + "Note that MNase mode is set, but binsize is set at {}. Recommended is 1.", + binsize + ); } } if verbose { println!("Sample: {} is-paired: {}", bamifile, ispe); } // Parse regions & calculate coverage - let (regions, chromsizes) = parse_regions(supregion, vec![bamifile]); + let (regions, chromsizes) = parse_regions(supregion, vec![bamifile]); let regionblocks = region_divider(®ions); // If there is a blacklist, read it. @@ -120,10 +131,11 @@ pub fn r_bamcoverage( match isbed.as_str() { "gtf" => panic!("Error: Please provide a bed file for the blacklist."), "bed" => { - let (bls, _) = read_bedfile(&blacklist.to_string(), false, chromsizes.keys().collect()); + let (bls, _) = + read_bedfile(&blacklist.to_string(), false, chromsizes.keys().collect()); backlistregions = Some(bls); - }, - _ => panic!("Error: Cannot determine filetype of blacklist file.") + } + _ => panic!("Error: Cannot determine filetype of blacklist file."), } } // Set alignment filters @@ -146,17 +158,26 @@ pub fn r_bamcoverage( // We need a pass over the bamfile already to get the mean fragment length. filters.set_extendreadslen(bamifile, nproc, ®ions); if verbose { - println!("fragment length for read extension set as: {}", filters.extendreadslen); + println!( + "fragment length for read extension set as: {}", + filters.extendreadslen + ); } } let pool = ThreadPoolBuilder::new().num_threads(nproc).build().unwrap(); let (bg, mapped, _unmapped, readlen, fraglen) = pool.install(|| { - regionblocks.par_iter() - .map(|i| bam_pileup(bamifile, &i, &binsize, &ispe, &ignorechr, &filters, collapse, false, true)) + regionblocks + .par_iter() + .map(|i| { + bam_pileup( + bamifile, &i, &binsize, &ispe, &ignorechr, &filters, collapse, false, true, + ) + }) .reduce( || (vec![], 0, 0, vec![], vec![]), - |(mut _bg, mut _mapped, mut _unmapped, mut _readlen, mut _fraglen), (bg, mapped, unmapped, readlen, fraglen)| { + |(mut _bg, mut _mapped, mut _unmapped, mut _readlen, mut _fraglen), + (bg, mapped, unmapped, readlen, fraglen)| { _bg.extend(bg); _readlen.extend(readlen); _fraglen.extend(fraglen); @@ -164,14 +185,17 @@ pub fn r_bamcoverage( _unmapped += unmapped; (_bg, _mapped, _unmapped, _readlen, _fraglen) - } + }, ) }); let mut readlen = median(readlen); if filters.extendreads { if verbose { - println!("extend reads option on, overriding readlen from {} to {}", readlen, filters.extendreadslen); + println!( + "extend reads option on, overriding readlen from {} to {}", + readlen, filters.extendreadslen + ); } readlen = filters.extendreadslen as f32; } @@ -183,39 +207,36 @@ pub fn r_bamcoverage( } let sf = scale_factor( - norm, + norm, mapped, binsize, effectivegenomesize, readlen, fraglen, scalefactor, - &verbose + &verbose, ); // Create output stream - let lines = bg.into_iter().flat_map( - |bg| { - let reader = BufReader::new(File::open(bg).unwrap()); - reader.lines().filter_map( - |l| { - let l = l.unwrap(); - let fields: Vec<&str> = l.split('\t').collect(); - if skipnoncovregions && fields[3] == "0" { - None - } else { - Some( - (fields[0].to_string(), Value { - start: fields[1].parse::().unwrap(), - end: fields[2].parse::().unwrap(), - value: (fields[3].parse::().unwrap() * sf * 100.0).round() / 100.0, - }) - ) - } - } - ) - } - ); + let lines = bg.into_iter().flat_map(|bg| { + let reader = BufReader::new(File::open(bg).unwrap()); + reader.lines().filter_map(|l| { + let l = l.unwrap(); + let fields: Vec<&str> = l.split('\t').collect(); + if skipnoncovregions && fields[3] == "0" { + None + } else { + Some(( + fields[0].to_string(), + Value { + start: fields[1].parse::().unwrap(), + end: fields[2].parse::().unwrap(), + value: (fields[3].parse::().unwrap() * sf * 100.0).round() / 100.0, + }, + )) + } + }) + }); if verbose { println!("Writing output to: {}", ofile); } diff --git a/src/computematrix.rs b/src/computematrix.rs index 587dc5e1be..fcba6c2d78 100644 --- a/src/computematrix.rs +++ b/src/computematrix.rs @@ -1,62 +1,78 @@ +use crate::calc::{max_float, mean_float, median_float, min_float, sum_float}; +use crate::covcalc::{Bin, Gtfparse, Region, Scalingregions}; +use crate::filehandler::{ + bwintervals, chrombounds_from_bw, header_matrix, is_bed_or_gtf, read_bedfile, read_gtffile, + write_matrix, +}; +use itertools::Itertools; use pyo3::prelude::*; use pyo3::types::PyList; -use crate::filehandler::{read_bedfile, read_gtffile, chrombounds_from_bw, bwintervals, header_matrix, write_matrix, is_bed_or_gtf}; use rayon::prelude::*; use rayon::ThreadPoolBuilder; use std::collections::HashMap; use std::path::Path; -use itertools::Itertools; -use crate::calc::{mean_float, median_float, max_float, min_float, sum_float}; -use crate::covcalc::{Region, Gtfparse, Scalingregions, Bin}; #[pyfunction] pub fn r_computematrix( - mode: &str, // reference-point or scale-regions - regionlis: Py, // python list of region files (bed or gtf) - bwlis: Py, // python list of bigwig files - sampleslabel: Py, // python list of sample labels, if empty, use bigwig file names. - upstream: u32, // upstream region to consider - downstream: u32, // downstream region to consider + py: Python, + mode: &str, // reference-point or scale-regions + regionlis: Py, // python list of region files (bed or gtf) + bwlis: Py, // python list of bigwig files + sampleslabel: Py, // python list of sample labels, if empty, use bigwig file names. + upstream: u32, // upstream region to consider + downstream: u32, // downstream region to consider unscaled5prime: u32, // unscaled region 5' of the anchorpoint, only used in scale-regions mode. unscaled3prime: u32, // unscaled region 3' of the anchorpoint, only used in scale-regions mode. regionbodylength: u32, // length of the region body (after scaling), only used in scale-regions mode. - binsize: u32, // binsize to use for the matrix + binsize: u32, // binsize to use for the matrix missingdatazero: bool, // Encode missing data as 0. Default is false (and will be encoded as NA). - metagene: bool, // If set, 'exons' are stitched together to form a metagene - txnid: &str, // transcript id to use when parsing GTF file - exonid: &str, // exon id to use when parsing GTF file + metagene: bool, // If set, 'exons' are stitched together to form a metagene + txnid: &str, // transcript id to use when parsing GTF file + exonid: &str, // exon id to use when parsing GTF file txniddesignator: &str, // designator to use when parsing GTF file - scale: f32, // scaling factor for writing out values. default is 1.0 (no scaling) - nanafterend: bool, // end regions will treated as nans. Default is false. - skipzeros: bool, // skip regions with all zeros. Default is false. - minthresh: f32, // minimum threshold to keep a region. If not set it will equal 0.0 - maxthresh: f32, // maximum threshold to keep a region. if not set it will equal 0.0 + scale: f32, // scaling factor for writing out values. default is 1.0 (no scaling) + nanafterend: bool, // end regions will treated as nans. Default is false. + skipzeros: bool, // skip regions with all zeros. Default is false. + minthresh: f32, // minimum threshold to keep a region. If not set it will equal 0.0 + maxthresh: f32, // maximum threshold to keep a region. if not set it will equal 0.0 averagetypebins: &str, // operation to summarize values over bins. Default is mean. sortregions: &str, // either ascend, descend or keep. Default is keep (and ignores sortusing). sortusing: &str, // metric to sort on. Either mean median max min sum region_length. Default is mean. sortusingsamples: Py, // list of samples to sort on. If empty, use all samples. referencepoint: &str, // reference point to use. Either TSS, TES or center. Default is TSS. Only used in reference-point mode. - nproc: usize, // number of threads. - verbose: bool, // verbose output. - ofile: &str // npz file to write to. + nproc: usize, // number of threads. + verbose: bool, // verbose output. + ofile: &str, // npz file to write to. ) -> PyResult<()> { // Extract the bed and bigwig files from pyList to Vec. - let mut region_files: Vec = Vec::new(); - let mut bw_files: Vec = Vec::new(); - let mut samples_label: Vec = Vec::new(); - let mut sort_using_samples: Vec = Vec::new(); - Python::with_gil(|py| { - region_files = regionlis.extract(py).expect("Failed to retrieve bed files."); - bw_files = bwlis.extract(py).expect("Failed to retrieve bigwig filess."); - samples_label = sampleslabel.extract(py).expect("Failed to retrieve samples label."); - sort_using_samples = sortusingsamples.extract(py).expect("Failed to retrieve the samples to sort on."); - }); + let region_files: Vec = regionlis + .extract(py) + .expect("Failed to retrieve bed files."); + + let bw_files: Vec = bwlis + .extract(py) + .expect("Failed to retrieve bigwig filess."); + + let mut samples_label: Vec = sampleslabel + .extract(py) + .expect("Failed to retrieve samples label."); + + let sort_using_samples: Vec = sortusingsamples + .extract(py) + .expect("Failed to retrieve the samples to sort on."); // Assert that samples_label equals bw_files, if samples_label is not empty. if !samples_label.is_empty() { - assert_eq!(samples_label.len(), bw_files.len(), "Number of samplelabels do not match number of bigwig files."); + assert_eq!( + samples_label.len(), + bw_files.len(), + "Number of samplelabels do not match number of bigwig files." + ); } // Assert that sort_using_samples is smaller or equal to bw_files. - assert!(sort_using_samples.len() <= bw_files.len(), "Number of samples to sort on is larger than number of bigwig files provided."); + assert!( + sort_using_samples.len() <= bw_files.len(), + "Number of samples to sort on is larger than number of bigwig files provided." + ); // Assert that no value in sort_using_samples is larger than bw_files. // Get chromosome boundaries from first bigwig file. let chromsizes = chrombounds_from_bw(&bw_files.get(0).unwrap()); @@ -106,7 +122,7 @@ pub fn r_computematrix( verbose: verbose, proc_number: nproc, regionlabels: regionlabels, - bwlabels: samples_label + bwlabels: samples_label, }; let gtfparse = Gtfparse { metagene: metagene, @@ -121,7 +137,7 @@ pub fn r_computematrix( println!("Sort using samples: {:?}", &sort_using_samples); } let pool = ThreadPoolBuilder::new().num_threads(nproc).build().unwrap(); - + // Parse regions from bed files. Note that we retain the name of the bed file (in case there are more then 1) // Additionaly, score and strand are also retained, if it's a 3-column bed file we just fill in '.' let mut regions: Vec = Vec::new(); @@ -129,7 +145,7 @@ pub fn r_computematrix( region_files.iter() .map(|r| { let ftype = is_bed_or_gtf(r); - + match ftype.as_str() { "gtf" => read_gtffile(r, >fparse, chromsizes.keys().collect()), "bed" => read_bedfile(r, metagene, chromsizes.keys().collect()), @@ -142,7 +158,8 @@ pub fn r_computematrix( }); // Define slop regions, which contain the actual 'bins' to query the bigwig files. let slopregions = pool.install(|| { - regions.par_iter() + regions + .par_iter() .map(|region| slop_region(®ion, &scale_regions, &chromsizes)) .collect::>() }); @@ -150,7 +167,8 @@ pub fn r_computematrix( // Discriminate between reference-point and scale-regions mode. let matrix: Vec> = pool.install(|| { - bw_files.par_iter() + bw_files + .par_iter() .map(|i| bwintervals(&i, ®ions, &slopregions, &scale_regions)) .reduce( || vec![vec![]; regions.len()], @@ -167,11 +185,11 @@ pub fn r_computematrix( sortusing, sort_using_samples, regions, - matrix, + matrix, scale_regions, regionsizes, ofile, - verbose + verbose, ); Ok(()) @@ -180,15 +198,15 @@ pub fn r_computematrix( fn slop_region( region: &Region, scale_regions: &Scalingregions, - chromsizes: &HashMap + chromsizes: &HashMap, ) -> Vec { // Idea is to create a vector Bins (Conbin or Catbin) which encodes start and end of every bin (binsize passed by computeMatrix). // Catbin takes care of the situation where one needs metagenes, and thus multiple start/end per bin are possible. // The number of columns is predetermined - // Note that the before / after could mean that we run out of chromosome. + // Note that the before / after could mean that we run out of chromosome. // Invalid regions (later to be encoded as NA or 0), will be pushed as (0,0) tuples. // Note that if nan_after_end is set to true, we will push (0,0) tuples after the end of the region. - + // Get the chromosome end for a specific region, and assert that the region stays within the chromosome boundary. // Note that only a right check is needed, as positions are u32. // Note that we know ®ion.chrom is inside chromsizes already, since this filtering is done at the region reading stage. @@ -208,13 +226,16 @@ fn matrix_dump( scale_regions: Scalingregions, regionsizes: HashMap, ofile: &str, - verbose: bool + verbose: bool, ) { // Takes a pre-computed matrix, resorts it if requested, and writes it to file. // Resort the matrix, if this is requested. if sortregions != "keep" { if verbose { - println!("Sorting output matrix with settings: sortRegions: {}, sortUsing {}", sortregions, sortusing); + println!( + "Sorting output matrix with settings: sortRegions: {}, sortUsing {}", + sortregions, sortusing + ); } // If sortusingsamples is set, we need a vector to subset the columns of interest let mut cols_of_interest: Vec = Vec::new(); @@ -306,34 +327,32 @@ fn matrix_dump( } }) .collect(); - } + } // assert sorted ix length == matrix length == regions length assert_eq!( sortedix.len(), matrix.len(), - "Length of sorted indices does not match matrix length: {} != {}", sortedix.len(), matrix.len() + "Length of sorted indices does not match matrix length: {} != {}", + sortedix.len(), + matrix.len() ); assert_eq!( sortedix.len(), regions.len(), - "Length of sorted indices does not match regions length: {} ! = {}", sortedix.len(), regions.len() + "Length of sorted indices does not match regions length: {} ! = {}", + sortedix.len(), + regions.len() ); // Reorder matrix & regions - let sortedmatrix = sortedix - .iter() - .map(|ix| matrix[*ix].clone()) - .collect(); - let sortedregions = sortedix - .into_iter() - .map(|ix| regions[ix].clone()) - .collect(); + let sortedmatrix = sortedix.iter().map(|ix| matrix[*ix].clone()).collect(); + let sortedregions = sortedix.into_iter().map(|ix| regions[ix].clone()).collect(); write_matrix( header_matrix(&scale_regions, regionsizes), sortedmatrix, ofile, sortedregions, - &scale_regions + &scale_regions, ); } else { write_matrix( @@ -341,7 +360,7 @@ fn matrix_dump( matrix, ofile, regions, - &scale_regions + &scale_regions, ); } -} \ No newline at end of file +} diff --git a/src/lib.rs b/src/lib.rs index 47b39334a3..9a37b0398e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,7 @@ use pyo3::prelude::*; mod alignmentsieve; -mod bamcoverage; mod bamcompare; +mod bamcoverage; mod calc; mod computematrix; mod covcalc; @@ -13,7 +13,7 @@ mod normalization; mod tests; #[pymodule] -fn hp(m: &Bound<'_, PyModule>) -> PyResult<()> { +fn hp(_py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_function(wrap_pyfunction!(bamcoverage::r_bamcoverage, m)?)?; m.add_function(wrap_pyfunction!(bamcompare::r_bamcompare, m)?)?; m.add_function(wrap_pyfunction!(computematrix::r_computematrix, m)?)?; diff --git a/src/multibamsummary.rs b/src/multibamsummary.rs index 8cbec0e616..ef05c04e99 100644 --- a/src/multibamsummary.rs +++ b/src/multibamsummary.rs @@ -1,22 +1,25 @@ +use crate::calc::deseq_scalefactors; +use crate::covcalc::{bam_pileup, parse_regions, region_divider, TempZip}; +use crate::covcalc::{Gtfparse, Region}; +use crate::filehandler::{ + bam_ispaired, chrombounds_from_bam, is_bed_or_gtf, read_bedfile, read_gtffile, +}; +use crate::filtering::Alignmentfilters; +use itertools::multiunzip; +use ndarray::Array2; +use ndarray_npy::NpzWriter; use pyo3::prelude::*; use pyo3::types::PyList; use rayon::prelude::*; use rayon::ThreadPoolBuilder; -use itertools::multiunzip; +use std::collections::HashMap; +use std::fs::File; use std::io::prelude::*; use std::io::{BufReader, BufWriter}; -use std::fs::File; -use ndarray::Array2; -use ndarray_npy::NpzWriter; -use std::collections::HashMap; -use crate::covcalc::{bam_pileup, parse_regions, TempZip, region_divider}; -use crate::filtering::Alignmentfilters; -use crate::filehandler::{bam_ispaired, read_bedfile, read_gtffile, chrombounds_from_bam, is_bed_or_gtf}; -use crate::calc::deseq_scalefactors; -use crate::covcalc::{Region, Gtfparse}; #[pyfunction] pub fn r_mbams( + py: Python, // required parameters mode: &str, // either bins or BED-file bam_files: Py, @@ -36,25 +39,25 @@ pub fn r_mbams( extendreads: bool, extendreadslen: u32, centerreads: bool, - samflaginclude: u16, // sam flag include - samflagexclude: u16, // sam flag exclude - minfraglen: u32, // minimum fragment length. - maxfraglen: u32, // maximum fragment length. + samflaginclude: u16, // sam flag include + samflagexclude: u16, // sam flag exclude + minfraglen: u32, // minimum fragment length. + maxfraglen: u32, // maximum fragment length. minmappingquality: u8, // minimum mapping quality. - metagene: bool, // metagene mode or not. - txnid: &str, // transcript id to use when parsing GTF file. - exonid: &str, // exon id to use when parsing GTF file. + metagene: bool, // metagene mode or not. + txnid: &str, // transcript id to use when parsing GTF file. + exonid: &str, // exon id to use when parsing GTF file. txniddesignator: &str, // designator to use when parsing GTF file. ) -> PyResult<()> { - let mut bamfiles: Vec = Vec::new(); - let mut bamlabels: Vec = Vec::new(); - let mut bedfiles: Vec = Vec::new(); + let bamfiles: Vec = bam_files + .extract(py) + .expect("Failed to retrieve bam files."); + + let bamlabels: Vec = labels.extract(py).expect("Failed to retrieve labels."); + + let bedfiles: Vec = bed_file.extract(py).expect("Failed to retrieve bedfiles."); + let ignorechr: Vec = Vec::new(); - Python::with_gil(|py| { - bamfiles = bam_files.extract(py).expect("Failed to retrieve bam files."); - bamlabels = labels.extract(py).expect("Failed to retrieve labels."); - bedfiles = bed_file.extract(py).expect("Failed to retrieve bedfiles."); - }); let max_len = bamlabels.iter().map(|s| s.len()).max().unwrap_or(0); let bamlabels_arr: Array2 = Array2::from_shape_fn((bamlabels.len(), max_len), |(i, j)| { @@ -62,9 +65,7 @@ pub fn r_mbams( }); // Get paired-end information - let ispe = bamfiles.iter() - .map(|x| bam_ispaired(x)) - .collect::>(); + let ispe = bamfiles.iter().map(|x| bam_ispaired(x)).collect::>(); // zip through ispe and bamfiles if verbose { @@ -72,8 +73,7 @@ pub fn r_mbams( println!("Sample: {} is-paired: {}", _bf, _ispe); } } - - + let mut regions: Vec = Vec::new(); let mut gene_mode = false; let mut blacklistregions: Option> = None; @@ -100,7 +100,7 @@ pub fn r_mbams( bedfiles.iter() .map(|r| { let ftype = is_bed_or_gtf(r); - + match ftype.as_str() { "gtf" => read_gtffile(r, >fparse, chromsizes.keys().collect()), "bed" => read_bedfile(r, metagene, chromsizes.keys().collect()), @@ -120,17 +120,22 @@ pub fn r_mbams( match isbed.as_str() { "gtf" => panic!("Error: Please provide a bed file for the blacklist."), "bed" => { - let (bls, _) = read_bedfile(&blacklist.to_string(), false, chromsizes.keys().collect()); + let (bls, _) = + read_bedfile(&blacklist.to_string(), false, chromsizes.keys().collect()); blacklistregions = Some(bls); - }, - _ => panic!("Error: Cannot determine filetype of blacklist file.") + } + _ => panic!("Error: Cannot determine filetype of blacklist file."), } } } else { if verbose { - println!("BINS mode. with binsize: {}, distance between bins: {}", binsize, distance_between_bins); + println!( + "BINS mode. with binsize: {}, distance between bins: {}", + binsize, distance_between_bins + ); } - let (parsedregions, chromsizes) = parse_regions(supregion, bamfiles.iter().map(|x| x.as_str()).collect()); + let (parsedregions, chromsizes) = + parse_regions(supregion, bamfiles.iter().map(|x| x.as_str()).collect()); regions = parsedregions; // If there is a blacklist, read it. if blacklist != "None" { @@ -139,10 +144,11 @@ pub fn r_mbams( match isbed.as_str() { "gtf" => panic!("Error: Please provide a bed file for the blacklist."), "bed" => { - let (bls, _) = read_bedfile(&blacklist.to_string(), false, chromsizes.keys().collect()); + let (bls, _) = + read_bedfile(&blacklist.to_string(), false, chromsizes.keys().collect()); blacklistregions = Some(bls); - }, - _ => panic!("Error: Cannot determine filetype of blacklist file.") + } + _ => panic!("Error: Cannot determine filetype of blacklist file."), } } } @@ -162,8 +168,8 @@ pub fn r_mbams( Some(centerreads), ); - let pool = ThreadPoolBuilder::new().num_threads(nproc).build().unwrap(); - + let pool = ThreadPoolBuilder::new().num_threads(nproc).build().unwrap(); + // Zip together bamfiles and ispe into a vec of tuples. let bampfiles: Vec<_> = bamfiles.into_iter().zip(ispe.into_iter()).collect(); let bam_ispe_filter: Vec<(String, bool, Alignmentfilters)> = bampfiles.into_iter() @@ -176,7 +182,7 @@ pub fn r_mbams( panic!("Error: No fragment length found for read extension. Please provide a valid fragment length."); } if verbose { - println!("fragment length for read extension set as: {} for {}", filter.extendreadslen, bamfile); + println!("fragment length for read extension set as: {} for {}", filter.extendreadslen, bamfile.to_string()); } } (bamfile, ispe, filter) @@ -184,39 +190,50 @@ pub fn r_mbams( .collect(); // Divide up the regions into regionBlocks let regionblocks = region_divider(®ions); - + assert!(regionblocks.len() > 0, "No regions to process. Exiting."); if verbose { - println!("Regions divided into {} parallel blocks", regionblocks.len()); + println!( + "Regions divided into {} parallel blocks", + regionblocks.len() + ); println!("Start coverage calculation"); } let covcalcs: Vec<_> = pool.install(|| { - bam_ispe_filter.par_iter() + bam_ispe_filter + .par_iter() .map(|(bamfile, ispe, filter)| { - let (bg, _mapped, _unmapped, _readlen, _fraglen) = regionblocks.par_iter() - .map(|i| bam_pileup(bamfile, &i, &binsize, &ispe, &ignorechr, filter, false, gene_mode, false)) + let (bg, _mapped, _unmapped, _readlen, _fraglen) = regionblocks + .par_iter() + .map(|i| { + bam_pileup( + bamfile, &i, &binsize, &ispe, &ignorechr, filter, false, gene_mode, + false, + ) + }) .reduce( || (vec![], 0, 0, vec![], vec![]), - |(mut _bg, mut _mapped, mut _unmapped, mut _readlen, mut _fraglen), (bg, mapped, unmapped, readlen, fraglen)| { + |(mut _bg, mut _mapped, mut _unmapped, mut _readlen, mut _fraglen), + (bg, mapped, unmapped, readlen, fraglen)| { _bg.extend(bg); _readlen.extend(readlen); _fraglen.extend(fraglen); _mapped += mapped; _unmapped += unmapped; (_bg, _mapped, _unmapped, _readlen, _fraglen) - } + }, ); bg }) - .collect() + .collect() }); if verbose { println!("Coverage calculation done"); println!("Define output file"); } - - // Collate the coverage files into a matrix. + + // Collate the coverage files into a matrix. let its: Vec<_> = covcalcs.iter().map(|x| x.into_iter()).collect(); let zips = TempZip { iterators: its }; if verbose { @@ -229,7 +246,10 @@ pub fn r_mbams( let _m: Vec<_> = zips_vec .par_iter() .flat_map(|c| { - let readers: Vec<_> = c.par_iter().map(|x| BufReader::new(File::open(x).unwrap()).lines()).collect(); + let readers: Vec<_> = c + .par_iter() + .map(|x| BufReader::new(File::open(x).unwrap()).lines()) + .collect(); let mut _matvec: Vec> = Vec::new(); let mut _regions: Vec<(String, String, String)> = Vec::new(); for mut _l in (TempZip { iterators: readers }) { @@ -238,13 +258,21 @@ pub fn r_mbams( .par_iter_mut() .map(|x| x.as_mut().unwrap()) .map(|x| x.split('\t').collect()) - .map(|x: Vec<&str> | ( x[0].to_string(), x[1].to_string(), x[2].to_string(), x[3].parse::().unwrap() ) ) + .map(|x: Vec<&str>| { + ( + x[0].to_string(), + x[1].to_string(), + x[2].to_string(), + x[3].parse::().unwrap(), + ) + }) .collect(); let counts = lines .par_iter() .map(|x| (x.3 * 100.0).round() / 100.0) .collect::>(); - let regions: (String, String, String) = (lines[0].0.clone(), lines[0].1.clone(), lines[0].2.clone()); + let regions: (String, String, String) = + (lines[0].0.clone(), lines[0].1.clone(), lines[0].2.clone()); _matvec.push(counts); _regions.push(regions); } @@ -272,7 +300,9 @@ pub fn r_mbams( } writeln!(cfile, "{}", headstr).unwrap(); let outlines: Vec = pool.install(|| { - regions.par_iter().zip(matvec.par_iter()) + regions + .par_iter() + .zip(matvec.par_iter()) .map(|(region, counts)| { let mut outstr = String::new(); outstr.push_str(&format!("{}\t{}\t{}", region.0, region.1, region.2)); @@ -290,9 +320,11 @@ pub fn r_mbams( // Create 2darray from matvec let matarr: Array2 = Array2::from_shape_vec( - (matvec.len(), matvec[0].len()), matvec.into_iter().flatten().collect() - ).unwrap(); - + (matvec.len(), matvec[0].len()), + matvec.into_iter().flatten().collect(), + ) + .unwrap(); + // If scalefactors are required, calc and save them now. if scaling_factors != "None" { if verbose { @@ -318,4 +350,4 @@ pub fn r_mbams( println!("Matrix written."); } Ok(()) -} \ No newline at end of file +}