Source code for pycif.plugins.transforms.basic.clipcrop.forward

import copy

import xarray as xr
import numpy as np
from logging import debug
import os
from .....utils.path import init_dir


[docs] def forward( transform, inout_datastore, controlvect, obsvect, mapper, di, df, mode, runsubdir, workdir, onlyinit=False, **kwargs ): """Zero out grid cells inside (clip) or outside (crop) a lon/lat rectangle. Builds a boolean mask from the domain coordinates and ``transform.{xmin, xmax, ymin, ymax}``, then sets all masked cells to zero in both ``'spec'`` and (in TL mode) ``'incr'``. * ``mode = 'crop'``: mask = cells **inside** the rectangle → zeroed. * ``mode = 'clip'``: mask = cells **outside** the rectangle → zeroed. Args: transform (Plugin): clipcrop instance (carries ``mode``, ``xmin``, ``xmax``, ``ymin``, ``ymax``). inout_datastore (dict): mutable datastore. controlvect: unused. obsvect: unused. mapper (dict): transform mapper (provides domain coordinates). di (datetime): sub-simulation start date. df (datetime): sub-simulation end date. mode (str): ``'fwd'`` or ``'tl'``. runsubdir (str): unused. workdir (str): unused. onlyinit (bool): unused. **kwargs: unused. """ ddi = min(di, df) xmod_in = inout_datastore["inputs"] xmod_out = inout_datastore["outputs"] keys = ["spec"] if mode == "tl": keys.append("incr") for trid in xmod_in: xmod_out[trid][di] = {k: 0 for k in keys} # Find pixels to clip/crop domain = mapper["inputs"][trid]["domain"] mask = (domain.zlon >= transform.xmin) & (domain.zlon <= transform.xmax) \ & (domain.zlat >= transform.ymin) & (domain.zlat <= transform.ymax) if transform.mode == "crop": mask = ~mask # Apply values to outputs for k in keys: if k in xmod_in[trid][di]: xmod_out[trid][di][k] = copy.deepcopy(xmod_in[trid][di][k]) xmod_out[trid][di][k].values[..., mask] = 0.