【问题标题】:how to get all dna encoding for peptide in c#如何在c#中获取所有编码肽的dna
【发布时间】:2014-11-13 00:52:47
【问题描述】:

嗨,我的头已经沸腾了 3 天了!我想获取肽的所有DNA编码:肽是氨基酸序列,即氨基酸M和氨基酸Q可以形成肽MQQM

DNA 编码意味着每个氨基酸都有一个 DNA 代码(称为密码子)(对于一些有多个代码,即氨基酸 T 有 4 个不同的代码/密码子)

以下代码中的最后一个函数不起作用,所以我希望有人让它为我工作,并且请不要查询集成语言(我忘记了它的首字母缩写词!)`

private  string[] CODONS ={ 
    "TTT", "TTC", "TTA", "TTG", "TCT",
    "TCC", "TCA", "TCG", "TAT", "TAC", "TGT", "TGC", "TGG", "CTT",
    "CTC", "CTA", "CTG", "CCT", "CCC", "CCA", "CCG", "CAT", "CAC",
    "CAA", "CAG", "CGT", "CGC", "CGA", "CGG", "ATT", "ATC", "ATA",
    "ATG", "ACT", "ACC", "ACA", "ACG", "AAT", "AAC", "AAA", "AAG",
    "AGT", "AGC", "AGA", "AGG", "GTT", "GTC", "GTA", "GTG", "GCT",
    "GCC", "GCA", "GCG", "GAT", "GAC", "GAA", "GAG", "GGT", "GGC",
    "GGA", "GGG", };

private  string[] AMINOS_PER_CODON = { 
    "F", "F", "L", "L", "S", "S",
    "S", "S", "Y", "Y", "C", "C", "W", "L", "L", "L", "L", "P", "P",
    "P", "P", "H", "H", "Q", "Q", "R", "R", "R", "R", "I", "I", "I",
    "M", "T", "T", "T", "T", "N", "N", "K", "K", "S", "S", "R", "R",
    "V", "V", "V", "V", "A", "A", "A", "A", "D", "D", "E", "E", "G",
    "G", "G", "G", };


public  string codonToAminoAcid(String codon)
{
    for (int k = 0; k < CODONS.Length; k++)
    {
        if (CODONS[k].Equals(codon))
        {
            return AMINOS_PER_CODON[k];
        }
    }

    // never reach here with valid codon
    return "X";
}

public  string AminoAcidToCodon(String aminoAcid)
{
    for (int k = 0; k < AMINOS_PER_CODON .Length; k++)
    {
        if (AMINOS_PER_CODON [k].Equals(aminoAcid ))
        {
            return CODONS[k];
        }
    }

    // never reach here with valid codon
    return "X";
}

public string GetCodonsforPeptide(string pep)
{
    string result = ""; 
    for (int i = 0; i <pep.Length ; i++)
    {
        result = AminoAcidToCodon(pep.Substring (i,1) );
        for (int q = 0; q < pep.Length; q++)
        {
            result += AminoAcidToCodon(pep.Substring(q, 1));
        }
    }

    return result;
}

【问题讨论】:

  • 你能举一个输入和期望输出的例子吗?顺便提一句。首字母缩略词是 LINQ。
  • 所以只是为了确保我理解你的意思。对于输入字符串中的每个字符,在 AMINOS_PER_CODON 表中可以有多个匹配条目。例如,对于给定的字符串,每个对应字符可能有这么多匹配:1、2、3、2。结果 number 的组合将是 1*2*3*2 = 12 . 然后,你想要这些组合中的每一个,你想将每个匹配从那个表翻译到另一个表,并得到结果字符串,是这样吗?
  • 例如,这个 pep,“TG”将有 4*4=16 个组合,其中两个是“ACTGGC”和“GTTGGG”(分别是第一个和最后一个)。我做对了吗?
  • 您是否考虑过使用字典进行氨基密码子查找?

标签: c# bioinformatics


【解决方案1】:

尝试使用以下两种方法:

public IEnumerable<string> AminoAcidToCodon(char aminoAcid)
{
    for (int k = 0; k < AMINOS_PER_CODON.Length; k++)
    {
        if (AMINOS_PER_CODON[k] == aminoAcid)
        {
            yield return CODONS[k];
        }
    }
}

public IEnumerable<string> GetCodonsforPeptide(string pep)
{
    if (string.IsNullOrEmpty(pep))
    {
        yield return string.Empty;
        yield break;
    }

    foreach (var codon in AminoAcidToCodon(pep[0]))
        foreach (var codonOfRest in GetCodonsforPeptide(pep.Substring(1)))
            yield return codon + codonOfRest;
}

注意事项:

  • 由于每个氨基酸都有多个匹配的密码子,因此当找到第一个时返回的方法将只匹配每个氨基酸一次。相反,我创建了一个枚举器方法,它将 yield return 每个匹配的密码子。
  • 最后一种方法查找肽段第一个字符的所有匹配密码子,并将每个此类密码子与第一个字符后肽段其余部分组成的所有密码子组合。
  • 我将AMINOS_PER_CODON 数组改为使用char 作为类型。如果需要,您可以轻松更改代码以使用您的字符串数组。
  • 没有两个单独数组的更好方法是创建一个字典,将每个氨基酸字符映射到密码子字符串列表。

传入"MA"时的示例输出:

ATGGCT 
ATGGCC 
ATGGCA 
ATGGCG 

这是因为M 映射到这些:

ATG

A 映射到这些:

GCT 
GCC 
GCA 
GCG

我建议您使用的字典如下所示:

var codonsByAminoAcid = new Dictionary<char, string[]>
{
    { 'M', new[] { "ATG" } },
    { 'A', new[] { "GCT", "GCC", "GCA", "GCG" } }
};

这将替换 AminoAcidToCodon 方法。

你甚至可以从你的两个数组中构建字典:

var lookup = 
    CODONS
    .Zip(AMINOS_PER_CODON, (codon, amino) => new { codon, amino })
    .GroupBy(entry => entry.amino)
    .ToDictionary(
        g => g.Key,
        g => g.Select(ge => ge.codon).ToArray());

GetCodonsforPeptide 方法可能如下所示:

public IEnumerable<string> GetCodonsforPeptide(string pep)
{
    if (string.IsNullOrEmpty(pep))
    {
        yield return string.Empty;
        yield break;
    }

    foreach (var codon in lookup(pep[0]))
        foreach (var codonOfRest in GetCodonsforPeptide(pep.Substring(1)))
            yield return codon + codonOfRest;
}

即。用查找表替换对其他方法的调用。

【讨论】:

    猜你喜欢
    • 2019-02-18
    • 1970-01-01
    • 2011-08-20
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2014-10-09
    相关资源
    最近更新 更多