def _create_variables(rootgrp, vname_map):
    """ Create all variables

        Params : 
            rootgrp : netcdf filehandle
            vname_map : list of BUFR info objects

        Output : 
            nc_vars : dict
                netcdf variable name and variable object

    """
    logger.debug("Creating variables")
    nc_vars = {}
    for key, ncvar_params in vname_map.iteritems():

        # only try to convert variables that define a netcdf_name parameter
        try:
            # don't try to write to netcdf file if name is not defined
            ncvar_name = ncvar_params['netcdf_name']
        except KeyError:
            continue

        # Guard ... dimension names cannot also be used at variable names
        if ncvar_name in rootgrp.dimensions:
            raise ValueError("Variable name %s also used as dimension name" %\
                    ncvar_name)

        try:
            var_type = ncvar_params['var_type']
            if var_type not in ['int', 'float', 'str', 'double', 'long']:
                raise BUFR2NetCDFError("Not a valid type %s" % var_type)
        except KeyError:
            raise BUFR2NetCDFError("Not a valid type %s" % var_type)
        #FIXME VARIABLE DIM CONFLICT
        try:
            fillvalue = ncvar_params['netcdf__FillValue']
        except KeyError:
            fillvalue = None

        record = 'record'
        try:
            record = ncvar_params['netcdf_dimension_name_unlim']
        except KeyError:
            pass

        try:
            # variable can be packed into a scalar
            if ncvar_params['packable_1dim'] and ncvar_params['packable_2dim']:
                nc_vars[key] = rootgrp.createVariable(
                    ncvar_name,
                    netcdf_datatype(ncvar_params['var_type']), ('scalar', ),
                    fill_value=eval(var_type)(fillvalue),
                    zlib=True,
                    least_significant_digit=3)
            # variable can be packed into a scanline vector
            elif ncvar_params['packable_1dim']:
                nc_vars[key] = rootgrp.createVariable(
                    ncvar_name,
                    netcdf_datatype(ncvar_params['var_type']),
                    (ncvar_params['netcdf_dimension_name'], ),
                    fill_value=eval(var_type)(fillvalue),
                    zlib=True,
                    least_significant_digit=3)
            # variable can be packed into a per scanline vector
            elif ncvar_params['packable_2dim']:
                nc_vars[key] = rootgrp.createVariable(
                    ncvar_name,
                    netcdf_datatype(ncvar_params['var_type']), (record, ),
                    fill_value=eval(var_type)(fillvalue),
                    zlib=True,
                    least_significant_digit=3)
            # variable can't be packed
            else:
                nc_vars[key] = rootgrp.createVariable(
                    ncvar_name,
                    netcdf_datatype(ncvar_params['var_type']),
                    (record, ncvar_params['netcdf_dimension_name']),
                    fill_value=eval(var_type)(fillvalue),
                    zlib=True,
                    least_significant_digit=3)

            setattr(nc_vars[key], 'unit', ncvar_params['netcdf_unit'])

            if 'netcdf_long_name' in ncvar_params:
                setattr(nc_vars[key], 'long_name',
                        ncvar_params['netcdf_long_name'])

            # append attribute to track bufr replication
            if 'bufr_replication' in ncvar_params:
                setattr(nc_vars[key], 'bufr_replication_factor',
                        ncvar_params['bufr_replication'])

        except KeyError, key_exception:
            logger.exception("Unable to find netcdf conversion, parameters")
