2014-11-12 19 views
5

Hallo mein Kopf kocht jetzt für 3 Tage! Ich möchte alle DNA-Codierungen für ein Peptid erhalten: ein Peptid ist eine Sequenz von Aminosäuren, dh Aminosäure M und Aminosäure Q können Peptid MQ oder QMWie bekomme ich alle DNA-Codierung für Peptid in C#

codierende DNA bilden bedeutet, es ist ein DNA-Code (genannt Codon) für jede Aminosäure (für einige gibt es mehr als einen Code, dh Aminosäure T hat 4 verschiedene Codes/Codons)

Die letzte Funktion im folgenden Code funktioniert nicht, also möchte ich jemand, damit es für mich funktioniert und bitte keine Abfrage integrierte Sprache (ich habe sein Akronym vergessen!) `

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

Können Sie ein Beispiel für Eingabe und gewünschte Ausgabe geben? Übrigens. Das Akronym ist LINQ. – Henrik

+0

getcodonsforpeptide ("MA") Ausgabe AGTGAC, AGTGCG AGTGAT so etwas nicht sicher, nur durch die Überprüfung der beiden Codon-Tabelle und amo_acid_per_codon – kobosh

+0

Also nur um sicherzustellen, dass ich verstehe, was Sie meinen. Für jedes Zeichen in der Eingabezeichenfolge können mehrere übereinstimmende Einträge in der Tabelle AMINOS_PER_CODON vorhanden sein. So könnte es zum Beispiel für eine gegebene Zeichenfolge so viele Übereinstimmungen für jedes entsprechende Zeichen geben: 1, 2, 3, 2. Die resultierende * Anzahl * von Kombinationen wäre 1 * 2 * 3 * 2 = 12. Dann möchten Sie jede dieser Kombinationen, wo Sie jede Übereinstimmung von dieser Tabelle in die andere Tabelle übersetzen und die resultierende Zeichenkette erhalten wollen, ist das? –

Antwort

2

Versuchen Sie, die folgenden zwei Methoden:

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

Hinweise:

  • Da jeder Aminosäure wird mehrere passenden Codons haben, Ihre Methode, die zurückgibt, wenn es die ersten findet, wird immer nur jeden Aminosäure entsprechen Einmal. Stattdessen habe ich eine Enumerator-Methode erstellt, die jedes übereinstimmende Codon yield return enthält.
  • Die letzte Methode findet alle übereinstimmenden Codons für das erste Zeichen des Peptids und kombiniert jedes solche Codon mit allen Codons, die aus dem Rest des Peptids nach dem ersten Zeichen bestehen.
  • Ich machte die AMINOS_PER_CODON Array Verwendung char als ein Typ stattdessen. Sie können den Code leicht ändern, um Ihr Zeichenfolgen-Array zu verwenden, wenn Sie möchten.
  • Eine bessere Vorgehensweise ohne zwei separate Arrays wäre die Erstellung eines Wörterbuchs, das jedes einzelne Aminosäurezeichen einer Liste von Codon-Strings zuordnet.

Beispiel Ausgang fließt, wenn in "MA":

ATGGCT 
ATGGCC 
ATGGCA 
ATGGCG 

Dies liegt daran, die M Karten diese:

ATG 

und A Karten zu diesen:

GCT 
GCC 
GCA 
GCG 

Die dict ionary Ich schlage vor, Sie aussehen würde, verwenden wie folgt aus:

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

die AminoAcidToCodon Methode Dies würde ersetzen.

Sie können sogar, dass Wörterbuch von Ihren beiden Arrays bauen:

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

Die GetCodonsforPeptide Methode dann wie folgt aussehen könnte:

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

dh. Ersetzen Sie den Aufruf dieser anderen Methode durch die Nachschlagetabelle.

+0

vielen dank; aber wie man diese Methode nennt; Linq macht mir Angst – kobosh