diff --git a/docs/user-guide/doc-odm-user-guide/doc-odm-user-guide/notebooks/sc_rnaseq_demo.ipynb b/docs/user-guide/doc-odm-user-guide/doc-odm-user-guide/notebooks/sc_rnaseq_demo.ipynb index 3ea5bb9..cd9cf0f 100644 --- a/docs/user-guide/doc-odm-user-guide/doc-odm-user-guide/notebooks/sc_rnaseq_demo.ipynb +++ b/docs/user-guide/doc-odm-user-guide/doc-odm-user-guide/notebooks/sc_rnaseq_demo.ipynb @@ -7,8 +7,7 @@ "id": "21f19756" }, "source": [ - "![Genestack ODM](gs_odm_header.png)\n", - "\n", + "![Genestack ODM](https://raw.githubusercontent.com/genestack/user-docs/develop/docs/user-guide/doc-odm-user-guide/doc-odm-user-guide/notebooks/gs_odm_header.png)\n", "# Single-Cell RNA-Seq: Cohort Selection and Data Retrieval\n", "\n", "**Contact:** support@genestack.com \n", @@ -309,7 +308,7 @@ " Desired color\n", " \"\"\"\n", " \n", - " return go.Scatter(\n", + " return go.Scattergl(\n", " x=df[\"log2FC\"],\n", " y=df[\"-log10(pvalue)\"],\n", " mode=\"markers\",\n", @@ -504,7 +503,7 @@ "source": [ "### 3.1 Exploring Omics Query Endpoints\n", "\n", - "In ODM, each entity—such as samples, datasets, or assays—can be accessed through dedicated API endpoints. Omics query endpoints provide access to quantitative datasets such as gene expression, variant, or flow cytometry data, along with their associated metadata. These endpoints extend integration capabilities, enabling direct retrieval and filtering of omics measurements linked to specific samples or studies.\n", + "In ODM, each object can be accessed through dedicated API endpoints. Omics query endpoints provide access to quantitative datasets such as gene expression, variant, or flow cytometry data, along with their associated metadata - such as study, samples, cells. These endpoints extend integration capabilities, enabling direct retrieval and filtering of omics measurements linked to specific samples or studies.\n", "\n", "In this step, the `OmicsQueries` interface is initialized, and its available methods are listed to illustrate the range of omics data types accessible through the ODM API." ] @@ -540,7 +539,7 @@ "# initialize API class\n", "omics_api = odm_api.OmicsQueriesAsUserApi(api_client)\n", "\n", - "# list all available sample_api endpoints\n", + "# list all available omics_api endpoints\n", "for item in [item for item in dir(omics_api) if item.endswith(\"_as_user\")]:\n", " print(item)" ] @@ -577,7 +576,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "ee41a848", "metadata": { "id": "ee41a848", @@ -594,7 +593,7 @@ " \"Found 5 samples matched the samples/study query (total number of found samples is 5 now)\"\n", "]\n", "\n", - "Elapsed time: 0.52 seconds\n" + "Elapsed time: 0.56 seconds\n" ] } ], @@ -602,8 +601,6 @@ "# define search parameters\n", "study_query = \"single-nuclei\"\n", "\n", - "# if you are not using the provided template, remove the range filter \"Donor Age\"\n", - "# for the following command to work\n", "sample_filter = \" AND \".join([\n", " 'Species=\"Homo sapiens\"',\n", " 'Tissue=\"cardiac muscle tissue\"',\n", @@ -676,7 +673,7 @@ "type": "string" } ], - "ref": "a04033a0-118a-47ef-99b3-a50461422e39", + "ref": "dd19093f-fdeb-4ac9-aad6-3eb89580d4e1", "rows": [ [ "Posterior Wall Thickness Value", @@ -1298,11 +1295,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "Found 10548 cells in sample GSF044556 in 1.66 seconds\n", - "Found 7658 cells in sample GSF044576 in 0.62 seconds\n", - "Found 10367 cells in sample GSF044582 in 2.74 seconds\n", - "Found 9778 cells in sample GSF044583 in 3.2 seconds\n", - "Found 7676 cells in sample GSF044590 in 1.29 seconds\n" + "Found 10548 cells in sample GSF044556 in 4.18 seconds\n", + "Found 7658 cells in sample GSF044576 in 3.18 seconds\n", + "Found 10367 cells in sample GSF044582 in 3.12 seconds\n", + "Found 9778 cells in sample GSF044583 in 2.81 seconds\n", + "Found 7676 cells in sample GSF044590 in 2.27 seconds\n" ] } ], @@ -1421,16 +1418,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "Found 17822 cells with gene TNNT2 in 16.18 seconds\n", - "Found 13991 cells with gene DCN in 7.92 seconds\n", - "Found 6593 cells with gene PECAM1 in 4.67 seconds\n", - "Found 1968 cells with gene CD163 in 4.34 seconds\n", - "Found 5693 cells with gene PDGFRB in 4.71 seconds\n", - "Found 1139 cells with gene FABP4 in 2.88 seconds\n", - "Found 6643 cells with gene MAP2 in 4.88 seconds\n", - "Found 806 cells with gene CD4 in 2.71 seconds\n", - "Found 140 cells with gene CD8A in 2.57 seconds\n", - "Found 140 cells with gene CPA3 in 2.47 seconds\n" + "Found 17822 cells with gene TNNT2 in 24.16 seconds\n", + "Found 13991 cells with gene DCN in 16.32 seconds\n", + "Found 6593 cells with gene PECAM1 in 9.97 seconds\n", + "Found 1968 cells with gene CD163 in 4.35 seconds\n", + "Found 5693 cells with gene PDGFRB in 7.91 seconds\n", + "Found 1139 cells with gene FABP4 in 3.51 seconds\n", + "Found 6643 cells with gene MAP2 in 8.32 seconds\n", + "Found 806 cells with gene CD4 in 3.31 seconds\n", + "Found 140 cells with gene CD8A in 3.52 seconds\n", + "Found 140 cells with gene CPA3 in 4.34 seconds\n" ] } ], @@ -1477,7 +1474,7 @@ "metadata": {}, "source": [ "#### 3.4.2 Visualization\n", - "The purpose of this section is to validate the cell type assignment by visualizing the expression of selected cell type-specific markers. We will create an adata object with both cells metadata and expression data, and visualize the expression of the selected genes using the `pl.umap` and `pl.violin` plot functions from `Scanpy` package." + "The purpose of this section is to validate the cell type assignment by visualizing the expression of selected cell type-specific markers. We will create an `AnnData` object with both cells metadata and expression data, and visualize the expression of the selected genes using the `pl.umap` and `pl.violin` plot functions from `Scanpy` package." ] }, { @@ -1517,8 +1514,7 @@ " color=genes,\n", " ncols=2,\n", " size=50,\n", - " color_map='viridis',\n", - " show=True\n", + " color_map='viridis'\n", ")" ] }, @@ -1637,8 +1633,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Retrieved cell ratio statistics for Activated_fibroblast cell_type in 0.52 seconds\n", - "Retrieved cell ratio statistics for Fibroblast_I cell_type in 0.45 seconds\n" + "Retrieved cell ratio statistics for Activated_fibroblast cell_type in 0.51 seconds\n", + "Retrieved cell ratio statistics for Fibroblast_I cell_type in 0.47 seconds\n" ] }, { @@ -1671,7 +1667,7 @@ "type": "string" } ], - "ref": "ac4a0f99-ad7a-4e6a-ba90-18b6b651361d", + "ref": "ffe63472-a947-4fec-bc99-67da510bf865", "rows": [ [ "1", @@ -1831,16 +1827,17 @@ "name": "stdout", "output_type": "stream", "text": [ - "Retrieved differential gene expression for 28879 genes in 86.06 seconds\n" + "Retrieved differential gene expression for 28879 genes in 88.38 seconds\n" ] }, { "data": { "text/html": [ "\n", - "\n", - "
\n", - " \n", + " \n", + "
\n", + " \n", " \n", " \n", @@ -1930,18 +1927,32 @@ " \n", "\n", "\n", - " Loading ITables v2.6.1 from the internet...\n", - " (need help?)\n", - "
\n", - "\n", + " Loading ITables v2.7.3 from the internet...\n", + " (need help?)\n", + " \n", + " \n", + " \n", + "\n", + "\n", "\n" @@ -2061,13 +2072,13 @@ { "data": { "text/html": [ - " \n", "
\n" @@ -6289,7 +6315,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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fSIiIiLy0swTmzZtUjdMC/by5Uuzx2bNmhXLzSIiIiKiOAnsBg8eLEOGDJGyZctK5syZJSQkxJWXISIiIiJvB3bTpk2TOXPmyHvvvefObSEiIiKiuB6g+OnTp1KhQoXYvC8RERER+UJg16FDB5k3b567t4WIiIiI4roq9vHjxzJjxgzZuHGjFC9ePFoP2PHjx8dmm4iIiIgorgK7P//8U0qWLKn+PnbsmNlj7EhBRERE5EeB3ebNm92/JUREREQU923sjK5cuaJuREREROSHgR0GJMY4dilTppScOXOqG+aPHTp0aLTBiomIiIjIh6tiP/vsM5k5c6aMHDlSKlasqJZt375dBg0apDpWDBs2zN3bSURERESeCOx++OEH+f7776VBgwamZegdmzVrVvnwww8Z2BERERH5S1Xs3bt35ZVXXom2HMvwGBERERH5SWBXokQJ+eabb6ItxzI8RkRERER+UhU7evRoqVu3rhqgODw8XC3btWuXXL58WVavXu3ubSQiIiIiT2XsKleuLGfOnJHGjRtLRESEur399tty+vRpeeONN1x5SSIiIiLyRsYOsmTJwk4SRERERP4Y2GEasaJFi0q8ePHU3/aghywRERER+Whgh7lhb9y4IRkyZFB/Y05YTdOirYflL168cPd2EhEREZG7ArsLFy5I+vTpTX8TERERkZ92nsC0YcjG6X/buzlq6tSpqto2RYoU6oYetmvWrLH7nEWLFqnx8hInTizFihVjL1wiIiKi2PSKxcwTq1atMt3v16+fmiu2QoUKcvHiRYdfJ1u2bGpasgMHDsj+/fvlzTfflIYNG8rx48etrr9z505p2bKltG/fXg4dOiSNGjVSt2PHjrnyMYiIiIgCikuB3fDhwyVJkiSm8eswMDHGtkuXLp307NnT4depX7++1KlTR/Lnzy8FChRQvWyTJUsmu3fvtrr+pEmTpFatWtK3b18pVKiQDB06VEqXLm11sGQiIiKiYOPScCcYiDhfvnzq7+XLl0vTpk2lU6dOUrFiRalSpYpLG4IOF6hmffjwoWnQY0sIInv16mW2rGbNmmobbHny5Im66SIjI13aPiIiCm4vX76US5cuyYMHD1QSIkeOHGqkCCK/D+xQoO/cuaMK9fr1603BFtq9PXr0yKnXOnr0qArkHj9+rF532bJlUrhwYavrolduxowZzZbhPpbb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ufJRiIiIiII7Yzdw4EAZNmyY1K5dW8qVK6eW7d27V9auXasCtQsXLkiXLl3k+fPn0rFjR5uvg/WN5syZIxkyZFAdNCpVqmRzyJVatWpJ37591f2hQ4eqoPCbb76RadOmufJxiIiIiII3sNu+fbt89dVX0rlzZ7Pl06dPl/Xr18uSJUukePHiMnnyZLuBnbVx2gDZP1t27doVbaDkmjVryvLly53+HEREREQS7FWx69atk+rVq0dbXq1aNfUYoM3bX3/95fBrojdtjx49pGLFilK0aFGb6924cUMyZjRvf4X7WG4NevFGRkaa3YiIiIgCkUuBHTJqv/32W7TlWKZn29BOLnny5A6/Jqpw0U5u/vz54u4OGhg4V79lz57dra9PRERE5NdVseiRijZ0mzdvNrWx27dvn6xevdrUzg3t3tCJwhHdunWTlStXyrZt2yRbtmwxDrly8+ZNs2W4b2solv79+5tV3SJjx+COiIiIApFLgR3azRUuXFh1WMBwJYAhStDLFUOWQO/evWN8HcxS0b17d1m2bJls2bJFcufOHeNzwsPDZdOmTaraVocgEsutSZQokboRERERBTqXx7FDWzjcYgPVr/PmzVODtqLaVm8nhypTjGsHbdq0UUOooEoVPv74Y5UJxCwYdevWVVW3+/fvlxkzZkhc41RSREREgTNFZFAHdi9evFA9UU+ePKnuFylSRBo0aCDx48d3+DWmTp2q/q9SpYrZcoyB9/7776u/L126JPHi/a8pIDKCCAY///xzGTBggBqgGNthr8OFp3AqKSIiosCZIjJoA7tz586pXq9Xr141zRKBjBrarq1atUry5s3r0OugKjYmqKK11KxZM3ULtImC9dckIiIKBP42RWTQBnYfffSRCt4wY4TeC/bOnTvSunVr9RiCu2Dg7xMFExEReZK/TREZtIEdOkkYgzrAdGIjR46Mdbs7IiIiIorDcezQy/T+/fvRlj948EASJkzo4qYQERERUZxn7OrVqyedOnWSmTNnmsax27Nnj5piDB0oiIhiA9MLRkVFxXonoo2r8f/YCAsLUz32iQK5nAPLehAGdpgDtm3btmrsOLQz04f+QAeBiRMnunsbiSjITnZTp02T58+eue010YEpthKEhkqXzp0Z3FFAl3NgWQ/CwC5VqlSqAKF3rD7cSaFChSRfvnzu3j4iCjLIYOBkF177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", "text/plain": [ "
" ] @@ -6301,8 +6327,8 @@ "source": [ "# fill colors mapping\n", "fill_colors = {\n", - " \"Activated_fibroblast\": \"#E69F00\",\n", - " \"Fibroblast_I\": \"#56B4E9\"\n", + " \"Activated_fibroblast\": \"#B7EAFF\",\n", + " \"Fibroblast_I\": \"#D8F9EA\"\n", "}\n", "\n", "boxplot_gene_summary(\n", @@ -6333,16 +6359,17 @@ "name": "stdout", "output_type": "stream", "text": [ - "Retrieved summary for 5 genes in 0.69 seconds\n" + "Retrieved summary for 5 genes in 1.01 seconds\n" ] }, { "data": { "text/html": [ "\n", - "\n", - "
\n", - " \n", + " \n", + "
\n", + " \n", " \n", " \n", @@ -6432,18 +6459,32 @@ " \n", "\n", "\n", - " Loading ITables v2.6.1 from the internet...\n", - " (need help?)\n", - "
\n", - "\n", + " Loading ITables v2.7.3 from the internet...\n", + " (need help?)\n", + " \n", + " \n", + " \n", + "\n", + "\n", "\n" @@ -6502,7 +6543,7 @@ "provenance": [] }, "kernelspec": { - "display_name": "sc-demo", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -6516,7 +6557,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.0" + "version": "3.14.3" } }, "nbformat": 4, diff --git a/docs/user-guide/doc-odm-user-guide/doc-odm-user-guide/notebooks/sc_transformations_demo.ipynb b/docs/user-guide/doc-odm-user-guide/doc-odm-user-guide/notebooks/sc_transformations_demo.ipynb index 742adcc..4a683d2 100644 --- a/docs/user-guide/doc-odm-user-guide/doc-odm-user-guide/notebooks/sc_transformations_demo.ipynb +++ b/docs/user-guide/doc-odm-user-guide/doc-odm-user-guide/notebooks/sc_transformations_demo.ipynb @@ -7,7 +7,7 @@ "id": "21f19756" }, "source": [ - "![Genestack ODM](gs_odm_header.png)\n", + "![Genestack ODM](https://raw.githubusercontent.com/genestack/user-docs/develop/docs/user-guide/doc-odm-user-guide/doc-odm-user-guide/notebooks/gs_odm_header.png)\n", "# Single-Cell RNA-Seq: Data Transformation and Upload to ODM\n", "\n", "**Contact:** support@genestack.com \n", @@ -67,7 +67,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "c1bae7ce", "metadata": { "id": "c1bae7ce" @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "13665f56", "metadata": { "id": "13665f56" @@ -513,7 +513,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "e3e9a7b3", "metadata": {}, "outputs": [], @@ -534,7 +534,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "361ba90e", "metadata": {}, "outputs": [], @@ -581,14 +581,14 @@ "### 4.1 Transformation Configuration\n", "In this step, `TransformationConfigurationsApi` is initialized.\n", "\n", - "A transformation configuration is a JSON document stored in ODM that describes how a source HDF5 file should be processed. It specifies:\n", + "A transformation configuration is a JSON document stored in ODM that describes how a source HDF5 file should be processed.\n", "\n", "Configurations are stored independently of any particular job, so the same configuration can be reused across multiple files with an identical structure. This section demonstrates how to list available configurations, inspect an existing one, and create a new one from scratch." ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "322021b6", "metadata": { "id": "322021b6", @@ -633,7 +633,7 @@ " } for cfg in configs])\n", " display(HTML(df.to_html(index=False)))\n", "else:\n", - " display(HTML(\"
No transformation configurations available.
\"))\n" + " display(HTML(\"
No transformation configurations available.
\"))" ] }, { @@ -663,7 +663,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "id": "7724c2b9", "metadata": {}, "outputs": [], @@ -701,7 +701,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "id": "32ecb952", "metadata": {}, "outputs": [ @@ -709,7 +709,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Created configuration ID: 835356550\n" + "Created configuration ID: 82095331\n" ] } ], @@ -724,7 +724,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "id": "d3ba8b4c", "metadata": {}, "outputs": [ @@ -783,7 +783,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "id": "15d7419a", "metadata": {}, "outputs": [], @@ -810,7 +810,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "id": "70528193", "metadata": {}, "outputs": [ @@ -818,15 +818,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "Name: hdf5-cells\n", - "Description: Import single-cell data and metadata from HDF5 format to ODM\n", - "Input formats: ['h5ad', 'h5']\n", - "Output formats: [, , , , , ]\n", - "----------------------------------------\n", "Name: metadata-basic\n", "Description: Basic converter from attachment to metadata\n", "Input formats: ['csv']\n", "Output formats: []\n", + "----------------------------------------\n", + "Name: hdf5-cells\n", + "Description: Import single-cell data and metadata from HDF5 format to ODM\n", + "Input formats: ['h5ad', 'h5']\n", + "Output formats: [, , , , , ]\n", "----------------------------------------\n" ] } @@ -873,7 +873,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "id": "77abab2d", "metadata": {}, "outputs": [], @@ -925,7 +925,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "id": "ee41a848", "metadata": { "id": "ee41a848", @@ -947,7 +947,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "id": "aee12b24", "metadata": {}, "outputs": [ @@ -955,7 +955,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Job ID: 603969471\n" + "Job ID: 1887251757\n" ] } ], @@ -968,7 +968,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, "id": "5e38e1d6", "metadata": {}, "outputs": [ @@ -988,7 +988,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 18, "id": "bf9afe06", "metadata": {}, "outputs": [ @@ -1007,239 +1007,239 @@ " \n", " \n", " \n", - " 2026-03-31 09:53:10.399465+00:00\n", + " 2026-04-14 15:25:38.222730+00:00\n", " INFO\n", " Memory limit set to 9.50 GB.\n", " \n", " \n", - " 2026-03-31 09:53:10.399748+00:00\n", + " 2026-04-14 15:25:38.222999+00:00\n", " INFO\n", " Transformation image name: hdf5-cells.\n", " \n", " \n", - " 2026-03-31 09:53:10.399926+00:00\n", + " 2026-04-14 15:25:38.223140+00:00\n", " INFO\n", " Transformation image version: 0.1.1.\n", " \n", " \n", - " 2026-03-31 09:53:10.400077+00:00\n", + " 2026-04-14 15:25:38.223261+00:00\n", " INFO\n", - " Configuration ID: 835356550.\n", + " Configuration ID: 82095331.\n", " \n", " \n", - " 2026-03-31 09:53:10.400290+00:00\n", + " 2026-04-14 15:25:38.223455+00:00\n", " INFO\n", " Dry run mode enabled! No changes will be made in ODM.\n", " \n", " \n", - " 2026-03-31 09:53:10.400435+00:00\n", + " 2026-04-14 15:25:38.223592+00:00\n", " INFO\n", " Starting configuration validation...\n", " \n", " \n", - " 2026-03-31 09:53:10.400576+00:00\n", + " 2026-04-14 15:25:38.223706+00:00\n", " INFO\n", " Validating top-level configuration keys...\n", " \n", " \n", - " 2026-03-31 09:53:10.400719+00:00\n", + " 2026-04-14 15:25:38.223822+00:00\n", " INFO\n", " Validating cell_metadata configuration...\n", " \n", " \n", - " 2026-03-31 09:53:10.400860+00:00\n", + " 2026-04-14 15:25:38.223938+00:00\n", " INFO\n", " Validating feature_metadata configuration...\n", " \n", " \n", - " 2026-03-31 09:53:10.401003+00:00\n", + " 2026-04-14 15:25:38.224054+00:00\n", " INFO\n", " Validating cell_expression configuration...\n", " \n", " \n", - " 2026-03-31 09:53:10.401139+00:00\n", + " 2026-04-14 15:25:38.224167+00:00\n", " INFO\n", " Configuration file validated successfully.\n", " \n", " \n", - " 2026-03-31 09:53:10.401304+00:00\n", + " 2026-04-14 15:25:38.224303+00:00\n", " INFO\n", - " Starting transformation for attachment GSF001458 (1/1)...\n", + " Starting transformation for attachment GSF1653412 (1/1)...\n", " \n", " \n", - " 2026-03-31 09:53:10.435306+00:00\n", + " 2026-04-14 15:25:38.250774+00:00\n", " INFO\n", - " Attachment metadata retrieved: {'genestack:accession': 'GSF001458', 'genestack:name': 'GSE210077_adata_healthy_diseased_nucseq_sparse.h5ad', 'Experimental Platform': 'Illumina NovaSeq 6000', 'Processing QC': 'Remove low-UMI nuclei; doublets removed', 'Source': 'Data was obtained from the Human Cell Atlas repository, project FibroticLiverWatsonMERFISH. Data available in https://explore.data.humancellatlas.org/projects/64809a52-f703-4aec-b3a5-eca808a971d0 ', 'Total Number of Cells or Nuclei': '27692', 'Library Preparation Protocol': '10x Genomics Chromium Single Cell 3′', 'Alignment & Quantification Method': 'Integration mapping with Cell Ranger v7.0.1 ', 'Comment': 'Original file adata_healthy_diseased_nucseq_.h5ad was obtained from the HCA repository (FibroticLiverWatsonMERFISH). It contained data from healthy and diseased patient samples, which were processed with snRNA-Seq. The file was converted to sparse format to reduce size and improve efficiency.', 'Preparation QC': 'DAPI-based nuclear QC and slide quality inspection', 'Genome Version': 'GRCh38', 'Nuclei Permeabilization': 'Nuclei isolated using lysis buffer (PBS+BSA+RNAse)', 'Normalization Method': 'Log-normalisation; spatial integration', 'Assay Type': 'Spatial-seq', 'Annotation': 'Annotation via liver cell markers; spatial integration', 'Data Class': 'Single-cell transcriptomics', 'Experimental Platform ID': 'GPL24676', 'Library Preparation Version': 'v3', 'Experiment Site': 'Massachusetts General Hospital, USA'}.\n", + " Attachment metadata retrieved: {'genestack:accession': 'GSF1653412', 'genestack:name': 'GSE210077_adata_healthy_diseased_nucseq_sparse.h5ad', 'Experimental Platform': 'Illumina NovaSeq 6000', 'Processing QC': 'Remove low-UMI nuclei; doublets removed', 'Source': 'Data was obtained from the Human Cell Atlas repository, project FibroticLiverWatsonMERFISH. Data available in https://explore.data.humancellatlas.org/projects/64809a52-f703-4aec-b3a5-eca808a971d0 ', 'Total Number of Cells or Nuclei': '27692', 'Library Preparation Protocol': '10x Genomics Chromium Single Cell 3′', 'Alignment & Quantification Method': 'Integration mapping with Cell Ranger v7.0.1 ', 'Comment': 'Original file adata_healthy_diseased_nucseq_.h5ad was obtained from the HCA repository (FibroticLiverWatsonMERFISH). It contained data from healthy and diseased patient samples, which were processed with snRNA-Seq. The file was converted to sparse format to reduce size and improve efficiency.', 'Preparation QC': 'DAPI-based nuclear QC and slide quality inspection', 'Genome Version': 'GRCh38', 'Nuclei Permeabilization': 'Nuclei isolated using lysis buffer (PBS+BSA+RNAse)', 'Normalization Method': 'Log-normalisation; spatial integration', 'Assay Type': 'Spatial-seq', 'Annotation': 'Annotation via liver cell markers; spatial integration', 'Data Class': 'Single-cell transcriptomics', 'Experimental Platform ID': 'GPL24676', 'Library Preparation Version': 'v3', 'Experiment Site': 'Massachusetts General Hospital, USA'}.\n", " \n", " \n", - " 2026-03-31 09:53:10.450673+00:00\n", + " 2026-04-14 15:25:38.275534+00:00\n", " INFO\n", - " Found study accession: GSF001440.\n", + " Found study accession: GSF1653394.\n", " \n", " \n", - " 2026-03-31 09:53:10.451005+00:00\n", + " 2026-04-14 15:25:38.275939+00:00\n", " INFO\n", - " Retrieving sample metadata for accession GSF001440...\n", + " Retrieving sample metadata for accession GSF1653394...\n", " \n", " \n", - " 2026-03-31 09:53:10.469280+00:00\n", + " 2026-04-14 15:25:38.310874+00:00\n", " INFO\n", " Sample metadata retrieved successfully. Total items: 6.\n", " \n", " \n", - " 2026-03-31 09:53:10.492506+00:00\n", + " 2026-04-14 15:25:38.331930+00:00\n", " INFO\n", - " The library group accession(s) found for the study: GSF001449. Will be used to link cell group to library group(s). If change is needed, please specify relevant sample, library or preparation group accession(s) in the config.\n", + " The library group accession(s) found for the study: GSF1653403. Will be used to link cell group to library group(s). If change is needed, please specify relevant sample, library or preparation group accession(s) in the config.\n", " \n", " \n", - " 2026-03-31 09:53:10.492796+00:00\n", + " 2026-04-14 15:25:38.332144+00:00\n", " INFO\n", " Creating copy of the attachment file in temporary directory...\n", " \n", " \n", - " 2026-03-31 09:53:20.010758+00:00\n", + " 2026-04-14 15:25:59.974098+00:00\n", " INFO\n", " Reading HDF5 file structure...\n", " \n", " \n", - " 2026-03-31 09:53:20.011618+00:00\n", + " 2026-04-14 15:25:59.975127+00:00\n", " INFO\n", " Keys (groups): 'X', 'layers', 'obs', 'obsm', 'obsp', 'raw', 'uns', 'var', 'varm', 'varp'.\n", " \n", " \n", - " 2026-03-31 09:53:20.012056+00:00\n", + " 2026-04-14 15:25:59.975686+00:00\n", " INFO\n", " Group: 'X'. Type: 'expression'. Shape: (27692, 24619).\n", " \n", " \n", - " 2026-03-31 09:53:20.054059+00:00\n", + " 2026-04-14 15:26:00.034478+00:00\n", " INFO\n", " Group: 'obs'. Type: 'metadata'. Shape: (27692, 27). Index: '(unnamed)', first values: 'Liver.32_AAACCCAAGACTACCT.1-0', 'Liver.32_AAACCCAAGGCTTAAA.1-0', 'Liver.32_AAACCCAGTCACTCTC.1-0', 'Liver.32_AAACCCAGTCTGTAGT.1-0', 'Liver.32_AAACCCATCTGAACGT.1-0'. Columns and data types: ('Condition', category), ('Sex', category), ('Age', category), ('log10GenesPerUMI_injured', float64), ('seurat_clusters_injured', category), ('CellType_injured', category), ('cell_type_final_injured', category), ('log10GenesPerUMI_healthy', float64), ('seurat_clusters_healthy', category), ('CellType_healthy', category), ('cell_type_final_healthy', category), ('batch', category), ('n_counts', float32), ('log_counts', float32), ('n_genes', int32), ('sample_id', category), ('organism_ontology_term_id', category), ('donor_id', category), ('development_stage_ontology_term_id', category), ('sex_ontology_term_id', category), ('self_reported_ethnicity_ontology_term_id', category), ('disease_ontology_term_id', category), ('tissue_type', category), ('tissue_ontology_term_id', category), ('cell_type_ontology_term_id', category), ('assay_ontology_term_id', category), ('suspension_type', category).\n", " \n", " \n", - " 2026-03-31 09:53:20.054882+00:00\n", + " 2026-04-14 15:26:00.035695+00:00\n", " INFO\n", " Group: 'obsm'. Type: 'embedding'. Item: 'X_pca'. Shape: (27692, 25).\n", " \n", " \n", - " 2026-03-31 09:53:20.055200+00:00\n", + " 2026-04-14 15:26:00.036036+00:00\n", " INFO\n", " Group: 'obsm'. Type: 'embedding'. Item: 'X_pca_harmony'. Shape: (27692, 25).\n", " \n", " \n", - " 2026-03-31 09:53:20.055481+00:00\n", + " 2026-04-14 15:26:00.036346+00:00\n", " INFO\n", " Group: 'obsm'. Type: 'embedding'. Item: 'X_umap'. Shape: (27692, 2).\n", " \n", " \n", - " 2026-03-31 09:53:20.055891+00:00\n", + " 2026-04-14 15:26:00.036901+00:00\n", " INFO\n", " Group: 'obsp'. Type: 'pairwise'. Item: 'connectivities'. Shape: (27692, 27692).\n", " \n", " \n", - " 2026-03-31 09:53:20.056167+00:00\n", + " 2026-04-14 15:26:00.037219+00:00\n", " INFO\n", " Group: 'obsp'. Type: 'pairwise'. Item: 'distances'. Shape: (27692, 27692).\n", " \n", " \n", - " 2026-03-31 09:53:20.056413+00:00\n", + " 2026-04-14 15:26:00.037523+00:00\n", " INFO\n", " Group: 'raw'. Type: 'raw'. Items: 'X', 'var', 'varm'.\n", " \n", " \n", - " 2026-03-31 09:53:20.056680+00:00\n", + " 2026-04-14 15:26:00.037852+00:00\n", " INFO\n", " Group: 'uns'. Type: 'unstructured'. Items: 'Age_colors', 'CellType_healthy_colors', 'CellType_injured_colors', 'Condition_colors', 'SampleID_colors', 'Sex_colors', 'batch_colors', 'cell_type_final_healthy_colors', 'cell_type_final_injured_colors', 'cell_type_ontology_term_id_colors', 'development_stage_ontology_term_id_colors', 'disease_ontology_term_id_colors', 'hvg', 'log1p', 'neighbors', 'pca', 'sample_id_colors', 'seurat_clusters_healthy_colors', 'seurat_clusters_injured_colors', 'umap'.\n", " \n", " \n", - " 2026-03-31 09:53:20.069451+00:00\n", + " 2026-04-14 15:26:00.057865+00:00\n", " INFO\n", " Group: 'var'. Type: 'metadata'. Shape: (24619, 4). Index: '(unnamed)', first values: 'ENSG00000238009', 'ENSG00000268903', 'ENSG00000241860', 'ENSG00000228463', 'ENSG00000290385'. Columns and data types: ('highly_variable', bool), ('means', float64), ('dispersions', float64), ('dispersions_norm', float32).\n", " \n", " \n", - " 2026-03-31 09:53:20.070027+00:00\n", + " 2026-04-14 15:26:00.058587+00:00\n", " INFO\n", " Group: 'varm'. Type: 'embedding'. Item: 'PCs'. Shape: (24619, 25).\n", " \n", " \n", - " 2026-03-31 09:53:20.071023+00:00\n", + " 2026-04-14 15:26:00.059946+00:00\n", " INFO\n", " Extracting cell metadata from GSE210077_adata_healthy_diseased_nucseq_sparse.h5ad...\n", " \n", " \n", - " 2026-03-31 09:53:20.071498+00:00\n", + " 2026-04-14 15:26:00.060501+00:00\n", " INFO\n", " Reading cell metadata from 'obs'...\n", " \n", " \n", - " 2026-03-31 09:53:20.105992+00:00\n", + " 2026-04-14 15:26:00.099327+00:00\n", " INFO\n", " Extracting index column of cell metadata...\n", " \n", " \n", - " 2026-03-31 09:53:20.106223+00:00\n", + " 2026-04-14 15:26:00.099584+00:00\n", " INFO\n", " Unnamed index found, index column name set to: _index.\n", " \n", " \n", - " 2026-03-31 09:53:20.106968+00:00\n", + " 2026-04-14 15:26:00.100310+00:00\n", " INFO\n", " Shape of the initial cell metadata table: (27692, 28) (cells x attributes).\n", " \n", " \n", - " 2026-03-31 09:53:20.107165+00:00\n", + " 2026-04-14 15:26:00.100526+00:00\n", " INFO\n", " Columns of the initial cell metadata table: '_index', 'Condition', 'Sex', 'Age', 'log10GenesPerUMI_injured', 'seurat_clusters_injured', 'CellType_injured', 'cell_type_final_injured', 'log10GenesPerUMI_healthy', 'seurat_clusters_healthy', 'CellType_healthy', 'cell_type_final_healthy', 'batch', 'n_counts', 'log_counts', 'n_genes', 'sample_id', 'organism_ontology_term_id', 'donor_id', 'development_stage_ontology_term_id', 'sex_ontology_term_id', 'self_reported_ethnicity_ontology_term_id', 'disease_ontology_term_id', 'tissue_type', 'tissue_ontology_term_id', 'cell_type_ontology_term_id', 'assay_ontology_term_id', 'suspension_type'.\n", " \n", " \n", - " 2026-03-31 09:53:20.108117+00:00\n", + " 2026-04-14 15:26:00.101386+00:00\n", " INFO\n", " Mapping columns to standardized names...\n", " \n", " \n", - " 2026-03-31 09:53:20.110669+00:00\n", + " 2026-04-14 15:26:00.103907+00:00\n", " WARNING\n", " Multiple columns ('batch', 'sample_id') would map to the same key 'batch'. Automatic mapping will not be performed for these columns. For automatic mapping of these attributes, please rename the columns in 'columns_renaming_map' section of the extraction config.\n", " \n", " \n", - " 2026-03-31 09:53:20.110869+00:00\n", + " 2026-04-14 15:26:00.104113+00:00\n", " INFO\n", " Checking for duplicate column names and applying suffix if needed...\n", " \n", " \n", - " 2026-03-31 09:53:20.111035+00:00\n", + " 2026-04-14 15:26:00.104342+00:00\n", " INFO\n", " Final column renaming mapping to fit API requirements (Original --> Final ODM API Display Name): ('_index' --> 'index'), ('Condition' --> 'Condition'), ('Sex' --> 'Sex'), ('Age' --> 'Age'), ('log10GenesPerUMI_injured' --> 'log10genesperumiInjured'), ('seurat_clusters_injured' --> 'seuratClustersInjured'), ('CellType_injured' --> 'celltypeInjured'), ('cell_type_final_injured' --> 'cellTypeFinalInjured'), ('log10GenesPerUMI_healthy' --> 'log10genesperumiHealthy'), ('seurat_clusters_healthy' --> 'seuratClustersHealthy'), ('CellType_healthy' --> 'celltypeHealthy'), ('cell_type_final_healthy' --> 'cellTypeFinalHealthy'), ('batch' --> 'batch'), ('n_counts' --> 'nCounts'), ('log_counts' --> 'logCounts'), ('n_genes' --> 'nGenes'), ('sample_id' --> 'sample_id'), ('organism_ontology_term_id' --> 'organismOntologyTermId'), ('donor_id' --> 'donorId'), ('development_stage_ontology_term_id' --> 'developmentStageOntologyTermId'), ('sex_ontology_term_id' --> 'sexOntologyTermId'), ('self_reported_ethnicity_ontology_term_id' --> 'selfReportedEthnicityOntologyTermId'), ('disease_ontology_term_id' --> 'diseaseOntologyTermId'), ('tissue_type' --> 'tissueType'), ('tissue_ontology_term_id' --> 'tissueOntologyTermId'), ('cell_type_ontology_term_id' --> 'cellTypeOntologyTermId'), ('assay_ontology_term_id' --> 'assayOntologyTermId'), ('suspension_type' --> 'suspensionType').\n", " \n", " \n", - " 2026-03-31 09:53:20.111893+00:00\n", + " 2026-04-14 15:26:00.105118+00:00\n", " INFO\n", " Validating standard column data types...\n", " \n", " \n", - " 2026-03-31 09:53:20.113688+00:00\n", + " 2026-04-14 15:26:00.106843+00:00\n", " INFO\n", " Columns converted to expected dtypes: ('batch': category --> string), ('nCounts': float32 --> int64).\n", " \n", " \n", - " 2026-03-31 09:53:20.113954+00:00\n", + " 2026-04-14 15:26:00.107119+00:00\n", " INFO\n", " Column data types validated successfully.\n", " \n", " \n", - " 2026-03-31 09:53:20.114116+00:00\n", + " 2026-04-14 15:26:00.107290+00:00\n", " INFO\n", " Checking required columns for cell metadata...\n", " \n", " \n", - " 2026-03-31 09:53:20.355253+00:00\n", + " 2026-04-14 15:26:00.349871+00:00\n", " ERROR\n", " An error occurred during file processing: Required column 'barcode' is missing.\n", " \n", " \n", - " 2026-03-31 09:53:20.356470+00:00\n", + " 2026-04-14 15:26:00.351019+00:00\n", " INFO\n", - " Transformation of attachment GSF001458 failed.\n", + " Transformation of attachment GSF1653412 failed.\n", " \n", " \n", "\n", @@ -1255,10 +1255,14 @@ } ], "source": [ - "# retrieve and display logs from job id once transformation job is completed\n", - "logs_payload = odm_api.LogsPayload()\n", - "logs = jobs_api.post_api_v1_transformations_jobs_by_id_logs(job_id, logs_payload)\n", - "display_log_records(logs)" + "# retrieve and display logs from job id\n", + "if job_status.status.state.value not in ['UNKNOWN', 'WAITING']:\n", + " logs_payload = odm_api.LogsPayload()\n", + " logs = jobs_api.post_api_v1_transformations_jobs_by_id_logs(job_id, logs_payload)\n", + " display_log_records(logs)\n", + "else:\n", + " print(\"Transformation job has not started yet. Please rerun this cell once \"\n", + " \"the job is in progress or completed.\")" ] }, { @@ -1303,7 +1307,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "2771fd60", "metadata": {}, "outputs": [], @@ -1401,7 +1405,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 20, "id": "f74a981f", "metadata": {}, "outputs": [], @@ -1430,7 +1434,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 21, "id": "62e888a3", "metadata": {}, "outputs": [ @@ -1438,7 +1442,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Job ID: 407960023\n" + "Job ID: 1384637594\n" ] } ], @@ -1451,7 +1455,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 22, "id": "4167d27f", "metadata": {}, "outputs": [ @@ -1471,7 +1475,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 23, "id": "ef5d758a", "metadata": {}, "outputs": [ @@ -1490,634 +1494,634 @@ " \n", " \n", " \n", - " 2026-03-31 09:56:02.721236+00:00\n", + " 2026-04-14 15:27:21.243612+00:00\n", " INFO\n", " Memory limit set to 9.50 GB.\n", " \n", " \n", - " 2026-03-31 09:56:02.721531+00:00\n", + " 2026-04-14 15:27:21.243939+00:00\n", " INFO\n", " Transformation image name: hdf5-cells.\n", " \n", " \n", - " 2026-03-31 09:56:02.721675+00:00\n", + " 2026-04-14 15:27:21.244135+00:00\n", " INFO\n", " Transformation image version: 0.1.1.\n", " \n", " \n", - " 2026-03-31 09:56:02.721802+00:00\n", + " 2026-04-14 15:27:21.244325+00:00\n", " INFO\n", - " Configuration ID: 835356550.\n", + " Configuration ID: 82095331.\n", " \n", " \n", - " 2026-03-31 09:56:02.722009+00:00\n", + " 2026-04-14 15:27:21.244651+00:00\n", " INFO\n", " Dry run mode enabled! No changes will be made in ODM.\n", " \n", " \n", - " 2026-03-31 09:56:02.722147+00:00\n", + " 2026-04-14 15:27:21.244800+00:00\n", " INFO\n", " Starting configuration validation...\n", " \n", " \n", - " 2026-03-31 09:56:02.722267+00:00\n", + " 2026-04-14 15:27:21.244965+00:00\n", " INFO\n", " Validating top-level configuration keys...\n", " \n", " \n", - " 2026-03-31 09:56:02.722385+00:00\n", + " 2026-04-14 15:27:21.245141+00:00\n", " INFO\n", " Validating biosample_metadata configuration...\n", " \n", " \n", - " 2026-03-31 09:56:02.722511+00:00\n", + " 2026-04-14 15:27:21.245329+00:00\n", " INFO\n", " Validating cell_metadata configuration...\n", " \n", " \n", - " 2026-03-31 09:56:02.722630+00:00\n", + " 2026-04-14 15:27:21.245506+00:00\n", " INFO\n", " Validating feature_metadata configuration...\n", " \n", " \n", - " 2026-03-31 09:56:02.722748+00:00\n", + " 2026-04-14 15:27:21.245683+00:00\n", " INFO\n", " Validating cell_expression configuration...\n", " \n", " \n", - " 2026-03-31 09:56:02.722861+00:00\n", + " 2026-04-14 15:27:21.245853+00:00\n", " INFO\n", " Configuration file validated successfully.\n", " \n", " \n", - " 2026-03-31 09:56:02.722996+00:00\n", + " 2026-04-14 15:27:21.246042+00:00\n", " INFO\n", - " Starting transformation for attachment GSF001458 (1/1)...\n", + " Starting transformation for attachment GSF1653412 (1/1)...\n", " \n", " \n", - " 2026-03-31 09:56:02.745212+00:00\n", + " 2026-04-14 15:27:21.270882+00:00\n", " INFO\n", - " Attachment metadata retrieved: {'genestack:accession': 'GSF001458', 'genestack:name': 'GSE210077_adata_healthy_diseased_nucseq_sparse.h5ad', 'Experimental Platform': 'Illumina NovaSeq 6000', 'Processing QC': 'Remove low-UMI nuclei; doublets removed', 'Source': 'Data was obtained from the Human Cell Atlas repository, project FibroticLiverWatsonMERFISH. Data available in https://explore.data.humancellatlas.org/projects/64809a52-f703-4aec-b3a5-eca808a971d0 ', 'Total Number of Cells or Nuclei': '27692', 'Library Preparation Protocol': '10x Genomics Chromium Single Cell 3′', 'Alignment & Quantification Method': 'Integration mapping with Cell Ranger v7.0.1 ', 'Comment': 'Original file adata_healthy_diseased_nucseq_.h5ad was obtained from the HCA repository (FibroticLiverWatsonMERFISH). It contained data from healthy and diseased patient samples, which were processed with snRNA-Seq. The file was converted to sparse format to reduce size and improve efficiency.', 'Preparation QC': 'DAPI-based nuclear QC and slide quality inspection', 'Genome Version': 'GRCh38', 'Nuclei Permeabilization': 'Nuclei isolated using lysis buffer (PBS+BSA+RNAse)', 'Normalization Method': 'Log-normalisation; spatial integration', 'Assay Type': 'Spatial-seq', 'Annotation': 'Annotation via liver cell markers; spatial integration', 'Data Class': 'Single-cell transcriptomics', 'Experimental Platform ID': 'GPL24676', 'Library Preparation Version': 'v3', 'Experiment Site': 'Massachusetts General Hospital, USA'}.\n", + " Attachment metadata retrieved: {'genestack:accession': 'GSF1653412', 'genestack:name': 'GSE210077_adata_healthy_diseased_nucseq_sparse.h5ad', 'Experimental Platform': 'Illumina NovaSeq 6000', 'Processing QC': 'Remove low-UMI nuclei; doublets removed', 'Source': 'Data was obtained from the Human Cell Atlas repository, project FibroticLiverWatsonMERFISH. Data available in https://explore.data.humancellatlas.org/projects/64809a52-f703-4aec-b3a5-eca808a971d0 ', 'Total Number of Cells or Nuclei': '27692', 'Library Preparation Protocol': '10x Genomics Chromium Single Cell 3′', 'Alignment & Quantification Method': 'Integration mapping with Cell Ranger v7.0.1 ', 'Comment': 'Original file adata_healthy_diseased_nucseq_.h5ad was obtained from the HCA repository (FibroticLiverWatsonMERFISH). It contained data from healthy and diseased patient samples, which were processed with snRNA-Seq. The file was converted to sparse format to reduce size and improve efficiency.', 'Preparation QC': 'DAPI-based nuclear QC and slide quality inspection', 'Genome Version': 'GRCh38', 'Nuclei Permeabilization': 'Nuclei isolated using lysis buffer (PBS+BSA+RNAse)', 'Normalization Method': 'Log-normalisation; spatial integration', 'Assay Type': 'Spatial-seq', 'Annotation': 'Annotation via liver cell markers; spatial integration', 'Data Class': 'Single-cell transcriptomics', 'Experimental Platform ID': 'GPL24676', 'Library Preparation Version': 'v3', 'Experiment Site': 'Massachusetts General Hospital, USA'}.\n", " \n", " \n", - " 2026-03-31 09:56:02.759793+00:00\n", + " 2026-04-14 15:27:21.296371+00:00\n", " INFO\n", - " Found study accession: GSF001440.\n", + " Found study accession: GSF1653394.\n", " \n", " \n", - " 2026-03-31 09:56:02.760059+00:00\n", + " 2026-04-14 15:27:21.296662+00:00\n", " INFO\n", - " Retrieving sample metadata for accession GSF001440...\n", + " Retrieving sample metadata for accession GSF1653394...\n", " \n", " \n", - " 2026-03-31 09:56:02.777553+00:00\n", + " 2026-04-14 15:27:21.322406+00:00\n", " INFO\n", " Sample metadata retrieved successfully. Total items: 6.\n", " \n", " \n", - " 2026-03-31 09:56:02.798198+00:00\n", + " 2026-04-14 15:27:21.346115+00:00\n", " INFO\n", - " The library group accession(s) found for the study: GSF001449. Will be used to link cell group to library group(s). If change is needed, please specify relevant sample, library or preparation group accession(s) in the config.\n", + " The library group accession(s) found for the study: GSF1653403. Will be used to link cell group to library group(s). If change is needed, please specify relevant sample, library or preparation group accession(s) in the config.\n", " \n", " \n", - " 2026-03-31 09:56:02.798455+00:00\n", + " 2026-04-14 15:27:21.346364+00:00\n", " INFO\n", " Creating copy of the attachment file in temporary directory...\n", " \n", " \n", - " 2026-03-31 09:56:12.923854+00:00\n", + " 2026-04-14 15:27:44.173223+00:00\n", " INFO\n", " Reading HDF5 file structure...\n", " \n", " \n", - " 2026-03-31 09:56:12.924713+00:00\n", + " 2026-04-14 15:27:44.174265+00:00\n", " INFO\n", " Keys (groups): 'X', 'layers', 'obs', 'obsm', 'obsp', 'raw', 'uns', 'var', 'varm', 'varp'.\n", " \n", " \n", - " 2026-03-31 09:56:12.925156+00:00\n", + " 2026-04-14 15:27:44.174838+00:00\n", " INFO\n", " Group: 'X'. Type: 'expression'. Shape: (27692, 24619).\n", " \n", " \n", - " 2026-03-31 09:56:12.967222+00:00\n", + " 2026-04-14 15:27:44.219702+00:00\n", " INFO\n", " Group: 'obs'. Type: 'metadata'. Shape: (27692, 27). Index: '(unnamed)', first values: 'Liver.32_AAACCCAAGACTACCT.1-0', 'Liver.32_AAACCCAAGGCTTAAA.1-0', 'Liver.32_AAACCCAGTCACTCTC.1-0', 'Liver.32_AAACCCAGTCTGTAGT.1-0', 'Liver.32_AAACCCATCTGAACGT.1-0'. Columns and data types: ('Condition', category), ('Sex', category), ('Age', category), ('log10GenesPerUMI_injured', float64), ('seurat_clusters_injured', category), ('CellType_injured', category), ('cell_type_final_injured', category), ('log10GenesPerUMI_healthy', float64), ('seurat_clusters_healthy', category), ('CellType_healthy', category), ('cell_type_final_healthy', category), ('batch', category), ('n_counts', float32), ('log_counts', float32), ('n_genes', int32), ('sample_id', category), ('organism_ontology_term_id', category), ('donor_id', category), ('development_stage_ontology_term_id', category), ('sex_ontology_term_id', category), ('self_reported_ethnicity_ontology_term_id', category), ('disease_ontology_term_id', category), ('tissue_type', category), ('tissue_ontology_term_id', category), ('cell_type_ontology_term_id', category), ('assay_ontology_term_id', category), ('suspension_type', category).\n", " \n", " \n", - " 2026-03-31 09:56:12.968098+00:00\n", + " 2026-04-14 15:27:44.220667+00:00\n", " INFO\n", " Group: 'obsm'. Type: 'embedding'. Item: 'X_pca'. Shape: (27692, 25).\n", " \n", " \n", - " 2026-03-31 09:56:12.968358+00:00\n", + " 2026-04-14 15:27:44.220958+00:00\n", " INFO\n", " Group: 'obsm'. Type: 'embedding'. Item: 'X_pca_harmony'. Shape: (27692, 25).\n", " \n", " \n", - " 2026-03-31 09:56:12.968589+00:00\n", + " 2026-04-14 15:27:44.221231+00:00\n", " INFO\n", " Group: 'obsm'. Type: 'embedding'. Item: 'X_umap'. Shape: (27692, 2).\n", " \n", " \n", - " 2026-03-31 09:56:12.968973+00:00\n", + " 2026-04-14 15:27:44.221732+00:00\n", " INFO\n", " Group: 'obsp'. Type: 'pairwise'. Item: 'connectivities'. Shape: (27692, 27692).\n", " \n", " \n", - " 2026-03-31 09:56:12.969211+00:00\n", + " 2026-04-14 15:27:44.222053+00:00\n", " INFO\n", " Group: 'obsp'. Type: 'pairwise'. Item: 'distances'. Shape: (27692, 27692).\n", " \n", " \n", - " 2026-03-31 09:56:12.969433+00:00\n", + " 2026-04-14 15:27:44.222304+00:00\n", " INFO\n", " Group: 'raw'. Type: 'raw'. Items: 'X', 'var', 'varm'.\n", " \n", " \n", - " 2026-03-31 09:56:12.969685+00:00\n", + " 2026-04-14 15:27:44.222575+00:00\n", " INFO\n", " Group: 'uns'. Type: 'unstructured'. Items: 'Age_colors', 'CellType_healthy_colors', 'CellType_injured_colors', 'Condition_colors', 'SampleID_colors', 'Sex_colors', 'batch_colors', 'cell_type_final_healthy_colors', 'cell_type_final_injured_colors', 'cell_type_ontology_term_id_colors', 'development_stage_ontology_term_id_colors', 'disease_ontology_term_id_colors', 'hvg', 'log1p', 'neighbors', 'pca', 'sample_id_colors', 'seurat_clusters_healthy_colors', 'seurat_clusters_injured_colors', 'umap'.\n", " \n", " \n", - " 2026-03-31 09:56:12.982246+00:00\n", + " 2026-04-14 15:27:44.235268+00:00\n", " INFO\n", " Group: 'var'. Type: 'metadata'. Shape: (24619, 4). Index: '(unnamed)', first values: 'ENSG00000238009', 'ENSG00000268903', 'ENSG00000241860', 'ENSG00000228463', 'ENSG00000290385'. Columns and data types: ('highly_variable', bool), ('means', float64), ('dispersions', float64), ('dispersions_norm', float32).\n", " \n", " \n", - " 2026-03-31 09:56:12.982803+00:00\n", + " 2026-04-14 15:27:44.235801+00:00\n", " INFO\n", " Group: 'varm'. Type: 'embedding'. Item: 'PCs'. Shape: (24619, 25).\n", " \n", " \n", - " 2026-03-31 09:56:12.983841+00:00\n", + " 2026-04-14 15:27:44.236792+00:00\n", " INFO\n", " Extracting sample metadata from GSE210077_adata_healthy_diseased_nucseq_sparse.h5ad...\n", " \n", " \n", - " 2026-03-31 09:56:12.984291+00:00\n", + " 2026-04-14 15:27:44.237265+00:00\n", " INFO\n", " Reading sample metadata from 'obs'...\n", " \n", " \n", - " 2026-03-31 09:56:13.019737+00:00\n", + " 2026-04-14 15:27:44.272444+00:00\n", " INFO\n", " Configured sample column name: 'sample_id'.\n", " \n", " \n", - " 2026-03-31 09:56:13.020347+00:00\n", + " 2026-04-14 15:27:44.273088+00:00\n", " INFO\n", " First sample names: 'AM031', 'AM062', 'AM072', 'AM042', 'AM048'.\n", " \n", " \n", - " 2026-03-31 09:56:13.020526+00:00\n", + " 2026-04-14 15:27:44.273291+00:00\n", " INFO\n", " Renaming 'sample_id' column name to 'Sample Source ID'...\n", " \n", " \n", - " 2026-03-31 09:56:13.024689+00:00\n", + " 2026-04-14 15:27:44.277640+00:00\n", " INFO\n", " Columns renamed: ('Condition' --> 'Condition Group'), ('self_reported_ethnicity_ontology_term_id' --> 'Donor Ethnicity Term ID'), ('tissue_type' --> 'Cell Source').\n", " \n", " \n", - " 2026-03-31 09:56:13.025798+00:00\n", + " 2026-04-14 15:27:44.278884+00:00\n", " INFO\n", " Curated values — ('Sample Source ID': 'AM031' --> 'Liver-32', 'AM042' --> 'Liver-13', 'AM048' --> 'Liver-14', 'AM061' --> 'Liver-18', 'AM062' --> 'Liver-33', 'AM072' --> 'Liver-34').\n", " \n", " \n", - " 2026-03-31 09:56:13.025988+00:00\n", + " 2026-04-14 15:27:44.279093+00:00\n", " INFO\n", " Shape of the transformed sample metadata table: (6, 4) (sample objects x attributes).\n", " \n", " \n", - " 2026-03-31 09:56:13.026160+00:00\n", + " 2026-04-14 15:27:44.279283+00:00\n", " INFO\n", " Columns of the transformed sample metadata table: 'Sample Source ID', 'Condition Group', 'Donor Ethnicity Term ID', 'Cell Source'.\n", " \n", " \n", - " 2026-03-31 09:56:13.026312+00:00\n", + " 2026-04-14 15:27:44.279487+00:00\n", " INFO\n", - " Saving sample metadata to GSF001458_sample_metadata.tsv file...\n", + " Saving sample metadata to GSF1653412_sample_metadata.tsv file...\n", " \n", " \n", - " 2026-03-31 09:56:13.030032+00:00\n", + " 2026-04-14 15:27:44.283679+00:00\n", " INFO\n", " Sample metadata processing successfully completed.\n", " \n", " \n", - " 2026-03-31 09:56:13.030673+00:00\n", + " 2026-04-14 15:27:44.284340+00:00\n", " INFO\n", " Validating existing sample metadata update...\n", " \n", " \n", - " 2026-03-31 09:56:13.030876+00:00\n", + " 2026-04-14 15:27:44.284579+00:00\n", " INFO\n", - " Retrieving sample metadata for accession GSF001440...\n", + " Retrieving sample metadata for accession GSF1653394...\n", " \n", " \n", - " 2026-03-31 09:56:13.050611+00:00\n", + " 2026-04-14 15:27:44.314230+00:00\n", " INFO\n", " Sample metadata retrieved successfully. Total items: 6.\n", " \n", " \n", - " 2026-03-31 09:56:13.054735+00:00\n", + " 2026-04-14 15:27:44.319734+00:00\n", " INFO\n", " All 6 sample objects were found in existing study-associated metadata and will be updated with new attributes.\n", " \n", " \n", - " 2026-03-31 09:56:13.055206+00:00\n", + " 2026-04-14 15:27:44.320237+00:00\n", " INFO\n", " Extracting cell metadata from GSE210077_adata_healthy_diseased_nucseq_sparse.h5ad...\n", " \n", " \n", - " 2026-03-31 09:56:13.055809+00:00\n", + " 2026-04-14 15:27:44.320856+00:00\n", " INFO\n", " Reading cell metadata from 'obs'...\n", " \n", " \n", - " 2026-03-31 09:56:13.091345+00:00\n", + " 2026-04-14 15:27:44.358468+00:00\n", " INFO\n", " Adding X_pca column from group...\n", " \n", " \n", - " 2026-03-31 09:56:13.431880+00:00\n", + " 2026-04-14 15:27:44.707264+00:00\n", " INFO\n", " Adding X_pca_harmony column from group...\n", " \n", " \n", - " 2026-03-31 09:56:13.806226+00:00\n", + " 2026-04-14 15:27:45.071378+00:00\n", " INFO\n", " Adding X_umap column from group...\n", " \n", " \n", - " 2026-03-31 09:56:13.857010+00:00\n", + " 2026-04-14 15:27:45.120714+00:00\n", " INFO\n", " Adding connectivities column from group...\n", " \n", " \n", - " 2026-03-31 09:56:13.869066+00:00\n", + " 2026-04-14 15:27:45.133880+00:00\n", " INFO\n", " Adding distances column from group...\n", " \n", " \n", - " 2026-03-31 09:56:13.877636+00:00\n", + " 2026-04-14 15:27:45.143383+00:00\n", " INFO\n", " Extracting index column of cell metadata...\n", " \n", " \n", - " 2026-03-31 09:56:13.877919+00:00\n", + " 2026-04-14 15:27:45.143647+00:00\n", " INFO\n", " Unnamed index found, index column name set to: _index.\n", " \n", " \n", - " 2026-03-31 09:56:13.878562+00:00\n", + " 2026-04-14 15:27:45.144324+00:00\n", " INFO\n", " Shape of the initial cell metadata table: (27692, 33) (cells x attributes).\n", " \n", " \n", - " 2026-03-31 09:56:13.878763+00:00\n", + " 2026-04-14 15:27:45.144539+00:00\n", " INFO\n", " Columns of the initial cell metadata table: '_index', 'Condition', 'Sex', 'Age', 'log10GenesPerUMI_injured', 'seurat_clusters_injured', 'CellType_injured', 'cell_type_final_injured', 'log10GenesPerUMI_healthy', 'seurat_clusters_healthy', 'CellType_healthy', 'cell_type_final_healthy', 'batch', 'n_counts', 'log_counts', 'n_genes', 'sample_id', 'organism_ontology_term_id', 'donor_id', 'development_stage_ontology_term_id', 'sex_ontology_term_id', 'self_reported_ethnicity_ontology_term_id', 'disease_ontology_term_id', 'tissue_type', 'tissue_ontology_term_id', 'cell_type_ontology_term_id', 'assay_ontology_term_id', 'suspension_type', 'X_pca', 'X_pca_harmony', 'X_umap', 'mean_connectivities', 'mean_distances'.\n", " \n", " \n", - " 2026-03-31 09:56:13.878943+00:00\n", + " 2026-04-14 15:27:45.144724+00:00\n", " INFO\n", " Dropping columns...\n", " \n", " \n", - " 2026-03-31 09:56:13.881555+00:00\n", + " 2026-04-14 15:27:45.147218+00:00\n", " INFO\n", - " The following columns were dropped from metadata: 'batch', 'sex_ontology_term_id', 'development_stage_ontology_term_id', 'Sex', 'disease_ontology_term_id', 'Condition', 'donor_id', 'tissue_ontology_term_id', 'tissue_type', 'self_reported_ethnicity_ontology_term_id', 'Age', 'organism_ontology_term_id'.\n", + " The following columns were dropped from metadata: 'donor_id', 'sex_ontology_term_id', 'tissue_ontology_term_id', 'development_stage_ontology_term_id', 'tissue_type', 'Age', 'disease_ontology_term_id', 'Sex', 'Condition', 'batch', 'self_reported_ethnicity_ontology_term_id', 'organism_ontology_term_id'.\n", " \n", " \n", - " 2026-03-31 09:56:13.882190+00:00\n", + " 2026-04-14 15:27:45.147794+00:00\n", " INFO\n", " Applying column name changes...\n", " \n", " \n", - " 2026-03-31 09:56:13.886084+00:00\n", + " 2026-04-14 15:27:45.151765+00:00\n", " INFO\n", " Columns renamed: ('_index' --> 'barcode'), ('cell_type_ontology_term_id' --> 'cell_type'), ('sample_id' --> 'batch').\n", " \n", " \n", - " 2026-03-31 09:56:13.886521+00:00\n", + " 2026-04-14 15:27:45.152214+00:00\n", " INFO\n", " Curating values...\n", " \n", " \n", - " 2026-03-31 09:56:13.887553+00:00\n", + " 2026-04-14 15:27:45.153269+00:00\n", " INFO\n", " Curated values — ('batch': 'AM031' --> 'Liver-32', 'AM042' --> 'Liver-13', 'AM048' --> 'Liver-14', 'AM061' --> 'Liver-18', 'AM062' --> 'Liver-33', 'AM072' --> 'Liver-34').\n", " \n", " \n", - " 2026-03-31 09:56:13.888693+00:00\n", + " 2026-04-14 15:27:45.154305+00:00\n", " INFO\n", " Mapping columns to standardized names...\n", " \n", " \n", - " 2026-03-31 09:56:13.890251+00:00\n", + " 2026-04-14 15:27:45.155921+00:00\n", " INFO\n", " Checking for duplicate column names and applying suffix if needed...\n", " \n", " \n", - " 2026-03-31 09:56:13.890455+00:00\n", + " 2026-04-14 15:27:45.156134+00:00\n", " INFO\n", " Final column renaming mapping to fit API requirements (Original --> Final ODM API Display Name): ('barcode' --> 'barcode'), ('log10GenesPerUMI_injured' --> 'log10genesperumiInjured'), ('seurat_clusters_injured' --> 'seuratClustersInjured'), ('CellType_injured' --> 'celltypeInjured'), ('cell_type_final_injured' --> 'cellTypeFinalInjured'), ('log10GenesPerUMI_healthy' --> 'log10genesperumiHealthy'), ('seurat_clusters_healthy' --> 'seuratClustersHealthy'), ('CellType_healthy' --> 'celltypeHealthy'), ('cell_type_final_healthy' --> 'cellTypeFinalHealthy'), ('n_counts' --> 'nCounts'), ('log_counts' --> 'logCounts'), ('n_genes' --> 'nGenes'), ('batch' --> 'batch'), ('cell_type' --> 'cellType'), ('assay_ontology_term_id' --> 'assayOntologyTermId'), ('suspension_type' --> 'suspensionType'), ('X_pca' --> 'pca'), ('X_pca_harmony' --> 'pcaHarmony'), ('X_umap' --> 'umap'), ('mean_connectivities' --> 'meanConnectivities'), ('mean_distances' --> 'meanDistances').\n", " \n", " \n", - " 2026-03-31 09:56:13.891787+00:00\n", + " 2026-04-14 15:27:45.157492+00:00\n", " INFO\n", " Validating standard column data types...\n", " \n", " \n", - " 2026-03-31 09:56:13.896407+00:00\n", + " 2026-04-14 15:27:45.162176+00:00\n", " WARNING\n", " Columns with missing values: 'cellType'.\n", " \n", " \n", - " 2026-03-31 09:56:13.896587+00:00\n", + " 2026-04-14 15:27:45.162369+00:00\n", " INFO\n", " Columns converted to expected dtypes: ('barcode': object --> string), ('batch': category --> string), ('cellType': category --> string), ('nCounts': float32 --> int64).\n", " \n", " \n", - " 2026-03-31 09:56:15.943570+00:00\n", + " 2026-04-14 15:27:47.320467+00:00\n", " INFO\n", " Column data types validated successfully.\n", " \n", " \n", - " 2026-03-31 09:56:15.943887+00:00\n", + " 2026-04-14 15:27:47.320767+00:00\n", " INFO\n", " Checking required columns for cell metadata...\n", " \n", " \n", - " 2026-03-31 09:56:15.952526+00:00\n", + " 2026-04-14 15:27:47.329052+00:00\n", " INFO\n", " Performing columns reordering...\n", " \n", " \n", - " 2026-03-31 09:56:15.958142+00:00\n", + " 2026-04-14 15:27:47.333994+00:00\n", " INFO\n", " The columns were placed in the following order: 'barcode', 'batch', 'log10genesperumiInjured', 'seuratClustersInjured', 'celltypeInjured', 'cellTypeFinalInjured', 'log10genesperumiHealthy', 'seuratClustersHealthy', 'celltypeHealthy', 'cellTypeFinalHealthy', 'nCounts', 'logCounts', 'nGenes', 'cellType', 'assayOntologyTermId', 'suspensionType', 'pca', 'pcaHarmony', 'umap', 'meanConnectivities', 'meanDistances'.\n", " \n", " \n", - " 2026-03-31 09:56:15.958404+00:00\n", + " 2026-04-14 15:27:47.334224+00:00\n", " INFO\n", " Verifying if default QC columns are present...\n", " \n", " \n", - " 2026-03-31 09:56:15.958637+00:00\n", + " 2026-04-14 15:27:47.334438+00:00\n", " INFO\n", " Missing default QC metrics columns: 'mitoCounts', 'percentMito', 'riboCounts', 'percentRibo'.\n", " \n", " \n", - " 2026-03-31 09:56:15.958803+00:00\n", + " 2026-04-14 15:27:47.334604+00:00\n", " INFO\n", " Dry run mode enabled, skipping QC metrics calculation.\n", " \n", " \n", - " 2026-03-31 09:56:15.958960+00:00\n", + " 2026-04-14 15:27:47.334754+00:00\n", " INFO\n", " Shape of the transformed cell metadata table: (27692, 21) (cells x attributes).\n", " \n", " \n", - " 2026-03-31 09:56:15.959154+00:00\n", + " 2026-04-14 15:27:47.334936+00:00\n", " INFO\n", " Columns of the transformed cell metadata table: 'barcode', 'batch', 'log10genesperumiInjured', 'seuratClustersInjured', 'celltypeInjured', 'cellTypeFinalInjured', 'log10genesperumiHealthy', 'seuratClustersHealthy', 'celltypeHealthy', 'cellTypeFinalHealthy', 'nCounts', 'logCounts', 'nGenes', 'cellType', 'assayOntologyTermId', 'suspensionType', 'pca', 'pcaHarmony', 'umap', 'meanConnectivities', 'meanDistances'.\n", " \n", " \n", - " 2026-03-31 09:56:15.959333+00:00\n", + " 2026-04-14 15:27:47.335105+00:00\n", " INFO\n", - " Saving cell metadata to GSF001458_cell_metadata.tsv file...\n", + " Saving cell metadata to GSF1653412_cell_metadata.tsv file...\n", " \n", " \n", - " 2026-03-31 09:56:16.360696+00:00\n", + " 2026-04-14 15:27:47.735420+00:00\n", " INFO\n", " Cell metadata processing successfully completed.\n", " \n", " \n", - " 2026-03-31 09:56:16.465603+00:00\n", + " 2026-04-14 15:27:47.841106+00:00\n", " INFO\n", " Validating cell-to-library mapping: checking 'batch' values against 'Library ID' in library metadata...\n", " \n", " \n", - " 2026-03-31 09:56:16.480609+00:00\n", + " 2026-04-14 15:27:47.854431+00:00\n", " INFO\n", - " Retrieving library metadata for accession GSF001449...\n", + " Retrieving library metadata for accession GSF1653403...\n", " \n", " \n", - " 2026-03-31 09:56:16.514932+00:00\n", + " 2026-04-14 15:27:47.946038+00:00\n", " INFO\n", " Library metadata retrieved successfully. Total items: 6.\n", " \n", " \n", - " 2026-03-31 09:56:16.515280+00:00\n", + " 2026-04-14 15:27:47.946334+00:00\n", " INFO\n", " All 6 unique 'batch' values from cell metadata successfully mapped to library objects.\n", " \n", " \n", - " 2026-03-31 09:56:16.515438+00:00\n", + " 2026-04-14 15:27:47.946571+00:00\n", " INFO\n", " All library group accession(s) assigned for cells linking contain matching 'Library ID' values.\n", " \n", " \n", - " 2026-03-31 09:56:16.515652+00:00\n", + " 2026-04-14 15:27:47.946837+00:00\n", " INFO\n", " Extracting feature metadata from GSE210077_adata_healthy_diseased_nucseq_sparse.h5ad...\n", " \n", " \n", - " 2026-03-31 09:56:16.516265+00:00\n", + " 2026-04-14 15:27:47.947401+00:00\n", " INFO\n", " Reading feature metadata from 'var'...\n", " \n", " \n", - " 2026-03-31 09:56:16.528922+00:00\n", + " 2026-04-14 15:27:47.959932+00:00\n", " INFO\n", " Adding PCs column from group...\n", " \n", " \n", - " 2026-03-31 09:56:16.660411+00:00\n", + " 2026-04-14 15:27:48.101346+00:00\n", " INFO\n", " Extracting index column of feature metadata...\n", " \n", " \n", - " 2026-03-31 09:56:16.660700+00:00\n", + " 2026-04-14 15:27:48.101648+00:00\n", " INFO\n", " Unnamed index found, index column name set to: _index.\n", " \n", " \n", - " 2026-03-31 09:56:16.661369+00:00\n", + " 2026-04-14 15:27:48.102624+00:00\n", " INFO\n", " Shape of the initial feature metadata table: (24619, 6) (features x attributes).\n", " \n", " \n", - " 2026-03-31 09:56:16.661546+00:00\n", + " 2026-04-14 15:27:48.102892+00:00\n", " INFO\n", " Columns of the initial feature metadata table: '_index', 'highly_variable', 'means', 'dispersions', 'dispersions_norm', 'PCs'.\n", " \n", " \n", - " 2026-03-31 09:56:16.661678+00:00\n", + " 2026-04-14 15:27:48.103105+00:00\n", " INFO\n", " Applying column name changes...\n", " \n", " \n", - " 2026-03-31 09:56:16.662956+00:00\n", + " 2026-04-14 15:27:48.105602+00:00\n", " INFO\n", " Columns renamed: ('_index' --> 'gene').\n", " \n", " \n", - " 2026-03-31 09:56:16.663815+00:00\n", + " 2026-04-14 15:27:48.106903+00:00\n", " INFO\n", " Mapping columns to standardized names...\n", " \n", " \n", - " 2026-03-31 09:56:16.664130+00:00\n", + " 2026-04-14 15:27:48.107407+00:00\n", " INFO\n", " Checking for duplicate column names and applying suffix if needed...\n", " \n", " \n", - " 2026-03-31 09:56:16.664277+00:00\n", + " 2026-04-14 15:27:48.107658+00:00\n", " INFO\n", " Final column renaming mapping to fit API requirements (Original --> Final ODM API Display Name): ('gene' --> 'gene'), ('highly_variable' --> 'highlyVariable'), ('means' --> 'meanCounts'), ('dispersions' --> 'dispersions'), ('dispersions_norm' --> 'dispersionsNorm'), ('PCs' --> 'PCs').\n", " \n", " \n", - " 2026-03-31 09:56:16.665038+00:00\n", + " 2026-04-14 15:27:48.108882+00:00\n", " INFO\n", " Validating standard column data types...\n", " \n", " \n", - " 2026-03-31 09:56:16.666995+00:00\n", + " 2026-04-14 15:27:48.111727+00:00\n", " INFO\n", " Columns converted to expected dtypes: ('gene': object --> string).\n", " \n", " \n", - " 2026-03-31 09:56:16.667302+00:00\n", + " 2026-04-14 15:27:48.112094+00:00\n", " INFO\n", " Column data types validated successfully.\n", " \n", " \n", - " 2026-03-31 09:56:16.667449+00:00\n", + " 2026-04-14 15:27:48.112277+00:00\n", " INFO\n", " Starting mapping of gene IDs to gene symbols...\n", " \n", " \n", - " 2026-03-31 09:56:16.667576+00:00\n", + " 2026-04-14 15:27:48.112437+00:00\n", " INFO\n", " Gene names already present in gene metadata. Skipping ID mapping.\n", " \n", " \n", - " 2026-03-31 09:56:16.667698+00:00\n", + " 2026-04-14 15:27:48.112610+00:00\n", " INFO\n", " Shape of the transformed feature metadata table: (24619, 6) (features x attributes).\n", " \n", " \n", - " 2026-03-31 09:56:16.667884+00:00\n", + " 2026-04-14 15:27:48.112766+00:00\n", " INFO\n", " Columns of the transformed feature metadata table: 'gene', 'highlyVariable', 'meanCounts', 'dispersions', 'dispersionsNorm', 'PCs'.\n", " \n", " \n", - " 2026-03-31 09:56:16.668034+00:00\n", + " 2026-04-14 15:27:48.112897+00:00\n", " INFO\n", - " Saving feature metadata to GSF001458_feature_metadata.tsv file...\n", + " Saving feature metadata to GSF1653412_feature_metadata.tsv file...\n", " \n", " \n", - " 2026-03-31 09:56:16.793836+00:00\n", + " 2026-04-14 15:27:48.240577+00:00\n", " INFO\n", " Feature metadata processing successfully completed.\n", " \n", " \n", - " 2026-03-31 09:56:16.833962+00:00\n", + " 2026-04-14 15:27:48.282622+00:00\n", " INFO\n", " Processing expression matrix...\n", " \n", " \n", - " 2026-03-31 09:56:16.834243+00:00\n", + " 2026-04-14 15:27:48.282908+00:00\n", " INFO\n", - " Reading cell metadata file GSF001458_cell_metadata.tsv...\n", + " Reading cell metadata file GSF1653412_cell_metadata.tsv...\n", " \n", " \n", - " 2026-03-31 09:56:17.050897+00:00\n", + " 2026-04-14 15:27:48.499469+00:00\n", " INFO\n", " First 5 cell names: 'Liver.32_AAACCCAAGACTACCT.1-0', 'Liver.32_AAACCCAAGGCTTAAA.1-0', 'Liver.32_AAACCCAGTCACTCTC.1-0', 'Liver.32_AAACCCAGTCTGTAGT.1-0', 'Liver.32_AAACCCATCTGAACGT.1-0'.\n", " \n", " \n", - " 2026-03-31 09:56:17.051242+00:00\n", + " 2026-04-14 15:27:48.499762+00:00\n", " INFO\n", - " Reading feature metadata file GSF001458_feature_metadata.tsv...\n", + " Reading feature metadata file GSF1653412_feature_metadata.tsv...\n", " \n", " \n", - " 2026-03-31 09:56:17.091428+00:00\n", + " 2026-04-14 15:27:48.539258+00:00\n", " INFO\n", " Feature ID column: 'gene'.\n", " \n", " \n", - " 2026-03-31 09:56:17.091712+00:00\n", + " 2026-04-14 15:27:48.539567+00:00\n", " INFO\n", " Feature metadata columns to include: 'highlyVariable', 'meanCounts', 'dispersions', 'dispersionsNorm', 'PCs'.\n", " \n", " \n", - " 2026-03-31 09:56:17.124746+00:00\n", + " 2026-04-14 15:27:48.573783+00:00\n", " INFO\n", " Reading feature and cell expression data from the input HDF5 file...\n", " \n", " \n", - " 2026-03-31 09:56:17.138006+00:00\n", + " 2026-04-14 15:27:48.587473+00:00\n", " INFO\n", " First 5 feature names: 'ENSG00000238009', 'ENSG00000268903', 'ENSG00000241860', 'ENSG00000228463', 'ENSG00000290385'.\n", " \n", " \n", - " 2026-03-31 09:56:17.140203+00:00\n", + " 2026-04-14 15:27:48.589849+00:00\n", " INFO\n", " Number of cells in expression matrix: 27692.\n", " \n", " \n", - " 2026-03-31 09:56:17.140369+00:00\n", + " 2026-04-14 15:27:48.590054+00:00\n", " INFO\n", " Number of features in expression matrix: 24619.\n", " \n", " \n", - " 2026-03-31 09:56:17.140793+00:00\n", + " 2026-04-14 15:27:48.590566+00:00\n", " INFO\n", " Number of non-zero values: 52698313.\n", " \n", " \n", - " 2026-03-31 09:56:17.140972+00:00\n", + " 2026-04-14 15:27:48.590766+00:00\n", " INFO\n", " First 5 non-zero values: 0.4216345, 0.4216345, 0.4216345, 0.4216345, 0.4216345.\n", " \n", " \n", - " 2026-03-31 09:56:17.141229+00:00\n", + " 2026-04-14 15:27:48.591116+00:00\n", " INFO\n", " Auto-detected number format '%.7g' and matrix dtype 'float32' from native dtype.\n", " \n", " \n", - " 2026-03-31 09:56:17.141399+00:00\n", + " 2026-04-14 15:27:48.591287+00:00\n", " INFO\n", - " User-provided chunk size: 2000 features.\n", + " Chunk size calculated based on the memory limit: 15348 features. To override this value, set the 'chunk_size' parameter in the configuration.\n", " \n", " \n", - " 2026-03-31 09:56:17.141666+00:00\n", + " 2026-04-14 15:27:48.591648+00:00\n", " INFO\n", " Cell expression data processing successfully completed.\n", " \n", " \n", - " 2026-03-31 09:56:17.150855+00:00\n", + " 2026-04-14 15:27:48.598497+00:00\n", " INFO\n", " Extracting expression metadata from source file...\n", " \n", " \n", - " 2026-03-31 09:56:17.153430+00:00\n", + " 2026-04-14 15:27:48.600801+00:00\n", " INFO\n", - " Saving expression metadata to GSF001458_expression_metadata.tsv file...\n", + " Saving expression metadata to GSF1653412_expression_metadata.tsv file...\n", " \n", " \n", - " 2026-03-31 09:56:17.154342+00:00\n", + " 2026-04-14 15:27:48.601632+00:00\n", " INFO\n", " End of the dry run! Please check the job logs for the information about attachment file structure and the changes that would have been made during the transformation.\n", " \n", " \n", - " 2026-03-31 09:56:17.408588+00:00\n", + " 2026-04-14 15:27:48.853425+00:00\n", " INFO\n", - " Transformation of attachment GSF001458 completed successfully with 1 warning(s).\n", + " Transformation of attachment GSF1653412 completed successfully with 1 warning(s).\n", " \n", " \n", "\n", @@ -2133,10 +2137,14 @@ } ], "source": [ - "# retrieve and display logs from job id:\n", - "logs_payload = odm_api.LogsPayload()\n", - "logs = jobs_api.post_api_v1_transformations_jobs_by_id_logs(job_id, logs_payload)\n", - "display_log_records(logs)" + "# retrieve and display logs from job id\n", + "if job_status.status.state.value not in ['UNKNOWN', 'WAITING']:\n", + " logs_payload = odm_api.LogsPayload()\n", + " logs = jobs_api.post_api_v1_transformations_jobs_by_id_logs(job_id, logs_payload)\n", + " display_log_records(logs)\n", + "else:\n", + " print(\"Transformation job has not started yet. Please rerun this cell once \"\n", + " \"the job is in progress or completed.\")" ] }, { @@ -2160,7 +2168,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 24, "id": "6e798c82", "metadata": {}, "outputs": [], @@ -2179,7 +2187,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "id": "8b19558b", "metadata": {}, "outputs": [ @@ -2187,7 +2195,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Job ID: 1445644023\n" + "Job ID: 1129935756\n" ] } ], @@ -2202,7 +2210,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 26, "id": "9616bcf1", "metadata": {}, "outputs": [ @@ -2222,7 +2230,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 27, "id": "eca305fd", "metadata": {}, "outputs": [ @@ -2241,789 +2249,734 @@ " \n", " \n", " \n", - " 2026-03-31 09:58:55.740269+00:00\n", + " 2026-04-14 15:28:52.634339+00:00\n", " INFO\n", " Memory limit set to 9.50 GB.\n", " \n", " \n", - " 2026-03-31 09:58:55.740575+00:00\n", + " 2026-04-14 15:28:52.634622+00:00\n", " INFO\n", " Transformation image name: hdf5-cells.\n", " \n", " \n", - " 2026-03-31 09:58:55.740725+00:00\n", + " 2026-04-14 15:28:52.634801+00:00\n", " INFO\n", " Transformation image version: 0.1.1.\n", " \n", " \n", - " 2026-03-31 09:58:55.740850+00:00\n", + " 2026-04-14 15:28:52.634962+00:00\n", " INFO\n", - " Configuration ID: 835356550.\n", + " Configuration ID: 82095331.\n", " \n", " \n", - " 2026-03-31 09:58:55.741068+00:00\n", + " 2026-04-14 15:28:52.635218+00:00\n", " INFO\n", " Starting configuration validation...\n", " \n", " \n", - " 2026-03-31 09:58:55.741210+00:00\n", + " 2026-04-14 15:28:52.635377+00:00\n", " INFO\n", " Validating top-level configuration keys...\n", " \n", " \n", - " 2026-03-31 09:58:55.741337+00:00\n", + " 2026-04-14 15:28:52.635540+00:00\n", " INFO\n", " Validating biosample_metadata configuration...\n", " \n", " \n", - " 2026-03-31 09:58:55.741469+00:00\n", + " 2026-04-14 15:28:52.635710+00:00\n", " INFO\n", " Validating cell_metadata configuration...\n", " \n", " \n", - " 2026-03-31 09:58:55.741593+00:00\n", + " 2026-04-14 15:28:52.635874+00:00\n", " INFO\n", " Validating feature_metadata configuration...\n", " \n", " \n", - " 2026-03-31 09:58:55.741715+00:00\n", + " 2026-04-14 15:28:52.636037+00:00\n", " INFO\n", " Validating cell_expression configuration...\n", " \n", " \n", - " 2026-03-31 09:58:55.741834+00:00\n", + " 2026-04-14 15:28:52.636195+00:00\n", " INFO\n", " Configuration file validated successfully.\n", " \n", " \n", - " 2026-03-31 09:58:55.741979+00:00\n", + " 2026-04-14 15:28:52.636374+00:00\n", " INFO\n", - " Starting transformation for attachment GSF001458 (1/1)...\n", + " Starting transformation for attachment GSF1653412 (1/1)...\n", " \n", " \n", - " 2026-03-31 09:58:55.765202+00:00\n", + " 2026-04-14 15:28:52.659243+00:00\n", " INFO\n", - " Attachment metadata retrieved: {'genestack:accession': 'GSF001458', 'genestack:name': 'GSE210077_adata_healthy_diseased_nucseq_sparse.h5ad', 'Experimental Platform': 'Illumina NovaSeq 6000', 'Processing QC': 'Remove low-UMI nuclei; doublets removed', 'Source': 'Data was obtained from the Human Cell Atlas repository, project FibroticLiverWatsonMERFISH. Data available in https://explore.data.humancellatlas.org/projects/64809a52-f703-4aec-b3a5-eca808a971d0 ', 'Total Number of Cells or Nuclei': '27692', 'Library Preparation Protocol': '10x Genomics Chromium Single Cell 3′', 'Alignment & Quantification Method': 'Integration mapping with Cell Ranger v7.0.1 ', 'Comment': 'Original file adata_healthy_diseased_nucseq_.h5ad was obtained from the HCA repository (FibroticLiverWatsonMERFISH). It contained data from healthy and diseased patient samples, which were processed with snRNA-Seq. The file was converted to sparse format to reduce size and improve efficiency.', 'Preparation QC': 'DAPI-based nuclear QC and slide quality inspection', 'Genome Version': 'GRCh38', 'Nuclei Permeabilization': 'Nuclei isolated using lysis buffer (PBS+BSA+RNAse)', 'Normalization Method': 'Log-normalisation; spatial integration', 'Assay Type': 'Spatial-seq', 'Annotation': 'Annotation via liver cell markers; spatial integration', 'Data Class': 'Single-cell transcriptomics', 'Experimental Platform ID': 'GPL24676', 'Library Preparation Version': 'v3', 'Experiment Site': 'Massachusetts General Hospital, USA'}.\n", + " Attachment metadata retrieved: {'genestack:accession': 'GSF1653412', 'genestack:name': 'GSE210077_adata_healthy_diseased_nucseq_sparse.h5ad', 'Experimental Platform': 'Illumina NovaSeq 6000', 'Processing QC': 'Remove low-UMI nuclei; doublets removed', 'Source': 'Data was obtained from the Human Cell Atlas repository, project FibroticLiverWatsonMERFISH. Data available in https://explore.data.humancellatlas.org/projects/64809a52-f703-4aec-b3a5-eca808a971d0 ', 'Total Number of Cells or Nuclei': '27692', 'Library Preparation Protocol': '10x Genomics Chromium Single Cell 3′', 'Alignment & Quantification Method': 'Integration mapping with Cell Ranger v7.0.1 ', 'Comment': 'Original file adata_healthy_diseased_nucseq_.h5ad was obtained from the HCA repository (FibroticLiverWatsonMERFISH). It contained data from healthy and diseased patient samples, which were processed with snRNA-Seq. The file was converted to sparse format to reduce size and improve efficiency.', 'Preparation QC': 'DAPI-based nuclear QC and slide quality inspection', 'Genome Version': 'GRCh38', 'Nuclei Permeabilization': 'Nuclei isolated using lysis buffer (PBS+BSA+RNAse)', 'Normalization Method': 'Log-normalisation; spatial integration', 'Assay Type': 'Spatial-seq', 'Annotation': 'Annotation via liver cell markers; spatial integration', 'Data Class': 'Single-cell transcriptomics', 'Experimental Platform ID': 'GPL24676', 'Library Preparation Version': 'v3', 'Experiment Site': 'Massachusetts General Hospital, USA'}.\n", " \n", " \n", - " 2026-03-31 09:58:55.779247+00:00\n", + " 2026-04-14 15:28:52.683503+00:00\n", " INFO\n", - " Found study accession: GSF001440.\n", + " Found study accession: GSF1653394.\n", " \n", " \n", - " 2026-03-31 09:58:55.779525+00:00\n", + " 2026-04-14 15:28:52.683726+00:00\n", " INFO\n", - " Retrieving sample metadata for accession GSF001440...\n", + " Retrieving sample metadata for accession GSF1653394...\n", " \n", " \n", - " 2026-03-31 09:58:55.796022+00:00\n", + " 2026-04-14 15:28:52.708992+00:00\n", " INFO\n", " Sample metadata retrieved successfully. Total items: 6.\n", " \n", " \n", - " 2026-03-31 09:58:55.816706+00:00\n", + " 2026-04-14 15:28:52.730246+00:00\n", " INFO\n", - " The library group accession(s) found for the study: GSF001449. Will be used to link cell group to library group(s). If change is needed, please specify relevant sample, library or preparation group accession(s) in the config.\n", + " The library group accession(s) found for the study: GSF1653403. Will be used to link cell group to library group(s). If change is needed, please specify relevant sample, library or preparation group accession(s) in the config.\n", " \n", " \n", - " 2026-03-31 09:58:55.816972+00:00\n", + " 2026-04-14 15:28:52.730519+00:00\n", " INFO\n", " Creating copy of the attachment file in temporary directory...\n", " \n", " \n", - " 2026-03-31 09:59:06.316828+00:00\n", + " 2026-04-14 15:29:14.940368+00:00\n", " INFO\n", " Reading HDF5 file structure...\n", " \n", " \n", - " 2026-03-31 09:59:06.317746+00:00\n", + " 2026-04-14 15:29:14.941262+00:00\n", " INFO\n", " Keys (groups): 'X', 'layers', 'obs', 'obsm', 'obsp', 'raw', 'uns', 'var', 'varm', 'varp'.\n", " \n", " \n", - " 2026-03-31 09:59:06.318283+00:00\n", + " 2026-04-14 15:29:14.941789+00:00\n", " INFO\n", " Group: 'X'. Type: 'expression'. Shape: (27692, 24619).\n", " \n", " \n", - " 2026-03-31 09:59:06.360563+00:00\n", + " 2026-04-14 15:29:14.985023+00:00\n", " INFO\n", " Group: 'obs'. Type: 'metadata'. Shape: (27692, 27). Index: '(unnamed)', first values: 'Liver.32_AAACCCAAGACTACCT.1-0', 'Liver.32_AAACCCAAGGCTTAAA.1-0', 'Liver.32_AAACCCAGTCACTCTC.1-0', 'Liver.32_AAACCCAGTCTGTAGT.1-0', 'Liver.32_AAACCCATCTGAACGT.1-0'. Columns and data types: ('Condition', category), ('Sex', category), ('Age', category), ('log10GenesPerUMI_injured', float64), ('seurat_clusters_injured', category), ('CellType_injured', category), ('cell_type_final_injured', category), ('log10GenesPerUMI_healthy', float64), ('seurat_clusters_healthy', category), ('CellType_healthy', category), ('cell_type_final_healthy', category), ('batch', category), ('n_counts', float32), ('log_counts', float32), ('n_genes', int32), ('sample_id', category), ('organism_ontology_term_id', category), ('donor_id', category), ('development_stage_ontology_term_id', category), ('sex_ontology_term_id', category), ('self_reported_ethnicity_ontology_term_id', category), ('disease_ontology_term_id', category), ('tissue_type', category), ('tissue_ontology_term_id', category), ('cell_type_ontology_term_id', category), ('assay_ontology_term_id', category), ('suspension_type', category).\n", " \n", " \n", - " 2026-03-31 09:59:06.361392+00:00\n", + " 2026-04-14 15:29:14.985854+00:00\n", " INFO\n", " Group: 'obsm'. Type: 'embedding'. Item: 'X_pca'. Shape: (27692, 25).\n", " \n", " \n", - " 2026-03-31 09:59:06.361680+00:00\n", + " 2026-04-14 15:29:14.986158+00:00\n", " INFO\n", " Group: 'obsm'. Type: 'embedding'. Item: 'X_pca_harmony'. Shape: (27692, 25).\n", " \n", " \n", - " 2026-03-31 09:59:06.361913+00:00\n", + " 2026-04-14 15:29:14.986439+00:00\n", " INFO\n", " Group: 'obsm'. Type: 'embedding'. Item: 'X_umap'. Shape: (27692, 2).\n", " \n", " \n", - " 2026-03-31 09:59:06.362302+00:00\n", + " 2026-04-14 15:29:14.986874+00:00\n", " INFO\n", " Group: 'obsp'. Type: 'pairwise'. Item: 'connectivities'. Shape: (27692, 27692).\n", " \n", " \n", - " 2026-03-31 09:59:06.362559+00:00\n", + " 2026-04-14 15:29:14.987169+00:00\n", " INFO\n", " Group: 'obsp'. Type: 'pairwise'. Item: 'distances'. Shape: (27692, 27692).\n", " \n", " \n", - " 2026-03-31 09:59:06.362808+00:00\n", + " 2026-04-14 15:29:14.987444+00:00\n", " INFO\n", " Group: 'raw'. Type: 'raw'. Items: 'X', 'var', 'varm'.\n", " \n", " \n", - " 2026-03-31 09:59:06.363076+00:00\n", + " 2026-04-14 15:29:14.987733+00:00\n", " INFO\n", " Group: 'uns'. Type: 'unstructured'. Items: 'Age_colors', 'CellType_healthy_colors', 'CellType_injured_colors', 'Condition_colors', 'SampleID_colors', 'Sex_colors', 'batch_colors', 'cell_type_final_healthy_colors', 'cell_type_final_injured_colors', 'cell_type_ontology_term_id_colors', 'development_stage_ontology_term_id_colors', 'disease_ontology_term_id_colors', 'hvg', 'log1p', 'neighbors', 'pca', 'sample_id_colors', 'seurat_clusters_healthy_colors', 'seurat_clusters_injured_colors', 'umap'.\n", " \n", " \n", - " 2026-03-31 09:59:06.375577+00:00\n", + " 2026-04-14 15:29:15.000409+00:00\n", " INFO\n", " Group: 'var'. Type: 'metadata'. Shape: (24619, 4). Index: '(unnamed)', first values: 'ENSG00000238009', 'ENSG00000268903', 'ENSG00000241860', 'ENSG00000228463', 'ENSG00000290385'. Columns and data types: ('highly_variable', bool), ('means', float64), ('dispersions', float64), ('dispersions_norm', float32).\n", " \n", " \n", - " 2026-03-31 09:59:06.376146+00:00\n", + " 2026-04-14 15:29:15.001000+00:00\n", " INFO\n", " Group: 'varm'. Type: 'embedding'. Item: 'PCs'. Shape: (24619, 25).\n", " \n", " \n", - " 2026-03-31 09:59:06.377246+00:00\n", + " 2026-04-14 15:29:15.002075+00:00\n", " INFO\n", " Extracting sample metadata from GSE210077_adata_healthy_diseased_nucseq_sparse.h5ad...\n", " \n", " \n", - " 2026-03-31 09:59:06.377700+00:00\n", + " 2026-04-14 15:29:15.002568+00:00\n", " INFO\n", " Reading sample metadata from 'obs'...\n", " \n", " \n", - " 2026-03-31 09:59:06.412825+00:00\n", + " 2026-04-14 15:29:15.037902+00:00\n", " INFO\n", " Configured sample column name: 'sample_id'.\n", " \n", " \n", - " 2026-03-31 09:59:06.413368+00:00\n", + " 2026-04-14 15:29:15.038515+00:00\n", " INFO\n", " First sample names: 'AM031', 'AM062', 'AM072', 'AM042', 'AM048'.\n", " \n", " \n", - " 2026-03-31 09:59:06.413550+00:00\n", + " 2026-04-14 15:29:15.038724+00:00\n", " INFO\n", " Renaming 'sample_id' column name to 'Sample Source ID'...\n", " \n", " \n", - " 2026-03-31 09:59:06.417639+00:00\n", + " 2026-04-14 15:29:15.042999+00:00\n", " INFO\n", " Columns renamed: ('Condition' --> 'Condition Group'), ('self_reported_ethnicity_ontology_term_id' --> 'Donor Ethnicity Term ID'), ('tissue_type' --> 'Cell Source').\n", " \n", " \n", - " 2026-03-31 09:59:06.418766+00:00\n", + " 2026-04-14 15:29:15.044126+00:00\n", " INFO\n", " Curated values — ('Sample Source ID': 'AM031' --> 'Liver-32', 'AM042' --> 'Liver-13', 'AM048' --> 'Liver-14', 'AM061' --> 'Liver-18', 'AM062' --> 'Liver-33', 'AM072' --> 'Liver-34').\n", " \n", " \n", - " 2026-03-31 09:59:06.418971+00:00\n", + " 2026-04-14 15:29:15.044351+00:00\n", " INFO\n", " Shape of the transformed sample metadata table: (6, 4) (sample objects x attributes).\n", " \n", " \n", - " 2026-03-31 09:59:06.419151+00:00\n", + " 2026-04-14 15:29:15.044541+00:00\n", " INFO\n", " Columns of the transformed sample metadata table: 'Sample Source ID', 'Condition Group', 'Donor Ethnicity Term ID', 'Cell Source'.\n", " \n", " \n", - " 2026-03-31 09:59:06.419330+00:00\n", + " 2026-04-14 15:29:15.044739+00:00\n", " INFO\n", - " Saving sample metadata to GSF001458_sample_metadata.tsv file...\n", + " Saving sample metadata to GSF1653412_sample_metadata.tsv file...\n", " \n", " \n", - " 2026-03-31 09:59:06.422860+00:00\n", + " 2026-04-14 15:29:15.048362+00:00\n", " INFO\n", " Sample metadata processing successfully completed.\n", " \n", " \n", - " 2026-03-31 09:59:06.423472+00:00\n", + " 2026-04-14 15:29:15.049014+00:00\n", " INFO\n", " Validating existing sample metadata update...\n", " \n", " \n", - " 2026-03-31 09:59:06.423690+00:00\n", + " 2026-04-14 15:29:15.049253+00:00\n", " INFO\n", - " Retrieving sample metadata for accession GSF001440...\n", + " Retrieving sample metadata for accession GSF1653394...\n", " \n", " \n", - " 2026-03-31 09:59:06.442606+00:00\n", + " 2026-04-14 15:29:15.088757+00:00\n", " INFO\n", " Sample metadata retrieved successfully. Total items: 6.\n", " \n", " \n", - " 2026-03-31 09:59:06.446735+00:00\n", + " 2026-04-14 15:29:15.092577+00:00\n", " INFO\n", " All 6 sample objects were found in existing study-associated metadata and will be updated with new attributes.\n", " \n", " \n", - " 2026-03-31 09:59:06.447232+00:00\n", + " 2026-04-14 15:29:15.093122+00:00\n", " INFO\n", " Extracting cell metadata from GSE210077_adata_healthy_diseased_nucseq_sparse.h5ad...\n", " \n", " \n", - " 2026-03-31 09:59:06.447871+00:00\n", + " 2026-04-14 15:29:15.093744+00:00\n", " INFO\n", " Reading cell metadata from 'obs'...\n", " \n", " \n", - " 2026-03-31 09:59:06.482639+00:00\n", + " 2026-04-14 15:29:15.131187+00:00\n", " INFO\n", " Adding X_pca column from group...\n", " \n", " \n", - " 2026-03-31 09:59:06.813478+00:00\n", + " 2026-04-14 15:29:15.471114+00:00\n", " INFO\n", " Adding X_pca_harmony column from group...\n", " \n", " \n", - " 2026-03-31 09:59:07.147438+00:00\n", + " 2026-04-14 15:29:15.826013+00:00\n", " INFO\n", " Adding X_umap column from group...\n", " \n", " \n", - " 2026-03-31 09:59:07.196973+00:00\n", + " 2026-04-14 15:29:15.884013+00:00\n", " INFO\n", " Adding connectivities column from group...\n", " \n", " \n", - " 2026-03-31 09:59:07.209286+00:00\n", + " 2026-04-14 15:29:15.897955+00:00\n", " INFO\n", " Adding distances column from group...\n", " \n", " \n", - " 2026-03-31 09:59:07.218569+00:00\n", + " 2026-04-14 15:29:15.907642+00:00\n", " INFO\n", " Extracting index column of cell metadata...\n", " \n", " \n", - " 2026-03-31 09:59:07.218839+00:00\n", + " 2026-04-14 15:29:15.907935+00:00\n", " INFO\n", " Unnamed index found, index column name set to: _index.\n", " \n", " \n", - " 2026-03-31 09:59:07.219514+00:00\n", + " 2026-04-14 15:29:15.908665+00:00\n", " INFO\n", " Shape of the initial cell metadata table: (27692, 33) (cells x attributes).\n", " \n", " \n", - " 2026-03-31 09:59:07.219720+00:00\n", + " 2026-04-14 15:29:15.908873+00:00\n", " INFO\n", " Columns of the initial cell metadata table: '_index', 'Condition', 'Sex', 'Age', 'log10GenesPerUMI_injured', 'seurat_clusters_injured', 'CellType_injured', 'cell_type_final_injured', 'log10GenesPerUMI_healthy', 'seurat_clusters_healthy', 'CellType_healthy', 'cell_type_final_healthy', 'batch', 'n_counts', 'log_counts', 'n_genes', 'sample_id', 'organism_ontology_term_id', 'donor_id', 'development_stage_ontology_term_id', 'sex_ontology_term_id', 'self_reported_ethnicity_ontology_term_id', 'disease_ontology_term_id', 'tissue_type', 'tissue_ontology_term_id', 'cell_type_ontology_term_id', 'assay_ontology_term_id', 'suspension_type', 'X_pca', 'X_pca_harmony', 'X_umap', 'mean_connectivities', 'mean_distances'.\n", " \n", " \n", - " 2026-03-31 09:59:07.219910+00:00\n", + " 2026-04-14 15:29:15.909057+00:00\n", " INFO\n", " Dropping columns...\n", " \n", " \n", - " 2026-03-31 09:59:07.222661+00:00\n", + " 2026-04-14 15:29:15.911586+00:00\n", " INFO\n", - " The following columns were dropped from metadata: 'Age', 'organism_ontology_term_id', 'donor_id', 'Condition', 'Sex', 'tissue_type', 'self_reported_ethnicity_ontology_term_id', 'tissue_ontology_term_id', 'batch', 'disease_ontology_term_id', 'development_stage_ontology_term_id', 'sex_ontology_term_id'.\n", + " The following columns were dropped from metadata: 'development_stage_ontology_term_id', 'Condition', 'donor_id', 'sex_ontology_term_id', 'batch', 'Sex', 'tissue_type', 'tissue_ontology_term_id', 'disease_ontology_term_id', 'Age', 'self_reported_ethnicity_ontology_term_id', 'organism_ontology_term_id'.\n", " \n", " \n", - " 2026-03-31 09:59:07.223294+00:00\n", + " 2026-04-14 15:29:15.912199+00:00\n", " INFO\n", " Applying column name changes...\n", " \n", " \n", - " 2026-03-31 09:59:07.227289+00:00\n", + " 2026-04-14 15:29:15.916271+00:00\n", " INFO\n", " Columns renamed: ('_index' --> 'barcode'), ('cell_type_ontology_term_id' --> 'cell_type'), ('sample_id' --> 'batch').\n", " \n", " \n", - " 2026-03-31 09:59:07.227733+00:00\n", + " 2026-04-14 15:29:15.916767+00:00\n", " INFO\n", " Curating values...\n", " \n", " \n", - " 2026-03-31 09:59:07.228807+00:00\n", + " 2026-04-14 15:29:15.917827+00:00\n", " INFO\n", " Curated values — ('batch': 'AM031' --> 'Liver-32', 'AM042' --> 'Liver-13', 'AM048' --> 'Liver-14', 'AM061' --> 'Liver-18', 'AM062' --> 'Liver-33', 'AM072' --> 'Liver-34').\n", " \n", " \n", - " 2026-03-31 09:59:07.229909+00:00\n", + " 2026-04-14 15:29:15.919020+00:00\n", " INFO\n", " Mapping columns to standardized names...\n", " \n", " \n", - " 2026-03-31 09:59:07.231510+00:00\n", + " 2026-04-14 15:29:15.920671+00:00\n", " INFO\n", " Checking for duplicate column names and applying suffix if needed...\n", " \n", " \n", - " 2026-03-31 09:59:07.231708+00:00\n", + " 2026-04-14 15:29:15.920898+00:00\n", " INFO\n", " Final column renaming mapping to fit API requirements (Original --> Final ODM API Display Name): ('barcode' --> 'barcode'), ('log10GenesPerUMI_injured' --> 'log10genesperumiInjured'), ('seurat_clusters_injured' --> 'seuratClustersInjured'), ('CellType_injured' --> 'celltypeInjured'), ('cell_type_final_injured' --> 'cellTypeFinalInjured'), ('log10GenesPerUMI_healthy' --> 'log10genesperumiHealthy'), ('seurat_clusters_healthy' --> 'seuratClustersHealthy'), ('CellType_healthy' --> 'celltypeHealthy'), ('cell_type_final_healthy' --> 'cellTypeFinalHealthy'), ('n_counts' --> 'nCounts'), ('log_counts' --> 'logCounts'), ('n_genes' --> 'nGenes'), ('batch' --> 'batch'), ('cell_type' --> 'cellType'), ('assay_ontology_term_id' --> 'assayOntologyTermId'), ('suspension_type' --> 'suspensionType'), ('X_pca' --> 'pca'), ('X_pca_harmony' --> 'pcaHarmony'), ('X_umap' --> 'umap'), ('mean_connectivities' --> 'meanConnectivities'), ('mean_distances' --> 'meanDistances').\n", " \n", " \n", - " 2026-03-31 09:59:07.233152+00:00\n", + " 2026-04-14 15:29:15.922415+00:00\n", " INFO\n", " Validating standard column data types...\n", " \n", " \n", - " 2026-03-31 09:59:07.237855+00:00\n", + " 2026-04-14 15:29:15.927231+00:00\n", " WARNING\n", " Columns with missing values: 'cellType'.\n", " \n", " \n", - " 2026-03-31 09:59:07.238050+00:00\n", + " 2026-04-14 15:29:15.927460+00:00\n", " INFO\n", " Columns converted to expected dtypes: ('barcode': object --> string), ('batch': category --> string), ('cellType': category --> string), ('nCounts': float32 --> int64).\n", " \n", " \n", - " 2026-03-31 09:59:09.315027+00:00\n", + " 2026-04-14 15:29:18.053011+00:00\n", " INFO\n", " Column data types validated successfully.\n", " \n", " \n", - " 2026-03-31 09:59:09.315351+00:00\n", + " 2026-04-14 15:29:18.053299+00:00\n", " INFO\n", " Checking required columns for cell metadata...\n", " \n", " \n", - " 2026-03-31 09:59:09.323871+00:00\n", + " 2026-04-14 15:29:18.061656+00:00\n", " INFO\n", " Performing columns reordering...\n", " \n", " \n", - " 2026-03-31 09:59:09.329086+00:00\n", + " 2026-04-14 15:29:18.066670+00:00\n", " INFO\n", " The columns were placed in the following order: 'barcode', 'batch', 'log10genesperumiInjured', 'seuratClustersInjured', 'celltypeInjured', 'cellTypeFinalInjured', 'log10genesperumiHealthy', 'seuratClustersHealthy', 'celltypeHealthy', 'cellTypeFinalHealthy', 'nCounts', 'logCounts', 'nGenes', 'cellType', 'assayOntologyTermId', 'suspensionType', 'pca', 'pcaHarmony', 'umap', 'meanConnectivities', 'meanDistances'.\n", " \n", " \n", - " 2026-03-31 09:59:09.329317+00:00\n", + " 2026-04-14 15:29:18.066903+00:00\n", " INFO\n", " Verifying if default QC columns are present...\n", " \n", " \n", - " 2026-03-31 09:59:09.329547+00:00\n", + " 2026-04-14 15:29:18.067154+00:00\n", " INFO\n", " Missing default QC metrics columns: 'mitoCounts', 'percentMito', 'riboCounts', 'percentRibo'.\n", " \n", " \n", - " 2026-03-31 09:59:09.329693+00:00\n", + " 2026-04-14 15:29:18.067324+00:00\n", " INFO\n", " Calculating missing QC metrics and adding to metadata...\n", " \n", " \n", - " 2026-03-31 09:59:09.330368+00:00\n", + " 2026-04-14 15:29:18.068014+00:00\n", " INFO\n", " Using raw counts for QC metrics calculation.\n", " \n", " \n", - " 2026-03-31 09:59:09.341290+00:00\n", + " 2026-04-14 15:29:18.078889+00:00\n", " INFO\n", " Using var_df index for gene names.\n", " \n", " \n", - " 2026-03-31 09:59:09.897842+00:00\n", + " 2026-04-14 15:29:18.620417+00:00\n", " INFO\n", " Columns added to cell metadata: 'mitoCounts', 'riboCounts', 'percentMito', 'percentRibo'.\n", " \n", " \n", - " 2026-03-31 09:59:09.898526+00:00\n", + " 2026-04-14 15:29:18.621133+00:00\n", " INFO\n", " Shape of the transformed cell metadata table: (27692, 25) (cells x attributes).\n", " \n", " \n", - " 2026-03-31 09:59:09.898767+00:00\n", + " 2026-04-14 15:29:18.621427+00:00\n", " INFO\n", " Columns of the transformed cell metadata table: 'barcode', 'batch', 'log10genesperumiInjured', 'seuratClustersInjured', 'celltypeInjured', 'cellTypeFinalInjured', 'log10genesperumiHealthy', 'seuratClustersHealthy', 'celltypeHealthy', 'cellTypeFinalHealthy', 'nCounts', 'logCounts', 'nGenes', 'cellType', 'assayOntologyTermId', 'suspensionType', 'pca', 'pcaHarmony', 'umap', 'meanConnectivities', 'meanDistances', 'mitoCounts', 'riboCounts', 'percentMito', 'percentRibo'.\n", " \n", " \n", - " 2026-03-31 09:59:09.898946+00:00\n", + " 2026-04-14 15:29:18.621663+00:00\n", " INFO\n", - " Saving cell metadata to GSF001458_cell_metadata.tsv file...\n", + " Saving cell metadata to GSF1653412_cell_metadata.tsv file...\n", " \n", " \n", - " 2026-03-31 09:59:10.339660+00:00\n", + " 2026-04-14 15:29:19.055375+00:00\n", " INFO\n", " Cell metadata processing successfully completed.\n", " \n", " \n", - " 2026-03-31 09:59:10.340443+00:00\n", + " 2026-04-14 15:29:19.056114+00:00\n", " INFO\n", " Extracting feature metadata from GSE210077_adata_healthy_diseased_nucseq_sparse.h5ad...\n", " \n", " \n", - " 2026-03-31 09:59:10.341045+00:00\n", + " 2026-04-14 15:29:19.056731+00:00\n", " INFO\n", " Reading feature metadata from 'var'...\n", " \n", " \n", - " 2026-03-31 09:59:10.353733+00:00\n", + " 2026-04-14 15:29:19.070167+00:00\n", " INFO\n", " Adding PCs column from group...\n", " \n", " \n", - " 2026-03-31 09:59:10.475829+00:00\n", + " 2026-04-14 15:29:19.197377+00:00\n", " INFO\n", " Extracting index column of feature metadata...\n", " \n", " \n", - " 2026-03-31 09:59:10.476084+00:00\n", + " 2026-04-14 15:29:19.197646+00:00\n", " INFO\n", " Unnamed index found, index column name set to: _index.\n", " \n", " \n", - " 2026-03-31 09:59:10.476773+00:00\n", + " 2026-04-14 15:29:19.198426+00:00\n", " INFO\n", " Shape of the initial feature metadata table: (24619, 6) (features x attributes).\n", " \n", " \n", - " 2026-03-31 09:59:10.476947+00:00\n", + " 2026-04-14 15:29:19.198615+00:00\n", " INFO\n", " Columns of the initial feature metadata table: '_index', 'highly_variable', 'means', 'dispersions', 'dispersions_norm', 'PCs'.\n", " \n", " \n", - " 2026-03-31 09:59:10.477102+00:00\n", + " 2026-04-14 15:29:19.198795+00:00\n", " INFO\n", " Applying column name changes...\n", " \n", " \n", - " 2026-03-31 09:59:10.478687+00:00\n", + " 2026-04-14 15:29:19.200982+00:00\n", " INFO\n", " Columns renamed: ('_index' --> 'gene').\n", " \n", " \n", - " 2026-03-31 09:59:10.479586+00:00\n", + " 2026-04-14 15:29:19.202401+00:00\n", " INFO\n", " Mapping columns to standardized names...\n", " \n", " \n", - " 2026-03-31 09:59:10.479916+00:00\n", + " 2026-04-14 15:29:19.202903+00:00\n", " INFO\n", " Checking for duplicate column names and applying suffix if needed...\n", " \n", " \n", - " 2026-03-31 09:59:10.480079+00:00\n", + " 2026-04-14 15:29:19.203131+00:00\n", " INFO\n", " Final column renaming mapping to fit API requirements (Original --> Final ODM API Display Name): ('gene' --> 'gene'), ('highly_variable' --> 'highlyVariable'), ('means' --> 'meanCounts'), ('dispersions' --> 'dispersions'), ('dispersions_norm' --> 'dispersionsNorm'), ('PCs' --> 'PCs').\n", " \n", " \n", - " 2026-03-31 09:59:10.480892+00:00\n", + " 2026-04-14 15:29:19.204412+00:00\n", " INFO\n", " Validating standard column data types...\n", " \n", " \n", - " 2026-03-31 09:59:10.482897+00:00\n", + " 2026-04-14 15:29:19.207611+00:00\n", " INFO\n", " Columns converted to expected dtypes: ('gene': object --> string).\n", " \n", " \n", - " 2026-03-31 09:59:10.483251+00:00\n", + " 2026-04-14 15:29:19.208063+00:00\n", " INFO\n", " Column data types validated successfully.\n", " \n", " \n", - " 2026-03-31 09:59:10.483413+00:00\n", + " 2026-04-14 15:29:19.208265+00:00\n", " INFO\n", " Starting mapping of gene IDs to gene symbols...\n", " \n", " \n", - " 2026-03-31 09:59:10.483571+00:00\n", + " 2026-04-14 15:29:19.208432+00:00\n", " INFO\n", " Gene names already present in gene metadata. Skipping ID mapping.\n", " \n", " \n", - " 2026-03-31 09:59:10.483722+00:00\n", + " 2026-04-14 15:29:19.208612+00:00\n", " INFO\n", " Shape of the transformed feature metadata table: (24619, 6) (features x attributes).\n", " \n", " \n", - " 2026-03-31 09:59:10.483885+00:00\n", + " 2026-04-14 15:29:19.208795+00:00\n", " INFO\n", " Columns of the transformed feature metadata table: 'gene', 'highlyVariable', 'meanCounts', 'dispersions', 'dispersionsNorm', 'PCs'.\n", " \n", " \n", - " 2026-03-31 09:59:10.484036+00:00\n", + " 2026-04-14 15:29:19.208989+00:00\n", " INFO\n", - " Saving feature metadata to GSF001458_feature_metadata.tsv file...\n", + " Saving feature metadata to GSF1653412_feature_metadata.tsv file...\n", " \n", " \n", - " 2026-03-31 09:59:10.615490+00:00\n", + " 2026-04-14 15:29:19.339606+00:00\n", " INFO\n", " Feature metadata processing successfully completed.\n", " \n", " \n", - " 2026-03-31 09:59:10.660628+00:00\n", + " 2026-04-14 15:29:19.384294+00:00\n", " INFO\n", " Processing expression matrix...\n", " \n", " \n", - " 2026-03-31 09:59:10.660923+00:00\n", + " 2026-04-14 15:29:19.384586+00:00\n", " INFO\n", - " Reading cell metadata file GSF001458_cell_metadata.tsv...\n", + " Reading cell metadata file GSF1653412_cell_metadata.tsv...\n", " \n", " \n", - " 2026-03-31 09:59:10.892376+00:00\n", + " 2026-04-14 15:29:19.617093+00:00\n", " INFO\n", " First 5 cell names: 'Liver.32_AAACCCAAGACTACCT.1-0', 'Liver.32_AAACCCAAGGCTTAAA.1-0', 'Liver.32_AAACCCAGTCACTCTC.1-0', 'Liver.32_AAACCCAGTCTGTAGT.1-0', 'Liver.32_AAACCCATCTGAACGT.1-0'.\n", " \n", " \n", - " 2026-03-31 09:59:10.892702+00:00\n", + " 2026-04-14 15:29:19.617391+00:00\n", " INFO\n", - " Reading feature metadata file GSF001458_feature_metadata.tsv...\n", + " Reading feature metadata file GSF1653412_feature_metadata.tsv...\n", " \n", " \n", - " 2026-03-31 09:59:10.934817+00:00\n", + " 2026-04-14 15:29:19.658736+00:00\n", " INFO\n", " Feature ID column: 'gene'.\n", " \n", " \n", - " 2026-03-31 09:59:10.935297+00:00\n", + " 2026-04-14 15:29:19.659015+00:00\n", " INFO\n", " Feature metadata columns to include: 'highlyVariable', 'meanCounts', 'dispersions', 'dispersionsNorm', 'PCs'.\n", " \n", " \n", - " 2026-03-31 09:59:10.969658+00:00\n", + " 2026-04-14 15:29:19.692745+00:00\n", " INFO\n", " Reading feature and cell expression data from the input HDF5 file...\n", " \n", " \n", - " 2026-03-31 09:59:10.983696+00:00\n", + " 2026-04-14 15:29:19.707056+00:00\n", " INFO\n", " First 5 feature names: 'ENSG00000238009', 'ENSG00000268903', 'ENSG00000241860', 'ENSG00000228463', 'ENSG00000290385'.\n", " \n", " \n", - " 2026-03-31 09:59:10.985888+00:00\n", + " 2026-04-14 15:29:19.709241+00:00\n", " INFO\n", " Number of cells in expression matrix: 27692.\n", " \n", " \n", - " 2026-03-31 09:59:10.986054+00:00\n", + " 2026-04-14 15:29:19.709423+00:00\n", " INFO\n", " Number of features in expression matrix: 24619.\n", " \n", " \n", - " 2026-03-31 09:59:10.986471+00:00\n", + " 2026-04-14 15:29:19.709882+00:00\n", " INFO\n", " Number of non-zero values: 52698313.\n", " \n", " \n", - " 2026-03-31 09:59:10.986642+00:00\n", + " 2026-04-14 15:29:19.710068+00:00\n", " INFO\n", " First 5 non-zero values: 0.4216345, 0.4216345, 0.4216345, 0.4216345, 0.4216345.\n", " \n", " \n", - " 2026-03-31 09:59:10.986899+00:00\n", + " 2026-04-14 15:29:19.710354+00:00\n", " INFO\n", " Auto-detected number format '%.7g' and matrix dtype 'float32' from native dtype.\n", " \n", " \n", - " 2026-03-31 09:59:10.987047+00:00\n", - " INFO\n", - " User-provided chunk size: 2000 features.\n", - " \n", - " \n", - " 2026-03-31 09:59:10.987201+00:00\n", - " INFO\n", - " Writing cell expression data to GSF001458_cell_expression.br file using brotli compression...\n", - " \n", - " \n", - " 2026-03-31 09:59:19.135008+00:00\n", + " 2026-04-14 15:29:19.710521+00:00\n", " INFO\n", - " Processed 2000 / 24619 features.\n", + " Chunk size calculated based on the memory limit: 15348 features. To override this value, set the 'chunk_size' parameter in the configuration.\n", " \n", " \n", - " 2026-03-31 09:59:27.250167+00:00\n", + " 2026-04-14 15:29:19.710710+00:00\n", " INFO\n", - " Processed 4000 / 24619 features.\n", + " Writing cell expression data to GSF1653412_cell_expression.br file using brotli compression...\n", " \n", " \n", - " 2026-03-31 09:59:35.405850+00:00\n", + " 2026-04-14 15:30:19.680363+00:00\n", " INFO\n", - " Processed 6000 / 24619 features.\n", + " Processed 15348 / 24619 features.\n", " \n", " \n", - " 2026-03-31 09:59:43.211718+00:00\n", - " INFO\n", - " Processed 8000 / 24619 features.\n", - " \n", - " \n", - " 2026-03-31 09:59:51.226030+00:00\n", - " INFO\n", - " Processed 10000 / 24619 features.\n", - " \n", - " \n", - " 2026-03-31 09:59:59.259393+00:00\n", - " INFO\n", - " Processed 12000 / 24619 features.\n", - " \n", - " \n", - " 2026-03-31 10:00:07.129478+00:00\n", - " INFO\n", - " Processed 14000 / 24619 features.\n", - " \n", - " \n", - " 2026-03-31 10:00:14.838689+00:00\n", - " INFO\n", - " Processed 16000 / 24619 features.\n", - " \n", - " \n", - " 2026-03-31 10:00:22.398363+00:00\n", - " INFO\n", - " Processed 18000 / 24619 features.\n", - " \n", - " \n", - " 2026-03-31 10:00:29.856843+00:00\n", - " INFO\n", - " Processed 20000 / 24619 features.\n", - " \n", - " \n", - " 2026-03-31 10:00:36.707095+00:00\n", - " INFO\n", - " Processed 22000 / 24619 features.\n", - " \n", - " \n", - " 2026-03-31 10:00:42.847886+00:00\n", - " INFO\n", - " Processed 24000 / 24619 features.\n", - " \n", - " \n", - " 2026-03-31 10:00:44.933951+00:00\n", + " 2026-04-14 15:30:50.879254+00:00\n", " INFO\n", " Processed 24619 / 24619 features.\n", " \n", " \n", - " 2026-03-31 10:00:44.937313+00:00\n", + " 2026-04-14 15:30:50.936450+00:00\n", " INFO\n", " Cell expression data processing successfully completed.\n", " \n", " \n", - " 2026-03-31 10:00:44.944302+00:00\n", + " 2026-04-14 15:30:50.942881+00:00\n", " INFO\n", " Extracting expression metadata from source file...\n", " \n", " \n", - " 2026-03-31 10:00:44.947006+00:00\n", + " 2026-04-14 15:30:50.945764+00:00\n", " INFO\n", - " Saving expression metadata to GSF001458_expression_metadata.tsv file...\n", + " Saving expression metadata to GSF1653412_expression_metadata.tsv file...\n", " \n", " \n", - " 2026-03-31 10:00:44.947920+00:00\n", + " 2026-04-14 15:30:50.946771+00:00\n", " INFO\n", " Starting upload of transformed files to ODM...\n", " \n", " \n", - " 2026-03-31 10:00:44.948096+00:00\n", + " 2026-04-14 15:30:50.947018+00:00\n", " INFO\n", " Updating existing sample objects...\n", " \n", " \n", - " 2026-03-31 10:00:46.614785+00:00\n", + " 2026-04-14 15:30:52.829967+00:00\n", " INFO\n", - " Updated sample group accession(s): GSF001441.\n", + " Updated sample group accession(s): GSF1653395.\n", " \n", " \n", - " 2026-03-31 10:00:46.620640+00:00\n", + " 2026-04-14 15:30:52.835102+00:00\n", " INFO\n", " Starting import of cells to ODM.\n", " \n", " \n", - " 2026-03-31 10:00:47.646433+00:00\n", + " 2026-04-14 15:30:53.828951+00:00\n", " INFO\n", - " Waiting for import job to complete. Job exec ID: 159.\n", + " Waiting for import job to complete. Job exec ID: 4315.\n", " \n", " \n", - " 2026-03-31 10:00:47.661020+00:00\n", + " 2026-04-14 15:30:53.845750+00:00\n", " INFO\n", " Job status: RUNNING\n", " \n", " \n", - " 2026-03-31 10:01:02.687732+00:00\n", + " 2026-04-14 15:31:08.871777+00:00\n", " INFO\n", - " Cells upload completed. Group accession: GSF001465.\n", + " Cells upload completed. Group accession: GSF1653419.\n", " \n", " \n", - " 2026-03-31 10:01:02.688059+00:00\n", + " 2026-04-14 15:31:08.872068+00:00\n", " INFO\n", - " Single library group accession(s) will be used for cells linking: GSF001449.\n", + " Single library group accession(s) will be used for cells linking: GSF1653403.\n", " \n", " \n", - " 2026-03-31 10:01:02.688243+00:00\n", + " 2026-04-14 15:31:08.872280+00:00\n", " INFO\n", - " Linking cell group to library group. Cell group accession: GSF001465, Library group accession: GSF001449.\n", + " Linking cell group to library group. Cell group accession: GSF1653419, Library group accession: GSF1653403.\n", " \n", " \n", - " 2026-03-31 10:01:03.289374+00:00\n", + " 2026-04-14 15:31:09.477032+00:00\n", " INFO\n", " Cell group has been fully linked to library group.\n", " \n", " \n", - " 2026-03-31 10:01:03.442087+00:00\n", + " 2026-04-14 15:31:09.515538+00:00\n", " INFO\n", " Starting import of expression to ODM.\n", " \n", " \n", - " 2026-03-31 10:01:06.437843+00:00\n", + " 2026-04-14 15:31:12.888662+00:00\n", " INFO\n", - " Waiting for import job to complete. Job exec ID: 160.\n", + " Waiting for import job to complete. Job exec ID: 4316.\n", " \n", " \n", - " 2026-03-31 10:01:06.451592+00:00\n", + " 2026-04-14 15:31:12.902650+00:00\n", " INFO\n", " Job status: RUNNING\n", " \n", " \n", - " 2026-03-31 10:01:21.489144+00:00\n", + " 2026-04-14 15:31:27.933944+00:00\n", " INFO\n", - " Expression upload completed. Group accession: GSF001467.\n", + " Expression upload completed. Group accession: GSF1653421.\n", " \n", " \n", - " 2026-03-31 10:01:21.514075+00:00\n", + " 2026-04-14 15:31:27.934259+00:00\n", " INFO\n", - " Linking expression group to cell group. Expression group accession: GSF001467, Cell group accession: GSF001465.\n", + " Linking expression group to cell group. Expression group accession: GSF1653421, Cell group accession: GSF1653419.\n", " \n", " \n", - " 2026-03-31 10:01:21.760597+00:00\n", + " 2026-04-14 15:31:28.116835+00:00\n", " INFO\n", " Expression group has been fully linked to cell group.\n", " \n", " \n", - " 2026-03-31 10:01:22.051941+00:00\n", + " 2026-04-14 15:31:28.371345+00:00\n", " INFO\n", - " Transformation of attachment GSF001458 completed successfully with 1 warning(s).\n", + " Transformation of attachment GSF1653412 completed successfully with 1 warning(s).\n", " \n", " \n", - " 2026-03-31 10:01:22.053246+00:00\n", + " 2026-04-14 15:31:28.372367+00:00\n", " INFO\n", - " Saving transformation metadata to GSF001458_transformation_metadata_20260331_100122.tsv...\n", + " Saving transformation metadata to GSF1653412_transformation_metadata_20260414_153128.tsv...\n", " \n", " \n", - " 2026-03-31 10:01:22.054650+00:00\n", + " 2026-04-14 15:31:28.373481+00:00\n", " INFO\n", " Starting import of transformation logs to ODM.\n", " \n", " \n", - " 2026-03-31 10:01:23.145380+00:00\n", + " 2026-04-14 15:31:29.586851+00:00\n", " INFO\n", - " Waiting for import job to complete. Job exec ID: 161.\n", + " Waiting for import job to complete. Job exec ID: 4317.\n", " \n", " \n", - " 2026-03-31 10:01:23.162113+00:00\n", + " 2026-04-14 15:31:29.599827+00:00\n", " INFO\n", " Job status: RUNNING\n", " \n", " \n", - " 2026-03-31 10:01:38.193377+00:00\n", + " 2026-04-14 15:31:44.632245+00:00\n", " INFO\n", - " Transformation logs upload completed. Accession: GSF001468.\n", + " Transformation logs upload completed. Accession: GSF1653422.\n", " \n", " \n", "\n", @@ -3039,10 +2992,14 @@ } ], "source": [ - "# retrieve and display logs from job id once transformation job is completed:\n", - "logs_payload = odm_api.LogsPayload()\n", - "logs = jobs_api.post_api_v1_transformations_jobs_by_id_logs(job_id, logs_payload)\n", - "display_log_records(logs)" + "# retrieve and display logs from job id\n", + "if job_status.status.state.value not in ['UNKNOWN', 'WAITING']:\n", + " logs_payload = odm_api.LogsPayload()\n", + " logs = jobs_api.post_api_v1_transformations_jobs_by_id_logs(job_id, logs_payload)\n", + " display_log_records(logs)\n", + "else:\n", + " print(\"Transformation job has not started yet. Please rerun this cell once \"\n", + " \"the job is in progress or completed.\")" ] }, { @@ -3064,19 +3021,23 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "id": "c45fb6c4", "metadata": {}, "outputs": [], "source": [ "# extract group accessions from transformation job logs\n", - "accessions = extract_accessions_from_logs(logs)\n", - "cell_group_accession = accessions['cell_group_accession']\n", - "sample_group_accession = accessions['sample_group_accession']\n", - "library_group_accession = accessions['library_group_accession']\n", - "expression_group_accession = accessions['expression_group_accession']\n", - "preparation_group_accession = accessions['preparation_group_accession']\n", - "study_group_accession = accessions['study_group_accession']" + "if job_status.status.state.value == 'DONE':\n", + " accessions = extract_accessions_from_logs(logs)\n", + " cell_group_accession = accessions['cell_group_accession']\n", + " sample_group_accession = accessions['sample_group_accession']\n", + " library_group_accession = accessions['library_group_accession']\n", + " expression_group_accession = accessions['expression_group_accession']\n", + " preparation_group_accession = accessions['preparation_group_accession']\n", + " study_group_accession = accessions['study_group_accession']\n", + "else:\n", + " print(\"Transformation job not completed. \"\n", + " \"Please rerun this cell once the job has finished.\")" ] }, { @@ -3106,23 +3067,17 @@ " genestack:accession\n", " Sample Source ID\n", " Sample Name\n", + " GEO Sample ID\n", " Organism\n", - " Sex\n", " Disease\n", + " Sex\n", " Age\n", " Age Unit\n", " Tissue\n", " Cell Type\n", - " Cell Line\n", - " Compound Treatment / Compound\n", - " Compound Treatment / Dose\n", - " Compound Treatment / Dose Unit\n", - " Data Files / Raw\n", - " Data Files / Processed\n", - " Import Source URL\n", - " GEO Sample ID\n", + " Date\n", + " Source link\n", " Date of Sampling\n", - " Donor Fibrosis Stage\n", " Condition Group\n", " Donor Ethnicity Term ID\n", " Donor Sex\n", @@ -3130,183 +3085,165 @@ " Species\n", " Comment\n", " Donor Age Range\n", + " Sample Anatomical Site of Origin\n", + " Sample Source\n", " Cell Source\n", " Donor Age\n", " Developmental Stage\n", - " Organ\n", " groupId\n", + " Donor Fibrosis Stage\n", " \n", " \n", " \n", " \n", - " GSF001442\n", + " GSF1653396\n", " Liver-13\n", " AM042\n", - " None\n", + " GSM6416567\n", " None\n", " Healthy\n", " None\n", " None\n", - " liver\n", - " None\n", - " None\n", - " None\n", - " None\n", " None\n", + " liver\n", " None\n", " None\n", " None\n", - " GSM6416567\n", - " Oct 31 2024\n", - " The age was specified in the range between 51 to 60\n", + " 2024-10-31\n", " Normal\n", " unknown\n", " female\n", " year\n", " Homo sapiens\n", " healthy donor with absence of clear signs of acute or chronic injury\n", - " 0\n", + " 51-60\n", + " liver\n", + " Human Cell Atlas\n", " tissue\n", " 51\n", " human adult stage\n", - " liver\n", - " GSF001441\n", + " GSF1653395\n", + " NaN\n", " \n", " \n", - " GSF001443\n", + " GSF1653397\n", " Liver-14\n", " AM048\n", - " None\n", + " GSM6416569\n", " None\n", " Healthy\n", " None\n", " None\n", - " liver\n", - " None\n", - " None\n", - " None\n", - " None\n", " None\n", + " liver\n", " None\n", " None\n", " None\n", - " GSM6416569\n", - " Oct 31 2024\n", - " The age was specified in the range between 61 to 70\n", + " 2024-10-31\n", " Normal\n", " unknown\n", " male\n", " year\n", " Homo sapiens\n", " healthy donor with absence of clear signs of acute or chronic injury\n", - " 0\n", + " 61-70\n", + " liver\n", + " Human Cell Atlas\n", " tissue\n", " 61\n", " human adult stage\n", - " liver\n", - " GSF001441\n", + " GSF1653395\n", + " NaN\n", " \n", " \n", - " GSF001444\n", + " GSF1653398\n", " Liver-18\n", " AM061\n", - " None\n", + " GSM6416578\n", " None\n", " Healthy\n", " None\n", " None\n", - " liver\n", - " None\n", - " None\n", - " None\n", - " None\n", " None\n", + " liver\n", " None\n", " None\n", " None\n", - " GSM6416578\n", - " Oct 31 2024\n", - " The age was specified in the range between 81 to 90\n", + " 2024-10-31\n", " Normal\n", " unknown\n", " female\n", " year\n", " Homo sapiens\n", " healthy donor with absence of clear signs of acute or chronic injury\n", - " 0\n", + " 81-90\n", + " liver\n", + " Human Cell Atlas\n", " tissue\n", " 81\n", " human adult stage\n", - " liver\n", - " GSF001441\n", + " GSF1653395\n", + " NaN\n", " \n", " \n", - " GSF001445\n", + " GSF1653399\n", " Liver-32\n", " AM031\n", - " None\n", + " GSM8493744\n", " None\n", " liver cirrhosis\n", " None\n", " None\n", - " liver\n", - " None\n", - " None\n", - " None\n", - " None\n", " None\n", + " liver\n", " None\n", " None\n", " None\n", - " GSM8493744\n", - " Feb 05 2025\n", - " [The age was specified in the range between 51 to 60, The stage of fibrosis was specified as F4]\n", + " 2025-02-05\n", " Disease\n", " unknown\n", " male\n", " year\n", " Homo sapiens\n", " fibrotic donor\n", - " 0\n", + " 51-60\n", + " liver\n", + " Human Cell Atlas\n", " tissue\n", " 51\n", " human adult stage\n", - " liver\n", - " GSF001441\n", + " GSF1653395\n", + " F4\n", " \n", " \n", - " GSF001446\n", + " GSF1653400\n", " Liver-33\n", " AM062\n", - " None\n", + " GSM8493745\n", " None\n", " liver fibroma\n", " None\n", " None\n", - " liver\n", - " None\n", - " None\n", - " None\n", - " None\n", " None\n", + " liver\n", " None\n", " None\n", " None\n", - " GSM8493745\n", - " Feb 05 2025\n", - " [The age was specified in the range between 51 to 60, The stage of fibrosis was specified as F2]\n", + " 2025-02-05\n", " Disease\n", " unknown\n", " female\n", " year\n", " Homo sapiens\n", " fibrotic donor\n", - " 0\n", + " 41-50\n", + " liver\n", + " Human Cell Atlas\n", " tissue\n", " 41\n", " human adult stage\n", - " liver\n", - " GSF001441\n", + " GSF1653395\n", + " F2\n", " \n", " \n", "" @@ -3323,14 +3260,18 @@ "# initialize API client\n", "sample_api = odm_api.SampleSPoTAsUserApi(api_client)\n", "\n", - "# retrieve data by group accession\n", - "sample_data = sample_api.search_samples_as_user(\n", - " query=sample_group_accession,\n", - " returned_metadata_fields=\"original_data_included\"\n", - ")\n", - "data = sample_data.data\n", - "samples_df = pd.DataFrame(data)\n", - "display(HTML(samples_df.head().to_html(index=False)))\n" + "if job_status.status.state.value == 'DONE':\n", + " # retrieve data by group accession\n", + " sample_data = sample_api.search_samples_as_user(\n", + " query=sample_group_accession,\n", + " returned_metadata_fields=\"original_data_included\"\n", + " )\n", + " data = sample_data.data\n", + " samples_df = pd.DataFrame(data)\n", + " display(HTML(samples_df.head().to_html(index=False)))\n", + "else:\n", + " print(\"Transformation job not completed. \"\n", + " \"Please rerun this cell once the job has finished.\")" ] }, { @@ -3347,7 +3288,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "id": "9d594447", "metadata": {}, "outputs": [ @@ -3357,8 +3298,8 @@ "\n", " \n", " \n", + " \n", " \n", - " \n", " \n", " \n", " \n", @@ -3384,11 +3325,39 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3415,8 +3384,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3443,8 +3412,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3471,8 +3440,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3499,8 +3468,8 @@ " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -3541,11 +3510,18 @@ "# initialize API client\n", "cell_api = odm_api.CellsAsUserApi(api_client)\n", "\n", - "# retrieve data by group accession\n", - "cell_data = cell_api.get_cells_by_group_as_user(cell_group_accession)\n", - "data = cell_data.data\n", - "cells_df = pd.DataFrame(data)\n", - "display(HTML(cells_df.head().to_html(index=False)))" + "if job_status.status.state.value == 'DONE':\n", + " # retrieve data by group accession\n", + " cell_data = cell_api.get_cells_by_group_as_user(cell_group_accession)\n", + " data = cell_data.data\n", + " cells_df = pd.DataFrame(data)\n", + "\n", + " # set barcode as index\n", + " cells_df = cells_df.set_index(\"barcode\")\n", + " display(HTML(cells_df.head().to_html()))\n", + "else:\n", + " print(\"Transformation job not completed. \"\n", + " \"Please rerun this cell once the job has finished.\")" ] }, { @@ -3560,7 +3536,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "id": "84a195ee", "metadata": {}, "outputs": [ @@ -3594,10 +3570,6 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", @@ -3651,7 +3623,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3711,7 +3683,7 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -3738,12 +3710,16 @@ "# initialize API client\n", "expression_api = odm_api.ExpressionSPoTAsUserApi(api_client)\n", "\n", - "# retrieve data by group accession\n", - "expression_data = expression_api.get_expression_group_as_user(\n", - " id=expression_group_accession,\n", - " returned_metadata_fields=\"original_data_included\")\n", - "data = expression_data.metadata\n", - "display_expression_metadata(data)" + "if job_status.status.state.value == 'DONE':\n", + " # retrieve data by group accession\n", + " expression_data = expression_api.get_expression_group_as_user(\n", + " id=expression_group_accession,\n", + " returned_metadata_fields=\"original_data_included\")\n", + " data = expression_data.metadata\n", + " display_expression_metadata(data)\n", + "else:\n", + " print(\"Transformation job not completed. \"\n", + " \"Please rerun this cell once the job has finished.\")" ] }, { @@ -3759,14 +3735,14 @@ "id": "f6abc3e9", "metadata": {}, "source": [ - "This section provides an example of how to query and visualise gene expression data from ODM. Wait until indexing has completed after the transformation job before running the cells below.\n", + "This section provides an example of how to query and visualise gene expression data from ODM. Wait until indexing has completed after the transformation job before running the cells below. Indexing progress can be checked under `Tasks` in the top right corner of the ODM GUI. \n", "\n", "The expression matrix can be queried at single-cell resolution using `OmicsQueriesAsUserApi`, with cell-level filters applied to restrict results to high-quality cells. The retrieved expression data is assembled into an `AnnData` object and visualised as violin plots grouped by cell type." ] }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 33, "id": "a0d0f5f6", "metadata": {}, "outputs": [], @@ -3777,7 +3753,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "id": "d27fb52f", "metadata": {}, "outputs": [ @@ -3828,18 +3804,7 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "0e4c0e0e", - "metadata": {}, - "outputs": [], - "source": [ - "# set barcode as index to facilitate matrix construction\n", - "cells_df = cells_df.set_index(\"barcode\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 35, "id": "a8cba437", "metadata": {}, "outputs": [], @@ -3858,7 +3823,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "id": "a11c9c31", "metadata": {}, "outputs": [ @@ -3905,7 +3870,7 @@ "provenance": [] }, "kernelspec": { - "display_name": "transformations-demo", + "display_name": ".venv", "language": "python", "name": "python3" }, @@ -3919,7 +3884,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.0" + "version": "3.14.3" } }, "nbformat": 4,
cellIdbarcodebatchcellTypenCountsriboCountspercentRibo
barcode
GSF001465-Liver.13_AAACCCAAGTTAGTAG.1-1Liver.13_AAACCCAAGTTAGTAG.1-1Liver.13_AAACCCAAGTTAGTAG.1-1GSF1653419-Liver.13_AAACCCAAGTTAGTAG.1-1Liver-13100510.14923888170331312
GSF001465-Liver.13_AAACCCACAATGTGGG.1-1Liver.13_AAACCCACAATGTGGG.1-1Liver.13_AAACCCACAATGTGGG.1-1GSF1653419-Liver.13_AAACCCACAATGTGGG.1-1Liver-1353290.24394820791893415
GSF001465-Liver.13_AAACCCACACCTCGTT.1-1Liver.13_AAACCCACACCTCGTT.1-1Liver.13_AAACCCACACCTCGTT.1-1GSF1653419-Liver.13_AAACCCACACCTCGTT.1-1Liver-1381190.3202364823254095
GSF001465-Liver.13_AAACCCACATGACAAA.1-1Liver.13_AAACCCACATGACAAA.1-1Liver.13_AAACCCACATGACAAA.1-1GSF1653419-Liver.13_AAACCCACATGACAAA.1-1Liver-1319300.15544041450777202
GSF001465-Liver.13_AAACCCAGTTGAGTCT.1-1Liver.13_AAACCCAGTTGAGTCT.1-1Liver.13_AAACCCAGTTGAGTCT.1-1GSF1653419-Liver.13_AAACCCAGTTGAGTCT.1-1Liver-136327Data was obtained from the Human Cell Atlas repository, project FibroticLiverWatsonMERFISH. Data available in https://explore.data.humancellatlas.org/projects/64809a52-f703-4aec-b3a5-eca808a971d0
NameNone
Pipeline IDNone
Source File AccessionGSF001458GSF1653412
Total Number of Features
Transformation Logs File AccessionGSF001468GSF1653422
Data Files / Processed