bam格式转换为Fastq/Fasta格式

  1. Samtools Fastq
  2. GATK SamToFastq
  3. Bedtools bamtofastq

举例说明,比如说我们现在有一个转录组比对文件D1_D1.sort.bam:

samtools view -H D1_D1.sort.bam | tail
@SQ    SN:19   LN:58617616
@SQ    SN:20   LN:64444167
@SQ    SN:21   LN:46709983
@SQ    SN:22   LN:50818468
@SQ    SN:X    LN:156040895
@SQ    SN:Y    LN:57227415
@SQ    SN:MT   LN:16569
@RG    ID:D1_D1_D1 PL:illumina PU:D1   LB:D1   SM:D1   CN:BGI
@PG    ID:bwa  PN:bwa  VN:0.7.10-r789  CL:/home/lixf/RNA_module_V1.0/Alignment/Alignment_BWA/bin/bwa mem -t 4 -a -R @RG\tID:D1_D1_D1\tPL:illumina\tPU:D1\tLB:D1\tSM:D1\tCN:BGI /data_center_11/Project/wenpp/RNA/01_RY20190826D002_RNAref/prepare/Homo_sapiens.GRCh38.dna.toplevel.fa /data_center_11/Project/wenpp/RNA/01_RY20190826D002_RNAref/01.deal_reads/process/Filter_SOAPnuke/D1/D1/D1_1.fq.gz /data_center_11/Project/wenpp/RNA/01_RY20190826D002_RNAref/01.deal_reads/process/Filter_SOAPnuke/D1/D1/D1_2.fq.gz
@PG    ID:samtools PN:samtools PP:bwa  VN:1.12 CL:samtools view -H D1_D1.sort.bam

从@PG可以看出来比对软件是BWA,这是一个与hg38 toplevel基因组序列比对后产生的,根据染色体上位置进行排序的BAM文件。那么如果我们要与不同的基因组序列进行比对,比如更换基因组序列的版本为hg19,就需要将BAM文件还原成原来的fastq文件,而从上述数据可以看出,原始测序应该是一个双端测序文件,那么我们应该转换后得到的是两个fastq文件。

Samtools Fastq

1. 重新根据read name进行排序

原本D1_D1.sort.bam文件的序列为:

samtools view D1_D1.sort.bam | head | cut -f 1,2
ST-E00600:147:HNTKYALXX:1:1144:13675:27524  337
ST-E00600:147:HNTKYALXX:1:2144:15700:30405  369
ST-E00600:147:HNTKYALXX:1:2124:6876:4977    321
ST-E00600:147:HNTKYALXX:1:2124:6876:4977    401
ST-E00600:147:HNTKYALXX:1:2361:24813:5415   337
ST-E00600:147:HNTKYALXX:1:2361:23267:4805   337
ST-E00600:147:HNTKYALXX:1:2240:12274:12759  97
ST-E00600:147:HNTKYALXX:1:2344:3260:11835   353
ST-E00600:147:HNTKYALXX:1:2375:15266:19476  417
ST-E00600:147:HNTKYALXX:1:1374:16694:4476   385

可以看到read name是没有规律的,因为这时BAM文件是按照reads在染色体上比对的位置排序的,这样就不方便转换,因为双端测序的reads应该是成对排列的。

因此,要先按照read name进行排序,根据定义,我们可以知道read name各部分的含义:

@           : 代表read name开头
ST-E00600   : 测序平台的编号
147         : Run的编号
HNTKYALXX   : flow cell的编号
1           : lane的编号
1144        : Tile的编号
13675       : tile中所处cluster的x轴坐标
27524       : tile中所处cluster的x轴坐标
## 比对软件也可能在read name最后添加:1/:2代表来自哪一端的测序。

比如说bam中的这两条read:

ST-E00600:147:HNTKYALXX:1:2124:6876:4977 321
ST-E00600:147:HNTKYALXX:1:2124:6876:4977    401

第二列的数字代表bitwise flags,标记该read的比对情况。可以用samtools flags进行换算。

samtools flags 321
0x141   321 PAIRED,READ1,SECONDARY
samtools flags 401
0x191   401 PAIRED,REVERSE,READ2,SECONDARY

这是什么意思呢?
代表第1条read是双端测序,属于R1端,而且不是primary alignment;
第2条read也是双端测序,Reverse表示比对到的是参考序列的负链,属于R2端,不是primary alignment。

