#pattern-matching #lookup-tables #bwt #bio #fm-index

lt-fm-index

使用k-mer查找表进行精确模式匹配的Fm-index

24个发布版本

0.7.0-alpha.32024年7月1日
0.7.0-alpha.22023年6月26日
0.7.0-alpha.12023年2月28日
0.5.6 2022年9月14日
0.1.0 2021年7月21日

#223 in 算法

Download history 4/week @ 2024-05-18 1/week @ 2024-06-08 3/week @ 2024-06-15 1/week @ 2024-06-22 98/week @ 2024-06-29 43/week @ 2024-07-06 10/week @ 2024-07-13 2/week @ 2024-07-20 58/week @ 2024-07-27

119 每月下载量
2 个crate中使用(通过 sigalign-impl

MIT 许可证

84KB
2K SLoC

LtFmIndex

CI crates.io

LtFmIndex 是一个Rust库,用于构建和使用包含模式第一个 k-mer 查找表的FM-index。此索引可用于(1)统计模式在索引文本中出现的次数,以及(2)定位模式的位置。

用法

添加到依赖项

要使用此库,将 lt_fm_index 添加到您的 Cargo.toml

[dependencies]
lt_fm_index = "0.7.0-alpha"
  • 关于 fastbwt 功能
    • 此功能可以加速索引,但需要 cmake 来构建 libdivsufsort,且不能作为WASM构建。

示例代码

use lt_fm_index::LtFmIndex;
use lt_fm_index::blocks::Block2; // `Block2` can index 3 types of characters.

// (1) Define characters to use
let characters_by_index: &[&[u8]] = &[
    &[b'A', b'a'], // 'A' and 'a' are treated as the same
    &[b'C', b'c'], // 'C' and 'c' are treated as the same
    &[b'G', b'g'], // 'G' and 'g' are treated as the same
];
// Alternatively, you can use this simpler syntax:
let characters_by_index: &[&[u8]] = &[
    b"Aa", b"Cc", b"Gg"
];

// (2) Build index
let text = b"CTCCGTACACCTGTTTCGTATCGGAXXYYZZ".to_vec();
let lt_fm_index= LtFmIndex::<u32, Block2<u128>>::build(
    text,
    characters_by_index,
    2,
    4,
).unwrap();

// (3) Match with pattern
let pattern = b"TA";
//   - count
let count = lt_fm_index.count(pattern);
assert_eq!(count, 2);
//   - locate
let mut locations = lt_fm_index.locate(pattern);
locations.sort();  // The locations may not be in order.
assert_eq!(locations, vec![5,18]);
// All unindexed characters are treated as the same character.
// In the text, X, Y, and Z can match any other unindexed character
let mut locations = lt_fm_index.locate(b"UNDEF");
locations.sort();
// Using the b"XXXXX", b"YYYYY", or b"!@#$%" gives the same result.
assert_eq!(locations, vec![25,26]);

// (4) Save and load
let mut buffer = Vec::new();
lt_fm_index.save_to(&mut buffer).unwrap();
let loaded = LtFmIndex::load_from(&buffer[..]).unwrap();
assert_eq!(lt_fm_index, loaded);

仓库

https://github.com/baku4/lt-fm-index

API文档

https://docs.rs/lt-fm-index/

参考

  • Ferragina, P.,等. (2004). 一个字母友好的FM-索引,Springer Berlin Heidelberg: 150-160。
  • Anderson, T. 和 T. J. Wheeler (2021). 优化核苷酸和氨基酸搜索的FM-index库,Cold Spring Harbor Laboratory。
  • 王宇,李翔,张栋,谭戈,孙宁 (2018). 加速FM-index搜索用于基因组数据处理,ACM。
  • Yuta Mori. libdivsufsort

依赖项

~18MB
~311K SLoC