From 36ea2920a85dd67a14ea3d8ea184946c8dcad159 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Mon, 18 Jan 2021 07:47:33 -0800 Subject: [PATCH 01/24] start adjusting docs --- doc/api-example.md | 19 ++++++++----- doc/classifying-signatures.md | 8 +++--- doc/command-line.md | 51 ++++++++++++++++++----------------- 3 files changed, 43 insertions(+), 35 deletions(-) diff --git a/doc/api-example.md b/doc/api-example.md index abfec30555..03b7b4d7cb 100644 --- a/doc/api-example.md +++ b/doc/api-example.md @@ -159,7 +159,7 @@ First, load two signatures: ``` -Then, get the hashes, and (e.g.) compute the union: +Then, get the hashes, and (e.g.) calculate the union: ``` >>> hashes1 = set(sig1.minhash.hashes.keys()) @@ -222,7 +222,7 @@ looking at the `num` and `scaled` attributes on a MinHash object: The MinHash class is otherwise identical between the two types of signatures. -Note that you cannot compute Jaccard similarity or containment for +Note that you cannot calculate Jaccard similarity or containment for MinHash objects with different num or scaled values (or different ksizes): ``` @@ -382,15 +382,20 @@ downsample` if you are interested.) ## Working with fast search trees (Sequence Bloom Trees, or SBTs) -Suppose we have a number of signatures calculated with `--scaled`, like so: +Suppose we create some `scaled` signatures: ``` -sourmash compute --scaled 10000 data/GCF*.fna.gz +sourmash sketch dna -p scaled=10000 data/GCF*.fna.gz --outdir data/ ``` -and now we want to create a Sequence Bloom Tree (SBT) so that we can -search them efficiently. You can do this with `sourmash index`, but -you can also access the Python API directly. +and we want to create a Sequence Bloom Tree (SBT) so that we can +search them efficiently. You can do this with `sourmash index`, + +``` +sourmash index foo.sbt.zip data/GCF*.sig -k 31 +``` + +but you can also access the Python API directly. ### Creating a search tree diff --git a/doc/classifying-signatures.md b/doc/classifying-signatures.md index de0301439e..d8d443a719 100644 --- a/doc/classifying-signatures.md +++ b/doc/classifying-signatures.md @@ -103,7 +103,7 @@ compares genome or metagenome signatures, it's reporting Jaccard similarity *without* abundance. However, it is possible to take into account abundance information by -computing signatures with `--track-abundance`. The abundance +computing signatures with `-p abund`. The abundance information will be used if it's present in the signature, and it can be ignored with `--ignore-abundance` in any signature comparison. @@ -120,7 +120,7 @@ containment queries against genome databases. This will give you numbers that (approximately) match what you get from counting mapped reads. -If you compute your input signatures with `--track-abundance`, both +If you create your input signatures with `-p abund`, both `sourmash gather` and `sourmash lca gather` will use that information to calculate an abundance-weighted result. This will weight each match to a hash value by the multiplicity of the hash value in @@ -157,7 +157,7 @@ For more information on the value of this kind of comparison for metagenomics, please see the simka paper, [Multiple comparative metagenomics using multiset k-mer counting](https://peerj.com/articles/cs-94/), Benoit et al., 2016. Initial comparisons of metagenome similarity -approximations computed with sourmash to the output of simka suggest a +approximations calculated with sourmash to the output of simka suggest a significant correlation. **Implementation note:** Angular similarity searches cannot be done on @@ -232,7 +232,7 @@ A few quick notes for the algorithmic folk out there -- increase database size. (Although of course it may get a lot slower...) -## Appendix B: sourmash gather and `--track-abundance` +## Appendix B: sourmash gather and signatures with abundance information Below is a discussion of a synthetic set of test cases using three randomly generated (fake) genomes of the same size, with two even read diff --git a/doc/command-line.md b/doc/command-line.md index 1e0a8dcc70..fc091ed31c 100644 --- a/doc/command-line.md +++ b/doc/command-line.md @@ -4,11 +4,12 @@ :depth: 3 ``` -From the command line, sourmash can be used to compute -[MinHash sketches][0] from DNA sequences, compare them to each other, -and plot the results; these sketches are saved into "signature files". -These signatures allow you to estimate sequence similarity quickly and -accurately in large collections, among other capabilities. +From the command line, sourmash can be used to create +[MinHash sketches][0] from DNA and protein sequences, compare them to +each other, and plot the results; these sketches are saved into +"signature files". These signatures allow you to estimate sequence +similarity quickly and accurately in large collections, among other +capabilities. Please see the [mash software][1] and the [mash paper (Ondov et al., 2016)][2] for background information on @@ -25,11 +26,11 @@ Grab three bacterial genomes from NCBI: ``` curl -L -O ftp://ftp.ncbi.nlm.nih.gov/genomes/refseq/bacteria/Escherichia_coli/reference/GCF_000005845.2_ASM584v2/GCF_000005845.2_ASM584v2_genomic.fna.gz curl -L -O ftp://ftp.ncbi.nlm.nih.gov/genomes/refseq/bacteria/Salmonella_enterica/reference/GCF_000006945.2_ASM694v2/GCF_000006945.2_ASM694v2_genomic.fna.gz -curl -L -O ftp://ftp.ncbi.nlm.nih.gov/genomes/refseq/bacteria/Sphingobacteriaceae_bacterium_DW12/latest_assembly_versions/GCF_000783305.1_ASM78330v1/GCF_000783305.1_ASM78330v1_genomic.fna.gz +curl -L -O https://ftp.ncbi.nlm.nih.gov/genomes/all/GCA/000/783/305/GCA_000783305.1_ASM78330v1/GCA_000783305.1_ASM78330v1_genomic.fna.gz ``` Compute signatures for each: ``` - sourmash compute -k 31 *.fna.gz +sourmash sketch dna -p k=31 *.fna.gz ``` This will produce three `.sig` files containing MinHash signatures at k=31. @@ -60,11 +61,11 @@ Matrix: To get a list of subcommands, run `sourmash` without any arguments. -There are five main subcommands: `compute`, `compare`, `plot`, +There are five main subcommands: `sketch`, `compare`, `plot`, `search`, and `gather`. See [the tutorial](tutorials.md) for a walkthrough of these commands. -* `compute` creates signatures. +* `sketch` creates signatures. * `compare` compares signatures and builds a distance matrix. * `plot` plots distance matrices created by `compare`. * `search` finds matches to a query signature in a collection of signatures. @@ -98,6 +99,8 @@ indexed databases (the SBT and LCA formats) as well as from signature files. ### `sourmash compute` - make sourmash signatures from sequence data +@CTB fixme + The `compute` subcommand computes and saves signatures for each sequence in one or more sequence files. It takes as input FASTA or FASTQ files, and these files can be uncompressed or compressed with @@ -129,8 +132,8 @@ Optional arguments: The `compare` subcommand compares one or more signatures -(created with `compute`) using estimated [Jaccard index][3] or -(if signatures are computed with `--track-abundance`) the [angular +(created with `sketch`) using estimated [Jaccard index][3] or +(if signatures are computed with `-p abund`) the [angular similarity](https://en.wikipedia.org/wiki/Cosine_similarity#Angular_distance_and_similarity). The default output @@ -150,7 +153,7 @@ Options: ``` --output -- save the distance matrix to this file (as a numpy binary matrix) --ksize -- do the comparisons at this k-mer size. ---containment -- compute containment instead of similarity. +--containment -- calculate containment instead of similarity. C(i, j) = size(i intersection j) / size(i). --from-file -- append the list of files in this text file to the input signatures @@ -161,7 +164,7 @@ Options: ### `sourmash plot` - cluster and visualize comparisons of many signatures The `plot` subcommand produces two plots -- a dendrogram and a -dendrogram+matrix -- from a distance matrix computed by `sourmash compare +dendrogram+matrix -- from a distance matrix created by `sourmash compare --output `. The default output is two PNG files. Usage: @@ -226,7 +229,7 @@ analysis. (See [Classifying Signatures](classifying-signatures.md) for more information on the different approaches that can be used here.) -If the input signature was computed with `--track-abundance`, output +If the input signature was created with `-p abund`, output will be abundance weighted (unless `--ignore-abundances` is specified). `-o/--output` will create a CSV file containing the matches. @@ -439,7 +442,7 @@ is specifically meant for metagenome and genome bin analysis. (See [Classifying Signatures](classifying-signatures.md) for more information on the different approaches that can be used here.) -If the input signature was computed with `--track-abundance`, output +If the input signature was created with `-p abund`, output will be abundance weighted (unless `--ignore-abundances` is specified). `-o/--output` will create a CSV file containing the matches. @@ -604,8 +607,8 @@ sourmash signature merge file1.sig file2.sig -o merged.sig will output the union of all the hashes in `file1.sig` and `file2.sig` to `merged.sig`. -All of the signatures passed to merge must either have been computed -with `--track-abundance`, or not. If they have `track_abundance` on, +All of the signatures passed to merge must either have been created +with `-p abund`, or not. If they have `track_abundance` on, then the merged signature will have the sum of all abundances across the individual signatures. The `--flatten` flag will override this behavior and allow merging of mixtures by removing all abundances. @@ -661,10 +664,10 @@ Downsample one or more signatures. With `downsample`, you can -- -* increase the `--scaled` value for a signature computed with `--scaled`, shrinking it in size; +* increase the `--scaled` value for a signature created with `-p scaled=SCALED`, shrinking it in size; * decrease the `num` value for a traditional num MinHash, shrinking it in size; -* try to convert a `--scaled` signature to a `num` signature; -* try to convert a `num` signature to a `--scaled` signature. +* try to convert a `scaled` signature to a `num` signature; +* try to convert a `num` signature to a `scaled` signature. For example, ``` @@ -758,7 +761,7 @@ sourmash signature export filename.sig -o filename.sig.msh.json ### `sourmash signature overlap` - detailed comparison of two signatures' overlap -Display a detailed comparison of two signatures. This computes the +Display a detailed comparison of two signatures. This calculates the Jaccard similarity (as in `sourmash compare` or `sourmash search`) and the Jaccard containment in both directions (as with `--containment`). It also displays the number of hash values in the union and @@ -819,7 +822,7 @@ signatures. The simplest is one signature in a single JSON file. You can also put many signatures in a single JSON file, either by building them that -way with `sourmash compute` or by using `sourmash sig cat` or other +way with `sourmash sketch` or by using `sourmash sig cat` or other commands. Searching or comparing these files involves loading them sequentially and iterating across all of the signatures - which can be slow, especially for many (100s or 1000s) of signatures. @@ -876,10 +879,10 @@ been useful. :) ### Using stdin Most commands will take stdin via the usual UNIX convention, `-`. -Moreover, `sourmash compute` and the `sourmash sig` commands will +Moreover, `sourmash sketch` and the `sourmash sig` commands will output to stdout. So, for example, -`sourmash compute ... -o - | sourmash sig describe -` will describe the +`sourmash sketch ... -o - | sourmash sig describe -` will describe the signatures that were just computed. (This is a relatively new feature as of 3.4 and our testing may need From b9c8bbaa27d395ab636146505ed8271c61e53a9f Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Mon, 18 Jan 2021 10:57:58 -0800 Subject: [PATCH 02/24] add migration links --- README.md | 16 +++++++++++----- doc/index.md | 4 ++++ doc/support.md | 3 +++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9520189dc7..b43d7f4118 100644 --- a/README.md +++ b/README.md @@ -14,12 +14,18 @@ Quickly search, compare, and analyze genomic and metagenomic data sets. Usage: - sourmash compute *.fq.gz - sourmash compare *.sig -o distances + sourmash sketch dna *.fq.gz + sourmash compare *.sig -o distances -k 31 sourmash plot distances sourmash 1.0 is [published on JOSS](https://doi.org/10.21105/joss.00027); please cite that paper if you use sourmash (`doi: 10.21105/joss.00027`):. +The latest major release is sourmash v4, which has several +command-line and Python incompatibilities with previous +versions. Please +[visit our migration guide](https://sourmash.readthedocs.io/en/latest/support.html#migrating-from-sourmash-v3-x-to-sourmash-4-x) +to ugprade! + ---- The name is a riff off of [Mash](https://github.com/marbl/Mash), @@ -42,7 +48,7 @@ We recommend using bioconda to install sourmash: ``` conda install -c conda-forge -c bioconda sourmash ``` -This will install the latest stable version of sourmash 3. +This will install the latest stable version of sourmash 4. You can also use pip to install sourmash: @@ -70,7 +76,7 @@ you can install sourmash by running: ```bash $ conda create -n sourmash_env -c conda-forge -c bioconda sourmash python=3.7 $ source activate sourmash_env -$ sourmash compute -h +$ sourmash --help ``` which will install @@ -107,4 +113,4 @@ on getting set up with a development environment. ---- CTB -July 2020 +Jan 2021 diff --git a/doc/index.md b/doc/index.md index 9ccc05ea7f..42d8166d7c 100644 --- a/doc/index.md +++ b/doc/index.md @@ -25,6 +25,10 @@ background information on how and why MinHash works. **Questions? Thoughts?** Ask us on the [sourmash issue tracker](https://github.com/dib-lab/sourmash/issues/)! +**Want to migrate to sourmash v4?** sourmash v4 is now available, and +has a number of incompatibilites with v2 and v3. Please see +[our migration guide](support.md#migrating-from-sourmash-v3-x-to-sourmash-4-x)! + ---- To use sourmash, you must be comfortable with the UNIX command line; diff --git a/doc/support.md b/doc/support.md index 6b57ec926d..ce77d9090c 100644 --- a/doc/support.md +++ b/doc/support.md @@ -102,3 +102,6 @@ we suggest you use the following procedure to migrate: * now, run python with the argument `-W error` to turn warnings into errors. * fix all errors! * finally, upgrade to sourmash v4.0. + +@CTB add stuff here + From d33c66ae0d374954e22eb1bff14e01950a99e9a0 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Sat, 30 Jan 2021 09:00:27 -0800 Subject: [PATCH 03/24] switch compute over to sketch in most of the markdown docs --- doc/command-line.md | 7 +++++-- doc/developer.md | 1 + doc/more-info.md | 8 +++++--- doc/using-sourmash-a-guide.md | 26 +++++++++++++------------- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/doc/command-line.md b/doc/command-line.md index fc091ed31c..aa91e0657b 100644 --- a/doc/command-line.md +++ b/doc/command-line.md @@ -101,6 +101,9 @@ indexed databases (the SBT and LCA formats) as well as from signature files. @CTB fixme +Note: `sourmash compute` is deprecated in sourmash 4.0 and will be removed in +sourmash 5.0; please switch to using `sourmash sketch` (link). + The `compute` subcommand computes and saves signatures for each sequence in one or more sequence files. It takes as input FASTA or FASTQ files, and these files can be uncompressed or compressed with @@ -133,7 +136,7 @@ Optional arguments: The `compare` subcommand compares one or more signatures (created with `sketch`) using estimated [Jaccard index][3] or -(if signatures are computed with `-p abund`) the [angular +(if signatures are created with `-p abund`) the [angular similarity](https://en.wikipedia.org/wiki/Cosine_similarity#Angular_distance_and_similarity). The default output @@ -883,7 +886,7 @@ Moreover, `sourmash sketch` and the `sourmash sig` commands will output to stdout. So, for example, `sourmash sketch ... -o - | sourmash sig describe -` will describe the -signatures that were just computed. +signatures that were just created. (This is a relatively new feature as of 3.4 and our testing may need some work, so please diff --git a/doc/developer.md b/doc/developer.md index ef390f62cd..56b2d0a13a 100644 --- a/doc/developer.md +++ b/doc/developer.md @@ -116,6 +116,7 @@ A short description of the high-level files and dirs in the sourmash repo: src/sourmash ├── cli/ | Command-line parsing, help messages and overall infrastucture ├── command_compute.py | compute command implementation +├── command_compute.py | sketch command implementation ├── commands.py | implementation for other CLI commands ├── compare.py | Signature comparison functions ├── _compat.py | Py2/3 compatibility functions diff --git a/doc/more-info.md b/doc/more-info.md index cbe51395dd..b98150d694 100644 --- a/doc/more-info.md +++ b/doc/more-info.md @@ -2,7 +2,7 @@ ## Computational requirements -Read more about the [compute requirements, here.](requirements.md) +Read more about the [computational requirements, here.](requirements.md) ## Prepared search database @@ -91,8 +91,10 @@ for samples. ## Interoperability with mash -The default sketches computed by sourmash and mash are comparable, but -we are still [working on ways to convert the file formats][11] +The hashing functions used by sourmash and mash are the same, but we +are still [working on ways to convert the file formats][11]. Please +keep an eye on `sourmash signature import` and `sourmash signature +export`! ## Developing sourmash diff --git a/doc/using-sourmash-a-guide.md b/doc/using-sourmash-a-guide.md index af665742ad..7e18907bc2 100644 --- a/doc/using-sourmash-a-guide.md +++ b/doc/using-sourmash-a-guide.md @@ -24,7 +24,7 @@ k=51. The general rule is that longer k-mer sizes are less prone to false positives. But you can pick your own parameters. One additional wrinkle is that we provide a number of -[precomputed databases](databases.md) at k=21, k=31, and k=51. +[precalculated databases](databases.md) at k=21, k=31, and k=51. It is often convenient to calculate signatures at these sizes so that you can use these databases. @@ -37,7 +37,7 @@ however, and it probably doesn't really matter. (When we have blog posts or publications providing more formal guidance, we'll link to them here!) -## What resolution should my signatures be / how should I compute them? +## What resolution should my signatures be / how should I create them? sourmash supports two ways of choosing the resolution or size of your signatures: using `-n` to specify the maximum number of hashes, @@ -74,9 +74,9 @@ rate of PacBio and Nanopore sequencing is problematic for k-mer based approaches and we have not yet explored how to tune parameters for this kind of sequencing. -On a more practical note, `sourmash compute` should autodetect FASTA, -FASTQ, whether they are uncompressed, gzipped, or bzip2-ed. Nothing -special needs to be done. +On a more practical note, `sourmash sketch` will autodetect FASTA and +FASTQ formats, whether they are uncompressed, gzipped, or bzip2-ed. +Nothing special needs to be done. ## How should I prepare my data? @@ -110,11 +110,11 @@ are always real low-abundance k-mers present. Sorry, yes! See below. -### Computing signatures for read files: +### Calculating signatures for read files: ``` trim-low-abund -C 3 -Z 18 -V -M 2e9 input-reads-1.fq input-reads-2.fq ... -sourmash compute --scaled 1000 -k 21,31,51 input-reads*.fq.abundtrim \ +sourmash sketch dna -p scaled=1000,k=21,k=31,k=51 input-reads*.fq.abundtrim \ --merge SOMENAME -o SOMENAME-reads.sig ``` @@ -123,24 +123,24 @@ reads; the second takes all the trimmed read files, subsamples k-mers from them at 1000:1, and outputs a single merged signature named 'SOMENAME' into the file `SOMENAME-reads.sig`. -### Computing signatures for individual genome files: +### Creating signatures for individual genome files: ``` -sourmash compute --scaled 1000 -k 21,31,51 *.fna.gz --name-from-first +sourmash sketch dna -p scaled=1000,k=21,k=31,k=51 *.fna.gz --name-from-first ``` -This command computes signatures for all `*.fna.gz` files, and names +This command creates signatures for all `*.fna.gz` files, and names each signature based on the first FASTA header in each file (that's what the option `--name-from-first` does). The signatures will be placed in `*.fna.gz.sig`. -### Computing signatures from a collection of genomes in a single file: +### Creating signatures from a collection of genomes in a single file: ``` -sourmash compute --scaled 1000 -k 21,31,51 file.fa --singleton +sourmash sketch dna -p scaled=1000,k=21,k=31,k=51 file.fa --singleton ``` -This computes signatures for all individual FASTA sequences in `file.fa`, +This creates signatures for all individual FASTA sequences in `file.fa`, names them based on their FASTA headers, and places them all in a single `.sig` file, `file.fa.sig`. (This behavior is triggered by the option `--singleton`, which tells sourmash to treat each individual sequence in From 312a8e2c8936eb5fb03c76c0094921c1dc3bcf45 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Sat, 30 Jan 2021 09:04:50 -0800 Subject: [PATCH 04/24] fix --scaled and --track-abundance thruought --- doc/command-line.md | 4 ++-- doc/using-sourmash-a-guide.md | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/doc/command-line.md b/doc/command-line.md index aa91e0657b..e678eec0fd 100644 --- a/doc/command-line.md +++ b/doc/command-line.md @@ -643,7 +643,7 @@ will subtract all of the hashes in `file2.sig` and `file3.sig` from `file1.sig`, and save the new signature to `subtracted.sig`. To use `subtract` on signatures calculated with -`--track-abundance`, you must specify `--flatten`. +`-p abund`, you must specify `--flatten`. ### `sourmash signature intersect` - intersect two (or more) signatures @@ -667,7 +667,7 @@ Downsample one or more signatures. With `downsample`, you can -- -* increase the `--scaled` value for a signature created with `-p scaled=SCALED`, shrinking it in size; +* increase the `scaled` value for a signature created with `-p scaled=SCALED`, shrinking it in size; * decrease the `num` value for a traditional num MinHash, shrinking it in size; * try to convert a `scaled` signature to a `num` signature; * try to convert a `num` signature to a `scaled` signature. diff --git a/doc/using-sourmash-a-guide.md b/doc/using-sourmash-a-guide.md index 7e18907bc2..99585a5a37 100644 --- a/doc/using-sourmash-a-guide.md +++ b/doc/using-sourmash-a-guide.md @@ -40,27 +40,27 @@ guidance, we'll link to them here!) ## What resolution should my signatures be / how should I create them? sourmash supports two ways of choosing the resolution or size of -your signatures: using `-n` to specify the maximum number of hashes, -or `--scaled` to specify the compression ratio. Which should you use? +your signatures: using `num` to specify the maximum number of hashes, +or `scaled` to specify the compression ratio. Which should you use? -We suggest calculating all your signatures using `--scaled -1000`. This will give you a compression ratio of 1000-to-1 while -making it possible to detect regions of similarity in the 10kb range. +We suggest calculating all your signatures using `-p scaled=1000`. +This will give you a compression ratio of 1000-to-1 while making it +possible to detect regions of similarity in the 10kb range. For comparison with more traditional MinHash approaches like `mash`, -if you have a 5 Mbp genome and use `--scaled 1000`, you will extract +if you have a 5 Mbp genome and use `-p scaled=1000`, you will extract approximately 5000 hashes. So a scaled of 1000 is equivalent to using -`-n 5000` with mash on a 5 Mbp genome. +`-p num=5000` with mash on a 5 Mbp genome. -The difference between using `-n` and `--scaled` is in metagenome -analysis: fixing the number of hashes with `-n` limits your ability to +The difference between using `num` and `scaled` is in metagenome +analysis: fixing the number of hashes with `num` limits your ability to detect rare organisms, or alternatively results in very large -signatures (e.g. if you use n larger than 10000). `--scaled` will scale +signatures (e.g. if you use n larger than 10000). `scaled` will scale your resolution with the diversity of the metagenome. You can read more about this in this blog post from the mash folk, [Mash Screen: What's in my sequencing run?](https://genomeinformatics.github.io/mash-screen/) What -we do with sourmash and `--scaled` is similar to the 'modulo hash' +we do with sourmash and `scaled` is similar to the 'modulo hash' mentioned in that blog post. (Again, when we have formal guidance on this based on benchmarks, we'll From 45d80555c0df0837854a5e94fd635816fe2547e1 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Sat, 30 Jan 2021 09:28:37 -0800 Subject: [PATCH 05/24] formatting and wording fixes --- doc/command-line.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/doc/command-line.md b/doc/command-line.md index e678eec0fd..1586766572 100644 --- a/doc/command-line.md +++ b/doc/command-line.md @@ -69,7 +69,7 @@ walkthrough of these commands. * `compare` compares signatures and builds a distance matrix. * `plot` plots distance matrices created by `compare`. * `search` finds matches to a query signature in a collection of signatures. -* `gather` finds non-overlapping matches to a metagenome in a collection of signatures. +* `gather` finds the best reference genomes for a metagenome, using the provided collection of signatures There are also a number of commands that work with taxonomic information; these are grouped under the `sourmash lca` @@ -94,7 +94,7 @@ Finally, there are a number of utility and information commands: Please use the command line option `--help` to get more detailed usage information for each command. -Note that as of sourmash v3.4, most commands will load signatures from +Note that as of sourmash v3.4, all commands should load signatures from indexed databases (the SBT and LCA formats) as well as from signature files. ### `sourmash compute` - make sourmash signatures from sequence data @@ -226,11 +226,12 @@ similarity match ### `sourmash gather` - find metagenome members -The `gather` subcommand finds all non-overlapping matches to the -query. This is specifically meant for metagenome and genome bin -analysis. (See [Classifying Signatures](classifying-signatures.md) -for more information on the different approaches that can be used -here.) +The `gather` subcommand selects the best reference genomes to use for +a metagenome analysis, by finding the smallest set of non-overlapping +matches to the query in a database. This is specifically meant for +metagenome and genome bin analysis. (See +[Classifying Signatures](classifying-signatures.md) for more +information on the different approaches that can be used here.) If the input signature was created with `-p abund`, output will be abundance weighted (unless `--ignore-abundances` is @@ -818,7 +819,7 @@ signatures with multiple ksizes or moltypes at the same time; you need to pick the ksize and moltype to use for your search. Where possible, scaled values will be made compatible. -#### Storing (and searching) signatures +### Storing (and searching) signatures Backing up a little, there are many ways to store and search signatures. @@ -848,7 +849,7 @@ will complain. In contrast, signature files can contain many different types of signatures, and compatible ones will be discovered automatically. -#### Passing in lists of files +### Passing in lists of files Various sourmash commands will also take `--from-file` or `--query-from-file`, which will take a path to a text file containing @@ -856,7 +857,7 @@ a list of file paths. This can be useful for situations where you want to specify thousands of queries, or a subset of signatures produced by some other command. -#### Loading all signatures under a directory +### Loading all signatures under a directory All of the `sourmash` commands support loading signatures from directories provided on the command line. @@ -866,7 +867,7 @@ directories provided on the command line. All of the commands in sourmash operate in "online" mode, so you can combine multiple databases and signatures on the command line and get the same answer as if you built a single large database from all of -them. The only addendum to this rule is that if you have multiple +them. The only caveat to this rule is that if you have multiple identical matches, the first one to be found will differ depending on the order that the files are passed in on the command line. From 58c57afd4be554c672c3af9ae67809671255b8d1 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Sat, 30 Jan 2021 09:41:57 -0800 Subject: [PATCH 06/24] add sourmash sketch docs --- doc/command-line.md | 26 ++++++-- doc/sourmash-sketch.md | 147 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 169 insertions(+), 4 deletions(-) create mode 100644 doc/sourmash-sketch.md diff --git a/doc/command-line.md b/doc/command-line.md index 1586766572..ca00fdc375 100644 --- a/doc/command-line.md +++ b/doc/command-line.md @@ -97,12 +97,30 @@ information for each command. Note that as of sourmash v3.4, all commands should load signatures from indexed databases (the SBT and LCA formats) as well as from signature files. -### `sourmash compute` - make sourmash signatures from sequence data +### `sourmash sketch` - make sourmash signatures from sequence data + +Most of the commands in sourmash work with **signatures**, which contain information about genomic or proteomic sequences. Each signature contains one or more **sketches**, which are compressed versions of these sequences. Using sourmash, you can search, compare, and analyze these sequences in various ways. + +To create a signature with one or more sketches, you use the `sourmash sketch` command. There are three main commands: + +``` +sourmash sketch dna +sourmash sketch protein +sourmash sketch translate +``` -@CTB fixme +The `sketch dna` command reads in **DNA sequences** and outputs **DNA sketches**. + +The `sketch protein` command reads in **protein sequences** and outputs **protein sketches**. + +The `sketch translate` command reads in **DNA sequences**, translates them in all six frames, and outputs **protein sketches**. + +Please see [the `sourmash sketch` documentation page](sourmash-sketch.md) for details! + +### `sourmash compute` - make sourmash signatures from sequence data -Note: `sourmash compute` is deprecated in sourmash 4.0 and will be removed in -sourmash 5.0; please switch to using `sourmash sketch` (link). +**Note: `sourmash compute` is deprecated in sourmash 4.0 and will be removed in +sourmash 5.0; please switch to using `sourmash sketch`, above.** The `compute` subcommand computes and saves signatures for each sequence in one or more sequence files. It takes as input FASTA diff --git a/doc/sourmash-sketch.md b/doc/sourmash-sketch.md new file mode 100644 index 0000000000..1d31a2e6b9 --- /dev/null +++ b/doc/sourmash-sketch.md @@ -0,0 +1,147 @@ +# `sourmash sketch` documentation + +Most of the commands in sourmash work with **signatures**, which contain information about genomic or proteomic sequences. Each signature contains one or more **sketches**, which are compressed versions of these sequences. Using sourmash, you can search, compare, and analyze these sequences in various ways. + +To create a signature with one or more sketches, you use the `sourmash sketch` command. There are three main commands: + +``` +sourmash sketch dna +sourmash sketch protein +sourmash sketch translate +``` + +The `sketch dna` command reads in **DNA sequences** and outputs **DNA sketches**. + +The `sketch protein` command reads in **protein sequences** and outputs **protein sketches**. + +The `sketch translate` command reads in **DNA sequences**, translates them in all six frames, and outputs **protein sketches**. + +## Quickstart + +### DNA sketches for genomes and reads + +To compute a DNA sketch for a genome, run: +``` +sourmash sketch dna genome.fna +``` +This will create an output file `genome.fna.sig` in the current directory, containing a single DNA signature for the entire genome, calculated using the default parameters. + + +Sourmash can work with unassembled reads; run +``` +sourmash sketch dna -p k=21,k=31,k=51,abund metagenome.fq.gz +``` +to compute three abundance-weighted sketches at k=21, 31, and 51, for the given FASTQ file. + +### Protein sketches for genomes and proteomes + +Likewise, +``` +sourmash sketch translate genome.fna +``` +will output a protein sketch in `./genome.fna.sig`, calculated by translating the genome sequence in all six frames and then using the default protein sketch parameters. + +And +``` +sourmash sketch protein -p k=25,scaled=500 -p k=27,scaled=250 genome.faa +``` +outputs two protein sketches to `./genome.faa.sig`, one calculated with k=25 and scaled=500, the other calculated with k=27 and scaled=250. + +If you want to use different encodings, you can specify them in a few ways; here is a parameter string that specifies a dayhoff encoding for the k-mers: +``` +sourmash sketch protein -p k=25,scaled=500,dayhoff genome.faa +``` + +## More detailed documentation + +### Input formats + +`sourmash sketch` auto-detects and reads FASTQ or FASTA files, either uncompressed or compressed with gzip or bzip2. The filename doesn't matter; `sourmash sketch` will figure out the format from the file contents. + +You can also stream any of these formats into `sourmash sketch` via stdin by using `-` as the input filename. + +### Input contents and output signatures + +By default, `sourmash sketch` will produce signatures for each input *file*. If the file contains multiple FASTA/FASTQ records, these records will be merged into the output signature. + +If you specify `--singleton`, `sourmash sketch` will produce signatures for each *record*. + +If you specify `--merge `, sourmash sketch will produce signatures for all input files combined into one. + +The output signature(s) will be saved in locations that depend on your input parameters. By default, `sourmash sketch` will put the signatures in the current directory, in a file named for the input file with a `.sig` suffix. If you specify `-o`, all of the signatures will be placed in that file. + +### Protein encodings + +`sourmash sketch protein` and `sourmash sketch translate` output protein sketches by default, but can also use the `dayhoff` and `hp` encodings. The [Dayhoff encoding](https://bmcbioinformatics.biomedcentral.com/articles/10.1186/1471-2105-9-367/tables/1) collapses multiple amino acids into a smaller alphabet so that amino acids that share biochemical properties map to the same character. The hp encoding divides amino acids into hydrophobic and polar (hydrophilic) amino acids, collapsing amino acids with hydrophobic side chains together and doing the same for polar amino acids. + +We are still in the process of benchmarking these encodings; ask [on the issue tracker](https://github.com/dib-lab/sourmash/issues) if you are interested in updates. + +### Parameter strings + +The `-p` argument to `sourmash sketch` provides parameter strings to sourmash, and these control what signatures and sketches are calculated and output. Zero or more parameter strings can be given to sourmash. Each parameter string produces at least one sketch. + +A parameter string is a space-delimited collection that can contain one or more fields, comma-separated. +* `k=` - compute a sketch at this k-mer size; can provide more than one time in a parameter string. Typically `ksize` is between 4 and 100. +* `scaled=` - create a scaled MinHash with k-mers sampled deterministically at 1 per `` value. This controls sketch compression rates and resolution; for example, a 5 Mbp genome sketched with a scaled of 1000 would yield approximately 5,000 k-mers. `scaled` is incompatible with `num`. See [our guide to signature resolution](using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-how-should-i-compute-them) for more information. +* `num=` - create a standard MinHash with no more than `` k-mers kept. This will produce sketches identical to [mash sketches](https://mash.readthedocs.io/en/latest/). `num` is incompatible with `scaled`. See [our guide to signature resolution](using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-how-should-i-compute-them) for more information. +* `abund` / `noabund` - create abundance-weighted (or not) sketches. See [Classify signatures: Abundance Weighting](classifying-signatures.md#abundance-weighting) for details of how this works. +* `dna`, `protein`, `dayhoff`, `hp` - create this kind of sketch. Note that `sourmash sketch dna -p protein` and `sourmash sketch protein -p dna` are invalid; please use `sourmash sketch translate` for the former. + +For all field names but `k`, if multiple fields in a parameter string are provided, the last one encountered overrides the previous values. For `k`, if multiple ksizes are specified a single parameter string, sketches for all ksizes specified are computed. + +If a field isn't specified, then the default value for that sketch type is used; so, for example, `sourmash sketch dna -p abund` would calculate a sketch with `k=31,scaled=1000,abund`. See below for the defaults. + +### Default parameters + +The default parameters for sketches are as follows: + +* dna: `k=31,scaled=1000,noabund` +* protein: `k=10,scaled=200,noabund` +* dayhoff: `k=16,scaled=200,noabund` +* hp=`k=42,scaled=200,noabund` + +These were chosen by a committee of PhDs as being good defaults for an initial analysis, so, beware :). + +More seriously, the DNA parameters were chosen based on the analyses done by Koslicki and Falush in [MetaPalette: a k-mer Painting Approach for Metagenomic Taxonomic Profiling and Quantification of Novel Strain Variation](https://msystems.asm.org/content/1/3/e00020-16). + +The protein, dayhoff, and hp parameters were selected based on unpublished research results and/or magic formulas. We are working on publishing the results! Please ask on the [issue tracker](https://github.com/dib-lab/sourmash/issues) if you are curious. + +### More complex parameter string examples + +Below are some more complicated `sourmash sketch` command lines: + +* `sourmash sketch dna -p k=51` - default to a scaled=1000 and noabund for a k-mer size of 51 (based on moltype/command) +* `sourmash sketch dna -p k=31,k=51,k=21` - compute multiple ksizes, using the defaults otherwise +* `sourmash sketch translate -p k=20,num=500,protein -p k=19,num=400,dayhoff,abund -p k=30,scaled=200,hp` - compute multiple ksizes, moltypes, and scaled/num. + +### Locations for output files + +Signature files can contain multiple signatures and sketches. Use `sourmash sig describe` to get details on the contents of a file. + +You can use `-o ` to specify a file output location for all the output signatures; `-o -` means stdout. This does not merge signatures unless `--merge` is provided. + +Specify `--outdir` to put all the signatures in a specific directory. + +### Downsampling and flattening signatures + +Calculating signatures is probably the most time consuming part of using sourmash, and it is the only part that requires access to the raw data. Moreover, the output signatures are generally much smaller than the input data. So, we generally suggest calculating a large set of signatures once. + +To support this, sourmash can do two kinds of signature conversion without going back to the raw data. + +First, you can downsample `num` and `scaled` signatures using `sourmash sig downsample`. For any sketch calculated with `num` parameter, you can decrease that `num`. And, for any `scaled` parameter, you can increase the `scaled`. This will decrease the size of the sketch accordingly; for example, going from a num of 5000 to a num of 1000 will decrease the sketch size by a factor of 5, and going from a scaled of 1000 to a scaled of 10000 will decrease the sketch size by a factor of 10. + +(Note that decreasing num or increasing scaled will increase calculation speed and lower the accuracy of your results.) + +Second, you can flatten abundances using `sourmash sig flatten`. For any sketch calculated with `abund`, you can convert it to a `noabund` sketch. This will decrease the sketch size, although not necessarily by a lot. + +Unfortunately, changing the k-mer size or using different DNA/protein encodings cannot be done on a sketch, and you need to calculate new signatures from the raw data for that. + +### Examining the output of `sourmash sketch` + +You can use `sourmash sig describe` to get detailed information about the contents of a signature file. This can help if you want to see exactly what a particular `sourmash sketch` command does! + +### Filing issues and asking for help + +We try to provide good documentation and error messages, but may not succeed in answer all your questions! So we're happy to help out! + +Please post questions [on the sourmash issue tracker](https://github.com/dib-lab/sourmash/issues). If you find something confusing or buggy about the documentation or about sourmash, we'd love to fix it -- for you *and* for everyone else! From 32ebec721a097b1132933ec8f1f25c6a5630b751 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Sun, 7 Feb 2021 18:41:40 -0800 Subject: [PATCH 07/24] substantial update for API examples --- doc/api-example.md | 184 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 155 insertions(+), 29 deletions(-) diff --git a/doc/api-example.md b/doc/api-example.md index 03b7b4d7cb..e5af76a6ee 100644 --- a/doc/api-example.md +++ b/doc/api-example.md @@ -1,7 +1,10 @@ -# `sourmash` API examples +# `sourmash` Python API examples -## A first example: two k-mers +All of sourmash's functionality is available via its [Python API](api.md). Below are both basic and advanced examples that use the API to accomplish common tasks. + +[toc] +## A first example: two k-mers Define two sequences: @@ -42,7 +45,7 @@ and of course the MinHashes match themselves: ``` -We can add sequences and query at any time -- +We can add sequences to the MinHash objects and query at any time -- ``` >>> mh1.add_sequence(seq2) @@ -52,8 +55,63 @@ We can add sequences and query at any time -- ``` -## Consuming files +## Set operations on hashes + +All of the hashes are available via the `hashes` property: + +``` +>>> list(mh1.hashes) +[1274996984489324440, 2529443451610975987, 3115010115530738562, 5059920851104263793, 5740495330885152257, 8652222673649005300, 18398176440806921933] + +``` + +and you can easily do your own set operations with `.hashes` - e.g. +the following calculates the Jaccard similarity (intersection over union) of two +``` +>>> s1 = set(mh1.hashes) +>>> s2 = set(mh2.hashes) +>>> round(len(s1 & s2) / len(s1 | s2), 3) +0.571 + +``` +However, the MinHash class also supports a number of basic operations - the following operations work directly on the hashes: +``` +>>> combined = mh1 + mh2 +>>> combined += mh1 +>>> combined.remove_many(mh1.hashes) +>>> combined.add_many(mh2.hashes) + +``` + +You can create an empty copy of a MinHash object with `copy_and_clear`: +``` +>>> new_mh = mh1.copy_and_clear() + +``` +and you can also access the various parameters of a MinHash object directly as properties -- +``` +>>> mh1.ksize +3 +>>> mh1.scaled +0 +>>> mh1.num +20 +>>> mh1.is_dna +True +>>> mh1.is_protein +False +>>> mh1.dayhoff +False +>>> mh1.hp +False +>>> mh1.moltype +'DNA' + +``` +see the "Advanced" section, below, for a more complete discussion of MinHash objects. + +## Creating MinHash sketches programmatically, from genome files Suppose we want to create MinHash sketches from genomes -- @@ -73,7 +131,7 @@ into `add_sequence` directly; here we set `force=True` in `add_sequence` to skip over k-mers containing characters other than ACTG, rather than raising an exception. -(Note, just for speed reasons, we'll truncate the sequences to 50kb in length.) +(Note, just for speed reasons, we're truncating the sequences to 50kb in length.) ``` >>> import screed @@ -86,7 +144,7 @@ raising an exception. ``` -And now the minhashes can be compared against each other: +And now the result MinHash objects can be compared against each other: ``` >>> import sys @@ -103,7 +161,7 @@ data/GCF_000783305.1 0.0 0.0 1.0 ``` Note that the comparisons are quite quick; most of the time is spent in -making the minhashes, which can be saved and loaded easily. +building the minhashes. ## Plotting dendrograms and matrices @@ -114,7 +172,7 @@ please see the notebook ## Saving and loading signature files Signature files encapsulate MinHashes in JSON, and provide a way to -add some metadata to MinHashes. +wrap MinHash objects with some metadata (the name and filename). To save signatures, use `save_signatures` with a list of signatures and a Python file pointer: ``` >>> from sourmash import SourmashSignature, save_signatures @@ -127,7 +185,7 @@ add some metadata to MinHashes. ``` Here, `genome1.sig` is a JSON file that can now be loaded and -compared -- first, load: +compared -- first, load it using `load_one_signature`: ``` >>> from sourmash import load_one_signature @@ -145,9 +203,24 @@ then compare: ``` -## Manipulating signatures and their hashes. +There are two primary signature loading functions - `load_one_signature`, used above, which loads exactly one signature or else raises an exception; and the powerful and more generic `load_file_as_signatures`, which takes in a filename or directory containing a collection of signatures and returns the individual signatures -- for example, you can load all of the signatures under the `tempdir` created above like so, -It is relatively straightforward to work directly with hashes. +``` +>>> loaded_sigs = list(sourmash.load_file_as_signatures(tempdir)) + +``` + +Both `load_file_as_signatures` and `load_one_signature` take molecule type and k-mer size selectors, e.g. +``` +>>> loaded_sigs = load_one_signature(tempdir + '/genome1.sig', select_moltype='DNA', ksize=31) + +``` +will load precisely one signature containing a DNA MinHash created at k-mer size of 31. + +## Going from signatures back to MinHash objects and their hashes - + +Once you load a signature, you can go back to its MinHash object with +`.minhash`; e.g. First, load two signatures: @@ -165,12 +238,12 @@ Then, get the hashes, and (e.g.) calculate the union: >>> hashes1 = set(sig1.minhash.hashes.keys()) >>> hashes2 = set(sig2.minhash.hashes.keys()) >>> hash_union = hashes1.union(hashes2) ->>> print('{} hashes in union of {} and {}'.format(len(hash_union), len(hashes1), len(hashes2))) +>>> print(f'{len(hash_union)} hashes in union of {len(hashes1)} and {len(hashes2)}') 1000 hashes in union of 500 and 500 ``` -## sourmash MinHash objects and manipulations +## Advanced features of sourmash MinHash objects - `scaled` and `num` sourmash supports two basic kinds of signatures, MinHash and modulo hash signatures. MinHash signatures are equivalent to mash signatures; @@ -186,9 +259,7 @@ be collected for a given input data set. Because of this parameter, below we'll call them 'num' signatures. Modulo hash (or 'scaled') signatures are specific to sourmash and they -enable an expanded range of metagenome analyses, with the downside -that they can become arbitrarily large. The key parameter for modulo -hash signatures is `scaled`, which specifies the average sampling rate +enable containment operations that are useful for metagenome analyses. The tradeoff is that unlike num MinHashes, they can become arbitrarily large. The key parameter for modulo hash signatures is `scaled`, which specifies the average sampling rate for hashes for a given input data set. A scaled factor of 1000 means that, on average, 1 in 1000 k-mers will be turned into a hash for later comparisons; this is a sort of compression factor, in that a 5 Mbp @@ -222,7 +293,7 @@ looking at the `num` and `scaled` attributes on a MinHash object: The MinHash class is otherwise identical between the two types of signatures. -Note that you cannot calculate Jaccard similarity or containment for +You cannot calculate Jaccard similarity or containment for MinHash objects with different num or scaled values (or different ksizes): ``` @@ -234,7 +305,7 @@ TypeError: must have same num: 500 != 1000 ``` -You can make signatures compatible by downsampling; see the next +However, you can make signatures compatible by downsampling; see the next sections. ### A brief introduction to MinHash object methods and attributes @@ -380,24 +451,34 @@ you.* (You can also take a look at the logic in `sourmash signature downsample` if you are interested.) -## Working with fast search trees (Sequence Bloom Trees, or SBTs) +## Working with indexed collections of signatures + +If you want to search large collections of signatures, sourmash provides +two different indexing strategies, together with a generic `Index` class +that supports a common API for searching the collections. -Suppose we create some `scaled` signatures: +The first indexing strategy is a Sequence Bloom Tree, which is +designed to support fast and efficient containment operations on large +collections of signatures. SBTs are an _on disk_ search structure, so +they are a low-memory way to search collections. + +To use SBTs from the command line, we first +need to create some `scaled` signatures: ``` sourmash sketch dna -p scaled=10000 data/GCF*.fna.gz --outdir data/ ``` -and we want to create a Sequence Bloom Tree (SBT) so that we can -search them efficiently. You can do this with `sourmash index`, +and then build a Sequence Bloom Tree (SBT) index with `sourmash +index`, like so: ``` sourmash index foo.sbt.zip data/GCF*.sig -k 31 ``` -but you can also access the Python API directly. +Here, sourmash is storing the entire SBT in a single portable Zip file. -### Creating a search tree +### Creating an on-disk SBT in Python Let's start by using 'glob' to grab some example signatures from the test data in the sourmash repository: @@ -408,11 +489,11 @@ test data in the sourmash repository: ``` -Now, create a tree: +Now, create an SBT: ``` ->>> import sourmash ->>> tree = sourmash.create_sbt_index() +>>> import sourmash.sbtmh +>>> tree = sourmash.sbtmh.create_sbt_index() ``` @@ -428,7 +509,7 @@ Load each signature, and add it to the tree: ``` (note, you'll need to make sure that all of the signatures are compatible with each other! The `sourmash index` command does all of the necessary -checks.) +checks, but the Python API doesn't.) Now, save the tree: @@ -459,7 +540,7 @@ Now, load a DNA sequence: ``` >>> filename = 'data/GCF_000005845.2_ASM584v2_genomic.fna.gz' >>> query_seq = next(iter(screed.open(filename))).sequence ->>> print('got {} DNA characters to query'.format(len(query_seq))) +>>> print(f'got {len(query_seq)} DNA characters to query') got 4641652 DNA characters to query ``` @@ -487,3 +568,48 @@ NC_000913.3 Escherichia coli str. K-12 substr. MG1655, complete genome ``` et voila! + +### In-memory databases: the LCA or "reverse index" database. + +The LCA database lets you work with large collections of signatures in +memory. + +The LCA database was initially designed to support individual hash +queries for taxonomic operations - hence its name, which stands for +"Lowest Common Ancestor." However, it supports all of the standard +`Index` operations, just like the SBT. + +First, let's create an LCA database programmatically. + +``` +>>> from sourmash.lca import LCA_Database +>>> db = LCA_Database(ksize=31, scaled=10000, moltype='DNA') + +``` + +Now, let's load in all of the signatures from the test directory: + +``` +>>> for sig in sourmash.load_file_as_signatures('tests/test-data/doctest-data', ksize=31): +... hashes_inserted = db.insert(sig) +... print(f"Inserted {hashes_inserted} hashes into db.") +Inserted 493 hashes into db. +Inserted 525 hashes into db. +Inserted 490 hashes into db. + +``` + +and now you have an `Index` class that supports all the generic index operations (below). You can save an LCA Database to disk with `db.save(filename)`, and load it with `sourmash.load_file_as_index`, below. + +### The `Index` class API. + +The `Index` class supports a generic API for SBTs, LCAs, and other collections of signatures. + +To load an SBT or an LCA database from a file, use `sourmash.load_file_as_index`: +``` +>>> sbt_db = sourmash.load_file_as_index('tests/test-data/prot/protein.sbt.zip') +>>> lca_db = sourmash.load_file_as_index('tests/test-data/prot/protein.lca.json.gz') + +``` + +`Index` objects provide `search`, `insert`, `load`, `save`, and `__len__`. The signatures can be accessed directly via the `.signatures()` method, which returns an iterable. Last but not least, `Index.select(ksize=..., moltype=...)` will return a view on the Index object that contains only signatures with the desired k-mer size/molecule type. From 9d15cdd00940cb469e3a2e05a970cc955498bdfd Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Sun, 7 Feb 2021 18:49:11 -0800 Subject: [PATCH 08/24] add ToC to api-example --- doc/api-example.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/api-example.md b/doc/api-example.md index e5af76a6ee..7adb351c30 100644 --- a/doc/api-example.md +++ b/doc/api-example.md @@ -2,7 +2,9 @@ All of sourmash's functionality is available via its [Python API](api.md). Below are both basic and advanced examples that use the API to accomplish common tasks. -[toc] +```{contents} + :depth: 2 +``` ## A first example: two k-mers From 97f2cd34ba204168338123a930b01b93696a96b2 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Mon, 8 Feb 2021 09:06:21 -0800 Subject: [PATCH 09/24] fix heading for API section --- doc/api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api.md b/doc/api.md index f14ef10271..738b3e7e20 100644 --- a/doc/api.md +++ b/doc/api.md @@ -31,7 +31,7 @@ its Python API. Please also see [examples of using the API](api-example.md). :undoc-members: ``` -# `sourmash.fig`: make plots and figures +## `sourmash.fig`: make plots and figures ```{eval-rst} .. automodule:: sourmash.fig From 92412c2ec2210e056118ed9cbe640caabf63deac Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Mon, 8 Feb 2021 09:53:59 -0800 Subject: [PATCH 10/24] bold API examples link --- doc/api.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/api.md b/doc/api.md index 738b3e7e20..8c91a3533f 100644 --- a/doc/api.md +++ b/doc/api.md @@ -1,7 +1,9 @@ # `sourmash` Python API The primary programmatic way of interacting with `sourmash` is via -its Python API. Please also see [examples of using the API](api-example.md). +its Python API. + +**Please also see [examples of using the API](api-example.md).** ```{contents} :depth: 2 From 391674132e580c5d49f7b1d798395ea161108654 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Mon, 8 Feb 2021 09:54:39 -0800 Subject: [PATCH 11/24] (untested) update of tutorials to use sourmash sketch --- doc/tutorial-basic.md | 12 ++++++------ doc/tutorials-lca.md | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/tutorial-basic.md b/doc/tutorial-basic.md index 02d6d44589..dd80aadae1 100644 --- a/doc/tutorial-basic.md +++ b/doc/tutorial-basic.md @@ -66,7 +66,7 @@ Compute a scaled signature from our reads: mkdir ~/sourmash cd ~/sourmash -sourmash compute --scaled 10000 ~/data/ecoli_ref*.fastq.gz -o ecoli-reads.sig -k 31 +sourmash sketch dna -p scaled=10000,k=31 ~/data/ecoli_ref*.fastq.gz -o ecoli-reads.sig ``` ## Compare reads to assemblies @@ -76,14 +76,14 @@ Use case: how much of the read content is contained in the reference genome? Build a signature for an E. coli genome: ``` -sourmash compute --scaled 1000 -k 31 ~/data/ecoliMG1655.fa.gz -o ecoli-genome.sig +sourmash sketch dna -p scaled=1000,k=31 ~/data/ecoliMG1655.fa.gz -o ecoli-genome.sig ``` and now evaluate *containment*, that is, what fraction of the read content is contained in the genome: ``` -sourmash search -k 31 ecoli-reads.sig ecoli-genome.sig --containment +sourmash search 31 ecoli-reads.sig ecoli-genome.sig --containment ``` and you should see: @@ -102,7 +102,7 @@ similarity match Try the reverse - why is it bigger? ``` -sourmash search -k 31 ecoli-genome.sig ecoli-reads.sig --containment +sourmash search ecoli-genome.sig ecoli-reads.sig --containment ``` ## Make and search a database quickly. @@ -135,7 +135,7 @@ ls ecoli_many_sigs Let's turn this into an easily-searchable database with `sourmash index` -- ``` -sourmash index -k 31 ecolidb ecoli_many_sigs/*.sig +sourmash index ecolidb ecoli_many_sigs/*.sig ``` and now we can search! @@ -213,7 +213,7 @@ curl -L -o genbank-k31.lca.json.gz https://osf.io/4f8n3/download Next, run the 'gather' command to see what's in your ecoli genome -- ``` -sourmash gather -k 31 ecoli-genome.sig genbank-k31.lca.json.gz +sourmash gather ecoli-genome.sig genbank-k31.lca.json.gz ``` and you should get: diff --git a/doc/tutorials-lca.md b/doc/tutorials-lca.md index 62e2e30e73..384a6a2b9e 100644 --- a/doc/tutorials-lca.md +++ b/doc/tutorials-lca.md @@ -66,9 +66,9 @@ Download a random genome from genbank: curl -L -o some-genome.fa.gz ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/178/875/GCF_000178875.2_ASM17887v2/GCF_000178875.2_ASM17887v2_genomic.fna.gz ``` -Compute a signature for this genome: +Create a signature for this genome: ``` -sourmash compute -k 31 --scaled=1000 --name-from-first some-genome.fa.gz +sourmash sketch -p scaled=1000,k=31 --name-from-first some-genome.fa.gz ``` Now, classify the signature with sourmash `lca classify`, @@ -119,7 +119,7 @@ on the command line; separate them with `--db` or `--query`. (This is an abbreviated version of [this blog post](http://ivory.idyll.org/blog/2017-classify-genome-bins-with-custom-db-try-again.html), updated to use the `sourmash lca` commands.) -Download some pre-computed signatures: +Download some pre-calculated signatures: ``` curl -L https://osf.io/bw8d7/download?version=1 -o delmont-subsample-sigs.tar.gz From 5e1f92bf670bce5e155baf8ef4d4063ac606536a Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Mon, 8 Feb 2021 09:54:46 -0800 Subject: [PATCH 12/24] update link targets --- doc/release-notes/sourmash-2.0.md | 2 +- doc/sourmash-sketch.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/release-notes/sourmash-2.0.md b/doc/release-notes/sourmash-2.0.md index c7d57c69b5..8c85bda3ba 100644 --- a/doc/release-notes/sourmash-2.0.md +++ b/doc/release-notes/sourmash-2.0.md @@ -23,7 +23,7 @@ This is a list of substantial new features and functionality in sourmash 2.0. * Created [precomputed databases](../databases.md) for most of GenBank genomes. * Added taxonomic reporting functionality in the `sourmash lca` submodule - [see command-line docs](../command-line.md#sourmash-lca-subcommands-for-taxonomic-classification). * Added signature manipulation utilities in the `sourmash signature` submodule - [see command-line docs](../command-line.md#sourmash-signature-subcommands-for-signature-manipulation) -* Introduced new modulo hash or "scaled" signatures for containment analysis; see [Using sourmash: a practical guide](../using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-how-should-i-compute-them) and [more details in the Python API examples](../api-example.md#sourmash-minhash-objects-and-manipulations). +* Introduced new modulo hash or "scaled" signatures for containment analysis; see [Using sourmash: a practical guide](../using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-how-should-i-create-them) and [more details in the Python API examples](../api-example.md#advanced-features-of-sourmash-minhash-objects-scaled-and-num). * Switched to using JSON instead of YAML for signatures. * Many performance optimizations! * Many more tests! diff --git a/doc/sourmash-sketch.md b/doc/sourmash-sketch.md index 1d31a2e6b9..7b4dbcfdb7 100644 --- a/doc/sourmash-sketch.md +++ b/doc/sourmash-sketch.md @@ -82,8 +82,8 @@ The `-p` argument to `sourmash sketch` provides parameter strings to sourmash, a A parameter string is a space-delimited collection that can contain one or more fields, comma-separated. * `k=` - compute a sketch at this k-mer size; can provide more than one time in a parameter string. Typically `ksize` is between 4 and 100. -* `scaled=` - create a scaled MinHash with k-mers sampled deterministically at 1 per `` value. This controls sketch compression rates and resolution; for example, a 5 Mbp genome sketched with a scaled of 1000 would yield approximately 5,000 k-mers. `scaled` is incompatible with `num`. See [our guide to signature resolution](using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-how-should-i-compute-them) for more information. -* `num=` - create a standard MinHash with no more than `` k-mers kept. This will produce sketches identical to [mash sketches](https://mash.readthedocs.io/en/latest/). `num` is incompatible with `scaled`. See [our guide to signature resolution](using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-how-should-i-compute-them) for more information. +* `scaled=` - create a scaled MinHash with k-mers sampled deterministically at 1 per `` value. This controls sketch compression rates and resolution; for example, a 5 Mbp genome sketched with a scaled of 1000 would yield approximately 5,000 k-mers. `scaled` is incompatible with `num`. See [our guide to signature resolution](using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-how-should-i-create-them) for more information. +* `num=` - create a standard MinHash with no more than `` k-mers kept. This will produce sketches identical to [mash sketches](https://mash.readthedocs.io/en/latest/). `num` is incompatible with `scaled`. See [our guide to signature resolution](using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-how-should-i-create-them) for more information. * `abund` / `noabund` - create abundance-weighted (or not) sketches. See [Classify signatures: Abundance Weighting](classifying-signatures.md#abundance-weighting) for details of how this works. * `dna`, `protein`, `dayhoff`, `hp` - create this kind of sketch. Note that `sourmash sketch dna -p protein` and `sourmash sketch protein -p dna` are invalid; please use `sourmash sketch translate` for the former. From 40762f3010cdc1b394ec8ef62990eb33765b59d5 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Mon, 8 Feb 2021 11:43:38 -0800 Subject: [PATCH 13/24] updates of indexed databases --- doc/command-line.md | 36 +++++++++++++++++++-- doc/using-sourmash-a-guide.md | 61 +++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 2 deletions(-) diff --git a/doc/command-line.md b/doc/command-line.md index 22171783e2..9e7c4d91b1 100644 --- a/doc/command-line.md +++ b/doc/command-line.md @@ -61,8 +61,8 @@ Matrix: To get a list of subcommands, run `sourmash` without any arguments. -There are five main subcommands: `sketch`, `compare`, `plot`, -`search`, and `gather`. See [the tutorial](tutorials.md) for a +There are six main subcommands: `sketch`, `compare`, `plot`, +`search`, `gather`, and `index`. See [the tutorial](tutorials.md) for a walkthrough of these commands. * `sketch` creates signatures. @@ -70,6 +70,7 @@ walkthrough of these commands. * `plot` plots distance matrices created by `compare`. * `search` finds matches to a query signature in a collection of signatures. * `gather` finds the best reference genomes for a metagenome, using the provided collection of signatures +* `index` build a fast index for many (thousands) of signatures There are also a number of commands that work with taxonomic information; these are grouped under the `sourmash lca` @@ -288,6 +289,37 @@ genomes with no (or incomplete) taxonomic information. Use `sourmash lca summarize` to classify a metagenome using a collection of genomes with taxonomic information. +### `sourmash index` - build an SBT index of signatures + +The `sourmash index` command creates a Zipped SBT database +(`.sbt.zip`) from a collection of signatures. This can be used to +create databases from private collections of genomes, and can also be +used to create databases for e.g. subsets of GenBank. + +These databases support fast search and gather on large collections +of signatures in low memory. + +SBTs can only be created on scaled signatures, and all signatures in +an SBT must be of compatible types (i.e. the same k-mer size and +molecule type). You can specify the usual command line selectors +(`-k`, `--scaled`, `--dna`, `--protein`, etc.) to pick out the types +of signatures to include. + +Usage: +``` +sourmash index database [ list of input signatures/directories/databases ] +``` + +This will create a `database.sbt.zip` file containing the SBT of the +input signatures. You can create an "unpacked" version by specifying +`database.sbt.json` and it will create the JSON file as well as a +subdirectory of files under `.sbt.database`. + +Note that you can use `--from-file` to pass `index` a text file +containing a list of files to index; you can also provide individual +signature files, directories full of signatures, or other sourmash +databases. + ## `sourmash lca` subcommands for taxonomic classification These commands use LCA databases (created with `lca index`, below, or diff --git a/doc/using-sourmash-a-guide.md b/doc/using-sourmash-a-guide.md index 99585a5a37..757d3d7654 100644 --- a/doc/using-sourmash-a-guide.md +++ b/doc/using-sourmash-a-guide.md @@ -1,5 +1,9 @@ # Using sourmash: a practical guide +```{contents} + :depth: 2 +``` + So! You've installed sourmash, run a few of the tutorials and commands, and now you actually want to *use* it. This guide is here to answer some of your questions, and explain why we can't answer others. @@ -145,3 +149,60 @@ names them based on their FASTA headers, and places them all in a single `.sig` file, `file.fa.sig`. (This behavior is triggered by the option `--singleton`, which tells sourmash to treat each individual sequence in the file as an independent sequence.) + +## How do I store and search collections of signatures? + +sourmash supports a variety of signature loading and storage options for +flexibility. If you have only a few hundred signatures, here are some +options - + +* you can put all your signature files in a directory and search them all + using the path to the directory. +* you can use `sourmash sig cat` to concatenate multiple signatures into a + single file. +* you can compress any signature file using `gzip` and sourmash will + load them. + +If you have more than a few hundred genome signatures that you +regularly search, it might be worth creating an indexed database of +them that will support faster searches. + +sourmash supports two types of indexed databases: Sequence Bloom +Trees, or SBTs; and reverse indices, or LCAs. (You can read more +detail about their implementation and design considerations +[in Chapter 2 of Dr. Luiz Irber's thesis, "Efficient indexing of collections of signatures"](https://github.com/luizirber/phd/releases/download/2020.09.28/thesis.pdf).) + +### Sequence Bloom Tree (SBT) indexed databases + +Sequence Bloom Trees (SBTs) (see +[Solomon and Kingsford, 2016](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4804353/)) +are on disk databases that support low-memory query of 10s-100s of +thousands of signatures. They can be created using `sourmash index`. + +SBTs are the lowest-memory way to run search or gather on a collection +of signatures. The tradeoff is that they may be quite large on disk, +because SBTs also contain intermediate nodes in the tree. The default +way to store SBTs is in a Zip file, named `.sbt.zip`, that can be +built and searched directly from the command line. + +### Reverse indexed (LCA) databases + +Reverse indexed or LCA databases are *in-memory* databases that, once +loaded from disk, support fast search and gather across 10s of thousands +of signatures. They can be created using `sourmash lca index` ([docs](command-line.md#sourmash-lca-index-build-an-lca-database)) + +LCA databases are currently stored in JSON files (that can be gzipped). +As these files get larger, the time required to load them from disk +can be substantial. + +LCA databases are also currently (sourmash 2.0-4.0) the only databases +that support the inclusion of taxonomic information in the database, +and there is an associated collection of commands +[under `sourmash lca`](command.md#sourmash-lca-subcommands-for-taxonomic-classification). +However, they can also be used as regular indexed databases for search +and gather as above. + +(These are called "LCA databases" because they originally were created +to support "lowest common ancestor" taxonomic analyses, e.g. like +Kraken; their functionality has evolved a lot since, but their name +hasn't changed to match!) From b1d988aaf898a127af674fe02b8c8030c2749479 Mon Sep 17 00:00:00 2001 From: Taylor Reiter Date: Tue, 9 Feb 2021 05:40:18 -0800 Subject: [PATCH 14/24] typos in versioning (#1314) --- doc/support.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/support.md b/doc/support.md index ce77d9090c..271f0f228c 100644 --- a/doc/support.md +++ b/doc/support.md @@ -80,13 +80,13 @@ Release notes for minor and patch versions are available on the sourmash v3.x supports Python 2.7 as well as Python 3.x, through Python 3.8. -sourmash v4.0 dropped support for version of Python before Python 3.7, +sourmash v4.0 dropped support for versions of Python before Python 3.7, and our intent is that it will support as-yet unreleased versions of Python 3.x (e.g. 3.9) moving forward. For future versions of sourmash, we plan to follow the [Numpy NEP 29](https://numpy.org/neps/nep-0029-deprecation_policy.html) -proposal for Python version support in the future. For example, this +proposal for Python version support. For example, this would mean that we would drop support for Python 3.7 on December 26, 2021. From 9da9c189a0e71e31489e48f0f8135ff07c13b3b8 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Tue, 9 Feb 2021 05:44:00 -0800 Subject: [PATCH 15/24] Apply suggestions from code review Co-authored-by: Taylor Reiter --- doc/sourmash-sketch.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/sourmash-sketch.md b/doc/sourmash-sketch.md index 7b4dbcfdb7..d2c8923946 100644 --- a/doc/sourmash-sketch.md +++ b/doc/sourmash-sketch.md @@ -66,7 +66,7 @@ By default, `sourmash sketch` will produce signatures for each input *file*. If If you specify `--singleton`, `sourmash sketch` will produce signatures for each *record*. -If you specify `--merge `, sourmash sketch will produce signatures for all input files combined into one. +If you specify `--merge `, sourmash sketch will produce signatures for all input files and combine them into one signature. The output signature(s) will be saved in locations that depend on your input parameters. By default, `sourmash sketch` will put the signatures in the current directory, in a file named for the input file with a `.sig` suffix. If you specify `-o`, all of the signatures will be placed in that file. @@ -81,7 +81,7 @@ We are still in the process of benchmarking these encodings; ask [on the issue t The `-p` argument to `sourmash sketch` provides parameter strings to sourmash, and these control what signatures and sketches are calculated and output. Zero or more parameter strings can be given to sourmash. Each parameter string produces at least one sketch. A parameter string is a space-delimited collection that can contain one or more fields, comma-separated. -* `k=` - compute a sketch at this k-mer size; can provide more than one time in a parameter string. Typically `ksize` is between 4 and 100. +* `k=` - create a sketch at this k-mer size; can provide more than one time in a parameter string. Typically `ksize` is between 4 and 100. * `scaled=` - create a scaled MinHash with k-mers sampled deterministically at 1 per `` value. This controls sketch compression rates and resolution; for example, a 5 Mbp genome sketched with a scaled of 1000 would yield approximately 5,000 k-mers. `scaled` is incompatible with `num`. See [our guide to signature resolution](using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-how-should-i-create-them) for more information. * `num=` - create a standard MinHash with no more than `` k-mers kept. This will produce sketches identical to [mash sketches](https://mash.readthedocs.io/en/latest/). `num` is incompatible with `scaled`. See [our guide to signature resolution](using-sourmash-a-guide.md#what-resolution-should-my-signatures-be-how-should-i-create-them) for more information. * `abund` / `noabund` - create abundance-weighted (or not) sketches. See [Classify signatures: Abundance Weighting](classifying-signatures.md#abundance-weighting) for details of how this works. @@ -124,17 +124,17 @@ Specify `--outdir` to put all the signatures in a specific directory. ### Downsampling and flattening signatures -Calculating signatures is probably the most time consuming part of using sourmash, and it is the only part that requires access to the raw data. Moreover, the output signatures are generally much smaller than the input data. So, we generally suggest calculating a large set of signatures once. +Creating signatures is probably the most time consuming part of using sourmash, and it is the only part that requires access to the raw data. Moreover, the output signatures are generally much smaller than the input data. So, we generally suggest creating a large set of signatures once. To support this, sourmash can do two kinds of signature conversion without going back to the raw data. -First, you can downsample `num` and `scaled` signatures using `sourmash sig downsample`. For any sketch calculated with `num` parameter, you can decrease that `num`. And, for any `scaled` parameter, you can increase the `scaled`. This will decrease the size of the sketch accordingly; for example, going from a num of 5000 to a num of 1000 will decrease the sketch size by a factor of 5, and going from a scaled of 1000 to a scaled of 10000 will decrease the sketch size by a factor of 10. +First, you can downsample `num` and `scaled` signatures using `sourmash sig downsample`. For any sketch created with `num` parameter, you can decrease that `num`. And, for any `scaled` parameter, you can increase the `scaled`. This will decrease the size of the sketch accordingly; for example, going from a `num` of 5000 to a `num` of 1000 will decrease the sketch size by a factor of 5, and going from a `scaled` of 1000 to a `scaled` of 10000 will decrease the sketch size by a factor of 10. -(Note that decreasing num or increasing scaled will increase calculation speed and lower the accuracy of your results.) +(Note that decreasing `num` or increasing `scaled` will increase calculation speed and lower the accuracy of your results.) -Second, you can flatten abundances using `sourmash sig flatten`. For any sketch calculated with `abund`, you can convert it to a `noabund` sketch. This will decrease the sketch size, although not necessarily by a lot. +Second, you can flatten abundances using `sourmash sig flatten`. For any sketch created with `abund`, you can convert it to a `noabund` sketch. This will decrease the sketch size, although not necessarily by a lot. -Unfortunately, changing the k-mer size or using different DNA/protein encodings cannot be done on a sketch, and you need to calculate new signatures from the raw data for that. +Unfortunately, changing the k-mer size or using different DNA/protein encodings cannot be done on a sketch, and you need to create new signatures from the raw data for that. ### Examining the output of `sourmash sketch` From bf9e950693577c4e378642e88a29ad6d7887df34 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Tue, 9 Feb 2021 05:45:34 -0800 Subject: [PATCH 16/24] Update doc/api-example.md Co-authored-by: Taylor Reiter --- doc/api-example.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api-example.md b/doc/api-example.md index 7adb351c30..ba82054437 100644 --- a/doc/api-example.md +++ b/doc/api-example.md @@ -146,7 +146,7 @@ raising an exception. ``` -And now the result MinHash objects can be compared against each other: +And now the resulting MinHash objects can be compared against each other: ``` >>> import sys From ab8656d97a6b3a3f61ea961326679a34fd7ccfc8 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Tue, 9 Feb 2021 05:51:01 -0800 Subject: [PATCH 17/24] updated with suggestions from @taylorreiter doc review --- README.md | 4 ++-- doc/classifying-signatures.md | 4 +--- doc/command-line.md | 11 ++++++++++- doc/tutorial-basic.md | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 821887f08f..9b9382ae2e 100644 --- a/README.md +++ b/README.md @@ -15,8 +15,8 @@ Quickly search, compare, and analyze genomic and metagenomic data sets. Usage: sourmash sketch dna *.fq.gz - sourmash compare *.sig -o distances -k 31 - sourmash plot distances + sourmash compare *.sig -o distances.cmp -k 31 + sourmash plot distances.cmp sourmash 1.0 is [published on JOSS](https://doi.org/10.21105/joss.00027); please cite that paper if you use sourmash (`doi: 10.21105/joss.00027`):. diff --git a/doc/classifying-signatures.md b/doc/classifying-signatures.md index 279670788e..787c2e2d32 100644 --- a/doc/classifying-signatures.md +++ b/doc/classifying-signatures.md @@ -153,9 +153,7 @@ for use in clustering. For more information on the value of this kind of comparison for metagenomics, please see the simka paper, [Multiple comparative metagenomics using multiset k-mer counting](https://peerj.com/articles/cs-94/), -Benoit et al., 2016. Initial comparisons of metagenome similarity -approximations calculated with sourmash to the output of simka suggest a -significant correlation. +Benoit et al., 2016. **Implementation note:** Angular similarity searches cannot be done on SBT or LCA databases currently; you have to provide lists of signature diff --git a/doc/command-line.md b/doc/command-line.md index 9e7c4d91b1..b0af38dd50 100644 --- a/doc/command-line.md +++ b/doc/command-line.md @@ -115,7 +115,16 @@ The `sketch protein` command reads in **protein sequences** and outputs **protei The `sketch translate` command reads in **DNA sequences**, translates them in all six frames, and outputs **protein sketches**. -Please see [the `sourmash sketch` documentation page](sourmash-sketch.md) for details! +`sourmash sketch` takes FASTA or FASTQ sequences as input, and they can be +uncompressed, compressed with gzip, or compressed with bzip2. The output +will be one or more JSON signature files that can be used with the other +sourmash commands. + +Please see +[the `sourmash sketch` documentation page](sourmash-sketch.md) for +details on `sketch`, and see +[Using sourmash: a practical guide](using-sourmash-a-guide.md) for +more information on creating signatures. ### `sourmash compute` - make sourmash signatures from sequence data diff --git a/doc/tutorial-basic.md b/doc/tutorial-basic.md index dd80aadae1..f47d75c29e 100644 --- a/doc/tutorial-basic.md +++ b/doc/tutorial-basic.md @@ -83,7 +83,7 @@ and now evaluate *containment*, that is, what fraction of the read content is contained in the genome: ``` -sourmash search 31 ecoli-reads.sig ecoli-genome.sig --containment +sourmash search ecoli-reads.sig ecoli-genome.sig --containment ``` and you should see: From dda99fece734279cb3ba5b28f3f5f17b86dea218 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Tue, 9 Feb 2021 06:30:42 -0800 Subject: [PATCH 18/24] added section on sketch naming --- doc/sourmash-sketch.md | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/doc/sourmash-sketch.md b/doc/sourmash-sketch.md index d2c8923946..6f6d220192 100644 --- a/doc/sourmash-sketch.md +++ b/doc/sourmash-sketch.md @@ -20,7 +20,7 @@ The `sketch translate` command reads in **DNA sequences**, translates them in al ### DNA sketches for genomes and reads -To compute a DNA sketch for a genome, run: +To create a DNA sketch for a genome, run: ``` sourmash sketch dna genome.fna ``` @@ -31,7 +31,7 @@ Sourmash can work with unassembled reads; run ``` sourmash sketch dna -p k=21,k=31,k=51,abund metagenome.fq.gz ``` -to compute three abundance-weighted sketches at k=21, 31, and 51, for the given FASTQ file. +to create three abundance-weighted sketches at k=21, 31, and 51, for the given FASTQ file. ### Protein sketches for genomes and proteomes @@ -87,7 +87,7 @@ A parameter string is a space-delimited collection that can contain one or more * `abund` / `noabund` - create abundance-weighted (or not) sketches. See [Classify signatures: Abundance Weighting](classifying-signatures.md#abundance-weighting) for details of how this works. * `dna`, `protein`, `dayhoff`, `hp` - create this kind of sketch. Note that `sourmash sketch dna -p protein` and `sourmash sketch protein -p dna` are invalid; please use `sourmash sketch translate` for the former. -For all field names but `k`, if multiple fields in a parameter string are provided, the last one encountered overrides the previous values. For `k`, if multiple ksizes are specified a single parameter string, sketches for all ksizes specified are computed. +For all field names but `k`, if multiple fields in a parameter string are provided, the last one encountered overrides the previous values. For `k`, if multiple ksizes are specified in a single parameter string, sketches for all ksizes specified are created. If a field isn't specified, then the default value for that sketch type is used; so, for example, `sourmash sketch dna -p abund` would calculate a sketch with `k=31,scaled=1000,abund`. See below for the defaults. @@ -98,7 +98,7 @@ The default parameters for sketches are as follows: * dna: `k=31,scaled=1000,noabund` * protein: `k=10,scaled=200,noabund` * dayhoff: `k=16,scaled=200,noabund` -* hp=`k=42,scaled=200,noabund` +* hp: `k=42,scaled=200,noabund` These were chosen by a committee of PhDs as being good defaults for an initial analysis, so, beware :). @@ -111,8 +111,32 @@ The protein, dayhoff, and hp parameters were selected based on unpublished resea Below are some more complicated `sourmash sketch` command lines: * `sourmash sketch dna -p k=51` - default to a scaled=1000 and noabund for a k-mer size of 51 (based on moltype/command) -* `sourmash sketch dna -p k=31,k=51,k=21` - compute multiple ksizes, using the defaults otherwise -* `sourmash sketch translate -p k=20,num=500,protein -p k=19,num=400,dayhoff,abund -p k=30,scaled=200,hp` - compute multiple ksizes, moltypes, and scaled/num. +* `sourmash sketch dna -p k=31,k=51,k=21` - create one signature with multiple ksizes, using the defaults otherwise +* `sourmash sketch translate -p k=20,num=500,protein -p k=19,num=400,dayhoff,abund -p k=30,scaled=200,hp` - create three signatures with different ksizes, moltypes, and scaled/num. + +### Signature naming + +Signature names are displayed in the output for search, gather, and +compare, and can be specified in a few different ways. + +With default arguments, `sourmash sketch` does not set a name, and the +filename is used in display output. + +You can set a name using `--name`, but this has the side effect of +merging the sequence records before signature creation. So, for example, +`sourmash sketch dna genome1.fa genome2.fa --name genome1 -o +genome.sig` would produce one signature after combining `genome1.fa` +and `genome2.fa`. + +The option `--name-from-first` will set the signature name from the +first record header encountered in each file. When used with `--singleton`, +this will name each signature based on the record that it is created from. + +You can examine the signature name using `sourmash sig describe`. + +Individual signature renaming can be done from the command line using +`sourmash sig split` to create individual files for each signature, +and then `sourmash sig rename`. ### Locations for output files From 219e6069d781a08094fc39875a0e45e522e1bb45 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Tue, 9 Feb 2021 10:15:17 -0800 Subject: [PATCH 19/24] [WIP] add migration docs and release notes (#1316) * add migration docs and release notes * Update doc/support.md Co-authored-by: Taylor Reiter * Update doc/support.md Co-authored-by: Taylor Reiter * Update doc/release-notes/sourmash-4.0.md Co-authored-by: Taylor Reiter * Update doc/release-notes/sourmash-4.0.md Co-authored-by: Taylor Reiter * Update doc/release-notes/sourmash-4.0.md Co-authored-by: Taylor Reiter * update with last set of changes * add missing line break Co-authored-by: Taylor Reiter --- doc/release-notes/releases.md | 1 + doc/release-notes/sourmash-4.0.md | 71 ++++++++++++++++++++++++++++++ doc/support.md | 72 +++++++++++++++++++++++++------ 3 files changed, 132 insertions(+), 12 deletions(-) create mode 100644 doc/release-notes/sourmash-4.0.md diff --git a/doc/release-notes/releases.md b/doc/release-notes/releases.md index 6d5ae519aa..6a492e1c24 100644 --- a/doc/release-notes/releases.md +++ b/doc/release-notes/releases.md @@ -7,6 +7,7 @@ for detailed release notes for each version! ```{toctree} :maxdepth: 2 +sourmash-4.0 sourmash-3.0 sourmash-2.0 ``` diff --git a/doc/release-notes/sourmash-4.0.md b/doc/release-notes/sourmash-4.0.md new file mode 100644 index 0000000000..139dd5efef --- /dev/null +++ b/doc/release-notes/sourmash-4.0.md @@ -0,0 +1,71 @@ +# sourmash v4.0 release notes + +```{contents} + :depth: 2 +``` + +We are pleased to announce release 4.0 of sourmash! This release +contains many feature improvements and new functionality, as well as +many breaking changes with sourmash 2.x and 3.x. + +Please see +[our migration guide](../support.md#migrating-from-sourmash-v3-x-to-sourmash-v4-x) +for guidance on updating to sourmash v4, and post questions about +migrating to sourmash 4.0 in the +[sourmash issue tracker](https://github.com/dib-lab/sourmash/issues/new). + +## Major changes for 4.0 + +### New or changed behavior + +* default SBT storage is now .sbt.zip (#1174, #1170) +* add `sourmash sketch` command for creating signatures (#1159) +* protein ksizes in MinHash are now divided by 3, except in `sourmash compute` (#1277) +* refactor MinHash API and implementation: add, iadd, merge, hashes, and max_hash (#1282, #1154, #1139, #1301) +* add HyperLogLog implementation (#1223) +* `SourmashSignature.name` is now a property (not a method): use `str(sig)` instead of `name()` (#1179, #1232) +* `lca summarize` no longer merges all signatures, and uses hash abundance by default (#1175) +* `index `and `lca index` (#1186, #1222) now support `--from-file` and no longer require signature files on command line +* `--traverse-directory` is now on by default for signature loading behavior (#1178) + +### Feature removal + +* remove Python 2.7 support (& end Python 2 compatibility) (#1145, #1144) +* remove `lca gather` (#1307) +* remove 10x support from `sourmash compute` (#1229) +* remove `dump` command (#1157) + +### Feature/function deprecations +* deprecate `sourmash compute` (#1159) +* deprecate `load_signatures`, `sourmash.load_one_signature`, `create_sbt_index`, and `load_sbt_index` (#1279, #1304) +* deprecate `import_csv` in favor of new `sourmash sig import --csv` (#1281) + +## Refactoring, improvements, and minor bug fixes: + +* accept file list in `sourmash sig cat` (#1236) +* add unique_intersect_bp and gather_result_rank to gather CSV output (#1219) +* remove deprecated minhash functions (#1149) +* fix Rust panic error in signature creation (#1172) +* cache nodes in SBT during search (#1161) +* fix two bugs in gather `--output-unassigned` (#1156) + +## Documentation updates + +* add information about versioning, migrations, etc to the docs (#1153) +* @CTB MORE GOES HERE + +## Infrastructure and CI changes: + +* update finch requirement from 0.3.0 to 0.4.1 (#1290) +* update rand for test, and activate "js" feature for getrandom (#1275) +* dev updates (configs and doc) (#1298) +* move wheel building from Travis to GitHub Actions (#1295) +* fix new clippy warnings from Rust 1.49 (#1267) +* use tox for running tests locally (#696) +* CI: small build fixes (#1252) +* CI: Fix releases in GitHub Actions (#1250) +* update build_wheel action paths +* CI: moving python tests from travis to GH actions (#1249) +* CI: move wheel building to GitHub actions (#1244) +* remove last .rst file from docs (#1185) +* update CI for latest branch name change (#1150) diff --git a/doc/support.md b/doc/support.md index 271f0f228c..2f5a3bf775 100644 --- a/doc/support.md +++ b/doc/support.md @@ -1,5 +1,9 @@ # Support, Versioning, and Migration +```{contents} + :depth: 2 +``` + ## Asking questions and filing bugs We do our best to support sourmash users! Users have found important @@ -82,7 +86,7 @@ sourmash v3.x supports Python 2.7 as well as Python 3.x, through Python 3.8. sourmash v4.0 dropped support for versions of Python before Python 3.7, and our intent is that it will support as-yet unreleased versions of Python 3.x -(e.g. 3.9) moving forward. +(e.g. 3.10) moving forward. For future versions of sourmash, we plan to follow the [Numpy NEP 29](https://numpy.org/neps/nep-0029-deprecation_policy.html) @@ -90,18 +94,62 @@ proposal for Python version support. For example, this would mean that we would drop support for Python 3.7 on December 26, 2021. -## Migrating from sourmash v3.x to sourmash 4.x. +## Migrating from sourmash v3.x to sourmash v4.x. + +Our intent is to provide a clear path for migration between versions for our users. We rely on *semantic versioning* and deprecation warnings to do this - +* Within each major version release (v2, v3, v4), the command-line interface and Python APIs should remain the same, with features being only *added*. +* Across major versions (e.g. v2 to v3, and v3 to v4) we provide warnings when functionality will change in the next major version. + +So: if you want to upgrade workflows and scripts from prior releases of sourmash to sourmash v4.0, we suggest doing this in two stages. + +First, upgrade to the latest version of sourmash 3.5.x (currently [v3.5.0](https://github.com/dib-lab/sourmash/releases/tag/v3.5.0)), which is compatible with all files and command lines used in previous versions of sourmash (v2.x and v3.x). After upgrading to 3.5.x, scan the sourmash output for deprecation warnings and fix those. + +Next, upgrade to the latest version of 4.x, which will introduce some backwards incompatibilities based upon the deprecation warnings. + +The major changes are detailed below; please see the [full release notes for 4.0](release-notes/sourmash-4.0.md) for all the details and links to the code changes. + +### Sourmash command line + +If you use sourmash from the command line, there are a few major changes in 4.0 that you should know about. + +First, **`sourmash compute` is deprecated in favor of [`sourmash sketch`](sourmash-sketch.md)**, which provides quite a bit more flexibility in creating signatures. + +Second, **`sourmash index` will now save databases in the Zip format (`.sbt.zip`) instead of the old JSON+subdirectory format** (see [updated docs](command-line.md#sourmash-index-build-an-sbt-index-of-signatures)). You can revert to the old behavior by explicitly specifying the `.sbt.json` filename for output when running `sourmash index`. + +Third, all sourmash commands that operate on signatures should now be able to directly read from lists of signatures in signature files, SBT databases, LCA databases, directories, and files containing lists of filenames (see [updated docs](command-line.md#advanced-command-line-usage)). + +Fourth, if you use `sourmash lca` commands, **`sourmash lca gather` has been removed**. In addition, there are some **changes in how `summarize` works**: it now uses abundances by default, and no longer combines all signatures before summarizing. Specify `--ignore-abundance` and combine your signatures using `sourmash sig merge` to recover the old behavior. Note also that `lca summarize` now includes a new column, `filename`, in the CSV output. + +Finally, **k-mer sizes have changed for amino acid sequences** in v4. If you use protein, Dayhoff, or HP signatures, we now interpret k-mer sizes differently on the command line. Briefly, k-mer sizes for protein/dayhoff/hp signatures are now the size of the k-mer in amino acid space, *not* the space of the k-mer in DNA space (as previously used). In practice this means that you need to divide all your old k-mer sizes by 3 when working with k-mers in amino acid space! + +Note also that while `sourmash compute` still behaves the same way in v4.x as it did in sourmash 3.5.x, `sourmash sketch translate` and `sourmash sketch protein` both use the *new* approach to amino acid k-mer sizes, as do all of the the command line options for searching, manipulation, and display. Again, in practice this means that you need to divide all your old k-mer sizes by 3 if they apply to amino acid k-mers. + +There are several minor changes where error messages should occur appropriately: +* `--traverse-directory` is no longer needed on the command line for `sourmash index` or other functions; directory traversal happens automatically. +* the command lines for `sourmash index` and `sourmash lca index` no longer require signature files to be specified, which can break existing command lines. To fix this, reorder arguments so that any signatures are specified at the end of the command line. + +### Python API + +First, all k-mer sizes for `protein`, `dayhoff`, and `hp` signatures have changed in the Python layer to be "correct", i.e., to be the size of the protein k-mer. Previously they were 3\*k, i.e. based on the size of the DNA k-mer from which the protein sequence would have been created. + +Second, the `MinHash` class API has changed significantly! +* `get_mins()` has been deprecated in favor of `.hashes`, which is a dictionary that contains abundances. +* `merge` now just modifies `MinHash` objects in-place, and no longer returns the merged object; use `__iadd__` (`+=`) for the old behavior, or `__add__` (`+`) to create a new merged object. +* `max_hash` has been deprecated in favor of `scaled`. +* instead of `downsample_scaled(s)` use `downsample(scaled=s)` +* instead of `downsample_n(m)` use `downsample(num=m)` +* `is_molecule_type` has been replaced with a property, `moltype` -- instead of `is_molecule_type(t)` use `moltype == t`. + -Prior to the release of sourmash v4, we are adding deprecation -warnings and/or future warnings to all APIs and modules in sourmash -v3.x that are being removed in v4.0. If you are using the Python API, -we suggest you use the following procedure to migrate: +Third, `SourmashSignature` objects no longer have a `name()` method but instead a `name` property, which can be assigned to. This property is now `None` when no name has been assigned. Note that `str(sig)` should now be used to retrieve a display name, and should replace all previous uses of `sig.name()`. -* first, install the latest version of sourmash v3, which should be v3.5.0 or later. -* then, turn on `DeprecationWarning`s in your code per [the warnings module documentation](https://docs.python.org/3/library/warnings.html#overriding-the-default-filter). -* now, run python with the argument `-W error` to turn warnings into errors. -* fix all errors! -* finally, upgrade to sourmash v4.0. +Fourth, a few top-level functions have been deprecated: `load_signatures(...)`, `load_one_signature(...)`, `create_sbt_index(...)`, and `load_sbt_index(...)`. +* `load_signatures(...)`, `load_one_signature(...)` should be replaced with `load_file_as_signatures(...)`. Note there is currently no top-level way to load signatures from strings. For now, if you need that functionality, you can use `sourmash.signature.load_signatures(...)` and `sourmash.signature.load_one_signature(...)`, but please be aware that these are not considered part of the public API that is under semantic versioning, so they may change in the next minor point release; this is tracked in https://github.com/dib-lab/sourmash/issues/1312. +* `load_sbt_index(...)` have been deprecated. Please use `load_file_as_index(...)` instead. +* `create_sbt_index(...)` has been deprecated. There is currently no replacement, although you can use it directly from `sourmash.sbtmh` if necessary. -@CTB add stuff here +Fifth, directory traversal now happens by default when loading signatures, so remove `traverse=True` arguments to several functions in `sourmash_args` - `load_dbs_and_sigs`, `load_file_as_index`, `and load_file_as_signatures`. +Please post questions and concerns to the +[sourmash issue tracker](https://github.com/dib-lab/sourmash/issues) +and we'll be happy to help! From b6901466f7dcfc5c2fa745034df4d56e6ffeba98 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Tue, 9 Feb 2021 10:17:38 -0800 Subject: [PATCH 20/24] resolve missing link --- doc/release-notes/sourmash-4.0.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/release-notes/sourmash-4.0.md b/doc/release-notes/sourmash-4.0.md index 139dd5efef..66baf27c39 100644 --- a/doc/release-notes/sourmash-4.0.md +++ b/doc/release-notes/sourmash-4.0.md @@ -51,8 +51,8 @@ migrating to sourmash 4.0 in the ## Documentation updates -* add information about versioning, migrations, etc to the docs (#1153) -* @CTB MORE GOES HERE +* major update and cleanup of docs given new functionality; add sourmash sketch documentation (#1283) +* add information about versioning, migrations, etc to the docs (#1153, #1283) ## Infrastructure and CI changes: From cf894c48379bfb3429b204fb2acd87c2c4ff53b2 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Tue, 9 Feb 2021 15:46:20 -0800 Subject: [PATCH 21/24] update tutorials and notebooks for 4.0 --- doc/sourmash-collections.ipynb | 1482 ++++++++---------------------- doc/sourmash-examples.ipynb | 177 ++-- doc/tutorial-basic.md | 38 +- doc/tutorials-lca.md | 8 +- doc/using-LCA-database-API.ipynb | 65 +- 5 files changed, 553 insertions(+), 1217 deletions(-) diff --git a/doc/sourmash-collections.ipynb b/doc/sourmash-collections.ipynb index e0508c5bf3..fe1c15f400 100644 --- a/doc/sourmash-collections.ipynb +++ b/doc/sourmash-collections.ipynb @@ -41,8 +41,8 @@ "/Users/t/dev/sourmash/doc/big_genomes\n", " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", - "100 459 100 459 0 0 750 0 --:--:-- --:--:-- --:--:-- 750\n", - "100 61.1M 100 61.1M 0 0 2966k 0 0:00:21 0:00:21 --:--:-- 3496k\n" + "100 459 100 459 0 0 1017 0 --:--:-- --:--:-- --:--:-- 1017\n", + "100 61.1M 100 61.1M 0 0 2932k 0 0:00:21 0:00:21 --:--:-- 3468k\n" ] } ], @@ -68,217 +68,215 @@ "output_type": "stream", "text": [ "/Users/t/dev/sourmash/doc/big_genomes\n", - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", "\n", - "\u001b[Ksetting num_hashes to 0 because --scaled is set\n", "\u001b[Kcomputing signatures for files: 0.fa, 1.fa, 10.fa, 11.fa, 12.fa, 13.fa, 14.fa, 15.fa, 16.fa, 17.fa, 18.fa, 19.fa, 2.fa, 20.fa, 21.fa, 22.fa, 23.fa, 24.fa, 25.fa, 26.fa, 27.fa, 28.fa, 29.fa, 3.fa, 30.fa, 31.fa, 32.fa, 33.fa, 34.fa, 35.fa, 36.fa, 37.fa, 38.fa, 39.fa, 4.fa, 40.fa, 41.fa, 42.fa, 43.fa, 44.fa, 45.fa, 46.fa, 47.fa, 48.fa, 49.fa, 5.fa, 50.fa, 51.fa, 52.fa, 53.fa, 54.fa, 55.fa, 56.fa, 57.fa, 58.fa, 59.fa, 6.fa, 60.fa, 61.fa, 62.fa, 63.fa, 7.fa, 8.fa, 9.fa\n", - "\u001b[KComputing signature for ksizes: [31]\n", - "\u001b[KComputing only nucleotide (and not protein) signatures.\n", "\u001b[KComputing a total of 1 signature(s).\n", "\u001b[K... reading sequences from 0.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 0.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 0.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 1.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 1.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 1.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 10.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 10.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 10.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 11.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 11.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 11.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 12.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 12.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 12.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 13.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 13.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 13.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 14.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 14.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 14.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 15.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 15.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 15.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 16.fa\n", "\u001b[Kcalculated 1 signatures for 4 sequences in 16.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 16.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 17.fa\n", "\u001b[Kcalculated 1 signatures for 2 sequences in 17.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 17.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 18.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 18.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 18.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 19.fa\n", "\u001b[Kcalculated 1 signatures for 9 sequences in 19.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 19.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 2.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 2.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 2.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 20.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 20.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 20.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 21.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 21.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 21.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 22.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 22.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 22.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 23.fa\n", "\u001b[Kcalculated 1 signatures for 5 sequences in 23.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 23.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 24.fa\n", "\u001b[Kcalculated 1 signatures for 3 sequences in 24.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 24.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 25.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 25.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 25.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 26.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 26.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 26.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 27.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 27.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 27.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 28.fa\n", "\u001b[Kcalculated 1 signatures for 3 sequences in 28.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 28.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 29.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 29.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 29.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 3.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 3.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 3.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 30.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 30.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 30.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 31.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 31.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 31.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 32.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 32.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 32.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 33.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 33.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 33.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 34.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 34.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 34.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 35.fa\n", "\u001b[Kcalculated 1 signatures for 7 sequences in 35.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 35.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 36.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 36.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 36.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 37.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 37.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 37.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 38.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 38.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 38.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 39.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 39.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 39.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 4.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 4.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 4.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 40.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 40.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 40.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 41.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 41.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 41.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 42.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 42.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 42.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 43.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 43.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 43.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 44.fa\n", "\u001b[Kcalculated 1 signatures for 2 sequences in 44.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 44.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 45.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 45.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 45.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 46.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 46.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 46.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 47.fa\n", "\u001b[Kcalculated 1 signatures for 2 sequences in 47.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 47.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 48.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 48.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 48.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 49.fa\n", "\u001b[Kcalculated 1 signatures for 228 sequences in 49.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 49.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 5.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 5.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 5.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 50.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 50.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 50.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 51.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 51.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 51.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 52.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 52.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", - "\u001b[K... reading sequences from 53.fa\n", - "\u001b[Kcalculated 1 signatures for 1 sequences in 53.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", - "\u001b[K... reading sequences from 54.fa\n", - "\u001b[Kcalculated 1 signatures for 1 sequences in 54.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", - "\u001b[K... reading sequences from 55.fa\n" + "\u001b[Ksaved signature(s) to 52.fa.sig. Note: signature license is CC0.\n", + "\u001b[K... reading sequences from 53.fa\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ + "\u001b[Kcalculated 1 signatures for 1 sequences in 53.fa\n", + "\u001b[Ksaved signature(s) to 53.fa.sig. Note: signature license is CC0.\n", + "\u001b[K... reading sequences from 54.fa\n", + "\u001b[Kcalculated 1 signatures for 1 sequences in 54.fa\n", + "\u001b[Ksaved signature(s) to 54.fa.sig. Note: signature license is CC0.\n", + "\u001b[K... reading sequences from 55.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 55.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 55.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 56.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 56.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 56.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 57.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 57.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 57.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 58.fa\n", "\u001b[Kcalculated 1 signatures for 30 sequences in 58.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 58.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 59.fa\n", "\u001b[Kcalculated 1 signatures for 5 sequences in 59.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 59.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 6.fa\n", "\u001b[Kcalculated 1 signatures for 76 sequences in 6.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 6.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 60.fa\n", "\u001b[Kcalculated 1 signatures for 11 sequences in 60.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 60.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 61.fa\n", "\u001b[Kcalculated 1 signatures for 47 sequences in 61.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 61.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 62.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 62.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 62.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 63.fa\n", "\u001b[Kcalculated 1 signatures for 4 sequences in 63.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 63.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 7.fa\n", "\u001b[Kcalculated 1 signatures for 3 sequences in 7.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 7.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 8.fa\n", "\u001b[Kcalculated 1 signatures for 1 sequences in 8.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n", + "\u001b[Ksaved signature(s) to 8.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from 9.fa\n", "\u001b[Kcalculated 1 signatures for 3 sequences in 9.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n" + "\u001b[Ksaved signature(s) to 9.fa.sig. Note: signature license is CC0.\n" ] } ], "source": [ - "!cd big_genomes/ && sourmash compute -k 31 --scaled=1000 --name-from-first *.fa" + "!cd big_genomes/ && sourmash sketch dna -p k=31,scaled=1000 --name-from-first *.fa" ] }, { @@ -297,16 +295,81 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", "\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/0.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/1.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/10.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/11.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/12.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/13.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/14.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/15.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/16.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/17.fa.sig'10 sigs total\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/18.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/19.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/2.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/20.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/21.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/22.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/23.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/24.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/25.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/26.fa.sig'20 sigs total\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/27.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/28.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/29.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/3.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/30.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/31.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/32.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/33.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/34.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/35.fa.sig'30 sigs total\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/36.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/37.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/38.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/39.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/4.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/40.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/41.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/42.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/43.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/44.fa.sig'40 sigs total\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/45.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/46.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/47.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/48.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/49.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/5.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/50.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/51.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/52.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/53.fa.sig'50 sigs total\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/54.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/55.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/56.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/57.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/58.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/59.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/6.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/60.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/61.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/62.fa.sig'60 sigs total\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/63.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/7.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/8.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/9.fa.sig'g'\n", "\u001b[Kloaded 64 signatures total. \n", - "\u001b[Kdownsampling to scaled value of 1000\n", "\u001b[K\n", "min similarity in matrix: 0.000\n", "\u001b[Ksaving labels to: compare_all.mat.labels.txt\n", - "\u001b[Ksaving distance matrix to: compare_all.mat\n", - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", + "\u001b[Ksaving comparison matrix to: compare_all.mat\n", + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", "\n", "\u001b[Kloading comparison matrix from compare_all.mat...\n", @@ -330,7 +393,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABEwAAAMgCAYAAAA5kPcVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzs3XuQVfWdLu53d9MNNHhJxAsQ0BATbyRhkohHDWImwdscfo6aRGMVXio6Xo8aLzGeMYOmvSRjdMyceKlkJMRyDqMYT5hTGGXUMIAX0FQ6J6PjheMAKSeAHANNAEGa/v1BQmSpDa27Wd3L50mtyu69Vy/eTtUim7e/+/updXZ2dgYAAACALRrKDgAAAADQ2yhMAAAAAAoUJgAAAAAFChMAAACAAoUJAAAAQIHCBAAAAKBAYQIAAABQoDABAAAAKFCYAAAAABQoTAAAAAAKFCYAAAAABQoTAAAAgAKFCQAAAECBwgQAAACgQGECAAAAUKAwAQAAAChQmAAAAAAUKEwAAAAAChQmAAAAAAUKEwAAAIAChQkAAABAgcIEAAAAoEBhAgAAAFCgMAEAAAAoUJgAAAAAFChMAAAAAAoUJgAAAAAFChMAAACAAoUJAAAAQIHCBAAAAKBAYQIAAABQoDABAAAAKFCYAAAAABQoTAAAAAAKFCYAAAAABQoTAAAAgAKFCQAAAECBwgQAAACgQGECAAAAUKAwAQAAAChQmAAAAAAUKEwAAAAAChQmAAAAAAUKEwAAAIAChQkAAABAgcIEAAAAoEBhAgAAAFCgMAEAAAAoUJgAAAAAFChMAAAAAAoUJgAAAAAFChMAAACAAoUJAAAAQIHCBAAAAKBAYQIAAABQoDABAAAAKFCYAAAAABQoTAAAAAAKFCYAAAAABQoTAAAAgAKFCQAAAECBwgQAAACgQGECAAAAUKAwAQAAAChQmAAAAAAUKEwAAAAAChQmAAAAAAUKEwAAAIAChQkAAABAgcIEAAAAoEBhAgAAAFCgMAEAAAAoUJgAAAAAFChMAAAAAAoUJgAAAAAFChMAAACAAoUJAAAAQIHCBAAAAKBAYQIAAABQoDABAAAAKFCYAAAAABQoTAAAAAAKFCYAAAAABQoTAAAAgAKFCQAAAECBwgQAAACgQGECAAAAUKAwAQAAAChQmAAAAAAUKEwAAAAAChQmAAAAAAUKEwAAAIAChQkAAABAgcIEAAAAoEBhAgAAAFCgMAEAAAAoUJgAAAAAFChMAAAAAAoUJgAAAAAFChMAAACAAoUJAAAAQIHCBAAAAKBAYQIAAABQoDABAAAAKFCYAAAAABQoTAAAAAAKFCYAAAAABQoTAAAAgAKFCQAAAECBwgQAAACgQGECAAAAUKAwAQAAAChQmAAAAAAUKEwAAAAAChQmAAAAAAUKEwAAAIAChQkAAABAgcIEAAAAoEBhAgAAAFCgMAEAAAAoUJgAAAAAFChMAAAAAAoUJgAAAAAFChMAAACAAoUJAAAAQIHCBAAAAKBAYQIAAABQoDABAAAAKFCYAAAAABQoTAAAAAAKFCYAAAAABQoTAAAAgAKFCQAAAECBwgQAAACgQGECAAAAUKAwAQAAAChQmAAAAAAUKEwAAAAAChQmAAAAAAUKEwAAAIAChQkAAABAgcIEAAAAoEBhAgAAAFCgMAEAAAAoUJgAAAAAFChMAAAAAAoUJgAAAAAFChMAAACAAoUJAAAAQIHCBAAAAKBAYQIAAABQoDABAAAAKFCYAAAAABQoTAAAAAAKFCYAAAAABQoTAAAAgAKFCQAAAECBwgQAAACgQGECAAAAUKAwAQAAAChQmAAAAAAUKEwAAAAAChQmAAAAAAUKEwAAAIAChQkAAABAgcIEAAAAoEBhAgAAAFCgMAEAAAAoUJgAAAAAFChMAAAAAAoUJgAAAAAFChMAAACAAoUJAAAAQIHCBAAAAKBAYQIAAABQoDABAAAAKFCYAAAAABQoTAAAAAAKFCYAAAAABQoTAAAAgAKFCQAAAECBwgQAAACgQGECAAAAUKAwAQAAAChQmAAAAAAUKEwAAAAAChQmAAAAAAUKEwAAAIAChQkAAABAgcIEAAAAoEBhAgAAAFCgMAEAAAAoUJgAAAAAFChMAAAAAAoUJgAAAAAFChMAAACAAoUJAAAAQIHCBAAAAKBAYQIAAABQoDABAAAAKFCYAAAAABQoTAAAAAAKFCYAAAAABQoTAAAAgAKFCQAAAECBwgQAAACgQGECAAAAUKAwAQAAAChQmAAAAAAUKEwAAAAAChQmAAAAAAUKEwAAAIAChQkAAABAgcIEAAAAoEBhAgAAAFCgMAEAAAAoUJgAAAAAFChMAAAAAAoUJgAAAAAFChMAAACAAoUJ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E5k4cWI2bNiQa681dQAAiCk5UEEKE4Dt9MwzzyRJDjvssMydO7fkNAAAQE9SmAB0YdGiRTn44INz0EEHJUmmT5+ec889NytWrMjrr7+em266KUcccUTJKQGouoEjJ3f5+rolVjyWzpQcqByFScUYKwzb1t17ZPz48bn//vu3fD1t2rQ0Nzdn0aJFOeuss/LII4/UOSEAAFA2hUnFGCsM9ff4449n3LhxGTduXK6//vo0NzcnSVavXp3Ro0eXnA4A6BVMyYHKaSg7AO+dscLQc4YOHZqFCxdmzpw5Wb58eR544IEkyRFHHJEJEybkuOOOKzkhAADQE6wwqQBjhaF7ujNWuH///unfv3+S5MQTT8xTTz2Vk046KXPmzMmSJUty/PHH56ijjurBtABAn2BKDlSOwqRijBWGbevOWOHVq1dnp512SpLMnTs3+++/f9544400NTVl8ODBGTx4cA+lBAAAyqQwAejCvHnzcvXVV6elpSUf/vCH89d//deZMGFCkqSjoyM33HBDyQkBgF7BHiZQOQoTgC4ccMABWbJkSQ466KAsWbIk69aty8SJE/PAAw9k8ODB2XfffcuOCEAFGBvc93Wmls46jgLu1JhA6Wz6CrAN48ePz+zZszN79ux0dHRk5syZmTdvXlpbW9Pa2lp2PAAAoAdYYVIxa9ZsPoB31t175M1jhY8//vgcdNBBqdVq+dSnPpWvfvWrPRMSAOhbesGmr7fddltuuummLF26NJ/85CfzP/7H/8jYsWPf8fxbb701d9xxR5YsWZIhQ4bki1/8Ym688cYMGDDgvSSHylCYVMyoUWUngGr541jhlpaWnH322Vm0aFGeeeaZrF+/Pj//+c/z2muvlR0RACD33ntvLr300tx555055JBDcuutt+boo4/OCy+8kD3eZozm//yf/zPf+MY3MmXKlBx22GF58cUXc8YZZ6RWq+WWW24p4SeA3sdHciqgpaXsBFBd/fv3z6BBg1Kr1XLiiSfm2WefzXnnnZejjjoqP/vZz7L//vuXHREA6A1qPXB0wy233JKzzz47Z555Zg488MDceeedaWlpyZQpU972/CeeeCKHH354Tj311Oyzzz456qij8pWvfCULFizo5g8O1WWFSQW8eW+pZcuMFYZtaW9Phg3bvnOLY4UPOOCAnHbaaTnttNMye/bsDBkypAeTAgDvd+3t7Vt93b9///Tv33+r5zZs2JBf/OIXueqqq7Y819DQkC984Qt58skn3/a6hx12WO65554sWLAgY8eOzcsvv5wHH3wwkyZNqv8PAX2UwqRiBg1SmMC2dHRs/7nFscKtra055ZRTsnz58uy999657bbbei4oANB31Gpb/yazHtdLMmLEiK2enjx5cq655pqtnluxYkU6Ojqy5557bvX8nnvumeeff/5tL3/qqadmxYoV+exnP5vOzs5s3Lgx5557bv77f//v9fsZoI9TmAB04dhjj82xxx671XP/9E//VFIaAOD95je/+U123nnnLV8XV5e8W7Nnz84NN9yQ22+/PYccckgWLlyYiy++OK2trfnmN79Zlz8D+jqFCUAXFi1alIMPPjgHHXRQkmT69OlZv359zj///KxevTpHHHFErr322pJTAtAXDBw5+R1fW7fE/5f0eT00JWfnnXfeqjB5O0OGDEljY2OWLVu21fPLli3LXnvt9bbf881vfjOTJk3KWWedlST5+Mc/njVr1uSv/uqv8td//ddpaLDdJShMKsZIYdi27t4n48ePz/3337/l66985Su54447Mnz48DonAwDovubm5nz605/Oo48+mr/8y79MkmzatCmPPvpoLrzwwrf9nrVr176lFGlsbEySdHZ29mxg6CMUJhXw5r/PCh9bBOrg8ccfz7hx4zJu3Lhce+21WbRoUS677LIsX7481113XQ477LCyIwIAZXsXk222eb1uuPTSS3P66afnM5/5TMaOHZtbb701a9asyZlnnpkkOe200zJ8+PDceOONSZKJEyfmlltuyZ/92Z9t+UjON7/5zUycOHFLcQLvdwqTCli7tuwEUF1Dhw7NwoUL09LSkrPPPjv33Xdf2tracu+996a5uTkTJ07M008/XXZMAOB97uSTT86rr76av/mbv8nSpUszZsyYPPTQQ1s2gl2yZMlWK0quvvrq1Gq1XH311XnllVey++67Z+LEibn++uvL+hGg11GYVMzLLyd77FF2CujdujNW+M2j+0488cT8/Oc/z7777puRI0cmSZqamrJx48b06+evUwB4X+uhKTndceGFF77jR3Bmz5691df9+vXL5MmTM3nyO++tA+933uFXjLHCsG3dGSu8evXq7LTTTkmSuXPn5uMf/3iefvrprFy5Mk1NTVm/fr2yBAAAKsi7fIAuzJs3L1dffXVaWlry4Q9/OK2trdl3330zceLEbNiwwYQcAGCzXrDCBKgvhUkFvHnihyk5UF+77bZbmpubU6vV8sYbb6SzszOvvPJKOjo6Mnjw4IwZM6bsiAD0El2NDU6MDq68hj8c9bweUCq3IUAXRowYkcceeyxz5szJPvvskxkzZuSWW27J7Nmz861vfSutra1lRwQAAHqAFSYVs3atVSawLd25R4YOHbrlcXNzc1544YUccMABaW5uzuGHH57LL7+8BxICAH1OLXX+SE79LgW8OwqTihk9uuwEUE2LFy/OrFmz8u1vfzuvvvrqluc7urM50BhWAAAgAElEQVSDLAAA0GcoTCqgpaXsBFBt7e3tmTRpUqZOnZqOjo60t7dvea2xsbHEZABAr1FLfVeFWGECpVOYVMCbV/69/HKyxx7lZYG+oL09GTZs+87duHFjTjnllEyePDn77bdf3njjjfz7v/97NmzYkGeeeSaf+MQnejYsAABQCoVJBRT3Yxg0qJwc0Fd051M006ZNy/z589Pa2prW1tacd955ueSSS3LkkUdmwIAB+fGPf9xzQQGAPqOzoZbOhvotC6nntYB3R2EC0IVJkyZl0qRJb3n+5JNPLiENAACwoyhMKmDt2rd/DNTH7Nmz09ramk2bNuWiiy7K/Pnzc/fdd+fUU0/Nd7/73bLjAbCDDBw5ucvX1y25dgcloVeq1eo8JccKEyibwqRijBWGbevOPbJu3brcfPPN+dnPfpbm5uYkyaGHHpqjjz46M2fO7KGEAABA2RQmFTN2bNkJoFqefPLJDBw4MBMnTkxLS0vuuOOO7LXXXnn++efLjgYA9Cam5EDlNJQdgPdu4MCyE0B1LVu2LAsXLsz//t//O2effXauueaasiMBAAA7gBUmFbBu3Z8eL1iQHHhgeVmgL+jOWOFdd901hx9+eJqbm/P5z38+N954Y8+GAwD6plotqedkG3uYQOkUJhXT0mKsMGxLd8YKH3zwwbn55pvT2dmZtra2jBo1queCAQAAvYbCBKALQ4YMyQknnJDx48enVqtlypQp+d73vpe77747K1asyCuvvJJp06aVHRMAKJspOVA5ChOALmzatClPP/10Ojs7s2nTprzxxhu5+OKLc/HFF5cdDYA6MzaY98Smr1A5Nn0F6EJbW1vWr1+fuXPn5sYbb8wtt9xSdiQAAGAHsMKkYtauTdasKTsF9G7duUc+9KEPpbOzM52dnfnd736XIUOG9FwwAKDvaqjzpq/1vBbwrihMKmbs2LITQLUMGTIkTU1N2X///fP666/n8ccfLzsSAACwA/hITgV0dpadAKpr1qxZ6devX1544YX85Cc/yWWXXVZ2JACgN/rjCpN6HkCprDCpgDdvoL1gQXLggeVlgb6gvT0ZNmz7zu3s7Mxuu+2WZPNqk1WrVvVgMgAAoLdQmFRMS0syaFDZKaB36+jY/nMnTJiQqVOnZvz48Vm/fr1NXwGAt9VZ23zU83pAuRQmAF3o169f7r333rJjAAAAO5jCBKALy5YtywknnJCmpqY0NjbmH//xHzN79ux873vfy4ABA3L77bfnQJ+DA+gzBo6c/I6vrVty7Q5MQuWYkgOVozCpGGOFYdu6c48MGTIk8+bNS0NDQ6ZOnZof/OAHmTFjRubPn5/ly5fnggsuyE9/+tOeCwsAAJRCYVIxxgpDfTU2Nm55vHr16uy///555pln0tTUlOHDh+f5558vMR0A0GvUaltPY6jH9YBSGStcAcYKQ89qa2vLIYccku9///v5L//lv+Q3v/lNVq1alWeffTYLFy7MG2+8UXZEAACgzqwwqQBjhaF7ujNWOEnGjBmT+fPn57777suNN96Yb3/72zn++OOz995755BDDklTU1PPhQUA+gZ7mEDlKEwqxlhh2LbujBXesGFDmpubkyS77LJLWlpacswxx+SYY47Jiy++aMwwAABUlMIEoAttbW25/PLL09jYmAEDBmTKlCm55JJL8n/+z//JBz/4wdx5551lRwQAeoOG1HfDA5snQOkUJhWwdu3bPwbeu7Fjx+Zb3/pWWltb8/rrr+epp57KrbfeWnYsAN5BV2ODE6OD6UE2fYXKUZgAdGHdunW5+eab87Of/WzLR3MAAIDqU5hUzLp1yZo1ZaeA3q0798iTTz6ZgQMHZuLEiWlpackdd9yRvfbaq+fCAQB9k01foXIUJhUzfnzZCaBali1bloULF+app57KI488kmuuuca+JQAA8D5gK6EK2G23shNAde266645/PDD09zcnM9//vN59tlny44EAPRCnamls1bHI1aYQNmsMKmAN+8H9W//luyzT2lRoE9ob0+GDdu+cw8++ODcfPPN6ezsTFtbW0aNGtWz4QAAgF5BYVIxLS3JoEFlp4De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+fNz33335frrr097e/uW1zZu3KgsAQBMFYYKUphUwJvHCi9YkBx4YHlZoC9ob0+GDdu+c9+8emSXXXbJ4MGDs3HjxqxcuTKrV6/OBz/4wR5MCgAAlEVhUjEtLcmgQWWngN6to2P7z21ra8vll1+exsbGDBgwIFOmTMlLL72U4447LrVaLbfffnvPBQUA+gwrTKB66rktEUDljB07NnPmzMnPf/7z/OxnP8vQoUNzxBFH5Iknnsjjjz+eT37yk2VHBABIktx2223ZZ599MmDAgBxyyCFZsGBBl+evXLkyF1xwQYYOHZr+/fvnYx/7mOl/8CZWmABsh2nTpuWiiy7Kq6++WnYUgLoYOHJyl6+vW3Ltu752reZ3crz/1Gq11Oq4LKS717r33ntz6aWX5s4778whhxySW2+9NUcffXReeOGF7LHHHm85f8OGDZkwYUL22GOP3H///Rk+fHgWL16cXXfdtV4/AvR5CpOKWbvWWGHYlu7eIx0dHZk+fXpGjBjRM4EAAN6jW265JWeffXbOPPPMJMmdd96ZmTNnZsqUKfnGN77xlvOnTJmS1157LU888USampqSJPvss8+OjAy9nsKkYsaOLTsBVM+0adPypS99KTfffHPZUQCAXqrMPUw2bNiQX/ziF7nqqqu2PNfQ0JAvfOELefLJJ9/2e/75n/85hx56aC644ILMmDEju+++e0499dRceeWVaWxsfK/xoRKsl6yAgQPLTgDV1dHRkfvuuy8nn3xy2VEAgPeh9vb2rY7169e/5ZwVK1ako6Mje+6551bP77nnnlm6dOnbXvfll1/O/fffn46Ojjz44IP55je/mZtvvjnXXXddj/wc0BdZYVIB69b96bGxwrBt3RkrfM899+TLX/5yGhr0ywDAO+upFSbFjwRPnjw511xzzXu+/qZNm7LHHnvkBz/4QRobG/PpT386r7zySm666aZMntz1HkfwfqEwqRhjhWHbujNW+Lnnnssvf/nL3HPPPXnppZdy0UUX5e///u97LhwAwJv85je/yc4777zl6/79+7/lnCFDhqSxsTHLli3b6vlly5Zlr732etvrDh06NE1NTVt9/OaAAw7I0qVLs2HDhjQ3N9fpJ4C+y69MAbrwne98J7NmzcpDDz2Uj370o8oSAODtNSS1Oh5//JfazjvvvNXxdoVJc3NzPv3pT+fRRx/d8tym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79a2bduUlpZmOBUAAID0/PPPa+rUqbr77rvVq1cvrVixQi6XS6tWrbrk+a+99pruv/9+9e3bVz169NDLL7+s6upqbd26tZmTA5GLFSYA0IiioiLl5eWpurpaM2bM0NatW3Xo0CF5PB7NmjVLEydONB2xRaqq/keDr7fuOr/B1ytPzwtlHABACxfqfUcuXqvu3mmSFBcXp7i4uHrPeb1effDBB5o9e3btcw6HQzfddJP27NnTpJ/n8Xj09ddfq127dt8pN2AnFCY25vezhwlwKcGMFa6srNTChQu1adMmOZ1OSdKtt94qp9Op8vJyZWZmUpgAAICwCVzNmpubq7lz59Z77osvvpDP51PHgPGYHTt21Mcff9yknzNr1iylpKTopptu+k55ATuhMLEpv18aNkzavdt0EiC67dmzRwkJCbrtttvkcrn00ksvqVOnTpJqPonp1auX4YQAACAShGuFyaeffqo2bdrUPh+4uiQUnn76ab3xxhsqKipSfHx8yK8PRCv2MLEpj4eyBAiFsrIyHTt2TH/84x81derU2k90Jk+erOuvv16jR482GxAAANhamzZt6h2XKkySk5MVExOjsrKyes+XlZXVftBzOc8995yefvppbd68mel/QABWmLQAZWVMywHqCmascNu2bTV06FA5nU795Cc/0fz5NftivPHGG/ryyy81aNAg5eTkyOGgfwYAoCVzWDVHKK/XVE6nUzfccIO2bt2qO+64Q5JqN3CdPn36Zb/vmWee0VNPPaU///nP6t+//3eNDNgOhYnNVFR8c1yUmEhhAtQVzFjhAQMGaOHChfL7/SopKVFGRobOnz+vuLg4uVwutW7dmrIEAAAY9/DDD+uuu+5S//79NXDgQC1evFgVFRW6++67JUlTpkxRampq7Yc/CxYs0JNPPqnXX39dXbt2VWlpqSSpVatWatWqlbE/BxBJKExsoG45kpFhLgdgR8nJyRo3bpyysrJkWZZWrVql7OxsnT17Vl6vV48//rjpiAAAIAKEaw+TpsrOztaZM2f05JNPqrS0VH379tW7775buxHs6dOn633I89JLL8nr9X5r8/pLbSoLtFQUJjbgcplOANhb7969FRsbq+rqav3P//yPfD6fqqqq5HA4lJ6ebjpei9XY2ODyk7MbfB0AgJCy/LIsf0ivF6zp06df9hacoqKiel+fPHnyCkIB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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAABEwAAAMgCAYAAAA5kPcVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB29UlEQVR4nOzdfXhU9b3u/3tN5iEZAkExQgyPgiAEPVqjv0KMUQoIFLAVFKkXltYHELq5EIEqcgQMyAGK5PQIKFVgU5TyoCClVAhKCAbcAg3bKj1uYAvhuEHQrU5oQiaZzO8PJJIFTDIwkzWz8n71mmtPZlZWbna60syd73w/RjAYDAoAAAAAAAA1HFYHAAAAAAAAiDUUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAAAAAAACYUJgAA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\n", "text/plain": [ "" ] @@ -361,14 +424,80 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", "\n", "\u001b[Kloading 64 files into SBT\n", - "\u001b[Kreading from big_genomes/9.fa.sig (63 signatures so far))\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/0.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/1.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/10.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/11.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/12.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/13.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/14.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/15.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/16.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/17.fa.sig'10 sigs total\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/18.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/19.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/2.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/20.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/21.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/22.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/23.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/24.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/25.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/26.fa.sig'20 sigs total\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/27.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/28.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/29.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/3.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/30.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/31.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/32.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/33.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/34.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/35.fa.sig'30 sigs total\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/36.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/37.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/38.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/39.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/4.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/40.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/41.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/42.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/43.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/44.fa.sig'40 sigs total\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/45.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/46.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/47.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/48.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/49.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/5.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/50.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/51.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/52.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/53.fa.sig'50 sigs total\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/54.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/55.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/56.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/57.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/58.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/59.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/6.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/60.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/61.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/62.fa.sig'60 sigs total\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/63.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/7.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/8.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'big_genomes/9.fa.sig'g'\n", + "\u001b[K\n", "\u001b[Kloaded 64 sigs; saving SBT under \"all-genomes\"\n", - "\u001b[K127 of 127 nodes saved\n", - "Finished saving nodes, now saving SBT json file.\n" + "\u001b[KFinished saving nodes, now saving SBT index file.\n", + "\u001b[KFinished saving SBT index, available at /Users/t/dev/sourmash/doc/all-genomes.sbt.zip\n", + "\n" ] } ], @@ -392,18 +521,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", - "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", - "\n", - "\u001b[Kselecting default query k=31.\n", - "\u001b[Kloaded query: NC_009665.1 Shewanella baltica... (k=31, DNA)\n", - "\u001b[Kloaded 1 databases. \n", - "\n", - "2 matches:\n", - "similarity match\n", - "---------- -----\n", - " 9.5% NC_009665.1 Shewanella baltica OS185, complete genome\n", - " 4.4% NC_011663.1 Shewanella baltica OS223, complete genome\n" + "\r", + "\u001b[K\r\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\r\n", + "\r", + "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\r\n", + "\r\n", + "\r", + "\u001b[KCannot open file 'shew_os185.fa.sig'\r\n" ] } ], @@ -420,30 +545,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "\r", - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\r\n", - "\r", - "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\r\n", - "\r\n", - "\r", - "\u001b[Ksetting num_hashes to 0 because --scaled is set\r\n", - "\r", - "\u001b[Kcomputing signatures for files: fake-metagenome.fa\r\n", - "\r", - "\u001b[KComputing signature for ksizes: [31]\r\n", - "\r", - "\u001b[KComputing only nucleotide (and not protein) signatures.\r\n", - "\r", - "\u001b[KComputing a total of 1 signature(s).\r\n", - "\r", - "\u001b[Kskipping fake-metagenome.fa - already done\r\n" + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", + "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", + "\n", + "\u001b[Kcomputing signatures for files: fake-metagenome.fa\n", + "\u001b[KComputing a total of 1 signature(s).\n", + "\u001b[K... reading sequences from fake-metagenome.fa\n", + "\u001b[Kcalculated 1 signatures for 3 sequences in fake-metagenome.fa\n", + "\u001b[Ksaved signature(s) to fake-metagenome.fa.sig. Note: signature license is CC0.\n" ] } ], "source": [ "# (make fake metagenome again, just in case)\n", "!cat genomes/*.fa > fake-metagenome.fa\n", - "!sourmash compute -k 31 --scaled=1000 fake-metagenome.fa" + "!rm -f fake-metagenome.fa.sig\n", + "!sourmash sketch dna -p k=31,scaled=1000 fake-metagenome.fa" ] }, { @@ -455,7 +573,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", "\n", "\u001b[Kselect query k=31 automatically.\n", @@ -593,331 +712,6 @@ " Pyrococcus furiosus DSM 3638\n", " \n", " \n", - " 5\n", - " AE009951\n", - " 190304\n", - " Bacteria\n", - " Fusobacteria\n", - " Fusobacteriia\n", - " Fusobacteriales\n", - " Fusobacteriaceae\n", - " Fusobacterium\n", - " Fusobacterium nucleatum\n", - " NaN\n", - " \n", - " \n", - " 6\n", - " AE010299\n", - " 188937\n", - " Archaea\n", - " Euryarchaeota\n", - " Methanomicrobia\n", - " Methanosarcinales\n", - " Methanosarcinaceae\n", - " Methanosarcina\n", - " Methanosarcina acetivorans\n", - " Methanosarcina acetivorans C2A\n", - " \n", - " \n", - " 7\n", - " AE009439\n", - " 190192\n", - " Archaea\n", - " Euryarchaeota\n", - " Methanopyri\n", - " Methanopyrales\n", - " Methanopyraceae\n", - " Methanopyrus\n", - " Methanopyrus kandleri\n", - " Methanopyrus kandleri AV19\n", - " \n", - " \n", - " 8\n", - " NC_003911\n", - " 246200\n", - " Bacteria\n", - " Proteobacteria\n", - " Alphaproteobacteria\n", - " Rhodobacterales\n", - " Rhodobacteraceae\n", - " Ruegeria\n", - " Ruegeria pomeroyi\n", - " Ruegeria pomeroyi DSS-3\n", - " \n", - " \n", - " 9\n", - " AE006470\n", - " 194439\n", - " Bacteria\n", - " Chlorobi\n", - " Chlorobia\n", - " Chlorobiales\n", - " Chlorobiaceae\n", - " Chlorobaculum\n", - " Chlorobaculum tepidum\n", - " Chlorobaculum tepidum TLS\n", - " \n", - " \n", - " 10\n", - " AE015928\n", - " 226186\n", - " Bacteria\n", - " Bacteroidetes\n", - " Bacteroidia\n", - " Bacteroidales\n", - " Bacteroidaceae\n", - " Bacteroides\n", - " Bacteroides thetaiotaomicron\n", - " Bacteroides thetaiotaomicron VPI-5482\n", - " \n", - " \n", - " 11\n", - " AL954747\n", - " 228410\n", - " Bacteria\n", - " Proteobacteria\n", - " Betaproteobacteria\n", - " Nitrosomonadales\n", - " Nitrosomonadaceae\n", - " Nitrosomonas\n", - " Nitrosomonas europaea\n", - " Nitrosomonas europaea ATCC 19718\n", - " \n", - " \n", - " 12\n", - " BX119912\n", - " 243090\n", - " Bacteria\n", - " Planctomycetes\n", - " Planctomycetia\n", - " Planctomycetales\n", - " Planctomycetaceae\n", - " Rhodopirellula\n", - " Rhodopirellula baltica\n", - " Rhodopirellula baltica SH 1\n", - " \n", - " \n", - " 13\n", - " BX571656\n", - " 273121\n", - " Bacteria\n", - " Proteobacteria\n", - " Epsilonproteobacteria\n", - " Campylobacterales\n", - " Helicobacteraceae\n", - " Wolinella\n", - " Wolinella succinogenes\n", - " Wolinella succinogenes DSM 1740\n", - " \n", - " \n", - " 14\n", - " AE017180\n", - " 243231\n", - " Bacteria\n", - " Proteobacteria\n", - " Deltaproteobacteria\n", - " Desulfuromonadales\n", - " Geobacteraceae\n", - " Geobacter\n", - " Geobacter sulfurreducens\n", - " Geobacter sulfurreducens PCA\n", - " \n", - " \n", - " 15\n", - " AE017226\n", - " 243275\n", - " Bacteria\n", - " Spirochaetes\n", - " Spirochaetia\n", - " Spirochaetales\n", - " Spirochaetaceae\n", - " Treponema\n", - " Treponema denticola\n", - " Treponema denticola ATCC 35405\n", - " \n", - " \n", - " 16\n", - " BX950229\n", - " 267377\n", - " Archaea\n", - " Euryarchaeota\n", - " Methanococci\n", - " Methanococcales\n", - " Methanococcaceae\n", - " Methanococcus\n", - " Methanococcus maripaludis\n", - " Methanococcus maripaludis S2\n", - " \n", - " \n", - " 17\n", - " AE017221\n", - " 262724\n", - " Bacteria\n", - " Deinococcus-Thermus\n", - " Deinococci\n", - " Thermales\n", - " Thermaceae\n", - " Thermus\n", - " Thermus thermophilus\n", - " Thermus thermophilus HB27\n", - " \n", - " \n", - " 18\n", - " BA000001\n", - " 70601\n", - " Archaea\n", - " Euryarchaeota\n", - " Thermococci\n", - " Thermococcales\n", - " Thermococcaceae\n", - " Pyrococcus\n", - " Pyrococcus horikoshii\n", - " Pyrococcus horikoshii OT3\n", - " \n", - " \n", - " 19\n", - " BA000023\n", - " 273063\n", - " Archaea\n", - " Crenarchaeota\n", - " Thermoprotei\n", - " Sulfolobales\n", - " Sulfolobaceae\n", - " Sulfolobus\n", - " Sulfolobus tokodaii\n", - " Sulfolobus tokodaii str. 7\n", - " \n", - " \n", - " 20\n", - " NC_007951\n", - " 266265\n", - " Bacteria\n", - " Proteobacteria\n", - " Betaproteobacteria\n", - " Burkholderiales\n", - " Burkholderiaceae\n", - " Paraburkholderia\n", - " Paraburkholderia xenovorans\n", - " Paraburkholderia xenovorans LB400\n", - " \n", - " \n", - " 21\n", - " CP000492\n", - " 290317\n", - " Bacteria\n", - " Chlorobi\n", - " Chlorobia\n", - " Chlorobiales\n", - " Chlorobiaceae\n", - " Chlorobium\n", - " Chlorobium phaeobacteroides\n", - " Chlorobium phaeobacteroides DSM 266\n", - " \n", - " \n", - " 22\n", - " NC_008751\n", - " 391774\n", - " Bacteria\n", - " Proteobacteria\n", - " Deltaproteobacteria\n", - " Desulfovibrionales\n", - " Desulfovibrionaceae\n", - " Desulfovibrio\n", - " Desulfovibrio vulgaris\n", - " Desulfovibrio vulgaris DP4\n", - " \n", - " \n", - " 23\n", - " CP000568\n", - " 203119\n", - " Bacteria\n", - " Firmicutes\n", - " Clostridia\n", - " Clostridiales\n", - " Ruminococcaceae\n", - " Ruminiclostridium\n", - " Ruminiclostridium thermocellum\n", - " Ruminiclostridium thermocellum ATCC 27405\n", - " \n", - " \n", - " 24\n", - " CP000561\n", - " 410359\n", - " Archaea\n", - " Crenarchaeota\n", - " Thermoprotei\n", - " Thermoproteales\n", - " Thermoproteaceae\n", - " Pyrobaculum\n", - " Pyrobaculum calidifontis\n", - " Pyrobaculum calidifontis JCM 11548\n", - " \n", - " \n", - " 25\n", - " CP000609\n", - " 402880\n", - " Archaea\n", - " Euryarchaeota\n", - " Methanococci\n", - " Methanococcales\n", - " Methanococcaceae\n", - " Methanococcus\n", - " Methanococcus maripaludis\n", - " Methanococcus maripaludis C5\n", - " \n", - " \n", - " 26\n", - " CP000607\n", - " 290318\n", - " Bacteria\n", - " Chlorobi\n", - " Chlorobia\n", - " Chlorobiales\n", - " Chlorobiaceae\n", - " Chlorobium\n", - " Chlorobium phaeovibrioides\n", - " Chlorobium phaeovibrioides DSM 265\n", - " \n", - " \n", - " 27\n", - " CP000660\n", - " 340102\n", - " Archaea\n", - " Crenarchaeota\n", - " Thermoprotei\n", - " Thermoproteales\n", - " Thermoproteaceae\n", - " Pyrobaculum\n", - " Pyrobaculum arsenaticum\n", - " Pyrobaculum arsenaticum DSM 13514\n", - " \n", - " \n", - " 28\n", - " CP000667\n", - " 369723\n", - " Bacteria\n", - " Actinobacteria\n", - " Actinobacteria\n", - " Micromonosporales\n", - " Micromonosporaceae\n", - " Salinispora\n", - " Salinispora tropica\n", - " Salinispora tropica CNB-440\n", - " \n", - " \n", - " 29\n", - " CP000679\n", - " 351627\n", - " Bacteria\n", - " Firmicutes\n", - " Clostridia\n", - " Thermoanaerobacterales\n", - " Thermoanaerobacterales Family III. Incertae Sedis\n", - " Caldicellulosiruptor\n", - " Caldicellulosiruptor saccharolyticus\n", - " Caldicellulosiruptor saccharolyticus DSM 8903\n", - " \n", - " \n", " ...\n", " ...\n", " ...\n", @@ -931,331 +725,6 @@ " ...\n", " \n", " \n", - " 34\n", - " CP000850\n", - " 391037\n", - " Bacteria\n", - " Actinobacteria\n", - " Actinobacteria\n", - " Micromonosporales\n", - " Micromonosporaceae\n", - " Salinispora\n", - " Salinispora arenicola\n", - " Salinispora arenicola CNS-205\n", - " \n", - " \n", - " 35\n", - " CP000909\n", - " 324602\n", - " Bacteria\n", - " Chloroflexi\n", - " Chloroflexia\n", - " Chloroflexales\n", - " Chloroflexaceae\n", - " Chloroflexus\n", - " Chloroflexus aurantiacus\n", - " Chloroflexus aurantiacus J-10-fl\n", - " \n", - " \n", - " 36\n", - " CP000924\n", - " 340099\n", - " Bacteria\n", - " Firmicutes\n", - " Clostridia\n", - " Thermoanaerobacterales\n", - " Thermoanaerobacteraceae\n", - " Thermoanaerobacter\n", - " Thermoanaerobacter pseudethanolicus\n", - " Thermoanaerobacter pseudethanolicus ATCC 33223\n", - " \n", - " \n", - " 37\n", - " CP000969\n", - " 126740\n", - " Bacteria\n", - " Thermotogae\n", - " Thermotogae\n", - " Thermotogales\n", - " Thermotogaceae\n", - " Thermotoga\n", - " Thermotoga sp. RQ2\n", - " NaN\n", - " \n", - " \n", - " 38\n", - " CP001013\n", - " 395495\n", - " Bacteria\n", - " Proteobacteria\n", - " Betaproteobacteria\n", - " Burkholderiales\n", - " NaN\n", - " Leptothrix\n", - " Leptothrix cholodnii\n", - " Leptothrix cholodnii SP-6\n", - " \n", - " \n", - " 39\n", - " CP001071\n", - " 349741\n", - " Bacteria\n", - " Verrucomicrobia\n", - " Verrucomicrobiae\n", - " Verrucomicrobiales\n", - " Akkermansiaceae\n", - " Akkermansia\n", - " Akkermansia muciniphila\n", - " Akkermansia muciniphila ATCC BAA-835\n", - " \n", - " \n", - " 40\n", - " AP009380\n", - " 431947\n", - " Bacteria\n", - " Bacteroidetes\n", - " Bacteroidia\n", - " Bacteroidales\n", - " Porphyromonadaceae\n", - " Porphyromonas\n", - " Porphyromonas gingivalis\n", - " Porphyromonas gingivalis ATCC 33277\n", - " \n", - " \n", - " 41\n", - " NC_010730\n", - " 436114\n", - " Bacteria\n", - " Aquificae\n", - " Aquificae\n", - " Aquificales\n", - " Hydrogenothermaceae\n", - " Sulfurihydrogenibium\n", - " Sulfurihydrogenibium sp. YO3AOP1\n", - " NaN\n", - " \n", - " \n", - " 42\n", - " CP001097\n", - " 290315\n", - " Bacteria\n", - " Chlorobi\n", - " Chlorobia\n", - " Chlorobiales\n", - " Chlorobiaceae\n", - " Chlorobium\n", - " Chlorobium limicola\n", - " Chlorobium limicola DSM 245\n", - " \n", - " \n", - " 43\n", - " CP001110\n", - " 324925\n", - " Bacteria\n", - " Chlorobi\n", - " Chlorobia\n", - " Chlorobiales\n", - " Chlorobiaceae\n", - " Pelodictyon\n", - " Pelodictyon phaeoclathratiforme\n", - " Pelodictyon phaeoclathratiforme BU-1\n", - " \n", - " \n", - " 44\n", - " CP001130\n", - " 380749\n", - " Bacteria\n", - " Aquificae\n", - " Aquificae\n", - " Aquificales\n", - " Aquificaceae\n", - " Hydrogenobaculum\n", - " Hydrogenobaculum sp. Y04AAS1\n", - " NaN\n", - " \n", - " \n", - " 45\n", - " NZ_CH959311\n", - " 52598\n", - " Bacteria\n", - " Proteobacteria\n", - " Alphaproteobacteria\n", - " Rhodobacterales\n", - " Rhodobacteraceae\n", - " Sulfitobacter\n", - " Sulfitobacter sp. EE-36\n", - " NaN\n", - " \n", - " \n", - " 46\n", - " NZ_CH959317\n", - " 314267\n", - " Bacteria\n", - " Proteobacteria\n", - " Alphaproteobacteria\n", - " Rhodobacterales\n", - " Rhodobacteraceae\n", - " Sulfitobacter\n", - " Sulfitobacter sp. NAS-14.1\n", - " NaN\n", - " \n", - " \n", - " 47\n", - " CP001251\n", - " 515635\n", - " Bacteria\n", - " Dictyoglomi\n", - " Dictyoglomia\n", - " Dictyoglomales\n", - " Dictyoglomaceae\n", - " Dictyoglomus\n", - " Dictyoglomus turgidum\n", - " Dictyoglomus turgidum DSM 6724\n", - " \n", - " \n", - " 48\n", - " NC_011663\n", - " 407976\n", - " Bacteria\n", - " Proteobacteria\n", - " Gammaproteobacteria\n", - " Alteromonadales\n", - " Shewanellaceae\n", - " Shewanella\n", - " Shewanella baltica\n", - " Shewanella baltica OS223\n", - " \n", - " \n", - " 49\n", - " CP000916\n", - " 309803\n", - " Bacteria\n", - " Thermotogae\n", - " Thermotogae\n", - " Thermotogales\n", - " Thermotogaceae\n", - " Thermotoga\n", - " Thermotoga neapolitana\n", - " Thermotoga neapolitana DSM 4359\n", - " \n", - " \n", - " 50\n", - " NZ_DS996397\n", - " 411464\n", - " Bacteria\n", - " Proteobacteria\n", - " Deltaproteobacteria\n", - " Desulfovibrionales\n", - " Desulfovibrionaceae\n", - " Desulfovibrio\n", - " Desulfovibrio piger\n", - " Desulfovibrio piger ATCC 29098\n", - " \n", - " \n", - " 51\n", - " CP001230\n", - " 123214\n", - " Bacteria\n", - " Aquificae\n", - " Aquificae\n", - " Aquificales\n", - " Hydrogenothermaceae\n", - " Persephonella\n", - " Persephonella marina\n", - " Persephonella marina EX-H1\n", - " \n", - " \n", - " 52\n", - " CP001472\n", - " 240015\n", - " Bacteria\n", - " Acidobacteria\n", - " Acidobacteriia\n", - " Acidobacteriales\n", - " Acidobacteriaceae\n", - " Acidobacterium\n", - " Acidobacterium capsulatum\n", - " Acidobacterium capsulatum ATCC 51196\n", - " \n", - " \n", - " 53\n", - " AP009153\n", - " 379066\n", - " Bacteria\n", - " Gemmatimonadetes\n", - " Gemmatimonadetes\n", - " Gemmatimonadales\n", - " Gemmatimonadaceae\n", - " Gemmatimonas\n", - " Gemmatimonas aurantiaca\n", - " Gemmatimonas aurantiaca T-27\n", - " \n", - " \n", - " 54\n", - " CP001941\n", - " 439481\n", - " Archaea\n", - " Euryarchaeota\n", - " NaN\n", - " NaN\n", - " NaN\n", - " Aciduliprofundum\n", - " Aciduliprofundum boonei\n", - " Aciduliprofundum boonei T469\n", - " \n", - " \n", - " 55\n", - " NC_013968\n", - " 309800\n", - " Archaea\n", - " Euryarchaeota\n", - " Halobacteria\n", - " Haloferacales\n", - " Haloferacaceae\n", - " Haloferax\n", - " Haloferax volcanii\n", - " Haloferax volcanii DS2\n", - " \n", - " \n", - " 56\n", - " NZ_KE136524\n", - " 226185\n", - " Bacteria\n", - " Firmicutes\n", - " Bacilli\n", - " Lactobacillales\n", - " Enterococcaceae\n", - " Enterococcus\n", - " Enterococcus faecalis\n", - " Enterococcus faecalis V583\n", - " \n", - " \n", - " 57\n", - " NZ_KQ961402\n", - " 542\n", - " Bacteria\n", - " Proteobacteria\n", - " Alphaproteobacteria\n", - " Sphingomonadales\n", - " Sphingomonadaceae\n", - " Zymomonas\n", - " Zymomonas mobilis\n", - " NaN\n", - " \n", - " \n", - " 58\n", - " NZ_CP015081\n", - " 243230\n", - " Bacteria\n", - " Deinococcus-Thermus\n", - " Deinococci\n", - " Deinococcales\n", - " Deinococcaceae\n", - " Deinococcus\n", - " Deinococcus radiodurans\n", - " Deinococcus radiodurans R1\n", - " \n", - " \n", " 59\n", " NZ_ABZS01000228\n", " 432331\n", @@ -1326,320 +795,57 @@ "" ], "text/plain": [ - " accession taxid superkingdom phylum \\\n", - "0 AE000782 224325 Archaea Euryarchaeota \n", - "1 NC_000909 243232 Archaea Euryarchaeota \n", - "2 NC_003272 103690 Bacteria Cyanobacteria \n", - "3 AE009441 178306 Archaea Crenarchaeota \n", - "4 AE009950 186497 Archaea Euryarchaeota \n", - "5 AE009951 190304 Bacteria Fusobacteria \n", - "6 AE010299 188937 Archaea Euryarchaeota \n", - "7 AE009439 190192 Archaea Euryarchaeota \n", - "8 NC_003911 246200 Bacteria Proteobacteria \n", - "9 AE006470 194439 Bacteria Chlorobi \n", - "10 AE015928 226186 Bacteria Bacteroidetes \n", - "11 AL954747 228410 Bacteria Proteobacteria \n", - "12 BX119912 243090 Bacteria Planctomycetes \n", - "13 BX571656 273121 Bacteria Proteobacteria \n", - "14 AE017180 243231 Bacteria Proteobacteria \n", - "15 AE017226 243275 Bacteria Spirochaetes \n", - "16 BX950229 267377 Archaea Euryarchaeota \n", - "17 AE017221 262724 Bacteria Deinococcus-Thermus \n", - "18 BA000001 70601 Archaea Euryarchaeota \n", - "19 BA000023 273063 Archaea Crenarchaeota \n", - "20 NC_007951 266265 Bacteria Proteobacteria \n", - "21 CP000492 290317 Bacteria Chlorobi \n", - "22 NC_008751 391774 Bacteria Proteobacteria \n", - "23 CP000568 203119 Bacteria Firmicutes \n", - "24 CP000561 410359 Archaea Crenarchaeota \n", - "25 CP000609 402880 Archaea Euryarchaeota \n", - "26 CP000607 290318 Bacteria Chlorobi \n", - "27 CP000660 340102 Archaea Crenarchaeota \n", - "28 CP000667 369723 Bacteria Actinobacteria \n", - "29 CP000679 351627 Bacteria Firmicutes \n", - ".. ... ... ... ... \n", - "34 CP000850 391037 Bacteria Actinobacteria \n", - "35 CP000909 324602 Bacteria Chloroflexi \n", - "36 CP000924 340099 Bacteria Firmicutes \n", - "37 CP000969 126740 Bacteria Thermotogae \n", - "38 CP001013 395495 Bacteria Proteobacteria \n", - "39 CP001071 349741 Bacteria Verrucomicrobia \n", - "40 AP009380 431947 Bacteria Bacteroidetes \n", - "41 NC_010730 436114 Bacteria Aquificae \n", - "42 CP001097 290315 Bacteria Chlorobi \n", - "43 CP001110 324925 Bacteria Chlorobi \n", - "44 CP001130 380749 Bacteria Aquificae \n", - "45 NZ_CH959311 52598 Bacteria Proteobacteria \n", - "46 NZ_CH959317 314267 Bacteria Proteobacteria \n", - "47 CP001251 515635 Bacteria Dictyoglomi \n", - "48 NC_011663 407976 Bacteria Proteobacteria \n", - "49 CP000916 309803 Bacteria Thermotogae \n", - "50 NZ_DS996397 411464 Bacteria Proteobacteria \n", - "51 CP001230 123214 Bacteria Aquificae \n", - "52 CP001472 240015 Bacteria Acidobacteria \n", - "53 AP009153 379066 Bacteria Gemmatimonadetes \n", - "54 CP001941 439481 Archaea Euryarchaeota \n", - "55 NC_013968 309800 Archaea Euryarchaeota \n", - "56 NZ_KE136524 226185 Bacteria Firmicutes \n", - "57 NZ_KQ961402 542 Bacteria Proteobacteria \n", - "58 NZ_CP015081 243230 Bacteria Deinococcus-Thermus \n", - "59 NZ_ABZS01000228 432331 Bacteria Aquificae \n", - "60 NZ_JGWU01000001 1458259 Bacteria Proteobacteria \n", - "61 NZ_FWDH01000003 31899 Bacteria Firmicutes \n", - "62 NC_009972 316274 Bacteria Chloroflexi \n", - "63 NC_005213 228908 Archaea Nanoarchaeota \n", - "\n", - " class order \\\n", - "0 Archaeoglobi Archaeoglobales \n", - "1 Methanococci Methanococcales \n", - "2 NaN Nostocales \n", - "3 Thermoprotei Thermoproteales \n", - "4 Thermococci Thermococcales \n", - "5 Fusobacteriia Fusobacteriales \n", - "6 Methanomicrobia Methanosarcinales \n", - "7 Methanopyri Methanopyrales \n", - "8 Alphaproteobacteria Rhodobacterales \n", - "9 Chlorobia Chlorobiales \n", - "10 Bacteroidia Bacteroidales \n", - "11 Betaproteobacteria Nitrosomonadales \n", - "12 Planctomycetia Planctomycetales \n", - "13 Epsilonproteobacteria Campylobacterales \n", - "14 Deltaproteobacteria Desulfuromonadales \n", - "15 Spirochaetia Spirochaetales \n", - "16 Methanococci Methanococcales \n", - "17 Deinococci Thermales \n", - "18 Thermococci Thermococcales \n", - "19 Thermoprotei Sulfolobales \n", - "20 Betaproteobacteria Burkholderiales \n", - "21 Chlorobia Chlorobiales \n", - "22 Deltaproteobacteria Desulfovibrionales \n", - "23 Clostridia Clostridiales \n", - "24 Thermoprotei Thermoproteales \n", - "25 Methanococci Methanococcales \n", - "26 Chlorobia Chlorobiales \n", - "27 Thermoprotei Thermoproteales \n", - "28 Actinobacteria Micromonosporales \n", - "29 Clostridia Thermoanaerobacterales \n", - ".. ... ... \n", - "34 Actinobacteria Micromonosporales \n", - "35 Chloroflexia Chloroflexales \n", - "36 Clostridia Thermoanaerobacterales \n", - "37 Thermotogae Thermotogales \n", - "38 Betaproteobacteria Burkholderiales \n", - "39 Verrucomicrobiae Verrucomicrobiales \n", - "40 Bacteroidia Bacteroidales \n", - "41 Aquificae Aquificales \n", - "42 Chlorobia Chlorobiales \n", - "43 Chlorobia Chlorobiales \n", - "44 Aquificae Aquificales \n", - "45 Alphaproteobacteria Rhodobacterales \n", - "46 Alphaproteobacteria Rhodobacterales \n", - "47 Dictyoglomia Dictyoglomales \n", - "48 Gammaproteobacteria Alteromonadales \n", - "49 Thermotogae Thermotogales \n", - "50 Deltaproteobacteria Desulfovibrionales \n", - "51 Aquificae Aquificales \n", - "52 Acidobacteriia Acidobacteriales \n", - "53 Gemmatimonadetes Gemmatimonadales \n", - "54 NaN NaN \n", - "55 Halobacteria Haloferacales \n", - "56 Bacilli Lactobacillales \n", - "57 Alphaproteobacteria Sphingomonadales \n", - "58 Deinococci Deinococcales \n", - "59 Aquificae Aquificales \n", - "60 Betaproteobacteria Burkholderiales \n", - "61 Clostridia Thermoanaerobacterales \n", - "62 Chloroflexia Herpetosiphonales \n", - "63 NaN Nanoarchaeales \n", + " accession taxid superkingdom phylum class \\\n", + "0 AE000782 224325 Archaea Euryarchaeota Archaeoglobi \n", + "1 NC_000909 243232 Archaea Euryarchaeota Methanococci \n", + "2 NC_003272 103690 Bacteria Cyanobacteria NaN \n", + "3 AE009441 178306 Archaea Crenarchaeota Thermoprotei \n", + "4 AE009950 186497 Archaea Euryarchaeota Thermococci \n", + ".. ... ... ... ... ... \n", + "59 NZ_ABZS01000228 432331 Bacteria Aquificae Aquificae \n", + "60 NZ_JGWU01000001 1458259 Bacteria Proteobacteria Betaproteobacteria \n", + "61 NZ_FWDH01000003 31899 Bacteria Firmicutes Clostridia \n", + "62 NC_009972 316274 Bacteria Chloroflexi Chloroflexia \n", + "63 NC_005213 228908 Archaea Nanoarchaeota NaN \n", "\n", - " family genus \\\n", - "0 Archaeoglobaceae Archaeoglobus \n", - "1 Methanocaldococcaceae Methanocaldococcus \n", - "2 Nostocaceae Nostoc \n", - "3 Thermoproteaceae Pyrobaculum \n", - "4 Thermococcaceae Pyrococcus \n", - "5 Fusobacteriaceae Fusobacterium \n", - "6 Methanosarcinaceae Methanosarcina \n", - "7 Methanopyraceae Methanopyrus \n", - "8 Rhodobacteraceae Ruegeria \n", - "9 Chlorobiaceae Chlorobaculum \n", - "10 Bacteroidaceae Bacteroides \n", - "11 Nitrosomonadaceae Nitrosomonas \n", - "12 Planctomycetaceae Rhodopirellula \n", - "13 Helicobacteraceae Wolinella \n", - "14 Geobacteraceae Geobacter \n", - "15 Spirochaetaceae Treponema \n", - "16 Methanococcaceae Methanococcus \n", - "17 Thermaceae Thermus \n", - "18 Thermococcaceae Pyrococcus \n", - "19 Sulfolobaceae Sulfolobus \n", - "20 Burkholderiaceae Paraburkholderia \n", - "21 Chlorobiaceae Chlorobium \n", - "22 Desulfovibrionaceae Desulfovibrio \n", - "23 Ruminococcaceae Ruminiclostridium \n", - "24 Thermoproteaceae Pyrobaculum \n", - "25 Methanococcaceae Methanococcus \n", - "26 Chlorobiaceae Chlorobium \n", - "27 Thermoproteaceae Pyrobaculum \n", - "28 Micromonosporaceae Salinispora \n", - "29 Thermoanaerobacterales Family III. Incertae Sedis Caldicellulosiruptor \n", - ".. ... ... \n", - "34 Micromonosporaceae Salinispora \n", - "35 Chloroflexaceae Chloroflexus \n", - "36 Thermoanaerobacteraceae Thermoanaerobacter \n", - "37 Thermotogaceae Thermotoga \n", - "38 NaN Leptothrix \n", - "39 Akkermansiaceae Akkermansia \n", - "40 Porphyromonadaceae Porphyromonas \n", - "41 Hydrogenothermaceae Sulfurihydrogenibium \n", - "42 Chlorobiaceae Chlorobium \n", - "43 Chlorobiaceae Pelodictyon \n", - "44 Aquificaceae Hydrogenobaculum \n", - "45 Rhodobacteraceae Sulfitobacter \n", - "46 Rhodobacteraceae Sulfitobacter \n", - "47 Dictyoglomaceae Dictyoglomus \n", - "48 Shewanellaceae Shewanella \n", - "49 Thermotogaceae Thermotoga \n", - "50 Desulfovibrionaceae Desulfovibrio \n", - "51 Hydrogenothermaceae Persephonella \n", - "52 Acidobacteriaceae Acidobacterium \n", - "53 Gemmatimonadaceae Gemmatimonas \n", - "54 NaN Aciduliprofundum \n", - "55 Haloferacaceae Haloferax \n", - "56 Enterococcaceae Enterococcus \n", - "57 Sphingomonadaceae Zymomonas \n", - "58 Deinococcaceae Deinococcus \n", - "59 Hydrogenothermaceae Sulfurihydrogenibium \n", - "60 Alcaligenaceae Bordetella \n", - "61 Thermoanaerobacterales Family III. Incertae Sedis Caldicellulosiruptor \n", - "62 Herpetosiphonaceae Herpetosiphon \n", - "63 Nanoarchaeaceae Nanoarchaeum \n", + " order family \\\n", + "0 Archaeoglobales Archaeoglobaceae \n", + "1 Methanococcales Methanocaldococcaceae \n", + "2 Nostocales Nostocaceae \n", + "3 Thermoproteales Thermoproteaceae \n", + "4 Thermococcales Thermococcaceae \n", + ".. ... ... \n", + "59 Aquificales Hydrogenothermaceae \n", + "60 Burkholderiales Alcaligenaceae \n", + "61 Thermoanaerobacterales Thermoanaerobacterales Family III. Incertae Sedis \n", + "62 Herpetosiphonales Herpetosiphonaceae \n", + "63 Nanoarchaeales Nanoarchaeaceae \n", "\n", - " species \\\n", - "0 Archaeoglobus fulgidus \n", - "1 Methanocaldococcus jannaschii \n", - "2 Nostoc sp. PCC 7120 \n", - "3 Pyrobaculum aerophilum \n", - "4 Pyrococcus furiosus \n", - "5 Fusobacterium nucleatum \n", - "6 Methanosarcina acetivorans \n", - "7 Methanopyrus kandleri \n", - "8 Ruegeria pomeroyi \n", - "9 Chlorobaculum tepidum \n", - "10 Bacteroides thetaiotaomicron \n", - "11 Nitrosomonas europaea \n", - "12 Rhodopirellula baltica \n", - "13 Wolinella succinogenes \n", - "14 Geobacter sulfurreducens \n", - "15 Treponema denticola \n", - "16 Methanococcus maripaludis \n", - "17 Thermus thermophilus \n", - "18 Pyrococcus horikoshii \n", - "19 Sulfolobus tokodaii \n", - "20 Paraburkholderia xenovorans \n", - "21 Chlorobium phaeobacteroides \n", - "22 Desulfovibrio vulgaris \n", - "23 Ruminiclostridium thermocellum \n", - "24 Pyrobaculum calidifontis \n", - "25 Methanococcus maripaludis \n", - "26 Chlorobium phaeovibrioides \n", - "27 Pyrobaculum arsenaticum \n", - "28 Salinispora tropica \n", - "29 Caldicellulosiruptor saccharolyticus \n", - ".. ... \n", - "34 Salinispora arenicola \n", - "35 Chloroflexus aurantiacus \n", - "36 Thermoanaerobacter pseudethanolicus \n", - "37 Thermotoga sp. RQ2 \n", - "38 Leptothrix cholodnii \n", - "39 Akkermansia muciniphila \n", - "40 Porphyromonas gingivalis \n", - "41 Sulfurihydrogenibium sp. YO3AOP1 \n", - "42 Chlorobium limicola \n", - "43 Pelodictyon phaeoclathratiforme \n", - "44 Hydrogenobaculum sp. Y04AAS1 \n", - "45 Sulfitobacter sp. EE-36 \n", - "46 Sulfitobacter sp. NAS-14.1 \n", - "47 Dictyoglomus turgidum \n", - "48 Shewanella baltica \n", - "49 Thermotoga neapolitana \n", - "50 Desulfovibrio piger \n", - "51 Persephonella marina \n", - "52 Acidobacterium capsulatum \n", - "53 Gemmatimonas aurantiaca \n", - "54 Aciduliprofundum boonei \n", - "55 Haloferax volcanii \n", - "56 Enterococcus faecalis \n", - "57 Zymomonas mobilis \n", - "58 Deinococcus radiodurans \n", - "59 Sulfurihydrogenibium yellowstonense \n", - "60 Bordetella bronchiseptica \n", - "61 Caldicellulosiruptor bescii \n", - "62 Herpetosiphon aurantiacus \n", - "63 Nanoarchaeum equitans \n", + " genus species \\\n", + "0 Archaeoglobus Archaeoglobus fulgidus \n", + "1 Methanocaldococcus Methanocaldococcus jannaschii \n", + "2 Nostoc Nostoc sp. PCC 7120 \n", + "3 Pyrobaculum Pyrobaculum aerophilum \n", + "4 Pyrococcus Pyrococcus furiosus \n", + ".. ... ... \n", + "59 Sulfurihydrogenibium Sulfurihydrogenibium yellowstonense \n", + "60 Bordetella Bordetella bronchiseptica \n", + "61 Caldicellulosiruptor Caldicellulosiruptor bescii \n", + "62 Herpetosiphon Herpetosiphon aurantiacus \n", + "63 Nanoarchaeum Nanoarchaeum equitans \n", "\n", - " strain \n", - "0 Archaeoglobus fulgidus DSM 4304 \n", - "1 Methanocaldococcus jannaschii DSM 2661 \n", - "2 NaN \n", - "3 Pyrobaculum aerophilum str. IM2 \n", - "4 Pyrococcus furiosus DSM 3638 \n", - "5 NaN \n", - "6 Methanosarcina acetivorans C2A \n", - "7 Methanopyrus kandleri AV19 \n", - "8 Ruegeria pomeroyi DSS-3 \n", - "9 Chlorobaculum tepidum TLS \n", - "10 Bacteroides thetaiotaomicron VPI-5482 \n", - "11 Nitrosomonas europaea ATCC 19718 \n", - "12 Rhodopirellula baltica SH 1 \n", - "13 Wolinella succinogenes DSM 1740 \n", - "14 Geobacter sulfurreducens PCA \n", - "15 Treponema denticola ATCC 35405 \n", - "16 Methanococcus maripaludis S2 \n", - "17 Thermus thermophilus HB27 \n", - "18 Pyrococcus horikoshii OT3 \n", - "19 Sulfolobus tokodaii str. 7 \n", - "20 Paraburkholderia xenovorans LB400 \n", - "21 Chlorobium phaeobacteroides DSM 266 \n", - "22 Desulfovibrio vulgaris DP4 \n", - "23 Ruminiclostridium thermocellum ATCC 27405 \n", - "24 Pyrobaculum calidifontis JCM 11548 \n", - "25 Methanococcus maripaludis C5 \n", - "26 Chlorobium phaeovibrioides DSM 265 \n", - "27 Pyrobaculum arsenaticum DSM 13514 \n", - "28 Salinispora tropica CNB-440 \n", - "29 Caldicellulosiruptor saccharolyticus DSM 8903 \n", - ".. ... \n", - "34 Salinispora arenicola CNS-205 \n", - "35 Chloroflexus aurantiacus J-10-fl \n", - "36 Thermoanaerobacter pseudethanolicus ATCC 33223 \n", - "37 NaN \n", - "38 Leptothrix cholodnii SP-6 \n", - "39 Akkermansia muciniphila ATCC BAA-835 \n", - "40 Porphyromonas gingivalis ATCC 33277 \n", - "41 NaN \n", - "42 Chlorobium limicola DSM 245 \n", - "43 Pelodictyon phaeoclathratiforme BU-1 \n", - "44 NaN \n", - "45 NaN \n", - "46 NaN \n", - "47 Dictyoglomus turgidum DSM 6724 \n", - "48 Shewanella baltica OS223 \n", - "49 Thermotoga neapolitana DSM 4359 \n", - "50 Desulfovibrio piger ATCC 29098 \n", - "51 Persephonella marina EX-H1 \n", - "52 Acidobacterium capsulatum ATCC 51196 \n", - "53 Gemmatimonas aurantiaca T-27 \n", - "54 Aciduliprofundum boonei T469 \n", - "55 Haloferax volcanii DS2 \n", - "56 Enterococcus faecalis V583 \n", - "57 NaN \n", - "58 Deinococcus radiodurans R1 \n", - "59 Sulfurihydrogenibium yellowstonense SS-5 \n", - "60 Bordetella bronchiseptica D989 \n", - "61 NaN \n", - "62 Herpetosiphon aurantiacus DSM 785 \n", - "63 Nanoarchaeum equitans Kin4-M \n", + " strain \n", + "0 Archaeoglobus fulgidus DSM 4304 \n", + "1 Methanocaldococcus jannaschii DSM 2661 \n", + "2 NaN \n", + "3 Pyrobaculum aerophilum str. IM2 \n", + "4 Pyrococcus furiosus DSM 3638 \n", + ".. ... \n", + "59 Sulfurihydrogenibium yellowstonense SS-5 \n", + "60 Bordetella bronchiseptica D989 \n", + "61 NaN \n", + "62 Herpetosiphon aurantiacus DSM 785 \n", + "63 Nanoarchaeum equitans Kin4-M \n", "\n", "[64 rows x 10 columns]" ] @@ -1664,14 +870,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", "\n", + "\u001b[KBuilding LCA database with ksize=31 scaled=10000 moltype=DNA.\n", "\u001b[Kexamining spreadsheet headers...\n", "\u001b[K** assuming column 'accession' is identifiers in spreadsheet\n", "\u001b[K64 distinct identities in spreadsheet out of 64 rows.\n", "\u001b[K64 distinct lineages in spreadsheet out of 64 rows.\n", - "\u001b[K64 assigned lineages out of 64 distinct lineages in spreadsheet. 64)\n", + "\u001b[K... loaded 64 signatures.H01000003.1 Caldicellulo (64 of 64); skipped 0 so far\n", + "\u001b[Kloaded 19993 hashes at ksize=31 scaled=10000\n", + "\u001b[K64 assigned lineages out of 64 distinct lineages in spreadsheet.\n", "\u001b[K64 identifiers used out of 64 distinct identifiers in spreadsheet.\n", "\u001b[Ksaving to LCA DB: taxdb.lca.json\n" ] @@ -1697,23 +907,35 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", - "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", - "\n", - "\u001b[Kselect query k=31 automatically.\n", - "\u001b[Kloaded query: fake-metagenome.fa... (k=31, DNA)\n", - "\u001b[Kloaded 1 databases. \n", - "\n", - "\n", - "overlap p_query p_match\n", - "--------- ------- -------\n", - "0.6 Mbp 46.7% 11.6% NC_011663.1 Shewanella baltica OS223,...\n", - "0.5 Mbp 38.7% 19.3% CP001071.1 Akkermansia muciniphila AT...\n", - "0.5 Mbp 14.6% 3.9% NC_009665.1 Shewanella baltica OS185,...\n", - "\n", - "found 3 matches total;\n", - "the recovered matches hit 100.0% of the query\n", - "\n" + "\r", + "\u001b[K\r\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\r\n", + "\r", + "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\r\n", + "\r\n", + "\r", + "\u001b[Kselect query k=31 automatically.\r\n", + "\r", + "\u001b[Kloaded query: fake-metagenome.fa... (k=31, DNA)\r\n", + "\r", + "\u001b[Kloading from taxdb.lca.json...\r", + "\r", + "\u001b[Kloaded LCA taxdb.lca.json\r", + "\r", + "\u001b[K \r", + "\r", + "\u001b[Kloaded 1 databases.\r\n", + "\r\n", + "\r\n", + "overlap p_query p_match\r\n", + "--------- ------- -------\r\n", + "0.6 Mbp 46.7% 11.6% NC_011663.1 Shewanella baltica OS223,...\r\n", + "0.5 Mbp 38.7% 19.3% CP001071.1 Akkermansia muciniphila AT...\r\n", + "0.5 Mbp 14.6% 3.9% NC_009665.1 Shewanella baltica OS185,...\r\n", + "\r\n", + "found 3 matches total;\r\n", + "the recovered matches hit 100.0% of the query\r\n", + "\r\n" ] } ], @@ -1737,28 +959,46 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", - "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", - "\n", - "\u001b[Kloaded 1 LCA databases. ksize=31, scaled=10000\n", - "\u001b[Kfinding query signatures...\n", - "\u001b[Kloaded 1 signatures from 1 files total.of 1)\n", - "38.7% 53 Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales;Akkermansiaceae;Akkermansia;Akkermansia muciniphila;Akkermansia muciniphila ATCC BAA-835\n", - "38.7% 53 Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales;Akkermansiaceae;Akkermansia;Akkermansia muciniphila\n", - "38.7% 53 Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales;Akkermansiaceae;Akkermansia\n", - "38.7% 53 Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales;Akkermansiaceae\n", - "38.7% 53 Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales\n", - "38.7% 53 Bacteria;Verrucomicrobia;Verrucomicrobiae\n", - "38.7% 53 Bacteria;Verrucomicrobia\n", - "100.0% 137 Bacteria\n", - "61.3% 84 Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica\n", - "61.3% 84 Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella\n", - "61.3% 84 Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae\n", - "61.3% 84 Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales\n", - "61.3% 84 Bacteria;Proteobacteria;Gammaproteobacteria\n", - "61.3% 84 Bacteria;Proteobacteria\n", - "22.6% 31 Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica;Shewanella baltica OS223\n", - "14.6% 20 Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica;Shewanella baltica OS185\n" + "\r", + "\u001b[K\r\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\r\n", + "\r", + "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\r\n", + "\r\n", + "\r", + "\u001b[K\r", + "\u001b[K\r", + "\u001b[K... loading database taxdb.lca.json\r", + "\r", + "\u001b[K\r", + "\u001b[K\r", + "\u001b[Kloaded 1 LCA databases. ksize=31, scaled=10000 moltype=DNA\r\n", + "\r", + "\u001b[Kfinding query signatures...\r\n", + "\r", + "\u001b[K\r", + "\u001b[K\r", + "\u001b[K... loading fake-metagenome.fa (file 1 of 1)\r", + "38.7% 53 Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales;Akkermansiaceae;Akkermansia;Akkermansia muciniphila;Akkermansia muciniphila ATCC BAA-835 fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "38.7% 53 Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales;Akkermansiaceae;Akkermansia;Akkermansia muciniphila fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "38.7% 53 Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales;Akkermansiaceae;Akkermansia fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "38.7% 53 Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales;Akkermansiaceae fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "38.7% 53 Bacteria;Verrucomicrobia;Verrucomicrobiae;Verrucomicrobiales fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "38.7% 53 Bacteria;Verrucomicrobia;Verrucomicrobiae fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "38.7% 53 Bacteria;Verrucomicrobia fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "100.0% 137 Bacteria fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "61.3% 84 Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "61.3% 84 Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "61.3% 84 Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "61.3% 84 Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "61.3% 84 Bacteria;Proteobacteria;Gammaproteobacteria fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "61.3% 84 Bacteria;Proteobacteria fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "22.6% 31 Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica;Shewanella baltica OS223 fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "14.6% 20 Bacteria;Proteobacteria;Gammaproteobacteria;Alteromonadales;Shewanellaceae;Shewanella;Shewanella baltica;Shewanella baltica OS185 fake-metagenome.fa.sig:4e1ac0cf fake-metagenome.fa\r\n", + "\r", + "\u001b[K\r", + "\u001b[K\r", + "\u001b[Kloaded 1 signatures from 1 files total.\r\n" ] } ], @@ -1799,9 +1039,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python (myenv)", "language": "python", - "name": "python3" + "name": "myenv" }, "language_info": { "codemirror_mode": { @@ -1813,7 +1053,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.7" + "version": "3.7.6" } }, "nbformat": 4, diff --git a/doc/sourmash-examples.ipynb b/doc/sourmash-examples.ipynb index 40b489fd83..c3fc51edfd 100644 --- a/doc/sourmash-examples.ipynb +++ b/doc/sourmash-examples.ipynb @@ -46,29 +46,27 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", "\n", - "\u001b[Ksetting num_hashes to 0 because --scaled is set\n", "\u001b[Kcomputing signatures for files: genomes/akkermansia.fa, genomes/shew_os185.fa, genomes/shew_os223.fa\n", - "\u001b[KComputing signature for ksizes: [21, 31, 51]\n", - "\u001b[KComputing only nucleotide (and not protein) signatures.\n", - "\u001b[KComputing a total of 3 signature(s).\n", + "\u001b[KComputing a total of 1 signature(s).\n", "\u001b[K... reading sequences from genomes/akkermansia.fa\n", - "\u001b[Kcalculated 3 signatures for 1 sequences in genomes/akkermansia.fa\n", - "\u001b[Ksaved 3 signature(s). Note: signature license is CC0.\n", + "\u001b[Kcalculated 1 signatures for 1 sequences in genomes/akkermansia.fa\n", + "\u001b[Ksaved signature(s) to akkermansia.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from genomes/shew_os185.fa\n", - "\u001b[Kcalculated 3 signatures for 1 sequences in genomes/shew_os185.fa\n", - "\u001b[Ksaved 3 signature(s). Note: signature license is CC0.\n", + "\u001b[Kcalculated 1 signatures for 1 sequences in genomes/shew_os185.fa\n", + "\u001b[Ksaved signature(s) to shew_os185.fa.sig. Note: signature license is CC0.\n", "\u001b[K... reading sequences from genomes/shew_os223.fa\n", - "\u001b[Kcalculated 3 signatures for 1 sequences in genomes/shew_os223.fa\n", - "\u001b[Ksaved 3 signature(s). Note: signature license is CC0.\n" + "\u001b[Kcalculated 1 signatures for 1 sequences in genomes/shew_os223.fa\n", + "\u001b[Ksaved signature(s) to shew_os223.fa.sig. Note: signature license is CC0.\n" ] } ], "source": [ "!rm -f *.sig\n", - "!sourmash compute -k 21,31,51 --scaled=1000 genomes/*.fa --name-from-first -f" + "!sourmash sketch dna -p k=21,k=31,k=51,scaled=1000 genomes/*.fa --name-from-first -f" ] }, { @@ -120,17 +118,38 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", - "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", - "\n", - "\u001b[Kloaded query: NC_011663.1 Shewanella baltica... (k=31, DNA)\n", - "\u001b[Kloaded 3 signatures. \n", - "\n", - "2 matches:\n", - "similarity match\n", - "---------- -----\n", - "100.0% NC_011663.1 Shewanella baltica OS223, complete genome\n", - " 22.8% NC_009665.1 Shewanella baltica OS185, complete genome\n" + "\r", + "\u001b[K\r\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\r\n", + "\r", + "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\r\n", + "\r\n", + "\r", + "\u001b[Kselecting specified query k=31\r\n", + "\r", + "\u001b[Kloaded query: NC_011663.1 Shewanella baltica... (k=31, DNA)\r\n", + "\r", + "\u001b[Kloading from akkermansia.fa.sig...\r", + "\r", + "\u001b[Kloaded 1 signatures from akkermansia.fa.sig\r", + "\r", + "\u001b[Kloading from shew_os185.fa.sig...\r", + "\r", + "\u001b[Kloaded 1 signatures from shew_os185.fa.sig\r", + "\r", + "\u001b[Kloading from shew_os223.fa.sig...\r", + "\r", + "\u001b[Kloaded 1 signatures from shew_os223.fa.sig\r", + "\r", + "\u001b[K \r", + "\r", + "\u001b[Kloaded 3 signatures.\r\n", + "\r\n", + "2 matches:\r\n", + "similarity match\r\n", + "---------- -----\r\n", + "100.0% NC_011663.1 Shewanella baltica OS223, complete genome\r\n", + " 22.8% NC_009665.1 Shewanella baltica OS185, complete genome\r\n" ] } ], @@ -154,9 +173,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", "\n", + "\u001b[Kselecting specified query k=31\n", "\u001b[Kloaded query: NC_011663.1 Shewanella baltica... (k=31, DNA)\n", "\u001b[Kloaded 3 signatures. \n", "\n", @@ -190,11 +211,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", "\n", + "\u001b[Kloaded 1 sigs from 'akkermansia.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'shew_os185.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'shew_os223.fa.sig'g'\n", "\u001b[Kloaded 3 signatures total. \n", - "\u001b[Kdownsampling to scaled value of 1000\n", "\u001b[K\n", "0-CP001071.1 Akke...\t[1. 0. 0.]\n", "1-NC_009665.1 She...\t[0. 1. 0.228]\n", @@ -223,18 +247,21 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", "\n", + "\u001b[Kloaded 1 sigs from 'akkermansia.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'shew_os185.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'shew_os223.fa.sig'g'\n", "\u001b[Kloaded 3 signatures total. \n", - "\u001b[Kdownsampling to scaled value of 1000\n", "\u001b[K\n", "0-CP001071.1 Akke...\t[1. 0. 0.]\n", "1-NC_009665.1 She...\t[0. 1. 0.228]\n", "2-NC_011663.1 She...\t[0. 0.228 1. ]\n", "min similarity in matrix: 0.000\n", "\u001b[Ksaving labels to: genome_compare.mat.labels.txt\n", - "\u001b[Ksaving distance matrix to: genome_compare.mat\n" + "\u001b[Ksaving comparison matrix to: genome_compare.mat\n" ] } ], @@ -251,7 +278,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", "\n", "\u001b[Kloading comparison matrix from genome_compare.mat...\n", @@ -267,7 +295,7 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABEwAAAMgCAYAAAA5kPcVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzs3X9sX9V9N/DP/Rpik1CnVBnOj3nKuq7rgJJAGJYL7Fklj2ytUvWPdllLGxa1VG3JRPGqUtYSU6oROrook5ouKiWjW0Gk4uk2GCgVzZZntKTLGhppk6ARY2kyiA15GDM4JGb29/nD4D4+CSTxuc61b16v6P7h6+/3fI8tLkre933PKZrNZjMAAAAAGNeoegIAAAAA043ABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAAAAEgITAAAAgITABAAAACAhMAEAAABICEwAAABmuH/6p3+KFStWxMKFC6Moivjbv/3b475n+/btcfHFF0dra2u87W1vi7vuumvqJwoziMAEAABghhsaGoolS5bExo0bT+j1//Ef/xHvfe97493vfnfs3r07PvOZz8THP/7x+N73vjfFM4WZo2g2m82qJwEAAEA5iqKIv/mbv4n3v//9r/uaG264IR588MH4t3/7t/Fzv//7vx8vvPBCbN269VRME6a9M6qeAGNGR0fjmWeeiTe96U1RFEXV04Faazab8eKLL8bChQuj0Zj6op3rGwBmlpP9u8Lhw4djeHh4SuaR/t2htbU1Wltbs8fesWNH9PT0TDi3fPny+MxnPpM9NtSFwGSaeOaZZ6Kzs7PqacBpZf/+/fGLv/iLU/45rm8AmJlO5O8Khw8fjrPmnBMxerj0zz/77LPjpZdemnCur68vbr755uyx+/v7o6OjY8K5jo6OGBwcjJdffjnOOuus7M+AmU5gMk286U1vioix/ym3t7dXPBuot8HBwejs7By/7qbaz6/v/xPt7Wefks+E49n9f5+segowwZVXfKfqKcC45ugrMXzg/hP6u8Lw8HDE6OFoXfC+iMaZ5U1i9JV46cD9R/37oIx2CXBiBCbTxGtVu/b2doEJnCKn6vGYn1/fZwtMmDbOHp5d9RRggqLMf2hCSU7m7wpFS2up/x03i7FHgabq3wfz58+PgYGBCecGBgaivb1duwReZZccAACA00x3d3ds27ZtwrmHH344uru7K5oRTD8CEwAAgExFFFFEo8Tj5JqwL730UuzevTt2794dEWPbBu/evTv27dsXERE33nhjrFq1avz1n/zkJ+Opp56Kz33uc/HEE0/E17/+9fjOd74T119/fXm/FJjhBCYAAAAz3I9//OO46KKL4qKLLoqIiN7e3rjoooti7dq1ERFx4MCB8fAkIuKXf/mX48EHH4yHH344lixZEn/2Z38W3/zmN2P58uWVzB+mI2uYAAAAZCqKRhRFifejT3Ks3/qt34pms/m637/rrruO+Z6f/OQnJzszOG1omAAAAAAkNEwAAAAyVd0wAcrnKgQAAABIaJgAAABkKooiiuLkdrY5zoDljQVMioYJAAAAQELDBAAAIFsjyr0f7d42VM1VCAAAAJDQMAEAAMhklxyoH4EJAABAJoEJ1I+rEAAAACChYQIAAJCpiEYUFn2FWnEVAgAAACQ0TAAAADJZwwTqx1UIAAAAkNAwAQAAyFREyQ0T97ahcq5CAAAAgISGCQAAQK6iKLVh0iyK0sYCJkfDBAAAACChYQIAAJCpePVPmeMB1dIwAQAAAEhomAAAAGQqinJ3ySl3xx1gMlyFAAAAAAkNEwAAgEwaJlA/AhMAAIBMAhOoH1chAAAAQELDBAAAIFsjyr0f7d42VM1VCAAAAJDQMAEAAMhkDROoH1chAAAAQELDBAAAIJOGCdSPqxAAAAAgoWECAACQqYhGFCXejy5zLGByXIUAAAAACQ0TAACATEVRlLyGSVHaWMDkaJgAAAAAJDRMAAAAMo01TMprhWiYQPU0TAAAAAASGiYAAACZiqJR8hom7m1D1QQmAAAAmWwrDPXjKgQAAABIaJgAAABk8kgO1I+rEAAAACChYQIAAJBJwwTqx1UIAAAAkNAwAQAAyGSXHKgfVyEAAABAQsMEAAAgV9EYO8ocD6iUqxAAAAAgoWECAACQyS45UD+uQgAAAICEhgkAAECmoiiiKIpSxwOqpWECAAAAkNAwAQAAyFREEUWJ96OL0DCBqglMAAAAcpW86KtthaF6rkIAAACAhIYJAABArqIYO8ocD6iUhgkAAABAQsMEAAAgVxHl3o4eLXEsYFI0TAAAAAASGiYAAAC5rGECtaNhAgAAAJDQMAEAAMilYQK1o2ECAAAAkNAwAQAAyNWIcm9Hu7UNlXMZAgAAACQ0TAAAAHIVRTStYQK1omECAAAAkBCYABzHv/zLv8SaNWvi/PPPjzlz5sQv/dIvxe/93u/Fnj17qp4aADBdFFNwAJXySA7AcXzlK1+JH/7wh/HBD34wLrzwwujv74+vfe1rcfHFF8ePfvSjuOCCC6qeIgBQtUYxdpQ5HlApgQnAcfT29sY999wTs2bNGj+3cuXKeOc73xm33XZbfPvb365wdgAAwFQQmAAcx7ve9a6jzv3qr/5qnH/++fH4449XMCMAYNopinIXarXoK1ROYEIlms2IQ4eqngWnq6Gh/DGazWYMDAzE+eefnz8YAAAw7QhMOOWazYjLL4949NGqZwKTd/fdd8fTTz8dt9xyS9VTAQCmg7IXalUwgcrZJYdT7tAhYQkz2xNPPBHXXnttdHd3x9VXX131dAAAgCmgYUKlBgYi5sypehacbgYHIxYunNx7+/v7473vfW/MnTs37rvvvmhpaSl3cgDAzGSXHKgdgQmVmjNHYMKpNzIyuff993//d/zu7/5uvPDCC/HII4/EwsmmLgAAwLQnMAE4AYcPH44VK1bEnj174vvf/36cd955VU8JAJhO7JIDtSMwATiOkZGRWLlyZezYsSP+7u/+Lrq7u6ueEgAAMMUEJgDH8Ud/9Edx//33x4oVK+L555+Pb3/72xO+/5GPfKSimQEA04ZdcqB2BCYAx7F79+6IiHjggQfigQceOOr7AhMAAKgfgQnAcWzfvr3qKQAA051dcqB2GlVPAAAAAGC60TABAADIZQ0TqB2BCQAAQKZmFNEscSvgpsQEKueRHAAAAICEwAQAACDXa4u+lnmcpI0bN8bixYujra0turq6YufOnW/4+g0bNsSv/dqvxVlnnRWdnZ1x/fXXx+HDhyf7G4DaEZgAAADMcFu2bIne3t7o6+uLxx57LJYsWRLLly+PZ5999pivv+eee+Lzn/989PX1xeOPPx533nlnbNmyJf74j//4FM8cpi+BCQAAQK5iCo6TsH79+rjmmmti9erVcd5558WmTZti9uzZsXnz5mO+/tFHH43LLrssPvzhD8fixYvjyiuvjA996EPHbaXA6URgAgAAME0NDg5OOI4cOXLUa4aHh2PXrl3R09Mzfq7RaERPT0/s2LHjmOO+613vil27do0HJE899VQ89NBD8Z73vGdqfhCYgeySAwAAkKsoxo4yx4uIzs7OCaf7+vri5ptvnnDu4MGDMTIyEh0dHRPOd3R0xBNPPHHM4T/84Q/HwYMH4/LLL49msxn/8z//E5/85Cc9kgP/H4EJAADANLV///5ob28f/7q1tbWUcbdv3x633nprfP3rX4+urq548skn47rrrosvf/nLcdNNN5XyGTDTCUwAAAByTXJnmzccLyLa29snBCbHMm/evGhpaYmBgYEJ5wcGBmL+/PnHfM9NN90UH/3oR+PjH/94RES8853vjKGhofjEJz4RX/jCF6LRsHoDuAoAAABmsFmzZsWyZcti27Zt4+dGR0dj27Zt0d3dfcz3HDp06KhQpKWlJSIims3m1E0WZhANEwAAgFyT2NnmuOOd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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAABEwAAAMgCAYAAAA5kPcVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAwJUlEQVR4nO3df5BX5X0v8M/zXYTV4JKqcQXdIFYdydAkc5emgmVSbVyDjjdJ00rrHUkUOiEYLVJNg6SK1Ia20zCYRDCOWuqUWK4aWzOzJW6vEzXVdCLBTlqdaW9jXKJLGDDjgj9Yge/9A9jcfXYV2HPg7H55vZjzh2e/+3yfL3KY5X3e53lSvV6vBwAAAAD9alVPAAAAAGCkEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQmAAAAABmBCQAAAEBGYAIAAACQEZgAAAAAZAQm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\n", "text/plain": [ "" ] @@ -300,11 +328,14 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", "\n", + "\u001b[Kloaded 1 sigs from 'akkermansia.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'shew_os185.fa.sig'g'\n", + "\u001b[Kloaded 1 sigs from 'shew_os223.fa.sig'g'\n", "\u001b[Kloaded 3 signatures total. \n", - "\u001b[Kdownsampling to scaled value of 1000\n", "\u001b[K\n", "0-CP001071.1 Akke...\t[1. 0. 0.]\n", "1-NC_009665.1 She...\t[0. 1. 0.228]\n", @@ -328,9 +359,12 @@ "text": [ "\"CP001071.1 Akkermansia muciniphila ATCC BAA-835, complete genome\",\"NC_009665.1 Shewanella baltica OS185, complete genome\",\"NC_011663.1 Shewanella baltica OS223, complete genome\"\r", "\r\n", - "1.0,0.0,0.0\r\n", - "0.0,1.0,0.22846441947565543\r\n", - "0.0,0.22846441947565543,1.0\r\n" + "1.0,0.0,0.0\r", + "\r\n", + "0.0,1.0,0.22846441947565543\r", + "\r\n", + "0.0,0.22846441947565543,1.0\r", + "\r\n" ] } ], @@ -363,23 +397,22 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", + "\u001b[K\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\n", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", "\n", - "\u001b[Ksetting num_hashes to 0 because --scaled is set\n", "\u001b[Kcomputing signatures for files: fake-metagenome.fa\n", - "\u001b[KComputing signature for ksizes: [31]\n", - "\u001b[KComputing only nucleotide (and not protein) signatures.\n", "\u001b[KComputing a total of 1 signature(s).\n", "\u001b[K... reading sequences from fake-metagenome.fa\n", "\u001b[Kcalculated 1 signatures for 3 sequences in fake-metagenome.fa\n", - "\u001b[Ksaved 1 signature(s). Note: signature license is CC0.\n" + "\u001b[Ksaved signature(s) to fake-metagenome.fa.sig. Note: signature license is CC0.\n" ] } ], "source": [ + "!rm -f fake-metagenome.fa*\n", "!cat genomes/*.fa > fake-metagenome.fa\n", - "!sourmash compute -k 31 --scaled=1000 fake-metagenome.fa" + "!sourmash sketch dna -p k=31,scaled=1000 fake-metagenome.fa" ] }, { @@ -398,23 +431,43 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K== This is sourmash version 2.0.0a12.dev48+ga92289b. ==\n", - "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\n", - "\n", - "\u001b[Kselect query k=31 automatically.\n", - "\u001b[Kloaded query: fake-metagenome.fa... (k=31, DNA)\n", - "\u001b[Kloaded 3 signatures. \n", - "\n", - "\n", - "overlap p_query p_match\n", - "--------- ------- -------\n", - "499.0 kbp 38.4% 100.0% CP001071.1 Akkermansia muciniphila AT...\n", - "494.0 kbp 38.0% 100.0% NC_009665.1 Shewanella baltica OS185,...\n", - "490.0 kbp 23.6% 62.7% NC_011663.1 Shewanella baltica OS223,...\n", - "\n", - "found 3 matches total;\n", - "the recovered matches hit 100.0% of the query\n", - "\n" + "\r", + "\u001b[K\r\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\r\n", + "\r", + "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\r\n", + "\r\n", + "\r", + "\u001b[Kselect query k=31 automatically.\r\n", + "\r", + "\u001b[Kloaded query: fake-metagenome.fa... (k=31, DNA)\r\n", + "\r", + "\u001b[Kloading from shew_os185.fa.sig...\r", + "\r", + "\u001b[Kloaded 1 signatures from shew_os185.fa.sig\r", + "\r", + "\u001b[Kloading from shew_os223.fa.sig...\r", + "\r", + "\u001b[Kloaded 1 signatures from shew_os223.fa.sig\r", + "\r", + "\u001b[Kloading from akkermansia.fa.sig...\r", + "\r", + "\u001b[Kloaded 1 signatures from akkermansia.fa.sig\r", + "\r", + "\u001b[K \r", + "\r", + "\u001b[Kloaded 3 signatures.\r\n", + "\r\n", + "\r\n", + "overlap p_query p_match\r\n", + "--------- ------- -------\r\n", + "499.0 kbp 38.4% 100.0% CP001071.1 Akkermansia muciniphila AT...\r\n", + "494.0 kbp 38.0% 100.0% NC_009665.1 Shewanella baltica OS185,...\r\n", + "490.0 kbp 23.6% 62.7% NC_011663.1 Shewanella baltica OS223,...\r\n", + "\r\n", + "found 3 matches total;\r\n", + "the recovered matches hit 100.0% of the query\r\n", + "\r\n" ] } ], @@ -457,9 +510,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python (myenv)", "language": "python", - "name": "python3" + "name": "myenv" }, "language_info": { "codemirror_mode": { @@ -471,7 +524,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.7" + "version": "3.7.6" } }, "nbformat": 4, diff --git a/doc/tutorial-basic.md b/doc/tutorial-basic.md index f47d75c29e..41311f9f96 100644 --- a/doc/tutorial-basic.md +++ b/doc/tutorial-basic.md @@ -3,9 +3,11 @@ This tutorial should run without modification on Linux or Mac OS X, under [Miniconda](https://docs.conda.io/en/latest/miniconda.html). -You'll need about 5 GB of free disk space, -and about 5 GB of RAM to search GenBank. The tutorial should take about -20 minutes total to run. +You'll need about 5 GB of free disk space, and about 5 GB of RAM to +search GenBank. The tutorial should take about 20 minutes total to +run. In fact, we have successfully tested it on +[binder.pangeo.io](https://binder.pangeo.io/v2/gh/binder-examples/r-conda/master?urlpath=urlpath%3Drstudio) +if you want to give it a try! ## Install miniconda @@ -56,8 +58,8 @@ Download some reads and a reference genome: ``` mkdir ~/data cd ~/data -wget https://s3.amazonaws.com/public.ged.msu.edu/ecoli_ref-5m.fastq.gz -wget https://s3.amazonaws.com/public.ged.msu.edu/ecoliMG1655.fa.gz +curl -L https://osf.io/ruanf/download -o ecoliMG1655.fa.gz +curl -L https://osf.io/q472x/download -o ecoli_ref-5m.fastq.gz ``` Compute a scaled signature from our reads: @@ -89,17 +91,19 @@ sourmash search ecoli-reads.sig ecoli-genome.sig --containment and you should see: ``` -# running sourmash subcommand: search -loaded query: /home/ubuntu/data/ecoli_ref-5m... (k=31, DNA) -loaded 1 signatures from ecoli-genome.sig + +select query k=31 automatically. +loaded query: /home/jovyan/data/ecoli_ref-5m... (k=31, DNA) +loaded 1 signatures. + 1 matches: similarity match ---------- ----- - 10.6% /home/ubuntu/data/ecoliMG1655.fa.gz + 31.0% /home/jovyan/data/ecoliMG1655.fa.gz ``` -Try the reverse - why is it bigger? +Try the reverse, too! ``` sourmash search ecoli-genome.sig ecoli-reads.sig --containment @@ -141,7 +145,7 @@ sourmash index ecolidb ecoli_many_sigs/*.sig and now we can search! ``` -sourmash search ecoli-genome.sig ecolidb.sbt.json -n 20 +sourmash search ecoli-genome.sig ecolidb.sbt.zip -n 20 ``` You should see output like this: @@ -226,7 +230,7 @@ loaded 1 databases. overlap p_query p_match --------- ------- ------- -4.9 Mbp 100.0% 100.0% AP009048.1 Escherichia coli str. K-12... +4.9 Mbp 100.0% 100.0% LRDF01000001.1 Escherichia coli strai... found 1 matches total; the recovered matches hit 100.0% of the query @@ -287,11 +291,11 @@ the recovered matches hit 73.1% of the query If you use the `-o` flag, gather will write out a csv that contains additional information. The column headers and their meanings are: -+ intersect_bp: the approximate number of base pairs in common between the query and the match -+ f_orig_query: fraction of original query; the fraction of the original query that is contained within the match -+ f_match: fraction of match; the fraction of the match that is contained within the query -+ f_unique_to_query: fraction unique to query; the fraction of the query that uniquely overlaps with the match -+ f_unique_weighted: fraction unique to query weighted by abundance; fraction unique to query, weighted by abundance in the query ++ `intersect_bp`: the approximate number of base pairs in common between the query and the match ++ `f_orig_query`: fraction of original query; the fraction of the original query that is contained within the match ++ `f_match`: fraction of match; the fraction of the match that is contained within the query ++ `f_unique_to_query`: fraction unique to query; the fraction of the query that uniquely overlaps with the match ++ `f_unique_weighted`: fraction unique to query weighted by abundance; fraction unique to query, weighted by abundance in the query It is straightforward to build your own databases for use with `search` and `gather`; see `sourmash index`, above, [the LCA tutorial][4], or diff --git a/doc/tutorials-lca.md b/doc/tutorials-lca.md index 384a6a2b9e..6fe002c29f 100644 --- a/doc/tutorials-lca.md +++ b/doc/tutorials-lca.md @@ -11,6 +11,10 @@ You'll need about 5 GB of free disk space to download the database, and about 5 GB of RAM to search it. The tutorial should take about 20 minutes total to run. +Note, we have successfully tested it on +[binder.pangeo.io](https://binder.pangeo.io/v2/gh/binder-examples/r-conda/master?urlpath=urlpath%3Drstudio) +if you want to give it a try! + ## Install miniconda If you don't have the `conda` command installed, you'll need to install @@ -63,12 +67,12 @@ curl -L -o genbank-k31.lca.json.gz https://osf.io/4f8n3/download Download a random genome from genbank: ``` -curl -L -o some-genome.fa.gz ftp://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/178/875/GCF_000178875.2_ASM17887v2/GCF_000178875.2_ASM17887v2_genomic.fna.gz +curl -L -o some-genome.fa.gz https://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/178/875/GCF_000178875.2_ASM17887v2/GCF_000178875.2_ASM17887v2_genomic.fna.gz ``` Create a signature for this genome: ``` -sourmash sketch -p scaled=1000,k=31 --name-from-first some-genome.fa.gz +sourmash sketch dna -p scaled=1000,k=31 --name-from-first some-genome.fa.gz ``` Now, classify the signature with sourmash `lca classify`, diff --git a/doc/using-LCA-database-API.ipynb b/doc/using-LCA-database-API.ipynb index 3bfebe875c..ad8b8ac5ae 100644 --- a/doc/using-LCA-database-API.ipynb +++ b/doc/using-LCA-database-API.ipynb @@ -74,19 +74,13 @@ "text": [ "\r", "\u001b[K\r\n", - "== This is sourmash version 3.2.4.dev5+g6484e78f. ==\r\n", + "== This is sourmash version 4.0.0a4.dev12+g31c5eda2. ==\r\n", "\r", "\u001b[K== Please cite Brown and Irber (2016), doi:10.21105/joss.00027. ==\r\n", "\r\n", "\r", - "\u001b[Ksetting num_hashes to 0 because --scaled is set\r\n", - "\r", "\u001b[Kcomputing signatures for files: genomes/akkermansia.fa, genomes/shew_os185.fa, genomes/shew_os223.fa\r\n", "\r", - "\u001b[KComputing signature for ksizes: [31]\r\n", - "\r", - "\u001b[KComputing only nucleotide (and not protein) signatures.\r\n", - "\r", "\u001b[KComputing a total of 1 signature(s).\r\n", "\r", "\u001b[Kskipping genomes/akkermansia.fa - already done\r\n", @@ -98,7 +92,7 @@ } ], "source": [ - "!sourmash compute --name-from-first -k 31 --scaled=1000 genomes/*" + "!sourmash sketch dna -p k=31,scaled=1000 genomes/*" ] }, { @@ -116,7 +110,18 @@ "cell_type": "code", "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "490" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "db.insert(sig1, ident='akkermansia')\n", "db.insert(sig2, ident='shew_os185')\n", @@ -207,9 +212,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "SourmashSignature('CP001071.1 Akkermansia muciniphila ATCC BAA-835, complete genome', 6822e0b7)\n", - "SourmashSignature('NC_009665.1 Shewanella baltica OS185, complete genome', b47b13ef)\n", - "SourmashSignature('NC_011663.1 Shewanella baltica OS223, complete genome', ae6659f6)\n" + "CP001071.1 Akkermansia muciniphila ATCC BAA-835, complete genome\n", + "NC_009665.1 Shewanella baltica OS185, complete genome\n", + "NC_011663.1 Shewanella baltica OS223, complete genome\n" ] } ], @@ -415,7 +420,18 @@ "cell_type": "code", "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "499" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n", "db.insert(sig1, lineage=lineage)" @@ -438,7 +454,7 @@ ], "source": [ "# by default, the identifier is the signature name --\n", - "ident = sig1.name()\n", + "ident = sig1.name\n", "idx = db.ident_to_idx[ident]\n", "print(\"ident '{}' has idx {}\".format(ident, idx))\n", "\n", @@ -666,7 +682,18 @@ "cell_type": "code", "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "490" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "db = sourmash.lca.LCA_Database(ksize=31, scaled=1000)\n", "db.insert(sig1, lineage=lineage1)\n", @@ -693,6 +720,14 @@ "text": [ "num hashvals: 494\n" ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/t/miniconda3/envs/py37/lib/python3.7/site-packages/ipykernel_launcher.py:1: DeprecatedWarning: get_mins is deprecated as of 3.5 and will be removed in 5.0. Use .hashes property instead.\n", + " \"\"\"Entry point for launching an IPython kernel.\n" + ] } ], "source": [ From c802035833b136b857cf7a903f78e49f7ff9ed59 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Mon, 15 Feb 2021 14:51:23 -0800 Subject: [PATCH 22/24] [MRG] update the migration guide for 4.0 with version pinning instructions (#1330) * update 4.0 migration docs with version pinning instructions * update migration docs --- doc/support.md | 88 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 61 insertions(+), 27 deletions(-) diff --git a/doc/support.md b/doc/support.md index 2f5a3bf775..c6315ea2da 100644 --- a/doc/support.md +++ b/doc/support.md @@ -1,7 +1,7 @@ # Support, Versioning, and Migration ```{contents} - :depth: 2 + :depth: 3 ``` ## Asking questions and filing bugs @@ -18,11 +18,25 @@ You can also ask questions of Titus on Twitter at [@ctitusbrown][1]. [0]:https://github.com/dib-lab/sourmash/issues [1]:https://twitter.com/ctitusbrown/ -## Versioning +## Versioning and stability of features and APIs + +We do our best to guarantee stability of features and APIs within +major versions - because of this, upgrading from (e.g.) sourmash v3.4 to +sourmash v3.5 should be a simple matter of installing the new version. + +We also recommend using _version pinning_ for software and workflows +that depend on sourmash, e.g. specifying `sourmash >=3,<4` for +software that is tested with sourmash 3.x. Read on for details! + +Upgrading major versions (to sourmash 4.0, for example) will often involve +more work; see the [next section](#upgrading-versions) for more +our suggested process. + +### Semantic versioning Our goal is to support the use of sourmash in pipelines and applications by communicating clearly about bug fixes, feature -additions, and feature changes. Versions are tagged in a +additions, and feature changes in sourmash. Versions are tagged in a `vMAJOR.MINOR.PATCH` format, following the [Semantic Versioning] convention. From their definition: @@ -44,6 +58,20 @@ So, for example, We do sometimes (rarely!) alter behavior in minor versions by fixing bugs; this will be documented in release notes. +### Version pinning + +For software and workflows that depend on sourmash, we recommend +pinning versions to the current _major_ release of sourmash. + +For example, with Python toolchains such as pip, you should be able to use: + +``` +sourmash>=3,<4 +``` +to pin the version requirement to any sourmash v3.x release. + +For conda, the same syntax should work. + ### Command line stability We intend that all command-line commands, command-line options, input @@ -64,22 +92,6 @@ will contain deprecations for all top-level API changes at the time of the first major release. See below for our suggested migration procedure. -### Rust API - -The Rust API is not yet at 1.0 and should not be regarded as stable. - -### How to "pin" sourmash versions - -If you are relying on sourmash in a pipeline or application, we -suggest specifying your version requirements at the major release, -e.g. in conda you would specify `sourmash>=3,<4` to rely on sourmash -v3.x features. - -Release notes for minor and patch versions are available on the -[GitHub releases page](https://github.com/dib-lab/sourmash/releases). - -[Semantic Versioning]: https://semver.org/ - ### Python version support sourmash v3.x supports Python 2.7 as well as Python 3.x, through Python 3.8. @@ -94,19 +106,41 @@ proposal for Python version support. For example, this would mean that we would drop support for Python 3.7 on December 26, 2021. -## Migrating from sourmash v3.x to sourmash v4.x. +### Rust API + +The Rust API is not yet at 1.0 and should not be regarded as stable. + +## Upgrading major versions + +If you depend on sourmash, we recommend using the following process: + +* pin sourmash to the major version you developed against, e.g. `sourmash >=3,<4`. +* when ready to upgrade sourmash, upgrade to the latest minor release within that major version (e.g. sourmash 3.5.x). +* scan for deprecations that affect you, check [the release notes](https://github.com/dib-lab/sourmash/releases), +and fix any major issues noted. +* upgrade to the next major version (e.g. sourmash 4.0) and run your integration tests or workflow. +* fix outstanding issues. + +In particular, we recommend upgrading major versions of sourmash in +isolation, without adding any new features to your software. -Our intent is to provide a clear path for migration between versions for our users. We rely on *semantic versioning* and deprecation warnings to do this - -* Within each major version release (v2, v3, v4), the command-line interface and Python APIs should remain the same, with features being only *added*. -* Across major versions (e.g. v2 to v3, and v3 to v4) we provide warnings when functionality will change in the next major version. +### Migrating from sourmash v3.x to sourmash v4.x. -So: if you want to upgrade workflows and scripts from prior releases of sourmash to sourmash v4.0, we suggest doing this in two stages. +If you want to upgrade workflows and scripts from prior releases of +sourmash to sourmash v4.0, we suggest doing this in two stages. -First, upgrade to the latest version of sourmash 3.5.x (currently [v3.5.0](https://github.com/dib-lab/sourmash/releases/tag/v3.5.0)), which is compatible with all files and command lines used in previous versions of sourmash (v2.x and v3.x). After upgrading to 3.5.x, scan the sourmash output for deprecation warnings and fix those. +First, upgrade to the latest version of sourmash 3.5.x (currently +[v3.5.0](https://github.com/dib-lab/sourmash/releases/tag/v3.5.0)), +which is compatible with all files and command lines used in previous +versions of sourmash (v2.x and v3.x). After upgrading to 3.5.x, scan +the sourmash output for deprecation warnings and fix those. -Next, upgrade to the latest version of 4.x, which will introduce some backwards incompatibilities based upon the deprecation warnings. +Next, upgrade to the latest version of 4.x, which will introduce some +backwards incompatibilities based upon the deprecation warnings. -The major changes are detailed below; please see the [full release notes for 4.0](release-notes/sourmash-4.0.md) for all the details and links to the code changes. +The major changes are detailed below; please see the +[full release notes for 4.0](release-notes/sourmash-4.0.md) for all +the details and links to the code changes. ### Sourmash command line From 01019dd8d6531196d3daf3c9b6662dc3b9f68bad Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Wed, 17 Feb 2021 11:16:12 -0800 Subject: [PATCH 23/24] Apply suggestions from code review Co-authored-by: Luiz Irber --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9b9382ae2e..1df1b800ce 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ The latest major release is sourmash v4, which has several command-line and Python incompatibilities with previous versions. Please [visit our migration guide](https://sourmash.readthedocs.io/en/latest/support.html#migrating-from-sourmash-v3-x-to-sourmash-4-x) -to ugprade! +to upgrade! ---- @@ -113,4 +113,4 @@ on getting set up with a development environment. ---- CTB -Jan 2021 +Feb 2021 From 71ef18d050243a821de8ffc4ceaf713c23101478 Mon Sep 17 00:00:00 2001 From: "C. Titus Brown" Date: Wed, 17 Feb 2021 14:47:22 -0800 Subject: [PATCH 24/24] Apply suggestions from code review Co-authored-by: Luiz Irber --- doc/release-notes/sourmash-4.0.md | 1 + doc/support.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/release-notes/sourmash-4.0.md b/doc/release-notes/sourmash-4.0.md index 66baf27c39..620af1f970 100644 --- a/doc/release-notes/sourmash-4.0.md +++ b/doc/release-notes/sourmash-4.0.md @@ -36,6 +36,7 @@ migrating to sourmash 4.0 in the * remove `dump` command (#1157) ### Feature/function deprecations + * deprecate `sourmash compute` (#1159) * deprecate `load_signatures`, `sourmash.load_one_signature`, `create_sbt_index`, and `load_sbt_index` (#1279, #1304) * deprecate `import_csv` in favor of new `sourmash sig import --csv` (#1281) diff --git a/doc/support.md b/doc/support.md index c6315ea2da..406ed81e65 100644 --- a/doc/support.md +++ b/doc/support.md @@ -130,7 +130,7 @@ If you want to upgrade workflows and scripts from prior releases of sourmash to sourmash v4.0, we suggest doing this in two stages. First, upgrade to the latest version of sourmash 3.5.x (currently -[v3.5.0](https://github.com/dib-lab/sourmash/releases/tag/v3.5.0)), +[v3.5.1](https://github.com/dib-lab/sourmash/releases/tag/v3.5.1)), which is compatible with all files and command lines used in previous versions of sourmash (v2.x and v3.x). After upgrading to 3.5.x, scan the sourmash output for deprecation warnings and fix those.