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

news2024/11/26 17:32:54

 

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.coloradmin.cn/o/551619.html

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

相关文章

Linux---文件操作命令(cp、mv、rm)

1. cp命令 cp命令可以用于复制文件\文件夹&#xff0c;cp命令来自英文单词&#xff1a;copy。 语法&#xff1a;cp [选项] 参数1 参数2 参数1&#xff1a;Linux路径&#xff0c;表示被复制的文件或文件夹 参数2&#xff1a;Linux路径&#xff0c;表示要复制去的地方 选…

《Java 核心技术面试》课程笔记(十一)

Java 提供了哪些 IO 方式&#xff1f; 典型回答 Java IO 基于不同的 IO 抽象模型和交互方式&#xff0c;可以分为&#xff1a; BIO&#xff0c;传统的 java.io 包&#xff0c;它基于流模型实现。 提供了我们最熟知的⼀些 IO 功能&#xff0c;比如 File 抽象、输入输出流等。交…

安装编译PostgreSql15.3.0

一、下载源码 方式一 官网手动下载 https://www.postgresql.org/download/. 解压 tar -zxvf postgresql-14.2.tar.gz方式二 git clone git clone https://github.com/postgres/postgres.git解压或下载后计入postgres目录 cd postgres-15.3二、创建目录 用root账户创建 创建…

[iOS开发]<多线程-NSOperation操作队列NSOperationQueue>

前言 寒假期间学习过GCD。今天学习NSOperation。同样都是多线程封装&#xff0c;NSOperation和NSOperationQueue是基于GCD的更高一层的封装&#xff0c;完全的面向对象&#xff0c;相比于GCD复杂的各种API方法&#xff0c;它的优势就是更加的简单实用&#xff0c;代码的可读性…

电力电子课设—数控产生PWM波——使用51单片机输出占空比可调PWM波(按钮控制、数码管显示)控制速成教程

我们学校电气专业开始做电力电子的课设了&#xff0c;小组选了一项制作硬件电路的任务&#xff0c;里面有要求采用数控方式实现DC-DC电压变换的输出电压调节&#xff0c;数控在电路中的体现就是用单片机输出可调占空比的PWM作用于产生PWM波控制IGBT的芯片。考虑到可能有同学没接…

金领冠520解密母乳源代码,助推婴配粉中国式现代化高速发展

又是一年520&#xff0c;又是一个“全国母乳喂养宣传日”。 1990年5月10日&#xff0c;为保护、促进和支持母乳喂养&#xff0c;更好地实行优生优育&#xff0c;原中华人民共和国国家卫生部召开新闻发布会&#xff0c;确立每年5月20日为“全国母乳喂养宣传日”。 那时&#x…

[GXYCTF2019]BabySQli1

拿到题目一看就是sql注入&#xff0c;所以还是老样子账号admin密码随便输入&#xff0c;回显但是密码错误 当用户名随便输入时&#xff0c;回显用户名错误&#xff0c;说明是先检测用户名&#xff0c;再检测密码 应该是存在过滤 通过burp爆破大致找出过滤字符&#xff0c;还有就…

css flex布局

css flex布局 flex是flexible Box的缩写&#xff0c;意为“弹性布局”&#xff0c;任何一个容器都可以指定为flex布局。 当我们为父盒子设为flex布局以后&#xff0c;子元素的float、clear和vertical-align属性将失效 总结flex布局原理&#xff1a; 就是通过给父盒子添加fl…

Java - AQS(一)

Java - AQS&#xff08;一&#xff09; 在Java中&#xff0c;AQS代表AbstractQueuedSynchronizer&#xff08;抽象队列同步器&#xff09;。AQS是Java并发包中用于构建同步器的基础框架。它提供了一种实现同步状态管理、线程等待和通知的机制。 AQS主要通过一个int类型的状态…

轻松玩转开源大语言模型bloom(四)

前言 前几篇都围绕着语言模型的decoding strategy来讲述&#xff0c;今天将进入进阶篇&#xff0c;在解码策略效果有限和提示词修改也无法满意的情况下如何提升模型的效果呢&#xff1f;这时我们需要对大语言模型进行fine-tune&#xff0c;即微调。一般我们用的大语言模型都是…