回顾了以上的内容,我们就可以对bam文件进行重新排序:

samtools sort -n -@ $(nproc) -o D1.rn.sort.bam D1_D1.sort.bam

$(nproc)代表服务器可用的线程数,多线程处理会更快。

转换后的bam文件:

samtools view D1.rn.sort.bam| head | cut -f 1,2
ST-E00600:147:HNTKYALXX:1:1101:1036:18035   99
ST-E00600:147:HNTKYALXX:1:1101:1036:18035   147
ST-E00600:147:HNTKYALXX:1:1101:1036:18035   2195
ST-E00600:147:HNTKYALXX:1:1101:1036:18035   403
ST-E00600:147:HNTKYALXX:1:1101:1036:20948   83
ST-E00600:147:HNTKYALXX:1:1101:1036:20948   163
ST-E00600:147:HNTKYALXX:1:1101:1036:21042   83
ST-E00600:147:HNTKYALXX:1:1101:1036:21042   163
ST-E00600:147:HNTKYALXX:1:1101:1036:21637   83
ST-E00600:147:HNTKYALXX:1:1101:1036:21637   163

2. 转换为Fastq

samtools fastq -@ $(nproc) -1 D1_1.fq.gz -2 D1_2.fq.gz -s /dev/null -0 /dev/null D1.rn.sort.bam -c 9

-1 代表输出的R1端Fastq.gz文件名
-2 代表输出的R2端Fastq.gz文件名
-s singleton代表将无法找到mate pair的reads输出到文件,这里不需要,所以输出到/dev/null
-0 将bitwise flags中同时有READ1/READ2标记或缺乏任何READ1/READ2标记的reads输出到文件,这里不需要,所以输出到/dev/null
-c 如果输出的是fastq.gz,必须使用-c 选项,选择压缩级别,一般选择9,最高压缩

*比对软件某些情况下会将一端比对上,另一端无法比对上的reads保留到bam文件,这样的reads称为singleton。

3. 检查Fastq文件

最好检查转换来的Fastq文件是否格式正确,并且没有受到损坏

a. 是否有非@开头的identifier lines

zcat D1_1.fq.gz | awk 'NR%4==1 && $1!~/^@/ {print; print NR; exit}'

b. 压缩文件是否完整

gunzip -t D1_1.fq.gz

GATK SamToFastq

gatk SamToFastq --INPUT D1.rn.sort.bam --FASTQ D1_1.fq.gz --SECOND_END_FASTQ D1_2.fq.gz --TMP_DIR . --INCLUDE_NON_PRIMARY_ALIGNMENTS true --COMPRESSION_LEVEL 9

注意,GATK方法仅适用于无重复read name的bam文件,也就是说read name的后缀中必须要标明:1/:2,不然GATK会报错。也就是说D1.rn.sort.bam其实是不能用这个方法的。

bedtools bamtofastq

bedtools bamtofastq -i D1.rn.sort.bam -fq D1.1.fq -fq2 D1.2.fq 2>>bamtofastq.log

注意,bedtools方法在singleton的reads中会报错

*****WARNING: Query ST-E00600:147:HNTKYALXX:1:1272:31566:33771 is marked as paired, but its mate does not occur next to it in your BAM file.  Skipping.

也就是说它只会保留paired的reads,因此生成的fastq文件可能会比应有的大小要小,而且R1端与R2端的大小也可能不一样。

