#sam #read-write #pileup #reader-writer #htslib #bgzip

bam

Crate that allows to read and write BAM, SAM and BGZIP files, written completely in Rust

20 releases

0.1.4 Apr 19, 2021
0.1.3 Feb 17, 2021
0.1.2 Dec 2, 2020
0.1.1 Sep 4, 2020
0.0.11 Nov 15, 2019

#161 in Compression

Download history 114/week @ 2023-11-30 53/week @ 2023-12-07 80/week @ 2023-12-14 69/week @ 2023-12-21 46/week @ 2023-12-28 43/week @ 2024-01-04 47/week @ 2024-01-11 32/week @ 2024-01-18 33/week @ 2024-01-25 73/week @ 2024-02-01 61/week @ 2024-02-08 89/week @ 2024-02-15 93/week @ 2024-02-22 88/week @ 2024-02-29 57/week @ 2024-03-07 29/week @ 2024-03-14

293 downloads per month
Used in 5 crates

MIT license

250KB
5K SLoC

bam is a crate that allows to read and write BAM, SAM and BGZIP files, written completely in Rust.

Why?

Having a crate written completely in Rust reduces the number of dependencies and compilation time. Additionally, it removes the need to install additional C libraries.

Errors produced by this crate are more readable and easier to catch and fix on-the-fly.

Overview

Currently, there are three readers and two writers:

  • bam::IndexedReader - fetches records from random genomic regions.
  • bam::BamReader - reads a BAM file consecutively.
  • bam::SamReader - reads a SAM file consecutively.
  • bam::BamWriter - writes a BAM file.
  • bam::SamWriter - writes a SAM file.

BAM readers and writers have single-thread and multi-thread modes.

You can construct pileups from all readers using Pileup.

You can use bgzip module to interact directly with bgzip files (BGZF).

The crate also allows to conviniently work with SAM/BAM records and their fields, such as CIGAR or tags.

Usage

The following code would load BAM file in.bam and its index in.bam.bai, take all records from 3:600001-700000 and print them on the stdout.

extern crate bam;

use std::io;
use bam::RecordWriter;

fn main() {
    let mut reader = bam::IndexedReader::from_path("in.bam").unwrap();
    let output = io::BufWriter::new(io::stdout());
    let mut writer = bam::SamWriter::build()
        .write_header(false)
        .from_stream(output, reader.header().clone()).unwrap();

    for record in reader.fetch(&bam::Region::new(2, 600_000, 700_000)).unwrap() {
        let record = record.unwrap();
        writer.write(&record).unwrap();
    }
}

You can find more detailed usage here.

Changelog

You can find changelog here.

Issues

Please submit issues here or send them to timofey.prodanov[at]gmail.com.

Dependencies

~570KB