De genetische code bestaat uit een aantal regels die vastleggen hoe levende cellen de informatie gecodeerd in genetisch materiaal (DNA- of RNA-sequenties) vertalen naar eiwitten (aminozuursequenties). Deze code definieert hoe een reeks van drie nucleotiden — codons genaamd — tijdens de eiwitsynthese specificeert welk aminozuur als volgende aan het eiwit zal toegevoegd worden.
Omdat de overgrote meerderheid van de genen exact dezelfde code gebruiken, wordt vaak naar deze specifieke code gerefereerd als de canonische of standaard genetische code, of zelfs eenvoudigweg als dé genetische code, terwijl er zich in feite verschillende variante codes ontwikkeld hebben. De eiwitsynthese in menselijke mitochondria is een voorbeeld waar een genetische code gebruikt wordt die afwijkt van de standaard genetische code.
Levende cellen gebruiken 20 verschillende aminozuren om eiwitten te coderen, die elk een eigen hoofdletter toegewezen krijgen. Met vier verschillende nucleotiden kan een code die vertrekt van 2 nucleotiden slechts maximaal $$4^2$$ of 16 verschillende aminozuren coderen. Een code van 3 nucleotiden kan daarentegen maximaal $$4^3$$ of 64 verschillende aminozuren coderen. Genetische codes zijn dan ook 3-letter codes waarbij sommige codons op hetzelfde aminozuur afgebeeld worden, of fungeren als een stopcodon. Een bepaalde genetische code kan dus (deels) vastgelegd worden door elk van de 64 mogelijke nucleotiden te koppelen aan een aminozuur (aangegeven door een hoofdletter) of een stopcodon (aangeduid door een sterretje (*)).
Definieer een klasse GenetischeCode met volgende methoden:
Een initialisatiemethode __init__ waaraan de locatie van een tekstbestand als argument moet doorgegeven worden. Dit tekstbestand moet de vertaaltabel van een genetische code bevatten en moet bestaan uit 64 tekstregels. Op elke regel staan een codon en het corresponderende aminozuur, van elkaar gescheiden door een spatie. Je mag ervan uitgaan dat het bestand alle 64 codons bevat. Voor de codons kan echter gebruikgemaakt worden van het DNA- (met T voor thymine) of het RNA-alfabet (met U voor uracil). Onderstaand voorbeeld gebruikt een bestand waarin het DNA-alfabet gebruikt wordt. Het nieuw aangemaakte object moet de informatie uit de gegeven vertaaltabel bijhouden.
Een methode aminozuur waaraan een geldig codon (DNA of RNA) als stringargument moet doorgegeven worden. De methode moet een hoofdletter teruggeven die staat voor het corresponderende aminozuur in de gegeven genetische code. Bij deze vertaling mag de methode voor het gegeven codon geen onderscheid maken tussen hoofdletters en kleine letters, en ook niet tussen de letters U (uracil) en T (thymine). Op die manier kunnen zowel DNA- als RNA-codons aan de methode doorgegeven worden. Bekijk onderstaand voorbeeld om na te gaan hoe de methode moet reageren indien het doorgegeven argument geen geldig codon voorstelt.
Een methode eiwit waaraan een stringargument moet doorgegeven worden dat een DNA- of RNA-sequentie voorstelt. Deze string mag zowel hoofdletters als kleine letters bevatten, maar bestaat voorts enkel uit letters uit het DNA- of RNA-alfabet. Bekijk onderstaand voorbeeld om na te gaan hoe de methode moet reageren indien het doorgegeven argument geen geldige DNA- of RNA-sequentie voorstelt. Wanneer een geldig argument wordt doorgegeven, moet de functie de vertaling van de gegeven DNA- of RNA-sequentie naar de corresponderende eiwitsequentie teruggeven. De string die als resultaat wordt teruggegeven mag hierbij enkel uit hoofdletters bestaan. Indien de lengte van de gegeven DNA- of RNA-sequentie geen veelvoud is van drie, dan moeten de laatste of de laatste twee letters van de string genegeerd worden bij de vertaling.
Bij onderstaand voorbeeld gaan we ervan uit dat het bestand standaard_code.txt1 zich in de huidige directory bevindt.
>>> code = GenetischeCode('standaard_code.txt2')
>>> code.aminozuur('AGT')
'S'
>>> code.aminozuur('cga')
'R'
>>> code.aminozuur('UCU')
'S'
>>> code.aminozuur('ABC')
Traceback (most recent call last):
AssertionError: 'ABC' is geen geldig codon.
>>> code.aminozuur('aagc')
Traceback (most recent call last):
AssertionError: 'aagc' is geen geldig codon.
>>> code.eiwit('ATGCTGATGATGGGCTATTATCGAT')
'MLMMGYYR'
>>> code.eiwit('uauccuaguguc')
'YPSV'
>>> code.eiwit('AAGTCGTAGCTACGXXXXGAGAAGGAT')
Traceback (most recent call last):
AssertionError: ongeldige DNA- of RNA-sequentie.