Cyanobacterial crowding-out effects on metabolite partitioning: modeling 2-methylisoborneol (MIB) release dynamics and implications

Supplementary Information

Authors
Affiliations

Yufan Ai

Yongnian Wu

Bureau of Hydrology Information Center of Taihu Basin Authority

Yuying Gui

Yifan Du

Jiao Fang

Tengxin Cao

Min Yang

# 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. 1: Spatial clustering map of sampling sites in Lake Taihu used in this study.

Supplementary Fig. 2

Supplementary Fig. 2: Frequency distribution of modeled \(St\) and \(t_\text{MIB}\) values for odor-producing cyanobacteria in Lake Taihu.

Supplementary Fig. 3

Supplementary Fig. 3: Seasonal distribution of total MIB concentration in Lake Taihu.

Supplementary Fig. 4

Supplementary Fig. 4: Concurrent 16S RNA gene sequencing identified Pseudanabaena and Planktothricoides as the dominant MIB-producing genera.

Supplementary Fig. 5

Supplementary Fig. 5: Logistic fit of Pseudanabaena growth under various light conditions (A: 5 mol m-2 s-1; B: 17 mol m-2 s-1; C: 36 mol m-2 s-1; D: 85 mol m-2 s-1; E: 250 mol m-2 s-1).

Supplementary Fig. 6

Supplementary Fig. 6: Logistic fit of Planktothricoides growth under various light conditions (A: 13.5 mol m-2 s-1; B: 27 mol m-2 s-1; C: 54 mol m-2 s-1; D: 81 mol m-2 s-1).

Supplementary Fig. 7

Supplementary Fig. 7: Fitted curves of the extracellular-to-total MIB ratio (\(f\)) under low, medium, and high cyanobacterial growth rates. Note that the y-axis values (\(f\)) represent ridge line means vertically offset for clarity.

Supplementary Fig. 8

Supplementary Fig. 8: Temporal and spatial distribution of Pseudanbaena in Lake Taihu.

Supplementary Fig. 9

Supplementary Fig. 9: Studies in other literature involving the cultivation of Pseudanabaena and Planktothricoides.

Supplementary Fig. 10

Supplementary Fig. 10: Surface Shortwave Downward Irradiance in the Lake Taihu region from March 2022 to February 2023 (Data source: NASA POWER, https://power.larc.nasa.gov/).

Supplementary Fig. 11

Supplementary Fig. 11: Odor risk assessment across the entire Lake Taihu (probability of \(t_\text{MIB}\) > 50 ng L-1).

Supplementary Fig. 12

Supplementary Fig. 12: Boxplot comparison of inflection point times (\(T_{IP}\)) for Pseudanabaena and Planktothricoides.

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 1: Studies in other literature involving the cultivation of Pseudanabaena and Planktothricoides.

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 2: Statistical comparisons between seasons for various metrics. \(t_\text{MIB}\): total MIB; \(e_\text{MIB}\): extracellular MIB; \(i_\text{MIB}\): intracellular MIB; \(f\): ratio of \(e_\text{MIB}\) and \(t_\text{MIB}\) (\(f = e_\text{MIB}/t_\text{MIB}\)).

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
Supplementary Table 3: Statistical Summary of total MIB in Different Seasons (Total n = 372). \(t_\text{MIB}\): total MIB.

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