Analyse av enzymkinetikkdata#

I forrige laboratorieoppgave gjorde dere kinetikkmålinger på enzymet alkalisk fosfatase, som er vist nedenfor.

Hide code cell source
import py3Dmol

d = py3Dmol.view(query="pdb:1ANJ")
d.setStyle({"cartoon": {"color": "spectrum"}})
d.show()

You appear to be running in JupyterLab (or JavaScript failed to load for some other reason). You need to install the 3dmol extension:
jupyter labextension install jupyterlab_3dmol

Du skal nå lære hvordan du kan visualisere og analysere enzymkinetikkdata med Python. Du kan bruke en valgfri editor til å lage programmene som gjør analysen av data fra enzymkinetikklaben, for eksempel Jupyter Notebook. Figurene og resultatene skal brukes i labrapporten. Hvis du står fast, kan du spørre generativ kunstig intelligens (gpt.uio.no) om hjelp. Da kan det være lurt å spesifisere hvilken del av koden du trenger hjelp til ved å lime inn koden og formatet på datafilene dine. Bruk GPT4o som modell. Hvis dette heller ikke hjelper, kan du spørre labansvarlige om hjelp (veiledningstime uka etter laben).

Steg 1: Finne initialhastighetene#

Før vi kan begynne å analysere en Michaelis-Menten-modell for dataene våre, må vi finne initialhastigheten til reaksjonen som en funksjon av substratkonsentrasjonen fra dataene våre av absorbansøkning over tid.

Importere data#

Du har lagret data fra enzymkinetikklaben som separate csv-filer. Fila inneholder to kolonner: tid og absorbans. Vi skal bruke disse dataene til å finne initialhastigheten til reaksjonen som en funksjon av substratkonsentrasjonen.

La oss se på hvordan vi kan lese av fila. Det finnes mange måter å importere filer på i Python. Du kan velge den metoden du er mest komfortabel med. Det enkleste metoden er å bruke read_csv fra pandas-biblioteket:

import pandas as pd

data = pd.read_csv("Absorbans_tid.csv") # Leser fila

tid = data["tid"]
absorbans = data["absorbans"]

Fila du skal lese av, må ligge i samme mappe som programmet som skal analysere og lese fila. Eventuelt kan vi angi filbanen, f.eks. “datafiler/Absorbans_tid.csv”. Vi kan også lese direkte fra internett. Da erstatter du filnavnet med en lenke.

Du skal lese fem filer, en for hver substratkonsentrasjon. Du kan bruke en løkke for å lese alle filene.

Oppgave

Lag et program som leser alle filene og lagrer dataene i lister. Du kan ta utgangspunkt i programmet nedenfor. Prøv selv før du kikker på løsningsforslaget!

import pandas as pd
import matplotlib.pyplot as plt

# Liste over filnavn
data_files = [f"data{i}.csv" for i in range(1, 6)] # Denne lista kan også lages manuelt (["data1.csv", "data2.csv", ...])

# Les og plott data fra alle filer med en løkke som går over alle filnavnene
# Fyll inn koden her

plt.xlabel("Tid (min)")
plt.ylabel("Absorbans")
plt.legend()
plt.grid()
plt.show()

Lineærtilpasning av dataene#

Lineær regresjon betyr å finne et polynom av første grad (en førstegradsfunksjon) som gir minst mulig gjennomsnittlig varians til et sett med datapunkter. Metodene vi skal bruke, benytter minste kvadraters metode for å estimere en slik funksjon. En funksjon som er ganske enkel å bruke til dette, er polyfit fra numpy-biblioteket. Du kjenner kanskje til og med denne funksjonen fra før (f.eks. fra IN-KJM1900). Denne funksjonen utfører polynomregresjon med en vilkårlig grad av polynomet.

Det polyfit-funksjonen derimot ikke kan estimere direkte, er andre typer regresjonsmodeller enn lineære, slik som eksponentialfunksjoner, logaritmefunksjoner eller logistiske funksjoner. Vi skal gjøre en logistisk regresjon seinere, og derfor benytter vi heller en annen funksjon som heter curve_fit fra scipy-biblioteket også når vi skal gjøre lineær regresjon i denne laben. Denne funksjonen returnerer både koeffisientene i regresjonslinja og et mål på hvor godt modellen passer dataene (såkalt kovarians). Det er koeffisientene a og b i uttrykket \(f(x) = ax + b\) som estimeres når vi gjør en linær regresjon.

