65.9K
CodeProject 正在变化。 阅读更多。
Home

AzharDNA 新生物信息学程序 (DNA 翻译)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.21/5 (7投票s)

2014年3月4日

CPOL

2分钟阅读

viewsIcon

28895

downloadIcon

560

DNA 翻译的基本工具

引言

分子生物学遗传学中,翻译蛋白质生物合成的第三个阶段(是基因表达的整体过程的一部分)。在翻译过程中,通过转录产生的信使 RNA (mRNA)核糖体解码,从而产生特定的氨基酸链,或多肽,然后它将折叠成一个活性蛋白质。在细菌中,翻译发生在细胞的细胞质中,在那里核糖体的大亚基和小亚基位于,并与 mRNA 结合。在真核生物中,翻译发生在内质网的膜上,这个过程被称为定向合成核糖体通过诱导tRNA与 mRNA 的互补反密码子序列结合,从而促进解码。tRNA 携带特定的氨基酸,这些氨基酸被连接成多肽,因为 mRNA 通过核糖体并被核糖体“读取”,这个方式类似于股票行情收录机和行情纸带

背景

每个氨基酸由三联体核苷酸密码编码,例如 M(甲硫氨酸)由 (atg) 三联体密码编码,并且有 64 种组合编码 21 种氨基酸。

翻译方法

这种方法负责将 DNA 切割成多个三联体密码,每个三联体密码由三个核苷酸组成,然后代码会询问数据库中由这个特定三联体密码编码的氨基酸,我们必须知道一个氨基酸有很多三联体密码,但每个三联体密码只有一个氨基酸,该方法需要序列和数据库连接,它会返回一系列氨基酸。

public static string Translate(string seq, SqlConnection DnaPro)
{
    string Translation = "";
    using (SqlConnection cn = new SqlConnection(DnaPro.ConnectionString))
    {
        cn.Open();

        for (int x = 0; x < seq.Length / 3; x++)
        {
            int g = x * 3;
            string h = seq.Substring(g, 3);
            string cm = "select aminoacid from dnapro where dna='" + h + "'";
            SqlCommand cmd = new SqlCommand(cm, cn);
            Translation += cmd.ExecuteScalar();
        }

        return (string)Translation;
    }
}

序列框架和翻译的可能性

如果序列中的第一个核苷酸不是翻译中的第一个核苷酸怎么办?如果前两个核苷酸没有整合到翻译过程中会怎么样?这将使序列有三种翻译可能性,总而言之,如果翻译过程从相反的方向开始会怎么样?这将留下另外三种可能性(框架),这意味着主序列有六个框架(可能性)将进入翻译过程。

//One DIRECTION
 string frame1 = Translation.Translate(seq, DNAPro.Connection);
 string frame2 = Translation.Translate(seq.Substring(1), DNAPro.Connection);
 string frame3 = Translation.Translate(seq.Substring(2), DNAPro.Connection);
 //Opposite DIRECTION
 string Revseq = Main_Operations.Reversion(seq);
 string frame4 = Translation.Translate(Revseq, DNAPro.Connection);
 string frame5 = Translation.Translate(Revseq.Substring(1), DNAPro.Connection);
 string frame6 = Translation.Translate(Revseq.Substring(2), DNAPro.Connection);

在窗体上绘制结果

首先定义每个框架将在图片框上绘制的位置或其位置

Translation.Frame1_Pos = 100;
Translation.Frame2_Pos = 110;
Translation.Frame3_Pos = 120;
Translation.Frame4_Pos = 155;
Translation.Frame5_Pos = 165;
Translation.Frame6_Pos = 175;

然后我们将计算将在此图像中的序列,因为每个图像必须包含 50 个核苷酸。

double images = Main_Operations.How_Many_Images(seq); 

在循环中

for (int image_No = 0; image_No < images; image_No++)
{
    //creating Bitmap image with specific dimensions 
    Image image = new Bitmap(500, 200);
    Graphics pic = Graphics.FromImage(image);
    //painting the reverse sequence
    string RevSeq = Main_Operations.Reversion(seq);
    Main_Operations.draw_Seq_On_Image(seq, image_No, pic, 85);
    Main_Operations.draw_Seq_On_Image(Revseq, image_No, pic, 145);
    Main_Operations.draw_SeqCount_On_Image(seq, Revseq, image_No, pic);
    //painting frames
    Translation.Draw_Trans_Result_Image(seq, Revseq, image_No, pic, 
                frame1, frame2, frame3, frame4, frame5, frame6, 70);
    //Processes
    //to paint the images at specific positions on form
    Draw_Box_With_This_Image(image_No, image);
}

