Skip to contents
library(ToolsRTM)
library(SCOPEinR)

SCOPE couples radiative transfer, energy balance, and photosynthesis – so a trait that has no direct radiative-transfer role (Vcmax25, photosynthetic capacity) can still leave a signature in reflectance indirectly, through the leaf temperature the energy balance solves for. This page sweeps one trait at a time, holding everything else at the bundled example row, and looks at three different kinds of SCOPE output: reflectance (refl), canopy temperature (Tcave), and photosynthesis (Actot).

path_input <- system.file("input", package = "SCOPEinR")
scope_options <- read.table(file.path(path_input, "setoptions.csv"), header = TRUE, sep = ",")
LUT_default <- read.table(file.path(path_input, "LUT_input.csv"), header = TRUE, sep = ",")

run_scope <- function(row) {
  get.SCOPE(LUT = row, options.SCOPE = scope_options, optipar = SCOPEinR::optipar2021.Pro.CX,
            leaf.model = "fluspect-CX", canopy.model = "fourSAIL",
            get.outputs = "ALL", get.plots = FALSE)[[1]]
}

1. Sweeping Cab (chlorophyll content)

cab_values <- seq(15, 65, length.out = 6)
res_cab <- lapply(cab_values, function(v) {
  row_i <- LUT_default[1, ]; row_i$Cab <- v
  run_scope(row_i)
})

wl_optical <- 400:2400
n <- length(wl_optical)
cols <- colorRampPalette(c("gold", "darkgreen"))(length(cab_values))
matplot(wl_optical, sapply(res_cab, function(r) r$data.rad$refl[1:n]), type = "l", lty = 1, col = cols,
        xlab = "Wavelength (nm)", ylab = "Reflectance", main = "TOC reflectance sensitivity to Cab")
legend("topright", paste("Cab =", round(cab_values)), col = cols, lty = 1, cex = 0.7)

Chlorophyll’s own signature (red-edge/visible absorption) dominates here – the expected, direct radiative-transfer effect.

2. Sweeping Vcmax25 (photosynthetic capacity)

Vcmax25 has no role in Fluspect/4SAIL’s radiative transfer at all – any reflectance change it causes is entirely indirect, through the energy balance:

vcmax_values <- seq(20, 200, length.out = 6)
res_vcmax <- lapply(vcmax_values, function(v) {
  row_i <- LUT_default[1, ]; row_i$Vcmax25 <- v
  run_scope(row_i)
})

Tcave_vals <- sapply(res_vcmax, function(r) r$data.fluxes$Tcave)
Actot_vals <- sapply(res_vcmax, function(r) r$data.fluxes$Actot)

op <- par(mfrow = c(1, 2))
plot(vcmax_values, Tcave_vals, type = "o", pch = 19, col = "#2166AC",
     xlab = "Vcmax25", ylab = "Canopy-average leaf temperature (degC)", main = "Tcave vs Vcmax25")
plot(vcmax_values, Actot_vals, type = "o", pch = 19, col = "#B2182B",
     xlab = "Vcmax25", ylab = "Actot (umol m-2 s-1)", main = "Actot vs Vcmax25")

par(op)
cols2 <- colorRampPalette(c("gold", "darkblue"))(length(vcmax_values))
matplot(wl_optical, sapply(res_vcmax, function(r) r$data.rad$refl[1:n]), type = "l", lty = 1, col = cols2,
        xlab = "Wavelength (nm)", ylab = "Reflectance",
        main = "TOC reflectance sensitivity to Vcmax25 (indirect, via energy balance)")
legend("topright", paste("Vcmax25 =", round(vcmax_values)), col = cols2, lty = 1, cex = 0.7)

Actot (canopy photosynthesis) responds strongly and directly to Vcmax25, as expected from the Farquhar-type model. The reflectance panel is the real point of this section: any spread visible there is not Fluspect/4SAIL reacting to Vcmax25 (it has no such input) – it’s the small, indirect effect of a different leaf temperature feeding back into the thermal part of the spectrum. Compare its magnitude to the Cab sweep above to judge how much (or little) that indirect pathway actually matters for the optical range.

3. Sweeping LAI

lai_values <- seq(0.5, 6, length.out = 6)
res_lai <- lapply(lai_values, function(v) {
  row_i <- LUT_default[1, ]; row_i$LAI <- v
  run_scope(row_i)
})

cols3 <- colorRampPalette(c("gold", "darkred"))(length(lai_values))
matplot(wl_optical, sapply(res_lai, function(r) r$data.rad$refl[1:n]), type = "l", lty = 1, col = cols3,
        xlab = "Wavelength (nm)", ylab = "Reflectance", main = "TOC reflectance sensitivity to LAI")
legend("topright", paste("LAI =", round(lai_values, 1)), col = cols3, lty = 1, cex = 0.7)

NIR reflectance rises with LAI up to a plateau (more leaf layers scattering, same as plain PROSAIL/4SAIL) – see the marmit-soil-in-canopy article (ToolsRTM package) for how this same LAI-driven canopy closure also controls how much a soil trait can influence the signal.

Summary

Trait swept Direct RT effect? Where it shows up
Cab Yes – Fluspect input Visible/red-edge reflectance, strong
LAI Yes – 4SAIL input NIR plateau height, strong
Vcmax25 No – biochemistry only Actot strongly; reflectance only indirectly, via leaf temperature

See Scripts/R/Sensibility/2-Sobol_perband_sensitivity.R (ToolsRTM package’s own scripts) for a formal, per-band Sobol sensitivity analysis across many traits at once, rather than this page’s one-at-a-time sweeps.