From 2aac698ee3a346c5de7def357f913497c3bf44e7 Mon Sep 17 00:00:00 2001 From: Givanna Putri Date: Thu, 2 Oct 2025 00:03:09 +1000 Subject: [PATCH 1/4] fix error in control methods --- CHANGELOG.md | 2 + .../shuffle_integration/script.py | 44 ++++++++++++++----- .../shuffle_integration_by_batch/script.py | 2 +- .../script.py | 7 +-- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c51532cd..3b486603 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -97,6 +97,8 @@ * Added EMD vertical global metric and split perfect integration into horizontal and vertical for computing horizontal and vertical metrics (PR #63). +* Fix problems identified during a full run (PR #99). + ## MINOR CHANGES * Enabled unit tests (PR #2). diff --git a/src/control_methods/shuffle_integration/script.py b/src/control_methods/shuffle_integration/script.py index 597abbae..6dbc7901 100644 --- a/src/control_methods/shuffle_integration/script.py +++ b/src/control_methods/shuffle_integration/script.py @@ -4,10 +4,11 @@ ## VIASH START par = { - "input_unintegrated": "resources_test/task_cyto_batch_integration/mouse_spleen_flow_cytometry_subset/unintegrated_censored.h5ad", - "output": "output.h5ad", + "input_unintegrated": "resources_test/task_cyto_batch_integration/mouse_spleen_flow_cytometry_subset/unintegrated.h5ad", + "output_integrated_split1": "resources_test/task_cyto_batch_integration/mouse_spleen_flow_cytometry_subset/control_integrated_split1.h5ad", + "output_integrated_split2": "resources_test/task_cyto_batch_integration/mouse_spleen_flow_cytometry_subset/control_integrated_split2.h5ad", } -meta = {"name": "harmonypy"} +meta = {"name": "shuffle_integration_by_cell_type", "resources_dir": "src/control_methods"} ## VIASH END print("Importing helper functions", flush=True) @@ -16,25 +17,44 @@ print("Reading and preparing input files", flush=True) adata = ad.read_h5ad(par["input_unintegrated"]) +adata_split1 = adata[(adata.obs.is_control > 0) | (adata.obs.split == 1)].copy() +adata_split2 = adata[(adata.obs.is_control > 0) | (adata.obs.split == 2)].copy() -adata.obs["batch_str"] = adata.obs["batch"].astype(str) - -print("Randomise features", flush=True) +print("Randomise features - split 1", flush=True) +adata_split1.obs["batch_str"] = adata_split1.obs["batch"].astype(str) integrated = _randomize_features( - adata.layers["preprocessed"] + adata_split1.layers["preprocessed"] ) # create new anndata -output = ad.AnnData( - obs=adata.obs[[]], - var=adata.var[[]], +output_split1 = ad.AnnData( + obs=adata_split1.obs[[]], + var=adata_split1.var[[]], + layers={"integrated": integrated}, + uns={ + "dataset_id": adata_split1.uns["dataset_id"], + "method_id": meta["name"], + "parameters": {}, + }, +) + +print("Randomise features - split 2", flush=True) +adata_split2.obs["batch_str"] = adata_split2.obs["batch"].astype(str) +integrated = _randomize_features( + adata_split2.layers["preprocessed"] +) +# create new anndata +output_split2 = ad.AnnData( + obs=adata_split2.obs[[]], + var=adata_split2.var[[]], layers={"integrated": integrated}, uns={ - "dataset_id": adata.uns["dataset_id"], + "dataset_id": adata_split2.uns["dataset_id"], "method_id": meta["name"], "parameters": {}, }, ) print("Write output AnnData to file", flush=True) -output.write_h5ad(par["output"], compression="gzip") +output_split1.write_h5ad(par["output_integrated_split1"], compression="gzip") +output_split2.write_h5ad(par["output_integrated_split2"], compression="gzip") \ No newline at end of file diff --git a/src/control_methods/shuffle_integration_by_batch/script.py b/src/control_methods/shuffle_integration_by_batch/script.py index 0f7fbe25..1c3bf6cc 100644 --- a/src/control_methods/shuffle_integration_by_batch/script.py +++ b/src/control_methods/shuffle_integration_by_batch/script.py @@ -16,7 +16,7 @@ print("Reading and preparing input files", flush=True) adata = ad.read_h5ad(par["input_unintegrated"]) -adata_split1 = adata[(adata.obs.is_control > 0) | (adata.obs.batch == 1)].copy() +adata_split1 = adata[(adata.obs.is_control > 0) | (adata.obs.split == 1)].copy() adata_split2 = adata[(adata.obs.is_control > 0) | (adata.obs.split == 2)].copy() print("Randomise features - split 1", flush=True) diff --git a/src/control_methods/shuffle_integration_by_cell_type/script.py b/src/control_methods/shuffle_integration_by_cell_type/script.py index d4bcd218..bc5554bd 100644 --- a/src/control_methods/shuffle_integration_by_cell_type/script.py +++ b/src/control_methods/shuffle_integration_by_cell_type/script.py @@ -5,9 +5,10 @@ ## VIASH START par = { "input_unintegrated": "resources_test/task_cyto_batch_integration/mouse_spleen_flow_cytometry_subset/unintegrated.h5ad", - "output": "output.h5ad", + "output_integrated_split1": "resources_test/task_cyto_batch_integration/mouse_spleen_flow_cytometry_subset/control_integrated_split1.h5ad", + "output_integrated_split2": "resources_test/task_cyto_batch_integration/mouse_spleen_flow_cytometry_subset/control_integrated_split2.h5ad", } -meta = {"name": "harmonypy"} +meta = {"name": "shuffle_integration_by_cell_type", "resources_dir": "src/control_methods"} ## VIASH END print("Importing helper functions", flush=True) @@ -16,7 +17,7 @@ print("Reading and preparing input files", flush=True) adata = ad.read_h5ad(par["input_unintegrated"]) -adata_split1 = adata[(adata.obs.is_control > 0) | (adata.obs.batch == 1)].copy() +adata_split1 = adata[(adata.obs.is_control > 0) | (adata.obs.split == 1)].copy() adata_split2 = adata[(adata.obs.is_control > 0) | (adata.obs.split == 2)].copy() print("Randomise features - split 1", flush=True) From e71bead76fe7a1b356b03650c4e61b2d2fef967a Mon Sep 17 00:00:00 2001 From: Givanna Putri Date: Thu, 2 Oct 2025 00:05:02 +1000 Subject: [PATCH 2/4] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b486603..57184752 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -155,5 +155,6 @@ * Fix missing anndata in yaml file and set the base_r docker image version to 1 instead of 1.0.0 (PR #89). +* Fix bug in control methods (PR #107). From 34074b7ec028c285532d3b32bc9045ea0cdb676a Mon Sep 17 00:00:00 2001 From: Givanna Putri Date: Thu, 2 Oct 2025 01:16:53 +1000 Subject: [PATCH 3/4] enabling control methods --- .../shuffle_integration_by_cell_type/config.vsh.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/control_methods/shuffle_integration_by_cell_type/config.vsh.yaml b/src/control_methods/shuffle_integration_by_cell_type/config.vsh.yaml index 70536409..42e05db8 100644 --- a/src/control_methods/shuffle_integration_by_cell_type/config.vsh.yaml +++ b/src/control_methods/shuffle_integration_by_cell_type/config.vsh.yaml @@ -3,7 +3,7 @@ name: shuffle_integration_by_cell_type label: Shuffle integration by cell type summary: Integrations are randomly permuted within each cell type description: Integrations are randomly permuted within each cell type -status: disabled +# status: disabled resources: - type: python_script path: script.py From 813b599f73f2506a192fd51569b8fb5b9e22b31f Mon Sep 17 00:00:00 2001 From: Givanna Putri Date: Thu, 2 Oct 2025 01:19:08 +1000 Subject: [PATCH 4/4] updated changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57184752..1c76698b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -155,6 +155,6 @@ * Fix missing anndata in yaml file and set the base_r docker image version to 1 instead of 1.0.0 (PR #89). -* Fix bug in control methods (PR #107). +* Fix bug in control methods (PR #107 and PR #108).