生信分析进阶3 - pysam操作bam文件统计unique reads和mapped reads高级技巧合辑

pysam操作bam文件统计unique reads和mapped reads高级技巧

1. Linux服务器读取bam文件

服务器查看bam常用方法。

# bam_path: bam文件路径
samtools view -h bam_path|grep -v '^@'|less -S

samtools view查看

2. samtools + python os库读取bam文件

缺点速度较慢。

import os

# 读取bam
# bam_path: bam文件路径
read_lines = os.popen("samtools view {} -h".format(bam_path)).readlines()

# 遍历bam文件每行
for index, line in enumerate(read_lines):
    # 去除末尾\n
    line = line.strip()
    
    # 过滤@开头行
    if line.startswith('@'):
        continue
    else:
        # 打印关键信息
        print(index, '\t', line)

3. 使用pysam对bam进行读取操作

速度快,需要注意:samtools的坐标是1-base,而pysam坐标是0-base。

import pysam

bam_path = "/path/sample.bam"

######  方法1 ###### 
# 读取bam文件
bam_file = pysam.AlignmentFile(bam_path, 'rb')
# 读取sam文件,可直接读取
# bam_file = pysam.AlignmentFile(bam_path, 'r')
# 读取cram文件
# bam_file = pysam.AlignmentFile(bam_path, 'rc')

for line in bam_file:
    record = line
    print(record)
    break

# 关闭bam
bam_file.close()

###### 方法2 ###### 
# 无需close关闭
with pysam.AlignmentFile(bam_path, 'rb') as bam_file :
	for line in bam_file :
		print(line )
		break

打印record

4. 使用pysam对bam进行写入操作

bam_path = "/path/sample.bam"
bam_out_path = "/path/sample-out.bam"

with pysam.AlignmentFile(bam_out_path, 'wb', template=bam_file) as write_bam_file:
   # 写入读取的record至bam文件末尾
	write_bam_file.write(record)

5. 使用pysam检查bam index是否存在

# 检查是否存在bam index, 存在返回True, 否则为False
bam_file.check_index()

# 与samtools联用, 不存在index则samtools index生成
if not bam_file.check_index():
    os.system("samtools index {}".format(bam_path))
    


6. 使用pysam对bam进行排序

bam_out_path = "/path/sample.sorted.bam"
# 对bam进行sort排序
pysam.sort("-o", bam_sort_path, bam_path)

7. 使用pysam提取基因组某个区域的比对结果

region = bam_file.fetch(contig='chr1', start=60000, stop=60200)
print(region)

8. 使用pysam提取基因组某个区域的reads数量

# 返回reads数目值
region_reads_count = bam_file.count(contig='chr1', start=500000, stop=1000000)
print(region_reads_count)
# 56604

9. 使用pysam提取基因组某个区域的每个碱基覆盖深度

# 返回区间每个碱基的的覆盖深度
region_coverage = bam_file.count_coverage(contig='chr5', start=5000000, stop=5000100)
print(region_coverage)

返回值

10. 使用pysam获取bam文件中每条染色体的mapped和unmapped reads数量

bam_file.get_index_statistics()
# [IndexStats(contig='chr1', mapped=3115437, unmapped=3233, total=3118670),
#  IndexStats(contig='chr2', mapped=2426504, unmapped=2287, total=2428791),
#  IndexStats(contig='chr3', mapped=2092895, unmapped=1806, total=2094701),
#  IndexStats(contig='chr4', mapped=1189202, unmapped=1058, total=1190260),
#  IndexStats(contig='chr5', mapped=1357775, unmapped=1167, total=1358942),
#  IndexStats(contig='chr6', mapped=1772859, unmapped=1572, total=1774431),
#  IndexStats(contig='chr7', mapped=1484016, unmapped=1528, total=1485544),
#  IndexStats(contig='chr8', mapped=1122131, unmapped=1034, total=1123165),
#  IndexStats(contig='chr9', mapped=1341301, unmapped=1486, total=1342787),
#  IndexStats(contig='chr10', mapped=1046607, unmapped=909, total=1047516),
#  IndexStats(contig='chr11', mapped=1731600, unmapped=1797, total=1733397),
#  IndexStats(contig='chr12', mapped=1829623, unmapped=1534, total=1831157),
#  IndexStats(contig='chr13', mapped=568294, unmapped=420, total=568714),
#  IndexStats(contig='chr14', mapped=1013704, unmapped=907, total=1014611),
#  IndexStats(contig='chr15', mapped=1270915, unmapped=1089, total=1272004),
#  IndexStats(contig='chr16', mapped=1937126, unmapped=2096, total=1939222),
#  IndexStats(contig='chr17', mapped=2175991, unmapped=2195, total=2178186),
#  IndexStats(contig='chr18', mapped=547370, unmapped=530, total=547900),
#  IndexStats(contig='chr19', mapped=1790984, unmapped=2367, total=1793351),
#  IndexStats(contig='chr20', mapped=693052, unmapped=775, total=693827),
#  IndexStats(contig='chr21', mapped=421361, unmapped=496, total=421857),
#  IndexStats(contig='chr22', mapped=967377, unmapped=1140, total=968517),
#  IndexStats(contig='chrX', mapped=2187343, unmapped=1680, total=2189023),
#  IndexStats(contig='chrY', mapped=35027, unmapped=27, total=35054),
#  IndexStats(contig='chrMT', mapped=1334891, unmapped=1494, total=1336385)]

11. 使用pysam获取bam文件每条染色体长度

# 比对上reads数量
bam_file.mapped

# 未比对上的reads数量
bam_file.unmapped

###################
chrom_names = bam_file.references
chrom_lengths = bam_file.lengths

# 打印数据类型
print(type(chrom_names))
# <class 'tuple'>

# zip压缩2个元组
for chrom, length in zip(chrom_names, chrom_lengths):
    print(chrom, ':', length)

# chr1 : 249250621
# chr2 : 243199373
# chr3 : 198022430
# chr4 : 191154276
# chr5 : 180915260
# chr6 : 171115067
# chr7 : 159138663
# chr8 : 146364022
# chr9 : 141213431
# chr10 : 135534747
# chr11 : 135006516
# chr12 : 133851895
# chr13 : 115169878
# chr14 : 107349540
# chr15 : 102531392
# chr16 : 90354753
# chr17 : 81195210
# chr18 : 78077248
# chr19 : 59128983
# chr20 : 63025520
# chr21 : 48129895
# chr22 : 51304566
# chrX : 155270560
# chrY : 59373566
# chrMT : 16569

12. 使用pysam操作bam文件用法


with pysam.AlignmentFile(bam_path, 'rb') as bam_file:
    # bam_file对象每一行都是一条reads
    for reads in bam_file:
        # 打印与reads配对的另一条reads
        line_match = bam_file.mate(reads)
        print(line_match)

        # 判断是否是PCR重复序列
        print(reads.is_duplicate)

        # 判断是否是成对reads
        print(reads.is_paired)

        # 判断是否是左端reads
        print(reads.is_read1)

        # 判断是否是右端reads
        print(reads.is_read2)

        # 判断是否是质控失败
        print(reads.is_qcfail)

        # 判断是否比对到参考基因组
        print(reads.is_unmapped)

        # 输出reads的比对质量
        print(reads.mapping_quality)

        # 输出reads比对到参考基因组上的起始和结束坐标
        print(reads.get_blocks())
        # [(10179, 10206), (10206, 10227), (10228, 10273), (10273, 10297), (10297, 10303), (10303, 10325)]

        # 输出在指定区域坐标的重叠区域长度
        print(reads.get_overlap(500000,600000))
        # 0
        
        # 输出reads在比对到参考基因组的上参考序列
        print(reads.get_reference_sequence())
        # tAACCCTAACCCTAACCCTAACCCTAACCCTAACCCtAACCCtAACCCTAAcCCCtAACCCtAACCCTAAACCCtAAACCCTAACCCTAACCCTAACCCtAACCCtAACCCcAACCCCAACCCCAaCCCCAACCCcAACCCcAACC
        
        break

13. 使用pysam计算指定区域的unique mapped的reads数量

# 计算指定区域的unique mapping的reads数目
import pysam

#### 输入参数 ####
chr='chr16'
start=1250000
stop=1260000

bam_file = pysam.AlignmentFile(bam_path, 'rb')

# 定义集合,避免reads重复,其大小就是unique reads的数量
region_reads = set()
count = 0

for read in bam_file.fetch(chr, start, stop):
    region_reads.add(read.query_name)
    count = count +1

# 打印结果
print('{} unique reads in {}:{}-{}'.format(len(region_reads), chr, start, stop))
print('{} alignment in {}:{}-{}'.format(count, chr, start, stop))

# 4778 unique reads in chr16:1250000-1260000
# 9514 alignment in chr16:1250000-1260000

14. 使用pysam计算非重叠区间(窗口)的unique mapping的 reads数量

import pysam

# 设置统计窗口大小100kb
bin_size = 100000

bam_file = pysam.AlignmentFile(bam_path, "rb")
print(bam_file.references)
print(bam_file.lengths)

# 将结果写入文件
with open("bam.window.reads.count", 'w') as fwrite:
    # 写入header
    fwrite.write("ref\tstart\tstop\tunique_reads\tmapped_reads\n")
    
    # 遍历bam文件中比对到参考基因组上的染色体名称
    for i in range(len(bam_file.references)):
        
        # 获取比对到参考基因组上的染色体名称和长度
        refname = bam_file.references[i]
        seqlen = bam_file.lengths[i]
    
        # 以bin_size窗口大小将染色体分割为j个窗口
        mapped_count = 0
        for j in range(1, seqlen, bin_size):
            
            # pysam为0-base, 坐标需-1
            # 获取stop坐标, j为start坐标
            if j + bin_size - 1 < bam_file.lengths[i]:
                stop = j + bin_size - 1
            else:
                stop = bam_file.lengths[i]
                
            region_reads = set()
            # 获取unique_reads, mapped_reads
            for read in bam_file.fetch(refname, j, stop):
                region_reads.add(read.query_name)
                mapped_count += 1

            # 写入文件
            fwrite.write("{0}\t{1}\t{2}\t{3}\t{4}\n".format(refname, j, stop, len(region_reads), mapped_count))
        

结果文件:

bam.window.reads.count

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/664899.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot从2.7.2 升级到 3.3.0

文章目录 概要准备报错调整小结后记 概要 时代在进步&#xff0c;springboot已经来到了3.3.0 , 于是我们也打算升级下sbvadmin到3.3&#xff0c; jdk使用21的版本&#xff0c;下面是升级过程中碰到的一些问题&#xff0c;问题不大。 2.7.2 -> 3.3.0 准备 下载jdk21&#…

AdroitFisherman模块安装日志(2024/5/31)

安装指令 pip install AdroitFisherman-0.0.29.tar.gz -v 安装条件 1:Microsoft Visual Studio Build Tools 2:python 3.10.x 显示输出 Using pip 24.0 from C:\Users\12952\AppData\Local\Programs\Python\Python310\lib\site-packages\pip (python 3.10) Processing c:\u…

UML静态图-类图

概述 静态图包含类图、对象图和包图的主要目的是在系统详细设计阶段&#xff0c;帮助系统设计人员以一种可视化的方式来理解系统的内部结构和代码结构&#xff0c;包括类的细节、类的属性和操作、类的依赖关系和调用关系、类的包和包的依赖关系。 一、类图的表示法 类图(Cla…

【linux】自定义快捷命令/脚本

linux自定义快捷命令 场景自定义命令自定义脚本 场景 深度学习经常要切换到自己环境&#xff0c;conda activate mmagic&#xff0c;但是又不想每次重复打这么多字&#xff0c;想使用快捷命令直接切换。 自定义命令 使用别名&#xff08;alias&#xff09;或自定义脚本来创建…

【期末速成】——计算机组成原理(1)

目录 一、什么是计算机的组成 二、冯诺依曼体系结构计算机的特点 三、计算机系统的层次结构 四、机器语言、汇编语言、高级语言, 五、 编译程序、解释程序、汇编程序 六、已知主频、CPI计算程序运行时间 一、什么是计算机的组成 计算机的组成可以分为五个部件和两个信息…

10.Halcon3D点云和MESH的相互转换

1.实现效果 这个案例主要是想告诉我们,如何在点云数据(全是点)和MESH(网格数据)中转换,理论上说可以点云数据可以看作的离散的,而MESH网格数据可以看作是连续的。 上图展示了三个(其实是四个)空间中的3d对象,左边第一个是一个立方体,经过降采样之后的点云,中间的是…

systemctl 添加自定义系统服务

以 “启动、停止、重启” boa web server为例&#xff1a; 1. 编写系统服务脚本 编写一个符合系统服务规范的脚本。这个脚本通常描述了服务的启动、停止、重启等行为。你可以使用shell、C、C、Java等语言来编写这个脚本。 # boa_server_run.sh&#xff1a;#!/bin/bashset -e …

浅谈申请小程序地理位置权限的正确打开方式

小程序地理位置接口有什么功能&#xff1f; 这篇内容会教大家如何快速申请“获取当前的地理位置&#xff08;onLocationChange&#xff09;”接口&#xff0c;以便帮助大家顺利开通接口。以下内容是本人经历了多次的申请经历得出来的经验&#xff0c;来之不易&#xff0c;望大家…

