跳转至

Genozip

Genozip是一种专为基因组数据设计的高效压缩工具。它采用了一系列先进的压缩算法和技术,能够将原始的基因组数据文件(如FASTA、VCF和BAM格式)压缩成更小的文件,同时保持数据的完整性和可访问性。

以下是Genozip的一些主要特点和优势:

  • 高压缩率:Genozip能够以很高的压缩率压缩基因组数据,通常能够将数据体积减小到原始大小的10%至20%。

  • 快速压缩和解压缩速度:Genozip使用多线程处理和并行压缩算法,能够实现快速的数据压缩和解压缩过程。

  • 数据完整性:Genozip压缩的数据文件可以方便地进行随机访问和部分解压缩,而不需要解压整个文件。这使得在处理大规模基因组数据时,可以快速获取所需的子集或特定区域的数据。

  • 数据安全性:Genozip支持数据加密,可以对压缩的数据文件进行加密保护,确保数据的安全性。

  • 多种数据格式支持:Genozip适用于各种常见的基因组数据格式,包括FASTA、VCF、BAM和CRAM等。

  • 支持压缩目录。

Genozip为商业软件,为了让用户相信他们的诚意,也在github上开放了软件源码。Genozip 商业用户需要购买授权,学术用户可以申请免费使用。

官网:https://www.genozip.com/

源码:https://github.com/divonlan/genozip

相关论文

Note

压缩和解压建议使用相同的 genozip 版本。

license

如果自行安装,则需要向官方申请license。

集群上使用

# 载入genozip
$ module load genozip/15.0.4

# 将license拷到自己的home目录下
# 执行一次即可,后续使用不用再执行
$ cp $LIC ~

# 或使用 --licfile 参数指定license位置
$ genozip --licfile $LIC

基本使用

压缩/解压单个fastq文件

# 压缩
# -@4, 设置使用4个线程,默认使用所有CPU核
# --reference 使用参考基因组压缩,可以获得较高的压缩率,解压时需要指定参考基因组
# 第一次使用该参考基因组时,会在参考基因组相同目录生成一个后缀为 .genozip的文件,如下面的命令会生成 IRGSP-1.0_genome.fasta.genozip
$ genozip -@4 HW84_NDSW31815_1.clean.fq.gz --reference IRGSP-1.0_genome.fasta 

# 解压,解压时需要用到参考基因组,默认使用的参考基因组路径为压缩时使用的参考基因组,若该参考基因组路径发生变化则使用 --reference 参数指定
$ genounzip -@4 HW84_NDSW31815_1.clean.fq.genozip

# 压缩,使用--REFERENCE,输出文件中会包含部分参考基因组,解压时不需要指定参考基因组
$ genozip -@4 HW84_NDSW31815_1.clean.fq.gz --REFERENCE IRGSP-1.0_genome.fasta 

# 解压,不需要使用基因组
$ genounzip -@4 HW84_NDSW31815_1.clean.fq.genozip 
genounzip HW84_NDSW31815_1.clean.fq.gz : Done (32 seconds)  
$ 
fq1和fq2合并压缩
# 将fq1和fq2压缩到一起,可以压缩到更小一点
$ genozip -@4 --reference IRGSP-1.0_genome.fasta --pair HW84_NDSW31815_1.clean.fq.gz HW84_NDSW31815_2.clean.fq.gz

# 解压
$ genounzip -@4 --reference IRGSP-1.0_genome.fasta HW84_NDSW31815_1+2.clean.fq.genozip

压缩/解压bam文件

# 压缩
$ genozip -@4 HW84_NDSW31815_sorted.bam

# 解压
$ genounzip -@4 HW84_NDSW31815_sorted.bam.genozip
fq和bam联合压缩

fq和bam以前压缩之后,bam文件的大小几乎可以不计。

# 压缩
$ genozip -@4 --deep --reference IRGSP-1.0_genome.fasta HW84_NDSW31815_sorted.bam HW84_NDSW31815_1.clean.fq.gz HW84_NDSW31815_2.clean.fq.gz

# 解压
$ genounzip HW84_NDSW31815_sorted.deep.genozip
压缩/解压vcf文件
# 压缩
$ genozip -@4 HW84_NDSW31815_sorted.vcf.gz

# 解压
$ genozip -@4 HW84_NDSW31815_sorted.vcf.gz

数据一致性说明

软件官方对数据一致性的说明 Verifying file integrity Losslessness

