#snp #matrix #pairwise #bioinformatics #fasta

bin+lib psdm

从一个或两个比对文件计算成对的SNP距离矩阵

3个版本 (破坏性更新)

0.3.0 2024年6月20日
0.2.0 2022年6月13日
0.1.0 2021年11月4日

#124 in 生物学

自定义许可

105KB
621

codecov Rust CI License: MIT github release version DOI

从一个或两个比对文件计算成对的SNP距离矩阵

目录

动机

psdm的一个关键区别是两个比对文件之间的成对SNP距离。如果您已经为许多样本计算了SNP距离矩阵,并希望用一些新样本更新距离,而无需重新运行原始文件中所有样本的分析,这将特别有益。

另一个潜在用途是拥有两个具有相同样本但由不同技术生成的比对文件。例如,如果您从Illumina和Nanopore的SNP调用中生成了共识序列,并希望查看Illumina到Nanopore(跨技术)距离与跨技术距离相比如何。

尽管有这些动机,psdm仍然可以用来计算单个FASTA比对文件的“传统”成对SNP距离矩阵。

安装

cargo

Crates.io

先决条件:rust 工具链(最小版本v1.55.0)

$ cargo install psdm

conda

Conda (channel only) bioconda version Conda

先决条件:conda(以及bioconda频道正确设置

$ conda install psdm

预编译的二进制文件

tl;dr:运行以下片段将系统上的最新二进制文件下载到当前目录,并显示帮助菜单。

version="0.3.0"
OS=$(uname -s)                                                                                                       
if [ "$OS" = "Linux" ]; then                                                                                         
    triple="x86_64-unknown-linux-musl"                                                                              
elif [ "$OS" = "Darwin" ]; then                                                                                        
    triple="x86_64-apple-darwin"                                                         
else                                                      
    echo "ERROR: $OS not a recognised operating system"
fi              
if [ -n "$triple" ]; then   
    URL="https://github.com/mbhall88/psdm/releases/download/${version}/psdm-${version}-${triple}.tar.gz"
    wget "$URL" -O - | tar -xzf -
    ./psdm --help             
fi

这些二进制文件不需要您安装rust工具链。

目前,有两个预编译的二进制文件可用

  • Linux内核 x86_64-unknown-linux-musl(在大多数我测试的Linux发行版上工作)
  • OSX内核 x86_64-apple-darwin(适用于任何2007年后的Mac)

使用wget下载这些二进制文件的一个示例

$ version="0.3.0"
$ URL="https://github.com/mbhall88/psdm/releases/download/${version}/psdm-${version}-x86_64-unknown-linux-musl.tar.gz"
$ wget "$URL" -O - | tar -xzf -
$ ./psdm --help

如果这些二进制文件在您的系统上不起作用,请提出问题,我将可能添加一些额外的目标三元组

homebrew

先决条件:homebrew

使用homebrew-bio tap完成homebrew安装。

$ brew install brewsci/bio/psdm

容器

容器镜像托管在 quay.io

singularity

先决条件:singularity

$ URI="docker://quay.io/mbhall88/psdm"
$ singularity exec "$URI" psdm --help

上述命令将使用最新版本。如果您想指定版本,请使用类似以下格式的 标签(或提交)。

$ VERSION="0.3.0"
$ URI="docker://quay.io/mbhall88/psdm:${VERSION}"

docker

Docker Repository on Quay

先决条件:docker

$ docker pull quay.io/mbhall88/psdm
$ docker run quay.io/mbhall88/psdm psdm --help

您可以在 quay.io 仓库 中找到所有可用的标签。

本地

先决条件:rust 工具链

$ git clone https://github.com/mbhall88/psdm.git
$ cd psdm
$ cargo build --release
$ target/release/psdm --help
# if you want to check everything is working ok
$ cargo test

用法

快速

单个对齐文件

aln1.fa

>s1
ABCDEFGH
>s2
aBN-XFnH
>s0
AbCdEfG-
$ psdm aln1.fa
,s1,s2,s0
s1,0,1,0
s2,1,0,1
s0,0,1,0

两个对齐文件

aln2.fa.gz

>s2
xXNNfoo=
>s5 description
AB-DEFGG
$ psdm aln1.fa aln2.fa.gz
,s1,s2,s0
s2,6,5,5
s5,1,2,0

列名代表提供的 第一个 对齐文件。

完整

我想按标识符排序输出序列

$ psdm -s aln1.fa
,s0,s1,s2
s0,0,0,1
s1,0,0,1
s2,1,1,0

我想一个制表符分隔的(TSV)矩阵,而不是一个逗号分隔的(CSV)矩阵

$ psdm -d "\t" aln1.fa
        s1      s2      s0
s1      0       1       0
s2      1       0       1
s0      0       1       0

核苷酸的字母大小写对我来说很重要 - 即,acgtACGT 不相同

$ psdm -c aln1.fa
,s1,s2,s0
s1,0,3,3
s2,3,0,5
s0,3,5,0

默认情况下,psdm 会忽略 N 和间隙(-)。但是,也许您还想忽略 X

$ psdm -e NX- aln1.fa
,s1,s2,s0
s1,0,0,0
s2,0,0,0
s0,0,0,0

或者,也许您不想忽略任何内容

$ psdm -e "" aln1.fa
,s1,s2,s0
s1,0,5,4
s2,5,0,8
s0,4,8,0

我很着急,请使用我所有的线程!

$ psdm -t 0 aln1.fa

请提供长格式输出而不是矩阵

$ psdm -l aln1.fa
s1,s1,0
s1,s2,1
s1,s0,0
s2,s1,1
s2,s2,0
s2,s0,1
s0,s1,0
s0,s2,1
s0,s0,0

我想知道成对比较的进度

$ psdm -P -t 8 aln.fa
[2024-06-20T02:50:32Z INFO  psdm] Using 8 thread(s)
[2024-06-20T02:50:32Z INFO  psdm] Loading first alignment file...
[2024-06-20T02:50:38Z INFO  psdm] Loaded 200 sequences with length 4411532bp
[2024-06-20T02:50:38Z INFO  psdm] Calculating 20100 pairwise distances...
Progress: 50.00% (10050 / 20100)

请将矩阵写入文件

$ psdm -o dists.csv aln1.fa
$ psdm --help
psdm 0.3.0
Michael Hall <[email protected]>
Compute a pairwise SNP distance matrix from one or two alignment(s)

USAGE:
    psdm [OPTIONS] [ALIGNMENTS]...

ARGS:
    <ALIGNMENTS>...
            FASTA alignment file(s) to compute the pairwise distance for.

            Providing two files will compute the distances for all sequences in one file against all
            sequences from the other file - i.e., not between sequences in the same file. The first
            file will be the column names, while the second is the row names. The alignment file(s)
            can be compressed.

OPTIONS:
    -c, --case-sensitive
            Case matters - i.e., dist(a, A) = 1

    -d, --delim <DELIMITER>
            Delimiting character for the output table

            [default: ,]

    -e, --ignored-chars <IGNORED_CHARS>
            String of characters to ignore - e.g., `-e N-` -> dist(A, N) = 0 and dist(A, -) = 0

            Note, if using `--case-sensitive` the upper- and lower-case form of a character is
            needed. To not ignore any characters, use `-e ''` or `-e ""`

            [default: N-]

    -h, --help
            Print help information

    -l, --long
            Output as long-form ("melted") table

            By default the output is a N x N or N x M table where N is the number of sequences in
            the first alignment and M is the number of sequences in the (optional) second alignment.

    -o, --output <OUTPUT>
            Output file name [default: stdout]

    -P, --progress
            Show a progress bar

    -q, --quiet
            No logging (except progress info if `-P` is given)

    -s, --sort
            Sort the alignment(s) by ID

    -t, --threads <THREADS>
            Number of threads to use. Setting to 0 will use all available

            [default: 1]

    -V, --version
            Print version information

基准测试

我们对 snp-dists(v0.8.2)进行基准测试。 snp-dists 是一个用于计算 SNP 距离矩阵的出色工具,也是 psdm 的灵感来源。

由于 snp-dists 不允许进行对齐文件间的比较,我们将基准测试内对齐模式。我们使用一个包含 151 个序列、长度为 4411532bp 的对齐文件。

基准测试时间使用 hyperfine 记录,每个工具/线程组合运行 10 次。

Benchmark plot

工具 线程 平均 标准差 最小值 中位数 最大值
psdm 1 95.4 1.0 94.2 95.3 97.9
snp-dists 1 231.0 4.8 224.2 231.8 240.4
psdm 2 54.3 1.5 53.2 53.6 57.5
snp-dists 2 120.3 0.8 118.9 120.3 121.3
psdm 4 33.0 0.8 32.5 32.7 35.0
snp-dists 4 61.8 0.2 61.5 61.8 62.2
psdm 8 22.3 0.1 22.1 22.3 22.4
snp-dists 8 33.1 0.3 32.8 33.1 33.7
psdm 16 17.6 0.2 17.4 17.5 18.0
snp-dists 16 20.7 0.2 20.4 20.7 21.1

贡献

欢迎贡献。要被接受,更改必须通过 CI 和覆盖率检查。这包括

  • 代码格式化(cargo fmt)。
  • 没有编译器错误/警告。 cargo clippy --all-features --all-targets -- -D warnings
  • 测试代码覆盖率没有降低。

请还在 CHANGELOG 中添加贡献的简洁描述。

引用

psdm 已存档至 Zenodo

@software{Hall2021psdm,
  author       = {Hall, Michael B.},
  title        = {{psdm: Compute a pairwise SNP distance matrix from 
                   one or two alignment(s)}},
  month        = nov,
  year         = 2021,
  publisher    = {Zenodo},
  version      = {0.3.0},
  doi          = {10.5281/zenodo.5706784},
  url          = {https://doi.org/10.5281/zenodo.5706785}
}

依赖项

~12–20MB
~272K SLoC