Bioinformatica A.A semestre I

Documenti analoghi
UNIVERSITÀ DEGLI STUDI DI MILANO. Bioinformatica. A.A semestre I UPGMA

Ambienti di Programmazione per il Software di Base

Laboratorio di Sperimentazioni di Fisica I MOD A. 14 ottobre 2009

Quarta lezione. 1. Ricerca di omologhe in banche dati. 2. Programmi per la ricerca: FASTA BLAST

LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica. Algoritmi ricorsivi

Elementi di Calcolo Scientifico per l Ingegneria A.A

Pairwise Sequence Alignment BIOINFORMATICA. Corso di Laurea in Ingegneria Informatica e Biomedica. Università Magna Graecia Catanzaro

Strutture di Controllo

ALLINEAMENTO DI SEQUENZE

Topologia della matrice di rigidezza

Esercitazioni di Fondamenti di Informatica - Lez. 7 20/11/2018

1. Si scriva una function Matlab che implementa il seguente metodo di punto fisso

Scritto di Algoritmi e s.d. (1o anno) 5 Luglio 2005

Fondamenti di Informatica

Laboratorio di Matematica e Informatica 1

Introduzione a Matlab

Informatica (A-K) 5. Algoritmi e pseudocodifica

osservazione: 1 MCD(m,n) min(m,n) = si provano i numeri compresi tra 1 e min(m,n) conviene iniziare da min(m,n) e scendere verso 1

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

osservazione: 1 MCD(m,n) min(m,n) = si provano i numeri compresi tra 1 e min(m,n) conviene iniziare da min(m,n) e scendere verso 1

Informatica Generale Andrea Corradini Gli algoritmi e la risoluzione di problemi

Fondamenti di Informatica

Fondamenti di Informatica A.A. 2016/17

Laboratorio di Python

InfoBioLab I ENTREZ. ES 1: Ricerca di sequenze di aminoacidi in banche dati biologiche

C: panoramica. Violetta Lonati

5 Array Cicli iterativi Contenuto di cella 28/02/2014 Copyright V. Moriggia 1

Programmazione dinamica

MODELLO SCHEDA INSEGNAMENTO. II II Luigi Cerulo

Esercitazione di Reti degli elaboratori

Laboratorio di Informatica 2004/ 2005 Corso di laurea in biotecnologie - Novara Viviana Patti Esercitazione 7 2.

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Cristian Secchi Pag. 1

Appunti di informatica. Lezione 8 anno accademico Mario Verdicchio

Introduzione all ambiente MATLAB. Richiami II. Calcolo Numerico - A.A. 2008/09

Ing. Lorenzo Vismara

Tipi di dato strutturati: Array

Allineamento multiplo di sequenze

FONDAMENTI DI INFORMATICA

Array in Fortran 90. Ing. Luca De Santis. Anno accademico 2006/2007. DIS - Dipartimento di informatica e sistemistica

FPL Prova di Laboratorio

Algoritmi di Allineamento

Progetto per il Laboratorio di Programmazione Un interprete per il linguaggio PINO. Modulo I: Le tavole dei simboli (TS)

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

If Statement. Il costrutto condizionale if ha la seguente sintassi:

Fondamenti di Informatica

Algoritmi e Strutture Dati. Capitolo 10 Tecniche algoritmiche

Fondamenti di Informatica. Ipotesi fondamentale. Irrisolubilità. Prof. V.L. Plantamura Informatica e Comunicazione Digitale a.a.

csp & backtracking informatica e laboratorio di programmazione Alberto Ferrari Informatica e Laboratorio di Programmazione

Esercizio da portare all orale

Esercizi su array di array

Informatica B Esercitazione 3

MATLAB c. Lucia Gastaldi Dipartimento di Matematica Lezione 4 (15 ottobre 2003)

Problema: calcolare il massimo tra K numeri

Programmazione in Perl Introduzione

Lezione 8. Ricerche in banche dati (databases) attraverso l uso di BLAST

Lezione 8. Ricerche in banche dati (databases) attraverso l uso di BLAST

Programmazione dinamica

Laboratorio di INFORMATICA. 15 ottobre 2009

Fondamenti di Informatica T-1

Principi di Programmazione Prova del 10/6/2008 (ore 10.30)

