16个版本

0.1.20+minimap2.2.282024年7月22日
0.1.18+minimap2.2.282024年6月6日
0.1.17+minimap2.2.272024年3月16日
0.1.16+minimap2.2.262023年9月12日
0.1.8 2022年11月15日

11生物学 中排名

Download history 15/week @ 2024-04-28 8/week @ 2024-05-05 96/week @ 2024-05-12 190/week @ 2024-05-19 25/week @ 2024-05-26 292/week @ 2024-06-02 28/week @ 2024-06-09 209/week @ 2024-06-16 2/week @ 2024-06-23 58/week @ 2024-06-30 1/week @ 2024-07-07 119/week @ 2024-07-14 108/week @ 2024-07-21 155/week @ 2024-07-28 50/week @ 2024-08-04 297/week @ 2024-08-11

616 每月下载量
用于 ullar

MIT/Apache

1MB
24K SLoC

Rust 12K SLoC // 0.0% comments C 7K SLoC // 0.0% comments JavaScript 4K SLoC // 0.0% comments VB6 792 SLoC Cython 345 SLoC // 0.0% comments Python 109 SLoC // 0.1% comments Perl 28 SLoC Shell 6 SLoC

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

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

结构

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();

定制

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 only)

map-file是一个默认功能,除非指定否则默认启用。

缺少的功能

可能还有更多,但我正在使用它来跟踪。我预计这些功能将随着时间的推移得到实现,但如果您有紧急需求,请提交一个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 - 成功

使用此绑定工具

  • Chopper - 长读修剪和过滤
  • mappy-rs - Python的mappy的内置多线程替换
  • HiFiHLA - PacBio HiFi数据的HLA star-calling工具

想要反馈

  • 许多字段是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:核酸序列的成对比对。Bioinformatics34:3094-3100. [doi:10.1093/bioinformatics/bty191][doi]

和/或

Li, H. (2021). 改进minimap2比对精度的新的策略。Bioinformatics37: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 解析

资金

Genomics Aotearoa

依赖项

~0.8–11MB
~131K SLoC