diff --git a/src/core/Dockerfile b/src/core/Dockerfile index 7ffd949a..fe7048bd 100644 --- a/src/core/Dockerfile +++ b/src/core/Dockerfile @@ -29,4 +29,6 @@ ARG OUT_DIR=/tmp/ugbio COPY --from=build $OUT_DIR $OUT_DIR RUN WHEEL_FILE=$(find ${OUT_DIR} -name "*.whl") && \ - pip install "${WHEEL_FILE}[vcfbed]" + pip install "${WHEEL_FILE}[vcfbed,reports]" + +COPY --from=build ./src/core/ugbio_core/reports ./src/core/ugbio_core/reports diff --git a/src/core/pyproject.toml b/src/core/pyproject.toml index c8d93a75..fe4ec533 100644 --- a/src/core/pyproject.toml +++ b/src/core/pyproject.toml @@ -25,6 +25,13 @@ vcfbed = [ "bgzip>=0.5.0", ] +reports = [ + "papermill>=2.6.0", + "jupyter>=1.1.1", + "nbconvert>=7.16.4", + "mistune>=2.0.3,<3.1",# 3.1.0 breaks nbconvert. Can be removed when jupyter/nbconvert#2198 is fixed +] + [project.license] text = "Apache-2.0" diff --git a/src/core/tests/resources/input_for_html_report.h5 b/src/core/tests/resources/input_for_html_report.h5 new file mode 100644 index 00000000..c27de967 --- /dev/null +++ b/src/core/tests/resources/input_for_html_report.h5 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:152bd8bd29dbcb8813353095c151ac2da965ff495b896185636cec123d00ccd8 +size 7241560 diff --git a/src/core/tests/unit/test_single_sample_qc_html_report.py b/src/core/tests/unit/test_single_sample_qc_html_report.py new file mode 100644 index 00000000..accea9bf --- /dev/null +++ b/src/core/tests/unit/test_single_sample_qc_html_report.py @@ -0,0 +1,34 @@ +import subprocess +from os.path import join as pjoin +from pathlib import Path + +import pytest + +BASE_PATH = Path(__file__).parent.parent.parent +REPORT_BASE_PATH = BASE_PATH / "ugbio_core" / "reports" +REPORT_NOTEBOOK = REPORT_BASE_PATH / "single_sample_qc_create_html_report.ipynb" + + +@pytest.fixture +def resources_dir(): + return Path(__file__).parent.parent / "resources" + + +def test_single_sample_qc_create_html_report(tmpdir, resources_dir): + papermill_out = pjoin(tmpdir, "single_sample_qc_create_html_report.papermill.ipynb") + input_h5_file = pjoin(resources_dir, "input_for_html_report.h5") + base_file_name = "test" + + cmd = ( + f"papermill {REPORT_NOTEBOOK} {papermill_out} " + f"-p top_metrics_file {REPORT_BASE_PATH}/top_metrics_for_tbl.csv " + f"-p input_h5_file {input_h5_file} " + f"-p input_base_file_name {base_file_name}" + ) + + assert subprocess.check_call(cmd.split(), cwd=tmpdir) == 0 + + jupyter_convert_cmd = ( + f"jupyter nbconvert --to html {papermill_out} --template classic --no-input --output {base_file_name}.html" + ) + assert subprocess.check_call(jupyter_convert_cmd.split(), cwd=tmpdir) == 0 diff --git a/src/core/ugbio_core/reports/single_sample_qc_create_html_report.ipynb b/src/core/ugbio_core/reports/single_sample_qc_create_html_report.ipynb new file mode 100644 index 00000000..1b08561a --- /dev/null +++ b/src/core/ugbio_core/reports/single_sample_qc_create_html_report.ipynb @@ -0,0 +1,275 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true, + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "import h5py\n", + "import pandas as pd\n", + "from IPython.display import HTML, display" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "is_executing": true, + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "pd.set_option(\"display.max_rows\", None)\n", + "pd.set_option(\"display.max_colwidth\", 0)\n", + "pd.options.display.float_format = \"{:,.2f}\".format" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "from IPython.core.interactiveshell import InteractiveShell\n", + "\n", + "InteractiveShell.ast_node_interactivity = \"all\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + }, + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "top_metrics_file = \"top_metrics_for_tbl.csv\"\n", + "input_h5_file = \"\"\n", + "input_base_file_name = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "if not os.path.isfile(top_metrics_file):\n", + " raise ValueError(f\"Input {top_metrics_file} does not exist\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dict_features = {row.iloc[0]: row.iloc[1] for _, row in pd.read_csv(top_metrics_file).iterrows()}\n", + "df_features = pd.read_csv(top_metrics_file)\n", + "list_metrics = list(set(df_features[\"metric\"]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "# get Keys within the H5 file\n", + "f = h5py.File(input_h5_file, \"r\")\n", + "list_keys = list(f.keys())\n", + "hist_list_keys = [i for i in list_keys if i.startswith(\"histogram_\")]\n", + "tbl_list_keys = pd.DataFrame(list(set(list_keys) - set(hist_list_keys)))\n", + "tbl_list_keys.columns = [\"metric\"]\n", + "del list_keys\n", + "\n", + "# create table merging top required metrics to display and input provided\n", + "# ....................\n", + "tbl_top_values = df_features.merge(tbl_list_keys, on=\"metric\", how=\"inner\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "HTML(\"\" + \"\" + \"\")\n", + "HTML(\"
\")\n", + "HTML('

' + \"Input parameters\" + \"

\")\n", + "HTML(\"
\")\n", + "HTML(\"\" + \"\" + \"\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "to_print_sample_info = pd.DataFrame(\n", + " data={\"value\": [input_base_file_name, str(input_h5_file)]}, index=[\"Sample name\", \"h5 file\"]\n", + ")\n", + "\n", + "to_print_sample_info[\"value\"] = to_print_sample_info[\"value\"].str.wrap(100)\n", + "\n", + "\n", + "def wrap_df_text(df):\n", + " return display(HTML(df.to_html().replace(\"\\\\n\", \"
\")))\n", + "\n", + "\n", + "wrap_df_text(to_print_sample_info.style.set_properties(**{\"text-align\": \"left\"}))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "HTML(\"\" + \"\" + \"\")\n", + "HTML(\"
\")\n", + "HTML('

' + \"Summary View: Main Metrics\" + \"

\")\n", + "HTML(\"
\")\n", + "HTML(\"\" + \"\" + \"\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "separator = \"___\"\n", + "to_print = pd.DataFrame()\n", + "\n", + "tbl_top = pd.DataFrame()\n", + "for temp_metric in tbl_top_values[\"metric\"].unique():\n", + " list_top_tbl = sub_top_tbl = pd.DataFrame()\n", + " sub_top_tbl = tbl_top_values[tbl_top_values[\"metric\"] == temp_metric]\n", + " df_h5_tbl = pd.read_hdf(input_h5_file, temp_metric).T\n", + " df_h5_tbl = df_h5_tbl.reset_index()\n", + "\n", + " # stats_coverage is a multiindex dataframe\n", + " if temp_metric.startswith(\"stats\"):\n", + " df_h5_tbl[\"metric\"] = df_h5_tbl[\"level_0\"] + separator + df_h5_tbl[\"level_1\"]\n", + " df_h5_tbl = df_h5_tbl.drop(columns=[\"level_0\", \"level_1\"]).copy()\n", + " df_h5_tbl.columns = [\"value\", \"key\"]\n", + " df_h5_tbl = df_h5_tbl[[\"key\", \"value\"]]\n", + " list_top_tbl = df_h5_tbl.merge(sub_top_tbl, on=\"key\", how=\"inner\")\n", + " to_print = pd.concat((to_print, list_top_tbl))\n", + "\n", + " else:\n", + " df_h5_tbl.columns = [\"key\", \"value\"]\n", + " list_top_tbl = df_h5_tbl.merge(sub_top_tbl, on=\"key\", how=\"inner\")\n", + " to_print = pd.concat((to_print, list_top_tbl))\n", + "\n", + "to_print.index = to_print[\"key\"]\n", + "to_print = to_print.rename({c: c.replace(\"PCT_\", \"% \") for c in to_print.index})\n", + "to_print = to_print.rename({c: c.replace(\"PERCENT_\", \"% \") for c in to_print.index})\n", + "to_print.index.name = None\n", + "to_print = to_print.rename(columns={\"value\": \"\"})\n", + "display(to_print[\"\"].to_frame())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "HTML(\"\" + \"\" + \"\")\n", + "HTML(\"
\")\n", + "HTML('

' + \"Detailed View: All Metrics\" + \"

\")\n", + "HTML(\"
\")\n", + "HTML(\"\" + \"\" + \"\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "to_print = pd.DataFrame()\n", + "sorted_keys = tbl_list_keys[\"metric\"].sort_values()\n", + "\n", + "for tbl_key in sorted_keys:\n", + " HTML(\"
\" + \"
\" + \"\" + \"Metric type: \" + tbl_key + \"\" + \"
\")\n", + " to_print = pd.read_hdf(input_h5_file, tbl_key).T\n", + " to_print = to_print.rename(columns={0: \"\"})\n", + " if not isinstance(to_print.index[0], tuple):\n", + " to_print = to_print.rename({c: c.replace(\"PCT_\", \"% \") for c in to_print.index})\n", + " to_print = to_print.rename({c: c.replace(\"PERCENT_\", \"% \") for c in to_print.index})\n", + " else:\n", + " to_print.index = to_print.index.set_levels(to_print.index.levels[1].str.replace(\"percent_\", \"% \"), level=1)\n", + " display(to_print)" + ] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.17" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/src/core/ugbio_core/reports/top_metrics_for_tbl.csv b/src/core/ugbio_core/reports/top_metrics_for_tbl.csv new file mode 100644 index 00000000..276396f7 --- /dev/null +++ b/src/core/ugbio_core/reports/top_metrics_for_tbl.csv @@ -0,0 +1,20 @@ +key,metric +TOTAL_READS,QualityYieldMetricsFlow +PCT_PF_READS,AlignmentSummaryMetrics +PCT_PF_READS_ALIGNED,AlignmentSummaryMetrics +PF_BASES,QualityYieldMetricsFlow +PF_Q30_BASES,QualityYieldMetricsFlow +MEAN_READ_LENGTH,AlignmentSummaryMetrics +MEAN_ALIGNED_READ_LENGTH,AlignmentSummaryMetrics +GC_NC_0_19,GcBiasSummaryMetrics +GC_NC_80_100,GcBiasSummaryMetrics +MEAN_COVERAGE,RawWgsMetrics +FOLD_90_BASE_PENALTY,RawWgsMetrics +Genome___percentile_5,stats_coverage +Exome (WG)___percentile_5,stats_coverage +Simple repeat___percentile_5,stats_coverage +PCT_20X,RawWgsMetrics +PERCENT_DUPLICATION,DuplicationMetrics +PF_INDEL_RATE,AlignmentSummaryMetrics +PF_MISMATCH_RATE,AlignmentSummaryMetrics +contamination,contamination diff --git a/src/ppmseq/pyproject.toml b/src/ppmseq/pyproject.toml index ba52a595..59849739 100644 --- a/src/ppmseq/pyproject.toml +++ b/src/ppmseq/pyproject.toml @@ -3,11 +3,8 @@ name = "ugbio_ppmseq" version = "1.4.4-0dev-82" requires-python = ">=3.11" dependencies = [ - "ugbio_core[vcfbed]", + "ugbio_core[vcfbed,reports]", "seaborn>=0.13.2", - "papermill>=2.6.0", - "jupyter>=1.1.1", - "mistune>=2.0.3,<3.1",# Can be removed when jupyter/nbconvert#2198 is fixed "pyarrow>=17.0.0", "fastparquet>=2024.5.0", ] diff --git a/uv.lock b/uv.lock index e9e698f5..7aef445f 100644 --- a/uv.lock +++ b/uv.lock @@ -9,8 +9,10 @@ resolution-markers = [ members = [ "ugbio-cloud-utils", "ugbio-cnv", + "ugbio-comparison", "ugbio-core", "ugbio-featuremap", + "ugbio-filtering", "ugbio-freec", "ugbio-hla-la", "ugbio-methylation", @@ -556,6 +558,37 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1b/36/9f54f23b5166d67e5a90d367694dbd332690d8ce362854a3baeb00bfe049/cramjam-2.8.4-cp312-none-win_amd64.whl", hash = "sha256:72b9d4c29a51a8656690df2ef6f7823fa27ebc35e051182b6ebef5fef180876f", size = 2111276 }, ] +[[package]] +name = "cryptography" +version = "44.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/4c/45dfa6829acffa344e3967d6006ee4ae8be57af746ae2eba1c431949b32c/cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02", size = 710657 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/09/8cc67f9b84730ad330b3b72cf867150744bf07ff113cda21a15a1c6d2c7c/cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123", size = 6541833 }, + { url = "https://files.pythonhosted.org/packages/7e/5b/3759e30a103144e29632e7cb72aec28cedc79e514b2ea8896bb17163c19b/cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092", size = 3922710 }, + { url = "https://files.pythonhosted.org/packages/5f/58/3b14bf39f1a0cfd679e753e8647ada56cddbf5acebffe7db90e184c76168/cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f", size = 4137546 }, + { url = "https://files.pythonhosted.org/packages/98/65/13d9e76ca19b0ba5603d71ac8424b5694415b348e719db277b5edc985ff5/cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb", size = 3915420 }, + { url = "https://files.pythonhosted.org/packages/b1/07/40fe09ce96b91fc9276a9ad272832ead0fddedcba87f1190372af8e3039c/cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b", size = 4154498 }, + { url = "https://files.pythonhosted.org/packages/75/ea/af65619c800ec0a7e4034207aec543acdf248d9bffba0533342d1bd435e1/cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543", size = 3932569 }, + { url = "https://files.pythonhosted.org/packages/c7/af/d1deb0c04d59612e3d5e54203159e284d3e7a6921e565bb0eeb6269bdd8a/cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e", size = 4016721 }, + { url = "https://files.pythonhosted.org/packages/bd/69/7ca326c55698d0688db867795134bdfac87136b80ef373aaa42b225d6dd5/cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e", size = 4240915 }, + { url = "https://files.pythonhosted.org/packages/ef/d4/cae11bf68c0f981e0413906c6dd03ae7fa864347ed5fac40021df1ef467c/cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053", size = 2757925 }, + { url = "https://files.pythonhosted.org/packages/64/b1/50d7739254d2002acae64eed4fc43b24ac0cc44bf0a0d388d1ca06ec5bb1/cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd", size = 3202055 }, + { url = "https://files.pythonhosted.org/packages/11/18/61e52a3d28fc1514a43b0ac291177acd1b4de00e9301aaf7ef867076ff8a/cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591", size = 6542801 }, + { url = "https://files.pythonhosted.org/packages/1a/07/5f165b6c65696ef75601b781a280fc3b33f1e0cd6aa5a92d9fb96c410e97/cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7", size = 3922613 }, + { url = "https://files.pythonhosted.org/packages/28/34/6b3ac1d80fc174812486561cf25194338151780f27e438526f9c64e16869/cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc", size = 4137925 }, + { url = "https://files.pythonhosted.org/packages/d0/c7/c656eb08fd22255d21bc3129625ed9cd5ee305f33752ef2278711b3fa98b/cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289", size = 3915417 }, + { url = "https://files.pythonhosted.org/packages/ef/82/72403624f197af0db6bac4e58153bc9ac0e6020e57234115db9596eee85d/cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7", size = 4155160 }, + { url = "https://files.pythonhosted.org/packages/a2/cd/2f3c440913d4329ade49b146d74f2e9766422e1732613f57097fea61f344/cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c", size = 3932331 }, + { url = "https://files.pythonhosted.org/packages/7f/df/8be88797f0a1cca6e255189a57bb49237402b1880d6e8721690c5603ac23/cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64", size = 4017372 }, + { url = "https://files.pythonhosted.org/packages/af/36/5ccc376f025a834e72b8e52e18746b927f34e4520487098e283a719c205e/cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285", size = 4239657 }, + { url = "https://files.pythonhosted.org/packages/46/b0/f4f7d0d0bcfbc8dd6296c1449be326d04217c57afb8b2594f017eed95533/cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417", size = 2758672 }, + { url = "https://files.pythonhosted.org/packages/97/9b/443270b9210f13f6ef240eff73fd32e02d381e7103969dc66ce8e89ee901/cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede", size = 3202071 }, +] + [[package]] name = "cycler" version = "0.12.1" @@ -600,6 +633,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, ] +[[package]] +name = "dill" +version = "0.3.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/43/86fe3f9e130c4137b0f1b50784dd70a5087b911fe07fa81e53e0c4c47fea/dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c", size = 187000 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/d1/e73b6ad76f0b1fb7f23c35c6d95dbc506a9c8804f43dda8cb5b0fa6331fd/dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a", size = 119418 }, +] + [[package]] name = "distlib" version = "0.3.9" @@ -1868,6 +1910,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, ] +[[package]] +name = "pickle-secure" +version = "0.99.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/f7/b48756e51552c7413fa2153b011eb2752c7f36e9341048de6a17df7b9c28/pickle_secure-0.99.9.tar.gz", hash = "sha256:46c91a54241111d2e5e68025c5f018c1391d7e23ddfdaee053dfa945b5f63746", size = 6077 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/6d/1ad534dadc56f589fd81eabad979e967b1ae3c88f9a9615ca4534f23feb1/pickle_secure-0.99.9-py3-none-any.whl", hash = "sha256:597e1088bfcb0a8b27fff5e52e1dd82fe5aba9bb6b2b78ffc6bb61cb3689b704", size = 6591 }, +] + [[package]] name = "pillow" version = "10.4.0" @@ -2777,7 +2831,7 @@ wheels = [ [[package]] name = "ugbio-cloud-utils" -version = "1.4.3.post1" +version = "1.4.3" source = { editable = "src/cloud_utils" } dependencies = [ { name = "boto3" }, @@ -2806,7 +2860,7 @@ dev = [ [[package]] name = "ugbio-cnv" -version = "1.4.3.post0" +version = "1.4.3" source = { editable = "src/cnv" } dependencies = [ { name = "seaborn" }, @@ -2833,9 +2887,34 @@ dev = [ { name = "ruff", specifier = ">=0.6.9" }, ] +[[package]] +name = "ugbio-comparison" +version = "1.4.3.post0.dev80" +source = { editable = "src/comparison" } +dependencies = [ + { name = "ugbio-core", extra = ["concordance", "vcfbed"] }, +] + +[package.dev-dependencies] +dev = [ + { name = "pre-commit" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [{ name = "ugbio-core", extras = ["concordance", "vcfbed"], editable = "src/core" }] + +[package.metadata.requires-dev] +dev = [ + { name = "pre-commit", specifier = ">=4.0.1" }, + { name = "pytest", specifier = ">=8.3.3" }, + { name = "ruff", specifier = ">=0.6.9" }, +] + [[package]] name = "ugbio-core" -version = "1.4.3.post0" +version = "1.4.3" source = { editable = "src/core" } dependencies = [ { name = "h5py" }, @@ -2849,6 +2928,9 @@ dependencies = [ ] [package.optional-dependencies] +concordance = [ + { name = "scikit-learn" }, +] vcfbed = [ { name = "bgzip" }, { name = "pybigwig" }, @@ -2872,6 +2954,7 @@ requires-dist = [ { name = "pybigwig", marker = "extra == 'vcfbed'", specifier = ">=0.3.18" }, { name = "pyfaidx", specifier = ">=0.8.1" }, { name = "pysam", specifier = ">=0.22.1" }, + { name = "scikit-learn", marker = "extra == 'concordance'", specifier = ">=1.5.2,<1.6.0" }, { name = "scipy", specifier = ">=1.14.0" }, { name = "simppl", specifier = ">=1.0.7" }, { name = "tqdm", marker = "extra == 'vcfbed'", specifier = ">=4.66.4" }, @@ -2886,7 +2969,7 @@ dev = [ [[package]] name = "ugbio-featuremap" -version = "1.4.3.post0" +version = "1.4.3" source = { editable = "src/featuremap" } dependencies = [ { name = "scikit-learn" }, @@ -2919,9 +3002,44 @@ dev = [ { name = "ruff", specifier = ">=0.6.9" }, ] +[[package]] +name = "ugbio-filtering" +version = "1.4.3.post0.dev80" +source = { editable = "src/filtering" } +dependencies = [ + { name = "biopython" }, + { name = "dill" }, + { name = "pickle-secure" }, + { name = "ugbio-comparison" }, + { name = "xgboost" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pre-commit" }, + { name = "pytest" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "biopython", specifier = ">=1.73" }, + { name = "dill", specifier = ">=0.3.9" }, + { name = "pickle-secure", specifier = ">=0.99.9" }, + { name = "ugbio-comparison", editable = "src/comparison" }, + { name = "xgboost", specifier = "==2.1.2" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "pre-commit", specifier = ">=4.0.1" }, + { name = "pytest", specifier = ">=8.3.3" }, + { name = "ruff", specifier = ">=0.6.9" }, +] + [[package]] name = "ugbio-freec" -version = "1.4.3.post0" +version = "1.4.3" source = { editable = "src/freec" } dependencies = [ { name = "pandas" }, @@ -2950,12 +3068,12 @@ dev = [ [[package]] name = "ugbio-hla-la" -version = "1.4.3.post0" +version = "1.4.3" source = { virtual = "src/hla_la" } [[package]] name = "ugbio-methylation" -version = "1.4.3.post0" +version = "1.4.3" source = { editable = "src/methylation" } dependencies = [ { name = "ipython" }, @@ -2996,7 +3114,7 @@ dev = [ [[package]] name = "ugbio-mrd" -version = "1.4.3.post0" +version = "1.4.3" source = { editable = "src/mrd" } dependencies = [ { name = "ugbio-core", extra = ["vcfbed"] }, @@ -3027,7 +3145,7 @@ dev = [ [[package]] name = "ugbio-omics" -version = "1.4.3.post0" +version = "1.4.3" source = { editable = "src/omics" } dependencies = [ { name = "boto3" }, @@ -3060,7 +3178,7 @@ dev = [ [[package]] name = "ugbio-ppmseq" -version = "1.4.3.post0" +version = "1.4.3" source = { editable = "src/ppmseq" } dependencies = [ { name = "fastparquet" }, @@ -3097,7 +3215,7 @@ dev = [ [[package]] name = "ugbio-single-cell" -version = "1.4.3.post0" +version = "1.4.3" source = { editable = "src/single_cell" } dependencies = [ { name = "bio" }, @@ -3142,7 +3260,7 @@ dev = [ [[package]] name = "ugbio-srsnv" -version = "1.4.3.post0" +version = "1.4.3" source = { editable = "src/srsnv" } dependencies = [ { name = "joblib" }, @@ -3208,7 +3326,7 @@ dev = [ [[package]] name = "ugbio-utils" -version = "1.4.3.post0" +version = "1.4.3" source = { virtual = "." } [package.dev-dependencies]