Allocazione dinamica memoria

Algoritmi e Strutture Dati

Programmazione dinamica

Prova di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE

Esercitazioni di Fondamenti di Informatica - Lez /12/2018

UNIVERSITÀ DEGLI STUDI DI MILANO. Bioinformatica. A.A semestre I. Allineamento veloce (euristiche)

Problema. Scrivere un programma PHP che prelevato un codice da una FORM verifica se tale codice è un numero.

Programmazione dinamica

Introduzione al MATLAB c Parte 2

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Laboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze Informatiche - Cesena A.A

Avviate l interprete Python selezionandolo dal menu dei programmi. Una volta avviato, l interprete presenta un cursore in cui inserire comandi

INFORMATICA A. Titolo presentazione sottotitolo. Laboratorio n 4 Dott. Michele Zanella Ing. Gian Enrico Conti

MatLab - Testo pagina 1 di 5 101

Prof. Marco Masseroli

LEZIONE 2 SCRATCH: INPUT DEI DATI Laboratorio di Informatica per l Educazione A. A. 2015/ /05/16 1 Dott. Aniello Castiglione

Esercizi C su array e matrici

BLAST. W = word size T = threshold X = elongation S = HSP threshold

A.A. 2018/2019. Esercitazione 3 [Per Casa] Strutturazione del Codice Sorgente per la Risoluzione di Problemi mediante MATLAB

RICORSIONE, PUNTATORI E ARRAY. Quarto Laboratorio

Corso di Perfezionamento

Informatica B. Facoltà di Ingegneria Industriale Laurea in Ingegneria Energetica, Meccanica e dei Trasporti. Prof. Marco Masseroli

Introduzione all ambiente MATLAB. Richiami II. Analisi Numerica - A.A. 2007/08

Matlab : le basi. Vediamo ora un esercizio di calcolo: Il volume di una sfera è dato da V=4*π*r 3 /3 dove r è il raggio.

Breve introduzione al linguaggio R

Informatica B - A.A. 2018/2019

Algoritmi su Matrici. int const R=40; int const C=8; int A[R][C]; int n=32; int m=5; Compito Studente N O

SAGA: sequence alignment by genetic algorithm. ALESSANDRO PIETRELLI Soft Computing

Vettori e Matrici. Vettori. Vettori e matrici: dati. Vettori di caratteri Polinomi. Dimensione (Size) numero di righe e di colonne della matrice

Nozioni fondamentali su Algoritmi e programmazione

Informatica Generale Andrea Corradini Algoritmi: ordinamento per inserimento e ricorsione

Rango di una matrice e teorema di Rouché-Capelli

Fondamenti di Informatica A.A. 2016/17

Laboratorio Programmazione Anno Lezione 3

q xi Modelli probabilis-ci Lanciando un dado abbiamo sei parametri p i >0;

Microsoft Excel II parte Import di dati & Funzioni predefinite

Come scrivere bene codice? (1 di 1)

Laboratorio di Python

Transcript:

Docente: Matteo Re UNIVERSITÀ DEGLI STUDI DI MILANO C.d.l. Informatica Bioinformatica A.A. 2013-2014 semestre I p3 Programmazione dinamica I

Programmazione dinamica in PERL Implementazione di un algoritmo che utilizzi tecniche di programmazione dinamica Utilizzo di matrici Utilizzo di array associativi Controllo di flusso : IF Controllo di flusso : WHILE Biologia computazionale Analisi e manipolazione di biosequenze (allineamento) Implementazione algoritmo Smith-Waterman Obiettivi

Linee guida Il livello di complessità di questa esercitazione è medio Cercate di risolvere il problema dopo averlo suddiviso in sottoproblemi Indipendentemente dal fatto che lo script Perl funzioni o meno l esercizio NON verrà valutato se, insieme allo script, non verrà inviato anche lo pseudocodice. Modalità di svolgimento dell esercitazione: Scaricare dal sito web del corso il file SW_exercise.pl Questo script è incompleto La posizione delle parti da aggiungere è evidenziata da questo commento: ########### description # FILL IN ################## description: descrizione dell operazione da svolgere Alcune operazioni sono indicate con OPT esse riguardano, principalmente, operazioni che servono per migliorare l output dello script e che lo rendono più leggibile. Sono parti opzionali. Se le realizzate avrete dei punti in più per la soluzione dell esercizio.

