我想获得肽的所有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;
}
尝试使用以下两种方法:
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;
}
即。通过查找表替换对其他方法的调用。