bam格式转换为Fastq/Fasta格式相关推荐

  1. DateTime时间格式转换为Unix时间戳格式

    // DateTime时间格式转换为Unix时间戳格式 public int ConvertDateTimeInt(System.DateTime time) { System.DateTime st ...

  2. 【ffmpeg】windows上用命令行批量将.flac格式转换为.wav等格式

    windows上用命令行批量将.flac格式转换为.wav等格式 需先安装ffmpeg(用于音视频处理)和git(用于运行sh文件),然后执行脚本 参考资料如下: 1 windows安装ffmpeg并 ...

  3. Web后端servlet—使用servlet的Part接口实现单文件多文件上传、以及日期格式转换为sql日期格式的实现

    JDBC工具类JdbcFileDateUtil上传文件和日期格式转换,包含单文件多文件上传最新最简单简便的办法 本文档介绍了文件上传的处理方法,包括当前端form表单的编码类型为enctype=&qu ...

  4. voc数据集格式转换为coco数据集格式+修改xml格式文件

    voc数据集格式转换为coco格式+修改xml格式文件中部分内容 voc数据集格式→coco数据集格式 修改xml格式文件中部分内容 voc数据集格式→coco数据集格式 下面这份代码只需修改文件所在 ...

  5. FBX格式转换为GLTF/GLB格式

    有小伙伴说通过blende将fbx转glb/gltb格式的模型无法在web端加载,或glb模型无法打开,比如腾讯地图加载gltf. 这里个大家分享一个插件 可以将fbx格式转换为glb格式 windo ...

  6. 如何使用python将Java时间戳格式转换为python时间戳格式?

    工作中问题描述: 一次代码测试结果生成后,发现工具生成的结果集记录中时间的格式是 "Wed Nov 02 08:24:18 CST 2022" 周     月    日  时:分: ...

  7. python视频转化_python实现m3u8格式转换为mp4视频格式

    开发动机:最近用手机QQ浏览器下载了一些视频,视频越来越多,占用了手机内存,于是想把下载的视频传到电脑上保存,可后来发现这些视频都是m3u8格式的,且这个格式的视频都切成了碎片,存在电脑里不方便查看, ...

  8. m3u8转换到mp4 python_python实现m3u8格式转换为mp4视频格式

    开发动机:最近用手机QQ浏览器下载了一些视频,视频越来越多,占用了手机内存,于是想把下载的视频传到电脑上保存,可后来发现这些视频都是m3u8格式的,且这个格式的视频都切成了碎片,存在电脑里不方便查看, ...

  9. 批量将.flac格式转换为.wav等格式

    在声纹识别的研究中,不同数据集包含不同的音频格式(.flac/ .wav/ ...),但个别情况下,我们有想使用统一的格式来处理,因此就需要批量转换了. 这里需要使用ffmpeg进行格式转换,因此需要 ...

最新文章

  1. vuejs和html语言一样么,vue和vue.js有区别吗?
  2. mac bash 下使用vi 快捷方式——因为没有alt键 所以没有办法 用vi模式也非常方便的...
  3. go语言笔记——map map 默认是无序的,不管是按照 key 还是按照 value 默认都不排序...
  4. 1.使用适配器模式设计一个仿生机器人:要求机器人可以模拟各种动物行为,在机器人中定义了一系列方法,如机器人发声方法talk(),机器人移动方法move()等。如果希望在不改变已有Bird类代码的基础上
  5. 推荐一个接口文档工具
  6. 服务器开放特定端口的方法
  7. opencv摄像头速度慢_c++ - 从OpenCV 3切换到OpenCV 4会导致网络摄像头以最高5帧的速度记录,而不是通常的30帧。 - SO中文参考 - www.soinside.com...
  8. 计算机安全的加密技术,计算机安全加密技术研究(4篇)(共14695字).doc
  9. Snowflake Snow Snowflakes--POJ 3349
  10. android 发送按键 0,android monitor tool (8.0 模拟发送按键及触摸屏事件实现)
  11. HFSS仿真软件完成微带天线设计
  12. 10个切片动作过渡PR预设
  13. 编写程序,提示用户输入一个数并显示该数,使用字符模拟7段显示器的效果:Enter a number:491-9014
  14. 数字电视标准5种规格720p、1080i和…
  15. 移动硬盘插到台式机,外接网卡无法连接wifi处理
  16. python+nodejs+php+springboot+vue 社区小区报修 -社区信息管理
  17. FPGA+DSP编码过程
  18. DELL PC服务器PowerEdge 管理工具OMSA的使用
  19. 断流测试软件,不用担心WiFi断流了!亲身测试:试了这个方法后,信号杠杠的...
  20. go get connectex: A connection attempt failed because the connected party did not properly respond

热门文章

  1. Leetcode 699. 掉落的方块 C++
  2. 数据分析学习之完整的数据挖掘项目流程
  3. 智能无人机课程里的 PX4+TX2+小觅 vins 实飞教程
  4. 陶洋的个人简历——自荐信
  5. 米家app扫描不到石头机器人_【石头扫地机器人T4使用总结】集尘盒|回充|扫地|APP_摘要频道_什么值得买...
  6. 命令模式(Command模式)详解
  7. 在Unity中用UGUI实现装备合成树
  8. jquery点击图片变大,再点击回复如初
  9. nginx白名单黑名单设置
  10. 【幻灯片动画制作软件】Focusky教程 | Focusky的幻灯片功能怎么用?