003生信人必练

  1. gtf 文件

    序列的编号 注释信息的来源 注释信息的类型 开始与结束的位置  得分  序列的方向  起始编码的位置,仅对CDS有效  注释信息描述    
    11 ensembl_havana gene 5422111 5423206   ”.”表示为空。  +表示正义链, -反义链 , ? 表示未知.  有效值为0、1、2  键+值    

    11      ensembl_havana  gene    5422111 5423206 .       +       .       gene_id "ENSG00000167360"; gene_version "4"; gene_name "OR51Q1"; gene_source "ensembl_havana"; gene_biotype "protein_coding";
    11      ensembl_havana  transcript      5422111 5423206 .       +       .       gene_id "ENSG00000167360"; gene_version "4"; transcript_id "ENST00000300778"; transcript_version "4"; gene_name "OR51Q1"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "OR51Q1-001"; transcript_source "ensembl_havana"; transcript_biotype "protein_coding"; tag "CCDS"; ccds_id "CCDS31381";
    11      ensembl_havana  exon    5422111 5423206 .       +       .       gene_id "ENSG00000167360"; gene_version "4"; transcript_id "ENST00000300778"; transcript_version "4"; exon_number "1"; gene_name "OR51Q1"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "OR51Q1-001"; transcript_source "ensembl_havana"; transcript_biotype "protein_coding"; tag "CCDS"; ccds_id "CCDS31381"; exon_id "ENSE00001276439"; exon_version "4";
    11      ensembl_havana  CDS     5422201 5423151 .       +       0       gene_id "ENSG00000167360"; gene_version "4"; transcript_id "ENST00000300778"; transcript_version "4"; exon_number "1"; gene_name "OR51Q1"; gene_source "ensembl_havana"; gene_biotype "protein_coding"; transcript_name "OR51Q1-001"; transcript_source "ensembl_havana"; transcript_biotype "protein_coding"; tag "CCDS"; ccds_id "CCDS31381"; protein_id "ENSP00000300778"; protein_version "4";

  2. 探究内容

  3. import sys
    import re
    
    args = sys.argv
    ‘‘‘sys.argv 是命令行参数,是一个字符串列表,0代表其路径‘‘‘
    
    class Genome_info:      #这是一个基类,所有类型都通用的
        def __init__(self):
            self.chr = ""   #染色体号
            self.start = 0
            self.end = 0
    
    class Gene(Genome_info):   #这个函数继承了基类
        def __init__(self):
            Genome_info.__init__(self)
            self.orientation = ""
            self.id = ""
    
    class Transcript(Genome_info):
        def __init__(self):
            Genome_info.__init__(self)
            self.id = ""
            self.parent = ""
    
    class Exon(Genome_info):
        def __init__(self):
            Genome_info.__init__(self)
            self.parent = ""
    
    def main(args):
        """
        一个输入参数:
        第一个参数为物种gtf文件
    
        :return:
        """
    
        list_chr = []
        list_gene = {}   #因为有 id 号 所以用dir
        list_transcript = {}
        list_exon = []
        # l_n = 0
        with open(args[1]) as fp_gtf:        #打开文件遍历GTF
            for line in fp_gtf:
                if line.startswith("#"):      #号开头的注释过滤掉,不统计这个
                    continue
                # print ("in %s" % l_n)
                # l_n += 1
                lines = line.strip("\n").split("\t")
                chr = lines[0]
                type = lines[2]
                start = int(lines[3])
                end = int(lines[4])
                orientation = lines[6]
                attr = lines[8]
                if not re.search(r‘protein_coding‘, attr):   #取到的是蛋白的编码,如果没有的话就跳过,不做统计了
                    continue
    
                if not chr in list_chr:    #把染色体的类型添加到列表里
                    list_chr.append(chr)
    
                if type == "gene":
                    gene = Gene()          #初始化一个基因对象
                    id = re.search(r‘gene_id "([^;]+)";?‘, attr).group(1)  # 0 返回所有列表,1取第一个
                    gene.chr = chr
                    gene.start = start
                    gene.end = end
                    gene.id = id
                    gene.orientation = orientation
                    list_gene[id] = gene
                    # print(id)
                elif type == "transcript":
                    transcript = Transcript()
                    id = re.search(r‘transcript_id "([^;]+)";?‘, attr).group(1)
                    parent = re.search(r‘gene_id "([^;]+)";?‘, attr).group(1)
                    if not parent in list_gene:
                        continue
                    transcript.chr = chr
                    transcript.start = start
                    transcript.end = end
                    transcript.id = id
                    transcript.parent = parent
                    list_transcript[id] = transcript
    
                elif type == "exon":
                    exon = Exon()
                    parent = re.search(r‘transcript_id "([^;]+)";?‘, attr).group(1)
                    if not parent in list_transcript:
                        continue
                    exon.chr = chr
                    exon.start = start
                    exon.end = end
                    exon.parent = parent
                    list_exon.append(exon)
    
        chr_gene(list_gene)
        gene_len(list_gene)
        gene_transcript(list_transcript)
        transcript_exon(list_exon)
        exon_pos(list_exon)
    
    def chr_gene(list_gene):
        """
        染色体上基因数量分布
    
        :param list_gene:
        :return:
        """
    
        print("染色体上基因数量分布")
        count_gene = {}     #这是一个计数器
        for info in list_gene.values():
            chr = info.chr
            if chr in count_gene:
                count_gene[info.chr] += 1
            else:
                count_gene[info.chr] = 1
        with open("chr_gene.txt", ‘w‘) as fp_out:
            for chr, num in count_gene.items():
                print("\t".join([chr, str(num)]) + "\n")
                fp_out.write("\t".join([chr, str(num)]) + "\n")
    
    def gene_len(list_gene):
        """
        基因长度分布情况
    
        :param list_gene:
        :return:
        """
    
        print("基因长度分布情况")
        with open("gene_len.txt", ‘w‘) as fp_out:
            for gene_id, info in list_gene.items():
                len = info.end - info.start + 1
                fp_out.write("\t".join([gene_id, str(len)]) + "\n")
                print("\t".join([gene_id, str(len)]) + "\n")
    
    def gene_transcript(list_transcript):
        """
        基因的转录本数量分布
    
        :param list_transcript:
        :return:
        """
    
        print("基因的转录本数量分布")
        count_transcript = {}
        for info in list_transcript.values():
            gene_id = info.parent
            if gene_id in count_transcript:
                count_transcript[gene_id] += 1
            else:
                count_transcript[gene_id] = 1
        with open("gene_transcript.txt", ‘w‘) as fp_out:
            for gene_id, num in count_transcript.items():
                print("\t".join([gene_id, str(num)]) + "\n")
                fp_out.write("\t".join([gene_id, str(num)]) + "\n")
    
    def transcript_exon(list_exon):
        """
        转录本的外显子数量统计
    
        :param list_exon:
        :return:
        """
    
        print("转录本的外显子数量统计")
        count_exon = {}
        for exon in list_exon:
            transcript_id = exon.parent
            if transcript_id in count_exon:
                count_exon[transcript_id] += 1
            else:
                count_exon[transcript_id] = 1
        with open("transcript_exon.txt", ‘w‘) as fp_out:
            for transcript_id, num in count_exon.items():
                print("\t".join([transcript_id, str(num)]) + "\n")
                fp_out.write("\t".join([transcript_id, str(num)]) + "\n")
    
    def exon_pos(list_exon):
        """
        外显子坐标统计
    
        :param list_exon:
        :return:
        """
    
        print("外显子坐标统计")
        count_exon = {}
        for exon in list_exon:
            transcript_id = exon.parent
            if transcript_id in count_exon:
                count_exon[transcript_id] += ",%s-%s" % (str(exon.start), str(exon.end))
            else:
                count_exon[transcript_id] = "%s-%s" % (str(exon.start), str(exon.end))
        with open("exon_pos.txt", ‘w‘) as fp_out:
            for transcript_id, pos in count_exon.items():
                print("\t".join([transcript_id, pos]) + "\n")
                fp_out.write("\t".join([transcript_id, pos]) + "\n")
    
    def gene_exon_pos(list_gene, list_transcript, list_exon):
        """
        根据exon的parent将所有exon对应到transcript
        根据transcript的parent将所有transcript对应到gene
        根据gene按chr分组得到chromosome列表
    
        从chromosome中输出某个指定基因的所有外显子坐标信息并画图
        生信编程直播第五题
    
        :param list_gene:
        :param list_transcript:
        :param list_exon:
        :return:
        """
        pass
    
    if __name__ == "__main__":
        main(args)
    

      

