try:
    # framework is running
    from .startup_choice import *
except ImportError as _excp:
    # class is imported by itself
    if (
        'attempted relative import with no known parent package' in str(_excp)
        or 'No module named \'omfit_classes\'' in str(_excp)
        or "No module named '__main__.startup_choice'" in str(_excp)
    ):
        from startup_choice import *
    else:
        raise
from omfit_classes.omfit_hdf5 import OMFIThdf5
from omfit_classes.utils_fusion import available_EFITs
import numpy as np
__all__ = ['OMFITefitCDF', 'available_EFITs']
[docs]class OMFITefitCDF(OMFIThdf5):
    r"""
    class used to interface CDF files generated by EFIT++
    :param filename: filename passed to OMFITascii class
    :param \**kw: keyword dictionary passed to OMFITascii class
    """
    @property
    def times(self):
        return self['time']['data']
[docs]    def plot(self, time=None):
        """
        Function used to plot input constraints and outputs
        This method is called by .plot() when the object is a CDF file
        :param time: time in seconds
        :return: None
        """
        if time is None:
            time = self.times[0]
        fig = pyplot.gcf()
        fig.set_size_inches(11, 8)
        self.ax = pyplot.subplot(221)
        self.plot_trace('boundaries', title='Boundary', yname='[m]', xname='Time [s]', tgtName='rCoords', sigName='rSigmas')
        self.ax = pyplot.subplot(222)
        self.plot_trace('plasmaCurrent', title='Current', yname='[A]', xname='Time [s]', sigName='sigma')
        self.ax = pyplot.subplot(223)
        self.plot_profile('pressures', time, title='Pressure', yname='[Pa]', rName="rCoords")
        self.ax = pyplot.subplot(224)
        self.plot_profile('mse', time, title='MSE', yname='[Radians]', ylim_min=-5, ylim_max=5) 
[docs]    def plot_trace(
        self,
        grpName,
        yname=None,
        xname='Radius [m]',
        tgtName="target",
        cmpName="computed",
        sigName="sigmas",
        title=None,
        ylim_min=None,
        ylim_max=None,
    ):
        """
        :param grpName: EFIT++ constraint dictionary name e.g. [input][constraints][grpName]
        :param yname: y-axis figure title
        :param xname: x-axis figure title
        :param tgtName: EFIT++ target profile dictionary name e.g. [input][constraints][grpName][tgtName]
        :param cmpName: EFIT++ computed profile dictionary name e.g. [input][constraints][grpName][cmpName]
        :param sigName: EFIT++ sigma profile dictionary name e.g. [input][constraints][grpName][sigName]
        :param title: figure title
        :param ylim_min: y-axis figure minimum value
        :param ylim_max: y-axis figure maximum value
        :return:
        """
        if grpName not in self['input']['constraints']:
            print(grpName + " constraint does not exist")
            self.ax.set_visible(False)
            return
        # target profiles
        target = np.squeeze(self['input']['constraints'][grpName][tgtName]['data'])
        sigmas = np.squeeze(self['input']['constraints'][grpName][sigName]['data'])
        # computed profiles
        if grpName == 'boundaries':
            computed = np.squeeze(self['output']['separatrixGeometry']['rmidplaneOut']['data'])
        else:
            computed = np.squeeze(self['input']['constraints'][grpName][cmpName]['data'])
        self.ax.ticklabel_format(style='sci', scilimits=(0, 0), axis='y')
        self.ax.errorbar(self.times, target, marker='o', markersize=5, yerr=sigmas, label='Target', color='b')
        self.ax.plot(self.times, computed, marker='x', markersize=5, label='Computed', linewidth=2, color='r')
        self.ax.set_ylim(ylim_min, ylim_max)
        self.ax.legend(title=title, prop={'size': 10}, bbox_to_anchor=[0.98, 0.98], fancybox=True)
        self.ax.set_ylabel(yname)
        self.ax.set_xlabel(xname)
        self.ax.grid(True, linestyle='-', color='0.75', linewidth=0.2) 
[docs]    def plot_profile(
        self,
        grpName,
        time=None,
        yname=None,
        xname='Radius [m]',
        tgtName="target",
        cmpName="computed",
        sigName="sigmas",
        rName="r",
        title=None,
        ylim_min=None,
        ylim_max=None,
    ):
        '''
        :param grpName: EFIT++ constraint dictionary name e.g. [input][constraints][grpName]
        :param time: single time slice in seconds to plot profile data
        :param yname: y-axis figure title
        :param xname: x-axis figure title
        :param tgtName: EFIT++ target profile dictionary name e.g. [input][constraints][grpName][tgtName]
        :param cmpName: EFIT++ computed profile dictionary name e.g. [input][constraints][grpName][cmpName]
        :param sigName: EFIT++ sigma profile dictionary name e.g. [input][constraints][grpName][sigName]
        :param rName: EFIT++ radius profile dictionary name e.g. [input][constraints][grpName][rName]
        :param title: figure title
        :param ylim_min: y-axis figure minimum value
        :param ylim_max: y-axis figure maximum value
        :return:
        '''
        if time is None:
            time = self.times[0]
        if grpName not in self['input']['constraints']:
            print(grpName + " constraint does not exist")
            self.ax.set_visible(False)
            return
        # profile time slice
        tind = np.abs(time - self.times).argmin()
        # target profiles
        target = self['input']['constraints'][grpName][tgtName]['data']
        sigmas = self['input']['constraints'][grpName][sigName]['data']
        # computed profiles
        computed = self['input']['constraints'][grpName][cmpName]['data']
        # radius
        radius = self['input']['constraints'][grpName][rName]['data']
        # separatrix
        rSepOut = self['output']['separatrixGeometry']['rmidplaneOut']['data']
        if len(np.shape(radius)) > 1:
            radius = radius[tind, :]
        self.ax.ticklabel_format(style='sci', scilimits=(0, 0), axis='y')
        self.ax.errorbar(radius, target[tind, :], marker='o', markersize=5, yerr=sigmas[tind, :], label='Target', color='b')
        self.ax.plot(radius, computed[tind, :], marker='x', markersize=5, label='Computed', linewidth=2, color='r')
        self.ax.set_ylim(ylim_min, ylim_max)
        self.ax.plot([rSepOut[tind], rSepOut[tind]], self.ax.get_ylim(), linestyle='--', color='r', label='Separatrix')
        self.ax.legend(title=title + '; t= ' + str(time) + ' s', prop={'size': 10}, bbox_to_anchor=[0.98, 0.98], fancybox=True)
        self.ax.set_ylabel(yname)
        self.ax.set_xlabel(xname)
        self.ax.grid(True, linestyle='-', color='0.75', linewidth=0.2)  
############################################
if '__main__' == __name__:
    test_classes_main_header()
    tmp = OMFITefitCDF(OMFITsrc + '/../samples/efitOut.nc')
    print(tmp)