genozip压缩数据过程分为2步:压缩和校验,压缩完成后会自动进行数据一致性校验-将压缩完成后的文件在内存中解压并与原始文件比较,完整性检查没问题才算压缩完成,否则会报错。

压缩完成后会输出类似如下的校验信息,表示压缩的文件解压后与原始文件一致。

testing: genounzip sample.R1.fq.gz : verified as identical to the original FASTQ

需要注意的是,原始gz文件的md5值与使用genozip压缩解压后的gz文件的md5值不一致,只有两者都解压成文本文件后的md5才一致,测试命令如下:

# FASTQ: 
$ zcat file.fastq.gz | md5sum

# BAM:    
$ zcat file.bam | md5sum
实际数据测试
# genozip 压缩
$ genozip --md5 -@4 sample.R1.fq.gz --reference ref.fa

$ ll -h
-rw-r----- 1 user group 1.4G Apr 16 10:35 shoot_MH63_LTSD_rep1_trim_2.fq.genozip
-rw-rw-r-- 1 user group 3.2G Apr 16 10:46 shoot_MH63_LTSD_rep1_trim_2.fq.gz
drwxrwxr-x 2 user group 4.0K Apr 16 10:45 tmp

# 将原始 gz 文件放到 tmp 目录下
mv sample.R1.fq.gz tmp

# genozip 解压
$ genounzip -@4 sample.R1.fq.genozip

# 原始 fq 文件 md5
$ zcat tmp/sample.R1.fq.gz |md5sum 
e1ab55ea344b7b7440949f8bf19b172c  -

# 解压后 fq 文件 md5,可以看到两者md5一致
$ zcat sample.R1.fq.gz |md5sum 
e1ab55ea344b7b7440949f8bf19b172c  -

各物种数据压缩情况

fastq

物种文件原始大小genozip
棉花BYU21001_1.fastq.gz15G3.2G
棉花BYU21001_2.fastq.gz15G3.4G
水稻HW84_NDSW31815_1.clean.fq.gz4.6G1.1G
水稻HW84_NDSW31815_2.clean.fq.gz4.8G1.2G
玉米Q114_1.trimed.fq.gz9.4G3.0G
玉米Q114_2.trimed.fq.gz11G3.7G
小麦LAN91_L01_49_1.fq.gz14G6.7G
小麦LAN91_L01_49_2.fq.gz15G7.6G
油菜ZS11_1.fq.gz15G4.6G
油菜ZS11_2.fq.gz17G6.1G
大豆15-2_L2_I114.R1_clean.fq.gz6.3G2.6G
大豆15-2_L2_I114.R2_clean.fq.gz6.5G2.8G
ERR194146_1.fastq.gz52G30G
ERR194146_2.fastq.gz53G30G

bam

物种文件原始大小genozip
棉花L1_sorted.bam52G16G
水稻HW84_NDSW31815_sorted.bam7.0G2.3G
玉米Q114_sorted.bam20G7.1G
油菜ZS11_sorted.bam28G11G
大豆15-2_L2_I114_sorted.bam12G5.3G
小麦LAN91_L01_49_sorted.bam35G16G
ERR194146.bam113G52G

fq+bam

物种原始大小(R1.fq.gz+R2.fq.gz+bam)genozip
棉花35G + 37G + 52G18G
水稻4.6G + 4.8G + 7.0G2.5G
玉米9.4G + 11G + 20G7.4G
油菜4.6G + 6.0G + 28G12G
大豆6.3G + 6.5G + 12G5.5G
小麦14G + 15G + 35G15G

vcf

物种文件原始大小genozip
棉花L1.vcf.gz165M67M
水稻HW84_NDSW31815.vcf.gz18M7.5M
玉米Q114.vcf.gz493M186M
油菜ZS11.vcf.gz13M5.8M
大豆15-2_L2_I114.vcf.gz12M4.9M
ERR194146.vcf.gz167M67M

下游分析

interleaved 文件

使用genozip将双端测序文件压缩成一个文件之后,该文件内容格式为 interleaved,在该文件中序列条目交替存储两个配对的序列。

对于双末端测序数据,通常会有两个文件,一个包含每个配对的第一个序列(如read1),另一个包含每个配对的第二个序列(如read2)。而在交错(interleaved)格式中,这两个序列被交错存储在同一个文件中。

如下所示,@ 开头的行表示序列的名称和配对信息,接着是序列本身和质量分数。

