# Bigtools
[![License](https://img.shields.io/badge/license-MIT-green)](https://github.com/jackh726/bigtools/blob/master/LICENSE)
[![Paper](https://img.shields.io/badge/DOI-10.1093%2Fbioinformatics%2Fbtae350-blue)](https://doi.org/10.1093/bioinformatics/btae350)
[![Zenodo](https://zenodo.org/badge/DOI/10.5281/zenodo.10606493.svg)](https://doi.org/10.5281/zenodo.10606493)
Bigtools is a library and associated tools for reading and writing bigwig and bigbed files.
The primary goals of the project are to be
- Performant
- Extensible
- Modern
### Performant
Bigtools uses `async/await` internally to allow for efficient, multi-core computation when possible. In addition, tools are optimized for minimal memory usage. See [Benchmarks] for more details.
### Extensible
Bigtools is designed to be as modular as possible. This, in addition to the safety and reliability of Rust, allows both flexibility and correctness as a library. In addition, its extremely easy to quickly create new tools or binaries. A number of binaries are available that parallel related existing binaries from [UCSC](https://hgdownload.soe.ucsc.edu/admin/exe/), with drop-in compatibility for the most common flags.
### Modern
Bigtools is written in Rust and published to `crates.io`, so binaries can be installed with `cargo install bigtools` or it can be used as a library by simply including it in your `cargo.toml`.
## Library
To use `bigtools` in your Rust project, add `bigtools` to your `Cargo.toml` or run:
```sh
cargo add bigtools
```
See the `bigtools` 🦀 [Documentation](https://docs.rs/bigtools).
### Example
```rust,norun
use bigtools::bbiread::BigWigRead;
let mut reader = BigWigRead::open("test.bigWig").unwrap();
let chr1 = reader.get_interval("chr1", 0, 10000).unwrap();
for interval in chr1 {
println!("{:?}", interval);
}
```
## Binaries
The `bigtools` CLI binaries can be installed through [crates.io](https://crates.io/crates/bigtools) or [conda](https://anaconda.org/bioconda/bigtools/).
```sh
cargo install bigtools
```
```sh
conda install -c bioconda bigtools
```
Additionally, pre-built binaries can be downloaded through [Github releases](https://github.com/jackh726/bigtools/releases).
The following binaries are available:
|binary|description|
| ---- | ----- |
|bigtools|Provides access to multiple subcommands, including all below|
|bedgraphtobigwig|Writes a bigWig from a given bedGraph file|
|bedtobigbed|Writes a bigBed from a given bed file|
|bigbedinfo|Shows info about a provided bigBed|
|bigbedtobed|Writes a bed from the data in a bigBed|
|bigwigaverageoverbed|Calculate statistics over the regions of a bed file using values from a bigWig|
|bigwiginfo|Shows info about a provided bigWig|
|bigwigmerge|Merges multiple bigWigs, outputting to either a new bigWig or a bedGraph|
|bigwigtobedgraph|Writes a bedGraph from the data in a bigWig|
|bigwigvaluesoverbed|Get the per-base values from a bigWig over the regions of a bed file using values|
Renaming the `bigtools` binary to any of the subcommands (case-insensitive) allows you to run that subcommand directly.
## Python wrapper
The `pybigtools` package is a Python wrapper written using [`PyO3`](https://pyo3.rs/). It can be installed or used as a dependency either through [PyPI](https://pypi.org/project/pybigtools/) or [conda](https://anaconda.org/bioconda/pybigtools/).
```sh
pip install pybigtools
```
```sh
conda install -c bioconda pybigtools
```
See the `pybigtools` 🐍 [API Documentation](https://bigtools.readthedocs.io/en/latest).
## How to build from source
In order to build the bigtools binaries, you can run
```
cargo build --release
```
and the binaries can be found in `target/release/`.
Otherwise, you can install the binaries from source by running
```
cargo install --path bigtools/
```
Building the python wheels for pybigtools requires [maturin](https://pypi.org/project/maturin/). To build the pybigtools wheel for installation (and install), you can run
```
maturin build --release -m pybigtools/Cargo.toml
pip install target/wheels/pybigtools*.whl
```
or
```
maturin develop --release -m pybigtools/Cargo.toml
```
## Benchmarks
[Benchmarks]: #Benchmarks
Benchmarks are included in the `./bench` directory. They require `python` to run.
Multiple tools are compared against the comparable UCSC tools. For completeness, both single-threaded and multi-threaded (when available) benchmarks are included. Multiple different configuration options are benchmarked across multiple replicates, but a summar is available in the table below:
## How to cite
This repository contains contains a `CITATION.cff` file with citation information. Github allows you to get a citation in either APA or BibTeX format; this is available in "Cite this repository" under About.