1. 什么情况下需要拆分染色体
拆分序列长度大于512Mb的染色体,原因前面我略微讲了一下,见bedtools的一个报错:Received illegal bin number xxxxx from getBin call,更权威的说法如下,即比对软件可以生成sam/bam,但在给其建立索引samtools index时会失败。
read mapping with mappers such as BWA, Tophat or STAR as the BAM output format used by these mappers limits the reference contig size to (2^29 - 1) bp (512 MB). Strictly speaking, the BAM files will be valid, however they cannot by indexed with "samtools index" so that random access to chromosomal regions is not possible.
为了验证以上的说法,我用bwa, bowtie测试了一下。
1.1 bwa
#得到bam文件
-rw-r--r-- 1 huangsiyuan s2pnh 302M Feb 25 23:12 SRR1222469.bam
-rw-r--r-- 1 huangsiyuan s2pnh 300M Feb 25 23:07 test_chr.fasta.sa
-rw-r--r-- 1 huangsiyuan s2pnh 215K Feb 25 23:03 test_chr.fasta.amb
-rw-r--r-- 1 huangsiyuan s2pnh 65 Feb 25 23:03 test_chr.fasta.ann
-rw-r--r-- 1 huangsiyuan s2pnh 150M Feb 25 23:03 test_chr.fasta.pac
-rw-r--r-- 1 huangsiyuan s2pnh 599M Feb 25 23:03 test_chr.fasta.bwt
-rw-r--r-- 1 huangsiyuan s2pnh 276M Feb 25 22:38 out.SRR1222469.fastq.gz
-rw-r--r-- 1 huangsiyuan s2pnh 606M Feb 25 22:34 test_chr.fasta
#得到上面结果的命令如下
$cat align_bwa.sh
bwa index test_chr.fasta
bwa mem -t 4 -M -R "@RG\tID:test\tPL:illumina\tLB:lib\tSM:test" test_chr.fasta out.SRR1222469.fastq.gz | samtools view -Sb - > SRR1222469.bam
#接下来建立索引
$ cat index.sh
samtools sort -@ 4 SRR1222469.bam -o SRR1222469.s.bam
samtools index SRR1222469.s.bam
#但是却报错了
[E::hts_idx_push] Region 538655237..538655267 cannot be stored in a bai index. Try using a csi index with min_shift = 14, n_lvls >= 6
samtools index: failed to create index for "SRR1222469.s.bam": Numerical result out of range
染色体长度超出范围!
1.2 bowtie
-rw-r--r-- 1 huangsiyuan s2pnh 301M Feb 25 23:47 SRR1222469_bowtie.s.bam
-rw-r--r-- 1 huangsiyuan s2pnh 1.4G Feb 25 23:40 SRR1222469_bowtie.s.sam
-rw-r--r-- 1 huangsiyuan s2pnh 1.4G Feb 25 23:33 SRR1222469_bowtie.sam
-rw-r--r-- 1 huangsiyuan s2pnh 173M Feb 25 23:32 test_chr.fasta.rev.1.ebwt
-rw-r--r-- 1 huangsiyuan s2pnh 74M Feb 25 23:32 test_chr.fasta.rev.2.ebwt
-rw-r--r-- 1 huangsiyuan s2pnh 173M Feb 25 23:19 test_chr.fasta.1.ebwt
-rw-r--r-- 1 huangsiyuan s2pnh 74M Feb 25 23:18 test_chr.fasta.2.ebwt
-rw-r--r-- 1 huangsiyuan s2pnh 127K Feb 25 23:06 test_chr.fasta.3.ebwt
-rw-r--r-- 1 huangsiyuan s2pnh 147M Feb 25 23:06 test_chr.fasta.4.ebwt
-rw-r--r-- 1 huangsiyuan s2pnh 276M Feb 25 22:38 out.SRR1222469.fastq.gz
-rw-r--r-- 1 huangsiyuan s2pnh 606M Feb 25 22:34 test_chr.fasta
#命令如下
bowtie-build test_chr.fasta test_chr.fasta
bowtie -q -v 1 -m 6 -p 4 --sam test_chr.fasta out.SRR1222469.fastq.gz SRR1222469_bowtie.sam
samtools sort -@ 4 SRR1222469_bowtie.sam -o SRR1222469_bowtie.s.sam
samtools view -Sb SRR1222469_bowtie.s.sam > SRR1222469_bowtie.s.bam
samtools index SRR1222469_bowtie.s.bam
#最终得到的报错信息和上面一模一样
[E::hts_idx_push] Region 536880316..536880340 cannot be stored in a bai index. Try using a csi index with min_shift = 14, n_lvls >= 6
samtools index: failed to create index for "SRR1222469_bowtie.s.bam": Numerical result out of range
报错信息说换一种建立索引的方式,csi index,但下游分析的软件有的并不支持这种csi index。
2. 什么情况下需要合并染色体
这里说染色体并不准确,应该是Scaffold序列。
合并许多Unplaced序列到chrUn中去。
3. 举个例子
比如这个参考基因组:GCA_002162155.2_WEW_v2.0_genomic.fna.gz
其中unplaced的Scaffold有148382个;
14个染色体中最小的也是609.5Mb,准备将每个染色体分成两个parts。
4. 演练
准备这两个文件
$ head -n 4 chr14_2parts.bed #这里每条染色体从哪里断开是随意设置的,有一点点不严谨
CM007921.2 0 471304005
CM007921.2 471304005 609493238
CM007922.2 0 438720154
CM007922.2 438720154 712626289
$ head -n 5 chrun.bed #每条Scaffold的长度信息,一般基因组注释文件gff含有这些信息
LSYQ02000015.1 0 883
LSYQ02000087.1 0 653
LSYQ02000702.1 0 1044
LSYQ02070967.1 0 1746
LSYQ02070968.1 0 649
4.1 合并多条Scaffold序列
使用bedtools根据上面的bed区间,提取染色体序列
先解压fna.gz到fasta,getfasta不直接处理fna.gz
$ cat extrict_fasta.sh
bedtools getfasta -fi GCA_002162155.2_WEW_v2.0_genomic.fasta -bed chr14_2parts.bed -fo chr14_2parts.fasta
bedtools getfasta -fi GCA_002162155.2_WEW_v2.0_genomic.fasta -bed chrun.bed -fo chrun.fasta
提取出的每一个区间的序列都是单行的,如下
接下来将以上所有的序列去掉序列名称合并成一行
grep "^>" -v chrun.fasta | awk '{ ORS = ""; $1 = $1; print $0}' > chrUn.fasta
查看长度,与NCBI上查询到的组装信息比较,可以看出是一致的。
awk '{ print length($0) }' chrUn.fasta > chrUn.len
$ cat chrUn.len
347377395
此时千万不要用less等命令查看chrUn.fasta文件,会卡死的,这是一行长达几百万的字符串。
正确的做法是用fold
, 控制行宽。
fold -w 80 chrUn.fasta > chrUnplaced.fasta
最后再在最前面一行加上名称
sed -i '1 i\>chrUn' chrUnplaced.fasta #注意这里是如何在第一行前面加名称的
rm -f chrun.fasta chrUn.fasta chrUn.len
4.2 拆分长染色体序列
28个parts也是单行的
先fold,便于查看
fold -w 80 chr14_2parts.fasta > chr_to_parts.fasta
改名字,这一步用Perl脚本比Shell命令行快很多。
改为类似下面这种
>chr1A_part1
>chr1A_part2
最后再来检查一下
grep "^>" chr_to_two_parts.fasta > chr_to_two_parts_chr_info
合并
cat chr_to_two_parts.fasta chrUnplaced.fasta > chr_Aet_genomic.fasta