Path: blob/main/latex-templates/templates/biology/enzyme_kinetics.tex
51 views
unlisted
% Enzyme Kinetics Analysis Template1% Topics: Michaelis-Menten kinetics, enzyme inhibition, Lineweaver-Burk plots2% Style: Laboratory report with experimental data analysis34\documentclass[a4paper, 11pt]{article}5\usepackage[utf8]{inputenc}6\usepackage[T1]{fontenc}7\usepackage{amsmath, amssymb}8\usepackage{graphicx}9\usepackage{siunitx}10\usepackage{booktabs}11\usepackage{subcaption}12\usepackage[makestderr]{pythontex}1314% Theorem environments15\newtheorem{definition}{Definition}[section]16\newtheorem{theorem}{Theorem}[section]17\newtheorem{example}{Example}[section]18\newtheorem{remark}{Remark}[section]1920\title{Enzyme Kinetics: Michaelis-Menten Analysis and Inhibition Studies}21\author{Biochemistry Laboratory}22\date{\today}2324\begin{document}25\maketitle2627\begin{abstract}28This laboratory report presents a comprehensive analysis of enzyme kinetics using the29Michaelis-Menten framework and its linearizations. We examine the kinetic parameters30$K_m$ and $V_{max}$ for a model enzyme system, analyze three types of reversible31inhibition (competitive, uncompetitive, and mixed), and compare parameter estimation32methods including Lineweaver-Burk, Eadie-Hofstee, and Hanes-Woolf plots. Computational33analysis demonstrates the determination of inhibition constants and the diagnostic34patterns that distinguish inhibition mechanisms.35\end{abstract}3637\section{Introduction}3839Enzyme kinetics provides fundamental insights into enzyme-catalyzed reactions and their40regulation. The Michaelis-Menten equation forms the cornerstone of enzyme kinetics,41describing the hyperbolic relationship between substrate concentration and reaction velocity.4243\begin{definition}[Michaelis-Menten Equation]44For an enzyme-catalyzed reaction following simple kinetics, the initial velocity $v_0$45as a function of substrate concentration $[S]$ is:46\begin{equation}47v_0 = \frac{V_{max}[S]}{K_m + [S]}48\end{equation}49where $V_{max}$ is the maximum velocity and $K_m$ is the Michaelis constant.50\end{definition}5152\section{Theoretical Framework}5354\subsection{Derivation of the Michaelis-Menten Equation}5556Consider the enzyme-substrate reaction scheme:57\begin{equation}58E + S \underset{k_{-1}}{\stackrel{k_1}{\rightleftharpoons}} ES \stackrel{k_{cat}}{\longrightarrow} E + P59\end{equation}6061\begin{theorem}[Steady-State Approximation]62Under steady-state conditions where $d[ES]/dt = 0$, the Michaelis constant is:63\begin{equation}64K_m = \frac{k_{-1} + k_{cat}}{k_1}65\end{equation}66and represents the substrate concentration at which $v_0 = V_{max}/2$.67\end{theorem}6869\subsection{Enzyme Inhibition}7071\begin{definition}[Inhibition Types]72Reversible inhibitors modify kinetic parameters as follows:73\begin{itemize}74\item \textbf{Competitive}: Inhibitor binds only to free enzyme; $K_m^{app} = K_m(1 + [I]/K_i)$, $V_{max}$ unchanged75\item \textbf{Uncompetitive}: Inhibitor binds only to ES complex; $K_m^{app} = K_m/(1 + [I]/K_i')$, $V_{max}^{app} = V_{max}/(1 + [I]/K_i')$76\item \textbf{Mixed}: Inhibitor binds both E and ES; both $K_m$ and $V_{max}$ affected77\end{itemize}78\end{definition}7980The general rate equation with mixed inhibition:81\begin{equation}82v_0 = \frac{V_{max}[S]}{K_m(1 + [I]/K_i) + [S](1 + [I]/K_i')}83\end{equation}8485\subsection{Linear Transformations}8687\begin{theorem}[Lineweaver-Burk Transformation]88Taking the reciprocal of the Michaelis-Menten equation:89\begin{equation}90\frac{1}{v_0} = \frac{K_m}{V_{max}} \cdot \frac{1}{[S]} + \frac{1}{V_{max}}91\end{equation}92A plot of $1/v_0$ versus $1/[S]$ yields slope $K_m/V_{max}$ and y-intercept $1/V_{max}$.93\end{theorem}9495\begin{remark}[Alternative Linearizations]96Other linearization methods include:97\begin{itemize}98\item \textbf{Eadie-Hofstee}: $v_0 = V_{max} - K_m(v_0/[S])$99\item \textbf{Hanes-Woolf}: $[S]/v_0 = [S]/V_{max} + K_m/V_{max}$100\end{itemize}101\end{remark}102103\section{Computational Analysis}104105\begin{pycode}106import numpy as np107import matplotlib.pyplot as plt108from scipy.optimize import curve_fit109from scipy.stats import linregress110111np.random.seed(42)112113def michaelis_menten(S, Vmax, Km):114return (Vmax * S) / (Km + S)115116def competitive_inhibition(S, Vmax, Km, I, Ki):117Km_app = Km * (1 + I / Ki)118return (Vmax * S) / (Km_app + S)119120def uncompetitive_inhibition(S, Vmax, Km, I, Ki_prime):121factor = 1 + I / Ki_prime122return (Vmax * S) / (Km / factor + S * factor)123124def mixed_inhibition(S, Vmax, Km, I, Ki, Ki_prime):125return (Vmax * S) / (Km * (1 + I / Ki) + S * (1 + I / Ki_prime))126127# True kinetic parameters128Vmax_true = 100.0129Km_true = 50.0130Ki_true = 25.0131Ki_prime_true = 40.0132133# Substrate concentrations134S_conc = np.array([5, 10, 20, 30, 50, 75, 100, 150, 200, 300])135136# Generate experimental data with noise137noise_level = 0.05138v_no_inhibitor = michaelis_menten(S_conc, Vmax_true, Km_true)139v_no_inhibitor_exp = v_no_inhibitor * (1 + noise_level * np.random.randn(len(S_conc)))140141# Inhibitor concentrations142I_conc = np.array([0, 25, 50, 100])143144# Generate data for different inhibition types145v_competitive = {}146v_uncompetitive = {}147v_mixed = {}148149for I in I_conc:150v_comp = competitive_inhibition(S_conc, Vmax_true, Km_true, I, Ki_true)151v_uncomp = uncompetitive_inhibition(S_conc, Vmax_true, Km_true, I, Ki_prime_true)152v_mix = mixed_inhibition(S_conc, Vmax_true, Km_true, I, Ki_true, Ki_prime_true)153v_competitive[I] = v_comp * (1 + noise_level * np.random.randn(len(S_conc)))154v_uncompetitive[I] = v_uncomp * (1 + noise_level * np.random.randn(len(S_conc)))155v_mixed[I] = v_mix * (1 + noise_level * np.random.randn(len(S_conc)))156157# Fit Michaelis-Menten to uninhibited data158popt_mm, pcov_mm = curve_fit(michaelis_menten, S_conc, v_no_inhibitor_exp, p0=[100, 50])159Vmax_fit, Km_fit = popt_mm160161# Lineweaver-Burk analysis162inv_S = 1 / S_conc163inv_v = 1 / v_no_inhibitor_exp164slope_lb, intercept_lb, r_lb, p_lb, se_lb = linregress(inv_S, inv_v)165Vmax_lb = 1 / intercept_lb166Km_lb = slope_lb * Vmax_lb167168# Eadie-Hofstee analysis169v_over_S = v_no_inhibitor_exp / S_conc170slope_eh, intercept_eh, r_eh, p_eh, se_eh = linregress(v_over_S, v_no_inhibitor_exp)171Vmax_eh = intercept_eh172Km_eh = -slope_eh173174# Hanes-Woolf analysis175S_over_v = S_conc / v_no_inhibitor_exp176slope_hw, intercept_hw, r_hw, p_hw, se_hw = linregress(S_conc, S_over_v)177Vmax_hw = 1 / slope_hw178Km_hw = intercept_hw * Vmax_hw179180# Calculate apparent Km values for competitive inhibition181Km_app_competitive = {}182for I in I_conc:183if I > 0:184inv_v_inh = 1 / v_competitive[I]185slope_inh, intercept_inh, _, _, _ = linregress(inv_S, inv_v_inh)186Vmax_inh = 1 / intercept_inh187Km_app_competitive[I] = slope_inh * Vmax_inh188189# Estimate Ki from competitive inhibition190if len(Km_app_competitive) > 0:191I_values = np.array(list(Km_app_competitive.keys()))192Km_app_values = np.array(list(Km_app_competitive.values()))193slope_ki, intercept_ki, _, _, _ = linregress(I_values, Km_app_values)194Ki_estimated = Km_fit / slope_ki195196# Create figure197fig = plt.figure(figsize=(14, 12))198199# Plot 1: Michaelis-Menten curve200ax1 = fig.add_subplot(3, 3, 1)201S_fine = np.linspace(0.1, 350, 500)202ax1.scatter(S_conc, v_no_inhibitor_exp, s=60, c='blue', edgecolor='black', label='Experimental')203ax1.plot(S_fine, michaelis_menten(S_fine, Vmax_fit, Km_fit), 'r-', linewidth=2, label='Fitted')204ax1.axhline(y=Vmax_fit, color='gray', linestyle='--', alpha=0.7)205ax1.axhline(y=Vmax_fit/2, color='gray', linestyle=':', alpha=0.7)206ax1.axvline(x=Km_fit, color='gray', linestyle=':', alpha=0.7)207ax1.set_xlabel('[S] (uM)')208ax1.set_ylabel('$v_0$ (umol/min)')209ax1.set_title('Michaelis-Menten Kinetics')210ax1.legend(fontsize=8)211ax1.set_xlim(0, 350)212ax1.set_ylim(0, 120)213214# Plot 2: Lineweaver-Burk plot215ax2 = fig.add_subplot(3, 3, 2)216inv_S_fine = np.linspace(-0.02, 0.22, 100)217ax2.scatter(inv_S, inv_v, s=60, c='blue', edgecolor='black')218ax2.plot(inv_S_fine, slope_lb * inv_S_fine + intercept_lb, 'r-', linewidth=2)219ax2.axhline(y=0, color='black', linewidth=0.5)220ax2.axvline(x=0, color='black', linewidth=0.5)221ax2.set_xlabel('1/[S] (uM$^{-1}$)')222ax2.set_ylabel('1/$v_0$ (min/umol)')223ax2.set_title('Lineweaver-Burk Plot')224ax2.set_xlim(-0.03, 0.22)225226# Plot 3: Competitive inhibition227ax3 = fig.add_subplot(3, 3, 3)228colors = plt.cm.viridis(np.linspace(0, 0.8, len(I_conc)))229for i, I in enumerate(I_conc):230inv_v_comp = 1 / v_competitive[I]231ax3.scatter(inv_S, inv_v_comp, s=40, c=[colors[i]], edgecolor='black')232slope_c, intercept_c, _, _, _ = linregress(inv_S, inv_v_comp)233ax3.plot(inv_S_fine, slope_c * inv_S_fine + intercept_c, color=colors[i],234linewidth=1.5, label=f'[I]={I} uM')235ax3.axhline(y=0, color='black', linewidth=0.5)236ax3.axvline(x=0, color='black', linewidth=0.5)237ax3.set_xlabel('1/[S] (uM$^{-1}$)')238ax3.set_ylabel('1/$v_0$ (min/umol)')239ax3.set_title('Competitive Inhibition')240ax3.legend(fontsize=7, loc='upper left')241242# Plot 4: Uncompetitive inhibition243ax4 = fig.add_subplot(3, 3, 4)244for i, I in enumerate(I_conc):245inv_v_uncomp = 1 / v_uncompetitive[I]246ax4.scatter(inv_S, inv_v_uncomp, s=40, c=[colors[i]], edgecolor='black')247slope_u, intercept_u, _, _, _ = linregress(inv_S, inv_v_uncomp)248ax4.plot(inv_S_fine, slope_u * inv_S_fine + intercept_u, color=colors[i],249linewidth=1.5, label=f'[I]={I} uM')250ax4.axhline(y=0, color='black', linewidth=0.5)251ax4.axvline(x=0, color='black', linewidth=0.5)252ax4.set_xlabel('1/[S] (uM$^{-1}$)')253ax4.set_ylabel('1/$v_0$ (min/umol)')254ax4.set_title('Uncompetitive Inhibition')255ax4.legend(fontsize=7, loc='upper left')256257# Plot 5: Mixed inhibition258ax5 = fig.add_subplot(3, 3, 5)259for i, I in enumerate(I_conc):260inv_v_mix = 1 / v_mixed[I]261ax5.scatter(inv_S, inv_v_mix, s=40, c=[colors[i]], edgecolor='black')262slope_m, intercept_m, _, _, _ = linregress(inv_S, inv_v_mix)263ax5.plot(inv_S_fine, slope_m * inv_S_fine + intercept_m, color=colors[i],264linewidth=1.5, label=f'[I]={I} uM')265ax5.axhline(y=0, color='black', linewidth=0.5)266ax5.axvline(x=0, color='black', linewidth=0.5)267ax5.set_xlabel('1/[S] (uM$^{-1}$)')268ax5.set_ylabel('1/$v_0$ (min/umol)')269ax5.set_title('Mixed Inhibition')270ax5.legend(fontsize=7, loc='upper left')271272# Plot 6: Eadie-Hofstee plot273ax6 = fig.add_subplot(3, 3, 6)274ax6.scatter(v_over_S, v_no_inhibitor_exp, s=60, c='blue', edgecolor='black')275v_over_S_fine = np.linspace(0, 3, 100)276ax6.plot(v_over_S_fine, Vmax_eh - Km_eh * v_over_S_fine, 'r-', linewidth=2)277ax6.set_xlabel('$v_0$/[S] (min$^{-1}$)')278ax6.set_ylabel('$v_0$ (umol/min)')279ax6.set_title('Eadie-Hofstee Plot')280281# Plot 7: Hanes-Woolf plot282ax7 = fig.add_subplot(3, 3, 7)283ax7.scatter(S_conc, S_over_v, s=60, c='blue', edgecolor='black')284S_fine_hw = np.linspace(-50, 350, 100)285ax7.plot(S_fine_hw, slope_hw * S_fine_hw + intercept_hw, 'r-', linewidth=2)286ax7.axhline(y=0, color='black', linewidth=0.5)287ax7.axvline(x=0, color='black', linewidth=0.5)288ax7.set_xlabel('[S] (uM)')289ax7.set_ylabel('[S]/$v_0$ (min)')290ax7.set_title('Hanes-Woolf Plot')291292# Plot 8: Dixon plot293ax8 = fig.add_subplot(3, 3, 8)294S_selected = [20, 50, 100]295colors_dixon = ['blue', 'green', 'red']296for j, S in enumerate(S_selected):297idx = np.where(S_conc == S)[0][0]298inv_v_dixon = [1/v_competitive[I][idx] for I in I_conc]299ax8.scatter(I_conc, inv_v_dixon, s=50, c=colors_dixon[j], edgecolor='black')300slope_d, intercept_d, _, _, _ = linregress(I_conc, inv_v_dixon)301I_fine = np.linspace(-40, 120, 100)302ax8.plot(I_fine, slope_d * I_fine + intercept_d, color=colors_dixon[j],303linewidth=1.5, label=f'[S]={S} uM')304ax8.axhline(y=0, color='black', linewidth=0.5)305ax8.axvline(x=0, color='black', linewidth=0.5)306ax8.set_xlabel('[I] (uM)')307ax8.set_ylabel('1/$v_0$ (min/umol)')308ax8.set_title('Dixon Plot (Competitive)')309ax8.legend(fontsize=8)310311# Plot 9: Method comparison312ax9 = fig.add_subplot(3, 3, 9)313methods = ['NL fit', 'L-B', 'E-H', 'H-W']314Vmax_values = [Vmax_fit, Vmax_lb, Vmax_eh, Vmax_hw]315Km_values = [Km_fit, Km_lb, Km_eh, Km_hw]316x_pos = np.arange(len(methods))317width = 0.35318ax9.bar(x_pos - width/2, Vmax_values, width, label='$V_{max}$', color='steelblue', edgecolor='black')319ax9_twin = ax9.twinx()320ax9_twin.bar(x_pos + width/2, Km_values, width, label='$K_m$', color='coral', edgecolor='black')321ax9.axhline(y=Vmax_true, color='steelblue', linestyle='--', alpha=0.7)322ax9_twin.axhline(y=Km_true, color='coral', linestyle='--', alpha=0.7)323ax9.set_xlabel('Method')324ax9.set_ylabel('$V_{max}$ (umol/min)', color='steelblue')325ax9_twin.set_ylabel('$K_m$ (uM)', color='coral')326ax9.set_xticks(x_pos)327ax9.set_xticklabels(methods, fontsize=9)328ax9.set_title('Parameter Comparison')329330plt.tight_layout()331plt.savefig('enzyme_kinetics_analysis.pdf', dpi=150, bbox_inches='tight')332plt.close()333\end{pycode}334335\begin{figure}[htbp]336\centering337\includegraphics[width=\textwidth]{enzyme_kinetics_analysis.pdf}338\caption{Comprehensive enzyme kinetics analysis: (a) Michaelis-Menten saturation curve;339(b) Lineweaver-Burk plot; (c-e) Inhibition patterns for competitive, uncompetitive, and340mixed inhibition; (f-g) Eadie-Hofstee and Hanes-Woolf linearizations; (h) Dixon plot for341$K_i$ determination; (i) Parameter estimation method comparison.}342\label{fig:kinetics}343\end{figure}344345\section{Results}346347\subsection{Kinetic Parameter Determination}348349\begin{pycode}350print(r"\begin{table}[htbp]")351print(r"\centering")352print(r"\caption{Comparison of Kinetic Parameter Estimation Methods}")353print(r"\begin{tabular}{lcccc}")354print(r"\toprule")355print(r"Method & $V_{max}$ ($\mu$mol/min) & Error (\%) & $K_m$ ($\mu$M) & Error (\%) \\")356print(r"\midrule")357358Vmax_err_fit = abs(Vmax_fit - Vmax_true) / Vmax_true * 100359Km_err_fit = abs(Km_fit - Km_true) / Km_true * 100360Vmax_err_lb = abs(Vmax_lb - Vmax_true) / Vmax_true * 100361Km_err_lb = abs(Km_lb - Km_true) / Km_true * 100362Vmax_err_eh = abs(Vmax_eh - Vmax_true) / Vmax_true * 100363Km_err_eh = abs(Km_eh - Km_true) / Km_true * 100364Vmax_err_hw = abs(Vmax_hw - Vmax_true) / Vmax_true * 100365Km_err_hw = abs(Km_hw - Km_true) / Km_true * 100366367print(f"Non-linear fit & {Vmax_fit:.2f} & {Vmax_err_fit:.2f} & {Km_fit:.2f} & {Km_err_fit:.2f} \\\\")368print(f"Lineweaver-Burk & {Vmax_lb:.2f} & {Vmax_err_lb:.2f} & {Km_lb:.2f} & {Km_err_lb:.2f} \\\\")369print(f"Eadie-Hofstee & {Vmax_eh:.2f} & {Vmax_err_eh:.2f} & {Km_eh:.2f} & {Km_err_eh:.2f} \\\\")370print(f"Hanes-Woolf & {Vmax_hw:.2f} & {Vmax_err_hw:.2f} & {Km_hw:.2f} & {Km_err_hw:.2f} \\\\")371print(r"\midrule")372print(f"True values & {Vmax_true:.2f} & --- & {Km_true:.2f} & --- \\\\")373print(r"\bottomrule")374print(r"\end{tabular}")375print(r"\label{tab:parameters}")376print(r"\end{table}")377\end{pycode}378379\subsection{Inhibition Constants}380381\begin{pycode}382print(r"\begin{table}[htbp]")383print(r"\centering")384print(r"\caption{Apparent Kinetic Parameters Under Competitive Inhibition}")385print(r"\begin{tabular}{cccc}")386print(r"\toprule")387print(r"[I] ($\mu$M) & $K_m^{app}$ ($\mu$M) & $V_{max}^{app}$ ($\mu$mol/min) & $K_i$ ($\mu$M) \\")388print(r"\midrule")389390for I in [25, 50, 100]:391inv_v_c = 1 / v_competitive[I]392slope_c, intercept_c, _, _, _ = linregress(inv_S, inv_v_c)393Vmax_c = 1 / intercept_c394Km_c = slope_c * Vmax_c395Ki_c = I / (Km_c / Km_fit - 1) if Km_c > Km_fit else float('inf')396print(f"{I} & {Km_c:.1f} & {Vmax_c:.1f} & {Ki_c:.1f} \\\\")397398print(r"\midrule")399print(f"True $K_i$ & --- & --- & {Ki_true:.1f} \\\\")400print(r"\bottomrule")401print(r"\end{tabular}")402print(r"\label{tab:inhibition}")403print(r"\end{table}")404\end{pycode}405406\section{Discussion}407408\begin{example}[Distinguishing Inhibition Mechanisms]409The Lineweaver-Burk plots reveal characteristic patterns:410\begin{itemize}411\item \textbf{Competitive}: Lines intersect on the y-axis (unchanged $V_{max}$, increased $K_m^{app}$)412\item \textbf{Uncompetitive}: Parallel lines (proportional decreases in both parameters)413\item \textbf{Mixed}: Lines intersect left of y-axis (both parameters affected)414\end{itemize}415\end{example}416417\begin{remark}[Method Accuracy]418Non-linear regression provides the most accurate parameter estimates because it properly419weights data points. The Lineweaver-Burk plot systematically overweights low-substrate420data where experimental error is highest.421\end{remark}422423\subsection{Catalytic Efficiency}424425\begin{pycode}426kcat = Vmax_fit / 1.0427specificity = kcat / Km_fit428print(f"The catalytic efficiency ($k_{{cat}}/K_m$) is {specificity:.2f} $\\mu$M$^{{-1}}$ min$^{{-1}}$.")429\end{pycode}430431\section{Conclusions}432433This analysis demonstrates the application of Michaelis-Menten kinetics:434\begin{enumerate}435\item Non-linear regression yields $V_{max} = \py{f"{Vmax_fit:.1f}"}$ $\mu$mol/min and $K_m = \py{f"{Km_fit:.1f}"}$ $\mu$M436\item Different inhibition types show diagnostic patterns in double-reciprocal plots437\item The estimated $K_i$ for competitive inhibition agrees with the true value438\item Linear transformations remain useful for visualization despite statistical limitations439\end{enumerate}440441\section*{Further Reading}442443\begin{itemize}444\item Cornish-Bowden, A. \textit{Fundamentals of Enzyme Kinetics}, 4th ed. Wiley-Blackwell, 2012.445\item Bisswanger, H. \textit{Enzyme Kinetics: Principles and Methods}, 3rd ed. Wiley-VCH, 2017.446\end{itemize}447448\end{document}449450451