Cyanobacterial crowding-out effects on metabolite partitioning: modeling 2-methylisoborneol (MIB) release dynamics and implications
Supplementary Information
# These authors contributed equally to this work.
a Key Laboratory of Environmental Aquatic Chemistry, State Key Laboratory of Regional Environment and Sustainability, Research Center for Eco-Environmental Sciences, Chinese Academy of Sciences, Beijing 100085, China.
b Bureau of Hydrology Information Center of Taihu Basin Authority, Shanghai 200434, China.
c College of Environmental Science and Engineering, Ocean University of China, Qingdao 266100, China.
d University of Chinese Academy of Sciences, Beijing 100049, China.
* Corresponding to: Ming Su (mingsu@rcees.ac.cn)
12 figures and 3 tables provided below for the evidence of main text.
Supplementary Fig. 1
Supplementary Fig. 2
Supplementary Fig. 3
Supplementary Fig. 4
Supplementary Fig. 5
Supplementary Fig. 6
Supplementary Fig. 7
Supplementary Fig. 8
Supplementary Fig. 9
Supplementary Fig. 10
Supplementary Fig. 11
Supplementary Fig. 12
Supplementary Table 1
| Genus | Strain | Ref. |
|---|---|---|
| Planktothricoides | Planktothricoides raciborskii | [1] |
| Planktothricoides | Planktothricoides raciborskii | [2] |
| Planktothricoides | Planktothricoides raciborskii | [3] |
| Planktothricoides | Planktothricoides raciborskii | [4] |
| Planktothricoides | Planktothricoides raciborskii 1372 | [5] |
| Planktothricoides | Planktothricoides sp. | [6] |
| Planktothricoides | Planktothricoides sp. SR001 | [7] |
| Pseudanabaena | Pseudanabaena cinerea FACHB1277 | [8] |
| Pseudanabaena | Pseudanabaena cinerea FACHB1278 | [9] |
| Pseudanabaena | Pseudanabaena cinerea FACHB1279 | [10] |
| Pseudanabaena | Pseudanabaena cinerea FACHB1280 | [11] |
| Pseudanabaena | Pseudanabaena galeata | [12] |
| Pseudanabaena | Pseudanabaena sp. | [13] |
| Pseudanabaena | Pseudanabaena sp. | [14] |
| Pseudanabaena | Pseudanabaena sp. dqh15 | [15] |
| Pseudanabaena | Pseudanabaena sp. TH-1 | [16] |
| Pseudanabaena | Pseudanabaena sp. Xili | [17] |
Supplementary Table 2
| Comparison | \(t_\text{MIB}\) | \(e_\text{MIB}\) | \(i_\text{MIB}\) | \(f\) |
|---|---|---|---|---|
| Autumn vs Spring | 1.0000 | 0.0879 | 1.0000 | 1.0000 |
| Autumn vs Summer | 0.0003*** | <0.0001*** | 0.0104* | 1.0000 |
| Spring vs Summer | 0.0081** | 0.0398* | 0.0599 | 1.0000 |
| Autumn vs Winter | 0.0022** | 0.7217 | <0.0001*** | 0.0000*** |
| Spring vs Winter | <0.0001*** | 0.0024** | <0.0001*** | 0.0000*** |
| Summer vs Winter | <0.0001*** | <0.0001*** | <0.0001*** | 0.0000*** |
Supplementary Table 3
| Season | Mean | SD | First quartile | Median | Third quartile |
|---|---|---|---|---|---|
| Spring | 43.0 | 77.5 | 3.16 | 8.23 | 33.5 |
| Summer | 107 | 230 | 6.78 | 25.9 | 80.8 |
| Autumn | 23.7 | 47.7 | 2.80 | 6.54 | 17.57 |
| Winter | 9.93 | 16.6 | 1.10 | 2.42 | 5.34 |
Code
require(tidyverse)
require(lubridate)
require(patchwork)
require(drwateR)
require(grid)
require(ggsci)
require(sf)
logistic_model <- function(
culturedf,
main = NULL,
xlab = "Culture time (d)",
ylab = "Cell density (cell L<sup>-1</sup>)",
Kcoef = 0.99,
N00 = 5e5,
check = FALSE,
plot = FALSE,
returnfitdf = TRUE,
fitdf_x = seq(
min(culturedf$julian),
1.2 * max(culturedf$julian),
length.out = 100
)
) {
K <- max(culturedf$n) / Kcoef
culturedf <- culturedf |>
dplyr::mutate(z = log(K / n - 1))
out <- list()
out[["culturedf"]] <- culturedf
out[["K"]] <- K
m <- lm(z ~ julian, data = culturedf)
r <- -unname(coef(m)[2])
tstar <- unname(coef(m)[1] / r) #tstar = log(a)/r
# N0 <- K - K / (1 + exp(-r * tstar))
N0 <- K / (1 + exp(r * tstar))
t00 <- tstar - log(K / N00 - 1) / r
r2 <- summary(m)$r.squared
pval <- summary(m)$coefficients[8]
out[["m"]] <- m
out[["r"]] <- r
out[["tstar"]] <- tstar
out[["N0"]] <- N0
out[["r2"]] <- r2
out[["pval"]] <- pval
out[["t00"]] <- t00
out[["N00"]] <- N00
if (isTRUE(check)) {
p1 <- culturedf |>
ggplot(aes(julian, z)) +
geom_point() +
geom_smooth(method = "lm") +
labs(x = xlab, y = "log(K / N - 1)", fill = NULL, title = main) +
dwfun::theme_sci()
out[["p1"]] <- p1
}
if (isTRUE(returnfitdf)) {
fitdf <- tibble::tibble(julian = fitdf_x) |>
dplyr::mutate(n = K / (1 + exp(-r * (julian - tstar))))
out[["fitdf"]] <- fitdf
}
if (isTRUE(plot)) {
p2 <- fitdf |>
ggplot(aes(julian, n)) +
geom_point(data = culturedf, aes(y = n)) +
geom_line() +
labs(x = xlab, y = ylab, fill = NULL, title = main) +
dwfun::theme_sci()
out[["p2"]] <- p2
}
return(out)
}
culturemdf <- readRDS("culturedf.rds") |>
tidyr::nest(idf = -c(strain, ppf)) |>
tidyr::expand_grid(Kcoef = c(0.90, 0.95, 0.99, 1.05, 1.1)) |>
dplyr::mutate(
model = purrr::pmap(
list(idf, ppf, Kcoef),
\(x, I, Kcoef) {
logistic_model(
culturedf = x |>
dplyr::filter(valid == "GOOD") |>
dplyr::filter(!is.na(n)),
Kcoef = Kcoef,
main = I,
check = TRUE,
plot = TRUE,
returnfitdf = TRUE,
fitdf_x = 0:40
)
}
)
) |>
dplyr::mutate(culturedf = purrr::map(model, \(x) x[["culturedf"]])) |>
dplyr::mutate(m = purrr::map(model, \(x) x[["m"]])) |>
dplyr::mutate(K = purrr::map_dbl(model, \(x) x[["K"]])) |>
dplyr::mutate(r = purrr::map_dbl(model, \(x) x[["r"]])) |>
dplyr::mutate(N0 = purrr::map_dbl(model, \(x) x[["N0"]])) |>
dplyr::mutate(r2 = purrr::map_dbl(model, \(x) x[["r2"]])) |>
dplyr::mutate(pval = purrr::map_dbl(model, \(x) x[["pval"]])) |>
dplyr::mutate(tstar = purrr::map_dbl(model, \(x) x[["tstar"]])) |>
dplyr::mutate(p1 = purrr::map(model, \(x) x[["p1"]])) |>
dplyr::mutate(p2 = purrr::map(model, \(x) x[["p2"]])) |>
dplyr::mutate(fitdf = purrr::map(model, \(x) x[["fitdf"]])) |>
dplyr::group_by(strain, ppf) |>
dplyr::slice_max(r2, n = 1) |>
dplyr::arrange(strain, ppf)
Kprop <- 0.8
mdf <- culturemdf |>
unnest(culturedf) |>
dplyr::mutate(a = (K - N0) / N0) |>
dplyr::mutate(
x1 = exp(r * julian) *
a *
log(2) /
(exp(2 * r * julian) + exp(r * julian) * 2 * a + a^2)
) |>
dplyr::mutate(x2 = (K - n) / K) |>
dplyr::mutate(
stage = factor(
n < K * Kprop,
levels = c("TRUE", "FALSE"),
labels = c("<80%K", "≥80%K")
)
) |>
tidyr::nest(
idf = -c(
strain,
ppf,
stage,
Kcoef,
model,
m,
r,
tstar,
N0,
r2,
pval,
p1,
p2,
fitdf
)
) |>
tidyr::pivot_wider(names_from = stage, values_from = idf) |>
dplyr::mutate(
mb = purrr::map(`<80%K`, \(x) {
x |>
dplyr::mutate(y = d2t - 1) |>
lm(formula = y ~ x1 + 0, data = _)
})
) |>
dplyr::mutate(
mc = purrr::map(`≥80%K`, \(x) {
x |>
lm(formula = d2t ~ x2, data = _)
})
) |>
dplyr::mutate(b = -purrr::map_dbl(mb, \(x) coef(x)[1])) |>
dplyr::mutate(c = purrr::map_dbl(mc, \(x) coef(x)[2])) |>
dplyr::mutate(d = purrr::map_dbl(mc, \(x) coef(x)[1] - 0.5)) |>
dplyr::relocate(strain, ppf, Kcoef, r, N0, r2, pval, tstar, b, c, d, p1, p2)
Kprop <- 0.8
mdf <- culturemdf |>
tidyr::unnest(culturedf) |>
dplyr::mutate(a = (K - N0) / N0) |>
dplyr::mutate(
x1 = exp(r * julian) *
a *
log(2) /
(exp(2 * r * julian) +
exp(r * julian) * 2 * a +
a^2)
) |>
dplyr::mutate(x2 = (K - n) / K) |>
dplyr::mutate(
stage = factor(
n < K * Kprop,
levels = c("TRUE", "FALSE"),
labels = c("<80%K", "≥80%K")
)
) |>
tidyr::nest(
idf = -c(
strain,
ppf,
stage,
Kcoef,
model,
K,
m,
r,
tstar,
N0,
deltaT,
r2,
pval,
p1,
p2,
fitdf
)
) |>
tidyr::pivot_wider(names_from = stage, values_from = idf) |>
dplyr::mutate(
mb = purrr::map(`<80%K`, \(x) {
x |>
dplyr::mutate(y = d2t - 1) |>
lm(formula = y ~ x1 + 0, data = _)
})
) |>
dplyr::mutate(
mc = purrr::map(`≥80%K`, \(x) {
x |>
lm(formula = d2t ~ x2, data = _)
})
) |>
dplyr::mutate(b = -purrr::map_dbl(mb, \(x) coef(x)[1])) |>
dplyr::mutate(c = purrr::map_dbl(mc, \(x) coef(x)[2])) |>
dplyr::mutate(d = purrr::map_dbl(mc, \(x) coef(x)[1] - 0.5)) |>
dplyr::relocate(
strain,
ppf,
Kcoef,
K,
r,
N0,
deltaT,
r2,
pval,
tstar,
b,
c,
d,
p1,
p2
) |>
dplyr::left_join(
culturemdf_adj |>
dplyr::select(strain, ppf, culturedf, fitdf)
) |>
dplyr::mutate(theta = (K - N0) / N0) |>
dplyr::mutate(
fpreddf = purrr::pmap(
list(fitdf, K, r, N0, deltaT, theta, b, c, d),
\(df, K, r, N0, deltaT, theta, alpha1, alpha2, beta) {
df |>
dplyr::filter(n < 0.8 * K) |>
dplyr::mutate(
f = 1 -
alpha1 *
log(2) *
theta *
exp(r * julian) /
(exp(2 * r * julian) + 2 * theta * exp(r * julian) + theta^2)
) |>
bind_rows(
df |>
dplyr::filter(n >= 0.8 * K) |>
dplyr::mutate(f = 0.5 + (K - n) / K * alpha2 + beta)
)
}
)
)
culturemdf |>
unnest(culturedf) |>
ggplot(aes(julian, d2t)) +
geom_point() +
facet_wrap(~ paste(strain, ppf), ncol = 3, scale = "free") +
theme_sci(9, 6)
mdf |>
unnest(`<80%K`) |>
dplyr::filter(julian > 0) |>
ggplot(aes(x1 * log(2) / r, d2t)) +
geom_point() +
scale_x_log10(
breaks = scales::trans_breaks("log10", function(x) 10^x),
labels = scales::trans_format("log10", scales::math_format(10^.x))
) +
facet_wrap(~ paste0(strain, ppf), ncol = 3, scale = "free") +
theme_sci(9, 5)
mdf |>
tidyr::unnest(fpreddf) |>
ggplot(aes(julian, f)) +
geom_point() +
geom_line(color = "red") +
facet_wrap(~ paste(strain, ppf), ncol = 3, scale = "fixed") +
theme_sci(9, 5)
References
[1]
Chang D-W, Hobson P, Burch M, Lin T-F, 2012. Measurement of cyanobacteria using in-vivo fluoroscopy - effect of cyanobacterial species, pigments, and colonies. Water Research 46, 5037–5048. https://doi.org/10.1016/j.watres.2012.06.050
[2]
Duong TT, Nguyen TTL, Dinh THV, Hoang TQ, Vu TN, Doan TO, Dang TMA, Le TPQ, Tran DT, Le VN, Nguyen QT, Le PT, Nguyen TK, Pham TD, Bui HM, 2021. Auxin production of the filamentous cyanobacterial planktothricoides strain isolated from a polluted river in vietnam. Chemosphere 284, 131242. https://doi.org/10.1016/j.chemosphere.2021.131242
[3]
Lu J, Su M, Su Y, Wu B, Cao T, Fang J, Yu J, Zhang H, Yang M, 2022. Driving forces for the growth of MIB-producing Planktothricoides raciborskii in a low-latitude reservoir. Water Research 118670. https://doi.org/10.1016/j.watres.2022.118670
[4]
Tan HT, Yusoff FMd, Khaw YS, Nazarudin MF, Mazli NAIN, Ahmad SA, Shaharuddin NA, Toda T, 2022. Characterisation and selection of freshwater cyanobacteria for phycobiliprotein contents. Aquaculture International. https://doi.org/10.1007/s10499-022-00985-6
[5]
Jianguo C, Litong M, Wenyuan Z, Yunying L, 2022. Effects of environmental factors on the growth and 2-MIB production of planktothrix sp. Journal of Hydroecology 43, 70–76. https://doi.org/10.15928/j.1674-3075.202008180236
[6]
Mohanty B, Majedi SM, Pavagadhi S, Te SH, Boo CY, Gin KY-H, Swarup S, 2022. Effects of light and temperature on the metabolic profiling of two habitat-dependent bloom-forming cyanobacteria. Metabolites 12, 406. https://doi.org/10.3390/metabo12050406
[7]
Te SH, Tan BF, Boo CY, Thompson JR, Gin KY, 2017. Genomics insights into production of 2-methylisoborneol and a putative cyanobactin by Planktothricoides sp. sr001. Standards in Genomic Sciences 12, 35
[8]
Cao T, Fang J, Jia Z, Zhu Y, Su M, Zhang Q, Song Y, Yu J, Yang M, 2023. Early warning of MIB episode based on gene abundance and expression in drinking water reservoirs. Water Research 231, 119667. https://doi.org/https://doi.org/10.1016/j.watres.2023.119667
[9]
Su M, Zhu Y, Andersen T, Wang X, Yu Z, Lu J, Song Y, Cao T, Yu J, Zhang Y, Yang M, 2022. Light-dominated selection shaping filamentous cyanobacterial assemblages drives odor problem in a drinking water reservoir. npj Clean Water 5, 37. https://doi.org/10.1038/s41545-022-00181-2
[10]
Su M, Fang J, Jia Z, Su Y, Zhu Y, Wu B, Little JC, Yu J, Yang M, 2023. Biosynthesis of 2-methylisoborneol is regulated by chromatic acclimation of Pseudanabaena. Environmental Research 221, 115260. https://doi.org/10.1016/j.envres.2023.115260
[11]
Zhang T, Zheng L, Li L, Song L, 2016. 2-methylisoborneol production characteristics of Pseudanabaena sp. FACHB 1277 isolated from Xionghe Reservoir, China. Journal of Applied Phycology 1–10. https://doi.org/10.1007/s10811-016-0864-x
[12]
Muhetaer G, Asaeda T, Jayasanka SMDH, Baniya MB, Abeynayaka HDL, Rashid MH, Yan H, 2020. Effects of light intensity and exposure period on the growth and stress responses of two cyanobacteria species: Pseudanabaena galeata and Microcystis aeruginosa. Water 12. https://doi.org/10.3390/w12020407
[13]
Xiao-Qin Wang H-BJ, Qiu B-S, 2015. Effects of iron availability on competition between microcystis and pseudanabaena or chlorella species. European Journal of Phycology 50, 260–270. https://doi.org/10.1080/09670262.2015.1020516
[14]
Mishra SK, Shrivastav A, Maurya RR, Patidar SK, Haldar S, Mishra S, 2012. Effect of light quality on the c-phycoerythrin production in marine cyanobacteria Pseudanabaena sp. Isolated from Gujarat coast, India. Protein Expression and Purification 81, 5–10. https://doi.org/10.1016/j.pep.2011.08.011
[15]
Wang Z, Li R, 2015. Effects of light and temperature on the odor production of 2-methylisoborneol-producing Pseudanabaena sp. and geosmin-producing Anabaena ucrainica (cyanobacteria). Biochemical Systematics and Ecology 58, 219–226. https://doi.org/10.1016/j.bse.2014.12.013
[16]
Hu L, Wang H, Cui J, Zou W, Li J, Shan K, 2023. Temperature-dependent growth characteristics and competition of pseudanabaena and microcystis. Water 15, 2404. https://doi.org/10.3390/w15132404
[17]
Gao J, Zhu J, Wang M, Dong W, 2018. Dominance and growth factors of Pseudanabaena sp. In drinking water source reservoirs, southern china. Sustainability 10, 3936. https://doi.org/10.3390/su10113936