Source code for omfit_classes.omfit_jscope
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_ascii import OMFITascii
__all__ = ['OMFITjscope', 'OMFITdwscope']
[docs]class OMFITjscope(SortedDict, OMFITascii):
r"""
OMFIT class used to interface with jScope save files
:param filename: filename passed to OMFITascii class
:param \**kw: keyword dictionary passed to OMFITascii class
"""
def __init__(self, filename, **kw):
SortedDict.__init__(self)
OMFITascii.__init__(self, filename, **kw)
self.dynaLoad = True
[docs] @dynaLoad
def load(self):
with open(self.filename, 'r') as f:
lines = f.read().split('\n')
for line in lines:
if not len(line.strip()):
continue
elif line.startswith('Scope.'):
key, value = line.split(':', 1)
value = value.strip()
if value == 'false':
value = False
elif value == 'true':
value = True
else:
try:
value = ast.literal_eval(value.strip())
except (SyntaxError, ValueError):
pass
except Exception:
printe(line, value)
raise
h = self
for item in key.split('.')[1:-1]:
h = h.setdefault(item, {})
h[key.split('.')[-1]] = value
[docs] def server(self):
'''
Figure out server to connect to
:return: server name or machine name
'''
if 'data_server_argument' in self:
return self['data_server_argument']
elif 'global_1_1' in self and any('nstx' in str(value).lower() for value in self['global_1_1'].values()):
return 'NSTX'
else:
raise ValueError('Could not determine what MDS+ server to connect to')
[docs] def treename(self, item, yname):
'''
Figure out threename to use
:param item: thing to plot
:param yname: `y` or `y_expr_1`
:return:
'''
if 'experiment' in self[item].keys():
treename = self[item]['experiment']
else:
signal = self[item][yname]
if ':' in signal:
treename = signal.split(':')[0].strip('\\')
else:
treename = self['global_1_1']['experiment']
if 'pcs.' in treename.lower(): # for NSTX
treename = 'eng_test'
return treename
[docs] def plot(self, shot=None):
'''
Plot signals
:param shot: shot number
:return: dictionary with all axes indexed by a tuple indicating the row and column
'''
from matplotlib.pyplot import subplot
from omfit_classes.omfit_mds import OMFITmdsValue
axs = {}
rows = {}
cols = []
for item in self:
if not item.startswith('plot_'):
continue
r, c = map(int, item.split('_')[1:])
rows[c] = r
cols.append(c)
cols = max(cols)
ax = None
for item in self:
if not item.startswith('plot_'):
continue
r, c = map(int, item.split('_')[1:])
axs[r, c] = ax = subplot(rows[c], cols, cols * (r - 1) + c, sharex=ax)
ax.set_title(self[item]['title'].split("//")[0], y=0.5)
yname = 'y_expr_1' if 'y_expr_1' in self[item] else 'y'
xname = 'x_expr_1' if 'x_expr_1' in self[item] else 'x'
treename = self.treename(item, yname)
server = self.server()
if shot is not None:
y = OMFITmdsValue(server, treename, shot, self[item][yname])
if y.check():
if xname in self[item]:
treename = self.treename(self[item][xname])
x = OMFITmdsValue(server, treename, shot, self[item][xname]).data()
else:
x = y.dim_of(0)
ax.plot(x, y.data())
if self[item].get('x_log', False):
ax.set_xscale('log')
if self[item].get('y_log', False):
ax.set_yscale('log')
ax.set_xlim(self['global_1_1'].get('xmin',None), self['global_1_1'].get('xmax',None))
if shot is None:
printw('Please specify shot number')
return axs
[docs] def signal_treename(self, item):
yname = 'y_expr_1' if 'y_expr_1' in self[item] else 'y'
treename = self.treename(item, yname)
signal = self[item][yname].split(':')[-1].strip('\\')
return signal, treename
[docs]class OMFITdwscope(OMFITjscope):
pass