Sequenze >gi 40457238 HIV-1 isolate 97KE128 from Kenya gag gene, partial cds CTTTTGAATGCATGGGTAAAAGTAATAGAAGAAAGAGGTTTCAGTCCAGAAGTAATACCCATGTTCTCAG CATTATCAGAAGGAGCCACCCCACAAGATTTAAATACGATGCTGAACATAGTGGGGGGACACCAGGCAGC TATGCAAATGCTAAAGGATACCATCAATGAGGAAGCTGCAGAATGGGACAGGTTACATCCAGTACATGCA GGGCCTATTCCGCCAGGCCAGATGAGAGAACCAAGGGGAAGTGACATAGCAGGAACTACTAGTACCCCTC AAGAACAAGTAGGATGGATGACAAACAATCCACCTATCCCAGTGGGAGACATCTATAAAAGATGGATCAT CCTGGGCTTAAATAAAATAGTAAGAATGTATAGCCCTGTTAGCATTTTGGACATAAAACAAGGGCCAAAA GAACCCTTTAGAGACTATGTAGATAGGTTCTTTAAAACTCTCAGAGCCGAACAAGCTT In questa esercitazione NON leggeremo le sequenze da file FASTA. Vogliamo utilizzare sequenze corte in modo da avere un output facilmente interpretabile. Passeremo quindi le sequenze allo script direttamente dalla linea di comando. Le sequenze che utilizzeremo sono le seguenti (in questo ordine): AAUGCCAUUGACGG CAGCCUCGCUUAG

Risultato ( pg.1 ) perl SW_exercise.pl AAUGCCAUUGACGG CAGCCUCGCUUAG SEQUENCE 1 : AAUGCCAUUGACGG LENGTH: 14 SEQUENCE 2 : CAGCCUCGCUUAG LENGTH: 13 DYNAMIC PROGRAMMING MATRICES: I) Scores: A A U G C C A U U G A C G G C 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 A 1.0 1.0 0.0 0.0 0.0 0.7 2.0 0.7 0.0 0.0 1.0 0.0 0.7 0.0 G 0.0 0.7 0.7 1.0 0.0 0.0 0.7 1.7 0.3 1.0 0.0 0.7 1.0 1.7 C 0.0 0.0 0.3 0.3 2.0 1.0 0.0 0.3 1.3 0.0 0.7 1.0 0.3 0.7 C 0.0 0.0 0.0 0.0 1.3 3.0 1.7 0.3 0.0 1.0 0.0 1.7 0.7 0.0 U 0.0 0.0 1.0 0.0 0.0 1.7 2.7 2.7 1.3 0.0 0.7 0.3 1.3 0.3 C 0.0 0.0 0.0 0.7 1.0 1.0 1.3 2.3 2.3 1.0 0.0 1.7 0.3 1.0 G 0.0 0.0 0.0 1.0 0.3 0.7 0.7 1.0 2.0 3.3 2.0 0.7 2.7 1.3 C 0.0 0.0 0.0 0.0 2.0 1.3 0.3 0.3 0.7 2.0 3.0 3.0 1.7 2.3 U 0.0 0.0 1.0 0.0 0.7 1.7 1.0 1.3 1.3 0.7 1.7 2.7 2.7 1.3 U 0.0 0.0 1.0 0.7 0.0 0.3 1.3 2.0 2.3 1.0 0.3 1.3 2.3 2.3 A 1.0 1.0 0.0 0.7 0.3 0.0 1.3 1.0 1.7 2.0 2.0 0.7 1.0 2.0 G 0.0 0.7 0.7 1.0 0.3 0.0 0.0 1.0 0.7 2.7 1.7 1.7 1.7 2.0 Continua

Risultato ( pg.2 ) II) Pointers: Continua A A U G C C A U U G A C G G C * * * * d d * * * * * d * * A d d * * * d d * * * d * d * G * d d d * * u d l d * d d d C * * d d d d * u d l d d d d C * * * d d d l l u d * d d d U * * d * u u d d l l d u d d C * * * d d d d d d d * d l d G * * * d d d d d d d l l d d C * * * * d d d d d u d d l d U * * d * u d d d d u d d d d U * * d d * u d d d d u d d d A d d * d d * d d d d d l d d G * d d d d d u d d d d d d d Max score = 3.3 column: 10 (G) row: 8 (G) Alignment: GCCAUUG. GCC-UCG NB: questo è un esempio di output prodotto da uno script in cui sono state implementate anche le parti opzionali! Output minimo: GCCAUUG GCC-UCG

