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

问题描述 投票:0回答:1

我想获得肽的所有DNA编码:肽是氨基酸序列,即氨基酸

M
和氨基酸
Q
可以形成肽
MQ
QM

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# bioinformatics
1个回答
2
投票

尝试使用以下两种方法:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.