时间: 2024-10-12 16:24:03

003生信人必练的相关文章

it人必进的几大网站

1.chinaunix网址:http://www.chinaunix.net/简介:中国最大的linux/unix技术社区. 2.itpub网址:http://www.itpub.net/ 简介:有名气的IT技术论坛,看看它的alexa排名就知道有多火了,尤其以数据库技术讨论热烈而闻名.ITPUB论坛的前身是建立在smiling的oracle小组. 3.51cto网址:http://www.51cto.com/简介:由国内知名IT门户网站管理团队,获近千万风险投资,于2005年8月正式创立,是国

《生物信息学》——李霞;;生信概念

挑战:寻找新的处理海量数据和复杂性的方法. 生信:说了什么: 研究对象:       以核酸.蛋白质等生物大分子数据库 研究手段方法:数学.信息学.计算机科学 研究工具:       计算机硬件.软件.计算机网络 研究目的:       对浩如烟海的原始数据进行获取.加工.存储.分配.分析.管理.注释解释,使之成为具有明确生物意义的生物信息. 并通过生物信息的查询.搜索.比较.分析,从中获取基因编码.基因调控.核酸和pro结构功能及其相互关系等理性知识. 在大量信息和知识的基础上探索生命起源.生

10部金融人必看电影!拯救春节剧荒的你

