Skip to content

How-to guides

How to add a new variable database

Use HidroCLVariable to bind a variable name to its CSV database files. Enable automatic creation if the files don't exist yet:

import hidrocl
import hidrocl.paths as hcl

hidrocl.variables.create = True

ndvi = hidrocl.HidroCLVariable(
    "ndvi",
    hcl.veg_o_modis_ndvi_mean_b_d16_p0d,   # observations database
    hcl.veg_o_modis_ndvi_mean_pc            # pixel-count database
)

How to extract MODIS vegetation indices (MOD13Q1)

import hidrocl
import hidrocl.paths as hcl

ndvi = hidrocl.HidroCLVariable("ndvi",
                               hcl.veg_o_modis_ndvi_mean_b_d16_p0d,
                               hcl.veg_o_modis_ndvi_mean_pc)
evi  = hidrocl.HidroCLVariable("evi",
                               hcl.veg_o_modis_evi_mean_b_d16_p0d,
                               hcl.veg_o_modis_evi_mean_pc)
nbr  = hidrocl.HidroCLVariable("nbr",
                               hcl.veg_o_int_nbr_mean_b_d16_p0d,
                               hcl.veg_o_int_nbr_mean_pc)

mod13 = hidrocl.Mod13q1(ndvi, evi, nbr,
                        product_path=hcl.mod13q1_path,
                        vector_path=hcl.hidrocl_sinusoidal,
                        ndvi_log=hcl.log_veg_o_modis_ndvi_mean,
                        evi_log=hcl.log_veg_o_modis_evi_mean,
                        nbr_log=hcl.log_veg_o_int_nbr_mean)

mod13.run_maintainer()   # verify files, remove corrupt ones
mod13.run_extraction()   # extract zonal statistics

How to extract VIIRS vegetation indices (VNP13Q1)

import hidrocl
import hidrocl.paths as hcl

ndvi = hidrocl.HidroCLVariable("ndvi",
                               hcl.veg_o_viirs_ndvi_mean,
                               hcl.veg_o_viirs_ndvi_mean_pc)
evi  = hidrocl.HidroCLVariable("evi",
                               hcl.veg_o_viirs_evi_mean,
                               hcl.veg_o_viirs_evi_mean_pc)
nbr  = hidrocl.HidroCLVariable("nbr",
                               hcl.veg_o_viirs_nbr2_mean,
                               hcl.veg_o_viirs_nbr2_mean_pc)

vnp13 = hidrocl.Vnp13q1(ndvi, evi, nbr,
                        product_path=hcl.vnp13q1_path,
                        vector_path=hcl.hidrocl_sinusoidal,
                        ndvi_log=hcl.log_veg_o_viirs_indices_mean,
                        evi_log=hcl.log_veg_o_viirs_indices_mean,
                        nbr_log=hcl.log_veg_o_viirs_indices_mean)

vnp13.run_maintainer()
vnp13.run_extraction()

How to extract snow cover (VNP10A1F — VIIRS daily)

import hidrocl
import hidrocl.paths as hcl

nsnow = hidrocl.HidroCLVariable("nsnow",
                                hcl.snw_o_viirs_scaf_cum_n,
                                hcl.snw_o_viirs_scaf_cum_n_pc)
ssnow = hidrocl.HidroCLVariable("ssnow",
                                hcl.snw_o_viirs_scaf_cum_s,
                                hcl.snw_o_viirs_scaf_cum_s_pc)

vnp10 = hidrocl.Vnp10a1f(nsnow, ssnow,
                         product_path=hcl.vnp10a1f_path,
                         north_vector_path=hcl.hidrocl_north,
                         south_vector_path=hcl.hidrocl_south,
                         snow_log=hcl.log_snw_o_viirs_sca_cum)

vnp10.run_maintainer()
vnp10.run_extraction()

How to extract LAI and FPAR (VNP15A2H — VIIRS 8-day)

import hidrocl
import hidrocl.paths as hcl

lai  = hidrocl.HidroCLVariable("lai",
                               hcl.veg_o_viirs_lai_mean,
                               hcl.veg_o_viirs_lai_mean_pc)
fpar = hidrocl.HidroCLVariable("fpar",
                               hcl.veg_o_viirs_fpar_mean,
                               hcl.veg_o_viirs_fpar_mean_pc)

vnp15 = hidrocl.Vnp15a2h(lai, fpar,
                         product_path=hcl.vnp15a2h_path,
                         vector_path=hcl.hidrocl_sinusoidal,
                         lai_log=hcl.log_veg_o_viirs_lai_mean,
                         fpar_log=hcl.log_veg_o_viirs_fpar_mean)

vnp15.run_maintainer()
vnp15.run_extraction()

How to download ERA5-Land data

import hidrocl

hidrocl.download.download_era5land(
    year=2026, month=3, day=1,
    path='/data/era5land/'
)

How to download MODIS/VIIRS products via Earthdata

import hidrocl

# MODIS vegetation (MOD13Q1)
hidrocl.download.earthdata_download(
    'vegetation', '/data/mod13q1/', '2026-01-01', '2026-03-01'
)

# VIIRS snow (VNP10A1F)
hidrocl.download.viirs_download(
    'snow', '/data/vnp10a1f/', '2026-01-01', '2026-03-01',
    bbox=(-73.73, -55.01, -67.05, -17.63)
)

Available what values for earthdata_download: reflectance, vegetation, lai, albedo, lulc, et0, snow, precipitation, landdata.

Available what values for viirs_download: snow, vegetation, lai, reflectance.


How to run the full operational workflow

cd workflow/server/
python run_all.py   # MODIS, VIIRS, IMERG, ERA5, ERA5-Land (sequential)
python run_gfs.py   # GFS (with automatic retries every 10 min, up to 72 attempts)

Exit codes returned by each script:

Code Meaning
0 Success
1 Error
4 Database already up to date
5 Insufficient data to process

How to check database status

import hidrocl
import hidrocl.paths as hcl

ndvi = hidrocl.HidroCLVariable("ndvi",
                               hcl.veg_o_modis_ndvi_mean_b_d16_p0d,
                               hcl.veg_o_modis_ndvi_mean_pc)

# Number of records in the database
print(ndvi)

# Valid data percentage per catchment
print(ndvi.valid_data())

# Visualise valid data
ndvi.plot_valid_data_all()