Skip to main content

Fast, efficient and scalable SNP distance calculation from disk.

Project description

FN6

Fast, efficient and scalable SNP distance calculation from disk.

FN5 reworked into Rust. Approximately 10x faster, easier to use and maintain, and adds checking for matching reference and mask in FN6 saves, all while retaining interoperability with FN5 saves.

Usage

All FASTA inputs can be optionally gzipped.

Usage: fn6 <COMMAND>

Commands:
  reference-compress  Reference compress a sample genome. This will create a .fn6 file that can be used for fast comparisons with other samples. The .fn6 file is a binary file that contains the compressed representation of the sample genome, as well as metadata about the reference and mask used for compression
  compute             Compute distances
  add-samples         Add some samples to existing samples. Only computes the extra distances required rather than all pairwise distances
  bulk-compress       Reference compress a set of genomes. Dumber than `ReferenceCompress` as it doesn't allow for setting specific IDs or output paths, but much faster as it can be parallelized across samples
  help                Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version

Reference compress

Reference compress a sample genome. This will create a .fn6 file that can be used for fast comparisons with other samples. The .fn6 file is a binary file that contains the compressed representation of the sample genome, as well as metadata about the reference and mask used for compression

Usage: fn6 reference-compress [OPTIONS] <REFERENCE> <MASK> <SAMPLE>

Arguments:
  <REFERENCE>  Path to the reference genome FASTA file
  <MASK>       Path to the mask file. The mask file is a text file containing the positions of the reference genome that should be masked (i.e., ignored) during the analysis. The positions are 0-based and should be separated by newlines
  <SAMPLE>     Path to the sample genome FASTA file

Options:
      --id <ID>          ID for this sample
      --output <OUTPUT>  Output path for the .fn6 file. If not provided, the .fn6 file will be saved in the same directory as the sample FASTA file with the same name but with a .fn6 extension
      --debug            Whether to print debug information to stderr
  -h, --help             Print help

Compute

Compute SNP distances

Usage: fn6 compute [OPTIONS]

Options:
  -r, --reference <REFERENCE>
          Path to the reference genome FASTA file. Only required if >=1 of the samples specified are fasta files
  -m, --mask <MASK>
          Path to the mask file. The mask file is a text file containing the positions of the reference genome that should be masked (i.e., ignored) during the analysis. The positions are 0-based and should be separated by newlines. Only required if >=1 of the samples specified are fasta files
  -s, --samples <SAMPLES>...
          Paths to sample files. Either .fn6, .fn5 or FASTA files. If FASTA files are provided, the `allow-fasta` flag must also be used. They will then be reference compressed on the fly (using the provided reference and mask) before distance computation
  -d, --directory <DIRECTORY>
          Directory to load from. Either .fn6, .fn5 or FASTA files. If FASTA files are provided, the `allow-fasta` flag must also be used. They will then be reference compressed on the fly (using the provided reference and mask) before distance computation
      --cutoff <CUTOFF>
          SNP threshold [default: 20]
      --fasta-extension <FASTA_EXTENSION>
          FASTA file extension to look for when loading from a directory. Only used if loading from a directory and if reference and mask are provided (i.e., if FASTA files need to be reference compressed on the fly). Default is "fasta" [default: fasta]
      --allow-fasta
          Whether to enable computation from FASTAs. It is recommended to pre-cache the reference compressed versions of the new samples to speed up computation
      --debug
          Whether to print debug information to stderr
  -h, --help
          Print help

Add samples

Add some samples to existing samples. Only computes the extra distances required rather than all pairwise distances

Usage: fn6 add-samples [OPTIONS]