Pseudocodice ( alto livello ) 1 Leggi sequenza1 (m caratteri) 2 Leggi sequenza2 (n caratteri) 3 Imposta schema di scoring (score match/mismatch e gap) 4 Crea matrice M ( n+1 righe, m+1 colonne) 5 Imposta M[0][0] = 0 6 Imposta celle prima riga di M = 0 7 Imposta celle prima colonna di M = 0 8 Compilazione matrice M 9 Traceback (costruzione allineamento) 10 Stampa allineamento Parti da realizzare

Pseudocodice ( alto livello ) 1 Leggi sequenza1 (m caratteri) 2 Leggi sequenza2 (n caratteri) 3 Imposta schema di scoring (score match/mismatch e gap) 4 Crea matrice M ( n+1 righe, m+1 colonne) 5 Imposta M[0][0] = 0 6 Imposta celle prima riga di M = 0 7 Imposta celle prima colonna di M = 0 8 Compilazione matrice M 9 Traceback (costruzione allineamento) 10 Stampa allineamento Parti da realizzare

Step 1-7 : Perl # usage statement die "usage: $0 <sequence 1> <sequence 2>\n" unless @ARGV == 2; 1 2 3 # get sequences from command line $seq1 = shift; $seq2 = shift; # scoring scheme my $MATCH = 1; # +1 for letters that match my $MISMATCH = -(1/3); # - (1/3) for letters that mismatch my $GAP = -(4/3); # - (1 + 1/3) for any gap 4 5 6 7 # initialization my @matrix; $matrix[0][0]{score = 0; $matrix[0][0]{pointer = "*"; for(my $j = 1; $j <= length($seq1); $j++) { $matrix[0][$j]{score = 0; $matrix[0][$j]{pointer = "*"; for (my $i = 1; $i <= length($seq2); $i++) { $matrix[$i][0]{score = 0; $matrix[$i][0]{pointer = "*"; NB: nelle celle della matrice NON salviamo degli scalari usiamo invece un HASH. In questo modo possiamo salvare sia i valori della matrice degli score che i puntatori

