2个版本
新 0.1.31+minimap2.2.28 | 2024年8月26日 |
---|---|
0.1.30+minimap2.2.28 | 2024年8月26日 |
在生物学分类中排名第158位
135KB
2K SLoC
A rust FFI库用于minimap2。开发中!欢迎提供反馈!
结构
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();
自定义
MapOpts和IdxOpts可以使用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 是一个 默认 特性,除非指定否则启用。
缺失的特性
- 设置碱基转换的惩罚 minimap 2.27 发布说明
- 生成 ds 标签以指示 indels 中的不确定性
可能还有更多,但我正在使用此来跟踪。我预计这些特性将在一段时间内实现,但如果您有紧急需求,请提交 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 解析
资金
依赖项
~2–12MB
~153K SLoC