47个版本
0.2.25 | 2024年5月9日 |
---|---|
0.2.24 | 2024年5月1日 |
0.1.11 | 2023年9月29日 |
0.1.7 | 2023年8月18日 |
0.0.14 | 2022年9月30日 |
#214 in 生物学
616 每月下载
在 2 crates 中使用
515KB
11K SLoC
bedrs
bedtools
类似的功能,用于Rust中的区间集合
摘要
这是一个用Rust编写的区间库,利用了特质系统、泛型、单态化和过程宏,以实现高效的区间操作,并提供了良好的开发者体验特性。
它主要围绕 Coordinates
特质,一旦在任意区间类型上实现,就可以进行广泛的基因组区间算术。
它还引入了一种新的集合类型,IntervalContainer
,它作为 Coordinates
的集合,并实现了许多集合操作。
区间算术可以被视为对具有相关染色体、链和其他基因组标记的区间进行集合论操作(如交集、并集、差集、补集等)。
这个库简化了这些类型操作的开发,允许用户根据自己的结构进行定制以最小化计算开销,同时仍是一个灵活的通用区间操作库。
使用
这个库的主要好处是它基于特质。因此,您可以定义自己的类型——但如果它们实现了 Coordinates
特质,它们就可以使用库中的其他函数。
有关详细使用和示例,请参阅 文档。
Coordinates
特质
这个库的核心是 Coordinates
特质。
这个属性定义了所有集合操作所需的一些最小函数。这包括获取区间染色体ID、该区间的起始点和终点,或者链等信息。
这可以通过手动实现,或者如果你遵循库中常用的命名约定(如chr
、start
、end
、strand
),则可以在自定义区间类型上使用[derive(Coordinates)]
。
use bedrs::prelude::*;
// define a custom interval struct for testing
#[derive(Default, Coordinates)]
struct MyInterval {
chr: usize,
start: usize,
end: usize,
}
区间类型
虽然您可以创建自己的区间类型,但已经有很多“内置电池”类型可以在自己的库中使用。
包括以下内容:
这些是预构建的区间类型,可以在许多用例中使用。
use bedrs::prelude::*;
// An interval on chromosome 1 and spanning base 20 <-> 40
let a = Bed3::new(1, 20, 40);
// An interval on chromosome 1 and spanning base 30 <-> 50
let b = Bed3::new(1, 30, 50);
// Find the intersecting interval of the two
// This returns an Option<Bed3> because they may not intersect.
let c = a.intersect(&b).unwrap();
assert_eq!(c.chr(), &1);
assert_eq!(c.start(), 30);
assert_eq!(c.end(), 40);
区间操作
区间集合操作
集合操作是通过使用IntervalContainer
的IntervalContainer
方法来实现的。
我们可以在任何区间集合上轻松构建IntervalContainer
。
use bedrs::prelude::*;
let set = IntervalContainer::new(vec![
Bed3::new(1, 20, 30),
Bed3::new(1, 30, 40),
Bed3::new(1, 40, 50),
]);
assert_eq!(set.len(), 3);
有关这些方法的更多详细信息,请参阅IntervalContainer
。
- 界限
- 最近
- 补码
- 查找
- 内部
- 合并
- 样本
- 交集
- 分段
- 减法
其他工作
这个库受到以下Rust中其他区间库的极大启发:
它还受到以下C++和C中区间工具集的启发
依赖关系
~1.5–2.6MB
~47K SLoC