Step 8: Compilazione Matrice E realizzata attraverso due cicli, uno dentro all altro. Il ciclo esterno attraversa le RIGHE della matrice mentre il ciclo interno attraversa le COLONNE. i j for(my $i = 1; $i <= length($seq2); $i++) { for(my $j = 1; $j <= length($seq1); $j++) {

Step 8: Compilazione Matrice Mentre attraversiamo la matrice dobbiamo svolgere 3 operazioni: for(my $i = 1; $i <= length($seq2); $i++) { for(my $j = 1; $j <= length($seq1); $j++) { P S E U D O C O D E Calcolare lo score da inserire nella cella corrente (score di una cella preesistente + score per match/mismatch o gap ) Salvare un puntatore (UP (u), LEFT (l) o DIAGONAL (d) ) che ci ricordi quale score abbiamo utilizzato come base per lo score attuale Verificare se il valore che abbiamo calcolato per la cella corrente è il massimo che abbiamo visto finora se è così salviamo la posizione corrente (indice riga, indice colonna)

Step 8: Compilazione Matrice Come calcoliamo i valori da inserire nella matrice H (che sarebbe la variabile @matrix)? I valori della matrice H ij formula: vengono determinati secondo la H i,j = max(h i-1,j-1 + s(a i, b j ), H i-1,j - pgap, H i,j-1 - pgap, 0) NB: s(a i, b j ) rappresenta una funzione che attribuisce uno score al match o al mismatch osservato e pgap è la penalità fissa per i gap. Il fatto che è presente una funzione max() implica che dobbiamo calcolare tutti e tre i possibili valori e poi scegliere il massimo!

Step 8: Compilazione Matrice Calcolare lo score da inserire nella cella corrente (score di una cella preesistente + score per match/mismatch o gap ): PSEUDOCODICE (dichiaraz. variabili): Imposta max_i = 0 Imposta max_j = 0 Imposta max_score = 0 FUORI dai cicli che percorrono la matrice : vogliamo il massimo valore di TUTTA la matrice Imposta diagonal_score = 0 Imposta left_score = 0 Imposta up_score = 0 Imposta lettera1 = simbolo corrente in sequenza1 Imposta lettera2 = simbolo corrente in sequenza2 DENTRO ai cicli che percorrono la matrice : servono per calcolo valore cella

Step 8: Compilazione Matrice Calcolare lo score da inserire nella cella corrente (score di una cella preesistente + score per match/mismatch o gap ): 3 CASI POSSIBILI: 1. match/mismatch 2. gap UP 3. gap LEFT TRUE lettera1 = lettera2? FALSE $diagonal_score = $matrix[$i-1][$j-1]{score + $MATCH?

Step 8: Compilazione Matrice TRUE lettera1 = lettera2? FALSE $diagonal_score = $matrix[$i-1][$j-1]{score + $MATCH? if($letter1 eq $letter2){ TRUE $diagonal_score = $matrix[$i-1][$j-1]{score + $MATCH; else{ FALSE $diagonal_score = #### FILL IN ######

Step 8: Compilazione Matrice 3 CASI POSSIBILI: 1. match/mismatch 2. gap UP 3. gap LEFT # calculate gap scores (unweighted linear mode) $up_score = #### FILL IN ###### $left_score = #### FILL IN ######

Step 8: Compilazione Matrice Ora abbiamo gli score di tutti i casi possibili. Possiamo decidere il valore da assegnare alla cella corrente. H i,j = max(h i-1,j-1 + s(a i, b j ), H i-1,j - pgap, H i,j-1 - pgap, 0) $diagonal_score $up_score $left_score DOBBIAMO SCEGLIERE IL VALORE MASSIMO ( TRA 4 VALORI POSSIBILI)

Step 8: Compilazione Matrice TRUE diag_score <= 0 E up_score <= 0 E left_score <= 0 FALSE Non faccio nulla (per ora ) if($diagonal_score <= 0 and $up_score <= 0 and $left_score <= 0){ $matrix[$i][$j]{score = 0; $matrix[$i][$j]{pointer = * ; next;

Step 8: Compilazione Matrice TRUE diag_score <= 0 E up_score <= 0 E left_score <= 0 FALSE SE IL PROGRAMMA ARRIVA QUI VUOL DIRE CHE ALMENO UNA DELLE TRE VARIABILI è > 0! DEVO SCEGLIERE IL VALORE PIU ALTO. if($diagonal_score <= 0 and $up_score <= 0 and $left_score <= 0){ $matrix[$i][$j]{score = 0; $matrix[$i][$j]{pointer = * ; next;

Step 8: Compilazione Matrice TRUE diag_score >= up_score FALSE TRUE diag_score >= left_score FALSE TRUE up_score >= left_score FALSE {score = $diagonal_score; {pointer= d ; {score = $left_score; {pointer= l ; {score = $left_score; {pointer= l ; {score = $up_score; {pointer= u ;

Step 8: Compilazione Matrice # choose best score if ($diagonal_score >= $up_score) { if ($diagonal_score >= $left_score) { $matrix[$i][$j]{score = ### FILL IN ### $matrix[$i][$j]{pointer = ### FILL IN ### else { ### FILL IN ################## else { if ($up_score >= $left_score) { ### FILL IN ################## else { ### FILL IN ##################

Step 8: Compilazione Matrice Abbiamo salvato nella cella corrente sia lo score che il puntatore alla cella che abbiamo utilizzato come base per lo score vincente. L ultima cosa che resta da fare prima di passare alla cella successiva è verificare se lo score appena salvato è il MASSIMO che abbiamo visto fino a questo momento (se è così salviamo le coordinate della cella ad il valore dello score). # set maximum score if ($matrix[$i][$j]{score > $max_score) { $max_i = $i; $max_j = $j; $max_score = $matrix[$i][$j]{score; NB: ricordatevi che queste sono variabili GLOBALI dichiarate FUORI dai cicli for che attraversano la matrice!

Compilazione Matrice Alla fine dei cicli che attraversano la matrice disponiamo delle seguenti informazioni: Matrice degli score Matrice dei puntatori Valore e coordinate della posizione nella matrice degli score della cella con il punteggio MASSIMO (che identifica il punto di partenza per la costruzione dell allineamento durante la fase di traceback)

Step 9: Traceback E realizzato attraverso un ciclo. Esso parte dalle coordinate della cella con score massimo identificata durante la compilazione della matrice degli score, segue la direzione indicata dai puntatori e termina SE INCONTRA UN PUNTATORE NULLO, che indichiamo con *. max_i * d l max_j d Il ciclo continua FINCHE il valore di puntatore NON E *! E un ciclo WHILE Left => gap nella SECONDA seq. (righe) Up => gap nella PRIMA seq. (colonne)

Step 9: Traceback max_j In questa fase: * Coordinate score massimo ci forniscono il punto di partenza. Primo puntatore nullo incontrato fornisce il punto di arresto. max_i d l d NB: siamo in una struttura BIDIMENSIONALE ma, grazie alla programmazione dinamica ci stiamo muovendo in un UNICA DIMENSIONE (definita dalla serie di puntatori) Left => gap nella SECONDA seq. (righe) Up => gap nella PRIMA seq. (colonne)

Step 9: Traceback costruisci allineamento TRUE pointer ne * FALSE FINE ciclo WHILE Costruiremo gli allineamenti partendo da due stringhe vuote ed aggiungendo un carattere alla volta. Se incontreremo i puntatori up e left aggiungeremo dei gap. Aggiorna posizione cella seguendo il puntatore della cella corrente Se il puntatore nella cella corrente vale d decremento $i (riga) e $j (colonna) di una unità, se vale u decremento solo $i (riga) e se vale l decremento solo $j (colonna). Se non aggiorno $i e $j il ciclo WHILE non finisce MAI.

Step 9: Traceback my $align1 = ""; my $align2 = ""; my $j = $max_j; my $i = $max_i; while (1) { last if $matrix[$i][$j]{pointer eq *"; Ci posizioniamo sulla cella con score massimo START if ($matrix[$i][$j]{pointer eq "d") { $align1.= substr($seq1, $j-1, 1); $align2.= substr($seq2, $i-1, 1); $i--; $j--; elsif ($matrix[$i][$j]{pointer eq "l") { ### FILL IN ######################## elsif ($matrix[$i][$j]{pointer eq "u") { ### FILL IN ######################## Alla fine del ciclo queste variabili contengono l allineamento! Se incontro il puntatore * fine WHILE STOP

Step 10: Stampa allineamento NB: abbiamo costruito le stringhe dell allineamento accodando ad una stringa vuota i caratteri che incontravamo percorrendo l allineamento DALLA FINE AL PUNTO DI PARTENZA! Quindi abbiamo l allineamento ma AL CONTRARIO. $align1 = reverse $align1; $align2 = reverse $align2; print "$align1\n"; print "$align2\n"; OUTPUT GCCAUUG GCC-UCG

Esercizi Rendere lo script funzionante (4 pt) (COMMENTARE IN MANIERA DETTAGLIATA) Modificare lo script in modo da passare come argomenti non solo le sequenze ma anche gli score per match, mismatch e gap (2 pt) Provare ad allineare le sequenze utilizzando questo schema di scoring: match = +1, mismatch = +1/3, gap = 0. Inviate l allineamento ottenuto e commentate le differenze rispetto all allineamento ottenuto con lo schema di scoring utilizzato in questa esercitazione (3 pt) OPZIONALE: aggiungere all output anche la stampa della matrice degli score e la matrice dei puntatori (niente decorazioni solo le matrici) (3 pt) OPZIONALE: Modificare lo script in modo da ottenere un allineamento globale. Suggerimento: cercate nelle slide delle lezioni teoriche sull allineamento ne esiste una che contiene la soluzione! Invece di allineare sequenze nucleotidiche allineate queste sequenze proteiche: HEAGAWGHEE e PAWHEAE. Al posto dei punteggi fissi per match/mismatch leggete I valori da una matrice BLOSUM50 ed utilizzate una penalità per I GAP di -8. (8 pt) cfr. Durbin et al, Biological sequence analysis Pg. 21 HEAGAWGHE-E --P-AW-HEAE