如何在 C# 中获取所有编码肽的 DNA

本文关键字:编码 DNA 获取 | 更新日期: 2023-09-27 18:30:17

嗨,我的头现在沸腾了 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;
}

如何在 C# 中获取所有编码肽的 DNA

尝试使用以下两种方法:

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;
}

即,将对该其他方法的调用替换为查找表。