public void Draw_Box_With_This_Image(int im, Image image)
{
    PictureBox p = new PictureBox();
    p.Location = new Point(0, im * 200);
    p.Image = image;
    p.Size = image.Size;
    Controls.Add(p);
}

这是将框架绘制在图像上的方法

public static void Draw_Trans_Result_Image(string seq, string Revseq, 
   int image_No, System.Drawing.Graphics pic, string frame1, 
   string frame2, string frame3, string frame4, string frame5, 
   string frame6, int level)
{
    //painting Of the sequence of DNA Nu which are exists in this image.
    string subframe1 = "";
    string subframe2 = "";
    string subframe3 = "";
    string subframe4 = "";
    string subframe5 = "";
    string subframe6 = "";
    double MyNumber = Main_Operations.How_Many_Images(seq)-1;
    if (image_No < MyNumber )
    {
        subframe1 = frame1.Substring(image_No * 16 + image_No / 2, 16);
        subframe2 = frame2.Substring(image_No * 16 + image_No / 2, 16);
        subframe3 = frame3.Substring(image_No * 16 + image_No / 2, 16);
        subframe4 = frame4.Substring(image_No * 16 + image_No / 2, 16);
        subframe5 = frame5.Substring(image_No * 16 + image_No / 2, 16);
        subframe6 = frame6.Substring(image_No * 16 + image_No / 2, 16);
    }
    else
    {
        subframe1 = frame1.Substring(frame1.Length - frame1.Length % 16 + image_No / 2);
        subframe2 = frame2.Substring(frame2.Length - frame2.Length % 16 + image_No / 2);
        subframe3 = frame3.Substring(frame3.Length - frame3.Length % 16 + image_No / 2);
        subframe4 = frame4.Substring(frame4.Length - frame4.Length % 16 + image_No / 2);
        subframe5 = frame5.Substring(frame5.Length - frame5.Length % 16 + image_No / 2);
        subframe6 = frame6.Substring(frame6.Length - frame6.Length % 16 + image_No / 2);
    }

    for (int t = 0; t < seq.Length; t++)
    {
        if (t == 2 || (t - 2) % 3 == 0)
        {
            if (subframe1.Length > (t - 2) / 3)
                pic.DrawString(subframe1[(t - 2) / 3].ToString(), 
                  new Font("italic", 8, FontStyle.Bold), 
                  Brushes.DarkOrange, new PointF(t * 8 + 15, Frame1_Pos));
            if (subframe2.Length > (t - 2) / 3)
                pic.DrawString(subframe2[(t - 2) / 3].ToString(), 
                  new Font("italic", 8, FontStyle.Bold), 
                  Brushes.Purple, new PointF(t * 8 + 8 + 15, Frame2_Pos));
            if (subframe3.Length > (t - 2) / 3)
                pic.DrawString(subframe3[(t - 2) / 3].ToString(), 
                  new Font("italic", 8, FontStyle.Bold), 
                  Brushes.Blue, new PointF(t * 8 + 15 + 15, Frame3_Pos));
            if (subframe4.Length > (t - 2) / 3)
                pic.DrawString(subframe4[(t - 2) / 3].ToString(), 
                  new Font("italic", 8, FontStyle.Bold), 
                  Brushes.Red, new PointF(t * 8 + 15, Frame4_Pos));
            if (subframe5.Length > (t - 2) / 3)
                pic.DrawString(subframe5[(t - 2) / 3].ToString(), 
                  new Font("italic", 8, FontStyle.Bold), 
                  Brushes.Green, new PointF(t * 8 + 8 + 15, Frame5_Pos));
            if (subframe6.Length > (t - 2) / 3)
                pic.DrawString(subframe6[(t - 2) / 3].ToString(), 
                  new Font("italic", 8, FontStyle.Bold), 
                  Brushes.Brown, new PointF(t * 8 + 15 + 15, Frame6_Pos));
        }
    }
}

注意

我知道当我使用 PictureBox 来显示翻译结果时很烦人,我真的很想在 RichTextBox 上绘制结果,如果有人可以帮助我使用这种方法,将会非常有帮助。 我很抱歉我的代码不够专业,但我能做的比我不能做的更好。

历史

此代码与 AzharDNA 新生物信息学程序(DNA 翻译的基本工具)相关。

© . All rights reserved.