Skip to content

Python Modules API Reference

Overview

The EEMT Python package provides programmatic access to all calculation functions, data utilities, and workflow components. This reference documents the public API for custom workflow development and integration.

Core Modules

eemt.calculations

Core EEMT calculation functions.

from eemt import calculations

# Traditional EEMT calculation
eemt_trad = calculations.calculate_eemt_traditional(
    temperature=temp_array,
    precipitation=precip_array,
    elevation=dem_array
)

# Topographic EEMT calculation
eemt_topo = calculations.calculate_eemt_topographic(
    temperature=temp_array,
    precipitation=precip_array,
    solar_radiation=solar_array,
    twi=twi_array,
    slope=slope_array
)

Functions

calculate_eemt_traditional()

Calculate EEMT using climate-based approach.

Parameters: - temperature (ndarray): Monthly mean temperature [°C] - precipitation (ndarray): Monthly precipitation [mm] - elevation (ndarray, optional): Elevation for corrections [m] - lapse_rate (float): Temperature lapse rate [°C/km], default -6.5

Returns: - dict: Contains 'eemt', 'e_bio', 'e_ppt' arrays [MJ m⁻² yr⁻¹]

Example:

import numpy as np
from eemt import calculations

# Monthly climate data
temp = np.array([5, 8, 12, 16, 20, 24, 26, 25, 22, 17, 11, 6])
precip = np.array([45, 52, 68, 84, 95, 78, 65, 72, 85, 73, 58, 48])

# Calculate EEMT
result = calculations.calculate_eemt_traditional(temp, precip)
print(f"Annual EEMT: {result['eemt']:.2f} MJ/m²/yr")
print(f"Biological Energy: {result['e_bio']:.2f} MJ/m²/yr")
print(f"Precipitation Energy: {result['e_ppt']:.2f} MJ/m²/yr")

calculate_eemt_topographic()

Calculate EEMT with topographic corrections.

Parameters: - temperature (ndarray): Temperature data [°C] - precipitation (ndarray): Precipitation data [mm] - solar_radiation (ndarray): Annual solar radiation [MJ/m²] - twi (ndarray): Topographic wetness index - slope (ndarray): Slope angle [degrees] - aspect (ndarray, optional): Aspect angle [degrees]

Returns: - dict: Enhanced EEMT components with topographic effects

eemt.solar

Solar radiation calculation utilities.

from eemt import solar

# Calculate daily solar radiation
daily_solar = solar.calculate_daily_radiation(
    dem=elevation_data,
    day_of_year=180,
    latitude=32.5,
    step_minutes=15
)

# Annual solar radiation
annual_solar = solar.calculate_annual_radiation(
    dem=elevation_data,
    latitude=32.5,
    step_minutes=15,
    num_threads=8
)

Functions

calculate_daily_radiation()

Calculate solar radiation for a single day.

Parameters: - dem (ndarray): Digital elevation model [m] - day_of_year (int): Julian day (1-365) - latitude (float): Site latitude [degrees] - step_minutes (int): Time step for calculation [minutes] - linke_turbidity (float): Atmospheric turbidity (1-8) - albedo (float): Surface albedo (0-1)

Returns: - ndarray: Daily solar radiation [MJ/m²/day]

calculate_annual_radiation()

Calculate solar radiation for entire year.

Parameters: - dem (ndarray): Digital elevation model [m] - latitude (float): Site latitude [degrees] - step_minutes (int): Time step [minutes] - num_threads (int): Parallel threads to use - output_dir (str, optional): Directory for intermediate files

Returns: - dict: Contains daily and monthly radiation arrays

eemt.climate

Climate data retrieval and processing.

from eemt import climate

# Download DAYMET data
climate_data = climate.download_daymet(
    bounds=(-111.0, 32.0, -110.5, 32.5),
    years=range(2020, 2023),
    variables=['tmin', 'tmax', 'prcp']
)

# Process climate data
processed = climate.process_climate_data(
    climate_data,
    target_crs='EPSG:32612'
)

Functions

download_daymet()

Download DAYMET climate data.

Parameters: - bounds (tuple): Bounding box (west, south, east, north) - years (list): Years to download - variables (list): Climate variables to retrieve - output_dir (str): Download directory

Returns: - xarray.Dataset: Climate data

process_climate_data()

Process and reproject climate data.

Parameters: - climate_data (xarray.Dataset): Raw climate data - target_crs (str): Target coordinate system - target_resolution (float): Target resolution [m]

Returns: - xarray.Dataset: Processed climate data

eemt.io

Input/output utilities for various data formats.

from eemt import io