Options:
  -r, --reference <REFERENCE>
          Path to the reference genome FASTA file. Only required if >=1 of the samples specified are fasta files
  -m, --mask <MASK>
          Path to the mask file. The mask file is a text file containing the positions of the reference genome that should be masked (i.e., ignored) during the analysis. The positions are 0-based and should be separated by newlines. Only required if >=1 of the samples specified are fasta files
  -s, --existing-samples <EXISTING_SAMPLES>...
          Paths to existing sample files. Either .fn6, .fn5 or FASTA files. If FASTA files are provided, the `allow-fasta` flag must also be used. They will then be reference compressed on the fly (using the provided reference and mask) before distance computation
  -d, --existing-directory <EXISTING_DIRECTORY>
          Directory to load existing saves from. Either .fn6, .fn5 or FASTA files. If FASTA files are provided, the `allow-fasta` flag must also be used. They will then be reference compressed on the fly (using the provided reference and mask) before distance computation
  -S, --new-samples <NEW_SAMPLES>...
          Paths to sample files to add. Either .fn6, .fn5 or FASTA files. If FASTA files are provided, the `allow-fasta` flag must also be used. They will then be reference compressed on the fly (using the provided reference and mask) before distance computation
  -D, --new-directory <NEW_DIRECTORY>
          Directory to load new saves from. Either .fn6, .fn5 or FASTA files. If FASTA files are provided, the `allow-fasta` flag must also be used. They will then be reference compressed on the fly (using the provided reference and mask) before distance computation
      --cutoff <CUTOFF>
          SNP threshold [default: 20]
  -f, --fasta-extension <FASTA_EXTENSION>
          FASTA file extension to look for when loading from a directory. Only used if loading from a directory and if reference and mask are provided (i.e., if FASTA files need to be reference compressed on the fly). Default is "fasta" [default: fasta]
      --allow-fasta
          Whether to enable computation from FASTAs. It is recommended to pre-cache the reference compressed versions of the new samples to speed up computation
      --debug
          Whether to print debug information to stderr
  -h, --help
          Print help

Bulk Compress

Reference compress a set of genomes. Dumber than `ReferenceCompress` as it doesn't allow for setting specific IDs or output paths, but much faster as it can be parallelized across samples

Usage: fn6 bulk-compress [OPTIONS] <REFERENCE> <MASK>

Arguments:
  <REFERENCE>  Path to the reference genome FASTA file
  <MASK>       Path to the mask file. The mask file is a text file containing the positions of the reference genome that should be masked (i.e., ignored) during the analysis. The positions are 0-based and should be separated by newlines

Options:
  -s, --samples <SAMPLES>...
          Paths to sample files. Either FASTA files or .fn6 files
  -d, --directory <DIRECTORY>
          Directory to load from
  -l, --list <LIST>
          Line separated file to read paths from
  -o, --output <OUTPUT>
          Output directory to write saves to. Useful when using `list` as it consolidates saves in a single directory. If not provided, the .fn6 files will be saved in the same directory as their corresponding FASTA files with the same name but with a .fn6 extension
      --fasta-extension <FASTA_EXTENSION>
          FASTA file extension to look for when loading from a directory [default: fasta]
      --debug
          Whether to print debug information to stderr
  -h, --help
          Print help

Performance

Both FN5 and FN6 produce the same results, but with condsiderable time differences. Below is a table of comparison between FN5 and FN6 performance on varying sets of Mycobacterium tuberculosis samples, randomly selected from the CRyPTIC dataset https://doi.org/10.5281/zenodo.16041005 All of the benchmarks were run on the same laptop with an Intel i9-13900H and 32GB RAM, directly from SSD.

