JELLYFISH(1)

๐Ÿฆ‹ NAME ๐Ÿฆ‹

jellyfish1 โ€” count k-mers in DNA sequences โœจ

(and yes bestie, this is the manual page for JELLYFISH(1), aka the k-mer counter โ€” welcome to the group chat ๐Ÿ’–)


๐ŸŒธ SYNOPSIS ๐ŸŒธ

jellyfish count [-oprefix] [-mmerlength] [-tthreads] [-shashsize]
[--both-strands] fasta [fasta ...  ]
jellyfish merge hash1 hash2 ...
jellyfish dump hash
jellyfish stats hash
jellyfish histo [-hhigh] [-llow] [-iincrement] hash
jellyfish query hash
jellyfish cite

Plus equivalent version for Quake mode: qhisto, qdump and qmerge. ๐ŸŽ€


๐Ÿ’… DESCRIPTION ๐Ÿ’…

Jellyfish is a k-mer counter based on a multi-threaded hash table implementation. Like, that's the whole vibe. It counts k-mers and it does it fast and in parallel. ๐Ÿ‘‘

๐Ÿงฎ COUNTING AND MERGING ๐Ÿงฎ

To count k-mers, use a command like this, bestie:

jellyfish count -m 22 -o output -c 3 -s 10000000 -t 32 input.fasta

This will count the 22-mers in input.fasta with 32 threads. The counter field in the hash uses only 3 bits and the hash has at least 10 million entries. Slay. โœจ

The output files will be named output_0, output_1, etc. (the prefix is specified with the -o switch). If the hash is large enough (as specified by the -s switch) to fit all the k-mers, there will be only one output file named output_0. If the hash filled up before all the mers were read, the hash is dumped to disk, zeroed out and reading in mers resumes. Multiple intermediary files will be present on the disks, named output_0, output_1, etc. ๐Ÿซถ

To obtain correct results from the other sub-commands (such as histo, stats, etc.), the multiple output files, if any, need to be merged into one with the merge command. For example with the following command:

jellyfish merge -o output.jf output\_*
Should you get many intermediary output files (say hundreds), the size of the hash table is too small. Rerunning Jellyfish with a larger size (option -s) is probably faster than merging all the intermediary files. ๐Ÿ˜ญ so like, just use a bigger hash, ok?

๐Ÿ”„ ORIENTATION ๐Ÿ”„

When the orientation of the sequences in the input fasta file is not known, e.g. in sequencing reads, using --both-strands (-C) makes the most sense. fr fr. ๐Ÿ’œ

For any k-mer m, its canonical representation is m itself or its reverse-complement, whichever comes first lexicographically. With the option -C, only the canonical representation of the mers are stored in the hash and the count value is the number of occurrences of both the mer and its reverse-complement. ๐Ÿฆ‹

๐Ÿ“ CHOOSING THE HASH SIZE ๐Ÿ“

To achieve the best performance, a minimum number of intermediary files should be written to disk. So the parameter -s should be chosen to fit as many k-mers as possible (ideally all of them) while still fitting in memory. Like, all of them if you can. ๐Ÿ‘‘

We consider two examples: counting mers in sequencing reads and in a finished genome.

First, suppose we count k-mers in short sequencing reads: there are n reads and there is an average of 1 error per reads where each error generates k unique mers. If the genome size is G, the size of the hash (option -s) to fit all k-mers at once is estimated to: $(G + k*n)/0.8$. The division by 0.8 compensates for the maximum usage of approximately $80%$ of the hash table. ๐Ÿ“

On the other hand, when counting k-mers in an assembled sequence of length G, setting -s to G is appropriate.

As a matter of convenience, Jellyfish understands ISO suffixes for the size of the hash. Hence '-s 10M' stands 10 million entries while '-s 50G' stands for 50 billion entries. iconic. โœจ

The actual memory usage of the hash table can be computed as follow. The actual size of the hash will be rounded up to the next power of 2: s=2^l. The parameter r is such that the maximum reprobe value (-p) plus one is less than 2^r. Then the memory usage per entry in the hash is (in bits, not bytes) 2k-l+r+1. The total memory usage of the hash table in bytes is: 2^l*(2k-l+r+1)/8. ๐Ÿงš

๐Ÿ”ข CHOOSING THE COUNTING FIELD SIZE ๐Ÿ”ข

To save space, the hash table supports variable length counter, i.e. a k-mer occurring only a few times will use a small counter, a k-mer occurring many times will used multiple entries in the hash. ๐Ÿ’…

Important: the size of the couting field does NOT change the result, it only impacts the amount of memory used. In particular, there is no maximum value in the hash. Even if the counting field uses 5 bits, a k-mer occuring 2 million times will have a value reported of 2 million (i.e., it is not capped at 2^5). no cap, literally. ๐Ÿ˜ญ

The -c specify the length (in bits) of the counting field. The trade off is as follows: a low value will save space per entry in the hash but can potentially increase the number of entries used, hence maybe requiring a larger hash. ๐Ÿ™ˆ

In practice, use a value for -c so that most of you k-mers require only 1 entry. For example, to count k-mers in a genome, where most of the sequence is unique, use -c1 or -c2. For sequencing reads, use a value for -c large enough to counts up to twice the coverage. For example, if the coverage is 10X, choose a counter length of 5 (-c5) as $2^5 > 20$. ๐ŸŽ€

โœจ SUBCOMMANDS AND OPTIONS โœจ

okay bestie, this is the whole jellyfish menu. every subcommand has its own usage line, its own options, and defaults live in the (). a * means required, so don't skip those unless you enjoy chaos ๐Ÿ’€


๐Ÿš COUNT ๐Ÿš

jellyfish count [options] file:path+

Count k-mers or qmers in fasta or fastq files. yes, plural files, you can feed it many.

Options (default value in (), * = required):

  • -m, --mer-len=uint32 โ€” required โ€” Length of mer.
  • -s, --size=uint64 โ€” required โ€” Hash size.
  • -t, --threads=uint32 โ€” Number of threads (1).
  • -o, --output=string โ€” Output prefix (mer_counts).
  • -c, --counter-len=Length โ€” in bits Length of counting field (7).
  • --out-counter-len=Length โ€” in bytes Length of counter field in output (4).
  • -C, --both-strands โ€” Count both strand, canonical representation (false).
  • -p, --reprobes=uint32 โ€” Maximum number of reprobes (62).
  • -r, --raw โ€” Write raw database (false).
  • -q, --quake โ€” Quake compatibility mode (false).
  • --quality-start=uint32 โ€” Starting ASCII for quality values (64).
  • --min-quality=uint32 โ€” Minimum quality. A base with lesser quality becomes an N (0).
  • -L, --lower-count=uint64 โ€” Don't output k-mer with count < lower-count.
  • -U, --upper-count=uint64 โ€” Don't output k-mer with count > upper-count.
  • --matrix=Matrix โ€” file Hash function binary matrix.
  • --timing=Timing โ€” file Print timing information.
  • --stats=Stats โ€” file Print stats.
  • --usage โ€” Usage.
  • -h, --help โ€” This message.
  • --full-help โ€” Detailed help.
  • -V, --version โ€” Version.

๐Ÿ“Š STATS ๐Ÿ“Š

jellyfish stats [options] db:path

Statistics. Display some statistics about the k-mers in the hash:

  • Unique: Number of k-mers which occur only once.
  • Distinct: Number of k-mers, not counting multiplicity.
  • Total: Number of k-mers, including multiplicity.
  • Max_count: Maximum number of occurrence of a k-mer.

Options (default value in (), * = required):

  • -L, --lower-count=uint64 โ€” Don't consider k-mer with count < lower-count.
  • -U, --upper-count=uint64 โ€” Don't consider k-mer with count > upper-count.
  • -v, --verbose โ€” Verbose (false).
  • -o, --output=string โ€” Output file.
  • --usage โ€” Usage.
  • -h, --help โ€” This message.
  • --full-help โ€” Detailed help.
  • -V, --version โ€” Version.

๐Ÿ“ˆ HISTO ๐Ÿ“ˆ

jellyfish histo [options] db:path

Create an histogram of k-mer occurrences.

Create an histogram with the number of k-mers having a given count. In bucket i are tallied the k-mers which have a count c satisfying low+i*inc <= c < low+(i+1)*inc. Buckets in the output are labeled by the low end point (low+i*inc).

The last bucket in the output behaves as a catchall: it tallies all k-mers with a count greater or equal to the low end point of this bucket.

Options (default value in (), * = required):

  • -l, --low=uint64 โ€” Low count value of histogram (1).
  • -h, --high=uint64 โ€” High count value of histogram (10000).
  • -i, --increment=uint64 โ€” Increment value for buckets (1).
  • -t, --threads=uint32 โ€” Number of threads (1).
  • -f, --full โ€” Full histo. Don't skip count 0. (false).
  • -o, --output=string โ€” Output file.
  • -v, --verbose โ€” Output information (false).
  • --usage โ€” Usage.
  • --help โ€” This message.
  • --full-help โ€” Detailed help.
  • -V, --version โ€” Version.
heads up bestie: -h is high, so help is only --help here. iconic little trap ๐Ÿ’…

๐Ÿ—‘๏ธ DUMP ๐Ÿ—‘๏ธ

jellyfish dump [options] db:path

Dump k-mer counts.

By default, dump in a fasta format where the header is the count and the sequence is the sequence of the k-mer. The column format is a 2 column output: k-mer count.

Options (default value in (), * = required):

  • -c, --column โ€” Column format (false).
  • -t, --tab โ€” Tab separator (false).
  • -L, --lower-count=uint64 โ€” Don't output k-mer with count < lower-count.
  • -U, --upper-count=uint64 โ€” Don't output k-mer with count > upper-count.
  • -o, --output=string โ€” Output file.
  • --usage โ€” Usage.
  • -h, --help โ€” This message.
  • -V, --version โ€” Version.

