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]