De genetische code beschrijft hoe de informatie in het genetisch materiaal (DNA1 of RNA2) van leven de cellen wordt gelezen om een eiwit3 te vormen. De genetische code werd ontrafeld in de jaren 1960, enkele jaren na de ontdekking van de DNA-helix. Het verklaart hoe de vierletterige code van het DNA (voorgesteld door de letters A, C, G en T) kan vertaald4 worden naar de twintig verschillende aminozuren5 (voorgesteld door 20 verschillende letters), de bouwstenen van eiwitten. Op enkele uitzonderingen na is de genetische code universeel geldig bij alle vormen van leven.
Stukken DNA die coderen voor eiwitten (genen6), worden in levende cellen overgeschreven naar een enkelstrengs RNA-molecuul. Dit molecuul — het messenger-RNA7 — is in wezen een kopie van het DNA en draagt instructies voor de aanmaak van een eiwit. In het ribosoom8 worden aminozuren aan elkaar gekoppeld in een volgorde die bepaald wordt door de nucleotidevolgorde in het mRNA. Het ribosoom leest daarbij steeds drie nucleotiden af van het mRNA, elk overeenkomend met een specifiek aminozuur. Dit proces wordt translatie9 genoemd.
De drie opeenvolgende nucleotiden, noemt men een codon10. Codons specificeren welke aminozuren er aan de eiwitketen toegevoegd worden, en daarnaast bepalen ze de start- en stopsignalen van het translatieproces. Meestal doelt men met de term codon op de nucleotiden zoals die voorkomen in messenger-RNA: adenine (A), cytosine (C), guanine (G) en uracil (U). Het codon ACU correspondeert bijvoorbeeld met het aminozuur threonine11, en CGG met arginine12. De genetische code kan samengevat worden in een simpele codontabel van 64 codes.
Lange tijd werd aangenomen dat de genetische code universeel is —
een gegeven codon zou in elk organisme voor hetzelfde aminozuur coderen.
Deze aanname is grotendeels waar: de genetische code is van toepassing bij
alle drie de domeinen17 van het leven. Dit feit levert een
belangrijk argument voor de gemeenschappelijke afstamming18 van alle levensvormen.
Er zijn echter een paar uitzonderingen — variaties — op de
genetische code ontdekt. De eencellige schimmel Candida albicans19 vertaalt het codon CUG
bijvoorbeeld naar serine20,
terwijl bijna alle andere organismen dit codon naar leucine21 vertalen. Bij sommige ciliaten22 (eencellige eukaryoten) werken de drie
conventionele stopcodons anders — deze coderen namelijk gewoon voor
aminozuren, en het eind van de translatie wordt gesignaleerd door het
3'-eind van het mRNA.
In mitochondriën23
van uiteenlopende soorten geldt ook een sterk variërende genetische
code. In de mitochondriën van zoogdieren wordt het codon AUA
bijvoorbeeld vertaald naar methionine24, in plaats van AUG.
Mitochondriën hebben hun eigen genetisch materiaal en coderen hun
eigen translatiemachinerie. Dergelijke variaties laten zien dat de
genetische code niet zonder meer onwrikbaar vastgelegd is, maar
evolutionaire veranderingen kan ondergaan.
Het DNA-alfabet bestaat uit vier verschillende nucleotiden die voorgesteld worden door de letters A, C, G en T. Een DNA-sequentie (str) bestaat uit een reeks letters uit het DNA-alfabet. Het RNA-alfabet bestaat uit vier verschillende nucleotiden die voorgesteld worden door de letters A, C, G en U. Een RNA-sequentie (str) bestaat uit een reeks letters uit het RNA-alfabet. Bij de omzetting van DNA naar RNA, wordt thymine (T) omgezet naar uracil (U), waardoor de letter T in het DNA-alfabet een synoniem is voor de letter U in het RNA-alfabet. Een codon (str) is een sequentie (DNA of RNA) van lengte 3.
Het eiwit-alfabet bestaat uit 20 verschillende aminozuren (voorgesteld door 20 verschillende letters) en een stopcodon (voorgesteld door een sterretje: *). Een eiwitsequentie (str) bestaat uit een reeks karakters uit het eiwit-alfabet.
Een DNA- of RNA-sequentie wordt vertaald naar een eiwitsequentie door elk codon van drie opeenvolgende letters om te zetten naar het corresponderende aminozuur of stopcodon. Als de lengte van de DNA- of RNA-sequentie geen veelvoud is van drie, dan wordt de laatste letter of worden de laatste twee letters van de sequentie genegeerd bij de vertaling. De genetische code die gebruikt wordt voor die omzetting wordt vastgelegd in een vertaaltabel: een tekstbestand dat bestaat uit 64 regels. Elke regel bevat een uniek codon en het corresponderende aminozuur, van elkaar gescheiden door een spatie. Voor de codons gebruikt de vertaaltabel ofwel het DNA-alfabet (met T voor thymine) of het RNA-alfabet (met U voor uracil).
Definieer een klasse GenetischeCode waarmee genetische codes kunnen voorgesteld worden. Bij het aanmaken van een genetische code (GenetischeCode) moet de locatie (str) van de vertaaltabel van de genetische code doorgegeven worden. Op een genetische code $$\mathcal{C}$$ (GenetischeCode) moet je minstens de volgende methoden kunnen aanroepen:
Een methode aminozuur waaraan een codon $$c$$ (str; DNA of RNA) moet doorgegeven worden. Als $$c$$ geen geldig codon voorstelt, dan moet een AssertionError opgeworpen worden met de boodschap ongeldig codon. Anders moet het aminozuur (str; hoofdletter) teruggegeven worden dat volgens genetische code $$\mathcal{C}$$ correspondeert met codon $$c$$. Bij de vertaling van codon $$c$$ mag geen onderscheid gemaakt worden tussen hoofdletters en kleine letters, en ook niet tussen de letters U (uracil) en T (thymine). Daardoor kunnen aan de methode zowel DNA- als RNA-codons doorgegeven worden.
Een methode eiwit waaraan een sequentie $$s$$ (str; DNA of RNA) moet doorgegeven worden. Deze sequentie mag zowel hoofdletters als kleine letters bevatten. Als $$s$$ geen geldig DNA- of RNA-sequentie voorstelt, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige sequentie. Anders moet de eiwitsequentie (str; in hoofdletters) teruggegeven worden die men bekomt door sequentie $$s$$ te vertalen volgens genetische code $$\mathcal{C}$$.
Bij onderstaand voorbeeld gaan we ervan uit dat het tekstbestand standard_code.txt25 zich in de huidige directory bevindt. Dit bestand bevat de vertaaltabel van de standaard genetische code26, waarbij de specificatie van de codons het DNA-alfabet gebruikt.
>>> code = GenetischeCode('standard_code.txt27')
>>> code.aminozuur('AGT')
'S'
>>> code.aminozuur('cga')
'R'
>>> code.aminozuur('UCU')
'S'
>>> code.aminozuur('ABC')
Traceback (most recent call last):
AssertionError: ongeldig codon
>>> code.aminozuur('aagc')
Traceback (most recent call last):
AssertionError: ongeldig codon
>>> code.eiwit('ATGCTGATGATGGGCTATTATCGAT')
'MLMMGYYR'
>>> code.eiwit('uauccuaguguc')
'YPSV'
>>> code.eiwit('AAGTCGTAGCTACGXXXXGAGAAGGAT')
Traceback (most recent call last):
AssertionError: ongeldige sequentie