BBNorm官方指导文档翻译

BBNorm Guide

Written by Brian Bushnell

Last updated December 16, 2015

BBNorm是用来对高覆盖率的reads进行抽样的工具,这个过程可以极大的==加速组装==,==让无法组装的数据变得"可以组装"==,==同时一般也可以极大提高组装的质量==。此外还有:基于深度的-binning,kmer频度直方图,错误矫正,错误标记,基因组大小估计

BBNorm有四个显著的特点:

  1. BBNorm绝对不会run out of memory,但是如果kmers太多了会使得精度稍稍下降
  2. Multipass模式可以减少normalized的输出中的平均错误率,standard normalization可以富集包含错误的reads
  3. 速度超快,并且很易用
  4. 支持任何长度的kmer值

数据结构:

A Count-Min Sketch (CMS) is also called a "counting Bloom filter". 这是一种只存储值,不存keys并且忽略冲突(collisions)的hash table。为了避免collisions带来的负面影响,值被储存在多个位置,尽可能保障至少有一个不会和其他的冲突。在读取kmer数目时,所有位置都被读取,最小值被使用

  • BBNorm 可以使用1, 2, 4, 8, 16, or 32 位每cell的CMSs结构. 当字节越大,最大计数值也可以更(up to 2^bits-1), 但是可供使用的cells更少; 例如,for example, 1GB RAM will accommodate (提供空间)4 billion 2-bit cells, 最大计数值可以为3, or 500 million 16-bit cells, 最大计数值为65535. 在我们数据预期覆盖度是200x时,设置32-bit的单个cell大小是完全没道理的。同时,存储一个kmer的计数值的位置可以被设置,从1到无限大都可以(默认值为3),越多存储位置会越准确(直到hash table变满),但是会更慢. 确定最佳hash数,请参考Bloom filters.

Memory and Capacity:

  • BBNorm默认情况下会使用所有的运行内存,使用越多的运行内存结果越准确
  • 当处理很大的数据集,却只有很小的运行内存可用时,会得到警告信息:
    "Made hash table: hashes = 1 mem = 581.26 MB cells = 152.38M used = 93.540%
    Warning: This table is extremely full, which may reduce accuracy. Ideal load is under 60% used.
  • 因此,可以看出,要获得最好的精度,load尽量小于60%
  • 为了更加准确:
    • 使用'prefilter'
    • 在一个节点上使用更多的运行内存运行
    • 质控数据或者对数据进行错误矫正
    • 加大minprob的值,以减少虚假的kmers
  • ==在实际运行中,即便是loads超过了90%,你还是可以得到比较好的normalization结果,但是histogram和statistics会被关闭==

请不要忽略上面的信息,在使用prefilter会把较少的kmers计数值存储在小的cells上(默认为2-bit),把大的计数值储存在大的cells上 (默认32-bit),这时候memory可以被更加高效的使用。 Prefilter在默认情况下是关闭的,但是当我们很需要==准确性==的时候,或者==tables实在是有点满了==(比如normalization时超过了50%,在error correction时我们希望loads更低),请务必打开这个参数。

  • 也可以把primary cells 的值变小些, e.g. "bits=16"
  • 或者先执行一次2-bit或4-bit的过滤,把那些非常低覆盖度的reads给去除掉,从而减少总的独特kmers数目。
  • 我们也可以调整minprob参数,which ignores kmers with a probability of being error-free (based on quality scores) of below X。
  • normalization在tables很满时问题也不大,但是错误矫正和histogram generation会变得没那么可靠

Shellscripts:

BBNorm有三个脚本(bbnorm.sh, ecc.sh, and khist.sh),他们都使用KmerNormalize,但配合不同的参数,在错误矫正和normalization的时候我们还是可以make kmer frequency histogram的。通过调整参数,这三个脚本的功能可以变得一样。

丢弃kmers,精确计数,错误矫正--Dumping Kmers, Exact Counts, and Error Correction:

BBNorm不能丢弃具体的kmers,因为BBNorm只存储了计数值。为了丢弃具体的kmer,可以使用kmercountexact,它可以生成具体kmer的频度分布直方图但,是这个时候不能再分析很大的数据了。由==由于Tadpole使用和kemrcountexact相同的数据结构,在错误矫正方面,tadpole优于BBNorm,因此如果我们有足够的内存,最好使用tadpole进行错误矫正。==

什么时候不要用BBNorm--When Not To Use BBNorm:

  1. 首先BBNorm不能把低丰度的数据丰度变高,它主要针对数据覆盖度太高或者分布抬不均匀(amplified single-cell, RNA-seq, viruses, metagenomes, etc),主要服务于组装。
  2. 在需要对样品进行定量的时候,用于mapping的数据是没有进行过矫正的。
  3. 同时如果数据的错误率太高了,也是不合适的,BBNorm主要用于Illumina和Ion Torrent数据。
  4. 如果要进行rare variants calling,也最好不要使用这个工具

