Skip to content

Commit 6f5f356

Browse files
committed
add cumulative_coassemblies output to record previous coassemblies
loaded automatically by iterate
1 parent 0c7ee0e commit 6f5f356

File tree

3 files changed

+38
-7
lines changed

3 files changed

+38
-7
lines changed

ibis/ibis.py

+25-1
Original file line numberDiff line numberDiff line change
@@ -728,10 +728,25 @@ def iterate(args):
728728
}
729729

730730
if args.coassemble_output:
731+
logging.info("Processing previous Ibis coassemble run")
731732
coassemble_appraise_dir = os.path.join(os.path.abspath(args.coassemble_output), "appraise")
732733
args.coassemble_unbinned = os.path.join(coassemble_appraise_dir, "unbinned.otu_table.tsv")
733734
args.coassemble_binned = os.path.join(coassemble_appraise_dir, "binned.otu_table.tsv")
734735

736+
if args.exclude_coassemblies:
737+
new_exclude_coassemblies = args.exclude_coassemblies
738+
else:
739+
new_exclude_coassemblies = []
740+
741+
cumulative_path = os.path.join(args.coassemble_output, "target", "cumulative_coassemblies.tsv")
742+
if os.path.isfile(cumulative_path):
743+
with open(cumulative_path) as f:
744+
cumulative_exclude = f.read().splitlines()
745+
else:
746+
cumulative_exclude = []
747+
748+
args.exclude_coassemblies = cumulative_exclude + new_exclude_coassemblies
749+
735750
try:
736751
args.coassemble_unbinned
737752
except AttributeError:
@@ -774,6 +789,14 @@ def iterate(args):
774789

775790
coassemble(args)
776791

792+
elusive_clusters_path = os.path.join(args.output, "coassemble", "target", "elusive_clusters.tsv")
793+
if os.path.isfile(elusive_clusters_path):
794+
elusive_clusters = pl.read_csv(elusive_clusters_path, separator="\t")
795+
new_coassemblies = elusive_clusters.get_column("samples").to_list()
796+
797+
with open(os.path.join(args.output, "coassemble", "target", "cumulative_coassemblies.tsv"), "w") as f:
798+
f.write("\n".join(args.exclude_coassemblies + new_coassemblies) + "\n")
799+
777800
if args.elusive_clusters and not args.dryrun:
778801
new_cluster = pl.read_csv(os.path.join(args.output, "coassemble", "target", "elusive_clusters.tsv"), separator="\t")
779802
for cluster in args.elusive_clusters:
@@ -785,7 +808,8 @@ def iterate(args):
785808
pl.col("coassembly").map_elements(lambda x: logging.warn(f"{x} has been previously suggested"))
786809
)
787810
elif not args.exclude_coassemblies:
788-
logging.warn("Suggested coassemblies may match those from previous iterations. To check, use `--elusive-clusters`. To exclude manually, use `--exclude-coassembles`")
811+
logging.warn("Suggested coassemblies may match those from previous iterations. To check, use `--elusive-clusters`.")
812+
logging.warn("To exclude, provide previous run with `--coassemble-output` or use `--exclude-coassembles`.")
789813

790814
logging.info(f"Ibis iterate complete.")
791815
logging.info(f"Cluster summary at {os.path.join(args.output, 'coassemble', 'summary.tsv')}")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
sample_0,sample_1

test/test_iterate.py

+12-6
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,6 @@ def test_iterate_minimal(self):
148148
cmd = (
149149
f"ibis iterate "
150150
f"--coassemble-output {MOCK_COASSEMBLE} "
151-
f"--elusive-clusters {ELUSIVE_CLUSTERS} "
152151
f"--singlem-metapackage {METAPACKAGE} "
153152
f"--output test "
154153
f"--conda-prefix {path_to_conda} "
@@ -183,6 +182,9 @@ def test_iterate_minimal(self):
183182
}
184183
self.assertEqual(reads_2, config["reads_2"])
185184

185+
exclude_coassemblies = ["sample_0,sample_1"]
186+
self.assertEqual(exclude_coassemblies, config["exclude_coassemblies"])
187+
186188
cluster_path = os.path.join("test", "coassemble", "target", "elusive_clusters.tsv")
187189
self.assertTrue(os.path.exists(cluster_path))
188190
expected = "\n".join(
@@ -209,6 +211,12 @@ def test_iterate_minimal(self):
209211
with open(cluster_path) as f:
210212
self.assertEqual(expected, f.read())
211213

214+
cumulative_coassemblies_path = os.path.join("test", "coassemble", "target", "cumulative_coassemblies.tsv")
215+
self.assertTrue(os.path.exists(cumulative_coassemblies_path))
216+
expected = "\n".join(["sample_0,sample_1", "sample_1,sample_3", ""])
217+
with open(cumulative_coassemblies_path) as f:
218+
self.assertEqual(expected, f.read())
219+
212220
def test_iterate_genome_input(self):
213221
with in_tempdir():
214222
cmd = (
@@ -336,12 +344,9 @@ def test_iterate_default_config(self):
336344
with in_tempdir():
337345
cmd = (
338346
f"ibis iterate "
339-
f"--aviary-outputs {MOCK_COASSEMBLIES} "
340-
f"--forward {SAMPLE_READS_FORWARD} "
341-
f"--reverse {SAMPLE_READS_REVERSE} "
342-
f"--genomes {GENOMES} "
343-
f"--genome-transcripts {GENOME_TRANSCRIPTS} "
347+
f"--coassemble-output {MOCK_COASSEMBLE} "
344348
f"--singlem-metapackage {METAPACKAGE} "
349+
f"--exclude-coassemblies sample_4,sample_5 "
345350
f"--output test "
346351
f"--conda-prefix {path_to_conda} "
347352
f"--dryrun "
@@ -357,6 +362,7 @@ def test_iterate_default_config(self):
357362
self.assertEqual(config["assemble_unmapped"], False)
358363
self.assertEqual(config["aviary_threads"], 64)
359364
self.assertEqual(config["aviary_memory"], 500)
365+
self.assertEqual(config["exclude_coassemblies"], ["sample_0,sample_1", "sample_4,sample_5"])
360366

361367
self.assertTrue("Evaluating bins using CheckM2 with completeness >= 70 and contamination <= 10" in output)
362368

0 commit comments

Comments
 (0)