install.packages(c("ggplot2", "dplyr", "purrr", "broom"))
#this code allows you to visualize the effects of different Km and Vmax values, which can be useful for questions regarding enzyme kinetics and the effects of different inhibitors. 

# Install and load necessary libraries
library(ggplot2)
library(dplyr)
library(purrr)
library(broom)

michaelis_menten <- function(S, Km, Vmax) {
  (Vmax * S) / (Km + S)
}

# Define substrate concentrations
S <- seq(from = 0.01, to = 100, by = 0.01)

# Define Km and Vmax values for three different enzymes
Km_values <- c(0.1, 0.2, 1)
Vmax_values <- c(10, 10, 10)

df <- data.frame()

for (i in 1:length(Km_values)){
  df <- rbind(df, data.frame(S = S,
                             V = michaelis_menten(S, Km_values[i], Vmax_values[i]),
                             Enzyme = paste("Enzyme", i)))
}

# Set the upper limit for substrate concentrations
S_upper_limit <- 10*max(Km_values)

# Filter out any data where S is greater than the upper limit
df <- df[df$S <= S_upper_limit,]

# Then plot
ggplot(df, aes(x = S, y = V, color = Enzyme)) +
  geom_line() +
  labs(x = "Substrate concentration (S)", y = "Reaction rate (V)", title = "Michaelis-Menten Plot for Three Enzymes") +
  theme_minimal() +
  geom_hline(yintercept = 0, color = "black", size = 1) +
  geom_vline(xintercept = 0, color = "black", size = 1)    


#lineweaver-burk
df <- data.frame()

for (i in 1:length(Km_values)){
  df <- rbind(df, data.frame(S = 1/S,  # take reciprocal of S
                             V = 1/michaelis_menten(S, Km_values[i], Vmax_values[i]),  # take reciprocal of V
                             Enzyme = paste("Enzyme", i)))
}

intercepts <- vector()
extended_df <- df %>% 
  split(.$Enzyme) %>%
  map_df(~{
    model <- lm(V ~ S, data = .)
    intercept <- -coef(model)[1] / coef(model)[2]
    intercepts <<- c(intercepts, intercept)
    data.frame(
      S = seq(min(intercepts), 15, length.out = 1000),
      V = predict(model, newdata = data.frame(S = seq(min(intercepts), 15, length.out = 1000))),
      Enzyme = unique(.$Enzyme)
    )
  }, .id = "Enzyme")

ggplot(extended_df, aes(x = S, y = V, color = Enzyme)) +
  geom_line() +
  labs(x = "1/Substrate concentration (1/S)", y = "1/Reaction rate (1/V)", title = "Extended Lineweaver-Burk Plot for Three Enzymes") +
  theme_minimal() +
  geom_hline(yintercept = 0, color = "black", size = 1) + 
  geom_vline(xintercept = 0, color = "black", size = 1)
