JELLYFISH(1)
JELLYFISH(1) ๐
k-mer counter ยท the jellyfish(1) manual, bestie edition ๐ชผ
โจ NAME โจ
jellyfish โ software to count k-mers in DNA sequences ๐งฌ๐
โจ 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. That's it, that's the whole vibe. ๐ซถ
๐ธ COUNTING AND MERGING ๐ธ
To count k-mers, use a command like:
jellyfish count -m 22 -o output -c 3 -s 10000000 -t 32 input.fasta
So what's happening here? This will count the 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. No cap, we're doing it. ๐ฅ
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 (has 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 ashisto,stats, etc.), the multiple output files, if any, need to be merged into one with themergecommand. Do not skip this step, bestie, I'm begging. ๐ญ
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. Lowkey just re-run it, it's the move. ๐
๐ฆ 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. ๐
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. Iconic behaviour, honestly. ๐
๐ 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. Main character energy: fit everything, write nothing. โจ
We consider to 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. So fancy, so convenient. ๐
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. Math girlies, this one's for you. ๐ง
๐ 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 occurring 2 million times will have a value reported of 2 million (i.e., it is not capped at 2^5). Read that again. Not capped. Periodt.
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. It's giving โจbalanceโจ.
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 so jellyfish is literally a whole friend group of subcommands, and each one has its own little menu. default values are in (), and a * means required โ no skipping those, bestie. ๐
๐งฎ COUNT ๐งฎ
Usage:
jellyfish count [options] file:path+
Count k-mers or qmers in fasta or fastq files. yes ma'am, the main character of the operation. ๐
Options (default value in (), *required):
-m,--mer-len=uint32โ Length of mer (required) ๐ซถ-s,--size=uint64โ Hash size (required) ๐ซถ-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 ๐
Usage:
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 ๐
Usage:
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
๐๏ธ DUMP ๐๏ธ
Usage:
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 ๐งฌ
Usage:
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 ๐
Usage:
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 ๐
Usage:
jellyfish qhisto [options] db:string
Create an histogram of k-mer occurrences.
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 ๐๏ธ
Usage:
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 ๐งฌ
Usage:
jellyfish merge [options] db:string+
Merge quake databases.
Options (default value in (), *required):
-s,--size=uint64โ Merged hash table size (required) ๐ซถ-m,--mer-len=uint32โ Mer length (required) ๐ซถ-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 ๐
Usage:
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
๐ BUGS ๐
jellyfish mergehas not been parallelized and is relatively slow.- The hash table does not grow in memory automatically and
jellyfish mergeis not called automatically on the intermediary files (if any).
๐ COPYRIGHT & LICENSE ๐
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 โ k-mer counter energy, version 1.1.4 dated 2010/10/1, and yes, it's JELLYFISH(1). Periodt. ๐ โจ
๐ฆ where this page comes from
- debian trixie: jellyfish 2.3.1-4+b1 ยท GPL-3.0-or-later OR BSD-3-Clause
- ubuntu noble: jellyfish 2.3.1-3build1 ยท GPL-3.0-or-later OR BSD-3-Clause
- ubuntu questing: jellyfish 2.3.1-4build1
- ubuntu resolute: jellyfish 2.3.1-5build1 ยท GPL-3.0-or-later OR BSD-3-Clause
- ubuntu stonking: jellyfish 2.3.1-6build1 ยท GPL-3.0-or-later OR BSD-3-Clause
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms