16个版本
0.1.20+minimap2.2.28 | 2024年7月22日 |
---|---|
0.1.18+minimap2.2.28 | 2024年6月6日 |
0.1.17+minimap2.2.27 | 2024年3月16日 |
0.1.16+minimap2.2.26 | 2023年9月12日 |
0.1.8 | 2022年11月15日 |
11 在 生物学 中排名
616 每月下载量
用于 ullar
1MB
24K SLoC
A rust FFI库用于minimap2. 正在开发中!欢迎提供反馈!
结构
minimap2-sys是到minimap2的原始FFI绑定的库。minimap2是更rusty的版本。
如何使用
要求
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 only)
map-file是一个默认功能,除非指定否则默认启用。
缺少的功能
- 设置碱基转换的惩罚设置minimap 2.27发行说明
- 生成ds标签以指示indels的不确定性
可能还有更多,但我正在使用它来跟踪。我预计这些功能将随着时间的推移得到实现,但如果您有紧急需求,请提交一个pull请求或问题!谢谢
为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无法编译,请打开一个问题。
使用MUSL测试的功能
mm2-fast
- 失败htslib
- 成功simde
- 成功
使用此绑定工具
想要反馈
- 许多字段是i32 / i8以模仿C环境,但将它们转换为u32 / u8 / usize是否更有意义?
- 告诉我痛点!
下一步要做的
- 打印其他标签,以便我们可以有完整的PAF格式
- -sys 使用SSE2 / SSE4.1编译(自动检测,但也可以使用功能编译)
- 多线程指南(tokio异步线程或使用crossbeam队列和传统线程?)
- map_file的迭代器接口
- 更多测试
- -sys 使用“sse”功能使SSE正常工作(-sys crate中的编译和测试工作正常,但在主crate中不工作)
- -sys 可能从pthread解耦?
- -sys 启用mm2-fast的Lisa-hash?但必须处理命令行的构建参数。
引用
如果您在您的工作中使用此软件,请引用minimap2论文。
Li, H. (2018). Minimap2:核酸序列的成对比对。Bioinformatics,34:3094-3100. [doi:10.1093/bioinformatics/bty191][doi]
和/或
Li, H. (2021). 改进minimap2比对精度的新的策略。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 读取快速文件(map-file 功能)@jguhlin
- 将函数转换为接受向量的切片而不是向量的引用
&[Vec<u8>]
而不是&Vec<Vec<u8>>
@jguhlin - 破坏性更改 Curl 现不再是 htslib 的默认选项,请根据需要通过 cargo.toml 功能重新启用。
- 破坏性更改 现在默认使用 needletail 进行 map-files。但是,压缩算法已禁用。请使用 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
- 通过 @eharr 添加对 HTS lib 的支持
- HTS lib:通过 @eharr 输出 sam/bam 文件
- 更多测试通过 @eharr
- 感谢 @ahcm 对 Strand 的实现
- 通过 @jguhlin 更新 minimap2-sys 到最新版本
- -sys crate mm2fast 通过 @jguhlin 添加为额外的后端
- zlib 依赖项更改通过 @jguhlin(希望现在更便携且更健壮)
- -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 解析
资金
依赖项
~0.8–11MB
~131K SLoC