N Samples (passing QC) Comparisons FN5 Reference compression FN5 Compute pairwise matrix (per comparison) FN5 Compute pairwise matrix (per comparison) no cutoff FN6 Reference compression FN6 Compute pairwise matrix (per comparison) FN6 Compute pairwise matrix (per comparison) no cutoff FN6 Compute pairwise matrix from FN5 saves (per comparison) FN6 Compute pairwise matrix from FN5 saves (per comparison) no cutoff
100 4,950 1.394s 44ms (8.9µs) 175ms (35.6µs) 0.17s 7.93ms (1.60µs) 81.28ms (16.42µs) 9.29ms (1.88µs) 53.49ms (10.81µs)
250 31,125 1.698s 208ms (6.7µs) 1087ms (34.9µs) 0.33s 32.29ms (1.04µs) 280.36ms (9.01µs) 24.75ms (795.00ns) 270.21ms (8.68µs)
500 124,750 3.506s 628ms (5.0µs) 3905ms (31.3µs) 0.67s 84.04ms (673.00ns) 921.34ms (7.39µs) 48.75ms (390.00ns) 1010ms (8.13µs)
750 280,875 5.091s 1298ms (4.6µs) 8179ms (29.1µs) 0.92s 114.78ms (408.00ns) 2000ms (7.14µs) 91.94ms (327.00ns) 5580ms (19.85µs)
1000 499,500 6.735s 2287ms (4.6µs) 14299ms (28.6µs) 0.90s 152.88ms (306.00ns) 3480ms (6.98µs) 143.89ms (288.00ns) 8910ms (17.85µs)
1500 (1493) 1,113,785 11.363s 7481ms (6.7µs) 100481ms (90.2µs) 2.03s 300.10ms (269.00ns) 9130ms (8.20µs) 296.32ms (266.00ns) 22720ms (20.40µs)
2000 (1992) 1,983,044 16.377s 30805ms (15.5µs) 205160ms (103.5µs) 2.69s 487.53ms (245.00ns) 18390ms (9.27µs) 613.04ms (309.00ns) 42150ms (21.25µs)

All of the times to compute a pairwise matrix include the time taken to read the saves from disk. The time taken to load the saves from disk varies by tool, but is an important component of the real world runtime.

Mean time to load a save from disk across all above runs:

FN5 FN6 FN6 (from FN5 saves)
64.6µs 25.0µs 41.3µs

This also demonstrates the importance of utilising a SNP cutoff within the computation. Otherwise, per sample comparison times scale according to how disparate samples are.

Testing

For simplicity, testing is based on a dummy genome with 80 bases. This allows for known SNPs to be introduced and manually calculated

cargo test

Tree building

Optionally included in the Python package is code to produce a neighbour joining phylogenetic tree in newick format. This has a few requirements:

  • A minimum of 4 samples within the comparison
  • Distances are computed with no SNP cutoff

Example:

# Optional virtual environment
python -m venv env
source env/bin/activate

# Install fn6, both as a rust CLI tool and a python library
cargo install fn6
pip install "fn6[tree]"

# Create a table of distances with an arbitrarily high cutoff
fn6 compute -d path/to/some/samples -r path/to/a/reference -m path/to/a/mask --cutoff 9999999 > your-distances.txt

# Build a tree
find-neighbour-to-tree --input your-distances.txt --output your-tree.nwk

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

fn6-0.1.2-cp312-cp312-win_amd64.whl (263.9 kB view details)

Uploaded CPython 3.12Windows x86-64

