Source code for omas.omas_hdc
'''save/load from HDC routines
-------
'''
from .omas_core import ODS
import numpy
import sys
from collections.abc import Sequence
try:
    _pyhdc_import_excp = None
    from pyhdc import HDC
except ImportError as _excp:
    _pyhdc_import_excp = _excp
    # replace HDC class by a simple exception throwing class
    class HDC(object):
        """Import error HDC class"""
        def __init__(self, *args, **kwargs):
            raise _pyhdc_import_excp
[docs]def save_omas_hdc(ods):
    """Convert OMAS data structure to HDC
    :param ods: input data structure
    :return: HDC container
    """
    # recurrent function - check types
    if isinstance(ods, ODS):
        if isinstance(ods.keys(), Sequence):
            # list type
            # TODO implement a better check
            hdc = HDC()
            for value in ods:
                hdc.append(save_omas_hdc(value))
        else:
            # mapping type
            hdc = HDC()
            for key, value in ods.items():
                hdc[key] = save_omas_hdc(value)
    else:
        # primitive type
        hdc = HDC(ods)
    return hdc 
[docs]def load_omas_hdc(hdc, consistency_check=True):
    """Convert HDC data structure to OMAS
    :param hdc: input data structure
    :param consistency_check: verify that data is consistent with IMAS schema
    :return: populated ODS
    """
    # recurrent function - check types
    if not isinstance(hdc, HDC):
        raise ValueError('expecting HDC type')
    else:
        if hdc.get_type_str() == 'list':
            # list type
            ods = ODS(consistency_check=False)
            for i in range(hdc.shape[0]):
                ods[i] = load_omas_hdc(hdc[i], consistency_check=None)
        elif hdc.get_type_str() == 'struct':
            # mapping type
            ods = ODS(consistency_check=False)
            for key in hdc.keys():
                ods[key] = load_omas_hdc(hdc[key], consistency_check=None)
        elif hdc.get_type_str() == 'null':
            # null type
            ods = ODS(consistency_check=False)
        elif hdc.get_type_str() == 'string':
            # string type
            ods = str(hdc)
        else:
            # numeric type
            ods = numpy.asarray(hdc)
            if numpy.isscalar(ods) or ods.size == 1:
                ods = ods.item()
    if consistency_check is not None:
        ods.consistency_check = consistency_check
    return ods 
[docs]def through_omas_hdc(ods, method=['function', 'class_method'][1]):
    """
    Test save and load HDC
    :param ods: ods
    :return: ods
    """
    ods = copy.deepcopy(ods)  # make a copy to make sure save does not alter entering ODS
    if method == 'function':
        hdc = save_omas_hdc(ods)
        ods1 = load_omas_hdc(hdc)
    else:
        hdc = ods.save('hdc')
        ods1 = ODS().load('hdc', hdc=hdc)
    return ods1