C#,生信软件实践(04)——DNA数据库EMBL格式文件的解释器之完整源代码

news/2025/1/31 0:59:55/

 

EMBL文件的格式详解请阅读前面的文章:

C#,生信软件实践(02)——DNA数据库EMBL格式详解及转为FASTA格式文件的源代码icon-default.png?t=N4HBhttps://blog.csdn.net/beijinghorn/article/details/130462070

本文的代码用于:

(1)解释 EMBL 文件并转为 C# 的类;

(2)可提取 FASTA 序列数据;

(3)可提取 FEATURES 数据;

(4)是生信工具软件 BIOG 的一部分代码;

using System;
using System.IO;
using System.Text;
using System.Linq;
using System.Drawing;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace Legal.BIOG
{
    [DataContract]
    public class EMBL_ELEMENT
    {
        [DataMember(Order = 1)]
        public string Name { get; set; } = "";
        [DataMember(Order = 2)]
        public string Content { get; set; } = "";

        public EMBL_ELEMENT(string buf)
        {
            Name = buf.Substring(0, 2);
            Content = buf.Substring(2).Trim();
        }

        public EMBL_ELEMENT(string name, string content)
        {
            Name = name;
            Content = content;
        }
    }

    [DataContract]
    public class EMBL_REFERENCE
    {
        [DataMember(Order = 1)]
        public List<EMBL_ELEMENT> Items { get; set; } = new List<EMBL_ELEMENT>();
        public void Append(string name, string content)
        {
            Items.Add(new EMBL_ELEMENT(name, content));
        }
    }

    [DataContract]
    public class EMBL_FEATURE
    {
        [DataMember(Order = 1)]
        public string Name { get; set; } = "";
        [DataMember(Order = 2)]
        public string Lines { get; set; } = "";

        public EMBL_FEATURE(string name, string lines)
        {
            Name = name;
            Lines = lines;
        }

        public List<string> FeatureList
        {
            get
            {
                string[] ra = B.S2L(Lines);
                return ra.ToList();
            }
        }

        /// <summary>
        /// 搜索 FEATURE 项目
        /// 比如:/db_xref=
        /// </summary>
        /// <param name="name">db_xref</param>
        /// <param name="branch">db_xref</param>
        /// <returns></returns>
        public string FindBranch(string name, string branch)
        {
            List<string> list = FeatureList;
            if (Name == name)
            {
                foreach (string s in list)
                {
                    if (s.StartsWith("/" + branch + "="))
                    {
                        return s.Substring(branch.Length + 2);
                    }
                }
            }
            return "";
        }

        public string Position
        {
            get
            {
                List<string> list = FeatureList;
                return (list[0].Contains("..")) ? list[0] : "";
            }
        }

        public List<Point> PositionList
        {
            get
            {
                return Utility.PositionList(Position);
            }
        }
    }

    [DataContract]
    public class EMBL_Item
    {
        [DataMember(Order = 1)]
        public List<EMBL_ELEMENT> Descriptions { get; set; } = new List<EMBL_ELEMENT>();
        [DataMember(Order = 2)]
        public List<EMBL_REFERENCE> References { get; set; } = new List<EMBL_REFERENCE>();
        [DataMember(Order = 3)]
        public List<EMBL_FEATURE> Features { get; set; } = new List<EMBL_FEATURE>();

        public string Find(string name)
        {
            EMBL_ELEMENT de = Descriptions.Find(t => t.Name == name);
            return (de.Name == name) ? de.Content.Replace("\n", " ") : "";
        }

        /// <summary>
        /// 提取 FASTA 序列信息
        /// </summary>
        public string Sequence
        {
            get
            {
                EMBL_ELEMENT sq = Descriptions.Find(t => t.Name == "SQ");
                return (sq.Name == "SQ") ? (sq.Content) : "";
            }
        }
    }

    public class EMBL_File
    {
        public List<EMBL_Item> Items { get; set; } = new List<EMBL_Item>();

        public EMBL_File(string buf)
        {
            try
            {
                string[] xlines = B.S2L(buf);
                EMBL_Item item = null;
                EMBL_REFERENCE rfx = null;
                for (int i = 0; i < xlines.Length; i++)
                {
                    if (xlines[i].StartsWith("ID"))
                    {
                        if (item != null) { Items.Add(item); item = null; }
                        item = new EMBL_Item();
                        item.Descriptions.Add(new EMBL_ELEMENT(xlines[i]));
                        continue;
                    }
                    else if (xlines[i].StartsWith("FH") || xlines[i].StartsWith("FT"))
                    {
                        string rs = Utility.ReadFeatureLines(ref i, xlines, out string kw, 2, 21);
                        EMBL_FEATURE ef = new EMBL_FEATURE(kw, rs);
                        item.Features.Add(ef);
                        continue;
                    }
                    else if (xlines[i].StartsWith("XX"))
                    {
                        if (rfx != null) { item.References.Add(rfx); rfx = null; }
                        continue;
                    }
                    else if (xlines[i].StartsWith("//"))
                    {
                        if (item != null) { Items.Add(item); item = null; }
                        continue;
                    }
                    else if (xlines[i].StartsWith("RN") ||
                        xlines[i].StartsWith("RP") ||
                        xlines[i].StartsWith("RA") ||
                        xlines[i].StartsWith("RT") ||
                        xlines[i].StartsWith("RL")
                        )
                    {
                        if (xlines[i].StartsWith("RN"))
                        {
                            if (rfx != null) { item.References.Add(rfx); }
                            rfx = new EMBL_REFERENCE();
                        }
                        string rs = Utility.ReadMultiLines(ref i, xlines, out string kw, 5);
                        rfx.Append(kw, rs);
                        continue;
                    }
                    else if (xlines[i].StartsWith("SQ"))
                    {
                        i++;
                        string rs = Utility.ReadSequenceLines(ref i, xlines, 5);
                        item.Descriptions.Add(new EMBL_ELEMENT("SQ", rs));
                        continue;
                    }
                    else
                    {
                        string rs = Utility.ReadMultiLines(ref i, xlines, out string kw, 5, "\n");
                        item.Descriptions.Add(new EMBL_ELEMENT(kw, rs));
                        continue;
                    }
                }
                if (item != null)
                {
                    Items.Add(item);
                }
            }
            catch (Exception ex)
            {
                throw new Exception("EMBL_File() ERROR: " + ex.Message);
            }
        }

        public static EMBL_File FromFile(string filename)
        {
            try
            {
                string buf = File.ReadAllText(filename);
                return new EMBL_File(buf);
            }
            catch (Exception ex)
            {
                throw new Exception("EMBL_File() ERROR: " + ex.Message);
            }
        }

        public void Write_Json(string filename)
        {
            try
            {
                File.WriteAllText(filename, SimpleJson.SerializeObject(Items));
            }
            catch (Exception ex)
            {
                throw new Exception("EMBL_File.Write_Json ERROR: " + ex.Message);
            }
        }

        /// <summary>
        /// 提取 FASTA 序列信息
        /// </summary>
        /// <returns></returns>
        public string Fasta_Sequences()
        {
            StringBuilder sb = new StringBuilder();
            foreach (EMBL_Item item in Items)
            {
                sb.AppendLine(">" + item.Find("DE"));
                sb.AppendLine(B.BreakTo(item.Sequence));
                sb.AppendLine("");
            }
            return sb.ToString();
        }

        /// <summary>
        /// 输出一些属性数据
        /// source: db_xref, mRNA: gene, CDS: codon_start
        /// </summary>
        /// <returns></returns>
        public string Print_Features()
        {
            StringBuilder sb = new StringBuilder();
            foreach (EMBL_Item item in Items)
            {
                // 提取指定的一些属性条目
                foreach (EMBL_FEATURE feature in item.Features)
                {
                    if (feature.FeatureList.Count > 1)
                    {
                        sb.AppendLine(">" + feature.Name + " " + feature.FeatureList[1]);
                        sb.AppendLine(B.BreakTo(Utility.SequenceByPosition(item.Sequence, feature.PositionList)));
                        sb.AppendLine("");
                    }
                }
            }
            return sb.ToString();
        }

        /// <summary>
        /// 提取属性中的 translation 为蛋白质序列
        /// </summary>
        /// <returns></returns>
        public string Protein()
        {
            StringBuilder sb = new StringBuilder();
            foreach (EMBL_Item item in Items)
            {
                foreach (EMBL_FEATURE feature in item.Features)
                {
                    string tr = feature.FindBranch("CDS", "translation");
                    if (tr.Length > 0)
                    {
                        sb.AppendLine(">" + feature.Name + " " + feature.FeatureList[1]);
                        sb.AppendLine(B.BreakTo(tr.Replace(" ", "").Replace("\"", "")));
                        sb.AppendLine("");
                    }
                }
            }
            return sb.ToString();
        }
    }
}
 