临时文件管理和管道--Temp Files and Piping:

不可以使用管道
BBNorm needs to read input files multiple times (twice per pass), which means it is unable to accept piped input. In multipass mode, it also needs to generate temp files. The location of temp files can be specified with the "tmpdir" flag; it defaults to the environment variable $TMPDIR, which on Genepool points to local disk when available. Temp files will be cleaned up once BBNorm finishes.

核心数设置--Threads:

可以使用t参数设置核心数
BBNorm is fully multithreaded both when counting kmers and when doing other operations such as normalization. The counting is lock-free, using atomic counters. As a result, it will default to using all available hardware threads; this can be adjusted with the "t" flag.


==Usage Examples==

  1. 估计内存需求:loglog.sh in=reads.fq
    这个命令可以估计数据集中的独特kmers,从而估计kmer-counting programs such as BBNorm需要的内存量。这个过程是很快的,并且几乎不耗内存。如果loglog报告10亿kmers,那么有3hashes(每个计数值储存到三个地方)16bits(每个cell的大小)/kmer/8bits(每个字节有8位)/byte1,000,000,000kmers/0.5(占用50%的table)load=12 GB的内存便可以使得table消耗小于50%

  2. 对reads数目进行normalization:
    bbnorm.sh in=reads.fq out=normalized.fq target=100 min=5
    这条命令会将覆盖度超过100的reads都下调到100,同时盖度低于5的reads都会被当做是错误从而丢弃

  1. To error-correct reads:
    ecc.sh in=reads.fq out=corrected.fq
    或者
    bbnorm.sh in=reads.fq out=corrected.fq ecc=t keepall passes=1 bits=16 prefilter
    这个可以进行错误矫正但是不丢弃任何reads
    bits=16 prefilter 并不是必须的,但是可以通过存储kmer更加高效从而使得矫正更加准确
  1. 生成kmer分布直方图
    khist.sh in=reads.fq khist=khist.txt peaks=peaks.txt
    or equivalently
    bbnorm.sh in=reads.fq khist=khist.txt peaks=peaks.txt passes=1 prefilter minprob=0 minqual=0 mindepth=0
    • 直方图可以表示出在指定深度时,独特kmers的数目。比如,a point at "Depth=10, UniqueKmers=248028"指明248028个kmers的测序深度为10。这个直方图要在对数坐标上画,peak文件包含直方图中peak的位置,以及对基因组大小和几倍体的估计。==这个估计只有在数据是随机断裂DNA,倍型数在4以下(1或者2的时候最准确),并且污染很少时才可靠。如果在kmer直方图中没有明显的peaks,那么peaks文件中的结果是不可靠的。==
      bbnorm.sh在这的其他参数 (minprob=0 minqual=0 mindepth=0) 用于避免低丰度的kmers被丢掉
  1. Normalization测序数据,并且进行错误矫正,在矫正前后都生成kmer直方图图
    bbnorm.sh in=reads.fq out=normalized.fq target=100 min=5 prefilter ecc khist=khist_before.txt khistout=khist_after.txt
  1. To make a high-pass or low-pass filter:
    bbnorm.sh in=reads.fq out=highpass.fq outt=lowpass.fq passes=1 target=999999999 min=10
    这个命令可以把coverage大于10的输出到out中,小于10的输出到outt中
  1. 按照depth把数据分到3个区间中To split by depth into 3 bins:
    bbnorm.sh in=reads.fq outlow=low.fq outmid=mid.fq outhigh=high.fq passes=1 lowbindepth=10 highbindepth=80

10x 以下放到 low.fq; 80x 以上放到 high.fq; 其他的放到 mid.fq。 ==特别的, 对于承兑数据,如果一端的depth低于低阈值,另一端depth高于高阈值,那么它们都去mid数据集==

  1. 用额外的序列信息辅助对kmer的统计:
    bbnorm.sh in=reads.fq out=corrected.fq passes=1 ecc extra=genome.fa,more_reads.fq
    这个指令会利用genome.fa和more_reads.fa中的kmer计数信息指导对in=数据中reads的矫正。这个操作也可以在其他功能中使用,例如normalization。Extra只会被用于提供kmer丰度信息,不会再输出中明显出现

额外补充一点信息

  1. BBTools has another program functionally related to BBNorm, "kmercountexact.sh". It does NOT use probabilistic data structures, and uses locking rather than atomic counters, and as a result may not scale as well, and will run out of memory on large datasets. However, it is still extremely fast and memory-efficient - using ~15 bytes per kmer (with an optional count-min-sketch prefilter to remove low-count error kmers). It cannot normalize or error-correct, but it can generate the exact kmer count of a dataset as well as the exact kmer frequency histogram (and do rudimentary peak calling for genome size estimation). In practice, when I am interested in kmer frequency histograms, I use KmerCountExact for isolates, and BBNorm for metagenomes.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容