Proteinsyntese og mutasjoner
Programmering av livets kode: Fra DNA til RNA til protein
DNA til RNA
Transkripsjon skjer når DNA kopieres til RNA. Hver base i DNA får sin komplementære base (A → U, T → A, C → G, G → C). I Python kan vi forenkle dette ved hjelp av en for-løkke, bruke indeks for å se på ett og ett tegn (base) ad gangen, og bygge opp en ny tekststreng.
dna = "AATGGCTA"
rna = ""
# Vi går gjennom hver bokstav vha indeks (lengden er 8)
for i in range(len(dna)):
base = dna[i]
if base == "A":
rna += "U"
elif base == "T":
rna += "A"
elif base == "C":
rna += "G"
elif base == "G":
rna += "C"
print("RNA-tråd:", rna)Detaljert forklaring av koden
dna = "AATGGCTA"ogrna = "": Vi oppretter en variabel for DNA-sekvensen vår, og en tom tekststreng som vi skal fylle med RNA.for i in range(len(dna)):Dette er en løkke som går like mange ganger som strengens lengde (8). Variabelenivil telle opp fra 0 til 7.base = dna[i]: Vi bruker indeksenitil å hente ut bokstaven på denne plassen fra DNA-strengen, for eksempel "A".if/elif-setningene: Vi sjekker hvilken base vi har funnet. For hver bokstav legger vi til komplementærbasen på slutten avrna-strengen med+=.print("RNA-tråd:", rna): Til slutt skriver vi ut resultatet.
Sjekk forståelsen (Programmering):
Prøv å endre på koden eller tenk deg frem til hva som skjer
dersom du i stedet har dna = "GCTACG". Hva vil programmet skrive ut
som RNA-tråd for denne sekvensen?
Innføring: Dictionaries i Python
Før vi kan oversette RNA til proteiner trenger vi å lagre en såkalt kodon-tabell. Den forteller oss hvilken kode (f.eks "AUG") som gir hvilken aminosyre (f.eks "Met"). I Python lagrer vi sånne tabeller og oversettelser i noe vi kaller for en dictionary (ordliste).
En dictionary fungerer ved å koble sammen en nøkkel (key) med en verdi (value). Istedenfor å bruke tall-indekser (0, 1, 2) som i arrays/strenger, slår vi opp på en nøkkel.
# Eksempel på en dictionary
hovedsteder = {
"Norge": "Oslo",
"Sverige": "Stockholm",
"Danmark": "København"
}
# For å slå opp verdien til en nøkkel, bruker vi [ ]
print(hovedsteder["Norge"]) # Skriver ut: OsloDetaljert forklaring av koden
hovedsteder = { ... }: Her lages en Dictionary (ordliste). Den kjennetegnes av krøllparenteser."Norge": "Oslo": Hvert element har en nøkkel (før kolonet, f.eks "Norge") og en koblede verdi (etter kolonet, f.eks "Oslo").- Spørringen
hovedsteder["Norge"]gir programmet beskjed om å se etter nøkkelen "Norge" og returnere plassen den hører sammen med, som er "Oslo". Dette er en superrask måte for datamaskiner å slå opp verdier på!
Sjekk forståelsen (Programmering):
Hva vil programmet skrive ut dersom du bruker koden print(hovedsteder["Danmark"])?
RNA til Protein
Ribosomet leser RNA i grupper på tre (kalles kodoner). Hvert kodon tilsvarer en spesifikk aminosyre. Nå som vi kjenner til Dictionaries, kan vi lagre hele kodon-tabellen i en stor ordbok. Vi looper så over strengen med et steg på 3 av gangen og oversetter!
kodontabell = {
"UUA": "Leu", "CUA": "Leu",
"CCU": "Pro", "GAC": "Asp"
# (og mange flere kombinasjoner...)
}
rna = "UUACCUGAC"
protein = ""
# Vi hopper med steg på 3: range(start, stopp, steg)
for i in range(0, len(rna), 3):
kodon = rna[i:i+3]
aminosyre = kodontabell[kodon]
protein += aminosyre + "-"
print("Protein:", protein)Detaljert forklaring av koden
kodontabell = { ... }: Vi lager vår egen biologiske ordliste hvor et mRNA-kodon brukes som nøkkel, og den tilsvarende aminosyren som verdi.range(0, len(rna), 3): I for-løkken starter vi pekeren på indeks 0 og går frem til strengens slutt. Største forskjell fra tidligere er at vi tar "steg" på 3 plasser av gangen (i = 0, 3, 6). Vi leser tre og tre byggeklosser!rna[i:i+3]: Dette kalles avskjæring (slicing) i Python. Den henter ut 3 bokstaver som starter på posisjoni(f.eks henterrna[0:3]ut "UUA"). Det er dette som blir vårt kodon til oppslaget.aminosyre = kodontabell[kodon]: Vi bruker de tre bokstavene vi nettopp klippet ut til å slå opp aminosyren i ordlisten.protein += aminosyre + "-": Skjøter på aminosyren pluss en bindestrek for å bygge et komplett protein (f.eks "Leu-Pro-Asp-").
Sjekk forståelsen (Programmering):
Hvordan slår vi opp aminosyren for kodonet "CCU" i ordlisten kodontabell over?
Interaktiv Simulator
Nedenfor har vi en simulator som kombinerer programmene for transkripsjon og translasjon. Prøv å endre basene i DNA-strengen for å se hva som skjer med kodonene og til slutt proteinet.
Opprinnelig DNA
TAC CGC TCC GCC GTC
AUGGCGAGGCGGCAG
Met-Ala-Arg-Arg-Gln
Mutert DNA (Endre tekst her!)
AUGGCGAGGCGGCAG
Met-Ala-Arg-Arg-Gln
Vil du ha koden?
Her kan du laste ned alle de tre Python-programmene som er vist over i én samlet fil.
Utforsk mutasjoner i egen editor
Åpne filen du lastet ned (proteinsyntese_programmer.py) i din egen Python-editor. Gå ned til "PROGRAM 3: FULL
PROTEINSYNTESE" og bruk koden til å utforske hvordan mutasjoner
påvirker proteinene som lages. Du trenger ikke å forstå all
koden, bare finn linjen hvor test_dna er definert!
Punktmutasjon
Finn linjen test_dna = "TACCGCTCCGCCGTC" helt nederst i filen. Endre den aller første T-en til en A. Kjør
programmet. Hvilken aminosyre (protein) byttes ut?
Taus mutasjon
Prøv å endre én eneste bokstav i test_dna uten
at protein-resultatet (aminosyrene) endres når du kjører
programmet. Husk at flere kodoner kan kode for samme aminosyre.
Bruk kodontabellen i koden for å finne en base du kan bytte
ut!
Leserammemutasjon
Fjern én bokstav fra midten av test_dna (for
eksempel den tredje C-en). Hva skjer med aminosyrene når
du kjører programmet? Hvorfor blir resten av proteinet helt
annerledes?
Programmering: Genetisk variasjon
Hvorfor er vi alle unike? I meiosen (danning av kjønnsceller)
fordeles kromosomparene tilfeldig. Vi kan bruke programmering og
regning med potenser i Python (**) for å beregne
hvor mange mulige kombinasjoner av kromosomer som kan oppstå!
# PROGRAM: GENETISK VARIASJON OG KROMOSOMER
# Eksempel 1: Å kaste en mynt (2 sider) 3 ganger
sider = 2
kast = 3
kombinasjoner_mynt = sider ** kast
print("Kombinasjoner ved 3 myntkast:", kombinasjoner_mynt)
# Eksempel 2: Kromosomer i menneskets kjønnsceller
# Mennesket har 23 par kromosomer. Hvert par kan orientere seg på 2 måter.
kromosompar = 23
kombinasjoner_menneske = 2 ** kromosompar
print("I én kjønnscelle fra et menneske er det:")
print(kombinasjoner_menneske, "mulige kombinasjoner!")
# Eksempel 3: Befruktning (sædcelle møter eggcelle)
# Begge kjønnscellene bidrar med ett av utfallene
befruktning = kombinasjoner_menneske * kombinasjoner_menneske
print("Ved befruktning er antall mulige unike barn:")
print(befruktning)Detaljert forklaring av koden
**er eksponentoperatoren i Python (opphøyd i). Eksempelvis vil2 ** 3utføre regnestykket 2³ som er lik 8.sider ** kastregner ut alle mulige utfall for et myntkast med myntens 2 sider (eks: 2*2*2 kombinasjoner for 3 kast). Helt likt kan vi bruke2 ** kromosomparfor å regne ut konsekvensen av at et kromosompar kan stille seg i 2 forkjellige retninger under meiosen.- Koden regner ut at bare for én forelder lages det 2²³ = 8 388 608 mulige sperm- eller eggceller!
- Når én spermcelle smeller sammen med én eggcelle for
å befrukte, må vi gange kombinasjons-mengden til
disse to sammen (
kombinasjoner_menneske * kombinasjoner_menneske) for å finne mulighetene for et ulikt barn. Resultatet blir over 70 billioner mulige DNA-sammensetninger - som er grunnen til at ingen søsken blir helt like!
Sjekk forståelsen (Programmering):
Hvor mange forskjellige kombinasjoner dannes det dersom du i stedet kaster mynten 5 ganger? Bruk programmets tankegang (eller regn ut) for å finne resultatet!
Bananfluer
Kopier koden over inn i editoren din. En bananflue har
bare 4 par kromosomer. Endre variabelen kromosompar i koden for å regne ut hvor mange unike kombinasjoner av
kromosomer én kjønnscelle fra en bananflue kan ha.
Det unike romvesenet
Tenk deg et hypotetisk romvesen som har hele 50 kromosompar! Skriv om koden for å finne ut hvor mange mulige kombinasjoner dette gir for én kjønnscelle fra romvesenet. Tror du to slike romvesener noensinne kan få identiske barn to ganger (hvis de ikke er eneggede tvillinger)?
Videre Programmeringsoppgaver
Disse oppgavene er frivillige. De er for deg som ønsker å øve litt ekstra på grunnleggende konsepter i Python, som for eksempel indeksering, for-løkker, if-setninger og Dictionaries.
Vis videre oppgaver
Oppgave 1.1: Hent den siste bokstaven
Du har en DNA sekvens dna = "AGTC".
Hvordan kan du printe ut den aller siste bokstaven i
strengen uten å telle manuelt?
- Bruk `len(dna)` minus 1 for indeks
Oppgave 1.2: Loop og print
Skriv en for-løkke som går gjennom `dna
= "CGT"` og printer hver bokstav på en ny linje vha
indeksen.
Oppgave 2.1: Enkel Dictionary
Lag en dictionary kalt komplement hvor nøklene
er "A", "T", "C", "G" og verdiene er deres motparter
for RNA ("U", "A", "G", "C"). Slå opp verdien til "A".
Oppgave 2.2: Kombinert oppslag
Nå har du Dictionarien fra forrige oppgave. Gå igjennom for-løkken du lærte i begynnelsen (over strengen `AGT`), og for hver bokstav, bruk ordboken til å bygge den nye strengen, fremfor alle IF-setningene!
Oppgave 3.1: Stopp-kodonet
Sett at du looper gjennom en rna streng `rna = "UUGCCUUGAGCC"`. Hvis aminosyren fra Dictionary er "Stop", hvordan avslutter du bare selve for-løkken slik at den slutter å bygge proteinet? Tips: keyword i Python.
Oppgave 3.2: Finn mutasjonen
Gitt to strenger `dna1` og `dna2` med lik lengde.
Skriv et program med en `for`-løkke som itererer
over indekser og printer ut posisjonen i til arrayen hvis base på begge disse ikke matcher hverandre.
Oppgave 4.1: Feil Indeksering
Koden feiler med en feilmelding. Hvorfor får vi feil, og hvordan kan man løse det?
dna = "GCA"
siste = dna[3]
print(siste)Oppgave 4.2: Dictionary problemer
Prøver å lage en codon-table og slå opp, men vi får `KeyError` eller SyntaxError. Rett opp feilene:
table = {
UUG : "Leu"
CCU : "Pro"
}
print(table["uug"])