Source code for omfit_classes.omfit_idlSav
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_base import OMFITcollection
from omfit_classes.sortedDict import SortedDict
import numpy as np
import scipy
from scipy import io
__all__ = ['OMFITidlSav']
[docs]class OMFITidlSav(SortedDict, OMFITobject):
r"""
OMFIT class used to interface with IDL .sav files
Note that these objects are "READ ONLY", meaning that the changes to the entries of this object will not be saved to a file.
This class is based on a modified version of the idlsave class provided by https://github.com/astrofrog/idlsave
The modified version (omfit/omfit_classes/idlsaveOM.py) returns python dictionaries instead of np.recarray objects
:param filename: filename passed to OMFITobject class
:param \**kw: keyword dictionary passed to OMFITobject class
"""
def __init__(self, filename, **kw):
SortedDict.__init__(self)
self.caseInsensitive = True
OMFITobject.__init__(self, filename, **kw)
self.dynaLoad = True
[docs] @dynaLoad
def load(self):
"""
Method used to load the content of the file specified in the .filename attribute
:return: None
"""
if not (len(self.filename) and os.path.exists(self.filename) and os.stat(self.filename).st_size):
return
orig_sav = scipy.io.readsav(self.filename, verbose=False)
def get_iter(other_):
if isinstance(other_, dict):
keys = list(other_.keys())
elif isinstance(other_, np.recarray):
keys = other_.dtype.names
elif isinstance(other_, list):
keys = list(range(len(other_)))
elif isinstance(other_, np.ndarray):
keys = list(range(len(other_)))
return keys
def f_traverse(me, other_, keys):
for key in keys:
other = other_[key]
if isinstance(other, (np.recarray, np.record)):
convert_to_dict = False
if other.dtype.names is not None:
for item in other.dtype.names:
if (isinstance(other[item], np.ndarray) and other[item].dtype == object) or isinstance(
other[item], np.recarray
):
convert_to_dict = True
break
else:
me[key] = np.array(other)
continue
if convert_to_dict:
keys2 = get_iter(other)
if len(keys2) == 1:
me[key] = other[keys2[0]]
continue
else:
if other.shape[0] > 1:
printd(key, 'is going to be OMFITcollection because len(keys2)!=1 and other.shape[0]>1', topic='idlSav')
me[key] = OMFITcollection(sorted=True)
# me[key] = SortedDict(sorted=True)
for row in range(other.shape[0]):
mydict = SortedDict(sorted=True)
f_traverse(mydict, other[row], keys2)
me[key][row] = mydict
else:
me[key] = SortedDict(sorted=True)
f_traverse(me[key], other[0], keys2)
else:
me[key] = other
elif isinstance(other, np.ndarray) and other.dtype == object:
keys2 = get_iter(other)
if len(keys2) == 1:
me[key] = other[keys2[0]]
elif np.all([isinstance(b2s(other[x]), str) for x in keys2]):
me[key] = b2s(other)
else:
printd(key, 'is going to be OMFITcollection because len(keys2)!=1 and keys2 not str; keys2=', keys2, topic='idlSav')
me[key] = OMFITcollection(sorted=True)
# me[key] = SortedDict(sorted=True)
f_traverse(me[key], other, keys2)
elif isinstance(other, np.ndarray) and len(other.shape) == 1 and other.shape[0] == 1:
me[key] = other[0]
elif isinstance(other, bytes):
me[key] = other.decode('utf-8')
else:
me[key] = other
f_traverse(self, orig_sav, get_iter(orig_sav))