def _create_variables(rootgrp, vname_map):
    """ Create all variables

        Params : 
            rootgrp : netcdf filehandle
            vname_map : list of BUFR info objects

        Output : 
            nc_vars : dict
                netcdf variable name and variable object

    """
    nc_vars = {}
    for key, ncvar_params in vname_map.iteritems():
        
        # only try to convert variables that define a netcdf_name parameter
        try:
            # don't try to write to netcdf file if name is not defined
            ncvar_name = ncvar_params['netcdf_name']
        except KeyError:
            continue

        # Guard ... dimension names cannot also be used at variable names
        if ncvar_name in rootgrp.dimensions:
            raise ValueError("Variable name %s also used as dimension name" %\
                    ncvar_name)

        try:
            var_type = ncvar_params['var_type']
            if var_type not in ['int', 'float', 'str', 
                    'double', 'long']:
                raise BUFR2NetCDFError("Not a valid type %s" % var_type )
        except KeyError:
            raise BUFR2NetCDFError("Not a valid type %s" % var_type )
        #FIXME VARIABLE DIM CONFLICT
        try:
            fillvalue = ncvar_params['netcdf__FillValue']
        except KeyError:
            fillvalue = None

        record = 'record'
        try:
            record = ncvar_params['netcdf_dimension_name_unlim']
        except KeyError:
            pass

        try:
            # variable can be packed into a scalar
            if ncvar_params['packable_1dim'] and ncvar_params['packable_2dim']:
                nc_vars[key] = rootgrp.createVariable( ncvar_name, 
                        netcdf_datatype(ncvar_params['var_type']) , 
                        ('scalar',), fill_value=eval(var_type)(fillvalue), 
                        zlib=False,least_significant_digit=3 )
            # variable can be packed into a scanline vector 
            elif ncvar_params['packable_1dim']:
                nc_vars[key] = rootgrp.createVariable( ncvar_name, 
                        netcdf_datatype(ncvar_params['var_type']) , 
                        (ncvar_params['netcdf_dimension_name'] ,), 
                        fill_value=eval(var_type)(fillvalue), 
                        zlib=False,least_significant_digit=3 )
            # variable can be packed into a per scanline vector
            elif ncvar_params['packable_2dim']:
                nc_vars[key] = rootgrp.createVariable( ncvar_name, 
                        netcdf_datatype(ncvar_params['var_type']) , 
                        ('record',), fill_value=eval(var_type)(fillvalue), 
                        zlib=False,least_significant_digit=3 )
            # variable can't be packed
            else:
                nc_vars[key] = rootgrp.createVariable( ncvar_name, 
                        netcdf_datatype(ncvar_params['var_type']) , 
                        ('record', ncvar_params['netcdf_dimension_name'] ), 
                        fill_value=eval(var_type)(fillvalue), 
                        zlib=False,least_significant_digit=3 )

            setattr(nc_vars[key], 'unit', ncvar_params['netcdf_unit'] )

            if 'netcdf_long_name' in ncvar_params:
                setattr(nc_vars[key], 'long_name', 
                        ncvar_params['netcdf_long_name'])

            # append attribute to track bufr replication
            if 'bufr_replication' in ncvar_params:
                setattr(nc_vars[key], 'bufr_replication_factor', 
                        ncvar_params['bufr_replication'])


        except KeyError, key_exception:
            logger.exception("Unable to find netcdf conversion, parameters")
def _create_variables(ncf, vname_map):
    """ Create all variables

        Params : 
            ncf : netcdf filehandle
            vname_map : list of BUFR info objects

        Output : 
            nc_vars : dict
                netcdf variable name and variable object

    """
    nc_vars = {}
    for key, ncvar_params in vname_map.iteritems():
        
        # only try to convert variables that define a netcdf_name parameter
        try:
            # don't try to write to netcdf file if name is not defined
            ncvar_name = ncvar_params['netcdf_name']
        except KeyError:
            continue
        
        try:
            # variable can be packed into a scalar
            if ncvar_params['packable_1dim'] and ncvar_params['packable_2dim']:
                nc_vars[key] = ncf.createVariable( ncvar_name, 
                        netcdf_datatype(ncvar_params['var_type']) , 
                        ('scalar',))
            # variable can be packed into a scanline vector 
            elif ncvar_params['packable_1dim']:
                nc_vars[key] = ncf.createVariable( ncvar_name, 
                        netcdf_datatype(ncvar_params['var_type']) , 
                        (ncvar_params['netcdf_dimension_name'] ,))
            # variable can be packed into a per scanline vector
            elif ncvar_params['packable_2dim']:
                nc_vars[key] = ncf.createVariable( ncvar_name, 
                        netcdf_datatype(ncvar_params['var_type']) , 
                        ('record',))
            # variable can't be packed
            else:
                nc_vars[key] = ncf.createVariable( ncvar_name, 
                        netcdf_datatype(ncvar_params['var_type']) , 
                        ('record', ncvar_params['netcdf_dimension_name'] ))

            setattr(nc_vars[key], 'unit', ncvar_params['netcdf_unit'] )

            var_type = ncvar_params['var_type']
            if var_type not in ['int', 'float', 'str', 
                    'double', 'long']:
                print "no valid type defined"
                return

            fillvalue = ncvar_params['netcdf__FillValue']
            setattr(nc_vars[key], '_FillValue', eval(var_type)(fillvalue))

            if 'netcdf_long_name' in ncvar_params:
                setattr(nc_vars[key], 'long_name', 
                        ncvar_params['netcdf_long_name'])

        except KeyError, key_exception:
            traceback.print_exc(file=sys.stdout)
            print key_exception