基础—SQL—DQL(数据查询语言)分页查询

一、引言 上一篇博客学习了排序查询&#xff0c;这次来讲查询的最后一个部分&#xff1a;分页查询。 涉及到的关键字是&#xff1a;LIMIT 。 二、DQL—分页查询 对于分页&#xff0c;不管以后做的是传统的管理系统还是做互联网的项目&#xff0c;基本上都会遇到分页查询的操…

【C语言】常见的动态内存的错误

前言 在动态内存函数的使用过程中我们可能会遇到一些错误&#xff0c;这里将常见的错误进行总结。 对NULL解引用 请看以下代码&#xff1a; 可以看到&#xff0c;这时我们的malloc开辟是失败的&#xff0c;所以返回的是空指针NULL&#xff0c;而我们却没有进行检查&#xff0…

东莞酷得智能 组装机械狗电子玩具方案

这款机械狗玩具电子方案结合了现代电子技术和人工智能元素&#xff0c;旨在为用户提供一个高科技、互动性强的娱乐体验。通过不断的软件更新和硬件迭代&#xff0c;机械狗的功能将持续扩展。 一、功能特点&#xff1a; 1、自动巡游&#xff1a;机械狗能够自主在房间内巡游&am…

计算机组成原理-----实验1

实 验 报 告 实验一 基本运算器实验 1、实验目的 &#xff08;一&#xff09;了解运算器的组成结构&#xff1b; &#xff08;二&#xff09; 掌握运算器的工作原理&#xff1b; &#xff08;三&#xff09;熟悉运算器的数据传送通路&#xff1b; &#xff08;四&#xff09;按…

Amis源码构建 sdk版本

建议在linux环境下构建&#xff08;mac环境下也可以&#xff09;&#xff0c;需要用到sh脚本&#xff08;amis/build.sh&#xff09;。 Js sdk打包是基于fis进行编译打包的&#xff0c;具体可见fis-conf.js&#xff1a; amis-master源码下载:https://github.com/baidu/amis g…

推荐几款优秀的文档加密软件 | 企业文件加密解决方案

在数字化时代&#xff0c;信息安全问题日益突出&#xff0c;文档加密软件成为了保护数据安全的重要手段。但是&#xff0c;市面上的文档加密软件种类繁多&#xff0c;功能各异&#xff0c;如何选择一款好用的文档加密软件成为了许多用户关注的焦点。本文将为大家提供一份实用的…

@Value 读取环境变量配置

在项目开发过程中&#xff0c;有必要使用一些灰色规则&#xff08;即仅用于开发使用过程中的逻辑控制变量&#xff09;。 比如&#xff0c;本地开发中&#xff0c;一些业务逻辑需要调用第三方代码&#xff0c;但又在本地调不通&#xff0c;怎么办。只能通过 if(本地开发) {mock…

手拉手springboot整合kafka发送消息

环境介绍技术栈springbootmybatis-plusmysqlrocketmq软件版本mysql8IDEAIntelliJ IDEA 2022.2.1JDK17Spring Boot3.1.7kafka2.13-3.7.0 创建topic时&#xff0c;若不指定topic的分区(Partition主题分区数)数量使&#xff0c;则默认为1个分区(partition) springboot加入依赖kafk…

HTML静态网页成品作业(HTML+CSS)——企业装饰公司介绍网页(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

热电子光探测器的电磁场空间分布与FDTD材料折射率的导出

仿真实例 金属薄膜中金纳米孔阵列透射与反射&#xff0c; 并考虑其近场电磁分布 利用脚本进行电磁场及其光学响应的可视化 设置EOT型超表面结构&#xff0c;以及Structure library的使用 结构的参数化扫描与结果可视化 利用脚本计算峰值增强因子 多层平面结构激发T…

Spark 核心编程之 RDD 介绍

一、Spark 分布式计算模拟 Driver 端将数据拆分成 n 个 Task 发送给 Executor&#xff0c;n 为 Executor 个数&#xff0c;Task 包含数据和计算逻辑&#xff0c;Executor 接收到 Task 后进行计算并将计算后的结果返回给 Driver 定义封装整体数据和逻辑的资源类 class Resource …

高性能服务器网络模型详解

1999年Dan Kegel在发表的论文中提出了The C10K problem&#xff0c;这篇论文对传统服务器架构处理大规模并发连接时的挑战进行了详细描述&#xff0c;并提出了一些解决方案和优化技术。这里的C指的是Concurrent(并发)的缩写&#xff0c;C10K问题是指怎么在单台服务器上并发一万…