정.융.탐

[정.융.탐] Michaelis-Menten 모델 프로세싱으로 구현하기

jimol 2023. 7. 2. 17:20

안녕하세요. 

 

I'm back!!!

6월 정융탐 과제를 하기 위해 돌아온 jimol입니다.

 

 

오늘은 효소반응속도론이 무엇인지,

효소반응속도론 모델 중 하나인 Michaelis-Menten 모델에 대해 알아본 뒤

프로세싱으로 그래프를 시각화해보도록 하겠습니다.

 

 

 

 

효소반응속도론

효소반응속도론(enzyme kinetics)은 효소에 의해 촉매되는 화학 반응의 속도를 연구하는 학문입니다. 

효소는 기질의 반응을 촉진하는 단백질 분자로 효소의 활성부위에 결합하여 효소-기질 복합체 ES를 생성합니다. 

이렇게 생성된 효소-기질 복합체는 효소-산물 복합체로 변환된 뒤 생성물 P로 변환되는 메커니즘을 가진다고 합니다

 

효소의 메커니즘(출처 : wikipedia)

 

 

 

 

Michaelis-Menten 모델

Michaelis-Menten 모델(미카엘리스-멘텐 모델)은 효소 반응 속도를 설명하기 위한 수학적 모델 중 하나입니다.

Michaelis와 Menten은 1913년에 효소 E가 기질 A에 결합하여 효소기질복합체 C를 형성하고

효소E와 생성물 P로 변환되는 모델을 만들었습니다. 

 

 

사진 출처: kias 글- 김재경 교수의 쉽게 배우는 수리생물학

 

이 모델을 통해 기질과 효소의 반응속도가 기질 농도에 의존한다는 것을 기초로하여

기질의 농도, 최대 속도, Michaelis 상수, km을 측정하여 다음과 같은 식으로 속도를 예측할 수 있습니다. 

 

 

미카엘리스-멘텐 식 (자료 출처; 위키피디아.)

 

기질의 농도에 따른 반응 속도를 나타낸 그래프. 미카엘리스-멘텐 방정식에 의해 결정된 값으로 그려진다. (자료 출처: 위키피디아.)

 

 

 

오늘은 각종 효소의 미카엘리스-멘텐 곡선을 프로세싱으로 그려보도록 하겠습니다.

 

 

 

 

우선 알고리즘부터 간단하게 생각해볼게요.

1. km과 kcat을 입력받는다. 

(kcat은 Vmax을 결정하는 상수로 kcat과 km을 곱하면 Vmax가 됩니다.)

2. 미카엘리스-멘텐 식에 대입하여 v값을 계산한다. 

3. 계산한 값을 사용하여 곡선을 그린다. 

 

 

++ 추가로 실제 효소의 km과 kcat을 대입하여 비교해보려고 합니다. 

 

 

 

순서도

 

 

float kcat;
float Km;

void setup() {
  size(400, 400);
  background(255);
  
  // kcat과 Km 값을 입력받음
  kcat = 0.5; // 예시 값, 원하는 값으로 변경 가능
  Km = 0.3;    // 예시 값, 원하는 값으로 변경 가능
  
  // 기질 농도 범위 설정 (예: 0부터 10까지 100개의 값으로 설정)
  float[] S_values = new float[100];
  float interval = 10.0 / 100;
  for (int i = 0; i < 100; i++) {
    S_values[i] = i * interval;
  }
  
  // 반응 속도 계산
  float Vmax = kcat * Km;  // kcat과 Km을 이용하여 Vmax 계산
  float[] reaction_rates = new float[100];
  for (int i = 0; i < 100; i++) {
    reaction_rates[i] = michaelisMentenCurve(S_values[i], Vmax, Km);
  }
  
  // 그래프 그리기
  stroke(0);
  for (int i = 0; i < 99; i++) {
    float x1 = map(S_values[i], 0, 10, 50, width - 50);
    float y1 = map(reaction_rates[i], 0, Vmax, height - 50, 50);
    float x2 = map(S_values[i+1], 0, 10, 50, width - 50);
    float y2 = map(reaction_rates[i+1], 0, Vmax, height - 50, 50);
    line(x1, y1, x2, y2);//계산할걸로 곡선 그리기
  }
  
  // x축 그리기
  fill(0);
  rect(48, height - 50, width - 100, 1);
  textAlign(CENTER);
  textSize(12);
  fill(0);
  text("Substrate Concentration (S)", width/2, height - 20);
  
  // x축 눈금 표시
  for (int i = 0; i <= 10; i++) {
    float x = map(i, 0, 10, 50, width - 50);
    line(x, height - 50, x, height - 40);
    textAlign(CENTER);
    text(i, x, height - 30);
  }
  
  // y축 그리기
  rect(45, 50, 1, height - 100);
  textAlign(CENTER);
  textSize(12);
  fill(0);
  text("Reaction Rate (V)", 45, height/11);
  
  // y축 눈금 표시
  for (int i = 0; i <= Vmax; i += 1) {
    float y = map(i, 0, Vmax, height - 50, 50);
    line(40, y, 50, y);
    textAlign(RIGHT);
    text(i, 35, y); // y축 눈금을 0.1 단위로 표시
  }
  
  //제목 표시
  fill(0);
  textSize(20);
  textAlign(CENTER);
  text("Michaelis-Menten Curve", width/2, 30);
}

float michaelisMentenCurve(float S, float Vmax, float Km) {
  return (Vmax * S) / (Km + S);
}

코드는 다음과 같습니다.'

 

 

km과 kcat값을 참고하였습니다. (출처: kias)

 

pepsin의 km과 kcat을 대입하여 얻은 출력결과

 

 

 

T-RNA synthetase의 km과 kcat을 대입하여 얻은 출력결과

 

 

 

 

코드를 만들면서 어려웠던 점은

각 효소마다 km과 kcat의 값의 단위 차이가 많이 나서 단위를 설정하는 것이었습니다..

 

그리고 단위를 바꾸려고 코드를 수정하는 과정에서 그래프가 정상적으로 그려지지 않아서 

뭐가 잘못되었는지 찾는데에 어려움이 있었어요. 

 

제가 생각한 문제점은 km과 kcat을 곱해서 Vmax를 정하는데

km이 너무 작게 되면 y축에 설정한 단위보다 Vmax가 훨씬 작아져서 눈금의 폭이 그래프를 벗어나 수직으로 꺾이는 그래프가 만들어지더군요... (어휴...)

 

그래서 임의적으로 각 효소의 km값에 10^2 정도 곱해서 그래프를 도출하여 문제를 해결하였습니다. 

 

 

오랜만에 프로세싱을 해보니 1학기 수행평가를 하던 일이 생각이 나네요..

방학 때 여유가 되면 수행평가로 만든 FRAP 프로세싱도 포스팅해보도록 할게요.

 

그럼 안녕!!