生信算法8 - HGVS转换与氨基酸字母字母表

news2024/10/23 14:19:51

HGVS 概念

HGVS 人类基因组变异协会(Human Genome Variation Society)提出的转录本编号cDNA 参考序列(以前缀“c.”表示)、氨基酸参考序列(以前缀“p.”表示)。cDNA 中一种碱基被另一种碱基取代,以“>”进行表示,如:c.2186A>G,表示与参考序列相比,在第 2186 位置的腺嘌呤(A)被鸟嘌呤(G)所取代;在氨基酸中 p.Asp729Gly,表示在第 729 位置的 Asp(天冬氨酸)被 Gly(甘氨酸)取代。

氨基酸字母与缩写转换表

python3.9实现算法。

# 氨基酸缩写与全称转换字典
dict_AA = {'A': {'Abbreviation': 'Ala', 'CN': '丙氨酸', 'EN': 'Alanine'}, 
           'F': {'Abbreviation': 'Phe', 'CN': '苯丙氨酸', 'EN': 'Phenylalanine'}, 
           'C': {'Abbreviation': 'Cys', 'CN': '半胱氨酸', 'EN': 'Cysteine'}, 
           'U': {'Abbreviation': 'Sec', 'CN': '硒半胱氨酸', 'EN': 'Selenocysteine'}, 
           'D': {'Abbreviation': 'Asp', 'CN': '天冬氨酸', 'EN': 'Aspartic acid / Aspartate'}, 
           'N': {'Abbreviation': 'Asn', 'CN': '天冬酰胺', 'EN': 'Asparagine'}, 
           'E': {'Abbreviation': 'Glu', 'CN': '谷氨酸', 'EN': 'Glutamic acid / Glutamate'}, 
           'Q': {'Abbreviation': 'Gln', 'CN': '谷氨酰胺', 'EN': 'Glutamine'}, 
           'G': {'Abbreviation': 'Gly', 'CN': '甘氨酸', 'EN': 'Glycine'}, 
           'H': {'Abbreviation': 'His', 'CN': '组氨酸', 'EN': 'Histidine'}, 
           'L': {'Abbreviation': 'Leu', 'CN': '亮氨酸', 'EN': 'Leucine'}, 
           'I': {'Abbreviation': 'Ile', 'CN': '异亮氨酸', 'EN': 'Isoleucine'},
            'K': {'Abbreviation': 'Lys', 'CN': '赖氨酸', 'EN': 'Lysine'},    
           'O': {'Abbreviation': 'Pyl', 'CN': '吡咯赖氨酸', 'EN': 'Pyrrolysine'}, 
           'M': {'Abbreviation': 'Met', 'CN': '蛋氨酸', 'EN': 'Methionine'}, 
           'P': {'Abbreviation': 'Pro', 'CN': '脯氨酸', 'EN': 'Proline'}, 
           'R': {'Abbreviation': 'Arg', 'CN': '精氨酸', 'EN': 'Arginine'}, 
            'S': {'Abbreviation': 'Ser', 'CN': '丝氨酸', 'EN': 'Serine'}, 
           'T': {'Abbreviation': 'Thr', 'CN': '苏氨酸', 'EN': 'Threonine'}, 
           'V': {'Abbreviation': 'Val', 'CN': '缬氨酸', 'EN': 'Valine'}, 
           'W': {'Abbreviation': 'Trp', 'CN': '色氨酸', 'EN': 'Tryptophan'}, 
           'Y': {'Abbreviation': 'Tyr', 'CN': '酪氨酸', 'EN': 'Tyrosine'}, 
}

# 写入文本
with open("AA_convert.txt", 'w') as fw:
    fw.write("Letter\tAbbreviation\tCN\tEN\n")
    for letter, abbr in dict_AA.items():
        print(letter, ':', abbr)
        line = "{0}\t{1}\t{2}\t{3}\n".format(letter, 
                                             abbr.get('Abbreviation', 'ERROR'),
                                             abbr.get('CN', 'ERROR'), 
                                             abbr.get('EN', 'ERROR'))
        fw.write(line)

