In de genetica wordt onderscheid gemaakt tussen twee soorten mutaties (de vervanging van één nucleotide door een andere nucleotide). Bij transities wordt een purine nucleotide (twee ringen) vervangen door een andere purine (A ↔ G), of wordt een pyramidine nucleotide (één ring) vervangen door een andere pyramidine (C ↔ T). Alle andere mutaties waarbij een pyrine wordt vervangen door een pyramidine, of vice versa, worden transversies genoemd.
Ondanks het feit dat er in theorie slechts vier transities en acht transversies mogelijk zijn, is de kans op een transitie in de praktijk veel groter dan die van een transversie omdat het vervangen van een enkele ringstructuur door een andere enkele ringstructuur veel waarschijnlijker is dan het vervangen van een dubbele ring door een enkele ring. Bovendien leiden transities ook minder snel tot een aminozuursubstitutie, waardoor ze ook vaker overleven als stille substituties binnen een populatie.
In deze opgave stellen we DNA sequenties voor als strings die enkel bestaat uit de letters A, C, G en T. Deze letters stellen de verschillende nucleotiden voor. De nucleotiden mogen ook met kleine letters geschreven worden. Gegeven twee even lange DNA sequenties $$s_1$$ en $$s_2$$, dan definiëren we de transitie/transversieverhouding $$R(s_1, s_2)$$ als de verhouding van het aantal transities ten opzicht van het aantal transversies, waarbij telkens de nucleotiden op overeenkomstige posities van de twee sequenties met elkaar vergeleken worden.
De transitie/transversieverhouding tussen twee homologe DNA sequenties ligt meestal rond de 2, maar is typisch een stuk hoger binnen eiwitcoderende gebieden omdat transversies daar doorgaans de aminozuursamenstelling wijzigen en dus mogelijk aanleiding geven tot fatale mutaties in het vertaalde eiwit. Puntmutaties die geen aanleiding geven tot een wijziging in het aminozuur (wat een stuk waarschijnlijker is voor transities) worden stille substituties genoemd. Gevraagd wordt:
Schrijf een functie transitie waaraan twee nucleotiden moeten doorgegeven worden. De functie moet een Booleaanse waarde teruggeven die aangeeft of de vervanging van de ene nucleotide door de andere al dan niet een transitie voorstelt.
Schrijf een functie transversie waaraan twee nucleotiden moeten doorgegeven worden. De functie moet een Booleaanse waarde teruggeven die aangeeft of de vervanging van de ene nucleotide door de andere al dan niet een transversie voorstelt.
Schrijf een functie verhouding waaraan twee DNA sequenties $$s_1$$ en $$s_2$$ moeten doorgegeven worden. De functie mag ervan uitgaan dat deze twee DNA sequenties even lang zijn (en moet dit niet expliciet controleren). De functie moet de transitie/transversieverhouding $$R(s_1, s_2) \in \mathbb{R}$$ van de twee gegeven sequenties teruggeven als een floating point getal. Hierbij geldt dat $$R(s_1, s_2) = 0$$ als er geen transversies zijn tussen de twee gegeven sequenties.
Geen enkele van deze drie functies mag onderscheid maken tussen hoofdletters en kleine letters in de argumenten die eraan doorgegeven worden.
>>> transitie('G', 'A')
True
>>> transitie('t', 'g')
False
>>> transitie('C', 'c')
False
>>> transversie('G', 'A')
False
>>> transversie('t', 'g')
True
>>> transversie('C', 'c')
False
>>> verhouding('ATTAGCATTATCATC', 'AAATAGGATATATGG')
0.2222222222222222
>>> seq1 = 'GCAACGCACAACGAAAACCCTTAGGGACTGGATTATTTCGTGATCGTTGTAGTTATTGGAAGTACGGGCATCAACCCAGTT'
>>> seq2 = 'ttatctgacaaagaaagccgtcaacggctggataatttcgcgatcgtgctggttactggcggtacgagtgttcctttgggt'
>>> verhouding(seq1, seq2)
1.2142857142857142