Professional Documents
Culture Documents
HPV Sekvens
HPV Sekvens
HPV Sekvens
1
Læg filerne i en mappe dedikeret til dette projekt. På de fleste computere kan du
højreklikke på linket og vælge “Gem fil som…” eller “Download linket fil”.
Åbn nu hver fil i VScode og se, hvad der er i datafilerne. (Du må ikke ændre dem på
nogen måde, og du må ikke gemme dem efter visning. Hvis VScode spørger dig, om
du vil gemme det, før du lukker, så sig nej.) Hvor mange sekvenser er der i hver fil?
Projektet er opdelt i følgende dele:
1. Beregn ligheden mellem to sekvenser
2. Læs HIV-sekvenserne ind i dit program
3. Vurder ligheden mellem din ukendte HIV-sekvens med hver af HIV-sekvenserne
med kendt undertype.
4. Find den maksimale lighed mellem din ukendte sekvens og sekvenser fra hver
undertype.
5. Identificer HIV-undertypen af din sekvens som undertypen af den sekvens, der
din sekvens minder mest om.
Sørg for at læse hele øvelsen og forstå, hvad du skal gøre, før du begynder!
Jeg har taget den beslutning at skrive denne aflevering nummer to gennem Jubyter Notebook i VS-
code. Dette valgt skyldes, at jeg gerne vil have et mere søgbart resultat til senere brug. Imildertid
kræver dette valg, at jeg først og fremmest opsætter Conda-miljøet bioprog som vi benytter i dette
kursus. Dette metoden hvorpå jeg denne opsætning forekommer er beskrevet i Aflevering 1.
Imildertid før jeg overhovedet går igang med dette projekt, starter jeg med at placerer terminalen
i den korrekte mappe, via cd-kommandoen:
[ ]: cd Desktop/Bioinformatik/Øvelser/Projekter/HPV_sekvens
Da jeg nu både har skiftet kernel i VS-code til bioprog og placeret mig i mappen HPV_sekvens,
hvor alle mine filer til dette projekt er gemt, manlger jeg kun at sikre at de korrekte filer er indlæst.
Derfor importerer jeg disse via import-kommandoen:
[32]: import hivproject
import test_hivproject
2
kode, der sammenligner to sekvenser, så vi kan sammenligne vores HIV-sekvens med
hver af de andre HIV-sekvenser.
Nu da jeg har defineret en funktion, så ønsker jeg at omdanne de indtaget argumenter til lister.
Dette gøres ved hjælp af list-metoden:
[ ]: def sequence_similarity(seq1,seq2):
seq1_list = list(seq1)
seq2_list = list(seq2)
3
Jamen så er jeg klar til at lave min for-løkke. I denne for-løkke benytter jeg range(len(seq1))-
metoden til, at generere de tal, jeg skal benytte til, at indeksere strengen seq1. Efterfølgende
sammenlignes indgangene i de to DNA-sekvenser, og hvis disse er ens (returnerer til True), så
bliver scoren en større. Imidlertid definerer jeg også en score før denne forløkke som værdien 0:
[ ]: def sequence_similarity(seq1,seq2):
seq1_list = list(seq1)
seq2_list = list(seq2)
score = 0
for i in range(len(seq1_list)):
if seq1_list[i] == seq2_list[i]:
score += 1
Til sidst mangler vi kun, at bestemme den brøkdel, hvormed de to sekvenser er ens. For at gøre
dette benytter jeg len-metoden som angiver den samlede længde af vores streng seq1:
[ ]: def sequence_similarity(seq1,seq2):
seq1_list = list(seq1)
seq2_list = list(seq2)
score = 0
for i in range(len(seq1_list)):
if seq1_list[i] == seq2_list[i]:
score += 1
score = score/len(seq1_list)
return score
Nu har jeg endelig defineret en funktion, så lad os teste om denne funktion returnerer resultatet vi
forventer, nemlig 0,75. Derfor starter jeg med at definere de to DNA-sekvenser og køre ovenstående
funktion:
[19]: seq1='AGTC'
seq2='AGTT'
def sequence_similarity(seq1,seq2):
seq1_list = list(seq1)
seq2_list = list(seq2)
score = 0
for i in range(len(seq1_list)):
if seq1_list[i] == seq2_list[i]:
score += 1
score = score/len(seq1_list)
return score
sequence_similarity(seq1, seq2)
[19]: 0.75
Som vi kan se returnerer funktionen værdien 0,75, hvilket var det forventede resultat. Det vil
altså sige at vores funktion fungerer præcis som den skal. Så derfor indsætter jeg denne funktions-
4
definition, sequence_similarity til vores hivproject.py, hvorfor jeg benytter mig af kommandoen
%%writefile -a, som indsætter funktionen i bunden af scriptet:
[3]: %%writefile -a hivproject.py
def sequence_similarity(seq1,seq2):
seq1_list = list(seq1)
seq2_list = list(seq2)
score = 0
for i in range(len(seq1_list)):
if seq1_list[i] == seq2_list[i]:
score += 1
score = score/len(seq1_list)
return score
Appending to hivproject.py
[ ]: A-CT-A
A-CTTA
5
[ ]: seq1[i] == '-' and seq2[i] == '-'
Når din funktion har beregnet både antallet af identiske baser og antallet af juster-
ingskolonner, der ikke begge er ‘-’, kan du få den til at returnere ligheden som forholdet
mellem de to.
For at lave en funktion der beregner antallet af identiske baser når der tages højde for -, starter jeg
igen udfordringen med at lave en “opskrift” på hvorledes jeg ønsker at gribe opgaven an:
1. Definer en funktion med navnet alignment_similarity som tager to argumenter.
2. Omdanne disse to argumenter til lister.
3. Lave en for-løkke, som undersøge om to - er ens ift. positioner. Hvis dette er ens så trækkes
der en fra længden.
4. Hvis de to - ikke er ens, så undersøges der om de to baser er ens. Hvis dette er tilfældet, så
lægges der en til scoren.
5. Til sidst beregnes scoren.
Nå, igen har jeg opskrevet en opskrift på hvorledes jeg ønsker at gribe denne delopgave an. Derfor
starter jeg med at definere en funktion med navnet alignment_similarity, som tager to indput.
Hvorefter jeg definerer længden, som længden af den ene DNA-sekvens via len-metoden samt de-
finerer scoren til at have værdien 0. Derudover benytter jeg list-metoden til at omdanne de to
argumenter til lister:
[ ]: def alignment_similarity(seq1, seq2):
length = len(seq1)
score = 0
seq1_list = list(seq1)
seq2_list = list(seq2)
Herefter opskriver jeg en for-løkke, som tager indgangen i fra den ene DNA-sekvens og undersøger
om denne indgang er lig med samme indgang i fra den anden DNA-sekvens. Hvis dette er tilfældet
trækkes der en fra vores længde:
[ ]: def alignment_similarity(seq1, seq2):
length = len(seq1)
score = 0
seq1_list = list(seq1)
seq2_list = list(seq2)
for i in range(len(seq1_list)):
if seq1_list[i] == '-' and seq2_list[i] == '-':
length -= 1
Hvis dette ikke er tilfældet, så undersøger jeg for om de to indgange i i i DNA-sekvenser har en
ens base. Hvis de har ens base så lægges der en til længden:
[ ]: def alignment_similarity(seq1, seq2):
length = len(seq1)
6
score = 0
seq1_list = list(seq1)
seq2_list = list(seq2)
for i in range(len(seq1_list)):
if seq1_list[i] == '-' and seq2_list[i] == '-':
length -= 1
elif seq1_list[i] == seq2_list[i] and not seq1_list[i] == '-':
score += 1
Til sidst beregnes den endelige score. Det vil sige at brøkdelen af hvor mange baser der er ens, når
der tages højde for - bestemmes:
[20]: def alignment_similarity(seq1, seq2):
length = len(seq1)
score = 0
seq1_list = list(seq1)
seq2_list = list(seq2)
for i in range(len(seq1_list)):
if seq1_list[i] == '-' and seq2_list[i] == '-':
length -= 1
elif seq1_list[i] == seq2_list[i] and not seq1_list[i] == '-':
score += 1
score = score/length
return score
Yay, nu har vi endelig defineret en funktion alignment_similarity som undersøger antallet af ens
baser, når der tages højde for -. Så lad os teste om funktionen også virker. Derfor tager jeg de to
små DNA-sekvenser der er i opgaveformuleringen og definerer disse, samt undersøger om funktionen
også returnerer den korrekte værdi 0,8:
[21]: seq1='A-CT-A'
seq2='A-CTTA'
alignment_similarity(seq1, seq2)
7
[21]: 0.8
Som vi kan se returnere funktionen den korrekte værdi 0,8. Det vil sige at funktionen align-
ment_similarity virker perfekt. Så lad os igen gemme denne funktion i filen hivproject.py:
[5]: %%writefile -a hivproject.py
Appending to hivproject.py
Du kan bruge denne funktion til at læse den ukendte sekvens ind i dit program:
[ ]: unknown_list = read_data('unknown_type.txt')
I dette tilfælde indeholder listen kun den ene ukendte HIV-sekvens i un-
known_type.txt.
Du skal også indlæse de indtastede HIV-sekvenser i dit program. Her er en funktion,
der returnerer en ordbog, hvori nøglerne er undertyper (‘A’, ‘B’, ‘C’ og ‘D’), og hver
værdi er en lister over sekvenser med den undertype:
8
[ ]: def load_typed_sequences():
return {'A': read_data('subtypeA.txt'),
'B': read_data('subtypeB.txt'),
'C': read_data('subtypeC.txt'),
'D': read_data('subtypeD.txt') }
def load_typed_sequences():
return {'A': read_data('subtypeA.txt'),
'B': read_data('subtypeB.txt'),
'C': read_data('subtypeC.txt'),
'D': read_data('subtypeD.txt') }
unknown_list = read_data('unknown_type.txt')
typed_data = load_typed_sequences()
def read_data(file_name):
f = open(file_name)
sequence_list = list()
for line in f:
seq = line.strip()
sequence_list.append(seq)
f.close()
9
return sequence_list
def load_typed_sequences():
return {'A': read_data('subtypeA.txt'),
'B': read_data('subtypeB.txt'),
'C': read_data('subtypeC.txt'),
'D': read_data('subtypeD.txt') }
Appending to hivproject.py
Skal returnere:
[ ]: [0.8553288474061211, 0.8721742704480066,
0.854924397221087, 0.8481709291032696,
0.8498330281159108]
I din funktion skal du definere en liste, som du kan tilføje de ligheder, du beregner
til:
[ ]: similarities = []
Dette er listen over resultater, som din funktion skal returnere. For at beregne lighe-
den mellem din ukendte sekvens og hver af sekvenserne af kendt undertype, kan du
bruge din alignment_similarity-funktion inde i en for-loop.
10
I mit forsøg på at lave en funktion der returnerer en liste over brøkdele for hvor meget min ukendte
DNA-sekvens passer sammen med de allerede kæmpe DNA-sekvenser, starter jeg igen med at
opstille en “opskrift” for hvorledes jeg ønsker at gribe udfordringen an:
1. Definer en funktion ved navnet get_similarities, som tager to inputs, nemlig vores tidligere
defineret kendte DNA-sekvens og vores ukendte DNA-sekvens.
2. Oprette en liste ved navnet similarities.
3. Lave en for-løkke, som tager hver værdi i af de kendte sekvenser og sammenligner dem via
funktionen alignment_similarity med den ukendte DNA-sekvens.
4. Indsætter scoren i en liste.
Nå, men nu har jeg lavet en “opskrift” for hvorledes jeg ønsker at gribe opgaven an, så lad os starte
med at definere funktionen get_similarities der tager to indputs, nemlig den ukendte DNA-sekvens,
som jeg har defineret til unknown_seq og den kendte DNA-sekvens, typed_seq. Derudover opretter
jeg en liste med funktionsnavnet similarities, hvori scorerne for ligheden kan indsættes i:
[ ]: def get_similarities(unknown_seq, typed_seq):
similarities = []
Jamen hvis vi så kigger på vores “opskrift”, så er jeg nået til punktet hvor jeg skal lave en for-
løkke, som tager hver indgang i for vores kendte DNA-sekvens, typed_seq, og sammenligner dette
via funktionen alignment_similarity med den ukendte DNA-sekvens, unknown_seq. Denne score
indsættes efterfølgende i den oprettede liste, similarities, via append-metoden:
[ ]: def get_similarities(unknown_seq, typed_seq):
similarities = []
for i in range(len(typed_seq)):
score = alignment_similarity(unknown_seq, typed_seq[i])
similarities.append(score)
return similarities
Jamen nu har jeg lavet en funktion, som tager hver af vores kendte DNA-sekvenser for HPV-
varianterne og sammenligner disse med vores ukendte DNA-sekvens. Så lad os teste om denne
virker som forventet. Derfor benytter jeg opgavens eksempel således:
[26]: def get_similarities(unknown_seq, typed_seq):
similarities = []
for i in range(len(typed_seq)):
score = alignment_similarity(unknown_seq, typed_seq[i])
similarities.append(score)
return similarities
get_similarities(unknown_list[0], typed_data['A'])
[26]: [0.8553288474061211,
0.8721742704480066,
0.854924397221087,
0.8481709291032696,
11
0.8498330281159108]
Som vi kan se returnerer funktionen de korrekte brøkdele, hvorfor jeg konkluderer at funktionen
get_similarities virker præcis som den skal. Derfor gemmer jeg denne funktion i filen hivproject.py
via _%%writefile -a-kommandoen:
[7]: %%writefile -a hivproject.py
Appending to hivproject.py
For at få det højeste tal i en liste med tal, kan du bruge max-funktionen i Python.
Det fungerer sådan her:
[13]: numbers = [3, 8, 53, 12, 7]
print(max(numbers)) # prints 53
53
For at få den højeste lighed mellem den ukendte sekvens og sekvenser i
typed_data[‘A’]:
12
[12]: subtypeA_similarities = get_similarities(unknown_list[0], typed_data['A'])
subtypeA_max = max(subtypeA_similarities)
For at opskrive en funktion, get_max_similarities der returnerer en ordbog, hvor nøgler er strenge,
der repræsenterer hver undertype (‘A’, ‘B’, ‘C’ og ‘D’), og værdier repræsenterer den maksimale
lighed mellem den ukendte sekvens og sekvenserne af en undertype, laver jeg igen en “opskrift” for
hvorledes jeg ønsker at gribe opgaven an:
1. Definer en funktion get_max_similarities, som tager to inputs, nemlig vores ukendte DNA-
sekvens, og vores kendte DNA-sekvens.
2. Definer en tom ordbog med navnet max_similarities.
3. Laver en for-løkke, som tager for hver nøgle og værdi i vores kendte DNA-sekvens.
4. For-løkken skal via funktionen get_similarities sammenligne hver kendt DNA-sekvens med
vores ukendte DNA-sekvens og indsætte dette i vores ordbog.
Lad os følge “opskriften”, hvorfor jeg starter med at definerer en funktion ved navnet
get_max_similarities som tager to indputs, nemlig vores ukendte DNA-sekvens, unknown_seq,
og vores allerede defineret ordbog med de kendte DNA-sekvenser, data. Derudover opretter en tom
liste med funktionsnavnet max_similarities:
[ ]: def get_max_similarities(unknown_seq, data):
max_similarities = {}
Efterfølgende opretter jeg en for-løkke, som først og fremmest starter med at få vores for-løkke til
at returnere nøgle-værdi parrene via items(). Derudover sammenlignes de kendte DNA-sekvenser
med vores ukendte DNA-sekvens via vores funktion get_similarities, som returnerer den maksi-
male værdi til vores nøgle-værdi par via max-metoden. Til sidst indsættes dette i vores ordbog
max_similarities:
[ ]: def get_max_similarities(unknown_seq, data):
max_similarities = {}
for key, value in data.items():
max_val = max(get_similarities(unknown_seq, value))
max_similarities[key] = max_val
return max_similarities
Nå, igen har jeg defineret en funktion, så lad os teste om denne virker. Derfor tester jeg om vi får
en realistisk ordbog returneret når vi sammenligner vores data med vores ukendte DNA-sekvens:
[27]: def get_max_similarities(unknown_seq, data):
max_similarities = {}
for key, value in data.items():
max_val = max(get_similarities(unknown_seq, value))
max_similarities[key] = max_val
return max_similarities
get_max_similarities(unknown_list[0], typed_data)
13
[27]: {'A': 0.8721742704480066,
'B': 0.8286861234675057,
'C': 0.8232432432432433,
'D': 0.8365436349940816}
Som vi kan se se får vi et meget realistisk output, hvorfor jeg konkludere at funktionen virker som
den skal. Derfor gemmer jeg funktionen i vores arbejdsfil hivproject.py:
[28]: %%writefile -a hivproject.py
Appending to hivproject.py
14
2. Derefter benytter jeg funktionen get_max_similarities til at bestemme brøkdelen hvorledes
vores ukendte DNA-sekvens er ens med de kendte DNA-sekvenser.
3. Den nøgle som har den største værdi af sammenligning returneres.
Så ja, lad os igen starter med at definerer funktionen. Denne gang defineres den predict_subtype,
som tager to argumenter, nemlig vores ukendte DNA-sekvens og vores kendte DNA-sekvenser. I
denne funktion benytter jeg den tidligere defineret funktion get_max_similarities, til at undersøge
den maksimale brøkdel hvormed vores ukendte DNA-sekvens er ens med de kendte DNA-sekvenser:
[ ]: def predict_subtype(unknown_seq, typed_data):
max_similarities = get_max_similarities(unknown_seq, typed_data)
Derefter får jeg via max-metoden vores funktion til at returnere den nøgle som indeholder den
største lighed mellem vores ukendte DNA-sekvens og vores kendte DNA-sekvenser A,B, C og D:
[ ]: def predict_subtype(unknown_seq, typed_data):
max_similarities = get_max_similarities(unknown_seq, typed_data)
the_one = (max(max_similarities, key = max_similarities.get))
return the_one
Nu bliver det spænende. Så lad os se om funktionen virker som forventet. Jeg forventer nemlig at
vores funktion forudsiger at undertypen A har den største lighed med den ukendte DNA-sekvens:
[29]: def predict_subtype(unknown_seq, typed_data):
max_similarities = get_max_similarities(unknown_seq, typed_data)
the_one = (max(max_similarities, key = max_similarities.get))
return the_one
Appending to hivproject.py
Her til aller sidst vil jeg dog teste om funktionerne skrevet i translationproject.py er tilstrækkelige
holdbare. Derfor kører jeg filen test_hivproject.py via !python-kommandoen:
[33]: !python test_hivproject.py
15
Ran 25 tests in 0.079s
OK
Som det kan ses i ovenstående output, er alle mine funktioner holdbare, hvorfor der printes OK.
16