๐Ÿ”— MERGE ๐Ÿ”—

jellyfish merge [options] input:string+

Merge jellyfish databases.

Options (default value in (), * = required):

  • -s, --buffer-size=Buffer โ€” length Length in bytes of input buffer (10000000).
  • -o, --output=string โ€” Output file (mer_counts_merged.jf).
  • --out-counter-len=uint32 โ€” Length (in bytes) of counting field in output (4).
  • --out-buffer-size=uint64 โ€” Size of output buffer per thread (10000000).
  • -v, --verbose โ€” Be verbose (false).
  • --usage โ€” Usage.
  • -h, --help โ€” This message.
  • -V, --version โ€” Version.

๐Ÿ”Ž QUERY ๐Ÿ”Ž

jellyfish query [options] db:path

Query from a compacted database.

Query a hash. It reads k-mers from the standard input and write the counts on the standard output.

Options (default value in (), * = required):

  • -C, --both-strands โ€” Both strands (false).
  • -c, --cary-bit โ€” Value field as the cary bit information (false).
  • -i, --input=file โ€” Input file.
  • -o, --output=file โ€” Output file.
  • --usage โ€” Usage.
  • -h, --help โ€” This message.
  • -V, --version โ€” Version.

๐Ÿ“Š QHISTO ๐Ÿ“Š

jellyfish qhisto [options] db:string

Create an histogram of k-mer occurences. (their spelling, not mine ๐Ÿซถ)

Options (default value in (), * = required):

  • -l, --low=double โ€” Low count value of histogram (0.0).
  • -h, --high=double โ€” High count value of histogram (10000.0).
  • -i, --increment=double โ€” Increment value for buckets (1.0).
  • -f, --full โ€” Full histo. Don't skip count 0. (false).
  • --usage โ€” Usage.
  • --help โ€” This message.
  • -V, --version โ€” Version.

๐Ÿงฌ QDUMP ๐Ÿงฌ

jellyfish qdump [options] db:path

Dump k-mer from a qmer database.

By default, dump in a fasta format where the header is the count and the sequence is the sequence of the k-mer. The column format is a 2 column output: k-mer count.

Options (default value in (), * = required):

  • -c, --column โ€” Column format (false).
  • -t, --tab โ€” Tab separator (false).
  • -L, --lower-count=double โ€” Don't output k-mer with count < lower-count.
  • -U, --upper-count=double โ€” Don't output k-mer with count > upper-count.
  • -v, --verbose โ€” Be verbose (false).
  • -o, --output=string โ€” Output file.
  • --usage โ€” Usage.
  • -h, --help โ€” This message.
  • -V, --version โ€” Version.

๐Ÿงฌ QMERGE ๐Ÿงฌ

jellyfish merge [options] db:string+

Merge quake databases.

yes bestie, the usage line says merge, not qmerge โ€” I don't make the rules, I just report them ๐Ÿ’…

Options (default value in (), * = required):

  • -s, --size=uint64 โ€” required โ€” Merged hash table size.
  • -m, --mer-len=uint32 โ€” required โ€” Mer length.
  • -o, --output=string โ€” Output file (merged.jf).
  • -p, --reprobes=uint32 โ€” Maximum number of reprobes (62).
  • --usage โ€” Usage.
  • -h, --help โ€” This message.
  • --full-help โ€” Detailed help.
  • -V, --version โ€” Version.

๐Ÿ“ CITE ๐Ÿ“

jellyfish cite [options]

How to cite Jellyfish's paper.

Citation of paper.

Options (default value in (), * = required):

  • -b, --bibtex โ€” Bibtex format (false).
  • -o, --output=string โ€” Output file.
  • --usage โ€” Usage.
  • -h, --help โ€” This message.
  • -V, --version โ€” Version.

๐ŸŒˆ VERSION ๐ŸŒˆ

Version: 1.1.4 of 2010/10/1. periodt.


๐Ÿ’€ BUGS ๐Ÿ’€

  • jellyfish merge has not been parallelized and is relatively slow.
  • The hash table does not grow in memory automatically and jellyfish merge is not called automatically on the intermediary files (if any).

Copyright

(C)2010, Guillaume Marcais guillaume@marcais.net and Carl Kingsford carlk@umiacs.umd.edu.

License

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

๐Ÿ‘‘ AUTHORS ๐Ÿ‘‘

  • Guillaume Marcais University of Maryland gmarcais@umd.edu
  • Carl Kingsford University of Maryland carlk@umiacs.umd.edu

that's the whole vibe, bestie. source: JELLYFISH(1), version 1.1.4, dated 2010/10/1, footer label k-mer counter. now go count some k-mers and slay ๐Ÿ’–โœจ