Data provenance - MLSP real-data exercise (built by Anna, see PROVENANCE)
Source: Open Soil Spectral Library (OSSL) v1.2, subset dataset.code_ascii_txt = ICRAF.ISRIC
  (ICRAF/ISRIC VNIR library, ASD-style instrument, Africa soils)
Original files:
  https://storage.googleapis.com/soilspec4gg-public/ossl_visnir_L0_v1.2.csv.gz   (174 MB)
  https://storage.googleapis.com/soilspec4gg-public/ossl_soillab_L0_v1.2.csv.gz  (9.3 MB)
License: MIT. Please cite the OSSL paper (PLOS ONE 2024, Sanderman et al.).
Processing (VPS, reproducible):
  1. kept ICRAF.ISRIC rows whose VisNIR scan exists (>=99% of 1076 bands non-null) -> 4073 rows
  2. lab properties coalesced across method codes:
     {'SOC': ['oc_usda.c729_w.pct', 'oc_usda.c1059_w.pct'], 'pH': ['ph.h2o_usda.a268_index'], 'clay': ['clay.tot_usda.a334_w.pct', 'clay.tot_iso.11277_w.pct'], 'silt': ['silt.tot_usda.c62_w.pct', 'silt.tot_iso.11277_w.pct'], 'sand': ['sand.tot_usda.c60_w.pct', 'sand.tot_usda.c405_w.pct'], 'CEC': ['cec_usda.a723_cmolc.kg', 'cec_iso.11260_cmolc.kg'], 'BD': ['bd_usda.a4_g.cm3', 'bd_usda.a21_g.cm3']}
  3. inner join on id.layer_uuid_txt, complete cases on 7 props + full spectra -> 952 rows
  4. resampled 2 nm -> 1 nm grid (numpy.interp) = ASD-like 2151 bands 350..2500 (NaturaSpec format)
  5. 150-sample subset, seed 42, sorted by SOC
Property units: SOC/carbon = weight %, pH = 1:1 H2O index, texture = weight %, CEC = cmolc/kg, BD = g/cm3
Full complete-case pool = 952 rows; 150 shipped to match the MLSP exercise scale.
