Een dot plot is één van de oudste grafische voorstellingsvormen om twee biologische sequenties met elkaar te vergelijken. Gebieden van de twee sequenties die sterk op elkaar gelijken worden bij een dot plot immers gevisualiseerd als diagonalen.

dot plot
Dot plot waarin de volledige genoomsequentie van Lactobacillus acidophilus weergegeven wordt ten opzichte van deze van het verwante organisme L. bulgaricus. Posities die een sterke gelijkenis vertonen, worden weergegeven met een donker punt. Het feit dat de dot plot min of meer een diagonaal weergeeft, suggereert dat beide soorten afstammen van een recente gemeenschappelijke voorouder.

Dot plots worden opgebouwd als tweedimensionale matrices waarvan de rijen overeenstemmen met de opeenvolgende vensters (dit is de term die in deze context gebruikt wordt voor aaneengesloten gebieden binnen een sequentie) van de eerste sequentie, en de kolommen met de opeenvolgende vensters van de tweede sequentie. In de meest eenvoudige vorm worden de vensters gevormd door de individuele residu's (letters) van een sequentie, maar bij uitbreiding kan een venster ook bestaat uit $$n$$ opeenvolgende residu's. Een cel van de matrix wordt zwart gemaakt (voorgesteld door de Booleaanse waarde True) indien het corresponderende venster van de eerste sequentie voldoende gelijkenis vertoont met het corresponderende venster van de tweede sequentie. Anders blijft de cel van de matrix wit (voorgesteld door de Booleaanse waarde False).

Opgave

Definieer een klasse Dotplot waarmee dot plots voor twee gegeven biologische sequenties kunnen aangemaakt worden. Biologische sequenties worden hierbij voorgesteld als strings die enkel bestaan uit letters van het alfabet  (die de individuele residu's voorstellen). Posities binnen deze sequenties worden geïndexeerd vanaf nul. Objecten van de klasse Dotplot moeten volgende methoden hebben:

Voorbeeld

Klik op de links in onderstaande voorbeeldsessie om een grafische voorstelling van de dot plots te bekijken.

>>> dotplot = Dotplot('ATCCTC', 'ATTCTCG')

>>> dotplot.vensters(start1=1, start2=4, lengte=3)
('TCC', 'TCG')
>>> dotplot.vensters(start1=1, start2=4, lengte=-3)
Traceback (most recent call last):
AssertionError: ongeldige venstergrootte
>>> dotplot.vensters(start1=1, start2=5, lengte=3)
Traceback (most recent call last):
AssertionError: ongeldige startpositie

>>> dotplot.gelijk(start1=1, start2=4, lengte=3)
True
>>> dotplot.gelijk(start1=1, start2=4, lengte=3, aantal=2)
True
>>> dotplot.gelijk(start1=1, start2=4, lengte=3, aantal=3)
False

>>> dotplot.plot(lengte=1, stap=1, aantal=1) 1
[[True, False, False, False, False, False, False], [False, True, True, False, True, False, False], [False, False, False, True, False, True, False], [False, False, False, True, False, True, False], [False, True, True, False, True, False, False], [False, False, False, True, False, True, False]]
>>> dotplot.plot(lengte=3, stap=1, aantal=1) 2 
[[True, True, False, True, False], [False, True, True, True, True], [True, False, True, True, True], [True, True, False, True, False]]
>>> dotplot.plot(lengte=3, stap=1, aantal=2) 3 
[[True, True, False, True, False], [False, True, True, False, True], [False, False, True, False, False], [False, True, False, True, False]]
>>> dotplot.plot(lengte=3, stap=1, aantal=3) 4 
[[False, False, False, False, False], [False, False, False, False, False], [False, False, False, False, False], [False, False, False, True, False]]
>>> dotplot.plot(lengte=2) 5 
[[True, False, False], [False, True, True], [False, True, True]]
>>> dotplot.plot(lengte=2, aantal=2) 6 
[[True, False, False], [False, False, False], [False, True, True]]
>>> dotplot.plot(lengte=3, aantal=2) 7 
[[True, True], [False, True]]