diff --git a/BINF2025_TP3.ipynb b/BINF2025_TP3.ipynb index 61e87c2..6d2d5b7 100644 --- a/BINF2025_TP3.ipynb +++ b/BINF2025_TP3.ipynb @@ -1,481 +1,613 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [], - "authorship_tag": "ABX9TyNSXnqaXAUgZK9rmJ1TWbGo" - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "V09wQ1WIOmgn" + }, + "source": [ + "# BINF TP3 - Algorithmes d'alignement par paire" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "er6CtAyOxC6F" + }, + "source": [ + "Dans ce TP nous allons manipuler les algorithmes d'alignement par paire." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BqEa3BJ1xICM" + }, + "source": [ + "# Exercice 0 - Echauffement" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qqiiq5bcxYvM" + }, + "source": [ + "Q1. Donnez le score de la superposition :\n", + "\n", + "| | |\n", + "| :---: | :---: |\n", + "x | ATGTCATGA---TAC |\n", + "y | AT--CTAAATGTTAC |\n", + "\n", + "\n", + "étant donne le schéma d'évaluation :\n", + "\n", + "| | A | T | G | C |\n", + "| :---: | :---: | :---: | :---: | :---: |\n", + "| **A** | 1 | -1 | -1 | -1 |\n", + "| **T** | -1 | 1 | -1 | -1 |\n", + "| **G** | -1 | -1 | 1 | -1 |\n", + "| **C** | -1 | -1 | -1 | 1 |\n", + "\n", + "et\n", + "\n", + "$\\gamma(g) = 0.5 |g| + 0.5$" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kCJGGGYQ2GNi" + }, + "source": [ + "```markdown\n", + "Le score de la superposition est 1+1-1.5-1.5+1-1-1-1+1-1.5-1.5-1.5+1+1+1=-3.5\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XyhXAhK-2NKJ" + }, + "source": [ + "Q2. Alignez les séquences suivantes avec l'algorithme de Levenshtein : x = ATG et y = ACTG." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "b9iovhyZ2bXw" + }, + "source": [ + "```markdown\n", + "La distance de Levenshtein entre les séquences x=ATG et y=ACTG est 1.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OV_YaQHr2elB" + }, + "source": [ + "Q3.\tAlignez les séquences suivantes avec l'algorithme de Needleman-Wunsch global x = TAT et y = ATGAC en considérant le schéma d'évaluation suivant\n", + "\n", + "| | A | T | G | C |\n", + "| :---: | :---: | :---: | :---: | :---: |\n", + "| **A** | 1 | -0.5 | -0.5 | -0.5 |\n", + "| **T** | -0.5 | 1 | -0.5 | -0.5 |\n", + "| **G** | -0.5 | -0.5 | 1 | -0.5 |\n", + "| **C** | -0.5 | -0.5 | -0.5 | 1 |\n", + "\n", + "et\n", + "\n", + "$\\gamma(g) = 0.5 |g|$\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "g_MrecVs3Nrw" + }, + "source": [ + "```markdown\n", + "Le score d'alignement entre les séquences x=TAT et y=ATGAC est 4.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "y1YF-G6E3Qoo" + }, + "source": [ + "Q4. Alignez les séquences suivantes avec l'algorithme de Smith-Waterman x = TTGG y = ATGAC en utilisant le schéma d'évaluation de la question précédente.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LLMECocb3pgI" + }, + "source": [ + "```markdown\n", + "Le score d'alignement entre les séquences x=TTGG et y=ATGAC est 2.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "46gw0avh3wGw" + }, + "source": [ + "# Exercice 1 : Algorithme de Levenshtein - version récursive" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZKc09Kyg4a6v" + }, + "source": [ + "Q1. Ecrivez une fonction\n", + "\n", + "levenshtein(x: str, y: str) -> int\n", + "\n", + "qui retourne la distance de Levenshtein entre les séquences x et y en utilisant la version récursive de l'algorithme." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "FJR69IEQ4aHv" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 3 7\n" + ] } + ], + "source": [ + "def levenshtein(x: str, y: str) -> int:\n", + " if not x:\n", + " return len(y)\n", + " if not y:\n", + " return len(x)\n", + " if x[-1] == y[-1]:\n", + " cost = 0\n", + " else:\n", + " cost = 1\n", + " return min(levenshtein(x[:-1], y) + 1,levenshtein(x, y[:-1]) + 1,levenshtein(x[:-1], y[:-1]) + cost)\n", + "\n", + "print(levenshtein(\"𝐶𝐶𝐴𝐺\",\"𝐶𝐴\"),\n", + "levenshtein(\"𝐶𝐶𝐺𝑇\",\"𝐶𝐺𝑇𝐶𝐴\"),\n", + "levenshtein(\"𝐴𝑌678264∗\",\"𝑂𝑄870305∗\"))" + ] }, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "# BINF TP3 - Algorithmes d'alignement par paire" - ], - "metadata": { - "id": "V09wQ1WIOmgn" - } - }, - { - "cell_type": "markdown", - "source": [ - "Dans ce TP nous allons manipuler les algorithmes d'alignement par paire." - ], - "metadata": { - "id": "er6CtAyOxC6F" - } - }, - { - "cell_type": "markdown", - "source": [ - "# Exercice 0 - Echauffement" - ], - "metadata": { - "id": "BqEa3BJ1xICM" - } - }, - { - "cell_type": "markdown", - "source": [ - "Q1. Donnez le score de la superposition :\n", - "\n", - "| | |\n", - "| :---: | :---: |\n", - "x | ATGTCATGA---TAC |\n", - "y | AT--CTAAATGTTAC |\n", - "\n", - "\n", - "étant donne le schéma d'évaluation :\n", - "\n", - "| | A | T | G | C |\n", - "| :---: | :---: | :---: | :---: | :---: |\n", - "| **A** | 1 | -1 | -1 | -1 |\n", - "| **T** | -1 | 1 | -1 | -1 |\n", - "| **G** | -1 | -1 | 1 | -1 |\n", - "| **C** | -1 | -1 | -1 | 1 |\n", - "\n", - "et\n", - "\n", - "$\\gamma(g) = 0.5 |g| + 0.5$" - ], - "metadata": { - "id": "qqiiq5bcxYvM" - } - }, - { - "cell_type": "markdown", - "source": [ - "```markdown\n", - "Votre réponse ici\n", - "```" - ], - "metadata": { - "id": "kCJGGGYQ2GNi" - } - }, - { - "cell_type": "markdown", - "source": [ - "Q2. Alignez les séquences suivantes avec l'algorithme de Levenshtein : x = ATG et y = ACTG." - ], - "metadata": { - "id": "XyhXAhK-2NKJ" - } - }, - { - "cell_type": "markdown", - "source": [ - "```markdown\n", - "Votre réponse ici\n", - "```" - ], - "metadata": { - "id": "b9iovhyZ2bXw" - } - }, - { - "cell_type": "markdown", - "source": [ - "Q3.\tAlignez les séquences suivantes avec l'algorithme de Needleman-Wunsch global x = TAT et y = ATGAC en considérant le schéma d'évaluation suivant\n", - "\n", - "| | A | T | G | C |\n", - "| :---: | :---: | :---: | :---: | :---: |\n", - "| **A** | 1 | -0.5 | -0.5 | -0.5 |\n", - "| **T** | -0.5 | 1 | -0.5 | -0.5 |\n", - "| **G** | -0.5 | -0.5 | 1 | -0.5 |\n", - "| **C** | -0.5 | -0.5 | -0.5 | 1 |\n", - "\n", - "et\n", - "\n", - "$\\gamma(g) = 0.5 |g|$\n" - ], - "metadata": { - "id": "OV_YaQHr2elB" - } - }, - { - "cell_type": "markdown", - "source": [ - "```markdown\n", - "Votre réponse ici\n", - "```" - ], - "metadata": { - "id": "g_MrecVs3Nrw" - } - }, - { - "cell_type": "markdown", - "source": [ - "Q4. Alignez les séquences suivantes avec l'algorithme de Smith-Waterman x = TTGG y = ATGAC en utilisant le schéma d'évaluation de la question précédente.\n" - ], - "metadata": { - "id": "y1YF-G6E3Qoo" - } - }, - { - "cell_type": "markdown", - "source": [ - "```markdown\n", - "Votre réponse ici\n", - "```" - ], - "metadata": { - "id": "LLMECocb3pgI" - } - }, - { - "cell_type": "markdown", - "source": [ - "# Exercice 1 : Algorithme de Levenshtein - version récursive" - ], - "metadata": { - "id": "46gw0avh3wGw" - } - }, - { - "cell_type": "markdown", - "source": [ - "Q1. Ecrivez une fonction\n", - "\n", - "levenshtein(x: str, y: str) -> int\n", - "\n", - "qui retourne la distance de Levenshtein entre les séquences x et y en utilisant la version récursive de l'algorithme." - ], - "metadata": { - "id": "ZKc09Kyg4a6v" - } - }, - { - "cell_type": "code", - "source": [ - "#Votre code ici" - ], - "metadata": { - "id": "FJR69IEQ4aHv" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "Q2. Vous pouvez tester votre code sur les exemples suivants:\n", - "\n", - "\n", - "* $L('CCAG', 'CA') = 2$\n", - "* $L('CCGT', 'CGTCA') = 3$\n", - "* $L(AY678264^*, OQ870305^*) = 310$\n", - "\n", - "$^*$ ids genbank de deux sequences." - ], - "metadata": { - "id": "arFVwA6E5NWn" - } - }, - { - "cell_type": "markdown", - "source": [ - "# Exercice 2 : Algorithme de Smith-Waterman - version itérative" - ], - "metadata": { - "id": "erCpfG7O7BV-" - } - }, - { - "cell_type": "markdown", - "source": [ - "Q1. Ecrivez la fonction\n", - "\n", - "sw_fwd(x: str, y: str, cmap: dict, sigma: array, (go, ge): list) -> (array, array)\n", - "\n", - "qui construit les matrices $S$ et $B$ en utilisant l'algorithme de Smith-Waterman pour aligner les séquences x et y suivant le schéma d'évaluation donné par la matrice de substitution $\\Sigma$ et la fonction d'évaluation des trous $\\gamma(n)= g_o + g_e \\times n$. Le dictionnaire cmap donne la position des différents nucléotides dans la matrice $\\Sigma$. La fonction retourne la paire de matrices de score $S$ et de retour $B$." - ], - "metadata": { - "id": "rv2Y78y37IOd" - } - }, - { - "cell_type": "code", - "source": [ - "#Votre code ici" - ], - "metadata": { - "id": "njn3JB0b-WHj" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "Q2. Ecrivez la fonction\n", - "\n", - "sw_bwd(x: str, y: str, S: array, B: array) -> (str, str, float)\n", - "\n", - "qui effectue l'etape de retour de l'algorithme de Smith-Waterman etant donné les séquences $x$ et $y$ et les matrices de score $S$ et de retour $B$. La fonction retourne un tuple contenant les alignements des séquences x et y et le score de l'alignement." - ], - "metadata": { - "id": "55n8mt9U-Wai" - } - }, - { - "cell_type": "code", - "source": [ - "#Votre code ici" - ], - "metadata": { - "id": "ij9JDpBm_UZ7" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "Q3. Vous pouvez tester votre code en utilisant le schéma d'évaluation suivant :" - ], - "metadata": { - "id": "kwmxg2dxAiwS" - } - }, - { - "cell_type": "code", - "source": [ - "cmap = {\"A\": 0, \"T\": 1, \"G\": 2, \"C\": 3}\n", - "m = np.array([[1, -0.5, -0.5, -0.5],\n", - " [-0.5, 1, -0.5, -0.5],\n", - " [-0.5, -0.5, 1, -0.5],\n", - " [-0.5, -0.5, -0.5, 1]])\n", - "go = 0\n", - "ge = 0.5" - ], - "metadata": { - "id": "JUtYRFTBAwwZ" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "* $SW('TCGC', 'CTTAG')$ retourne un score de $1.5$ à la position $(3,5)$ et l'alignement" - ], - "metadata": { - "id": "eMGh4K5aIFxE" - } + { + "cell_type": "markdown", + "metadata": { + "id": "arFVwA6E5NWn" + }, + "source": [ + "Q2. Vous pouvez tester votre code sur les exemples suivants:\n", + "\n", + "\n", + "* $L('CCAG', 'CA') = 2$\n", + "* $L('CCGT', 'CGTCA') = 3$\n", + "* $L(AY678264^*, OQ870305^*) = 310$\n", + "\n", + "$^*$ ids genbank de deux sequences." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "erCpfG7O7BV-" + }, + "source": [ + "# Exercice 2 : Algorithme de Smith-Waterman - version itérative" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rv2Y78y37IOd" + }, + "source": [ + "Q1. Ecrivez la fonction\n", + "\n", + "sw_fwd(x: str, y: str, cmap: dict, sigma: array, (go, ge): list) -> (array, array)\n", + "\n", + "qui construit les matrices $S$ et $B$ en utilisant l'algorithme de Smith-Waterman pour aligner les séquences x et y suivant le schéma d'évaluation donné par la matrice de substitution $\\Sigma$ et la fonction d'évaluation des trous $\\gamma(n)= g_o + g_e \\times n$. Le dictionnaire cmap donne la position des différents nucléotides dans la matrice $\\Sigma$. La fonction retourne la paire de matrices de score $S$ et de retour $B$." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "njn3JB0b-WHj" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "def sw_fwd(x: str, y: str, cmap: dict, sigma: np.ndarray, go:float,ge:float) -> (np.ndarray, np.ndarray):\n", + " m, n = len(x), len(y)\n", + " S = np.zeros((m + 1, n + 1), dtype=float)\n", + " B = np.zeros((m + 1, n + 1), dtype=int)\n", + "\n", + " max_score = 0\n", + "\n", + " for i in range(1, m + 1):\n", + " for j in range(1, n + 1):\n", + " match = S[i - 1][j - 1] + sigma[cmap[x[i - 1]]][cmap[y[j - 1]]]\n", + " delete = max([S[i - k][j] - (go + ge * k) for k in range(1, i + 1)])\n", + " insert = max([S[i][j - l] - (go + ge * l) for l in range(1, j + 1)])\n", + " S[i][j] = max(0, match, delete, insert)\n", + " if S[i][j] == 0:\n", + " B[i][j] = 0\n", + " elif S[i][j] == match:\n", + " B[i][j] = 1\n", + " elif S[i][j] == delete:\n", + " B[i][j] = 2\n", + " else:\n", + " B[i][j] = 3\n", + " if S[i][j] > max_score:\n", + " max_score = S[i][j]\n", + " max_pos = (i, j)\n", + " return S, B, max_pos\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "55n8mt9U-Wai" + }, + "source": [ + "Q2. Ecrivez la fonction\n", + "\n", + "sw_bwd(x: str, y: str, S: array, B: array) -> (str, str, float)\n", + "\n", + "qui effectue l'etape de retour de l'algorithme de Smith-Waterman etant donné les séquences $x$ et $y$ et les matrices de score $S$ et de retour $B$. La fonction retourne un tuple contenant les alignements des séquences x et y et le score de l'alignement." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "id": "ij9JDpBm_UZ7" + }, + "outputs": [], + "source": [ + "def sw_bwd(x: str, y: str, S: np.ndarray, B: np.ndarray) -> (str, str, float):\n", + " max_score = np.max(S)\n", + " max_pos = np.unravel_index(np.argmax(S, axis=None), S.shape)\n", + " i, j = max_pos\n", + " align_x, align_y = [], []\n", + " score = S[i][j]\n", + " while i > 0 and j > 0 and B[i][j] != 0:\n", + " if B[i][j] == 1:\n", + " align_x.append(x[i - 1])\n", + " align_y.append(y[j - 1])\n", + " i -= 1\n", + " j -= 1\n", + " elif B[i][j] == 2:\n", + " align_x.append(x[i - 1])\n", + " align_y.append('-')\n", + " i -= 1\n", + " elif B[i][j] == 3:\n", + " align_x.append('-')\n", + " align_y.append(y[j - 1])\n", + " j -= 1\n", + " align_x.reverse()\n", + " align_y.reverse()\n", + " return ''.join(align_x), ''.join(align_y), score\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kwmxg2dxAiwS" + }, + "source": [ + "Q3. Vous pouvez tester votre code en utilisant le schéma d'évaluation suivant :" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "id": "JUtYRFTBAwwZ" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('TCG', 'TAG', 1.5) (3, 5)\n" + ] + } + ], + "source": [ + "cmap = {\"A\": 0, \"T\": 1, \"G\": 2, \"C\": 3}\n", + "m = np.array([[1, -0.5, -0.5, -0.5],\n", + " [-0.5, 1, -0.5, -0.5],\n", + " [-0.5, -0.5, 1, -0.5],\n", + " [-0.5, -0.5, -0.5, 1]])\n", + "go = 0\n", + "ge = 0.5\n", + "S,B,max_pos =sw_fwd(\"TCGC\",\"CTTAG\",cmap,m,go,ge)\n", + "print(sw_bwd(\"TCGC\",\"CTTAG\",S,B),max_pos)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eMGh4K5aIFxE" + }, + "source": [ + "* $SW('TCGC', 'CTTAG')$ retourne un score de $1.5$ à la position $(3,5)$ et l'alignement" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 60 }, + "id": "joHNwJ9AIf6F", + "outputId": "a9206810-a083-4d86-8b14-38183f1dd80c" + }, + "outputs": [ { - "cell_type": "code", - "source": [ - "HTML(\"
x:TCG
y:TAG
\")" + "data": { + "text/html": [ + "
x:TCG
y:TAG
" ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 60 - }, - "id": "joHNwJ9AIf6F", - "outputId": "a9206810-a083-4d86-8b14-38183f1dd80c" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ], - "text/html": [ - "
x:TCG
y:TAG
" - ] - }, - "metadata": {}, - "execution_count": 18 - } + "text/plain": [ + "" ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import HTML\n", + "HTML(\"
x:TCG
y:TAG
\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "JJlU5yvZI43D" + }, + "source": [ + "* $SW(AY678264^*, OQ870305^*)$ retourne un score de $342.1$ à la position $(708,717)$ et l'alignement" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 80 }, + "id": "HUELvWKMFtIO", + "outputId": "976bab6f-f1fc-4c5a-c69c-8de02fc838d0" + }, + "outputs": [ { - "cell_type": "markdown", - "source": [ - "* $SW(AY678264^*, OQ870305^*)$ retourne un score de $342.1$ à la position $(708,717)$ et l'alignement" - ], - "metadata": { - "id": "JJlU5yvZI43D" - } - }, - { - "cell_type": "code", - "source": [ - "from IPython.display import HTML\n", - "HTML(\"
x:ATGGTGAGCAAGGGCGAGGAGGATAACATGGCCATCATCAAGGAGTTCATGCGCTTCAAGGTGC-A-CATGGAGGGCTCCGTGAACGGCCACGAGTTCGAGATCGAG---GGCGAGGGCGAGGGC--CGCC-CCTACGAGGGCACCCAGACCGC-CAAGCTGAAGGTG-ACCA-AGG---G-TGGCC---CCCT-GCCCTTCGCCT-GGGA-CATCCTGTCC--C--C-T-CAGTTCATGT-A-CGGCT-CCAAGGCCTACGTG-A--AGCAC--C--C--C--G-CCGACATCCCCG-A--CTAC-T--TGAAGCTG-TCCTTC--C--C-----CGA-GG--GCTTCAAGTGGGAGCG-CGTGATGAACTTCGAGGACGGCGGCGTGGTG-ACCG--T-GA-C-CCAGGAC-TC--CTCCCTGCAGGACGGCGAGTTCATCTACAAGGTG---AAGCTGCGCGGCACCAACTTCCCCT-CCGACGGCCCCGTA-ATGCA-GAAGAAGACCATGGGCTG--GGA-GGCCTCCTCCGAGCGGATGTACCCCGAGGA-CGGCGCC-CTGAAGGGCGAGATCAAGCAGA-GGCTGAAGC-TGAAGGACGGCGGCCACTACGACGCTGAGGTCAAGACCACCTACA-AGGCCAAGAAG-CCCGTGCAGCTGCCCGGC-GCCTACAACGTCAACATCAAGT-TG----GA-CATCACCTCCCACAACGAGGA-CTAC-A-C-CA---T-C-G-TGGAACAGTACG-AACGCGCCGAGGGCCGCCACTCCAC-CGGCGGCATGGACGAGCTGTACAAG
y:ATGGTGAGCAAGGGCGAGGA-G----C-T-G--TTCA-C-CGG-GGTGGTGCCCATCCTGGT-CGAGC-TGGACGGCGACGTAAACGGCCACAAGTTC-AG--CGTGTCCGGCGAGGGCGAGGGCGATGCCACCTAC---GGCAAGCTGACC-CTGAAG-TTCATTTGCACCACCGGCAAGCTGCCCGTGCCCTGGCCC-AC-CCTCGTGACCACCCTGACCTACGGCGTGCAGTGC-T-TCAGCCGCTACCCCGACC-ACATGAAGCAGCACGACTTCTTCAAGTCCGCCATGCCCGAAGGCTACGTCCAGGAGC-GCACCATCTTCTTCAAGGACGACGGCAACTACAAGA-CCCGCGCCGAGGTGAAGTTCGAGGGCGACACCCTGGTGAACCGCATCGAGCTGAAGGGCATCGACTTCAAGGAGGACGGC-A--ACATC--C-TGGGGCACAAGCTG-G-AGTA-CAACTACAACAGCC-ACAACGTC-TATAT-CATG--GCCGA-CAA--GCAGAAGAACGG-CA--T-C-A-AGG-TGAACTTC-AAGATC--CGCCAC--AA---C---ATCGAG--GACGGC---AGCGTGCAGCTCGCCGACCACTACCA-GC--A-G--AACACC-CC--CATCGGCGACG--GCCCCGTGCTGCTGCCCGACAACC-ACTACCTGAGCACCCAGTCCGCCCTGAGCAA-A-GACCC-CAACGAGAAGC-GCGATCACATGGTCCTGCTGG---AGTTCGTGAC-CGCC----GCCGGGA-T-CACTC-TCGGCATGGACGAGCTGTACAAG
\")" + "data": { + "text/html": [ + "
x:ATGGTGAGCAAGGGCGAGGAGGATAACATGGCCATCATCAAGGAGTTCATGCGCTTCAAGGTGC-A-CATGGAGGGCTCCGTGAACGGCCACGAGTTCGAGATCGAG---GGCGAGGGCGAGGGC--CGCC-CCTACGAGGGCACCCAGACCGC-CAAGCTGAAGGTG-ACCA-AGG---G-TGGCC---CCCT-GCCCTTCGCCT-GGGA-CATCCTGTCC--C--C-T-CAGTTCATGT-A-CGGCT-CCAAGGCCTACGTG-A--AGCAC--C--C--C--G-CCGACATCCCCG-A--CTAC-T--TGAAGCTG-TCCTTC--C--C-----CGA-GG--GCTTCAAGTGGGAGCG-CGTGATGAACTTCGAGGACGGCGGCGTGGTG-ACCG--T-GA-C-CCAGGAC-TC--CTCCCTGCAGGACGGCGAGTTCATCTACAAGGTG---AAGCTGCGCGGCACCAACTTCCCCT-CCGACGGCCCCGTA-ATGCA-GAAGAAGACCATGGGCTG--GGA-GGCCTCCTCCGAGCGGATGTACCCCGAGGA-CGGCGCC-CTGAAGGGCGAGATCAAGCAGA-GGCTGAAGC-TGAAGGACGGCGGCCACTACGACGCTGAGGTCAAGACCACCTACA-AGGCCAAGAAG-CCCGTGCAGCTGCCCGGC-GCCTACAACGTCAACATCAAGT-TG----GA-CATCACCTCCCACAACGAGGA-CTAC-A-C-CA---T-C-G-TGGAACAGTACG-AACGCGCCGAGGGCCGCCACTCCAC-CGGCGGCATGGACGAGCTGTACAAG
y:ATGGTGAGCAAGGGCGAGGA-G----C-T-G--TTCA-C-CGG-GGTGGTGCCCATCCTGGT-CGAGC-TGGACGGCGACGTAAACGGCCACAAGTTC-AG--CGTGTCCGGCGAGGGCGAGGGCGATGCCACCTAC---GGCAAGCTGACC-CTGAAG-TTCATTTGCACCACCGGCAAGCTGCCCGTGCCCTGGCCC-AC-CCTCGTGACCACCCTGACCTACGGCGTGCAGTGC-T-TCAGCCGCTACCCCGACC-ACATGAAGCAGCACGACTTCTTCAAGTCCGCCATGCCCGAAGGCTACGTCCAGGAGC-GCACCATCTTCTTCAAGGACGACGGCAACTACAAGA-CCCGCGCCGAGGTGAAGTTCGAGGGCGACACCCTGGTGAACCGCATCGAGCTGAAGGGCATCGACTTCAAGGAGGACGGC-A--ACATC--C-TGGGGCACAAGCTG-G-AGTA-CAACTACAACAGCC-ACAACGTC-TATAT-CATG--GCCGA-CAA--GCAGAAGAACGG-CA--T-C-A-AGG-TGAACTTC-AAGATC--CGCCAC--AA---C---ATCGAG--GACGGC---AGCGTGCAGCTCGCCGACCACTACCA-GC--A-G--AACACC-CC--CATCGGCGACG--GCCCCGTGCTGCTGCCCGACAACC-ACTACCTGAGCACCCAGTCCGCCCTGAGCAA-A-GACCC-CAACGAGAAGC-GCGATCACATGGTCCTGCTGG---AGTTCGTGAC-CGCC----GCCGGGA-T-CACTC-TCGGCATGGACGAGCTGTACAAG
" ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 80 - }, - "id": "HUELvWKMFtIO", - "outputId": "976bab6f-f1fc-4c5a-c69c-8de02fc838d0" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "" - ], - "text/html": [ - "
x:ATGGTGAGCAAGGGCGAGGAGGATAACATGGCCATCATCAAGGAGTTCATGCGCTTCAAGGTGC-A-CATGGAGGGCTCCGTGAACGGCCACGAGTTCGAGATCGAG---GGCGAGGGCGAGGGC--CGCC-CCTACGAGGGCACCCAGACCGC-CAAGCTGAAGGTG-ACCA-AGG---G-TGGCC---CCCT-GCCCTTCGCCT-GGGA-CATCCTGTCC--C--C-T-CAGTTCATGT-A-CGGCT-CCAAGGCCTACGTG-A--AGCAC--C--C--C--G-CCGACATCCCCG-A--CTAC-T--TGAAGCTG-TCCTTC--C--C-----CGA-GG--GCTTCAAGTGGGAGCG-CGTGATGAACTTCGAGGACGGCGGCGTGGTG-ACCG--T-GA-C-CCAGGAC-TC--CTCCCTGCAGGACGGCGAGTTCATCTACAAGGTG---AAGCTGCGCGGCACCAACTTCCCCT-CCGACGGCCCCGTA-ATGCA-GAAGAAGACCATGGGCTG--GGA-GGCCTCCTCCGAGCGGATGTACCCCGAGGA-CGGCGCC-CTGAAGGGCGAGATCAAGCAGA-GGCTGAAGC-TGAAGGACGGCGGCCACTACGACGCTGAGGTCAAGACCACCTACA-AGGCCAAGAAG-CCCGTGCAGCTGCCCGGC-GCCTACAACGTCAACATCAAGT-TG----GA-CATCACCTCCCACAACGAGGA-CTAC-A-C-CA---T-C-G-TGGAACAGTACG-AACGCGCCGAGGGCCGCCACTCCAC-CGGCGGCATGGACGAGCTGTACAAG
y:ATGGTGAGCAAGGGCGAGGA-G----C-T-G--TTCA-C-CGG-GGTGGTGCCCATCCTGGT-CGAGC-TGGACGGCGACGTAAACGGCCACAAGTTC-AG--CGTGTCCGGCGAGGGCGAGGGCGATGCCACCTAC---GGCAAGCTGACC-CTGAAG-TTCATTTGCACCACCGGCAAGCTGCCCGTGCCCTGGCCC-AC-CCTCGTGACCACCCTGACCTACGGCGTGCAGTGC-T-TCAGCCGCTACCCCGACC-ACATGAAGCAGCACGACTTCTTCAAGTCCGCCATGCCCGAAGGCTACGTCCAGGAGC-GCACCATCTTCTTCAAGGACGACGGCAACTACAAGA-CCCGCGCCGAGGTGAAGTTCGAGGGCGACACCCTGGTGAACCGCATCGAGCTGAAGGGCATCGACTTCAAGGAGGACGGC-A--ACATC--C-TGGGGCACAAGCTG-G-AGTA-CAACTACAACAGCC-ACAACGTC-TATAT-CATG--GCCGA-CAA--GCAGAAGAACGG-CA--T-C-A-AGG-TGAACTTC-AAGATC--CGCCAC--AA---C---ATCGAG--GACGGC---AGCGTGCAGCTCGCCGACCACTACCA-GC--A-G--AACACC-CC--CATCGGCGACG--GCCCCGTGCTGCTGCCCGACAACC-ACTACCTGAGCACCCAGTCCGCCCTGAGCAA-A-GACCC-CAACGAGAAGC-GCGATCACATGGTCCTGCTGG---AGTTCGTGAC-CGCC----GCCGGGA-T-CACTC-TCGGCATGGACGAGCTGTACAAG
" - ] - }, - "metadata": {}, - "execution_count": 15 - } + "text/plain": [ + "" ] - }, - { - "cell_type": "markdown", - "source": [ - "# Exercice 3 : Distribution des scores d’alignement pour des séquences aléatoires\n", - "\n", - "Pour tester si un alignement reflète une réelle similarité biologique, on va évaluer la distribution des scores d’alignement pour des paires de séquences aléatoires." - ], - "metadata": { - "id": "Q5jVeLfgMMtA" - } - }, - { - "cell_type": "markdown", - "source": [ - "Q1. En considérant deux séquences aléatoires de même taille N, où chaque nucléotide apparaît avec une probabilité uniforme de ¼, calculer le score moyen attendu pour une superposition sans trou dans le cas où une identité vaut +1 et une différence vaut 0." - ], - "metadata": { - "id": "6xyXw0HsMQGf" - } - }, - { - "cell_type": "markdown", - "source": [ - "```markdown\n", - "Votre réponse ici\n", - "```" - ], - "metadata": { - "id": "meF18gt-Mhcn" - } - }, - { - "cell_type": "markdown", - "source": [ - "Q2. La question précédente peut se resoudre analytiquement car on ne considère pas de trou. Pour étendre le résultat precedent à un alignement avec trous, on va se baser sur la simulation de séquences aleatoires.\n", - "\n", - "Générez $R$ paires de séquences aléatoires de tailles $N$ avec des probabilitées uniformes d'apparition de nucléotides $p_A = p_T = p_G = p_C = $ ¼. Affichez sous forme de violinplots les distribution des scores d'alignements entre chaque paire, obtenu par :\n", - " 1. un alignement sans trou (cf. Q1) ;\n", - " 2. un alignement local via Smith-Waterman (utilisez le code de l'exercice précédent)\n", - "\n", - "Utilisez le schéma d'évaluation suivant :" - ], - "metadata": { - "id": "fP5_mHnYMkNI" - } - }, - { - "cell_type": "code", - "source": [ - "rmap = {\"A\": 0, \"T\": 1, \"G\": 2, \"C\": 3}\n", - "sigma = np.array([[1, -0.5, -0.5, -0.5],\n", - " [-0.5, 1, -0.5, -0.5],\n", - " [-0.5, -0.5, 1, -0.5],\n", - " [-0.5, -0.5, -0.5, 1]])\n", - "go =0\n", - "ge = 0.5" - ], - "metadata": { - "id": "akUVqotnOLkH" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "#Votre code ici" - ], - "metadata": { - "id": "UX0afNaqOVZ2" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "Q3. Qu'observez-vous ?" - ], - "metadata": { - "id": "UNn9fUuXO4Le" - } - }, - { - "cell_type": "markdown", - "source": [ - "```markdown\n", - "Votre réponse ici\n", - "```" - ], - "metadata": { - "id": "dSQEl0XXO8IG" - } - }, - { - "cell_type": "markdown", - "source": [ - "Q4. Quelle conclusion peut-on en tirer sur la significativité d'un alignement ?" - ], - "metadata": { - "id": "xHfVXpQhf15n" - } - }, - { - "cell_type": "markdown", - "source": [ - "```markdown\n", - "Votre réponse ici\n", - "```" - ], - "metadata": { - "id": "5KjhEeHDgDns" - } + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import HTML\n", + "HTML(\"
x:ATGGTGAGCAAGGGCGAGGAGGATAACATGGCCATCATCAAGGAGTTCATGCGCTTCAAGGTGC-A-CATGGAGGGCTCCGTGAACGGCCACGAGTTCGAGATCGAG---GGCGAGGGCGAGGGC--CGCC-CCTACGAGGGCACCCAGACCGC-CAAGCTGAAGGTG-ACCA-AGG---G-TGGCC---CCCT-GCCCTTCGCCT-GGGA-CATCCTGTCC--C--C-T-CAGTTCATGT-A-CGGCT-CCAAGGCCTACGTG-A--AGCAC--C--C--C--G-CCGACATCCCCG-A--CTAC-T--TGAAGCTG-TCCTTC--C--C-----CGA-GG--GCTTCAAGTGGGAGCG-CGTGATGAACTTCGAGGACGGCGGCGTGGTG-ACCG--T-GA-C-CCAGGAC-TC--CTCCCTGCAGGACGGCGAGTTCATCTACAAGGTG---AAGCTGCGCGGCACCAACTTCCCCT-CCGACGGCCCCGTA-ATGCA-GAAGAAGACCATGGGCTG--GGA-GGCCTCCTCCGAGCGGATGTACCCCGAGGA-CGGCGCC-CTGAAGGGCGAGATCAAGCAGA-GGCTGAAGC-TGAAGGACGGCGGCCACTACGACGCTGAGGTCAAGACCACCTACA-AGGCCAAGAAG-CCCGTGCAGCTGCCCGGC-GCCTACAACGTCAACATCAAGT-TG----GA-CATCACCTCCCACAACGAGGA-CTAC-A-C-CA---T-C-G-TGGAACAGTACG-AACGCGCCGAGGGCCGCCACTCCAC-CGGCGGCATGGACGAGCTGTACAAG
y:ATGGTGAGCAAGGGCGAGGA-G----C-T-G--TTCA-C-CGG-GGTGGTGCCCATCCTGGT-CGAGC-TGGACGGCGACGTAAACGGCCACAAGTTC-AG--CGTGTCCGGCGAGGGCGAGGGCGATGCCACCTAC---GGCAAGCTGACC-CTGAAG-TTCATTTGCACCACCGGCAAGCTGCCCGTGCCCTGGCCC-AC-CCTCGTGACCACCCTGACCTACGGCGTGCAGTGC-T-TCAGCCGCTACCCCGACC-ACATGAAGCAGCACGACTTCTTCAAGTCCGCCATGCCCGAAGGCTACGTCCAGGAGC-GCACCATCTTCTTCAAGGACGACGGCAACTACAAGA-CCCGCGCCGAGGTGAAGTTCGAGGGCGACACCCTGGTGAACCGCATCGAGCTGAAGGGCATCGACTTCAAGGAGGACGGC-A--ACATC--C-TGGGGCACAAGCTG-G-AGTA-CAACTACAACAGCC-ACAACGTC-TATAT-CATG--GCCGA-CAA--GCAGAAGAACGG-CA--T-C-A-AGG-TGAACTTC-AAGATC--CGCCAC--AA---C---ATCGAG--GACGGC---AGCGTGCAGCTCGCCGACCACTACCA-GC--A-G--AACACC-CC--CATCGGCGACG--GCCCCGTGCTGCTGCCCGACAACC-ACTACCTGAGCACCCAGTCCGCCCTGAGCAA-A-GACCC-CAACGAGAAGC-GCGATCACATGGTCCTGCTGG---AGTTCGTGAC-CGCC----GCCGGGA-T-CACTC-TCGGCATGGACGAGCTGTACAAG
\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q5jVeLfgMMtA" + }, + "source": [ + "# Exercice 3 : Distribution des scores d’alignement pour des séquences aléatoires\n", + "\n", + "Pour tester si un alignement reflète une réelle similarité biologique, on va évaluer la distribution des scores d’alignement pour des paires de séquences aléatoires." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6xyXw0HsMQGf" + }, + "source": [ + "Q1. En considérant deux séquences aléatoires de même taille N, où chaque nucléotide apparaît avec une probabilité uniforme de ¼, calculer le score moyen attendu pour une superposition sans trou dans le cas où une identité vaut +1 et une différence vaut 0." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "meF18gt-Mhcn" + }, + "source": [ + "```markdown\n", + "Pour avoir 1 il faut soit A,A;T,T;C,C;G,G, et P(A,A)=P(T,T)=P(C,C)=P(G,G)=1/4*1/4=1/16\n", + "Donc la proba d'avoir un score de 1 est de 4 * 1/16 = 1/4, c'est le score moyen pour une position.\n", + "Donc le score moyen total est égale à N/4.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fP5_mHnYMkNI" + }, + "source": [ + "Q2. La question précédente peut se resoudre analytiquement car on ne considère pas de trou. Pour étendre le résultat precedent à un alignement avec trous, on va se baser sur la simulation de séquences aleatoires.\n", + "\n", + "Générez $R$ paires de séquences aléatoires de tailles $N$ avec des probabilitées uniformes d'apparition de nucléotides $p_A = p_T = p_G = p_C = $ ¼. Affichez sous forme de violinplots les distribution des scores d'alignements entre chaque paire, obtenu par :\n", + " 1. un alignement sans trou (cf. Q1) ;\n", + " 2. un alignement local via Smith-Waterman (utilisez le code de l'exercice précédent)\n", + "\n", + "Utilisez le schéma d'évaluation suivant :" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "id": "akUVqotnOLkH" + }, + "outputs": [], + "source": [ + "rmap = {\"A\": 0, \"T\": 1, \"G\": 2, \"C\": 3}\n", + "sigma = np.array([[1, -0.5, -0.5, -0.5],\n", + " [-0.5, 1, -0.5, -0.5],\n", + " [-0.5, -0.5, 1, -0.5],\n", + " [-0.5, -0.5, -0.5, 1]])\n", + "go =0\n", + "ge = 0.5" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "id": "UX0afNaqOVZ2" + }, + "outputs": [ + { + "data": { + "image/png": "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X4/yPkmP9BwrMvqeTq/0HtNSbj+97/f0PIePelxOz/XSm+F+9+te77H0SnltVa9e/a59z5kz567XVXreF1evXiUsLOyB0xVdfZx1Op00btyY+fPn895777F69Wr+/vtvtm3bBjz4fZDymLRr1+6ubOPHj0dVVW7cuAHAO++8w4cffshzzz3HokWL2L59Ozt27KBSpUrpeq897DjudDq5efPmA29Di2O7cC9yTpDIFpYsWYLD4XhoW+u6detSt25dHA4HO3fuZOLEifTv3598+fLx8ssvp2tfGVlz5fLly/fdlvLHNeUP339PgH3cxfzy5MlDZGTkXdtTTuLOjHUyAgMDURTlgfczRXBwMIqisHHjxnueI3HntgoVKjB79mxUVWXfvn1MnTqVUaNGYTKZ+OCDD+6b52HXy5s3Lw6Hg8uXL9/3g1/K8xIZGXlXx79Lly7d9bjd6/UQHByMyWRiypQp99zHnbfRpk0b2rRpg8ViYdu2bYwbN45XXnmFiIgIatWqdd+Mdrud69evp/mQdq/n4b/WrFnDpUuXWLduXeroD0B0dPRDr3u/LH///fdd29OT5X5Smg4sX778nr/39fV95Nv+734ABg8eTNu2be95mVKlSmXKvh4mPceK9L6nM3pMSe8xLSVHet/v6X0OH/W4/LDrpTfDnffrzhHFlPfYne58bO88Zv33sU15Ln777bfUUZLHlTdvXjZt2oTT6bxvIeTq4+yBAwfYu3cvU6dOpUuXLqnbT5w48dD8KY/JxIkT79vNNOXLk5Rzh8aOHZvm99euXSMgIOCh+7rzOP5fly5dQqfTERgY+MDb0OLYLtyLjAQJzZ07d45Bgwbh7+9Pr1690nUdDw8PnnzySb799luA1KlpmfWtboqDBw+yd+/eNNtmzpyJr68vVatWBUjtHLVv3740l7uzW1kKg8GQ7mwNGzZM/cB7p+nTp2M2mzOlpXZKx6358+en+cYyLi6ORYsWpblsy5YtUVWVixcvUq1atbt+KlSocNftK4pCpUqV+PLLLwkICEj3FML7XS+lccB333133+umTH+YMWNGmu07duzg8OHDqSfuPkjLli05efIkefLkued9vVe3MIPBQP369Rk/fjzAXR2k7vT0008D8Ouvv6bZPnPmzIdmS/nD/t8PSHd2VsyI+vXrExcXlzrVMMW9OpulV8uWLbl+/ToO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HEuXLoW3tzcUxko4ZX0JRfUFucsCYFsAQZ/zFSSLGSEhIVi2bBn8/f3lLouIiIiowTEEETWyjh07YvHixQgICICirhZOx3dCWVl08xveQ+qSHOhP7YEkrBg8eDDeeustnmJKRERELRZDEJEM2rZti/feew+hoaGQrGboc76WLQipS3Kgy/0eAPDII48gKSkJWm3z3dOIiIiI6GYYgohkYjAYMH/+fISFhUGy1v0ahM43ag2q3wWgMWPGYPbs2VAqlY1aAxEREVFjYwgikpFWq8W8efN+C0IndkFxuaxRjq0sy4MuNw2ALQDNnDkTUnPYv4iIiIjoLjEEEclMq9XijTfeQI8ePSBZTNDnfA3JVH1Pj6moKob+l1RIEBg+fDgDEBERETkUhiCiJkCn02HevHnw9fWFwlQN/YldgKXunhxLMlZBf+K/kKwWDBgwAM888wwDEBERETkUhiCiJsLNzQ1vvvkmWrVqBWXNRejOpAENvZextQ76k7uhqKtF165dkZSUBJVK1bDHICIiImriJCEa+l1W47mdXWGJmovDhw9jzpw5sFqtsDi1hVA03EIFUp0Rylrb/8uHH34ILy+vBuubiIiISE63kw34ETBRE9OnTx/MmDEDS5YsgbKmtMH7VygUePnllxmAiIiIyGExBBE1QQkJCQgJCUFxcXGD9925c2d06NChwfslIiIiai4YgoiaqO7du6N79+5yl0FERETU4nBhBCIiIiIicigMQURERERE5FAYgoiIiIiIyKEwBBERERERkUNhCCIiIiIiIofCEERERERERA6FIYiIiIiIiBwKQxARERERETkUhiAiIiIiInIoDEFERERERORQGIKIiIiIiMihMAQREREREZFDYQgiIiIiIiKHopK7gLshhAAAVFRUyFwJERERERHJ6UomuJIRbqRZh6DKykoAgK+vr8yVEBERERFRU1BZWQk3N7cbXkcStxKVmiir1YqCggK4uLhAkiS5yyGSRUVFBXx9fZGfnw9XV1e5yyEiIhnwtYDINgJUWVkJHx8fKBQ3nvXTrEeCFAoFOnToIHcZRE2Cq6srX/iIiBwcXwvI0d1sBOgKLoxAREREREQOhSGIiIiIiIgcCkMQUTOn1WqRlJQErVYrdylERCQTvhYQ3Z5mvTACERERERHR7eJIEBERERERORSGICIiIiIicigMQURERERE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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } - ] -} \ No newline at end of file + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "R = 10\n", + "N = 10\n", + "\n", + "nucl = ['A', 'T', 'G', 'C']\n", + "probs = [0.25, 0.25, 0.25, 0.25]\n", + "\n", + "def generateRandomSequences(R, N):\n", + " return [(''.join(np.random.choice(nucl, N, p=probs)), ''.join(np.random.choice(nucl, N, p=probs))) for i in range(R)]\n", + "\n", + "def scoreNoGap(x,y):\n", + " return sum(1 for a, b in zip(x,y) if a == b)\n", + "\n", + "rand = generateRandomSequences(R, N)\n", + "nogap = [scoreNoGap(x,y) for x,y in rand]\n", + "\n", + "scores = []\n", + "for x,y in rand:\n", + " S, B, _ = sw_fwd(x,y, rmap, sigma, go, ge)\n", + " _, _, score = sw_bwd(x,y, S, B)\n", + " scores.append(score)\n", + "\n", + "plt.figure(figsize=(10, 5))\n", + "sns.violinplot(data=[nogap, scores], inner='box')\n", + "plt.xticks([0, 1], ['No Gap', 'Smith-Waterman'])\n", + "plt.ylabel(\"Score d'alignement\")\n", + "plt.title(\"Distribution des scores d'alignement pour des séquences aléatoires\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UNn9fUuXO4Le" + }, + "source": [ + "Q3. Qu'observez-vous ?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dSQEl0XXO8IG" + }, + "source": [ + "```markdown\n", + "Le score d'alignement semble plus élevé avec l'alignement Smith-Waterman.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xHfVXpQhf15n" + }, + "source": [ + "Q4. Quelle conclusion peut-on en tirer sur la significativité d'un alignement ?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5KjhEeHDgDns" + }, + "source": [ + "```markdown\n", + "Plus le score d'un alignement est élevé plus la correspondance est proche, et l'alignement Smith-Waterman compare de manière plus pertinentes les données car il se focalise sur les parties les plus similaires.\n", + "```" + ] + } + ], + "metadata": { + "colab": { + "authorship_tag": "ABX9TyNSXnqaXAUgZK9rmJ1TWbGo", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +}