| calcolo della copertura di T | top |
Il calcolo della copertura massima della sequenza
T,
utilizzando la minima quantità di sottosequenze e di sottosequenze
inverse complementate di lunghezza almeno
l contenute in
S,
richiede l'uso dei due grafi
G e
G', calcolati da
S, che
riconoscono rispettivamente le sottosequenze dirette e quelle inverse complementate.
L'algoritmo scorre la sequenza
T iniziando a considerare la
prima base come possibile inizio di una sottosequenza e procede per iterazioni,
scorrendo in avanti, fino a raggiungere il termine di
T.
Ad ogni iterazione possono verificarsi due casi: se vale l'ipotesi
che la base immediatamente precedente a quella in analisi non può
essere coperta da alcuna sottosequenza, allora si è nel caso 1, se
invece si è riusciti ad individuare una sottosequenza della copertura che
termina appena prima alla base in analisi, si è nel caso 2.
Definisco
c0 la base in esame e
ci la base distante
i posizioni
da
c0 nella sequenza
T.
La notazione
cc indica il complemento di
c.
caso 1
Vale l'ipotesi che la base immediatamente precedente a quella in esame (
c-1)
non può essere coperta da alcuna sottosequenza, quindi
c0
può essere coperta solo se è proprio l'inizio di una sottosequenza. Parto con il
cercare, se esiste, una sottosequenza diretta lunga almeno
l che,
partendo da
c0, copra
T almeno fino a
cl-1, tale sequenza esiste solo se
passando in sequenza
cl-1c,
cl-2c,
cl-3c ...
c0c ad un cursore
del grafo
G', egli riesce sempre a trovare un percorso, cioè se
cl-1c cl-2c ...
c0c
formano una sottosequenza inversa complementata di
S.
Se questa operazione
utilizzando
G' ha successo, allora
c0
è proprio l'inizio di una sottosequenza diretta lunga almeno
l,
passo quindi in sequenza le basi di
T a partire da
c0
ad un cursore su
G, finchè, passando
ci,
non fallisce nel trovare un percorso, e ho individuato la sottosequenza diretta che parte da
c0
e va fino a
ci-1, lunga almeno
l.
Se invece la ricerca della sottosequenza inversa a partire da
cl-1
fallisce mentre gli passo un certo
ci, questo
significa che
c0 non può essere coperto da una
sottosequenza diretta lunga almeno
l, perchè tale sottosequenza
dovrebbe contenere la sottosequenza
ci ci+1
...
cl-1 che, non essendo sottosequenza
diretta di
S (non essendo il suo inverso complementato riconosciuto da
G'),
non può essere contenuta in nessuna possibile
sottosequenza diretta di
S,
quindi, per l'ipotesi del caso 1,
c0
non può essere coperto da nessuna sottosequenza diretta, ma allora anche
c1 ricade nel caso 1 (almeno per le sottosequenze
dirette) e per le stesse ragioni
non può essere coperto, quindi abbiamo che tutte le basi fino a
ci
inclusa non possono essere coperte da sottosequenze dirette.
Per cercare sottosequenze inverse complementate che partano da
c0
seguo lo stesso procedimento usato per le dirette, complementando però le basi di
T e usando
G al posto
di
G' e viceversa.
Possono verificarsi 3 situazioni:
-se ho trovato solo una sottosequenza, diretta
o inversa complementata, che parta da
c0, allora
l'aggiungo alla copertura e procedo l'analisi dalla prima base di
T
che non è coperta da questa sottostringa, andando nel caso 2.
-se ho trovato sia una sottosequenza diretta che una inversa complementata allora
aggiungo alla copertura solo quella più lunga e procedo nell'analisi
della prima base di
T
che non è coperta da questa sottostringa, andando nel caso 2.
-se non ho trovato né una sottosequenza diretta, né una sottosequenza inversa complementata,
allora non considero tutte le basi che sono state escluse come
copribili sia dalle dirette che dalle inverse complementate e procedo nell'analisi
della base ad esse immediatamente successiva, restando nel caso 1.
caso 2
Vale l'ipotesi che
c-1 è l'ultima base di
una sottostringa di copertura, quindi tutte la basi almeno fino
a
c-l
compresa sono coperte e
c0 potrebbe allora non solo
essere l'inizio di una nuova sottostringa, ma potrebbe anche comparire
nella parte centrale, se non addirittura come base finale, di una sottostringa
lunga almeno
l e parzialmente sovrapposta a quella che termina in
c-1.
Per cercare la migliore sottosequenza diretta, se esiste, si procede
passando ad un cursore su
G le basi
c0 c1
...
ci finchè nell'ultimo,
ci,
non fallisce nel trovare un percorso. Se
i>=
l allora ho già concluso, tale sequenza
potrebbe anche essere la parte finale di una sottosequenza parzialmente sovrapposta
con quella precedente, ma di sicuro non ve ne sono di parzialmente sovrapposte che
vanno più in la di
ci-1, non essendo
c0
c1 ...
ci una sottosequenza
diretta (e quindi non può essere contenuta in una sottosequenza diretta).
Se invece
i<
l allora devo cercare la sottosequenza diretta, parzialmente
sovrapposta a quella precedente, che copra la massima quantità di basi attualmente scoperte, sapendo
già che non potrà raggiungere la base
ci (non essendo
c0 c1 ...
ci
una sottosequenza diretta). A partire da
c0 passo ad un
cursore su
G' le basi
c0c,
c-1c ...
c-kc, finchè il cursore trova un percorso e finchè
k<
l
(oltre non è necessario), ho quindi che
c-1c c-2c
c-3c c-kc sono una sottosequenza inversa complementata
e i loro complementi rappresentano il massimo prefisso possibile, lungo
k, della
sottosequenza diretta che sto cercando. Il massimo suffisso (
c0
c1 c2 ...
ci-1)
è lungo
i, se
k+
i<
l allora ho già fallito, altrimenti
passo ad un cursore su
G le basi
ci-l ci-l+1
ci-l+2 ...
ci-1.
Se il cursore trova la strada su
G fino a
ci-1
allora ho trovato una sottosequenza diretta che copre tutto il massimo suffisso,
se invece fallisce durante l'analisi della base
cj
allora vuol dire che la sequenza
ci-l ci-l+1
...
cj non è una sottosequenza diretta, quindi, non
potendo essere inclusa in nessuna sottosequenza diretta lunga almeno
l,
non potendo
ci-l+1 essere l'inizio di una sequenza
lunga almeno
l che arriva fino a
ci-1 (sarebbe
lunga solo
l-1), la lunghezza del massimo prefisso si riduce da
i
a
j, se
k+
j<
l fallisco, altrimenti reitero lo
stesso procedimento cambiando il valore di
i. Nel caso pessimo, veramente
improbabile, occorre ripetere al massimo
l-1 di questi passaggi per
individuare, se esiste la sottosequenza diretta cercata.
Per cercare sottosequenze inverse complementate che partano da
c0
seguo lo stesso procedimento usato per le dirette, complementando però le basi di
T e usando
G al posto
di
G' e viceversa.
Possono verificarsi 3 situazioni:
-se ho trovato solo una sottosequenza, diretta o inversa complementata, allora
l'aggiungo alla copertura e procedo l'analisi dalla prima base di
T
che non è coperta da questa sottostringa, restando nel caso 2.
-se ho trovato sia una sottosequenza diretta che una inversa complementata allora
aggiungo alla copertura solo quella che copre più basi ancora scoperte
e procedo nell'analisi della prima base di
T
che non è coperta da questa sottostringa, restando nel caso 2.
-se non ho trovato né una sottosequenza diretta, né una sottosequenza inversa complementata,
allora significa che
c0 non può essere
in nessun caso coperta da alcuna sottosequenza, procedo nell'analisi
della base
c1, andando nel caso 1.