#fasta #bioinformatics #fastq #alignment

minimap2-temp

libminimap2的绑定(临时分支)

2个版本

0.1.31+minimap2.2.282024年8月26日
0.1.30+minimap2.2.282024年8月26日

生物学分类中排名第158位

MIT/Apache

135KB
2K SLoC

A rust FFI库用于minimap2。开发中!欢迎提供反馈!

https://crates.io/crates/minimap2 https://docs.rs/minimap2/latest/minimap2/ CircleCI codecov

结构

minimap2-sys是到minimap2的原始FFI绑定的库。minimap2是更Rust版本。

如何使用

要求

minimap2 = "0.1.20+minimap2.2.28"

另请参阅 特性

已与rustc 1.64.0和nightly测试。因此,在运行之前升级是个好主意。但如果您在使用旧版本时遇到困难,请告诉我,我会尝试修复!

Minimap2版本表

minimap2-rs minimap2
0.1.20 2.28
0.1.19 2.28
0.1.18 2.28
0.1.17 2.27
0.1.16 2.26

用法

创建一个对齐器

let mut aligner = Aligner::builder()
    .map_ont()
    .with_threads(8)
    .with_cigar()
    .with_index("ReferenceFile.fasta", None)
    .expect("Unable to build index");

对齐序列

let seq: Vec<u8> = b"ACTGACTCACATCGACTACGACTACTAGACACTAGACTATCGACTACTGACATCGA";
let alignment = aligner
    .map(&seq, false, false, None, None)
    .expect("Unable to align");

预设

