From 6a3c49a11037899c155383dc8435098d919033dd Mon Sep 17 00:00:00 2001 From: Tessa Pierce Ward Date: Sat, 21 Dec 2024 11:11:45 -0800 Subject: [PATCH] MRG: add capacity for skipmer sketching and search (#531) * working skipmers, i think! * test singlesketch skipmers * add skipmer as moltype option for other commands * black formatting * add skipmer test sigs; add fastgather test * upd * upd test files * upd * fix * fix2 * try not pinning * MRG: switch to `importlib.metadata` from `pkg_resources` (#546) * switch from pkg_resources to importlib.metadata * black * need parens for proper selection * add anydna_size * update to sourmash prospective v0.18.0 * remove tests for bad zip files :sweat_smile: * upd to use py-skipmers * switch to sourmash latest; add skipmer indexing test * black formatting * upd tests * test for intersect_manifest bug * fix lint * fmt python * cargo fmt * remove redundant test * bump to sourmash r0.18.0 --------- Co-authored-by: C. Titus Brown --- .../sourmash_plugin_branchwater/__init__.py | 26 +-- .../tests/test-data/SRR606249.skipm2n3.zip | Bin 0 -> 51327 bytes src/python/tests/test-data/skipm1n3.zip | Bin 0 -> 25844 bytes src/python/tests/test-data/skipm2n3.zip | Bin 0 -> 48240 bytes src/python/tests/test_fastgather.py | 63 ++++++ src/python/tests/test_index.py | 42 ++++ src/python/tests/test_sketch.py | 179 ++++++++++++++++++ src/utils/buildutils.rs | 55 +++++- src/utils/mod.rs | 2 + 9 files changed, 349 insertions(+), 18 deletions(-) create mode 100644 src/python/tests/test-data/SRR606249.skipm2n3.zip create mode 100644 src/python/tests/test-data/skipm1n3.zip create mode 100644 src/python/tests/test-data/skipm2n3.zip diff --git a/src/python/sourmash_plugin_branchwater/__init__.py b/src/python/sourmash_plugin_branchwater/__init__.py index ba2f5798..7e3c2d46 100755 --- a/src/python/sourmash_plugin_branchwater/__init__.py +++ b/src/python/sourmash_plugin_branchwater/__init__.py @@ -78,8 +78,8 @@ def __init__(self, p): "-m", "--moltype", default="DNA", - choices=["DNA", "protein", "dayhoff", "hp"], - help="molecule type (DNA, protein, dayhoff, or hp; default DNA)", + choices=["DNA", "protein", "dayhoff", "hp", "skipm1n3", "skipm2n3"], + help="molecule type: DNA, protein, dayhoff, hp, or skipmer (skipm1n3 or skipm2n3); default DNA", ) p.add_argument( "-c", @@ -187,8 +187,8 @@ def __init__(self, p): "-m", "--moltype", default="DNA", - choices=["DNA", "protein", "dayhoff", "hp"], - help="molecule type (DNA, protein, dayhoff, or hp; default DNA)", + choices=["DNA", "protein", "dayhoff", "hp", "skipm1n3", "skipm2n3"], + help="molecule type: DNA, protein, dayhoff, hp, or skipmer (skipm1n3 or skipm2n3); default DNA", ) p.add_argument( "-c", @@ -264,8 +264,8 @@ def __init__(self, p): "-m", "--moltype", default="DNA", - choices=["DNA", "protein", "dayhoff", "hp"], - help="molecule type (DNA, protein, dayhoff, or hp; default DNA)", + choices=["DNA", "protein", "dayhoff", "hp", "skipm1n3", "skipm2n3"], + help="molecule type: DNA, protein, dayhoff, hp, or skipmer (skipm1n3 or skipm2n3); default DNA", ) p.add_argument( "-c", @@ -348,8 +348,8 @@ def __init__(self, p): "-m", "--moltype", default="DNA", - choices=["DNA", "protein", "dayhoff", "hp"], - help="molecule type (DNA, protein, dayhoff, or hp; default DNA)", + choices=["DNA", "protein", "dayhoff", "hp", "skipm1n3", "skipm2n3"], + help="molecule type: DNA, protein, dayhoff, hp, or skipmer (skipm1n3 or skipm2n3); default DNA", ) p.add_argument( "-c", @@ -450,8 +450,8 @@ def __init__(self, p): "-m", "--moltype", default="DNA", - choices=["DNA", "protein", "dayhoff", "hp"], - help="molecule type (DNA, protein, dayhoff, or hp; default DNA)", + choices=["DNA", "protein", "dayhoff", "hp", "skipm1n3", "skipm2n3"], + help="molecule type: DNA, protein, dayhoff, hp, or skipmer (skipm1n3 or skipm2n3); default DNA", ) p.add_argument( "-c", @@ -544,8 +544,8 @@ def __init__(self, p): "-m", "--moltype", default="DNA", - choices=["DNA", "protein", "dayhoff", "hp"], - help="molecule type (DNA, protein, dayhoff, or hp; default DNA)", + choices=["DNA", "protein", "dayhoff", "hp", "skipm1n3", "skipm2n3"], + help="molecule type: DNA, protein, dayhoff, hp, or skipmer (skipm1n3 or skipm2n3); default DNA", ) p.add_argument( "-c", @@ -640,7 +640,7 @@ def main(self, args): args.param_string = ["k=31,scaled=1000,dna"] # Check and append 'dna' if no moltype is found in a param string - moltypes = ["dna", "protein", "dayhoff", "hp"] + moltypes = ["dna", "protein", "dayhoff", "hp", "skipm1n3", "skipm2n3"] updated_param_strings = [] for param in args.param_string: diff --git a/src/python/tests/test-data/SRR606249.skipm2n3.zip b/src/python/tests/test-data/SRR606249.skipm2n3.zip new file mode 100644 index 0000000000000000000000000000000000000000..6c829bb27ca010300520bc4d933a6a893374c899 GIT binary patch literal 51327 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 literal 0 HcmV?d00001 diff --git a/src/python/tests/test-data/skipm2n3.zip b/src/python/tests/test-data/skipm2n3.zip new file mode 100644 index 0000000000000000000000000000000000000000..e117e77f6be5da5151f9b651a9a7b12a28c296ac GIT binary patch literal 48240 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 A(*OVf literal 0 HcmV?d00001 diff --git a/src/python/tests/test_fastgather.py b/src/python/tests/test_fastgather.py index 2fb1ed78..c3be996c 100644 --- a/src/python/tests/test_fastgather.py +++ b/src/python/tests/test_fastgather.py @@ -1328,3 +1328,66 @@ def test_equal_matches(runtmp): df = pandas.read_csv(runtmp.output("out.csv")) assert len(df) == 2 assert set(df["intersect_bp"]) == {1000} + + +def test_simple_skipm2n3( + runtmp, capfd, indexed_query, indexed_against, toggle_internal_storage +): + # test basic execution! + query = get_test_data("SRR606249.skipm2n3.zip") + against = get_test_data("skipm2n3.zip") # contains 2,47,63 + + if indexed_query: + query = index_siglist( + runtmp, query, runtmp.output("query"), scaled=100000, moltype="skipm2n3" + ) + + if indexed_against: + against = index_siglist( + runtmp, + against, + runtmp.output("db"), + moltype="skipm2n3", + toggle_internal_storage=toggle_internal_storage, + ) + + g_output = runtmp.output("gather.csv") + p_output = runtmp.output("prefetch.csv") + + runtmp.sourmash( + "scripts", + "fastgather", + "--moltype", + "skipm2n3", + query, + against, + "-o", + g_output, + "-s", + "100000", + ) + assert os.path.exists(g_output) + + captured = capfd.readouterr() + print(captured.err) + + df = pandas.read_csv(g_output) + assert len(df) == 3 + keys = set(df.keys()) + assert { + "query_filename", + "query_name", + "query_md5", + "match_name", + "match_md5", + "gather_result_rank", + "intersect_bp", + }.issubset(keys) + + # CTB note: we do not need to worry about this warning for query from a + # RocksDB, since there is only one. + if indexed_against: + print("indexed against:", indexed_against) + assert ( + "WARNING: loading all sketches from a RocksDB into memory!" in captured.err + ) diff --git a/src/python/tests/test_index.py b/src/python/tests/test_index.py index 44c277d2..f33bc241 100644 --- a/src/python/tests/test_index.py +++ b/src/python/tests/test_index.py @@ -487,6 +487,48 @@ def test_index_subdir(runtmp, toggle_internal_storage): runtmp.sourmash("scripts", "check", output) +def test_index_skipm2n3(runtmp, toggle_internal_storage): + # test basic index! + sigzip = get_test_data("skipm2n3.zip") + output = runtmp.output("db.rocksdb") + + runtmp.sourmash( + "scripts", + "index", + sigzip, + "-o", + output, + toggle_internal_storage, + "-m", + "skipm2n3", + ) + assert os.path.exists(output) + print(runtmp.last_result.err) + + assert "index is done" in runtmp.last_result.err + + +def test_index_skipm1n3(runtmp, toggle_internal_storage): + # test basic index! + sigzip = get_test_data("skipm1n3.zip") + output = runtmp.output("db.rocksdb") + + runtmp.sourmash( + "scripts", + "index", + sigzip, + "-o", + output, + toggle_internal_storage, + "-m", + "skipm1n3", + ) + assert os.path.exists(output) + print(runtmp.last_result.err) + + assert "index is done" in runtmp.last_result.err + + def test_index_misnamed_zipfile(runtmp, capfd): # test with a misnamed input zipfile (a .sig.gz file renamed as zip file) # (This is a generic test that checks to make sure misnamed zip files diff --git a/src/python/tests/test_sketch.py b/src/python/tests/test_sketch.py index 86800008..bedd0226 100644 --- a/src/python/tests/test_sketch.py +++ b/src/python/tests/test_sketch.py @@ -1,5 +1,6 @@ import os import pytest +import csv import pandas import sourmash from sourmash import index @@ -1435,3 +1436,181 @@ def test_singlesketch_zip_output(runtmp): runtmp.sourmash("sketch", "dna", fa1, "-o", output2) sig2 = sourmash.load_one_signature(output2) assert sig.minhash.hashes == sig2.minhash.hashes + + +def test_manysketch_skipm2n3(runtmp, capfd): + fa_csv = runtmp.output("db-fa.csv") + + fa1 = get_test_data("short.fa") + fa2 = get_test_data("short2.fa") + fa3 = get_test_data("short3.fa") + protfa1 = get_test_data("short-protein.fa") + + make_assembly_csv(fa_csv, [fa1, fa2, fa3], [protfa1]) + + output = runtmp.output("db.zip") + + runtmp.sourmash( + "scripts", + "manysketch", + fa_csv, + "-o", + output, + "--param-str", + "dna,k=21,scaled=1", + "--param-str", + "skipm2n3,k=31,scaled=30", + ) + + assert os.path.exists(output) + assert not runtmp.last_result.out # stdout should be empty + captured = capfd.readouterr() + print(captured.err) + + idx = sourmash.load_file_as_index(output) + sigs = list(idx.signatures()) + print(sigs) + + assert len(sigs) == 3 # 3 dna, 3 skipmer. But sourmash can only read the DNA sigs!! + # check moltypes, etc! + dna_md5sums = { + "short": "1474578c5c46dd09da4c2df29cf86621", + "short2": "4efeebd26644278e36b9553e018a851a", + "short3": "f85747ac4f473c4a71c1740d009f512b", + } + for sig in sigs: + if sig.minhash.is_dna: + assert sig.minhash.ksize == 21 + assert sig.minhash.scaled == 1 + print("DNA: ", sig.name, sig.md5sum()) + assert sig.md5sum() == dna_md5sums[sig.name] + + # read the file with python and check sigs + import zipfile, gzip, json + + with zipfile.ZipFile(output, "r") as zf: + # Check the manifest exists + assert "SOURMASH-MANIFEST.csv" in zf.namelist() + + expected_signatures = [ + { + "name": "short", + "ksize": 31, + "scaled": 30, + "moltype": "skipm2n3", + "md5sum": "0486fcae73545363da9cd5bfcf18d322", + }, + { + "name": "short3", + "ksize": 31, + "scaled": 30, + "moltype": "skipm2n3", + "md5sum": "890557b39ae66d3177035296818de7c6", + }, + { + "name": "short2", + "ksize": 31, + "scaled": 30, + "moltype": "skipm2n3", + "md5sum": "ec6305f5d82e51659f3914d47fcc32ee", + }, + ] + expected_signatures_dict = {exp["md5sum"]: exp for exp in expected_signatures} + + # Read and parse the manifest + with zf.open("SOURMASH-MANIFEST.csv") as manifest_file: + manifest_data = manifest_file.read().decode("utf-8").splitlines() + manifest_data = [line for line in manifest_data if not line.startswith("#")] + manifest_reader = csv.DictReader(manifest_data) + + for row in manifest_reader: + if row["moltype"] == "skipm2n3": + print("Manifest Row:", row) + + # Validate row fields + md5sum = row["md5"] + assert ( + md5sum in expected_signatures_dict + ), f"Unexpected md5sum: {md5sum}" + expected = expected_signatures_dict[md5sum] + assert ( + row["name"] == expected["name"] + ), f"Name mismatch: {row['name']}" + assert ( + int(row["ksize"]) == expected["ksize"] + ), f"Ksize mismatch: {row['ksize']}" + assert ( + row["moltype"] == expected["moltype"] + ), f"Moltype mismatch: {row['moltype']}" + + sig_path = row["internal_location"] + assert sig_path.startswith("signatures/") + + # Extract and read the signature file + with zf.open(sig_path) as sig_gz: + with gzip.open(sig_gz, "rt") as sig_file: + sig_contents = json.load(sig_file) + print("Signature Contents:", sig_contents) + + # Validate signature contents + sig_data = sig_contents[0] + print(sig_data) + siginfo = sig_data["signatures"][0] + assert ( + siginfo["md5sum"] == md5sum + ), f"MD5 mismatch: {siginfo['md5sum']}" + assert ( + siginfo["ksize"] == expected["ksize"] + ), f"Ksize mismatch: {siginfo['ksize']}" + assert ( + siginfo["molecule"] == expected["moltype"] + ), f"Moltype mismatch: {siginfo['molecule']}" + + +def test_singlesketch_skipm2n3(runtmp): + """Test singlesketch with skipm2n3.""" + fa1 = get_test_data("short.fa") + output = runtmp.output("short.sig") + + # Run the singlesketch command + runtmp.sourmash( + "scripts", "singlesketch", fa1, "-p", "skipm2n3,k=31,scaled=100", "-o", output + ) + + # Check if the output exists and contains the expected data + assert os.path.exists(output) + # Load the output signature file + import json + + with open(output, "r") as f: + data = json.load(f) + + # Extract the signature part from the JSON + signatures = data[0]["signatures"] + + # Expected signature fields + expected_signatures = [ + { + "name": "short.fa", + "ksize": 31, + "moltype": "skipm2n3", + "md5sum": "387d25c8e4b4878c78872efd13621491", + } + ] + + # Check if the signatures match the expected + assert len(signatures) == len( + expected_signatures + ), "Number of signatures does not match." + + for sig, expected in zip(signatures, expected_signatures): + assert sig["ksize"] == expected["ksize"], f"Unexpected ksize: {sig['ksize']}" + assert ( + sig["molecule"] == expected["moltype"] + ), f"Unexpected moltype: {sig['molecule']}" + assert ( + sig["md5sum"] == expected["md5sum"] + ), f"Unexpected md5sum: {sig['md5sum']}" + assert ( + data[0]["name"] == expected["name"] + ), f"Unexpected name: {data[0]['name']}" diff --git a/src/utils/buildutils.rs b/src/utils/buildutils.rs index 8d75391c..fc7e9264 100644 --- a/src/utils/buildutils.rs +++ b/src/utils/buildutils.rs @@ -49,7 +49,7 @@ impl MultiSelection { pub fn from_input_moltype(input_moltype: &str) -> Result { // currently we don't allow translation. Will need to change this when we do. // is there a better way to do this? - let mut moltypes = vec!["DNA"]; + let mut moltypes = vec!["DNA", "skipm1n3", "skipm2n3"]; // change so default is just dna? if input_moltype == "protein" { moltypes = vec!["protein", "dayhoff", "hp"]; } @@ -181,6 +181,24 @@ impl BuildRecord { } } + pub fn default_skipm1n3() -> Self { + Self { + moltype: "skipm1n3".to_string(), + ksize: 21, + scaled: 1000, + ..Self::default_dna() + } + } + + pub fn default_skipm2n3() -> Self { + Self { + moltype: "skipm2n3".to_string(), + ksize: 21, + scaled: 1000, + ..Self::default_dna() + } + } + pub fn moltype(&self) -> HashFunctions { self.moltype.as_str().try_into().unwrap() } @@ -420,9 +438,30 @@ impl BuildCollection { Ok(mf.records.len()) } + pub fn skipm1n3_size(&self) -> Result { + let multiselection = MultiSelection::from_moltypes(vec!["skipm1n3"])?; + let mut mf = self.manifest.clone(); + mf.select(&multiselection)?; + Ok(mf.records.len()) + } + + pub fn skipm2n3_size(&self) -> Result { + let multiselection = MultiSelection::from_moltypes(vec!["skipm2n3"])?; + let mut mf = self.manifest.clone(); + mf.select(&multiselection)?; + Ok(mf.records.len()) + } + + pub fn anydna_size(&self) -> Result { + let multiselection = MultiSelection::from_moltypes(vec!["DNA", "skipm1n3", "skipm2n3"])?; + let mut mf = self.manifest.clone(); + mf.select(&multiselection)?; + Ok(mf.records.len()) + } + pub fn protein_size(&self) -> Result { let multiselection = MultiSelection::from_moltypes(vec!["protein"])?; - let mut mf = self.manifest.clone(); // temporary mutable copy + let mut mf = self.manifest.clone(); mf.select(&multiselection)?; Ok(mf.records.len()) } @@ -466,7 +505,7 @@ impl BuildCollection { pub fn parse_moltype(item: &str, current: &mut Option) -> Result { let new_moltype = match item { - "protein" | "dna" | "dayhoff" | "hp" => item.to_string(), + "protein" | "dna" | "dayhoff" | "hp" | "skipm1n3" | "skipm2n3" => item.to_string(), _ => return Err(format!("unknown moltype '{}'", item)), }; @@ -531,7 +570,7 @@ impl BuildCollection { "abund" | "noabund" => { Self::parse_abundance(item, &mut track_abundance)?; } - "protein" | "dna" | "DNA" | "dayhoff" | "hp" => { + "protein" | "dna" | "DNA" | "dayhoff" | "hp" | "skipm1n3" | "skipm2n3" => { Self::parse_moltype(item, &mut moltype)?; } _ if item.starts_with("num=") => { @@ -566,6 +605,8 @@ impl BuildCollection { "protein" => BuildRecord::default_protein(), "dayhoff" => BuildRecord::default_dayhoff(), "hp" => BuildRecord::default_hp(), + "skipm1n3" => BuildRecord::default_skipm1n3(), + "skipm2n3" => BuildRecord::default_skipm2n3(), _ => { return Err(format!( "Error parsing params string '{}': Unsupported moltype '{}'", @@ -660,6 +701,8 @@ impl BuildCollection { .dna(record.moltype == "DNA") .dayhoff(record.moltype == "dayhoff") .hp(record.moltype == "hp") + .skipm1n3(record.moltype == "skipm1n3") + .skipm2n3(record.moltype == "skipm2n3") .num_hashes(record.num) .track_abundance(record.with_abundance) .build(); @@ -747,7 +790,9 @@ impl BuildCollection { rec.sequence_added = true; } } else if (input_moltype == "DNA" || input_moltype == "dna") - && rec.moltype() == HashFunctions::Murmur64Dna + && (rec.moltype() == HashFunctions::Murmur64Dna + || rec.moltype() == HashFunctions::Murmur64Skipm1n3 + || rec.moltype() == HashFunctions::Murmur64Skipm2n3) { sig.add_sequence(&record.seq(), true) .context("Failed to add sequence")?; diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 5674d13d..3c3e82f8 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -975,6 +975,8 @@ pub fn build_selection(ksize: u8, scaled: Option, moltype: &str) -> Selecti "protein" => HashFunctions::Murmur64Protein, "dayhoff" => HashFunctions::Murmur64Dayhoff, "hp" => HashFunctions::Murmur64Hp, + "skipm1n3" => HashFunctions::Murmur64Skipm1n3, + "skipm2n3" => HashFunctions::Murmur64Skipm2n3, _ => panic!("Unknown molecule type: {}", moltype), }; // let hash_function = HashFunctions::try_from(moltype)