基因组序列组件工具的组成部分
基因组,元基因组和转录组组件范围从完全集成到完全模块化。完全模块化的组装有许多好处。该存储库正在进行的工作,以在模块化装配管道中定义一些重要的检查点以及标准输入/输出格式。目前,我们对Illumina型测序数据有偏见(单读,配对读物,配对对,10倍),但我们的目标是使组件也与第三代读数兼容。
随意通过拉力要求做出贡献。
FASTA/FASTQ :可选属性在注释字段中找到,并像SAM一样格式化, XX:x:xxxx 。评论字段遵循标题中的一个空间。
FASTQ :配对末端读物交错,可能会被压缩。链接的读取条形码可以用BX标签指示。
FASTA :序列不应包裹。 FASTA文件应索引(FAI)。
GFA :GFA2优于GFA1。序列字段可能为空( * )。这些序列可以存储在相邻的fasta文件中,命名为assembly.gfa和assembly.fa 。
SAM/BAM :除非另有说明,否则将SAM/BAM文件按位置排序并索引。可以用读取组RG属性表示不同的测序库。
一个组件包含在单个目录中。文件根据模式[0-9]+_[az]+.[az.]+命名。数字前缀为零固定且长度相同,它们表示组件的阶段。描述性名称和文件类型扩展名。文件可能会被压缩。
0_pe.fq.gz
1_unitig.gfa
2_denoise.gfa
3_debulge.gfa 3_debulge.bam 3_debulge.bam.bai
4_link.gfa
5_scaffold.gfa
6_assembly.gfa 6_assembly.fa 6_assembly.fa.fai 6_assembly.bam 6_assembly.bam.bai
type1(记录[属性],…) +…→type2(record [属性],…) +…
此阶段需要一个type1的文件并生成Type2的文件。例如,估计单位的副本数量。序列片段和边缘的GFA文件以及映射的BAM或PAF文件读取的读取可产生带有估计的unitig副本编号的GFA文件。
GFA(SE) + BAM/PAF→GFA(S [CN],E)
删除针对每种测序技术特定的测序工件。以最小的信息丢失(例如杂合变体)提高输入读取的质量。
FastQ→FastQ
评估测序的质量,并估计基因组的参数。
FastQ→TSV
读取读取中的排序错误。
FastQ→FastQ
通过de Bruijn图(DBG)组装或重叠,布局,共识(OLC)组件组装单元。
FastQ→GFA(SE)
从汇编图中删除测序错误。保留变体。
GFA(SE)→GFA(SE)
识别和/或从图中删除变体。
GFA(SE)→GFA(SE)
可以选择通过凸起的单个序列或路径,或者可以使用IUPAC歧义代码代表共识的凸起序列替换凸起。
地图读取为组装序列。
FastQ + GFA(S)/Fasta→BAM
估计每个序列段的拷贝数。
GFA(SE) + BAM/PAF→GFA(S [CN],E)
请注意,覆盖范围的中间深度比由重复崩溃,读取错误和其他问题引起的对齐伪像的平均覆盖范围更强。
将重复序列以及顺序和方向序列段扩展到重叠群和支架中。
fasta/gfa(SE) + bam/paf→fasta/gfa(se)
重叠群是没有间隙的连续序列。创建重叠群需要扩展唯一重叠群之间发现的重复序列。重叠群是从没有任何间隙的序列段的连续路径中得出的。脚手架是从序列段的不连续路径中得出的,这些序列段之间的序列段之间有间隙。
工具可以将脚手架作为一个组装阶段实现。然而,脚手架可能被视为由三个不同的阶段组成:链接unitigs,订单和东方单位构建路径的序列以及合同路径以创建新的序列段。
组装在相邻重叠群之间的支架间隙中发现的序列。
fastq + fasta/gfa(s)→fasta/gfa(s)
将读取映射到组件并正确的组件错误。
fastq + fasta/gfa(SE) + bam/paf→fasta/gfa(se)
GFA(SE)→PNG/SVG
评估组件的连续性和正确性。
fasta/gfa(s)→TSV
工具可以将多个装配阶段组合在单个工具中。
ema preprocesslongranger basicsga preqc bfcBcool.pysga index | sga correct ABYSS或ABYSS-P或abyss-bloom-dbg然后AdjList或abyss-overlapbcalm | convertToGFA.pysga index | sga filter | sga overlap | sga assemble abyss-filtergraphgfaview -t PopBubbles | MergeContigsgfaview -b abyss-mapbgreatbwa memema align链接读取longranger alignminimap2unicycler_align sga-astat.py abyss-fixmate | DistanceEst配对端和伴侣对读取的abyss-fixmate | DistanceEstabyss-longseqdist长期阅读arcs abyss-scaffold或SimpleGraph | MergePathssga scaffold MergeContigssga scaffold2fasta abyss-sealer abyss-fac和abyss-samtobreak数据来自Unicycler:“这些是来自Shigella Sonnei 53G基因组组装的质粒A,B和E的合成读数”。 shigella sonnei质粒(合成读取),short_reads_1.fastq.gz,short_reads_2.fastq.gz
使用深渊组装配对末端读取。该深渊管道是由完整的abyss-pe管道运行的最小工具子集。
cd components
k=99
./download_test_data.sh
./abyss_unitigs.sh 0_pe.fq.gz $k
./abyss_contigs_from_unitigs.sh 1_unitig.gfa2 1_unitig.fa $k
./abyss_scaffolding.sh 6_contigs.fa 6_contigs.gfa $k
# Visualize the assembly graph
Bandage load 9_assembly.gfa1 & 该组装使用BCALM用于unitigs,然后使用上一个示例中的其余Abyss管道。
cd components
k=99
./download_test_data.sh
./bcalm.sh 0_pe.fq.gz $k
./abyss_contigs_from_unitigs.sh 1_unitig.gfa2 1_unitig.fa $k
./abyss_scaffolding.sh 6_contigs.fa 6_contigs.gfa $k
# Visualize the assembly graph
Bandage load 9_assembly.gfa1 & # Download Unicycler test data
# input: nothing
# output: 0_pe.fq.gz
# install dependencies
brew install seqtk curl
seqtk mergepe <( curl -Ls https://github.com/rrwick/Unicycler/raw/master/sample_data/short_reads_1.fastq.gz ) <( curl -Ls https://github.com/rrwick/Unicycler/raw/master/sample_data/short_reads_2.fastq.gz ) | gzip > 0_pe.fq.gz- -
# input: [reads] [k]
# e.g. 0_pe.fq.gz 99
#
# output: 1_unitig.gfa2
# contains unitigs created by BCALM
# make sure bcalm and convertToGFA.py are in your path (will later be automatically done by 'conda install bcalm' when someone makes bcalm availaon conda)
reads= $1
k= $2
# Install the dependencies
pip install gfapy
# Unitig with BCALM
bcalm -in $1 -out 1_bcalm -kmer-size $k -abundance-min 1 -verbose 0
mv 1_bcalm.unitigs.fa 1_unitig.fa
convertToGFA.py 1_unitig.fa 1_unitig.gfa $k
# convert bcalm output to gfa2
(printf " HtVN:Z:1.0n " ; tail -n +2 1_unitig.gfa) > 1_unitig.gfa1
gfapy-convert 1_unitig.gfa1 > 1_unitig.gfa2
# cleanup
rm -f 1_bcalm * glue * 1_bcalm.h5- -
# input: [reads] [k]
# e.g. 0_pe.fq.gz 99
#
# output: 1_unitig.gfa2 1_unitig.fa
# contains unitigs created by abyss
reads= $1
k= $2
# setting up
brew install abyss
# Unitig
gunzip -c $reads | ABYSS -k $k -t0 -c0 -b0 -o 1_unitig.fa -
AdjList --gfa2 -k $k 1_unitig.fa > 1_unitig.gfa
mv 1_unitig.gfa 1_unitig.gfa2- -
# input: [unitigs.gfa2] [unitigs.fa] [k]
# e.g. 1_unitig.gfa2 1_unitigs.fa 100
#
# output: 6_contigs.gfa2 and 6_contigs.fa
# contigs produced by ABySS
unitigs_gfa2= $1
unitigs_fa= $2
k= $3
# install dependencies
brew install abyss pigz samtools
# Denoise
abyss-filtergraph --gfa2 -k $k -t200 -c3 -g 2_denoise.gfa $unitigs_gfa2
# Collapse variants
PopBubbles --gfa2 -k $k -p0.99 -g 3_debulge.gfa $unitigs_fa 2_denoise.gfa > 3_debulge.path
MergeContigs --gfa2 -k $k -g 3_debulge.gfa -o 3_debulge.fa $unitigs_fa 2_denoise.gfa 3_debulge.path
# Map reads
gunzip -c 0_pe.fq.gz | abyss-map - 3_debulge.fa | pigz > 3_debulge.sam.gz
# Link unitigs
gunzip -c 3_debulge.sam.gz | abyss-fixmate -h 4_link.tsv | samtools sort -Osam | DistanceEst --dist -k $k -s500 -n1 4_link.tsv > 4_link.dist
# Resolve repeats
samtools faidx 3_debulge.fa
SimpleGraph -k $k -s500 -n5 -o 5_resolverepeats-1.path 3_debulge.gfa 4_link.dist
MergePaths -k $k -o 5_resolverepeats.path 3_debulge.fa.fai 5_resolverepeats-1.path
# Contract paths
MergeContigs --gfa2 -k $k -g 6_contigs.gfa2 -o 6_contigs.fa 3_debulge.fa 3_debulge.gfa 5_resolverepeats.path
# cleanup (comment to keep files)
rm -f 5_resolverepeats.path 3_debulge.gfa 3_debulge.fa 3_debulge.fa.fai 3_debulge.path 5_resolverepeats-1.path 4_link.dist 4_link.tsv 2_denoise.gfa 3_debulge.sam.gz - -
# input: [unitigs_gfa1] [unitigs_gfa2] [unitigs_fa] [k]
# e.g. 1_unitig.gfa1
# output: 6_contigs.gfa 6_contigs.fa
# 'contigs' generated by popping bubbles and removing tips using gfa1 tool
# https://github.com/lh3/gfa1
unitigs_gfa1= $1
unitigs_gfa2= $2
unitigs_fa= $3
k= $4
# remove tips (2 rounds), misc trimming, pop bubbles,
# but then cannot use -u to build unitigs of simplified graph (i.e. contigs), because it doesn't output sequences
gfaview -t -m -t -b $unitigs_gfa1 > 2_denoised.gfa1
# make the output of gfaview properly gfa1 and gfa2
sed -i ' s/L1/l1/g ' 2_denoised.gfa1 # gfapy wants lower case flags
sed -i ' s/L2/l2/g ' 2_denoised.gfa1
sort -n -k 2 2_denoised.gfa1 > 2_denoised.gfa1.sorted # because ABySS GFA parser wants S lines in same order as in FASTA file
head -n 1 $unitigs_gfa2 > 2_denoised.gfa2 # copy header as gfaview doesnt
gfapy-convert 2_denoised.gfa1.sorted >> 2_denoised.gfa2
# would like to use use rgfa to do compaction but itdoesnt work on the Singella example
# ./rgfa-mergelinear 2_denoised.gfa1 > 6_contigs.gfa
# convert gfa to fasta
awk ' $1 ~/S/ {print ">"$2"n"$3} ' 2_denoised.gfa1.sorted > 2_denoised.fa
# just contract paths in the 2_denoised.gfa2, using ABySS as wasn't able to do it with neither gfaview nor rgfa-mergelinear
abyss-filtergraph --gfa2 -k $k --assemble 2_denoised.gfa2 2_denoised.fa -g 3_denoised.gfa2 > 3_denoised.paths
MergeContigs --gfa2 -k $k 2_denoised.fa 3_denoised.gfa2 3_denoised.paths -o 6_contigs.fa -g 6_contigs.gfa2
# cleanup (comment to keep files)
rm -f 2_denoised.gfa1.sorted 2_denoise.gfa1 2_denoised.gfa1 3_denoised.paths 3_denoised.gfa2 # input: [contigs.fa] [contigs.gfa] [k]
# e.g. 6_contigs.fa 6_contigs.gfa 99
#
# output: 9_assembly.gfa and 9_assembly.gfa1
# scaffolds assembly using abyss scaffolder in GFA2 and GFA1 format
contigs_fa= $1
contigs_gfa= $2
k= $3
# Map reads
gunzip -c 0_pe.fq.gz | abyss-map - $contigs_fa | pigz > 6_contigs.sam.gz
# Link unitigs
gunzip -c 6_contigs.sam.gz | abyss-fixmate -h 7_link.tsv | samtools sort -Osam | DistanceEst --dot -k $k -s500 -n1 7_link.tsv > 7_link.gv
# Order and orient
abyss-scaffold -k $k -s500-1000 -n5-10 $contigs_gfa 7_link.gv > 8_scaffold.path
# Contract paths
MergeContigs --gfa2 -k $k -g 9_assembly.gfa -o 9_assembly.fa $contigs_fa $contigs_gfa 8_scaffold.path
# Compute assembly metrics
abyss-fac 9_assembly.fa
# Convert GFA2 to GFA1
abyss-todot --gfa1 9_assembly.gfa > 9_assembly.gfa1
# cleanup (comment to remove)
rm -f 6_contigs.sam.gz 7_link.gv 7_link.tsv 8_scaffold.path 8_scaffold.path