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.

Fig. S1

Fig. S1: Spatial clustering map of sampling sites in Lake Taihu used in this study.

Fig. S2

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

Fig. S3

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

Fig. S4

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

Fig. S5

Fig. S5: 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).

Fig. S6

Fig. S6: 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).

Fig. S7

Fig. S7: 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.

Fig. S8

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

Fig. S9

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

Fig. S10

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

Fig. S11

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

Fig. S12

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

Table S1

Genus Strain Ref.
Planktothricoides Planktothricoides raciborskii (Chang et al. 2012)
Planktothricoides Planktothricoides raciborskii (Duong et al. 2021)
Planktothricoides Planktothricoides raciborskii (Lu et al. 2022)
Planktothricoides Planktothricoides raciborskii (Tan et al. 2022)
Planktothricoides Planktothricoides raciborskii 1372 (Jianguo et al. 2022)
Planktothricoides Planktothricoides sp. (Mohanty et al. 2022)
Planktothricoides Planktothricoides sp. SR001 (Te et al. 2017)
Pseudanabaena Pseudanabaena cinerea FACHB1277 (Cao et al. 2023)
Pseudanabaena Pseudanabaena cinerea FACHB1278 (Su et al. 2022)
Pseudanabaena Pseudanabaena cinerea FACHB1279 (Su et al. 2023)
Pseudanabaena Pseudanabaena cinerea FACHB1280 (Zhang et al. 2016)
Pseudanabaena Pseudanabaena galeata (Muhetaer et al. 2020)
Pseudanabaena Pseudanabaena sp. (Xiao-Qin Wang and Qiu 2015)
Pseudanabaena Pseudanabaena sp. (Mishra et al. 2012)
Pseudanabaena Pseudanabaena sp. dqh15 (Wang and Li 2015)
Pseudanabaena Pseudanabaena sp. TH-1 (Hu et al. 2023)
Pseudanabaena Pseudanabaena sp. Xili (Gao et al. 2018)
Table S1: Studies in other literature involving the cultivation of Pseudanabaena and Planktothricoides.

Table S2

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***
Table S2: 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}\)).

Table S3

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
Table S3: 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

Cao, Tengxin, Jiao Fang, Zeyu Jia, Yiping Zhu, Ming Su, Qi Zhang, Yichao Song, Jianwei Yu, and Min Yang. 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.
Chang, De-Wei, Peter Hobson, Michael Burch, and Tsair-Fuh Lin. 2012. “Measurement of Cyanobacteria Using in-Vivo Fluoroscopy - Effect of Cyanobacterial Species, Pigments, and Colonies.” Water Research 46 (16): 5037–48. https://doi.org/10.1016/j.watres.2012.06.050.
Duong, Thi Thuy, Thi Thu Lien Nguyen, Thi Hai Van Dinh, Thi Quynh Hoang, Thi Nguyet Vu, Thi Oanh Doan, Thi Mai Anh Dang, et al. 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.
Gao, Jingsi, Jia Zhu, Maowei Wang, and Wenyi Dong. 2018. “Dominance and Growth Factors of Pseudanabaena sp. In Drinking Water Source Reservoirs, Southern China.” Sustainability 10 (11): 3936. https://doi.org/10.3390/su10113936.
Hu, Lili, Haiyan Wang, Jingzhen Cui, Wansheng Zou, Jie Li, and Kun Shan. 2023. “Temperature-Dependent Growth Characteristics and Competition of Pseudanabaena and Microcystis.” Water 15 (13): 2404. https://doi.org/10.3390/w15132404.
Jianguo, Cheng, Ma Litong, Zhao Wenyuan, and Liu Yunying. 2022. “Effects of Environmental Factors on the Growth and 2-MIB Production of Planktothrix Sp.” Journal of Hydroecology 43 (1): 70–76. https://doi.org/10.15928/j.1674-3075.202008180236.
Lu, Jinping, Ming Su, Yuliang Su, Bin Wu, Tengxin Cao, Jiao Fang, Jianwei Yu, Honggang Zhang, and Min Yang. 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.
Mishra, Sanjiv K., Anupama Shrivastav, Rahulkumar R. Maurya, Shailesh K. Patidar, Soumya Haldar, and Sandhya Mishra. 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 (1): 5–10. https://doi.org/10.1016/j.pep.2011.08.011.
Mohanty, Bijayalaxmi, Seyed Mohammad Majedi, Shruti Pavagadhi, Shu Harn Te, Chek Yin Boo, Karina Yew-Hoong Gin, and Sanjay Swarup. 2022. “Effects of Light and Temperature on the Metabolic Profiling of Two Habitat-Dependent Bloom-Forming Cyanobacteria.” Metabolites 12 (5): 406. https://doi.org/10.3390/metabo12050406.
Muhetaer, Guligena, Takashi Asaeda, Senavirathna M. D. H. Jayasanka, Mahendra B. Baniya, Helayaye D. L. Abeynayaka, M. Harun Rashid, and HongYu Yan. 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 (2). https://doi.org/10.3390/w12020407.
Su, Ming, Jiao Fang, Zeyu Jia, Yuliang Su, Yiping Zhu, Bin Wu, John C. Little, Jianwei Yu, and Min Yang. 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.
Su, Ming, Yiping Zhu, Tom Andersen, Xianyun Wang, Zhiyong Yu, Jinping Lu, Yichao Song, et al. 2022. “Light-Dominated Selection Shaping Filamentous Cyanobacterial Assemblages Drives Odor Problem in a Drinking Water Reservoir.” Npj Clean Water 5 (1): 37. https://doi.org/10.1038/s41545-022-00181-2.
Tan, Hui Teng, Fatimah Md. Yusoff, Yam Sim Khaw, Muhammad Farhan Nazarudin, Nur Amirah Izyan Noor Mazli, Siti Aqlima Ahmad, Noor Azmi Shaharuddin, and Tatsuki Toda. 2022. “Characterisation and Selection of Freshwater Cyanobacteria for Phycobiliprotein Contents.” Aquaculture International. https://doi.org/10.1007/s10499-022-00985-6.
Te, Shu Harn, Boon Fei Tan, Chek Yin Boo, Janelle Renee Thompson, and Karina Yew-hoong Gin. 2017. “Genomics Insights into Production of 2-Methylisoborneol and a Putative Cyanobactin by Planktothricoides Sp. sr001.” Standards in Genomic Sciences 12 (1): 35. https://standardsingenomics.biomedcentral.com/articles/10.1186/s40793-017-0247-1.
Wang, Zhongjie, and Renhui Li. 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–26. https://doi.org/10.1016/j.bse.2014.12.013.
Xiao-Qin Wang, Hai-Bo Jiang, and Bao-Sheng Qiu. 2015. “Effects of Iron Availability on Competition Between Microcystis and Pseudanabaena or Chlorella Species.” European Journal of Phycology 50 (3): 260–70. https://doi.org/10.1080/09670262.2015.1020516.
Zhang, Ting, Lingling Zheng, Lin Li, and Lirong Song. 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.