Il problema principale è:Confronto di sequenze multiple di stringhe arbitrarie con caratteri orientati
Sto cercando un algoritmo per calcolare una distanza massima parsimoniosa tra un insieme di stringhe. Con la distanza intendo qualcosa di simile allo Damerau–Levenshtein distance cioè il numero minimo di cancellazioni, inserzioni, sostituzione e trasposizione di caratteri o blocchi di caratteri adiacenti. Ma invece di stringhe regolari voglio indagare su stringhe con caratteri orientati.
Così, una stringa potrebbe sembrare:
(A,1) (B,1) (C,1) (D,1)
e possibili derivati potrebbe essere:
(A,1) (C,0) (B,0) (D,1)
(A,1) (C,1) (B,1) (D,1)
(A,1) (B,0) (C,0) (D,1)
Dove A,B,C,D
sono le identità dei personaggi e 1 = forward
e 0 = reverse
.
Qui, la derivata 1. avrebbe la distanza 2, dal momento che è possibile ritagliare il blocco BC e incollarlo nuovamente invertito (1 taglio, 1 incolla). Derivativo 2. avrebbe anche 2, poiché è possibile ritagliare C e incollarlo di fronte a B (1 taglio, 1 incolla) mentre il numero 3. richiederebbe 4 operazioni (2 tagli, 2 paste) da trasformare. Analogamente, delezione o inserzione di blocchi produrrebbe una distanza 1.
Se definirebbe (X,0)
e (X,1)
come due differenti caratteri non orientato (X0, X1)
per tutte le possibili X, esempio 3. comporterebbe una distanza di 2 in quanto si potrebbe allora ritaglia il blocco B1C1
e inserisci il blocco B0C0
in due passaggi.
Un esempio pratico:
I geni in un genoma batterico può essere considerato il carattere orientato (A, 0), (B, 0) ... Per determinare la distanza sequenza, l'orientamento della genomica i geni omologhi in due batteri correlati potrebbero essere utilizzati come traccia di un marker evolutivo. Il fatto che i genomi batterici siano stringhe circolari introduce la condizione di bordo aggiuntiva ABC uguale a BCA.
I genomi reali hanno geni univoci senza equivalenti in un partner che danno origine a un carattere di segnaposto @. Quei titolari di posto riducono il contenuto di informazione del confronto ad un limite inferiore, poiché ad es. (A, 1) (B, 1) @ (C, 1) può essere trasformato in (A, 1) @@@ (B, 1) @ (C, 1) inserendo il blocco @@@. Tuttavia, l'orientamento ripristina parzialmente il contenuto delle informazioni poiché è possibile trovare (A, 1) @@@ (B, 0) @ (C, 1) che indica una distanza minima di 3. Ancora meglio sarebbe un algoritmo per confrontare più sequenze correlate (genomi) simultaneamente, dal momento che è possibile trovare intermedi nella storia evolutiva, che aumenta la risoluzione.
Mi rendo conto, ci sono diverse domande già pubblicate sul confronto delle stringhe di testo. Ma non riescono ad essere facilmente espandibili per includere l'orientamento. Inoltre, esiste una vasta gamma di metodi per trattare le sequenze biologiche, in particolare per l'analisi di sequenze multiple.Tuttavia, quelli sono limitati a sequenze di macromolecole che non esistono in orientamenti alternati e di solito invocano pesi specifici per una particolare corrispondenza di caratteri.
Se esiste già una libreria Python che consentirebbe la personalizzazione necessaria per risolvere il problema, sarebbe fantastico. Ma qualsiasi algoritmo adatto all'orientamento sarebbe molto utile.