chatgpt赋能Python-python5个数从小到大排序

Python中的5个数从小到大排序 在Python中&#xff0c;排序是一个常见的操作。我们经常需要对一组数据进行排序&#xff0c;以便更方便地对数据进行分析和处理。在本文中&#xff0c;我们将探讨Python中如何排序5个数&#xff0c;具体来说&#xff0c;是从小到大排序。 介绍 …

chatgpt赋能Python-python5__3

Python5%-3: 介绍和结论 什么是Python5%-3 Python5%-3是在Python 3语言版本中增加的一个新特性&#xff0c;它是Python语言中对移动开发的支持扩展&#xff0c;这个特性被称为Python5%-3。 具体来说&#xff0c;Python5%-3允许开发者能够更方便地创建移动应用程序&#xff0…

大脑MRI去噪技术研究进展

导读 磁共振(MR)图像诊断的准确性取决于图像的质量&#xff0c;而图像质量下降的主要原因是由于噪声和伪影。噪声是由成像环境错误或传输系统失真所引起的。因此&#xff0c;去噪方法对提高图像质量起着重要作用。然而&#xff0c;在去噪和保留结构细节之间需要权衡。现有的大…

【Linux】Linux 下的权限(初)

d1 目录下有目录dir&#xff0c;和一个普通文件 test.c 重点看到文件的各种权限&#xff0c;拆分清晰地理解&#xff08;重&#xff09; 观察到权限和文件类型一坨除了第一列的文件类型其他的都是文件相关的权限&#xff0c;而且是三个三个分开 为什么分开呢&#xff1f;是因为…

【leetcode】456. 132 模式 单调栈出栈特性

看题意是要在数组中找到一个大于左右元素波峰。 一开始看数据量是 10e5&#xff0c;还以为是 nlogn算法。没想到居然是个 n 的单调栈。 这道题利用了递减单调栈出栈的特性, 出栈元素 k、栈中某一个特定元素 j 满足 nums[j] > nums[k]&#xff0c;如果从数组后面向前遍历的…

什么是uni-app?为什么要学习uni-app?

文章目录 前言 一、什么是uni-app框架&#xff1f; 二、为什么要学&#xff1f; 三、uni-app开发的适用场景是什么&#xff1f; 总结 前言 随着前端技术的不断发展进步&#xff0c;跨端开发成为了程序猿不得不面临的一个难题&#xff0c;uni-app的出现解决了程序猿不断重复…

《Java 核心技术面试》课程笔记(十)

如何保证集合是线程安全的? 典型回答 Java 提供了不同层⾯的线程安全支持。 在传统集合框架内部&#xff0c;除了 Hashtable 等同步容器&#xff0c;还提供了所谓的同步包装器&#xff08;Synchronized Wrapper&#xff09;&#xff0c;我们可以调用 Collections 工具类提供…

16款ChatGPT工具,太炸裂了,收藏!

1.ChatGPT for google 一个浏览器插件&#xff0c;可搭配现有的搜索引擎来使用。 最大化搜索效率&#xff0c;对搜索体验的提升相当离谱&#xff1a; 安装完插件后&#xff0c;在搜索引擎搜索任何问题&#xff0c;都能获取两份答案。 左边是谷歌抓取的全网资源&#xff0c;右…

完美解决:“因为计算机丢失VCRUNTIME140_1.dll”

VCRUNTIME140_1.dll是Microsoft Visual C Redistributable的一个组件&#xff0c;它包含了许多用于C编程的函数和类。如果你的系统缺少了这个文件&#xff0c;那么你可能会遇到“找不到VCRUNTIME140_1.dll无法继续执行代码”的错误提示。 方法1&#xff1a;直接复制VCRUNTIME…

python多进程与多线程

1 Python多线程 1.1 GIL 其他语言&#xff0c;CPU是多核时是支持多个线程同时执行。但在Python中&#xff0c;无论是单核还是多核&#xff0c;同时只能由一个线程在执行。其根源是GIL的存在。GIL的全称是Global Interpreter Lock(全局解释器锁)&#xff0c;来源是Python设计之…