fn6-0.1.2-cp312-cp312-musllinux_1_2_x86_64.whl (985.7 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

fn6-0.1.2-cp312-cp312-musllinux_1_2_i686.whl (1.0 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ i686

fn6-0.1.2-cp312-cp312-musllinux_1_2_armv7l.whl (1.1 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARMv7l

fn6-0.1.2-cp312-cp312-musllinux_1_2_aarch64.whl (940.7 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

fn6-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (823.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

fn6-0.1.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl (839.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ s390x

fn6-0.1.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (800.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ppc64le

fn6-0.1.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (801.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARMv7l

fn6-0.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (767.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

fn6-0.1.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl (811.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.12+ i686

fn6-0.1.2-cp312-cp312-macosx_11_0_arm64.whl (367.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

File details

Details for the file fn6-0.1.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: fn6-0.1.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 263.9 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for fn6-0.1.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 f0efb07de8ba918a94a7ee1d6f9df80bc7962e2c1850ab858ad77726f0ba9a94
MD5 2e65032406e3bc08910b4921cf611222
BLAKE2b-256 f8184c13f14325dfca2218f4c48f3a977d9d95f23645cb0410c4da482edae234

See more details on using hashes here.

File details

Details for the file fn6-0.1.2-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for fn6-0.1.2-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c5d9768baf47ffc5878d8148053f639a2c2182fc51d8fccdff406b68295f2da5
MD5 76c673c0d1b39c85a5b4c11729ac0781
BLAKE2b-256 c1421c2f1aaa51bff04eab57bac88cb32b2f20218522fc8702db293704e879aa

See more details on using hashes here.

File details

Details for the file fn6-0.1.2-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for fn6-0.1.2-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 b547cd73d288acb2f911ccce54c39ecd072f943d03a69f7ec155f8fcd5d4ed60
MD5 3f4fbab4e79ca9dbbf501a02b8f8eeee
BLAKE2b-256 63782b0738f8b56a9f65b219ce3ccbb6a02800ac94a25902fae994e46de470e9

See more details on using hashes here.

File details

Details for the file fn6-0.1.2-cp312-cp312-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for fn6-0.1.2-cp312-cp312-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 b48f6e53fdf7e6bf8c2c37fc2d3df6866e9de5581c2f58551b67ab13e6d878ca
MD5 a224d6fb8bb05c784993208d3d7609e3
BLAKE2b-256 ece81aab6fa5187f377e51ec4997e92b91550dbabc49eca69c08eec085ebae68

See more details on using hashes here.

File details

Details for the file fn6-0.1.2-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for fn6-0.1.2-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8b0dfcf5de9e47075100732506aaa09519bcfcff986fb3cd8b389a85805dad57
MD5 6cf1d3e0c5a8681793c831026bb6a325
BLAKE2b-256 e995f8d3e9ad25aa1ddafdcab177312d723e6739453fd69a8c3fbd1fc400980a

See more details on using hashes here.

File details

Details for the file fn6-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for fn6-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 067520fe1fcb81aa378219ec9e637625a81a27279d427ac390736fb8e12de360
MD5 cbed579bf3a2b332d344f7afc46e7309
BLAKE2b-256 ba1e4d5165c52e6327c4af15d187b885144c56e5f54dd77764787d4b8ef1af26

See more details on using hashes here.

File details

Details for the file fn6-0.1.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for fn6-0.1.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 10699cfb71e2c495bb5e31fddf34df34f97b33b73e27947b53f813219b8d1a81
MD5 cc107ef23a1210be4fdd5902e0c56c3c
BLAKE2b-256 15381135e38e51fee51b59cdad6d3bc86a1468aefd953a6387ec476c5228aafb

See more details on using hashes here.

File details

Details for the file fn6-0.1.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for fn6-0.1.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 b41ab3692943de07a047ce27c1217e71fcd8f859db7873323fd19ced5354cdbf
MD5 c400be8fdaeedd29c56553268636a846
BLAKE2b-256 e80bd1ea38a9f8c017d6da648f4f816f21cde3d9fe18433ca0d05ba43974748f

See more details on using hashes here.

File details

Details for the file fn6-0.1.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for fn6-0.1.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 cbe965b48d4641ec07cbf32144cbdaccb10899054de84fb7c008923814a048e3
MD5 8fea37baa538cdaf08c8d98fdc2e481f
BLAKE2b-256 daa55d4c105cfa239f91d7474474735f1ef7548d349419533bb1ff039daf7ca0

See more details on using hashes here.

File details

Details for the file fn6-0.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for fn6-0.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 dbf1b35d86d434d91d7849bdfa86fd4591ccd9131f3c8c69883d2ad407c50ca3
MD5 b17b7ed7d0d2c005531ce7d50b9bbf59
BLAKE2b-256 c3e034bfb7ab7464667f1a6a1d105812c33f230f9e935ea55d3cc34a829aaaf4

See more details on using hashes here.

File details

Details for the file fn6-0.1.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for fn6-0.1.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 a63d39b90505561db27afc470ad705314f9ce28e5bb5020c52f57b3af383e5a2
MD5 ea5815b9d177a66f5ec27a3fef002146
BLAKE2b-256 e0598411f319fa47cb8e2d243dc0bd00057cc35206cb1e80ad51d114f57b9611

See more details on using hashes here.

File details

Details for the file fn6-0.1.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for fn6-0.1.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8fc452e4cf1eb7e0b6234eecaf7173c5523a70e55ca4a1256692c16318014fb3
MD5 a69776516f4dbe4d5cb8088b69b429f2
BLAKE2b-256 b51d8ff70a26114af21839d7dc18de3306c9b04c7b4594971ac9c788ab81f9ff

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page