<监守自盗> 豆瓣评分:8.7 这部电影获得了2010年奥斯卡最佳纪录片奖. 采访政治家.记者和金融行业领袖后,导演查尔斯还原了美国金融改革的历史场景.通过对2008年美国金融危机中具体人物和事件的再现,犀利地解释了危机产生的原因. 电影的结构很巧妙,通过深入浅出的演绎,一些晦涩的经济专业术语也变得通俗易懂. <华尔街> 豆瓣评分:8.4 美国有一条大名鼎鼎的华尔街,是世界金融中心.电影<华尔街>,就取材于华尔街上那些翻雨覆雨尔虞我诈的故事.从这部电影中,你会学到很多股

一 些 小 常 识, 新 人 必 看!!!

< 本 服 是 长 久 服 ,注意:游戏内骗子,群内骗子,很多.不要贪图小便宜,就不会吃大亏! > 倍率说明: 10级转生1.1倍. 升级奖励1.4倍. 8件.30星1.5倍. 满攻击倍率: 勋章1.4倍是<暗藏属性>购买 装备右下角宝石分别为:1.1-1.2-1.3.   比如你攻击2000.带个诛天帝1.3=2600,攻击越高,加成越高! 土城左下角,天工防御.1.1-1.7暗刀(必备!)打怪不怎么掉血! 1.土城左下角,装备升级-星际锻造 装备升星小技巧: 比喻-如果10星装

生信算法实践

最近在搞16S,发现了一个实践算法的最佳机会. 见文章: A Bayesian taxonomic classification method for 16S rRNA gene sequences with improved species-level accuracy. 文章利用了贝叶斯模型,调用了blast和muscle来对OTU进行taxonomy assignment. 可以看一下源代码,非常简单. Bayesian-based LCA taxonomic classification

生信概念之

1.contig:A contig (from contiguous) is a set of overlapping DNA segments that together represent a consensus region of DNA 从reads拼接出来的更长的序列. 2.k-mer:k-mers refer to all the possible subsequences (of length k) from a read obtained through DNA Sequenci

生信工具汇总

                                            GATK(Genome Analysis Toolkit) GATK使用方法详解(原始数据的处理) GATK使用方法详解(变异检测) GATK使用方法详解(初步分析) GATK使用方法详解

通信人必知的一些事

前言 作为一个学通信工程专业的学生,同时又从事通信领域的职业,我想有些知识,或者常识是必须要了解的,甚至是必须时刻牢记的,因为这些知识在平常的工作中经常被提起,也经常需要用到,这时,如果你对这些不熟悉,不了解,那样,你会觉得很痛苦,很恨自己明明上学的时候有学过,而且还那么耳熟,可就是不知道了...这个时候,你就会特别想了解,想弄懂,弄明白...这些就是我刚从学校毕业,工作三个月的真实想法. 本篇文章就是为了自己在工作中能够更加深入,决定将一些经常遇到的知识回顾一下,并将不断更新,欢迎有经验的大牛

生信常用网站

一 在线分析 GeneMania Phenolyzer NCBI http://www.ncbi.nlm.nih.gov EBI http://www.ebi.ac.uk/ UCSC https://genome.ucsc.edu/index.html Ensemble http://asia.ensembl.org/index.html 二 数据库 HGMD ExAC ACMG 有害性分类 ClinVar 临床数据库 dbSNP https://www.ncbi.nlm.nih.gov/pro