LS0tCnRpdGxlOiAiZW56eW1lX2tpbmV0aWNzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKGMoImdncGxvdDIiLCAiZHBseXIiLCAicHVycnIiLCAiYnJvb20iKSkKYGBgCgpgYGB7cn0KI3RoaXMgY29kZSBhbGxvd3MgeW91IHRvIHZpc3VhbGl6ZSB0aGUgZWZmZWN0cyBvZiBkaWZmZXJlbnQgS20gYW5kIFZtYXggdmFsdWVzLCB3aGljaCBjYW4gYmUgdXNlZnVsIGZvciBxdWVzdGlvbnMgcmVnYXJkaW5nIGVuenltZSBraW5ldGljcyBhbmQgdGhlIGVmZmVjdHMgb2YgZGlmZmVyZW50IGluaGliaXRvcnMuIAoKIyBJbnN0YWxsIGFuZCBsb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHB1cnJyKQpsaWJyYXJ5KGJyb29tKQoKbWljaGFlbGlzX21lbnRlbiA8LSBmdW5jdGlvbihTLCBLbSwgVm1heCkgewogIChWbWF4ICogUykgLyAoS20gKyBTKQp9CgojIERlZmluZSBzdWJzdHJhdGUgY29uY2VudHJhdGlvbnMKUyA8LSBzZXEoZnJvbSA9IDAuMDEsIHRvID0gMTAwLCBieSA9IDAuMDEpCgojIERlZmluZSBLbSBhbmQgVm1heCB2YWx1ZXMgZm9yIHRocmVlIGRpZmZlcmVudCBlbnp5bWVzCkttX3ZhbHVlcyA8LSBjKDAuMSwgMC4yLCAxKQpWbWF4X3ZhbHVlcyA8LSBjKDEwLCAxMCwgMTApCgpkZiA8LSBkYXRhLmZyYW1lKCkKCmZvciAoaSBpbiAxOmxlbmd0aChLbV92YWx1ZXMpKXsKICBkZiA8LSByYmluZChkZiwgZGF0YS5mcmFtZShTID0gUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWID0gbWljaGFlbGlzX21lbnRlbihTLCBLbV92YWx1ZXNbaV0sIFZtYXhfdmFsdWVzW2ldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnp5bWUgPSBwYXN0ZSgiRW56eW1lIiwgaSkpKQp9CgojIFNldCB0aGUgdXBwZXIgbGltaXQgZm9yIHN1YnN0cmF0ZSBjb25jZW50cmF0aW9ucwpTX3VwcGVyX2xpbWl0IDwtIDEwKm1heChLbV92YWx1ZXMpCgojIEZpbHRlciBvdXQgYW55IGRhdGEgd2hlcmUgUyBpcyBncmVhdGVyIHRoYW4gdGhlIHVwcGVyIGxpbWl0CmRmIDwtIGRmW2RmJFMgPD0gU191cHBlcl9saW1pdCxdCgojIFRoZW4gcGxvdApnZ3Bsb3QoZGYsIGFlcyh4ID0gUywgeSA9IFYsIGNvbG9yID0gRW56eW1lKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHggPSAiU3Vic3RyYXRlIGNvbmNlbnRyYXRpb24gKFMpIiwgeSA9ICJSZWFjdGlvbiByYXRlIChWKSIsIHRpdGxlID0gIk1pY2hhZWxpcy1NZW50ZW4gUGxvdCBmb3IgVGhyZWUgRW56eW1lcyIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxKSAgICAKCgojbGluZXdlYXZlci1idXJrCmRmIDwtIGRhdGEuZnJhbWUoKQoKZm9yIChpIGluIDE6bGVuZ3RoKEttX3ZhbHVlcykpewogIGRmIDwtIHJiaW5kKGRmLCBkYXRhLmZyYW1lKFMgPSAxL1MsICAjIHRha2UgcmVjaXByb2NhbCBvZiBTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgViA9IDEvbWljaGFlbGlzX21lbnRlbihTLCBLbV92YWx1ZXNbaV0sIFZtYXhfdmFsdWVzW2ldKSwgICMgdGFrZSByZWNpcHJvY2FsIG9mIFYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnp5bWUgPSBwYXN0ZSgiRW56eW1lIiwgaSkpKQp9CgppbnRlcmNlcHRzIDwtIHZlY3RvcigpCmV4dGVuZGVkX2RmIDwtIGRmICU+JSAKICBzcGxpdCguJEVuenltZSkgJT4lCiAgbWFwX2RmKH57CiAgICBtb2RlbCA8LSBsbShWIH4gUywgZGF0YSA9IC4pCiAgICBpbnRlcmNlcHQgPC0gLWNvZWYobW9kZWwpWzFdIC8gY29lZihtb2RlbClbMl0KICAgIGludGVyY2VwdHMgPDwtIGMoaW50ZXJjZXB0cywgaW50ZXJjZXB0KQogICAgZGF0YS5mcmFtZSgKICAgICAgUyA9IHNlcShtaW4oaW50ZXJjZXB0cyksIDE1LCBsZW5ndGgub3V0ID0gMTAwMCksCiAgICAgIFYgPSBwcmVkaWN0KG1vZGVsLCBuZXdkYXRhID0gZGF0YS5mcmFtZShTID0gc2VxKG1pbihpbnRlcmNlcHRzKSwgMTUsIGxlbmd0aC5vdXQgPSAxMDAwKSkpLAogICAgICBFbnp5bWUgPSB1bmlxdWUoLiRFbnp5bWUpCiAgICApCiAgfSwgLmlkID0gIkVuenltZSIpCgpnZ3Bsb3QoZXh0ZW5kZWRfZGYsIGFlcyh4ID0gUywgeSA9IFYsIGNvbG9yID0gRW56eW1lKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHggPSAiMS9TdWJzdHJhdGUgY29uY2VudHJhdGlvbiAoMS9TKSIsIHkgPSAiMS9SZWFjdGlvbiByYXRlICgxL1YpIiwgdGl0bGUgPSAiRXh0ZW5kZWQgTGluZXdlYXZlci1CdXJrIFBsb3QgZm9yIFRocmVlIEVuenltZXMiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxKSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEpCgpgYGAK