A tout hasard :
2 Exercice 1
Les fonctions sont à coder dans le fichier exercice1.py.
1. Écrire la fonction freq_codon(seq: string, codon: string) -> float qui renvoie la frequence (probabilité) du codon codon dans la séquence d’ADN seq. Si la séquence termine
sur un codon « incomplet », il ne sera pas comptabilisé dans le calcul de la probabilité. (Astuce : initialiser une variable x = 0.0 au lieu de x = 0 permet de la considérer comme un
réel et de faire tous les calculs la concernant en flottant). Pour le découpage en codon, on ne
considérera uniquement que le 1er frame de lecture.
freq_codon("GGATTATCGTTA", "TTA")
0.5
freq_codon("","TCT")
0.0
freq_codon("TCTTCTAG", "TCT")
1.0
2. Écrire la fonction what_is_it(seq: string) -> string qui prend en argument une chaîne
de caractère et retourne la chaîne de caractères :
– « DNA »si seq est composée uniquement des caractères A, T, C, G,
– « RNA »si seq est composée uniquement des caractères A, U, C, G,
1 / 4Partiel: Bio-informatique
2012 - 2013
– « Both »si les caractères de seq ne permettent pas de distinguer entre ARN et ADN,
– « None »sinon.
what_is_it("ATCG")
’DNA’
what_is_it("AUCG")
’RNA’
what_is_it("ACCCG")
’Both’
what_is_it("ACGTU")
’None’
3. Écrire la fonction transcript_file(filename: string) -> None qui prend en argument
le chemin vers un fichier ayant le format suivant :
gene1 sequence1
gene2 sequence2
...
genen sequencen
où chaque ligne contient un nom de gène et une séquence séparés par un espace. La fonction
doit afficher avec le même format le nom du gène et la séquence transcrite correspondante.
Par exemple, soit le fichier sequences.txt (présent sur l’intranet) dont le contenu est :
SRlUOp CAGTGCCCATAATTTTGCAGAAGAGCCCCGC
RMschW GGCCTACAGATACATCGCAGGAACGA
hTuplY TTTCTAGGACTACTGAACGTCTTCGCC
btPRtP GACACCCCTTCACATGTGCCGCGTCTGGCGCGA
BFxSpQ TCATGGTACACATACCGGAGTCCCATTG
transcript_file("sequences.txt")
SRlUOp GUCACGGGUAUUAAAACGUCUUCUCGGGGCG
RMschW CCGGAUGUCUAUGUAGCGUCCUUGCU
hTuplY AAAGAUCCUGAUGACUUGCAGAAGCGG
btPRtP CUGUGGGGAAGUGUACACGGCGCAGACCGCGCU
BFxSpQ AGUACCAUGUGUAUGGCCUCAGGGUAAC
3 Exercice 2
Les fonctions sont à coder dans le fichier exercice2.py.
Aligner deux séquences consiste à insérer des trous dans les séquences afin de minimiser le
nombre de discordances (mismatch). Une discordance est soit :
– Une substitution (mutation) où on aligne deux nucléotides différents.
– Un indel (insertion-deletion) où un nucléotide est aligné avec un trou (gap).
Les séquences, une fois alignées, ont forcément la même longueur. Le nombre de total de discordances est la distance d’alignement.
Soit par exemple l’alignement suivant :
AT-ACG
-TTACT
Cet alignement possède 2 indels, 1 substitutions et donc une distance de 3.
1. Écrire la fonction info(x: string, y:string) -> tuple qui à partir de deux séquences
x et y alignées, retourne un couple composée du nombre de substitutions, et du nombre
d’indels.
2 / 4Partiel: Bio-informatique
2012 - 2013
info("ATCG", "A-CT")
(1, 1)
info("A--T", "-CAT")
(0, 3)
2. On souhaite pondérer le côut de substitution par rapport au coût d’indel. Soit a le coût d’une
substitution et b le cout d’un indel. Écrire la fonction distance(x: string, y: string,
a: float, b: float) -> float qui à partir de deux séquences alignées retourne le score
d’alignement en respectant ces pondérations. Vous pouvez bien évidemment utiliser la fonction précédente.
distance("AT-ACG", "-TTACT", 1, 1) # 2*1 + 1*1
3
distance("AT-ACG", "-TTACT", 0.5, 2) # 2*2 + 0.5*1
4.5
3. Plusieurs alogorithmes ont été utilisé pour aligner deux séquences et on souhaite selectionner le meilleur alignement (cet à dire celui avec la plus petite distance). Écrire la fonction select_alignment(alignments: list, a: float, b: float) -> tuple qui à partir d’une liste d’alignements (i.e, une liste de couple (x; y)) selectionne celui avec de distance
minimale en respectant les pondérations a et b. (Astuce : v = infty permet d’initialiser v
à +1.)
Soit par exemple les alignements suivants :
TATA-C-C
T-TAGCGC
-TATAC-C
TTA-GCGC
-TATACC
TTAGCGC
mylist = [ ("TATA-C-C","T-TAGCGC"),("-TATAC-C","TTA-GCGC"), ("-TATACC", "TTAGCGC") ]
select_alignment(mylist, 1, 1)
(’TATA-C-C’, ’T-TAGCGC’)
select_alignment(mylist, 1, 2)
(’-TATACC’, ’TTAGCGC’)
4 Exercice 3
Les fonctions sont à coder dans le fichier exercice3.py. Une entreprise de pharma a mis au
point deux nouveaux tests de dépistage d’une maladie. Les tests ont été menés au sein d’une
population de 5000 personnes tirées au hazard. Les résultats sont sous forme d’un tableau dans le
fichier analysis.csv disponible sur l’intranet. Ce fichier est composée de 4 colonnes séparées par
des espaces :
1. la première colonne est le nom du patient (inutile ici),
2. la seconde est le phénotype du patient, 1 signifie qu’il est malade 0 qu’il est sain,
3. la troisième est le résultat du test A, 1 signifie qu’il a été depisté malade, 0 qu’il a été dépisté
sain,
4. la dernière est le résultat du test B, 1 signigie qu’il a été depisté malade, 0 qu’il a été depisté
sain.
La premier ligne du fichier renseigne les noms de colonnes, elle est donc inutile. Voici un extrait
du fichier :
Patient Type TestA TestB
tkQjKR 0 0 0
RhtpqJ 1 1 1
Ucuqtj 0 0 0
CDRfBD 0 0 0
3 / 4Partiel: Bio-informatique
2012 - 2013
DhhYiE 1 1 0
qsdHba 1 1 0
rwPjIu 1 1 1
gdQnJW 0 0 0
sIaTCo 0 0 1
TQHvVN 0 1 0
SlVoJe 0 1 0
SUPjRm 0 0 1
...
Questions
1. Écrire la fonction analysis(filename: string) -> None est qui affiche les statistiques
suivantes :
– La probabilité que le patient soit sain :
– La probabilité que le patient soit malade :
– La sensibilité du test A :
– La sensibilité du test B :
– Le taux de faux positifs du test A :
– Le taux de faux positifs du test B :
– Le taux de bonne classification du test A :
– Le taux de bonne classification du test B :
(Vous êtes libres d’écrire autant de fonctions annexes que vous le souhaitez).
Test Négatif Test Positif
Patient (négatif) sains TN FP
Patient (positif) malade FN TP
On appelle :
Sensibilité la probabilité que détecter positivement (comme malade) un patient malade :
Sensibilite =
T P
F N + T P
Taux de faux positif la probabilité de détecter positivement (comme malade) un patient
sain.
f pr =
F P
T N + F P
Taux de bonne classification la probabilité de prédire correctement (prédire malade quand
le patient est malade, sain quand le patient est sain).
accuracy =
T N + T P
T N + T P + F N + F P
analysis("analysis.csv")
La probabilité que le patient soit sain: 0.801
La probabilité que le patient soit malade: 0.199
La sensibilité du test A: 0.895477386935
La sensibilité du test B: 0.691457286432
Le taux de faux positifs du test A: 0.398501872659
Le taux de faux positifs du test B: 0.103870162297
Le taux de bonne classification du test A: 0.66
Le taux de bonne classification du test B: 0.8554
2. Quel test vous semble le plus efficace ? Justifiez votre réponse (quel critère vous permet
d’affirmer cela). Que pourrait-on faire pour améliorer la détection ? Répondez à cette question
en utilisant un commentaire python à la fin de votre fichier.