以这样的格式发布代码是一种新尝试,或许可避开内容太少。


http://www.ppmy.cn/news/78323.html

相关文章

Niagara—— Events and Event Handlers

目录 一&#xff0c;Events 二&#xff0c;Event Handlers 多数情况下&#xff0c;系统中的发射器需相互交互&#xff0c;才能创建所需效果&#xff1b;意味着&#xff0c;一发射器生成数据&#xff0c;另一发射器监听该数据&#xff0c;以执行相应行为&#xff1b;在Niagar…

【数据结构】---堆排序+TOP-K问题(了解游戏排行底层原理)

文章目录 前言&#x1f31f;一、建堆的两种方式&#xff1a;&#x1f30f;1.1 向上调整建堆(堆排序)&#xff1a;&#x1f4ab;1.1.1 完整代码&#xff1a;&#x1f4ab;1.1.2 流程图(以小堆为例)&#xff1a;升序&#xff1a;建大堆&#x1f4ab;1.1.3 流程图(以小堆为例)&…

acwing提高--DFS之剪枝与优化

剪枝与优化的方法 1.优化搜索顺序 大部分情况下&#xff0c;我们应该优先搜索分支较少的节点 2.排除等效冗余 3.可行性剪枝 4.最优性剪枝 5.记忆化搜索&#xff08;DP&#xff09; 1.小猫爬山 题目https://www.acwing.com/problem/content/description/167/ 1.优化搜索顺…

VIsual Studio内引用Lua解释器,编译Lua源码,执行Lua脚本

前言 本篇在讲什么 在Visual Studio中引入lua的解释器 使用C调用Lua文件 本篇适合什么 适合初学Lua的小白 适合需要C/C和lua结合开发的人 本篇需要什么 对Lua语法有简单认知 对C/C语法有简单认知 依赖Lua5.1的环境 依赖VS 2017编辑器 本篇的特色 具有全流程的图文…

2023.5.12解决Ubuntu中ens33没有ip

在Ubtuntu中的ens33没有ip 如果Ubuntu版本过高 sudo netplan apply如果是Ubuntu 16.04及更早版本 sudo vi /etc/systemd/resolved.conf具体情况如下图所示 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopbac…

忆享聚焦|ChatGPT、AI、网络数字、游戏……近期热点资讯一览

“忆享聚焦”栏目第十四期来啦&#xff01;本栏目汇集近期互联网最新资讯&#xff0c;聚焦前沿科技&#xff0c;关注行业发展动态&#xff0c;筛选高质量讯息&#xff0c;拓宽用户视野&#xff0c;让您以最低的时间成本获取最有价值的行业资讯。 目录 行业资讯 1.科技部部长王志…

RabbitMQ之死信队列

1 概念 ​ 死信&#xff0c;就是无法被消费的消息。 ​ 一般来说&#xff0c;producer将消息投递到broker或者直接到queue里了&#xff0c;consumer从queue取出消息进行消费&#xff0c;但某些时候由于特定的原因导致queue中的某些消息无法被消费&#xff0c;如果没有后续的处…

定了 香港新政6月1日生效 散户交易加密货币正式合法化!

如今&#xff0c;香港虚拟资产交易的各项准备工作已准备就绪。5月23日&#xff0c;香港证监会&#xff08;SFC&#xff09;详细介绍了各界参与虚拟资产交易的咨询总结文件&#xff0c;宣布《适用于虚拟资产交易平台营运者的指引》将于2023年6月1日生效。 SFC行政总裁梁凤仪表示…