所有minimap2预设都应可用(见函数部分

let aligner = map_ont();
let aligner = asm20();

自定义

MapOptsIdxOpts可以使用Rust的结构模式进行自定义,以及应用映射设置。受bevy启发。

Aligner {
    mapopt: MapOpt {
        seed: 42,
        best_n: 1,
        ..Default::default()
    },
    idxopt: IdxOpt {
        k: 21,
        ..Default::default()
    },
    ..map_ont()
}

工作示例

有一个名为"fakeminimap2"的二进制文件,我正在用它来测试内存泄漏。您可以查看源代码作为示例。它还显示了一些识别压缩类型和FASTA与FASTQ文件的辅助函数。我使用了我的自己的解析器,因为它们已经被很好地模糊测试过,但愿意移除它们或将它们放在特性墙后面。

对齐函数返回一个Mapping结构。只有当Aligner使用.with_cigar()创建时,才会返回Alignment结构。

一个非常简单的例子是

let mut file = std::fs::File::open(query_file);
let mut reader = BufReader::new(reader);
let mut fasta = Fasta::from_buffer(&mut reader)

for seq in reader {
    let seq = seq.unwrap();
    let alignment: Vec<Mapping> = aligner
        .map(&seq.sequence.unwrap(), false, false, None, None)
        .expect("Unable to align");
    println!("{:?}", alignment);
}

有一个map_file函数适用于整个文件,但它不是懒惰的,因此不适合大文件。它可能在未来被删除或移动到单独的库中。

let mappings: Result<Vec<Mapping>> = aligner.map_file("query.fa", false, false);

多线程

支持多线程,实现示例请参阅fakeminimap2。Minimap2本身也支持多线程,并将在构建索引时使用至少3个核心。映射的多线程留给最终用户。

let mut aligner = Aligner::builder()
    .map_ont()
    .with_index_threads(8);

实验性 Rayon 支持

这似乎是可行的。

use rayon::prelude::*;

let results = sequences.par_iter().map(|seq| {
    aligner.map(seq.as_bytes(), false, false, None, None).unwrap()
}).collect::<Vec<_>>();

特性

以下 crate 特性可用

  • mm2-fast - 用 mm2-fast 替换 minimap2。这可能不兼容。
  • htslib - 支持使用 htslib 输出 bam/sam 文件。
  • simde - 使用 simd-everywhere 支持编译 minimap2 / mm2-fast。
  • map-file - 默认 - 用于映射整个文件的便捷函数。请注意,这是单线程的。
  • sse2only - 仅编译 SSE2 支持(默认尝试编译 SSE4.1,aarch64 上的默认为 SSE2 仅支持)

Map-file 是一个 默认 特性,除非指定否则启用。

缺失的特性

可能还有更多,但我正在使用此来跟踪。我预计这些特性将在一段时间内实现,但如果您有紧急需求,请提交 pull request 或 issue!谢谢

为 MUSL 构建

遵循这些 说明

简要来说,使用 bash shell

docker pull messense/rust-musl-cross:x86_64-musl
alias rust-musl-builder='docker run --rm -it -v "$(pwd)":/home/rust/src messense/rust-musl-cross:x86_64-musl'
rust-musl-builder cargo build --release

请注意,minimap2 仅在 x86_64 上进行了测试。其他平台可能也有效,如果 minimap2 编译成功但 minimap2-rs 无法编译,请提交 issue。

与 MUSL 测试的特性

  • mm2-fast - 失败
  • htslib - 成功
  • simde - 成功

使用此绑定的工具

  • Chopper - 长读修剪和过滤
  • mappy-rs - python's mappy 的多线程替代品
  • HiFiHLA - 用于 PacBio HiFi 数据的 HLA star-calling 工具
  • STRdust - 长读的串联重复基因分型器

希望得到反馈

  • 许多字段是 i32 / i8 以模仿 C 环境,但转换为 u32 / u8 / usize 会更有意义吗?
  • 告诉我痛点!

下一步要做什么

  • 打印其他标签,以便我们拥有整个 PAF 格式
  • -sys 使用 SSE2 / SSE4.1 编译(自动检测,但也使用功能编译)
  • 多线程指南(tokio 异步线程或使用 crossbeam 队列和传统线程?)
  • map_file 的迭代器接口
  • 更多测试
  • -sys 使用 "sse" 功能使 SSE 正常工作(-sys crate 中的编译和测试工作正常,但在主 crate 中不工作)
  • -sys 是否可以从 pthread 中解耦?
  • -sys 启用 Lisa-hash 为 mm2-fast?但必须处理命令行上的构建参数。

引用

如果您在工作中使用此软件,应引用 minimap2 论文。

Li, H. (2018). Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics, 34:3094-3100. [doi:10.1093/bioinformatics/bty191][doi]

和/或

Li, H. (2021). New strategies to improve minimap2 alignment accuracy. Bioinformatics, 37:4572-4574. [doi:10.1093/bioinformatics/btab705][doi2]

变更日志

0.1.20 minimap2 2.28

  • 修复 htslib 错误。不需要更新 -sys crate。

0.1.19 minimap2 2.28

  • 通过 @charlesgregory 修复内存泄漏

0.1.18 minimap2 2.28

  • 更新到 minimap2 v2.28 @jguhlin
  • 支持 lrhqae 预设 @jguhlin

0.1.17 minimap2 2.27

  • 将 bam::Record 对象标记为辅助。#52 @PB-DB
  • 仅当启用 curl 功能时使用 rust-htslib/curl。#53 @PB-DB
  • 更新到 minimap2 v2.27 @jguhlin
  • 切换到 needletail 读取 fast 文件(功能 map-file)@jguhlin
  • 将函数转换为处理向量的切片而不是向量的引用 &[Vec<u8>] 而不是 &Vec<Vec<u8>> @jguhlin
  • 破坏性更改 Curl 现已不再是 htslib 的默认选项,请根据需要通过 cargo.toml 功能重新启用
  • 破坏性更改 现在使用 needletail 处理 map 文件,默认启用。然而,压缩算法已被禁用。请使用 cargo.toml 功能启用
  • 实验性的 rayon 支持
  • aligner.with_cigar_clipping() 以向 CIGAR 向量添加软剪辑(with_cigar() 仍然只添加到字符串中,遵循 minimap2 的 PAF 输出)
  • 破坏性更改 .with_threads() 现在是 .with_index_threads(),使其更清晰

0.1.16 minimap2 2.26

  • 感谢 @Adoni5 的帮助,大大提高了交叉编译支持

0.1.15 minimap2 2.26

  • 感谢 @leiste375,现在可以在 aarch64 上进行编译
  • 感谢 @wdecoster 的帮助,修正了 README
  • 更好地支持静态构建/链接
  • 将 fffx 更新到一个使用 bytelines 而不使用 tokio 的版本。大幅减少了编译时间和依赖树。

0.1.14 minimap2 2.26

  • 由 @Adoni5 修复了内存泄漏
  • 更新了依赖项

0.1.13 minimap2 2.26

  • 添加 with_seq 以支持索引单个序列(如 mappy:https://github.com/lh3/minimap2/blob/master/python/mappy.pyx#L115
  • minimap2-rs:更新 rust-htslib 依赖项
  • simdutf8 现在是可选依赖项,需要启用 map-file 功能
  • 支持 CIGAR 中的软剪辑字符串。警告:不支持硬剪辑。如果您需要此功能,请提出问题。
  • 更新 minimap 到 2.26
  • 不确定 SSE41/SSE2 是否正常工作。建议使用 simde。

0.1.11

  • HTS lib:通过 @eharr 添加了对可选质量分数的支持

0.1.10

  • HTS lib 通过 @eharr 支持
  • HTS lib:通过 @eharr 输出 sam/bam 文件
  • 更多测试由 @eharr 提供
  • 感谢 @ahcm 提供了 Strand 的实现
  • 通过 @jguhlin 更新 minimap2-sys 到最新版本
  • -sys crate mm2fast 通过 @jguhlin 添加为额外的后端
  • 由 @jguhlin 引入的 zlib 依赖项更改(希望现在它更便携和健壮)
  • -sys crate 现在支持 SIMDe

0.1.9

  • 感谢 @Adoni5 转换为构建器模式,以及 @eharr 为对齐添加了额外的字段
  • 对于正常编译,不需要 libclang

0.1.8

  • 多线程支持(使用更少的原始指针,并将更多处理方式类似于 rust Struct)

0.1.7

  • 同样使用 libc 而不是 std:ffi::c_int

0.1.6

  • 通过使用 libc:: 而不是 std::ffi 对 c_char,支持稍微旧版本的 rustc(感谢 dwpeng!)
  • 使用 fffx 模块进行 fasta/q 解析

资金

Genomics Aotearoa

依赖项

~2–12MB
~153K SLoC