Proteinsyntese og mutasjoner

Programmering av livets kode: Fra DNA til RNA til protein

Del 1: Transkripsjon

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" og rna = "": 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). Variabelen i vil telle opp fra 0 til 7.
  • base = dna[i]: Vi bruker indeksen i til å 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 av rna-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: Oslo
Detaljert 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"])?

Del 2: Translasjon

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å posisjon i (f.eks henter rna[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?

Del 3: Full Proteinsyntese & Mutasjoner

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

↓ Transkripsjon

AUGGCGAGGCGGCAG

↓ Translasjon

Met-Ala-Arg-Arg-Gln

Mutert DNA (Endre tekst her!)

↓ Transkripsjon

AUGGCGAGGCGGCAG

↓ Translasjon

Met-Ala-Arg-Arg-Gln

Oppgave: Prøv å skape en taus mutasjon (protein endres ikke), og en enkelt mutasjon som endrer hele proteinet.

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!

Oppgave 1

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?

Oppgave 2

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!

Oppgave 3

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 vil 2 ** 3 utføre regnestykket 2³ som er lik 8.
  • sider ** kast regner ut alle mulige utfall for et myntkast med myntens 2 sider (eks: 2*2*2 kombinasjoner for 3 kast). Helt likt kan vi bruke 2 ** kromosompar for å 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!

Oppgave 1

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.

Oppgave 2

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
Lett 🟢

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.

Medium 🟡

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!

Vanskelig 🔴

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.

Feilsøking 🔍

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"])