@Seq1/1
<seq1_read1>
+
<seq1_quality1>
@Seq1/2
<seq1_read2>
+
<seq1_quality2>
@Seq2/1
<seq2_read1>
+
<seq2_quality1>
@Seq2/2
<seq2_read2>
+
<seq2_quality2>
...
部分比对软件支持 interleaved 作为输入文件,因此可以直接将genozip压缩后的文件作为比对软件的输入文件,而不用另外将其解压为 gz 文件,有效减少了计算量和存储空间。

官方示例

https://www.genozip.com/fastq-to-bam-pipeline

官方给了个从 .genozip 文件到质控比对排序去重后的 bam 文件的示例脚本。

#!/bin/bash

ref=GRCh38_full_analysis_set_plus_decoy_hla.fa
study=mystudy
fastq=myfastqdir
mapped=mymappeddir

files=($fastq/*.genozip)

processed=1

while (( processed == 1 )); do
    processsed=0
    for file in ${files[@]}
    do
        sample=`echo $file | grep -o -E sample'[[:digit:]]{2}'`  # convert the file name to a sample name
        out=$mapped/${sample}.bam.genozip

        if [ -f $out ]; then continue; fi # already processed
        if [ -f ${out}.doing_now ]; then continue; fi # another instance of this script is working on it

        processed=1
        touch ${out}.doing_now

        echo =========================================
        echo Sample $sample
        echo =========================================

        ( genocat $file -e ${ref%.fa}.ref.genozip || >&2 echo "genocat exit=$?" )|\
        ( fastp --stdin --interleaved_in --stdout --html ${fastq}/${sample}.html --json ${fastq}/${sample}.json || >&2 echo "fastp exit=$?"   )|\
        ( bwa mem $ref - -p -t 54 -T 0 -R "@RG\tID:$sample\tSM:$study\tPL:Illumina" || >&2 echo "bwa exit=$?"     )|\
        ( samtools view -h -OSAM || >&2 echo "samtools exit=$?")|\
        ( bamsort fixmates=1 adddupmarksupport=1 inputformat=sam outputformat=sam inputthreads=5 outputthreads=5 sortthreads=30 level=1 || >&2 echo "bamsort exit=$?" )|\
        ( bamstreamingmarkduplicates inputformat=sam inputthreads=3 outputthreads=3 level=1                     || >&2 echo "bamstreamingmarkduplicates exit=$?" )|\
        ( genozip -e $ref -i bam -o $out || >&2 echo "genozip exit=$?" )

        rm ${out}.doing_now
    done
done

BWA

可以将上面的脚本稍微改一下,用于 BWA 比对流程中,BWA-MEM2 同理。

$ genocat sample_1+2.fq.genozip | bwa mem $ref - -p -t 20 -T 0 -R "@RG\tID:id\tSM:sample\tPL:Illumina" | samtools sort -@20 -o sample_sorted.bam

Bowtie2

Bowtie2 的 --interleaved 选项也支持 interleaved 格式的输入文件。

注意事项

  • CST Error in buf_low_level_malloc:726 15.0.24: Out of memory in sam_deep_merge:208: malloc failed (size=37526397330 bytes). Try limiting the number of concurrent threads with --threads (affects speed) or reducing the amount of data processed by each thread with --vblock (affects compression ratio)

    减少genozip使用的线程数

  • genozip: Warning: buf_alloc called from hash_alloc_global:248 for "zctx->global_ents" requested 9.2 GB. This is suspiciously high and might indicate a bug - please report to support@genozip.com. vb->vblock_i=0 buf="contexts->global_ents" ctx=Q2NAME memory=(nil) data=(nil) param=0(0x0000000000000000) len=0 size=0 type=UNALLOCATED shared=false promiscuous=true spinlock=0x564ea57cc6f0 locked=0 link_count=1 allocated in (no func):0 by vb=0 line_i=0 26-Oct-2023 07:08:54 CST Error in buf_low_level_malloc:719: Out of memory in sam_deep_merge:211: malloc failed (size=57459513106 bytes). Try limiting the number of concurrent threads with --threads (affects speed) or reducing the amount of data processed by each thread with --vblock (affects compression ratio) If this is unexpected, please contact support@genozip.com.

    在使用 genozip --deep 压缩人的fq+bam数据时,出现上面的报错,整个压缩时间非常长,暂时无法解决。

本文阅读量  次
本站总访问量  次