2014-11-12 6 views
5

Cześć, moja głowa gotuje się teraz przez 3 dni! I chce się wszystkie kodowania DNA dla peptydu, peptyd ma sekwencję aminokwasów, to znaczy aminokwasu M i aminokwasu Q może stanowić peptyd MQ lub QMjak uzyskać wszystkie kodowanie DNA dla peptydu w C#

DNA kodujący oznacza, że ​​kod DNA (ang kodon) dla każdy aminokwas (dla niektórych jest więcej niż jeden kod, tj. aminokwas T ma 4 różne kody/kodony)

Ostatnia funkcja w poniższym kodzie nie działa, więc chcę, żeby ktoś zadziałał i proszę brak zintegrowanego języka zapytań (zapomniałem o akronimie!) `

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

Czy możesz podać przykład wejścia i pożądanego wyjścia? Btw. akronimem jest LINQ. – Henrik

+0

getcodonsforpeptide ("MA") wyjście AGTGAC, AGTGCG AGTGAT coś takiego nie jest pewne tylko poprzez sprawdzenie dwóch tabel kodonów i amino_acid_per_codon – kobosh

+0

Więc po to, aby upewnić się, co rozumiem. Dla każdego znaku w łańcuchu wejściowym może być wiele pasujących wpisów w tabeli AMINOS_PER_CODON. Na przykład, dla danego ciągu może być wiele dopasowań dla każdego odpowiedniego znaku: 1, 2, 3, 2. Wynikowa * liczba * kombinacji będzie 1 * 2 * 3 * 2 = 12. Następnie, chcesz każda z tych kombinacji, w której chcesz przetłumaczyć każdy mecz z tej tabeli na inną tabelę i uzyskać wynikowy ciąg znaków, czy tak jest? –

Odpowiedz

2

Spróbuj użyć następujących dwóch metod:

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

Uwagi:

  • Ponieważ każdy aminokwas będzie mieć wiele kodonów dopasowywania, metoda, która zwraca gdy znajdzie pierwszy będzie tylko kiedykolwiek dopasować każdy aminokwas pewnego razu. Zamiast tego stworzyłem metodę modułu wyliczającego, która będzie miała każdy kodon dopasowujący.
  • Ostatnia metoda wyszukuje wszystkie pasujące kodony dla pierwszego znaku peptydu i łączy każdy taki kodon ze wszystkimi kodonami składającymi się z reszty peptydu po pierwszym znaku.
  • Jako typ wprowadziłem tablicę AMINOS_PER_CODON, używając jako char. Możesz łatwo zmienić kod, aby użyć swojej tablicy łańcuchów, jeśli chcesz.
  • Lepszym podejściem bez dwóch oddzielnych tablic byłoby utworzenie słownika mapującego każdy znak aminokwasu na listę ciągów kodonów.

Przykład wyjściowego przy przejściu w "MA":

ATGGCT 
ATGGCC 
ATGGCA 
ATGGCG 

To dlatego M mapy do nich:

ATG 

i A mapy do nich:

GCT 
GCC 
GCA 
GCG 

The dyktować ionary Proponuję użyć wyglądałby następująco:

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

Byłoby to zastąpić metodę AminoAcidToCodon.

Można nawet zbudować tego słownika od dwóch tablic:

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()); 

Sposób GetCodonsforPeptide mógłby wyglądać następująco:

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

tj. zamień wywołanie na tę inną metodę przez tablicę odnośników.

+0

dzięki bardzo; ale jak nazwać tę metodę; Linq mnie przeraża – kobosh

Powiązane problemy