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.

RNA codons
Een codonreeks binnen een boodschapper RNA (mRNA) molecule. Elk codon bestaat uit drie nucleotiden, die doorgaans één enkel aminozuur voorstellen. De nucleotiden worden afgekort met de letters A, U, G, en C. Dit is mRNA, dat U (uracil) gebruikt. DNA maakt in plaats daarvan gebruik van T (thymine). Dit mRNA-molecuul zal een ribosoom instrueren om een eiwit te synthetiseren volgens deze code.
standaard genetische code
De standaard genetische code.

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 (*)).

Opgave

Definieer een klasse GenetischeCode waarmee specifieke genetische codes kunnen voorgesteld op basis waarvan genen kunnen vertaald worden naar eiwitten. Bij het aanmaken van een nieuwe genetische code (GenetischeCode) moet de locatie (str) doorgegeven worden van een tekstbestand met de vertaaltabel van een genetische code. Een dergelijk bestand bestaat uit 64 regels die elk een codon en het corresponderende aminozuur bevatten, 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.

Voorts moet je op elke genetische code $$\mathcal{C}$$ (GenetischeCode) minstens de volgende methoden kunnen aanroepen:

Voorbeeld

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.