I curve_fit må vi definere en funksjonsmodell på formen \(f(x, a, b, c, ...)\) som brukes som utgangspunkt for regresjonen. Her skal vi definere en funksjon \(f(x, a, b) = ax + b\).

Nå skal du gjøre en oppgavene/nivåene nedenfor. Velg kun én av nivåene. Dersom du mener du behersker enkel plotting og regresjon med curve_fit, velger du nivå 1. Dersom du er usikker på hvordan dette gjøres, kan du velge nivå 2. Prøv gjerne på nivå 1 før du prøver på nivå 2 - da lærer du enda mer! Du kan laste ned filene fra Canvas og bruke dem i en valgfri editor, som Jupyter Notebook eller Spyder.

Oppgave

  1. Se på programmmet nedenfor og forklar hva det gjør, trinn for trinn.

  2. Hva beskriver variabelen koeff?

  3. Forklar hvordan vi kan plotte originaldataene sammen med regresjonslinja?

import pandas as pd
import numpy as np
import scipy.optimize as opt

data = pd.read_csv("Absorbans_tid.csv")

tid = data["tid"]
absorbans = data["absorbans"]

# Definerer formen på modellen vi ønsker
def modell(x, a, b):
    return a*x + b

koeff, covar = opt.curve_fit(modell, tid, absorbans)
# Finner a og b her
a = koeff[0]
b = koeff[1]

# Beregner funksjonsverdier til den lineære tilpasningen
x = np.linspace(0,35,100) # Nye x-verdier å plotte med
y = a*x + b               # Regresjonsmodellens y-verdier

Håndtering av flere datafiler#

Vi skal nå kombinere de to stegene ovenfor for å analysere alle dataene våre. Vi skal gjøre en lineær regresjon for hver fil og plotte regresjonslinjene sammen med originaldataene.

Oppgave

Prøv å kombinere løkka som leser alle dataene med regresjonen av dataene. Du kan ta utgangspunkt i programmene ovenfor. Prøv selv før du kikker på løsningsforslaget!

Oppgave

Lagre grafen som et høyoppløselig bilde, og lagre dataene dine i en ny csv-fil. Dette kan du gjøre ved å legge til følgende kode nederst i programmet ditt (men før plt.show()):

plt.savefig("initialhastigheter.tiff") # kan også angi oppløsning med f.eks. dpi=500 (500 piksler per tomme)

# Lagrer dataene i en dataframe og skriver dem til en csv-fil
d = {"Hastighet": V0, "Substratkonsentrasjon": S}
df = pd.DataFrame(d)
df.to_csv("Reaksjonshastigheter.csv", index = False)

Steg 2: Finne vmaks og Km#

Michaelis-Menten-modellen#

Vi skal nå plotte og analysere resultatene fra første analyse. Vi skal altså lage et Michaelis-Menten-plott og tilpasse Michaelis-Menten-likningen til verdiene vi fant for initialhastighetene. Vi har lagret substratkonsentrasjonene og de tilhørende initialhastighetene i en .csv-fil (reaksjonshastigheter.csv), og vi skal bruke denne fila videre.

Oppgave

  1. Les av fila som du lagde i forrige program, og skriv ut initialhastighetene og tilhørende substratkonsentrasjoner for å se at du har lest inn fila korrekt.

  2. Plott dataene (gjerne med scatter, slik at du får punkter istedenfor linjer) slik at du får et Michaelis-Menten-plott (husk hvilken form grafen skal ha!). Husk aksetitler med korrekte enheter.

Nå skal vi lage en modellkurve som er basert på Michaelis-Menten-likningen. Denne kan vi definere som en Python-funksjon, slik (på samme måte som du definerte den lineære funksjonen i del 1):

def michaelis_menten(x, Vmax, Km):
    return Vmax*x/(Km + x)

Oppgave

  1. Bruk funksjonen ovenfor og gjør en regresjon av initialhastighetene med curve_fit på samme måte som med den lineære funksjonen (men nå skal du bruke michaelis-menten-funksjonen som regresjonsmodell isteden).

  2. Plott regresjonskurven i samme koordinatsystem som dataene dine.

  3. Modifiser programmet slik at Km får enheten mol/L (M) og Vmax får enheten mol/L/min (M/min) (dette er ikke gjort i løsningsforslaget, så det må du gjøre selv). Ekstinksjonskoeffisienten, ε, til produktet er 18 000 M/cm. Lysveien, l (lengden av kyvetten), er 1 cm.

pH-optimum#

