2 个不稳定版本

0.2.2 2024 年 3 月 14 日
0.1.0 2024 年 2 月 26 日

#170 in 生物学

MIT 许可证

395KB
7K SLoC

CI tests

GRanges Rust 库和命令行工具

GRanges 是一个用于处理基因组范围及其相关数据的 Rust 库。它的目标是使编写与基因组范围数据(例如 BED、GTF/GFF、VCF 等)交互的非常高性能的基因组工具变得容易。在内部,GRanges 使用 Daniel C. Jones 编写的非常快速的 coitrees 区间树库进行重叠操作。在初步基准测试中,GRanges 工具可以比 bedtools2 中的类似功能快 10%-30%(见下面的基准和注意事项)。

GRanges 受到 "tidy" 数据分析工作流程以及 Bioconductor 的 GenomicRangesplyranges 的启发。GRanges 使用类似的方法链管道方法来操作基因组范围、查找重叠的基因组区域和计算统计数据。例如,您可以用相对较少的代码行实现自己的类似于 bedtools map 的功能

// Create the "right" GRanges object.
let right_gr = bed5_gr
    // Convert to interval trees.
    .into_coitrees()?
    // Extract out just the score from the additional BED5 columns.
    .map_data(|bed5_cols| {
        bed5_cols.score
    })?;

// Compute overlaps and combine scores into mean.
let results_gr = left_gr
    // Find overlaps
    .left_overlaps(&right_gr)?
    // Summarize overlap data
    .map_joins(mean_score)?;

其中 mean_score()

pub fn mean_score(join_data: CombinedJoinDataLeftEmpty<Option<f64>>) -> f64 {
    // Get the "right data" out of the join -- the BED5 scores.
    let overlap_scores: Vec<f64> = join_data.right_data.into_iter()
        // filter out missing values ('.' in BED)
        .filter_map(|x| x).collect();

    // Calculate the mean score.
    let score_sum: f64 = overlap_scores.iter().sum();
    score_sum / (overlap_scores.len() as f64)
}

请注意,GRanges 是一个 编译时 泛型 Rust 库,因此上述代码将由编译器进行大量优化。Rust 使用 零成本抽象,这意味着此类高级代码在编译和优化后会具有与低级语言相同的高性能。

GRanges 是 泛型 的,这意味着它适用于存储与基因组数据相关数据的任何数据容器类型:某种类型的 Vec<U>,一个 ndarray Array2polars 数据帧等。GRanges 允许用户用几行 Rust 编写常见的基因组数据处理任务,然后让 Rust 编译器对其进行优化。

作为一个概念验证,GRanges 还提供了一个基于该库功能的命令行工具 granges。这个命令行工具旨在与其他类似的命令行工具进行基准测试,以及与其他软件进行大规模集成测试,以确保 GRanges 没有错误。目前,granges 工具提供了其他优秀生物信息学工具(如 bedtools)功能的一个子集。

初步基准测试

为了对抗“基准测试炒作”,本节以诚实和透明的方式详细介绍了某些初步基准测试的结果。在我们的实验室服务器上,这里有两个运行,每个操作有 100,000 个范围,样本数量 n = 100。

# run 1
command       bedtools time    granges time      granges speedup (%)
------------  ---------------  --------------  ---------------------
map_multiple  270.21 s         112.66 s                      58.3073
map_max       105.46 s         84.03 s                       20.3185
adjust        112.42 s         53.48 s                       52.4269
filter        114.23 s         77.96 s                       31.7512
map_min       116.22 s         78.93 s                       32.0839
flank         162.77 s         80.67 s                       50.4383
map_mean      107.05 s         81.89 s                       23.5073
map_sum       108.43 s         93.35 s                       13.9083
windows       408.03 s         72.58 s                       82.2121
map_median    108.57 s         87.32 s                       19.5731
 
# run 2
command       bedtools time    granges time      granges speedup (%)
------------  ---------------  --------------  ---------------------
map_multiple  293.24 s         103.66 s                      64.6495
map_max       117.84 s         82.39 s                       30.0855
adjust        110.09 s         51.63 s                       53.0999
filter        120.36 s         67.79 s                       43.6784
map_min       114.76 s         86.06 s                       25.0081
flank         160.20 s         75.69 s                       52.756
map_mean      116.97 s         85.12 s                       27.2331
map_sum       114.39 s         85.96 s                       24.8557
windows       418.87 s         65.13 s                       84.4515
map_median    112.35 s         82.81 s                       26.2995

依赖项

~7–19MB
~264K SLoC