scopeinpython.fluspect

FLUSPECT-B-Cx, the SCOPE variant (getFluspect.Cx.SCOPE) that SCOPE’s own leaf-optics pipeline actually calls – not the same function as toolsrtm.fluspect_cx despite very similar code. Direct port of SCOPEinR/R/fluspect_Cx_forSCOPE.R.

Key differences from toolsrtm.fluspect_cx:

  • A caller-configurable step (nm) controls the Mb/Mf excitation-emission matrix resolution. SCOPE’s own default step=5 gives 53x71 matrices; step=1 gives 211x351 (like the non-SCOPE version, but see below – still not numerically identical).

  • The SIF response is scaled by step itself, not a fixed constant (the non-SCOPE version always uses int=5 regardless of its own fixed 1 nm grid).

  • A single combined Mb/Mf pair (one phi spectrum), same as the non-SCOPE Cx version.

  • Uses match() (correct) for locating excitation/emission wavelengths within the full grid – does not have the intersect() indexing bug documented in toolsrtm.fluspect.fluspect_cx().

  • Uses SCOPEinR::optipar2021.Pro.CX as its real default optical parameter table (optipar2017.ProspectD is missing Kp/Kcbc data needed for the PROSPECT-PRO/Cx Kall formula).

FLUSPECT-B-Cx leaf model, SCOPE variant: like toolsrtm.fluspect_cx, but with a caller-configurable step (nm) for the excitation/emission wavelength grids used to build the Mb/Mf fluorescence matrices (default step=5 -> 53x71 matrices, vs. the non-SCOPE version’s fixed 1 nm -> 211x351), and a single combined Mb/Mf pair (using one phi spectrum) rather than separate PSI/PSII matrices.

Direct port of SCOPEinR/R/fluspect_Cx_forSCOPE.R (getFluspect.Cx.SCOPE), the function SCOPE’s own leaf-optics pipeline (fluspect_mSCOPE.R) actually calls – not the same function as ToolsRTM::getFluspect.Cx (toolsrtm.fluspect_cx), despite very similar code: the two diverge in the wavelength-grid construction (step-parameterized here) and the SIF scaling constant (step here vs. a fixed int=5 there). Confirmed via direct inspection this SCOPE variant uses match() for Iwlf (not the intersect() bug in ToolsRTM::getFluspect.Cx), so it does not reproduce that bug – it doesn’t have it in the first place.

Reuses toolsrtm.fluspect._prospect_mesophyll() for the shared PROSPECT-with-interfaces-removed core (identical math to the non-SCOPE Cx path).

class scopeinpython.fluspect.FluspectCxScopeResult(lambda_: 'np.ndarray', refl: 'np.ndarray', tran: 'np.ndarray', kChlrel: 'np.ndarray', kCarrel: 'np.ndarray', Mb: 'np.ndarray', Mf: 'np.ndarray')[source]

Bases: object

Parameters:
lambda_: ndarray
refl: ndarray
tran: ndarray
kChlrel: ndarray
kCarrel: ndarray
Mb: ndarray
Mf: ndarray
scopeinpython.fluspect.get_fluspect_cx_scope(Cab, Car, EWT, LMA, Cs, N, fqe, Cx, Prot, CBC, Anth, step=5.0)[source]

FLUSPECT-B-Cx (SCOPE variant). Direct port of SCOPEinR::getFluspect.Cx.SCOPE. Returns None if fqe <= 0 (same reasoning as toolsrtm.fluspect_cx: the R source’s Mb/Mf – and everything else – are only ever returned inside its if (fqe_ > 0) {...} block).

Parameters:
  • Cab (float)

  • Car (float)

  • EWT (float)

  • LMA (float)

  • Cs (float)

  • N (float)

  • fqe (float)

  • Cx (float)

  • Prot (float)

  • CBC (float)

  • Anth (float)

  • step (float)

Return type:

FluspectCxScopeResult | None