I dette forsøket har du målt absorbansen kun ved start og slutt. Det betyr at du her ikke skal gjøre en kurvetilpassing for å beregne hastigheten, men istedenfor bruke differansen i absorbans og dividere med tiden. Husk å korrigere de siste avlesningsverdiene for fortynningen med Tris (hint: fortynningsfaktor).

Oppgave

Lag et program som plotter en grafisk fremstilling av reaksjonshastigheten som funksjon av pH. Du kan gjøre alle beregninger i programmet. Et hint er å lagre alle dataene dine i arrayer. Dette gjør det enkelt å behandle dataene matematisk, for eksempel for å ta hensuyn til fortynningen med Tris.

Enzymhemming#

For å avgjøre om en hemmer er ikke-konkurrerende eller konkurrerende, kan vi plotte en modell for initalhastigheter med og uten hemmer i samme koordinatsystem. Du kan bruke samme framgangsmåte som i del 1, der du lagde en løkke som gikk igjennom flere filer med data, analyserte og plottet dataene. Vi skal bruke et Michaelis-Menten-plott for å sammenlikne resultatene for et enzym med og uten hemmer. Dersom du vil, kan du også prøve å lage et Lineweaver-Burk-plott.

Oppgave

  1. Bruk programmet du lagde i del 1 for å lage en fil med initialhastigheter med hemmer.

  2. Bruk programmet du lagde i del 2 for å konstruere det samme MM-plottet du lagde ovenfor, og legg til et MM-plott for dataene med hemmer i samme koordinatsystem.

  3. Kjør programmet og forklar formen på grafen. Hva slags type hemmer har vi å gjøre med her?

Rapport#

Rapport

Lagre alle figurer du trenger med savefig-kommandoen og print ut eller lagre alle koeffisientene du har funnet. Bruk gjerne en tabell for å presentere resultatene. Skriv labrapporten din basert på resultatene du har funnet. Du kan bruke malen for labrapporten som ligger på Canvas. Husk å sette riktige enheter på alle verdier og grafer! Her er en veiledning for skriving av rapporten:

  • Forsøk 1: Fremstill initialhastigheten for de forskjellige prøvene uttrykt som absorbansøkning pr. min (= hastigheten) ved å plotte absorbansen som funksjon av tiden. Pass på at punktene du skal bruke for kurvetilpassing, fremdeles er i det lineære området. Gjør en lineærtilpasning for å finne initialhastighetene. Lag en figur som presenterer de eksperimentelle dataene og de tilhørende tilpasningene. Lag deretter en visualisering av initialhastigheten som funksjon av substratkonsentrasjonen, som kan angis som mg PNPP (dinatriumsaltet) i 3,5 ml inkubasjonsblanding (mg/3,5 mL). Dette er Michaelis-Menten-plottet. Gjør en kurvetilpasning i Python for å finne \(v_{maks}\) og \(K_m\). Molekylvekten for dinatriumsaltet av p-nitrofenylfosfat heksahydrat settes lik 371,2 g/mol. Oppgi resultatet for \(K_m\) i mol/L.

  • Forsøk 2: Lag en grafisk fremstilling av reaksjonshastigheten som funksjon av pH. Husk å ta hensyn til fortynning med Tris-buffer.

  • Forsøk 3: Plott absorbansen som funksjon av tiden for hemmet og uhemmet reaksjon. Finn \(K_m\) og \(v_{maks}\), og avgjør hva slags hemmer vi har brukt her.

Dere skal levere inn en individuell rapport som skal inneholde:

  1. Introduksjon: En kort innledning for de fire delforsøkene hvor du skriver teori, bakgrunn og hensikten med forsøkene (ca. 1 side, maks 2)

  2. Metoder: Et kort felles sammendrag av metodene (ca. 1/2 side – for detaljert prosedyre henviser du til laboppgaveteksten).

  3. Resultater: En resultatdel som skal inneholde tabeller (med tabelltekst over tabellen) og grafer (med figurtekst under) av alle forsøkene.

  4. Diskusjon: En kort diskusjon/analyse av resultatene (dette vil vanligvis være lengste del av rapporten).

  5. Utregninger og rådata puttes i appendiks på slutten av rapporten

På Canvas ligger det en rapportmal som beskriver hvordan rapporten burde legges opp med lab 2+3 som eksempel og vurderingsmatrise som brukes for vurdering av rapportene. Dere har 2 forsøk på å få godkjent labrapport. Lever inn rapporten (1 per person) for lab 4 i Canvas senest to uker etter labøvelsen er gjennomført.