#bam #check #data-integrity #integrity #data-file #repair #sequence-alignment

bin+lib bamrescue

用于检查二进制序列比对/映射 (BAM) 文件是否损坏并修复它们的工具

3 个版本 (破坏性)

0.3.0 2022年7月17日
0.1.0 2017年7月21日
0.0.1 2017年5月13日

#128 in 生物学

ISC 许可证

40KB
620

bamrescue AUR deb License 构建状态

bamrescue 是一个命令行工具,用于检查二进制序列比对/映射 (BAM) 文件是否损坏,并在它们发生损坏时尽可能多地从中恢复数据。

asciicast

安装

在 ArchLinux 及其衍生版(Manjaro、Antergos…)上

AUR 上提供了 ArchLinux 及其衍生版的 PKGBUILD,它仅与最新的 ArchLinux 进行了测试。

# Get the PKGBUILD
git clone https://aur.archlinux.org/bamrescue.git

# Add the author's PGP key
gpg2 --recv-keys FA490B15D054C7E83F70B0408C145ABAC11FA702

# Build and install bamrescue
cd bamrescue
makepkg -si

或者,您可以使用 AUR 辅助工具(如 yay)安装 bamrescue

# Install bamrescue
yay -S bamrescue

在 Debian 及其衍生版(Ubuntu、Mint…)上

为 Debian 及其衍生版提供了预构建包。它们仅在 Debian 8 (Jessie)、Debian 9 (Stretch)、Ubuntu 16.04 LTS (Xenial) 和 Ubuntu 18.04 LTS (Bionic) 上进行了测试。

# Install prerequisites
sudo apt install curl apt-transport-https

# Add the author's PGP key
curl -s https://arkanosis.net/jroquet.pub.asc | sudo apt-key add -

# Add the author's apt stable channel to your apt sources
echo "deb https://apt.arkanosis.net/ software stable" | sudo tee /etc/apt/sources.list.d/arkanosis.list

# Update and install bamrescue
sudo apt update
sudo apt install bamrescue

用法

Usage: bamrescue check [--quiet] [--threads=<threads>] <bamfile>
       bamrescue rescue [--threads=<threads>] <bamfile> <output>
       bamrescue -h | --help
       bamrescue --version

Commands:
    check                Check BAM file for corruption.
    rescue               Keep only non-corrupted blocks of BAM file.

Arguments:
    bamfile              BAM file to check or rescue.
    output               Rescued BAM file.

Options:
    -h, --help           Show this screen.
    -q, --quiet          Do not output statistics, stop at first error.
    --threads=<threads>  Number of threads to use, 0 for auto [default: 0].
    --version            Show version.

工作原理

BAM 文件是一个 BGZF 文件(规范),因此由一系列符合 RFC1592 的 gzip 块(规范)连接而成。

每个 gzip 块最多包含 64 KiB 的数据,包括用于检查其完整性的未压缩数据的 CRC32 校验和。

此外,由于gzip块的开始是gzip标识符(即0x1f8b),固定的gzip方法(即0x8)和固定的gzip标志(即0x4),以及bgzf块包含bgzf标识符(即0x4243),固定的额外子字段长度(即0x2)以及它们自己的压缩大小,因此可以跳过损坏的块(最多64 KiB),以有限的复杂性和可接受的可靠性到达下一个非损坏的块。

此属性用于通过仅保留非损坏的块来从损坏的BAM文件中恢复数据,希望恢复大多数读取数据。

示例

一个40 MiB的BAM文件(在今天标准下非常小)已经被两个硬盘坏道损坏。大多数工具(包括gzip)在第一个损坏的字节处就会卡住,这意味着根据工具的不同,高达100%的BAM有效载荷被认为是丢失的。

让我们使用bamrescue来检查该文件

$ bamrescue check samples/corrupted_payload.bam
bam file statistics:
   1870 bgzf blocks checked (117 MiB of bam payload)
      2 corrupted blocks found (0% of total)
     46 KiB of bam payload lost (0% of total)

确实,一个整块硬盘坏道通常对应于512字节的丢失,这比平均bgzf块(可高达64 KiB)要小得多。

尽管大多数工具会放弃这个文件,但它仍然包含几乎100%的非损坏BAM有效载荷,如果用户只能处理接近100%的数据量,他们可能不会太在意。

让我们恢复非损坏的有效载荷(注意:这需要与原始文件一样多的额外磁盘空间)

$ bamrescue rescue samples/corrupted_payload.bam rescued_file.bam
bam file statistics:
   1870 bgzf blocks found (117 MiB of bam payload)
      2 corrupted blocks removed (0% of total)
     46 KiB of bam payload lost (0% of total)
   1868 non-corrupted blocks rescued (100% of total)
    111 MiB of bam payload rescued (100% of total)

恢复的BAM文件现在可以像从未损坏过一样使用。使用CRC32校验和验证恢复数据,所以它不像忽略错误并在损坏数据上工作(gzip从损坏的BAM文件中获取垃圾数据的典型用途):它是在(荒谬的)更少、经过验证的数据上工作。

性能

bamrescue非常快。实际上,它在完成更多工作的同时比gzip还要快。

以下是一个40 MiB的非损坏BAM文件的一些数字

命令 时间 检测到损坏
gzip -t 695 ms
bamrescue check -q --threads=1 1181 ms
bamrescue check -q --threads=2 661 ms
bamrescue check -q --threads=4 338 ms
bamrescue check --threads=1 1181 ms
bamrescue check --threads=2 661 ms
bamrescue check --threads=4 338 ms

Chart

以下是一个40 MiB BAM文件(有两个单字节损坏,分别在7 MiB和18 MiB附近)的一些数字

命令 时间 检测到损坏 报告的损坏块数量 可恢复数据量¹
gzip -t 93 ms 不适用 21 Mio(18%)
bamrescue check -q --threads=1 157 ms 不适用 21 Mio(18%)
bamrescue check -q --threads=2 91 ms 不适用 21 Mio(18%)
bamrescue check -q --threads=4 56 ms 不适用 21 Mio(18%)
bamrescue check --threads=1 1174 ms 2 117 Mio(99.99%)
bamrescue check --threads=2 659 ms 2 117 Mio(99.99%)
bamrescue check --threads=4 338 ms 2 117 Mio(99.99%)

¹未压缩的BAM有效载荷,使用gzip -d或bamrescue rescue恢复

Chart

注意:这些基准测试是在Intel Core i5-6500 CPU上运行的Kubuntu 16.04.2和rustc 1.18.0上运行的。

注意事项

bamrescue不会检查BAM有效载荷是否实际上符合BAM规范。它只检查它是否在创建后未损坏,使用gzip和bgzf格式内建的错误检测代码。这意味着,只要用于创建BAM文件的工具符合规范,bamrescue的输出也将如此,但bamrescue本身不会采取任何措施来验证这种合规性。

编译

在您的工作副本中运行cargo build --release

贡献和报告错误

通过GitHub拉取请求欢迎贡献。

请向GitHub issues报告错误和功能请求。

许可证

bamrescue版权所有(C)2017-2018 Jérémie Roquet [email protected],并授权使用ISC许可证。

依赖项

~4–13MB
~149K SLoC