# 从文本读取为字典
dict_AA = {}
with open("AA_convert.txt", 'r') as fr:
    # 遍历每行
    for line in fr.readlines():
        # 跳过首行
        if line.startswith('Letter'):
            continue
        line = line.strip().split('\t')
        dict_AA[line[0]] = {'Abbreviation': line[1], 'CN': line[2], 'EN': line[3]}

# 打印字典
print(dict_AA)

打印字典

打印全部氨基酸字母表

# 打印全部氨基酸字母表,用于后续re模块正则表达式
s = ''
for letter, abbr in dict_AA.items():
    if letter != 'Y':
        s += f"{letter}|"
    else:
        s += f"{letter}"
print(s)
#A|F|C|U|D|N|E|Q|G|H|L|I|K|O|M|P|R|S|T|V|W|Y

HGVS写法转换

# 对HGVS写法进行转换
# ANNOVAR注释写法
# SLC25A13:NM_014251:exon1:c.T2C:p.M1T

# 转换后写法
# c.2T>C/p.Met1Thr (NM_014251.3) Exon1/18

import re

def convert_HGVS(hgvs: str, total_exon: int):
    """
    hgvs: 待转换HGVS
    total_exon: 基因的全部外显子数量
    """
    # 按:符号分割输入hgvs
    list_hgvs = hgvs.split(':')

    gene = list_hgvs[0]
    exon = nm = cds_change = aa_change = exon_change_position = aa_change_position = ref = alt = ref_aa = alt_aa = ''
    for context in list_hgvs[1:]:
        if 'exon' in context:
            exon = context
        if 'NM' in context:
            nm = context
        elif 'c.' in context:
            cds_change = context
            
            # 匹配ref碱基、外显子发生变异的坐标和alt碱基
            match = re.search(r'([A|T|C|G]*)(\d+)([A|T|C|G]*)', cds_change)
            if match:
                # 获取ref碱基
                ref = match.group(1)
                # 获取位置
                exon_change_position = match.group(2)
                # 获取alt碱基
                alt = match.group(3)
            else:
                raise Exception("ERROR!")
                
        elif 'p.' in context:
            aa_change = context
            # 匹配ref氨基酸、外显子发生变异对应氨基酸改变的坐标和alt氨基酸
            match = re.search(r'([A|F|C|U|D|N|E|Q|G|H|L|I|K|O|M|P|R|S|T|V|W|Y]*)(\d+)([A|F|C|U|D|N|E|Q|G|H|L|I|K|O|M|P|R|S|T|V|W|Y]*)', aa_change)
            if match:
                # 获取ref氨基酸
                ref_aa = match.group(1)
                # 氨基酸改变的坐标
                aa_change_position = match.group(2)
                # 获取alt氨基酸
                alt_aa = match.group(3)

                # 将字典简写氨基酸转换为三字母缩写氨基酸
                ref_aa = dict_AA[ref_aa].get('Abbreviation', "ERROR")
                alt_aa = dict_AA[alt_aa].get('Abbreviation', "ERROR")
            else:
                raise Exception("ERROR!")
    
    # 调整写法 c.2T>C/p.Met1? (NM_014251.3) Exon1/18
    hgvs_formated = 'c.{exon_change_position}{ref}>{alt}/p.{ref_aa}{aa_change_position}{alt_aa} ({nm}) {exon}/{total_exon}'.format(exon_change_position=exon_change_position,
                                                                                                       ref=ref,
                                                                                                       alt=alt,
                                                                                                       ref_aa=ref_aa,
                                                                                                       aa_change_position=aa_change_position,
                                                                                                       alt_aa=alt_aa,
                                                                                                        nm=nm,
                                                                                                        exon= exon.capitalize(),
                                                                                                        total_exon=total_exon)
    # 打印中间变量
    print(gene, exon, cds_change, aa_change, exon_change_position, ref, alt, aa_change_position, ref_aa, alt_aa)
    return hgvs_formated 

# 测试
print(convert_HGVS(hgvs='SLC25A13:NM_014251:exon1:c.T2C:p.M1T', total_exon=18))
# c.2T>C/p.Met1Thr (NM_014251) Exon1/18

print(convert_HGVS(hgvs='PKD1:NM_001009944:exon15:c.G3496A:p.G1166S', total_exon=46))
# c.3496G>A/p.Gly1166Ser (NM_001009944) Exon15/46

生信算法文章推荐

生信算法1 - DNA测序算法实践之序列操作

生信算法2 - DNA测序算法实践之序列统计

生信算法3 - 基于k-mer算法获取序列比对索引

生信算法4 - 获取overlap序列索引和序列的算法

生信算法5 - 序列比对之全局比对算法

生信算法6 - 比对reads碱基数量统计及百分比统计

生信算法7 - 核酸序列Fasta和蛋白PDB文件读写与检索

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ETO MARKETS:美债高额利息——美国财政的不可承受之重

摘要 2024年,美国联邦政府债务的利息支出预计将达到8920亿美元,这一数字比国防开支还要多,凸显了政府债务和利率上升的双重压力。国会预算办公室(CBO)预测,利息支出占GDP的比例将继续上升,这意…

【IDEA】Spring项目build失败

通常因为环境不匹配需要在file->projectstructure里面调整一下。

Flink Sql Redis Connector

经常做开发的小伙伴肯定知道用flink连接redis的时候比较麻烦,更麻烦的是解析redis数据,如果rdis可以普通数据库那样用flink sql连接并且数据可以像表格那样展示出来就会非常方便。 历时多天,我终于把flink sql redis connector写出来了&…

性能测试(五)—— 数据库性能测试-mysql

1 mysql性能测试的主要内容 MySQL数据库介绍MySQL数据库监控指标MySQL慢查询工作原理及操作SQL的分析与调优方法MySQL索引的概念及作用MySQL索引的工作原理与设计规范MySQL存储引擎MySQL实时监控MySQL集群监控方案MySQL性能测试的用例准备使用Jmeter开发MySQL性能测试脚本执行…

【从零到一】电子元器件网站建设/开发方案、流程及搭建要点全解

电子元器件行业在数字化转型的大潮下也迎来了前所未有的发展机遇。一个高效、专业、用户友好的电子元器件网站,不仅能够提升品牌形象,还能显著提高销售转化率,增强客户粘性。道合顺芯站点将详细阐述电子元器件开发方案、实施流程,…

【ai】tx2-nx:搭配torch的torchvision

微雪的教程pytorch_version 1.10.0 官方教程安装torch官方教程 依赖项 nvidia@tx2-nx:~/twork/03_yolov5$ $ sudo apt-get install libjpeg-dev zlib1g-dev lib

如何避免群发引起反感?

微信群发信息引起反感主要是因为缺乏情感,尽管最初微信群发旨在传递有价值信息,但由于滥用,现在人们对其印象非常负面。但是,还是有办法挽救的! 群发消息时按照这3个标准发,可以避免被反感。 1、短信群发目…

wps要会员才能把pdf分开,这不纯属智商税吗

我有一个文档 然后 我给你们写好了一个代码 from PyPDF2 import PdfReader, PdfWriterdef split_pdf(file_path, ranges, output_names):# Open the input PDF filewith open(file_path, rb) as pdf_file:reader = PdfReader(pdf_file)total_pages = len(reader.pages)if len…

Humanize,一个很有人情味的 Python 库

目录 01初识 Humanize 为什么选择 Humanize? 安装 Humanize 02时间与日期的处理 时间差的展示 日期的展示 03数字的处理 数字的单位转换 数字的精确度控制 数字的千位分隔符 04文件大小的处理 文件…

【Linux工具】yum软件包管理器与Vim编辑器的高效运用

目录 Linux 软件包管理器 YUM 什么是软件包 安装工具 rzsz 及注意事项 查看软件包 安装和卸载软件 安装软件 卸载软件 Linux 开发工具 编辑器 - Vim 使用 ​编辑 Vim 与 Vi 的区别 Vim 的基本概念 三种模式 Vim 的基本操作 操作尝试: Vim 命令集解释…

Windows更新报错 0xc1900101 0x30018 解决方案

卸载自带的电脑管家(比如华硕、联想、华为等) 通过禁用第三方驱动启动Windows(winr 运行 msconfig),然后禁用掉第三方服务,重启系统。 检查更新,应该问题就能解决 记得重新运行msconfig&…

【机器学习】线性回归:从基础到实践的深度解析

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 线性回归:从基础到实践的深度解析引言一、线性回归基础1.1 定义与目…

Electron+vite+vuetify项目搭建

最近想用Electron来进行跨平台的桌面应用开发。同时想用vuetify作为组件,于是想搭建一个这样的开发环境。其中踩了不少坑,总是会出现各种的编译错误和问题,依赖的各种问题,搞了好久最终环境终于弄好可正常开发了。这里分享下快速搭…

最新OPPO 真我手机 一加手机 使用adb命令永久关闭系统更新教程

使用adb命令永久关闭系统更新 一、先了解手机系统二、Android 11 以下使用adb 命令永久关闭系统更新1、adb 官方下载2、小白开启 USB 调试模式教程(熟手跳过)三、Android 12 以上使用adb 命令永久关闭系统更新什么您还是不会弄!赞赏我&#x…

git中的多人协作开发场景

✨前言✨ 📘 博客主页:to Keep博客主页 🙆欢迎关注,👍点赞,📝留言评论 ⏳首发时间:2024年6月20日 📨 博主码云地址:博主码云地址 📕参考书籍&…

告别夏季粉尘螨虫困扰,这些空气净化器品牌你不能错过!

夏季来临,粉尘螨虫肆虐,对家居环境造成巨大威胁。俗话说:“病从口入,祸从口出。”夏季是粉尘和螨虫的活跃期,常规的清洁手段如吸尘、抹布擦拭等已无法彻底清除这些顽固的过敏源。尤其是在空调使用频繁的日子里&#xf…

民宿小程序在线预约系统开发,提高品牌影响力

在旅游业发展旺盛的当下,也带动了各地民宿的发展。在科技的支持下,民宿小程序得到了快速发展,凭借方便快捷的优势为大众带来新的体验。 民宿小程序的发展为用户提供了便捷的预订渠道,用户可以根据对房间的要求选择,能…

DNF安卓分离仅是开始:游戏厂商积极布局自有渠道,市场变革在即

毫无征兆,DNF手游今天突然宣布从各大安卓平台下架。 《地下城与勇士:起源》运营团队于6月19日发布声明,指出因合约到期,游戏将不再上架部分安卓平台的应用商店。然而,这一事件并非完全无迹可循。 早在2021年初,华为游…

崖山数据库一体机 | 高性能、高可靠、智能化运维的一站式数据库解决方案

国产软硬件融合难? 性能调优挑战重重? 兼容性问题频发? 软硬件单独购买TCO成本高? .... 面对数据管理的这些挑战 数据库一体机的出现 提供了全新的解决方案 就在刚结束的浪潮信息元脑中国行-广州站活动现场上,崖…

搭建预约咨询小程序,高效便捷新选择

一、预约咨询小程序是什么? 预约咨询小程序是一款适用于各种生活场景包括医疗、保洁、宠物护理、法律等方面的预约咨询类小程序。 二、这款小程序有什么亮点优势? 预约咨询小程序适用场景广泛,无论是心理咨询、法律咨询,还是宠物…