Source code for PseudoNetCDF.camxfiles.uamiv.Transforms

from __future__ import print_function
__all__ = ['osat']
__doc__ = """
.. _Write
:mod:`Write` -- CAMx uamiv variable transformations
==================================================

.. module:: Write
   :platform: Unix, Windows
   :synopsis: Provides :ref:`PseudoNetCDF` variable transformations
              for CAMx uamiv files.  See PseudoNetCDF.sci_var.PseudoNetCDFFile
              for interface details
.. moduleauthor:: Barron Henderson <barronh@unc.edu>
"""

from numpy import zeros
from PseudoNetCDF.sci_var import PseudoNetCDFFile, PseudoNetCDFVariables
from PseudoNetCDF.sci_var import PseudoIOAPIVariable
from .Memmap import uamiv


[docs] class osat(PseudoNetCDFFile): """ OSAT provides a way of slicing and summing tagged species. sources - dictionary of name and id for CAMx source codes (i.e. {'SOURCES1-5': '001','002','003','004','005'}) regions - dictionary of name and id for CAMx region codes (i.e. {'REGIONS1-5': '001','002','003','004','005'}) Example: # Source and regions definitions sources={'SOURCES1-5': ('001','002','003','004','005')} regions={'REGIONS1-5': ('001','002','003','004','005')} # File initiation osatfile=osat('path',sources,regions) # Variable (v) would return the sum of all O3V for all five # sources and all five regions v=osatfile.variables['O3V_SOURCES1-5_REGIONS1-5'] """ __delim = '_' def __init__(self, rffile, sources={}, regions={}): self.__child = uamiv(rffile) # Use Use all species based keys self.__sourcesbyNm = dict( [(k[3:6], k[3:6]) for k in self.__child.variables.keys() if k[:3] in ('NOX', 'VOC', 'O3V', 'O3N')]) self.__regionsbyNm = dict( [(k[6:], k[6:]) for k in self.__child.variables.keys() if k[:3] in ('NOX', 'VOC', 'O3V', 'O3N')]) # Create global keys self.__sourcesbyNm[''] = tuple(self.__sourcesbyNm.keys()) self.__regionsbyNm[''] = tuple(self.__regionsbyNm.keys()) for k, v in sources.items(): if isinstance(v, str): sources[k] = (v,) for k, v in regions.items(): if isinstance(v, str): regions[k] = (v,) # Update with user supplied keys self.__sourcesbyNm.update(sources) self.__regionsbyNm.update(regions) self.dimensions = self.__child.dimensions.copy() spc_keys = ['NOX', 'VOC', 'O3N', 'O3V'] allkeys = [i for i in self.__child.variables.keys()] for skey in spc_keys: for src in sources.keys() + ['']: for reg in regions.keys() + ['']: allkeys.append(self.__delim.join([skey, src, reg])) allkeys = [i for i in set(allkeys)] self.variables = PseudoNetCDFVariables(self.__variables, allkeys) def __indices(self, keys): return [self.__child.__var_names__.index(k) for k in keys] def __var_id_names(self, var_name): components = var_name.split(self.__delim) if len(components) == 1: keys = components else: spc, source, region = components keys = [] sources = self.__sourcesbyNm[source] regions = self.__regionsbyNm[region] for source in sources: for region in regions: key = spc + source + region if key in self.__child.variables.keys(): keys.append(key) return keys def __variables(self, key): var_id_names = self.__var_id_names(key) # var_nm_names=self.__var_nm_names(key) if len(var_id_names) > 1: outvals = zeros([len(self.dimensions[dk]) for dk in ['TSTEP', 'LAY', 'ROW', 'COL']], dtype='>f') for k in var_id_names: outvals[...] += self.__child.variables[k] else: outvals = self.__child.variables[var_id_names[0]] dimensions = ('TSTEP', 'VAR', 'LAY', 'ROW', 'COL') v = PseudoIOAPIVariable( self, key, 'f', dimensions, values=outvals, units='ppm') v.VAR_NAMES = ''.join([nm.ljust(16) for nm in var_id_names]) # v.VAR_NAME_DESCS=''.join([nm.ljust(16) for nm in var_nm_names]) return v