Een mutatie is niets anders dan een fout die optreedt tijdens het maken of kopiëren van een nucleïnezuur, in het bijzonder DNA. Omdat nucleïnezuren een vitale rol spelen bij cellulaire functies, hebben mutaties de neiging om een cel grondig dooreen te schudden. Maar hoewel mutaties technisch gezien als fouten kunnen aanzien worden, kunnen ze in zeer zeldzame gevallen een voordeel opleveren voor de cel. De macro-effecten van evolutie zijn dan ook toe te schrijven aan het cumulatieve resultaat van voordelige microscopische mutaties die optreden doorheen een groot aantal generaties.
Stukjes DNA die afkomstig zijn uit het genoom van verschillende organismen of soorten worden homoloog genoemd als ze een recente voorouder hebben. Bij het vergelijken van meerdere homologe DNA-sequenties kan het handig zijn om hun consensussequentie te berekenen. Volgens het biologische principe van parsimony1 — de natuur neigt naar het kortst mogelijke evolutionaire pad — stelt deze sequentie immers de meest waarschijnlijke voorouder van de homologe DNA-sequenties voor.
Een matrix is een rechthoekig rooster van waarden die gerangschikt zijn in rijen en kolommen. Een $$m \times n$$ matrix heeft $$m$$ rijen en $$n$$ kolommen. Gegeven een matrix $$A$$, dan schrijven we $$A_{i,j}$$ ($$0 \leq i < m; 0 \leq j < n$$) om de waarde aan te duiden die gevonden wordt op de intersectie van rij $$i$$ en kolom $$j$$.
Veronderstel dat we beschikken over een reeks DNA-sequenties die allemaal dezelfde lengte $$n$$ hebben. Hun profielmatrix is een $$4 \times n$$ matrix $$P$$ waarin $$P_{0, j}$$ uitdrukt hoeveel keer de base A voorkomt op de $$j$$-de positie van de gegeven sequenties, $$P_{1, j}$$ uitdrukt hoeveel keer de base C voorkomt op de $$j$$-de positie van de gegeven sequenties, enzoverder (zie onderstaande tabel).
De consensussequentie $$c$$ is een string van lengte $$n$$ die gevormd wordt door in de reeks DNA-sequenties op elke positie de meest voorkomende base te kiezen. Het $$j$$-de karakter van $$c$$ correspondeert dus met de base die de grootste waarde heeft in de $$j$$-de kolom van de profielmatrix van de DNA-sequenties. Indien er meerdere basen zijn die de grootste waarde hebben in de $$j$$-de kolom van de profielmatrix, dan wordt de letter N gebruikt als $$j$$-de karakter van $$c$$.
G C A A A A C G | |
G C G A A A C T | |
T A C C T T C A | |
sequenties | T A T G T T C A |
G C C T T A G G | |
G A C T T A T A | |
T C G G A T C C | |
|
|
A 0 3 1 2 3 4 0 3 | |
profiel | C 0 4 3 1 0 0 5 1 |
G 4 0 2 2 0 0 1 2 | |
T 3 0 1 2 4 3 1 1 | |
|
|
consensus | G C C N T A C A |
Gevraagd wordt:
Schrijf een functie profiel waaraan een reeks (een lijst of een tuple) DNA-sequenties moet doorgegeven worden. In deze opgaven stellen we een DNA-sequentie voor als een string die enkel bestaat uit de hoofdletters A, C, G en T. Indien niet alle DNA-sequenties dezelfde lengte hebben, dan moet de functie een AssertionError opwerpen met de boodschap sequenties moeten even lang zijn. Indien alle DNA-sequenties wel dezelfde lengte $$n$$ hebben, dan moet de functie de profielmatrix van de sequenties teruggeven. De profielmatrix wordt voorgesteld als een dictionary die elk van de basen A, C, G en T afbeeldt op een lijst van $$n$$ natuurlijke getallen, waarbij het getal op de $$j$$-de positie aangeeft hoeveel keer die base voorkomt op de $$j$$-de positie van de gegeven DNA-sequenties.
Schrijf een functie consensus waaraan een profielmatrix moet doorgegeven worden. De profielmatrix moet een dictionary zijn die opgebouwd is zoals de waarden die door de functie profiel teruggegeven worden. De functie consensus moet de consensussequentie teruggeven die correspondeert met de gegeven profielmatrix.
>>> seqs = ['GCAAAACG', 'GCGAAACT', 'TACCTTCA', 'TATGTTCA', 'GCCTTAGG', 'GACTTATA', 'TCGGATCC']
>>> profiel(seqs)
{'A': [0, 3, 1, 2, 3, 4, 0, 3], 'C': [0, 4, 3, 1, 0, 0, 5, 1], 'T': [3, 0, 1, 2, 4, 3, 1, 1], 'G': [4, 0, 2, 2, 0, 0, 1, 2]}
>>> consensus(profiel(seqs))
'GCCNTACA'
>>> seqs = ['GGTATCTTTA', 'TTGTCGTCTTAGA', 'GGATCCAGAC', 'ATTCAATCGA', 'TGATCTGGAA', 'AGAGTCATGC']
>>> profiel(seqs)
Traceback (most recent call last):
AssertionError: sequenties moeten even lang zijn