# Read GeoTIFF
dem = io.read_geotiff('elevation.tif')

# Write results
io.write_geotiff(
    data=eemt_result,
    filepath='eemt_output.tif',
    crs=dem.crs,
    transform=dem.transform
)

# Read NetCDF
climate = io.read_netcdf('daymet_2020.nc')

Functions

read_geotiff()

Read GeoTIFF file with metadata.

Parameters: - filepath (str): Path to GeoTIFF file - band (int): Band number to read (default 1) - as_dataset (bool): Return xarray Dataset

Returns: - GeoTIFFData: Object with data, CRS, and transform

write_geotiff()

Write data to GeoTIFF format.

Parameters: - data (ndarray): Data array to write - filepath (str): Output file path - crs (CRS): Coordinate reference system - transform (Affine): Affine transformation - compress (str): Compression method ('lzw', 'deflate')

eemt.utils

Utility functions for data processing.

from eemt import utils

# Calculate topographic metrics
slope, aspect = utils.calculate_slope_aspect(dem)
twi = utils.calculate_twi(dem, flow_accumulation)

# Reproject data
reprojected = utils.reproject_raster(
    source_data,
    source_crs='EPSG:4326',
    target_crs='EPSG:32612'
)

Functions

calculate_slope_aspect()

Calculate slope and aspect from DEM.

Parameters: - dem (ndarray): Digital elevation model - resolution (float): Pixel resolution [m] - algorithm (str): 'horn' or 'zevenbergen'

Returns: - tuple: (slope, aspect) arrays

calculate_twi()

Calculate topographic wetness index.

Parameters: - dem (ndarray): Digital elevation model - resolution (float): Pixel resolution [m]

Returns: - ndarray: TWI values

Workflow Classes

EEMTWorkflow

High-level workflow orchestration.

from eemt import EEMTWorkflow

# Initialize workflow
workflow = EEMTWorkflow(
    dem_file='input_dem.tif',
    output_dir='./results',
    config={
        'start_year': 2020,
        'end_year': 2022,
        'step_minutes': 15,
        'num_threads': 8
    }
)

# Run complete workflow
workflow.run()

# Or run individual steps
workflow.prepare_inputs()
workflow.calculate_solar()
workflow.download_climate()
workflow.calculate_eemt()
workflow.generate_outputs()

Methods

__init__()

Initialize EEMT workflow.

Parameters: - dem_file (str): Path to input DEM - output_dir (str): Output directory - config (dict): Workflow configuration

run()

Execute complete workflow.

Parameters: - skip_existing (bool): Skip completed steps - cleanup (bool): Remove intermediate files

Returns: - dict: Workflow results and metadata

calculate_solar()

Run solar radiation calculations.

Parameters: - days (list, optional): Specific days to calculate

Returns: - dict: Solar radiation results

SolarWorkflow

Solar radiation workflow management.

from eemt import SolarWorkflow

# Configure solar workflow
solar_workflow = SolarWorkflow(
    dem_file='dem.tif',
    output_dir='./solar_output'
)

# Set parameters
solar_workflow.set_parameters(
    step_minutes=15,
    linke_turbidity=2.5,
    albedo=0.2
)

# Run calculations
results = solar_workflow.run(num_threads=8)

Data Classes

GeoTIFFData

Container for GeoTIFF data and metadata.

from eemt.io import GeoTIFFData

# Create from arrays
geotiff = GeoTIFFData(
    data=data_array,
    crs='EPSG:32612',
    transform=affine_transform,
    bounds=(-111.0, 32.0, -110.5, 32.5)
)

# Access properties
print(f"Shape: {geotiff.shape}")
print(f"Resolution: {geotiff.resolution}")
print(f"CRS: {geotiff.crs}")

# Export to file
geotiff.to_file('output.tif', compress='lzw')

ClimateData

Climate data container with utilities.

from eemt.climate import ClimateData

# Load climate data
climate = ClimateData.from_daymet(
    bounds=bbox,
    years=[2020, 2021, 2022]
)

# Access variables
temperature = climate.temperature
precipitation = climate.precipitation

# Calculate derived metrics
pet = climate.calculate_pet()
vpd = climate.calculate_vpd()

# Resample to match DEM
climate_resampled = climate.resample_to(dem_grid)

Exceptions

EEMTError

Base exception for EEMT errors.

from eemt.exceptions import (
    EEMTError,
    InvalidParameterError,
    DataNotFoundError,
    WorkflowError
)

try:
    workflow.run()
except InvalidParameterError as e:
    print(f"Invalid parameter: {e.parameter} = {e.value}")
except DataNotFoundError as e:
    print(f"Missing data: {e.data_type}")
except WorkflowError as e:
    print(f"Workflow failed at step: {e.step}")

Configuration

Default Configuration

from eemt import config

# Access default configuration
defaults = config.get_defaults()
print(defaults['solar']['step_minutes'])  # 15
print(defaults['solar']['linke_turbidity'])  # 2.0

# Override defaults
config.set_default('solar.step_minutes', 10)

# Load from file
config.load_config('eemt_config.yaml')

Configuration Schema

# eemt_config.yaml
solar:
  step_minutes: 15
  linke_turbidity: 2.0
  albedo: 0.2

climate:
  source: "daymet"
  variables:
    - tmin
    - tmax
    - prcp

eemt:
  methods:
    - traditional
    - topographic

performance:
  num_threads: 8
  chunk_size: 1000
  use_gpu: false

Logging

import logging
from eemt import setup_logging

# Configure logging
setup_logging(
    level=logging.INFO,
    log_file='eemt.log',
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

# Use logger in modules
logger = logging.getLogger('eemt.solar')
logger.info('Starting solar calculations')

Examples

Complete Analysis Pipeline

import numpy as np
from eemt import (
    EEMTWorkflow, 
    io, 
    utils,
    visualize
)

# Load input data
dem = io.read_geotiff('study_area_dem.tif')

# Calculate topographic metrics
slope, aspect = utils.calculate_slope_aspect(dem.data)
twi = utils.calculate_twi(dem.data)

# Initialize workflow
workflow = EEMTWorkflow(
    dem_file='study_area_dem.tif',
    output_dir='./analysis_results',
    config={
        'start_year': 2015,
        'end_year': 2020,
        'step_minutes': 15,
        'num_threads': 16
    }
)

# Run workflow with progress callback
def progress_callback(step, percent):
    print(f"{step}: {percent}% complete")

results = workflow.run(progress_callback=progress_callback)

# Visualize results
fig = visualize.plot_eemt_maps(
    results['eemt_traditional'],
    results['eemt_topographic'],
    title='EEMT Comparison'
)
fig.savefig('eemt_comparison.png', dpi=300)

# Generate statistics
stats = utils.calculate_statistics(
    results['eemt_topographic'],
    zones=vegetation_map
)
print(stats.to_dataframe())

Custom Workflow

from eemt import calculations, climate, solar
import concurrent.futures

def custom_eemt_analysis(dem_file, climate_bounds, years):
    """Custom EEMT workflow with parallel processing."""

    # Load DEM
    dem = io.read_geotiff(dem_file)

    # Parallel solar calculation
    with concurrent.futures.ProcessPoolExecutor() as executor:
        # Submit solar calculations for each year
        solar_futures = {
            year: executor.submit(
                solar.calculate_annual_radiation,
                dem.data,
                latitude=climate_bounds[1],
                step_minutes=15
            )
            for year in years
        }

        # Collect results
        solar_results = {
            year: future.result()
            for year, future in solar_futures.items()
        }

    # Download climate data
    climate_data = climate.download_daymet(
        bounds=climate_bounds,
        years=years,
        variables=['tmin', 'tmax', 'prcp', 'vp']
    )

    # Calculate EEMT for each year
    eemt_results = {}
    for year in years:
        eemt_results[year] = calculations.calculate_eemt_topographic(
            temperature=climate_data['tmax'].sel(time=str(year)),
            precipitation=climate_data['prcp'].sel(time=str(year)),
            solar_radiation=solar_results[year]['annual'],
            twi=utils.calculate_twi(dem.data)
        )

    return eemt_results

Performance Optimization

GPU Acceleration

from eemt import gpu

# Check GPU availability
if gpu.is_available():
    print(f"GPU: {gpu.get_device_name()}")

    # Enable GPU acceleration
    workflow = EEMTWorkflow(
        dem_file='dem.tif',
        config={'use_gpu': True}
    )

Dask Integration

import dask.array as da
from eemt import calculations

# Create Dask arrays
dem_chunked = da.from_array(dem_data, chunks=(1000, 1000))
temp_chunked = da.from_array(temp_data, chunks=(100, 1000, 1000))

# Parallel computation
eemt_lazy = calculations.calculate_eemt_traditional(
    temperature=temp_chunked,
    precipitation=precip_chunked,
    elevation=dem_chunked
)

# Compute with progress bar
from dask.diagnostics import ProgressBar
with ProgressBar():
    eemt_result = eemt_lazy.compute()

For more examples, see the Examples Documentation. For installation, see the Installation Guide.