MaindimsQuantitiesLoader
- class PlasmaCalcs.quantities.maindims_quantities_loader.MaindimsQuantitiesLoader
Bases:
MainDimensionsHaver,QuantityLoaderloader for quantities related to the main dimensions.
Methods
__call__(var, *args[, name, item, verbose])returns value of var from self.
__init_subclass__(*[, dimension, dim_plural])called when subclassing DimensionHaver; sets some useful attributes related to dimension.
__setup_haver__(dim_cls, **kw_super)called by dim_cls.setup_haver(cls) when setting up cls so that it "has" dim_cls dimension.
as_single_dimpoint([values, dims])return DimPoint with values for dims, but raise DimensionValueError if any value is_iterable_dim.
assign_dim_coords(array, *dims[, skip])assign all dimensions in self as coords for array.
assign_maindims_coords(array)assign maindims dims and coords, based on self.get_maindims_coords() with slices=None.
attach_extra_coords(arr)attach any self.extra_coords to array arr but only if it is an xarray.DataArray or xarray.Dataset
check_pickle([x])checks that self (or, x, if provided) is pickleable, by pickling then unpickling.
cls_help([qstr, only, tree, modules, ...])prints str for help with quants.
cls_var_tree(var, *[, missing_ok])return QuantTree of MatchedQuantity objects from matching var and all dependencies,
copy()returns a deep copy of self.
current_n_dimpoints([dims])return number of points represented by current values of dims.
dim_values([dims])return dict of current values for dimensions in self.
dims_apply(funcname, *args_func[, dims])apply funcname to each dimension in self, with args_func and kw_func.
dims_get(attr[, dims])return dict of {dim: getattr(self.dimensions[dim], attr) for dim in dims}.
enumerate_dimpoints([dims, all])iterate through values of dims, yielding (idx, DimPoint) pairs.
get_behavior([keys])return value of self.behavior.
get_first_dimpoint([dims, enumerate])return DimPoint taking the first value of each dim in self.dimensions.
return array of 0s, with dimensions and coords implied by self.maindims.
get_maindims_coord_xarrays([dim])return dict of {dim: xarray of coords for dim} for dim in self.maindims.
get_maindims_coords(*[, slices, coords_units])return dict of {dim: coords} for all dims in self.maindims, applying self.slices appropriately.
return dict of maindims coords' indices, based on self.slices.
get_maindims_dgrid(dim)return grid spacing associated with dim values (dim in self.maindims).
get_maindims_dim_coord(var, *[, _match])maindims_x_coord = array of x values and x coordinates.
get_maindims_dim_dgrid(var, *[, _match])maindims_x_dgrid == array of underlying grid spacing associated with x values.
get_maindims_dim_didx(var, *[, _match])maindims_x_didx == array of index spacing associated with x values,
get_maindims_dim_dslice(var, *[, _match])maindims_x_dslice == array of spacing between adjacent x values, accounting for self.slices.
get_maindims_dim_idx(var, *[, _match])maindims_x_idx == array of index associated with x values,
get_ncpu()returns ncpu, but if None, return multiprocessing.cpu_count() instead.
get_set_or_cached(var)returns var if found in self.setvars or self.cache, with compatible behavior_attrs.
get_vars(vars, *args[, return_type, ...])returns values of vars from self.
has_var(var)return whether self can load var.
help([qstr, only, tree, modules, signature, ...])prints str for help with quants.
help_call_options([search])prints help for kw_call_options.
help_quants_str([qstr, only, tree, modules, ...])returns str for help with quants.
help_str([qstr, only])returns cls.help_quants_str(qstr=qstr, only=only, **kw).
iter_dimpoints([dims, all, restore, enumerate])iterate through values of dims, returning DimPoints and setting dim values during iteration.
kw_call_options(*[, sorted])returns list of kwarg names which can be used to set attrs self during self.__call__.
load_across_dims(loader, *args_loader[, ...])return loader(...), iterating & joining across each dimension.
load_across_dims_implied_by(var, loader, ...)return loader(...), iterating & joining across each dimension implied by var.
load_direct(var, *args, **kw)load var "directly", from some source which is not known by the main part of PlasmaCalcs.
load_fromfile(var, *args, **kw)load var directly from a file.
load_maindims_var(var, *args[, u, assign_labels])return var, formatted as an xarray with proper details for PlasmaCalcs.
load_maindims_var_across_dims(var[, dims, ...])load maindims var across these dims.
maintaining_attrs(*attrs, **attrs_as_flags)returns context manager which restores attrs of self to their original values, upon exit.
match_var(var, *[, check])match var from cls.KNOWN_VARS or cls.KNOWN_PATTERNS, or raise FormulaMissingError.
match_var_loading_dims(var, **kw_loading_dims)return dims for loading var across.
match_var_result_dims(var, **kw_result_dims)return dims which result of cls(var) will vary across.
match_var_result_size(var, *[, maindims])return size (number of elements) which self(var) will have.
match_var_tree([var])return QuantTree of MatchedQuantity objects from matching var and all dependencies,
pop_dim_keys(kw)return ({key: kw.pop(key) for key in self.dimensions if key in kw}, kw).
quant_tree([var])return QuantTree of MatchedQuantity objects from matching var and all dependencies,
set_attrs(**attrs)sets these attrs in self.
set self.{key} = kw.pop(key) for each key in self.dimensions if key in kw.
set_var(var, value[, behavior_attrs, ...])set var in self.
set_var_internal(var, value, behavior_attrs)set var in self.
slice_maindims(array, **kw_xarray_isel)slice maindims of array using self.slices.
slicestr(*[, sep, keep_None])string representation of self.slices, for use in filenames, titles, etc.
returns a copy of self.slices, but calling interprets_fractional_indexing on all slices,
title_with_slices([slices, sep, keep_None])return self.title with slicestr appended (after sep), if slicestr is not empty.
tree([var])return QuantTree of MatchedQuantity objects from matching var and all dependencies,
unset_var(var[, behavior_attrs, missing_ok])remove var from self.setvars (but only at values stored with relevant behavior).
unset_var_internal(var, behavior_attrs[, ...])unset var from self.setvars.
using_at_call_depth(depth, **attrs_and_values)context manager for setting attrs_and_values but only while call_depth == depth.
using_at_next_call_depth(**attrs_and_values)context manager for setting attrs_and_values but only while call_depth == self.call_depth + 1
using_attrs([attrs_as_dict, _unset_sentinel])returns context manager which sets attrs of obj upon entry; restores original values upon exit.
using_first_dimpoint([dims])return context manager which sets dimensions to their first values (when called); restore original on exit.
zeros_like_maindims(**kw_zeros_like)return array of all 0s like maindims var results (use ints to save space).
slice entries in dict using self.slices.
apply self.toplevel_scale_coords to arr, if nonempty, else return arr unchanged.
_assert_is_maindim(dim)asserts dim in self.maindims; crash with DimensionKeyError if not.
_battrs_for_set_var_internal(behavior_attrs)returns behavior_attrs which will be used by set_var_internal, given these inputs.
_battrs_for_unset_var_internal(behavior_attrs)returns behavior_attrs which will be used by unset_var_internal, given these inputs.
_call_hijacker(var, *args__None, **kw__None)returns False or name of hijacker method to use instead of self(var) call.
_call_loader0_at_dimpoint(dimpoint, loader0, ...)return self._call_loader_at_dimpoint(dimpoint, loader0, ...).
_call_loader_at_dimpoint(dimpoint, loader, ...)with self.using(**dimpoint): return loader(*args_loader, **kw_loader)
_call_postprocess(result, *, var[, name, item])postprocess result from self.__call__.
_call_postprocess_toplevel(result, *, var[, ...])additional postprocessing for self.__call__ when call_depth=1.
_call_preprocess(result, *, var)preprocessing during self.__call__.
return default for ncoarse during self.load_across_dims.
return default for ncpu during self.load_across_dims.
returns default for print_freq.
return default for timeout during self.load_across_dims.
return dict of dimensions in self; {dimension name: Dimension object}
return dict of {dim: coords} for all dimensions in self.maindims, ignoring self.slices.
returns self.get_maindims_coords() with tile_snaps applied appropriately.
_get_maybe_missing_var(var, *args[, ...])return value of var, or None if FormulaMissingError and missing_vars 'ignore' or 'warn'.
_handle_typevar_nan(*[, errmsg])crash with TypevarNanError if self.typevar_crash_if_nan, else return 'nan'.
_help_matches(qstr, k, v)returns whether qstr matches k or v, and thus should be displayed during self.help(qstr).
returns dict of docstrings for specialized kw call options for self.
context manager for incrementing call_depth.
_load_across_dims_postprocess(arrs, dims, *, ...)postprocessing results from load_across_dims, after all tasks have been completed.
returns single numpy array (with the data from arrs, which is an array of arrays).
handles array broadcasting for _load_across_dims_postprocess.
_load_maindims_var_with_labels(var, *args, **kw)equivalent to self.load_maindims_var(var, *args, assign_labels=True, **kw)
_load_maindims_var_without_labels(var, ...)equivalent to self.load_maindims_var(var, *args, assign_labels=False, **kw)
function to get multi_slices dims, by default.
_new_multi_slices(**kw)called when self.multi_slices accessed but not yet set; create & return new MultiSlices.
pop all self.kw_call_options() from kw, returning dict of popped options.
_provided_val(var[, _val, _known_vals])returns the value of var, either from _known_vals or _val.
return list of contents to go in repr of self.
_slice_maindims_numpy(array, *[, h5])slice first len(maindims) dims of array, using self.slices.
return list of maindims which become scalars when hit by self.slices.
_special_dims_shifters(dimnames, _shift_special)return (dict for self.using(...), dict for result.isel(...)) to _shift_special_dims.
specialize popped kw_call_options, adjusting keys and/or values as needed,
returns [pre-current, post-current] snaps to tile along based on self.tile_snaps and self.snap.
Attributes
KNOWN_PATTERNSKNOWN_SETTERSKNOWN_VARSUNSET, None, or number
whether to assign self.behavior values as attrs of result when calling self.
max call_depth at which to assign_behavior_attrs to result,
whether to use include_xr=False if self.assign_behavior_attrs,
dict of {attr: self.attr} for attr in self.behavior_attrs.
list of attrs in self which control behavior of self.
depth of the current call to self.
stores the value of call_depth, and helps to manage attrs dependent on call_depth value.
cls_behavior_attrsdict of dimensions in self; {dimension name: Dimension object}.
return dict of current values for dimensions in self.
bool: whether self.load_fromfile is enabled during self.load_direct.
dict of {coord_name: coord_value} to attach to outputs of self(var).
alias to __call__
known_patternknown_setterknown_varmaindimsself.maindims_shape when self.slices=None
self.maindims_size when self.slices=None
self.maindims_sizes when self.slices=None
whether to immediately take means across maindims when loading arrays.
tuple of (len(self.get_maindims_coords()[dim]) for dim in self.maindims).
product of terms in self.maindims_shape.
dict of {dim: size of dim} for dim in self.maindims.
alias to maintaining_attrs
dict of {key: slices dict}.
int or number between -1 < ikeep < 1
None or int
int
None or int
list of attrs in self which control behavior of self, but which are NOT in self.dimensions.
None, or number (possibly negative or 0)
like self.print_freq, but converts UNSET to value based on self.verbose,
alias to set_var
alias to set_var
VarCache of vars set via self.set_var().
slices for maindims when loading arrays & during get_maindims_coords.
instructions for tiling results from snaps, concatenating along a maindim.
None or int
dict of {coord_name: coord_scaling} to apply to top-level outputs of self(var).
bool.
alias to unset_var
alias to using_attrs
- __call__(var, *args, name=UNSET, item=False, verbose=UNSET, **kw)
returns value of var from self.
result is probably an xarray.DataArray, but not guaranteed.var: str or iterable of strs.Name of the var(s) to load. E.g. ‘n’ for number density, or [‘n’, ‘u’] for number density & velocity.If multiple vars: returns an xarray.Dataset of all vars, via self.get_vars.Determine how to load each var, as follows:- (caching) if var in self.cache, with matching self.behavior_attrs, use value from cache.[TODO] - caching not yet implemented. May allow for better efficiency.- (setvars) if var in self.setvars, with matching self.behavior_attrs, use value from setvars.[TODO] - improve set_var functionality.set_var will allow user to apply PlasmaCalcs calculations to arbitrary values,not just values from one of the hookups. Useful for testing & quick calculations.- (KNOWN_VARS) if var in self.KNOWN_VARS,use the corresponding function to get it.- (KNOWN_PATTERNS) if var matches a pattern from self.KNOWN_PATTERNS,use the corresponding function to get it.- (direct) attempt to load var “directly”, via self.load_direct.load_direct will almost always end up loading values directly from a file (e.g., “data”).This may include converting var to fromfile_var, i.e. match file naming conventions,and/or dimensions being loaded. E.g. ‘b’ may become ‘bz’ when loading across ‘component’.Then, check if fromfile_var in setvars and cache, returning relevant value if found.Lastly, call self.load_fromfile(fromfile_var).Those are checked in the order listed.If none of those work, raise FormulaMissingError.name: UNSET, None, or strtry to set result.name = name.If can’t set result.name, but result.attrs exists, set result.attrs[‘name’] = name, instead.UNSET –> use name = var.item: boolif True, convert result to single value (e.g., python float) via result.item().This will cause crash if result is not a single value;it will also cause all metadata stored in the result to be lost.verbose: UNSET, bool, or intset self.verbose during this call to self.UNSET –> use self.verbose (unchanged)kw may additionally contain any keys from self.kw_call_options().if it does, pop those values, and temporarily set the corresponding attr.E.g.: self(‘n’, units=’si’, fluid=1)–> temporarily set units=’si’, fluid=1, while getting ‘n’.See self.help_call_options() for more details.[EFF] passes _match=re.fullmatch(pattern, var) to the getter function,if the match is from KNOWN_PATTERNS (but not if it is from KNOWN_VARS).misc note: if self._call_hijacker(…), instead return result from the corresponding method.e.g. if it returns “_get_with_chunks” then return self._get_with_chunks(var, …).Call hijacking occurs after setting behavior attrs (insidewith self.using(...):block)but before altering call depth (outsidewith self._increment_call_depth():block).
- classmethod __init_subclass__(*, dimension=None, dim_plural=None, **kw_super)
called when subclassing DimensionHaver; sets some useful attributes related to dimension.
dimension: str or None
name of dimension associated with this subclass.if None, no particular dimension associated with this subclass.dim_plural: str or Noneplural form of dimension. if None, use str(dimension)+’s’.Sets various attributes in cls:cls._dimension = dimension,cls._dim_plural = dim_plural,cls._dim_types = dict of all {dimension name: Dimension subclass} from cls and cls.__bases__(note - connecting self._dimension to this dict is not handled here;it is handled by __setup_haver__ called by Dimension.setup_haver)
- classmethod __setup_haver__(dim_cls, **kw_super)
called by dim_cls.setup_haver(cls) when setting up cls so that it “has” dim_cls dimension.
- _apply_maindims_slices_to_dict(d)
slice entries in dict using self.slices. returns d. (Note: d will be directly altered.)
- _apply_toplevel_scale_coords(arr)
apply self.toplevel_scale_coords to arr, if nonempty, else return arr unchanged.
- _assert_is_maindim(dim)
asserts dim in self.maindims; crash with DimensionKeyError if not.
- _battrs_for_set_var_internal(behavior_attrs, forall=[], *, ukey=None)
returns behavior_attrs which will be used by set_var_internal, given these inputs.
see help(self.set_var_internal) for details.
- _battrs_for_unset_var_internal(behavior_attrs, forall=[], *, ukey=None)
returns behavior_attrs which will be used by unset_var_internal, given these inputs.
see help(self.unset_var_internal) for details.
- _call_hijacker(var, *args__None, **kw__None)
returns False or name of hijacker method to use instead of self(var) call.
Here, just returns False, always. Subclass might override.
- _call_loader0_at_dimpoint(dimpoint, loader0, args_loader, *, nload, MBmax, **kw_loader)
return self._call_loader_at_dimpoint(dimpoint, loader0, …).
Also does memory size check based on nload and MBmax.intended for internal use only, inside load_across_dims.arr0 is handled differently from other arrays in order to do some checks.
- _call_loader_at_dimpoint(dimpoint, loader, args_loader, **kw_loader)
with self.using(**dimpoint): return loader(*args_loader, **kw_loader)
- _call_postprocess(result, *, var, name=UNSET, item=UNSET)
postprocess result from self.__call__. Called during self.__call__.
(self.call_depth inside here will tell depth of the current call; depth=1 for top level.)result: any value, probably an xarray.DataArrayresult from self.__call__, before postprocessing.var, name, item: UNSET or valuepassed directly from self.__call__.The implementation here does the following (subclasses might override / add to this):(1) if self.verbose >= 4, print a message about getting var.(2) result = self.attach_extra_coords(result).(3) set result.name = name, or result.attrs[‘name’] = name, if possible.(4) if self.assign_behavior_attrs at this call depth, do so now.(5) if self.call_depth == 1, call self._call_postprocess_toplevel.(6) if item, convert result to single value via result.item().
- _call_postprocess_toplevel(result, *, var, name=UNSET, item=UNSET)
additional postprocessing for self.__call__ when call_depth=1.
called from self._call_postprocess, after doing other postprocessing, when call_depth=1.result: any value, probably an xarray.DataArrayresult from self.__call__, after other postprocessing (exceptitem).var, name, item: UNSET or valuepassed directly from self.__call__.Don’t need to handle these here because self._call_postprocess will handle it.The implementation here does the following (subclasses might override / add to this):(1) self._apply_toplevel_scale_coords (does nothing if self.toplevel_scale_coords is empty)
- _call_preprocess(result, *, var)
preprocessing during self.__call__. Called during self.__call__.
(self.call_depth inside here will tell depth of the current call; depth=1 for top level.)result: any value, probably RESULT_MISSINGresult from self.__call__, before preprocessing. Usually RESULT_MISSING.var: strvar being loaded. Passed directly from self.__call__.The implementation here does the following (subclasses might override / add to this):(1) if self.verbose >= 2 or DEFAULTS.DEBUG >= 7, print a message about getting var.(2) return result, unchanged.If the returned result is anything other than RESULT_MISSING,self.__call__ will return it instead of loading var normally.
- _default_ncoarse()
return default for ncoarse during self.load_across_dims. returns DEFAULTS.LOADING_NCOARSE
- _default_ncpu()
return default for ncpu during self.load_across_dims. returns DEFAULTS.LOADING_NCPU
- _default_print_freq()
returns default for print_freq. Here, returns UNSET; i.e., infer from self.verbose.
(See self.print_freq_explicit to get the actual value of print_freq.)
- _default_timeout()
return default for timeout during self.load_across_dims. returns DEFAULTS.LOADING_TIMEOUT
- _get_dimensions_dict()
return dict of dimensions in self; {dimension name: Dimension object}
- _get_maindims_coords_base()
return dict of {dim: coords} for all dimensions in self.maindims, ignoring self.slices.
E.g., {‘x’: xcoords, ‘y’: ycoords}, where xcoords and ycoords are numpy arrays.Results should be in self.coords_units (default: self.units) unit system.See also: self.get_maindims_coords().
- _get_maindims_coords_tiled()
returns self.get_maindims_coords() with tile_snaps applied appropriately.
(self.get_maindims_coords() calls this function internally when self.tile_snaps != False).
- _get_maybe_missing_var(var, *args, missing_vars=UNSET, **kw)
return value of var, or None if FormulaMissingError and missing_vars ‘ignore’ or ‘warn’.
missing_vars: UNSET, ‘ignore’, ‘warn’, or ‘raise’what to do if any var causes FormulaMissingError.UNSET –> use self.missing_vars if it exists, else ‘raise’.‘ignore’ –> return None.‘warn’ –> return None, but also print a warning.‘raise’ –> raise FormulaMissingError.
- _handle_typevar_nan(*, errmsg='')
crash with TypevarNanError if self.typevar_crash_if_nan, else return ‘nan’.
if crashing, use error message:errmsg + “nTo return ‘nan’ instead of crashing, set self.typevar_crash_if_nan=False.”
- classmethod _help_matches(qstr, k, v)
returns whether qstr matches k or v, and thus should be displayed during self.help(qstr).
qstr: str
the str to match; from self.help(qstr)k: varnamethe varname to test for matches.key from self.KNOWN_VARS.keys(), or key.str from self.KNOWN_PATTERNS.keys().v: LoadableQuantitythe LoadableQuantity to test for matches.value from self.KNOWN_VARS.values() or self.KNOWN_PATTERNS.values().matches if any of these are true:qstr == ‘’qstr in k.split(‘_’) # size limitation and split(‘_’) because, e.g. during help(‘n’),len(qstr)>=3 and qstr in k # want vars related to number density, not all vars with the letter ‘n’.qstr in module.split(‘.’) (where, module == v.get_f_module(cls))‘.’ in qstr and qstr in modulelen(qstr)>=3 and qstr in value from module.split(‘.’)len(qstr)>=3 and qstr in v.fnamere.fullmatch(k, qstr) # if k is a Patternotherwise, does not match.
- _help_specialized_kw_call_options()
returns dict of docstrings for specialized kw call options for self.
The implementation here just returns an empty dict, but subclass may override.
- _increment_call_depth()
context manager for incrementing call_depth.
use “with self._increment_call_depth():” inside of __call__, e.g.:
def __call__(self, *args, **kw):with self._increment_call_depth():# do stuff; possibly including calling self again.Equivalent to self.call_depth_manager.increment()
- _load_across_dims_postprocess(arrs, dims, *, it_dimnames, assign_coords, isel=None)
postprocessing results from load_across_dims, after all tasks have been completed.
i.e., after all arrays have been loaded, join them all together.
- _load_across_dims_postprocess__arrs_to_nparr(arr0, arrs)
returns single numpy array (with the data from arrs, which is an array of arrays).
- _load_across_dims_postprocess__broadcast_shapes(arr0, arrs, it_dimnames)
handles array broadcasting for _load_across_dims_postprocess.
returns (arr0, arrs), but with all arrs having the same shape as arr0. Crash if not possible.CAUTION: may edit arrs in-place.(Won’t edit individual arrays’ data; just arrs which contains the arrays.)NOTE: arr0 in result isn’t necessarily arrs.flat[0].arr0 in result is the “model array”, used to model coords & dims on.arr0 = first DataArray with size == max(size) across all arrays.E.g. if array shapes are [(), (), (7,1), (1,3), (7,3), (7,3) ()],then use arr0 = the first DataArray with shape (7,3).if neither array with shape (7,3) is a DataArray (i.e., has coords…)then crash instead (because we can’t properly assign coords to result.)it_dimnames: list of names of iterable dimensions; sometimes included in error message.
- _load_maindims_var_with_labels(var, *args, **kw)
equivalent to self.load_maindims_var(var, *args, assign_labels=True, **kw)
- _load_maindims_var_without_labels(var, *args, **kw)
equivalent to self.load_maindims_var(var, *args, assign_labels=False, **kw)
- _multi_slices_cls
alias of
MultiSlices
- _multi_slices_dims_default()
function to get multi_slices dims, by default.
Would love to use (lambda: self.maindims) instead of this function,however lambdas are not pickleable, thus incompatible with multiprocessing module.Providing this function allows the default multi_slices to still be pickleable.
- _new_multi_slices(**kw)
called when self.multi_slices accessed but not yet set; create & return new MultiSlices.
- _pop_kw_call_options(kw)
pop all self.kw_call_options() from kw, returning dict of popped options.
- _provided_val(var, _val=None, _known_vals={})
returns the value of var, either from _known_vals or _val.
if _val provided, return it; if ‘_{var}’ in _known_vals, return it;if both provided, crash with InputConflictError (unless they are the same object),else, return None.Can use this internally to avoid redundant recalculations. (See e.g. VectorArithmeticLoader)
- _repr_contents()
return list of contents to go in repr of self.
- _slice_maindims_numpy(array, *, h5=False)
slice first len(maindims) dims of array, using self.slices.
h5: bool
whether ‘array’ might be an h5py dataset.if True, handle negative step in the intuitive way;i.e. slice with positive step, to select the expected points, then reverse order.(This is necessary because h5 datasets crash when sliced by negative step…)
- _slices_which_scalarize()
return list of maindims which become scalars when hit by self.slices.
- _special_dims_shifters(dimnames, _shift_special)
return (dict for self.using(…), dict for result.isel(…)) to _shift_special_dims.
See docs of load_across_dims for more details.
- _specialized_kw_call_options(kw)
specialize popped kw_call_options, adjusting keys and/or values as needed,
to be suitable to pass to self.using(**kw).kw may be edited IN PLACE.Overriding this is discouraged, unless using property setters/getters is truly insufficient.If overriding this method, consider also overriding self._help_specialized_kw_call_options,to add documentation (inside self.help_call_options()) for any specialized kw call options.self.__call__ uses this method as follows:using=self._pop_kw_call_options(kw)using = self._specialize_using_kw_call_options(using)with self.using(**using):# <– majority of self.__call__ functionality goes here.The implementation here looks for any maindims in kw, using them to adjust relevant slices.Example: kw=dict(z=slice(100)) –> returns dict(slices={**self.slices, **{‘z’: slice(100)}})Example: kw=dict(y=9, slices=dict(x=8)) –> returns dict(slices=dict(x=8, y=9)).All other kwargs remain unchanged.
- _tile_snaps_snaps()
returns [pre-current, post-current] snaps to tile along based on self.tile_snaps and self.snap.
(raise ValueError if self._tile_snaps is False, InputError if not exactly 1 ‘current’ snap indicator,or SnapValueError if self.snap_is_iterable())pre-current and post-current are (possibly empty) lists of Snap objects.
- property array_MBmax
UNSET, None, or number
maximum result size allowed, in Megabytes.will raise a MemorySizeError if result size would be larger than this.UNSET –> use DEFAULTS.ARRAY_MBYTES_MAX (default: 1000 MB).None –> no limit.Assumes that each result (at each dimpoint) will be the same size.
- as_single_dimpoint(values=None, *, dims=None, **values_as_kw)
return DimPoint with values for dims, but raise DimensionValueError if any value is_iterable_dim.
values: None or dictvalues to use for the dimpoint.values will be joined with **values_as_kw; provided any of either will be equivalent.E.g. can use values={‘fluid’: ‘e’} or use fluid=’e’.if any are provided –> use values corresponding to self.{dim}=values[dim] for dim in dims.else –> use values of self.{dim} for dim in dims. (equivalent: self.dims_apply(‘_as_single’, dims=dims))dims: None or iterable of strs appearing in self.dimensions.keys()dimensions to include.None –> infer dimensions from keys of values (and values_as_kw).if no values were provided (values=None, and empty values_as_kw),use all dimensions from self.dimensions.keys().additional kwargs provide other {dim: value} items.Examples:self.as_single_dimpoint() –> DimPoint({dim: self.{dim} for dim in self.dimensions})self.as_single_dimpoint({‘fluid’: ‘e’}) –> DimPoint({‘fluid’: ‘e’})self.as_single_dimpoint(fluid=’e’) –> DimPoint({‘fluid’: ‘e’})self.as_single_dimpoint({‘fluid’: ‘e’}, snap=0) –> DimPoint({‘fluid’: ‘e’, ‘snap’: 0})self.as_single_dimpoint(dims=[‘fluid’, ‘snap’]) –> DimPoint({‘fluid’: self.fluid, ‘snap’: self.snap})
- property assign_behavior_attrs
whether to assign self.behavior values as attrs of result when calling self.
False –> don’t use self.behavior code architecture to assign attrs.True –> equivalent to ‘nondefault’‘nondefault’ –> self.behavior.assign_nondefault_attrs(result)(for brevity, it does not assign behavior attrs with “default” value.)‘all’ –> self.behavior.assign_attrs(result).[EFF] only assigns attrs at call_depth >= self.assign_behavior_attrs_max_call_depth.(default: only assigns attrs at call_depth=1, i.e. at top level.
- property assign_behavior_attrs_max_call_depth
max call_depth at which to assign_behavior_attrs to result,
if self.assign_behavior_attrs indicates to assign behavior attrs.default 1, i.e. only assign if at top level.Use None to indicate “no max depth”.
- property assign_behavior_attrs_skip_xr
whether to use include_xr=False if self.assign_behavior_attrs,
during self.behavior.assign_nondefault_attrs.Use this if you want to assign behavior attrs EXCEPT array-valued behavior attrs.
- assign_dim_coords(array, *dims, skip=[])
assign all dimensions in self as coords for array. (self.assign_{dim}_coord(array))
Assumes array is an xarray and does not have any dimensions in self.(array is not edited directly; returns result of assigning coords.)dims: iterable of dimensions in selfassign only these dimensions as coords. (use all dimensions if len(dims)==0)skip: iterable of dimensions in selfdo not assign these dimensions as coords.
- assign_maindims_coords(array)
assign maindims dims and coords, based on self.get_maindims_coords() with slices=None.
array must have same shape as implied by maindims and coords.if array is 0D, just return a 0D xr.DataArray.returns an xarray with proper details for PlasmaCalcs.(if self._slice_maindims_in_load_direct, actually uses self.slices instead of slices=None.)This function creates a *new* xarray based on array, and maindims & coords are >0 dimensional.This is not like assign_{dim}_coord functions, which assign 0D coord to an existing xarray.
- attach_extra_coords(arr)
attach any self.extra_coords to array arr but only if it is an xarray.DataArray or xarray.Dataset
- property behavior
dict of {attr: self.attr} for attr in self.behavior_attrs. Note dims are separate;
dims go in behavior.dims. E.g. Behavior({‘units’:’si’,…}, dims={‘snap’:0,…}).
- property behavior_attrs
list of attrs in self which control behavior of self.
Here, returns self.cls_behavior_attrs.Subclasses could override if any behavior attrs are not known at the class-level,e.g. if MySubclass’s list of behavior attrs varies between instances of MySubclass.
- property call_depth
depth of the current call to self. depth = number of calls to self from within self.
E.g., call_depth while calculating gyrofrequency:
# call_depth == 0, for any code run here (outside any call to self).self(‘gyrof’)# call_depth == 1, for any code run here (inside ‘gyrof’ call but not inside deeper calls).q = self(‘q’)# call_depth == 2, for code inside ‘q’ call.mod_B = self(‘mod_B’)# call_depth == 2, for code inside ‘mod_B’ call.self(‘B’)# call_depth == 3, for code inside ‘B’ call.m = self(‘m’)# call_depth == 2, for code inside ‘m’ call.result = q * mod_B / mCannot be set directly; can only be manipulated via self.call_depth_manager.
- property call_depth_manager
stores the value of call_depth, and helps to manage attrs dependent on call_depth value.
- check_pickle(x=None)
checks that self (or, x, if provided) is pickleable, by pickling then unpickling.
Returns result of unpickling. Useful for debugging.
- classmethod cls_help(qstr=None, only=None, *, tree=None, modules=False, signature=False, doc=True, dense=False, print=True, **kw)
prints str for help with quants. Fails for any quants which depend on present values of a cls instance.
qstr: None or str
None –> tells info about this class & how to use this function.in particular, tells that quants are stored cls.KNOWN_VARS and cls.KNOWN_PATTERNS,and describes behavior of calling help with a string.str –> return str for help with all quants related to str.use empty str to get help for all quants.only: None or strIf provided, only get help for a subset of relevant quantities.None –> get help with all quantities related to qstr.‘VARS’ –> only get help with KNOWN_VARS.‘PATTERNS’ –> only get help with KNOWN_PATTERNS.‘TREE’ –> only get help with quantities in cls.cls_var_tree(str).‘EXACT’ –> only get help for the KNOWN_VAR exactly matching qstr.if provided when qstr is None, treat qstr as ‘’ instead.tree: None or boolHow much help to give for quantities in cls.cls_var_tree(qstr).False –> don’t even check cls.cls_var_tree(qstr).True –> help for all quantities in cls.cls_var_tree.None –> help for quantities in cls.cls_var_tree(qstr).flat_branches_until_vars()i.e. patterns & vars in tree but ignore any nodes with LoadableVar ancestors.e.g. qstr=’mean_mod_beta’ –> help with ‘mean_(.+)’, ‘mod_(.+)’, and ‘beta’,but no help with dependencies of ‘beta’ (‘q’, ‘mod_B’, ‘m’).modules: boolWhether to include modules in result.If True, result will be grouped into sections with modules written at top.signature: signature: boolwhether to include line with signature in help string.e.g. “help_str(f, *, module=True, signature=True, indent=None)”doc: doc: boolwhether to include lines with docstring in help string.e.g. “return str for help(f).” … and all the other docs in here.dense: boolWhether to reduce whitespace in result.E.g. True –> no newlines between functions. False –> one newline between functions.print: boolwhether to print the result. If False, return the result instead of printing.
- classmethod cls_var_tree(var, *, missing_ok=False)
return QuantTree of MatchedQuantity objects from matching var and all dependencies,
using self.KNOWN_VARS and self.KNOWN_PATTERNS when searching for matches.missing_ok: boolwhether to be lenient sometimes when missing details that would allow to fully determine deps.see help(MatchedQuantity.dep_vars) for more details.
- copy()
returns a deep copy of self.
[TODO] implement something less hacky than using the pickle module?
- current_n_dimpoints(dims=None)
return number of points represented by current values of dims.
dims: None or iterable of strs appearing in self.dimensions.keys()dimensions to consider. None –> use all dimensions.E.g. current_n_dimpoints(self, dims=[‘fluid’, ‘snap’]) –> number of (fluid, snap) points;e.g. 3 fluids and 2 snaps –> 6 points.Note, for classes using maindims, maindims are not included in the number of dimpoints.Equivalent to len(list(self.iter_dimpoints(dims=dims, current=True)))
- dim_values(dims=None)
return dict of current values for dimensions in self.
dims: None or iterableif provided, only include these dimensions.Equivalent: DimRegion(self.dims_get(‘v’, dims=dims))
- property dimensions
dict of dimensions in self; {dimension name: Dimension object}.
e.g. {‘fluid’: self.fluid_dim, ‘snap’: self.snap_dim, …}.
- property dims
return dict of current values for dimensions in self. Equivalent: self.dim_values()
- dims_apply(funcname, *args_func, dims=None, **kw_func)
apply funcname to each dimension in self, with args_func and kw_func.
dims: None or iterable of strsif provided, only apply to these dimensions.See also: dims_get
- dims_get(attr, dims=None)
return dict of {dim: getattr(self.dimensions[dim], attr) for dim in dims}.
dims: None or iterableif provided, only include these dimensions.See also: dims_apply
- property enable_fromfile
bool: whether self.load_fromfile is enabled during self.load_direct.
If False, raise QuantCalcError if load_direct can’t get value without load_fromfile().
- enumerate_dimpoints(dims=None, *, all=False)
iterate through values of dims, yielding (idx, DimPoint) pairs.
idx is a dict of {dim: i} such that DimPoint values are {dim: dims[i] for dim,i in idx.items()}.Also, during iteration, set self.{dim} = value, as with self.iter_dim.Equivalent to self.iter_dimpoints(dims=dims, all=all, enumerate=True)
- property extra_coords
dict of {coord_name: coord_value} to attach to outputs of self(var).
Useful if planning to join the output of self(var) with output from a different QuantityLoader.E.g. self.extra_coords={‘run’: ‘run 0’} and other.extra_coords={‘run’: ‘run 1’},then xr.concat([self(‘n’), other(‘n’)], ‘run’) gives ‘n’ from self AND other.(this is nice if self and other have same values for dims. Otherwise, might struggle.)
- property get
alias to __call__
- get_behavior(keys=None)
return value of self.behavior.
keys: None or iterableif provided, only include these attrs.from nondim_behavior_attrs, or dims.
- get_first_dimpoint(dims=None, *, enumerate=False)
return DimPoint taking the first value of each dim in self.dimensions.
dims: None or iterable of strs appearing in self.dimensions.keys()dimensions to include. None –> use all dimensions.enumerate: boolwhether to return (idx, DimPoint) instead of just DimPoint.
- get_maindims_0()
return array of 0s, with dimensions and coords implied by self.maindims.
To save space, the result’s dtype is int, by default.Equivalent: self.zeros_like_maindims()
- get_maindims_coord_xarrays(dim=None)
return dict of {dim: xarray of coords for dim} for dim in self.maindims.
x: None or str; if provided, return result[x] instead.Result’s values use self.units; coords use self.coords_units (default==self.units).(e.g., units=’cgs’, coord_units=’si’ –> values are in cgs, but coords are in SI.)
- get_maindims_coords(*, slices=UNSET, coords_units=UNSET)
return dict of {dim: coords} for all dims in self.maindims, applying self.slices appropriately.
E.g., {‘x’: xcoords, ‘y’: ycoords}, where xcoords and ycoords are numpy arrays.Results will be in self.coords_units (default: self.units) unit system.slices: UNSET, None, or dictif provided (i.e. not UNSET) use these slices instead of self.slices.equivalent to: with self.using(slices=slices): get_maindims_coords().E.g., slices = None (or dict()) –> full maindims coords, without any slicing.coords_units: UNSET, None, or strif provided (i.e. not UNSET) use coords_units = coords_units instead of self.coords_units.equivalent to: with self.using(coords_units=coords_units): get_maindims_coords().E.g., coords_units = ‘si’ –> maindims coords in ‘si’ regardless of self.coords_units.
- get_maindims_coords_idx()
return dict of maindims coords’ indices, based on self.slices.
E.g. if self.slices[‘x’] = slice(10, None, 4),then result[‘x’] = array([10, 14, 18, …]).Values in result are xarray.DataArrays,with dim = the maindim, coords = the maindim’s coord values.
- get_maindims_dgrid(dim)
return grid spacing associated with dim values (dim in self.maindims).
Result is a 1D xarray.DataArray, with coords according to self.get_maindims_coords()[dim].Result’s values use self.units; coords use self.coords_units (default==self.units).(e.g., units=’cgs’, coord_units=’si’ –> values are in cgs, but coords are in SI.)If dim’s gradient cannot be inferred, result is NaN.Caution: this is the “underlying grid size”, regardless of self.slices.E.g., slicing with slice(None,None,4) will NOT lead to 4 times larger result.
- get_maindims_dim_coord(var, *, _match=None)
maindims_x_coord = array of x values and x coordinates.
Equivalent: self.get_maindims_coord_xarrays()[x], self(‘maindims_0’)[x]x must be one of self.maindims.Result’s values use self.units; coords use self.coords_units (default==self.units).(e.g., units=’cgs’, coord_units=’si’ –> values are in cgs, but coords are in SI.)
- get_maindims_dim_dgrid(var, *, _match=None)
maindims_x_dgrid == array of underlying grid spacing associated with x values.
Result’s values use self.units; coords use self.coords_units (default==self.units).(e.g., units=’cgs’, coord_units=’si’ –> values are in cgs, but coords are in SI.)Caution: this is the underlying grid cell size, regardless of self.slices;Thus, this value is suitable for asking questions about the underlying grid,e.g. “what is the smallest wavelength the grid can support?”But it is NOT suitable for doing an integral across this dim, because, e.g.,setting self.slices[x]=slice(None,None,4) does NOT lead to 4 times larger result.For doing an integral, consider instead: self(‘maindims_{x}_dslice’)Equivalent: self.get_maindims_dgrid(x)
- get_maindims_dim_didx(var, *, _match=None)
maindims_x_didx == array of index spacing associated with x values,
based on self.slices. Only works if x in self.maindims.E.g. if slices[x]=slice(10, None, 4), then result values = [4, 4, 4, …].Equivalent: xarray_np_gradient(self(‘maindims_{x}_idx’), x)
- get_maindims_dim_dslice(var, *, _match=None)
maindims_x_dslice == array of spacing between adjacent x values, accounting for self.slices.
Result’s values use self.units; coords use self.coords_units (default==self.units).(e.g., units=’cgs’, coord_units=’si’ –> values are in cgs, but coords are in SI.)Thus, this value is suitable for doing an integral.E.g., self.slices[x]=slice(None,None,4) should make ~4 times larger result than slice(None).(only “roughly”, because the gradient accounts for adjacent values in the dgrid array.)For learning about the underlying grid, consider self(‘maindims_{x}_dgrid’) instead.Equivalent: maindims_x_dgrid * maindims_x_didx.
- get_maindims_dim_idx(var, *, _match=None)
maindims_x_idx == array of index associated with x values,
based on self.slices. Only works if x in self.maindims.E.g. if slices[x]=slice(10, None, 4), then result values = [10, 14, 18, …].Equivalent: self.get_maindims_coords_idx[‘x’]
- get_ncpu()
returns ncpu, but if None, return multiprocessing.cpu_count() instead.
(This is for convenience; using None will also work with any methods defined here.)
- get_set_or_cached(var)
returns var if found in self.setvars or self.cache, with compatible behavior_attrs.
otherwise, raise CacheNotApplicableError.if var is found in self.setvars and has relevant, but not matching behavior_attrs,self.load_across_dims will be used to load the value.
- get_vars(vars, *args, return_type='dataset', missing_vars=UNSET, **kw)
returns values of vars from self.
result is probably an xarray.Dataset, but not guaranteed; also depends on return_type.Equivalent to self(vars, *args, return_type=’dataset’, **kw).(Actually, self(vars, …) will call self.get_vars(vars, …).)vars: iterable of strsNames of the vars to load. [‘n’, ‘u’] for number density & velocity.if any of these vars returns a return_type object, expand its keys,e.g. if ‘myDSvar’ returns dataset with ‘myvar1’, ‘myvar2’,then [‘n’, ‘myDSvar’] gives dataset with ‘n’, ‘myvar1’, ‘myvar2’.return_type: ‘dataset’ or ‘dict’if ‘dataset’, return result as xarray.Dataset.the data_var names will be the same as the var names.if ‘dict’, return result as dict of {var: value}.missing_vars: UNSET, ‘ignore’, ‘warn’, or ‘raise’what to do if any vars cause FormulaMissingError at any point in the error stack.UNSET –> use self.missing_vars if it exists, else ‘raise’.‘ignore’ –> ignore missing vars, and don’t include them in the result.‘warn’ –> ignore missing vars, but print a warning.‘raise’ –> raise FormulaMissingError if any vars are missing.additional args & kwargs are passed to self(…).
- has_var(var)
return whether self can load var. True if self.match_var(var) is found, else False.
Subclasses might override, to include checks for whether var can be loaded from data.[TODO] also check if var in self.cache or self.setvars.
- help(qstr=None, only=None, *, tree=None, modules=False, signature=False, doc=True, dense=False, print=True)
prints str for help with quants.
qstr: None or str
None –> tells info about this class & how to use this function.in particular, tells that quants are stored cls.KNOWN_VARS and cls.KNOWN_PATTERNS,and describes behavior of calling help with a string.str –> return str for help with all quants related to str.use empty str to get help for all quants.only: None or strIf provided, only get help for a subset of relevant quantities.None –> get help with all quantities related to qstr.‘VARS’ –> only get help with KNOWN_VARS.‘PATTERNS’ –> only get help with KNOWN_PATTERNS.‘TREE’ –> only get help with quantities in cls.cls_var_tree(str).‘EXACT’ –> only get help for the KNOWN_VAR exactly matching qstr.if provided when qstr is None, treat qstr as ‘’ instead.tree: None or boolHow much help to give for quantities in cls.cls_var_tree(qstr).False –> don’t even check cls.cls_var_tree(qstr).True –> help for all quantities in cls.cls_var_tree.None –> help for quantities in cls.cls_var_tree(qstr).flat_branches_until_vars()i.e. patterns & vars in tree but ignore any nodes with LoadableVar ancestors.e.g. qstr=’mean_mod_beta’ –> help with ‘mean_(.+)’, ‘mod_(.+)’, and ‘beta’,but no help with dependencies of ‘beta’ (‘q’, ‘mod_B’, ‘m’).modules: boolWhether to include modules in result.If True, result will be grouped into sections with modules written at top.signature: signature: boolwhether to include line with signature in help string.e.g. “help_str(f, *, module=True, signature=True, indent=None)”doc: doc: boolwhether to include lines with docstring in help string.e.g. “return str for help(f).” … and all the other docs in here.dense: boolWhether to reduce whitespace in result.E.g. True –> no newlines between functions. False –> one newline between functions.
- help_call_options(search=None)
prints help for kw_call_options.
if search is provided, only print help for keys containing search.
- classmethod help_quants_str(qstr=None, only=None, *, tree=None, modules=True, signature=False, doc=True, dense=False, _instance=None)
returns str for help with quants.
qstr: None or str
None –> tells info about this class & how to use this function.in particular, tells that quants are stored cls.KNOWN_VARS and cls.KNOWN_PATTERNS,and describes behavior of calling help with a string.str –> return str for help with all quants related to str.use empty str to get help for all quants.only: None or strIf provided, only get help for a subset of relevant quantities.None –> get help with all quantities related to qstr.‘VARS’ –> only get help with KNOWN_VARS.‘PATTERNS’ –> only get help with KNOWN_PATTERNS.‘TREE’ –> only get help with quantities in cls.cls_var_tree(str).‘EXACT’ –> only get help for the KNOWN_VAR exactly matching qstr.if provided when qstr is None, treat qstr as ‘’ instead.tree: None or boolHow much help to give for quantities in cls.cls_var_tree(qstr).False –> don’t even check cls.cls_var_tree(qstr).True –> help for all quantities in cls.cls_var_tree.None –> help for quantities in cls.cls_var_tree(qstr).flat_branches_until_vars()i.e. patterns & vars in tree but ignore any nodes with LoadableVar ancestors.e.g. qstr=’mean_mod_beta’ –> help with ‘mean_(.+)’, ‘mod_(.+)’, and ‘beta’,but no help with dependencies of ‘beta’ (‘q’, ‘mod_B’, ‘m’).modules: boolWhether to include modules in result.If True, result will be grouped into sections with modules written at top.signature: signature: boolwhether to include line with signature in help string.e.g. “help_str(f, *, module=True, signature=True, indent=None)”doc: doc: boolwhether to include lines with docstring in help string.e.g. “return str for help(f).” … and all the other docs in here.dense: boolWhether to reduce whitespace in result.E.g. True –> no newlines between functions. False –> one newline between functions._instance: None or QuantityLoader instanceif provided, use _instance.match_var_tree() instead of cls.cls_var_tree().
- classmethod help_str(qstr=None, only=None, **kw)
returns cls.help_quants_str(qstr=qstr, only=only, **kw).
cls.help() calls help_str.subclasses might overwrite help_str, but probably won’t touch help_quants_str.
- iter_dimpoints(dims=None, *, all=False, restore=True, enumerate=False)
iterate through values of dims, returning DimPoints and setting dim values during iteration.
DimPoints are dicts of {dim: value} for dim in dims, where not is_iterable_dim(value).Also, during iteration, set self.{dim} = value, as with self.iter_dim.dims: None or iterable of strs appearing in self.dimensions.keys()dimensions to consider. None –> use all dimensions.all: boolwhether to iterate through all possible values, or only the current values.False –> iterate through current values (e.g., self.snap, self.fluid, …).similar to itertools.product(self.iter_snap(), self.iter_fluid(), …)True –> iterate through all possible values (e.g., self.snaps, self.fluid, …)similar to itertools.product(self.iter_snaps(), self.iter_fluids(), …)Equivalent to all=False if all dims are set to None, e.g. self.snap=None, …restore: boolwhether to restore original dim values after iteration.enumerate: bool, default Falsewhether to yield indices too, i.e. (idx, DimPoint) instead of just DimPoint.idx would be a dict of {dim: i} such that DimPoint values are {dim: dims[i] for dim,i in idx.items()}.
- kw_call_options(*, sorted=True)
returns list of kwarg names which can be used to set attrs self during self.__call__.
(see self.__call__ for more details).Here, returns list(self.behavior_attrs) + list(self._extra_kw_for_quantity_loader_call)
- load_across_dims(loader, *args_loader, dims=[], assign_coords=None, loader0=None, _shift_special={}, **kw_loader)
return loader(…), iterating & joining across each dimension.
loader: callable of (*args_loader, **kw_loader) -> xarray.DataArray.
will call loader to get result values at each combination of dims values in self.(loader will probably depend on dims values from self.)dims: iterable of strs or Dimension objectsload across these Dimensions.loads across the current values (when this method was called) of each dimension,not necessarily “all” values. (e.g., self.snap, not self.snaps)str values –> use self.dimensions[d] (where d is a str in dims).len(dims)==0 –> just return loader(var, *args_loader, **kw_loader).While loading, set dim.loading=True for each dim.assign_coords: None or bool, default Nonewhether to dim.assign_coord for each result of loader, for each dimension.None –> assign coord only if dim.name not already in array.coords.loader0: None or callableif provided, use loader0 to get the first array, then use loader for the rest.Internally the first array’s .coords and .attrs are used to label the result;however all other arrays do not need to be converted to xarray._shift_special: UNSET or dict of (dimstr: list of special values)workaround to encourage loader0 to be called on a “usual” case, not a special case.if provided, and dimstr in dims, and d=self.dimensions[dimstr] has multiple values,with special_value first, and at least one non-special value later, theninternally rearrange dim values order before loading,then rearrange result back to original order (via indexing).E.g. _shift_special=dict(snap=[INPUT_SNAP]) –> apply loader0 to the first non-INPUT_SNAP,if there are any non-INPUT_SNAP snap values in snap, and ‘snap’ in dims.— MULTIPROCESSING STRATEGY OPTIONS (from self) —timeout: None or intmax duration, in seconds. Must be None or integer (due to limitations of signal.alarm method)None –> no time limit.Note: if time_limit is reached, will raise a TimeoutError and save the result so far.(in this case, any not-yet-calculated values will each be RESULT_MISSING.)# [TODO] make this happen, without making self un-picklable:in case of crash, results so far can be found in self._latest_load_tasks.Then possibly continued via:results = self._latest_load_tasks(…, reset=False, skip_done=True)result = self._load_across_dims_postprocess(results, dims, …)# [TODO] if crashing and resuming is common, make that easier to do^if self.timeout has not been set, use DEFAULTS.LOADING_TIMEOUT (default: None).ncpu: None or intmax number of cpus to use for multiprocessing.None –> use multiprocessing.cpu_count()int –> use this value. if 0 or 1, do not use multiprocessing here.Note: will actually use min(ncpu, number of calls to be made);e.g. if ncpu=4 but len(arg_kw_tuples)=2, will only use 2 cpus.if self.ncpu has not been set, use DEFAULTS.LOADING_NCPU (default: 1).ncoarse: intif >1, group tasks into groups of size ncoarse before performing them.if self.ncoarse has not been set, use DEFAULTS.LOADING_NCOARSE (default: 1).print_freq: None, or number (possibly negative or 0)>0 –> Minimum number of seconds between progress updates.=0 –> print every progress update.<0 –> never print progress updates.None –> use DEFAULTS.PROGRESS_UPDATES_PRINT_FREQif self.print_freq has not been set, infer from self.verbose if it exists,else use DEFAULTS.PROGRESS_UPDATES_PRINT_FREQ (default: 2).additional args & kwargs are passed as loader(*args_loader, **kw_loader).
- load_across_dims_implied_by(var, loader, *args_loader, assign_coords=None, _min_split=1, **kw_loader)
return loader(…), iterating & joining across each dimension implied by var.
Equivalent to self.load_across_dims(loader, …, dims=self.match_var_loading_dims(var)).var: strvariable which implies dims to load across, via self.match_var_loading_dims(var).loader: callable of (*args_loader, **kw_loader) -> xarray.DataArray.will call loader to get result values at each combination of dims values in self.(loader will probably depend on dims values from self.)assign_coords: None or bool, default Nonewhether to dim.assign_coord for each result of loader, for each dimension.None –> assign coord only if dim.name not already in array.coords._min_split: int, default 1if an implied dim has current_n() < min_split, don’t load across it.1 –> no minimum.additional args & kwargs are passed as loader(*args_loader, **kw_loader).
- load_direct(var, *args, **kw)
load var “directly”, from some source which is not known by the main part of PlasmaCalcs.
The implementation here just returns self.load_fromfile() (or crashes if not self.enable_fromfile),but subclasses may override to include more checks. (see DirectLoader)(Here also sets self._load_direct_used_override = None to indicate no override was used,i.e. result is from load_fromfile, not from something like setvars nor cache.)return the result (probably a numpy array, but not guaranteed).
- load_fromfile(var, *args, **kw)
load var directly from a file. Other methods should usually use load_direct, instead.
the implementation here just raises LoadingNotImplementedError;subclasses should implement this method in order to load any values from files.
- load_maindims_var(var, *args, u=None, assign_labels=True, **kw)
return var, formatted as an xarray with proper details for PlasmaCalcs.
loading var should give an array with self.maindims as dimensions.Also does these steps:1) assign maindims coords via self.assign_maindims_coords().2) slice array via self.slices.3) convert units, if u is not None4) set result.attrs[‘units’] = self.units5) if self.maindims_means: take mean of result, across all maindims.6) use result = self._maindims_postprocess_callback(result), if possible.(Before those steps, first checks special cases:- if tile_snaps, load for each snap then concatenate results appropriately.- if using multi_slices, load for each slice then combine results into xarray.Dataset(or combine into dict instead if assign_labels=False).)u: None, value, or strunits factor for the result.None –> don’t do any units conversions.str –> multiply result by self.u(u)value –> multiply result by uassign_labels: boolwhether to assign_maindims_coords and self.record_units.Recommend to always use True, unless using this function internally.(e.g. for load_maindims_var_across_dims, only use the first time, for efficiency.)IGNORED if self.maindims_means.Note:If load_direct(var) uses an override or gets from cache or self.setvars,skip steps 1,2,3,4([TODO] Might need to reconsider this behavior?)
- load_maindims_var_across_dims(var, dims=None, *, skip=[], u=None, **kw)
load maindims var across these dims. Use all dims from self.dimensions if dims is None.
Only loads across the current value of these dims (e.g., self.fluid, not self.fluids).(Can set current value to multiple values e.g. self.component = (‘x’, ‘y’).)u: None, value, or strunits factor for the result.None –> don’t do any units conversions.str –> multiply result by self.u(u)value –> multiply result by u
- property maindims_full_shape
self.maindims_shape when self.slices=None
- property maindims_full_size
self.maindims_size when self.slices=None
- property maindims_full_sizes
self.maindims_sizes when self.slices=None
- property maindims_means
whether to immediately take means across maindims when loading arrays. (default False.)
True –> treat data across maindims as if it were the mean values, only.Caution: this is different from taking means after doing calculations;e.g., with maindims_means = True, ‘n*T’ –> mean(n)*mean(T), not mean(n*T).
- property maindims_shape
tuple of (len(self.get_maindims_coords()[dim]) for dim in self.maindims).
Note, this should be sensitive to changes in self.slices. See also: self.maindims_full_shape.
- property maindims_size
product of terms in self.maindims_shape.
Note, this should be sensitive to changes in self.slices. See also: self.maindims_full_size.
- property maindims_sizes
dict of {dim: size of dim} for dim in self.maindims.
Note, this should be sensitive to changes in self.slices. See also: self.maindims_full_sizes.
- property maintaining
alias to maintaining_attrs
- maintaining_attrs(*attrs, **attrs_as_flags)
returns context manager which restores attrs of self to their original values, upon exit.
E.g. maintaining_attrs(obj, ‘attr1’, ‘attr2’, attr3=True, attr4=False)–> will restore upon exit, original values of obj.attr1, attr2, and attr3, but not attr4.
- classmethod match_var(var, *, check=['KNOWN_VARS', 'KNOWN_PATTERNS'])
match var from cls.KNOWN_VARS or cls.KNOWN_PATTERNS, or raise FormulaMissingError.
returns result=MatchedQuantity(var, loadable, _match=_match) where:
loadable is the LoadableQuantity associated with this var,_match is:None, if var in cls.KNOWN_VARS;re.fullmatch(pattern, var), if var matches any pattern in cls.KNOWN_PATTERNS.if var matches multiple patterns, only the first matching pattern is used.Uses MatchedVar if match from KNOWN_VARS, MatchedPattern if from KNOWN_PATTERNS.(note that both MatchedVar and MatchedPattern subclass MatchedQuantity.)check: str or list of str from [‘KNOWN_VARS’, ‘KNOWN_PATTERNS’]where to check for matches. Default is to check KNOWN_VARS and KNOWN_PATTERNS.E.g. to only check KNOWN_PATTERNS, use check=[‘KNOWN_PATTERNS’].loadable and _match can be retrieved via result.loadable and result._match.
- match_var_loading_dims(var, **kw_loading_dims)
return dims for loading var across.
Result will probably vary across these dims (but not guaranteed, if any dependency uses reduces_dims.)These are all Dimension dims, not maindims. (E.g. ‘fluid’ and ‘snap’, but not ‘x’, ‘y’, ‘z’).Equivalent: self.match_var_tree(var).loading_dims(**kw_loading_dims)
- match_var_result_dims(var, **kw_result_dims)
return dims which result of cls(var) will vary across.
These are all Dimension dims, not maindims. (E.g. ‘fluid’ and ‘snap’, but not ‘x’, ‘y’, ‘z’).Equivalent: cls.match_var_tree(var).result_dims(**kw_result_dims)
- match_var_result_size(var, *, maindims=True, **kw_result_dims)
return size (number of elements) which self(var) will have.
(Efficient; doesn’t actually get self(var).)Depends on current values of relevant dims. (E.g., self.fluid, not self.fluids)maindims: boolif True, include maindims_shape when calculating size.
- match_var_tree(var=UNSET, **kw_quant_tree_from_quantity_loader)
return QuantTree of MatchedQuantity objects from matching var and all dependencies,
using self.KNOWN_VARS and self.KNOWN_PATTERNS when searching for matches.var must be provided; var=UNSET will raise an error (helpful if tried calling this as a classmethod).See also: type(self).cls_var_tree, for the classmethod version of this function.Most of the time it is possible to get tree without any details from self,but sometimes not. e.g. when getting collision frequencies, self.fluid affects deps.additional kwargs will be passed to QuantTree.from_quantity_loader(…),which passes kwargs from self.kw_call_options() into self.using(**kw) while getting deps.
- matched_pattern_cls
alias of
MatchedPattern
- matched_var_cls
alias of
MatchedVar
- property multi_slices
dict of {key: slices dict}.
When getting any vars across maindims, make a Dataset by applying each of these, separately.If len(multi_slices)>0 then ignore self.slices.Can also provide special keys ‘ndim’ and/or ‘ikeep’ to create special slices:Example: if self.maindims=[‘x’, ‘y’, ‘z’], then self.multi_slices = dict(ndim=2, ikeep=0)is equivalent to: self.multi_slices = dict(x_y=dict(z=0), x_z=dict(y=0), y_z=dict(x=0))Details:ndim: None or intNone –> ignore, and do not create special slices.int –> create special slices to keep this many dims after applying each slice.Example: MultiSlices(ndim=2) is shorthand for“MultiSlices with one slices for every possible combination of keeping 2 dims”.Example: MultiSlices(ndim=2, dims=[‘x’, ‘y’, ‘z’], ikeep=0) is equivalent to:MultiSlices(keep_x_y=dict(z=0), keep_y_z=dict(x=0), keep_x_z=dict(y=0))Example: MultiSlices(ndim=1, dims=[‘x’, ‘y’, ‘z’], ikeep=0) is equivalent to:MultiSlices(keep_x=dict(y=0, z=0), keep_y=dict(x=0, z=0), keep_z=dict(x=0, y=0))ikeep: int or number between -1 < ikeep < 1index to take when picking a single value for sliced dimensions for special slices.Default is 0, e.g. when slicing x, keep x[0].int –> when slicing dim, keep dim[ikeep]. E.g. 10 –> keep x[10]non-int between -1 and 1 –> multiply by length of dim to get index.see interprets_fractional_indexing for more details.Can also set these as attributes of self.multi_slices to achieve the same effect.E.g. self.multi_slices.ndim = 2
- property multi_slices_ikeep
int or number between -1 < ikeep < 1
index to take when picking a single value for sliced dimensions for special slices.Default is 0, e.g. when slicing x, keep x[0].int –> when slicing dim, keep dim[ikeep]. E.g. 10 –> keep x[10]non-int between -1 and 1 –> multiply by length of dim to get index.see interprets_fractional_indexing for more details.
- property multi_slices_ndim
None or int
None –> ignore, and do not create special slices.int –> create special slices to keep this many dims after applying each slice.Example: MultiSlices(ndim=2) is shorthand for“MultiSlices with one slices for every possible combination of keeping 2 dims”.Example: MultiSlices(ndim=2, dims=[‘x’, ‘y’, ‘z’], ikeep=0) is equivalent to:MultiSlices(keep_x_y=dict(z=0), keep_y_z=dict(x=0), keep_x_z=dict(y=0))Example: MultiSlices(ndim=1, dims=[‘x’, ‘y’, ‘z’], ikeep=0) is equivalent to:MultiSlices(keep_x=dict(y=0, z=0), keep_y=dict(x=0, z=0), keep_z=dict(x=0, y=0))
- property ncoarse
int
if >1, group tasks into groups of size ncoarse before performing them.
- property ncpu
None or int
max number of cpus to use for multiprocessing.None –> use multiprocessing.cpu_count()int –> use this value. if 0 or 1, do not use multiprocessing here.Note: will actually use min(ncpu, number of calls to be made);e.g. if ncpu=4 but len(arg_kw_tuples)=2, will only use 2 cpus.see also: self.get_ncpu() to read actual number of cpus when self.ncpu is None.
- property nondim_behavior_attrs
list of attrs in self which control behavior of self, but which are NOT in self.dimensions.
- pop_dim_keys(kw)
return ({key: kw.pop(key) for key in self.dimensions if key in kw}, kw).
- property print_freq
None, or number (possibly negative or 0)
>0 –> Minimum number of seconds between progress updates.=0 –> print every progress update.<0 –> never print progress updates.None –> use DEFAULTS.PROGRESS_UPDATES_PRINT_FREQ
- property print_freq_explicit
like self.print_freq, but converts UNSET to value based on self.verbose,
UNSET –> result depends on self.verbose:False or <=0 –> -1True or (>=1 and <5) –> None>=5 –> 0 (i.e. print every progress update)if self.verbose doesn’t exist –> Noneif result would be None, instead give DEFAULTS.PROGRESS_UPDATES_PRINT_FREQ.
- quant_tree(var=UNSET, **kw_quant_tree_from_quantity_loader)
return QuantTree of MatchedQuantity objects from matching var and all dependencies,
using self.KNOWN_VARS and self.KNOWN_PATTERNS when searching for matches.var must be provided; var=UNSET will raise an error (helpful if tried calling this as a classmethod).See also: type(self).cls_var_tree, for the classmethod version of this function.Most of the time it is possible to get tree without any details from self,but sometimes not. e.g. when getting collision frequencies, self.fluid affects deps.additional kwargs will be passed to QuantTree.from_quantity_loader(…),which passes kwargs from self.kw_call_options() into self.using(**kw) while getting deps.
- property set
alias to set_var
- set_attrs(**attrs)
sets these attrs in self.
- set_pop_dim_attrs(kw)
set self.{key} = kw.pop(key) for each key in self.dimensions if key in kw.
- set_var(var, value, behavior_attrs=None, forall=[], *, ukey=None, forced=False, **kw_using)
set var in self. When later doing self(var) to get var, return the set value,
but only if self.behavior is compatible with the relevant parts of self.behavior when var was set.This function will use, if it exists:self.KNOWN_SETTERS[var](self, value, behavior_attrs, forall=forall)Otherwise, calls:self.set_var_internal(var, value, self.behavior_attrs, forall=forall)var: strthe var to set in self.value: number, xarray, iterable or 1D array, array with shape matching self.maindims_shape.the value to set var to.number –> set var to this number.xarray –> set var to this xarray.[TODO](not yet implemented) iterable or 1D array –> set var to these values along dim=’testing’.[TODO](not yet implemented) array with shape matching self.maindims_shape –> set var to this array.behavior_attrs: None or listtells which attrs from self control behavior of the set var.The set var will only be retrieved when behavior_attrs of self are compatible.E.g. set_var(‘n’, [‘fluid’, ‘snap’]) –> saves ‘n’ in cache with current fluid & snap.Will only load ‘n’ if self.fluid and self.snap == cached fluid and snap for ‘n’.if var in self.KNOWN_SETTERS, cannot provide behavior_attrs here.else, use self.behavior_attrs if None.forall: list of stringsif provided, tells which attrs of self do NOT control the behavior of the set var.E.g. forall=[‘snap’] –> ‘snap’ will NOT be included in behavior_attrs.(anything in behavior_attrs AND forall will be removed from the final behavior_attrs)ukey: None or strif provided, tells string to give to UnitsManager when converting value’s units.When ukey is known, setting value in any unit system will enable to read it in all unit systems.E.g. set_var(‘n’, 1e10, …, ukey=’n’, units=’si’)–> self(‘n’, units=’raw’) == self(‘n’, units=’si’) * self.u(‘u’, ‘raw’, convert_from=’si’)if not provided, value will be associated with current unit system;attempted to read value in any other unit system will not used the cached value set here.E.g. set_var(‘u’, 1e10, …, units=’si’) # ukey not provided–> self(‘u’, units=’raw’) –> uses self’s other logic for getting ‘u’, not from setvars.note: if provided, ‘units’ will be added to behavior_attrs if not already in there.forced: bool, default Truehandles the case where self.KNOWN_SETTERS[var] doesn’t exist. In that case…True –> set var in self, anyway.False –> crash; raise FormulaMissingErroradditional kwargs, if provided, go to self.using(**kw) during the operation.returns list of set quantities.
- set_var_internal(var, value, behavior_attrs, forall=[], *, ukey=None)
set var in self. KNOWN_SETTERS functions may wish to use this method.
(KNOWN_SETTERS functions should NOT use self.set_var, to avoid recursion issue.)This function has the internal logic for self.set_var;set_var calls set_var_internal when self.KNOWN_SETTERS[var] not provided.var: strthe var to set in self.value: number, xarray, iterable or 1D array, array with shape matching self.maindims_shape.the value to set var to. See help(self.set_var) for more info.behavior_attrs: list of stringsthe behavior attrs relevant to setting this var;getting var only gives value when current behavior attrs values are compatible with the cached ones.forall: list of stringsif provided, tells which behavior attrs do NOT control the behavior of the set var.e.g. behavior_attrs=[‘snap’, ‘fluid’], forall=[‘snap’] –> use [‘fluid’], only.ukey: None or strif provided, tells string to give to UnitsManager when converting value’s units;when ukey is provided, can retrieve value in any unit system (probably ‘si’ or ‘raw’).when ukey not provided, if ‘units’ in used behavior attrs, can only retrieve value in that unit system.
- property setvar
alias to set_var
- property setvars
VarCache of vars set via self.set_var(). Returns these values when appropriate,
i.e. whenever self.behavior is compatible with the behavior in the cache.To empty the cache, use self.setvars.clear() to empty the cache.
- slice_maindims(array, **kw_xarray_isel)
slice maindims of array using self.slices. See help(type(self).slices) for more details.
(if slices is an empty dict, return array, unchanged, without making a copy.)Only slice dims which actually appear in array.
- property slices
slices for maindims when loading arrays & during get_maindims_coords.
E.g. slices = dict(x=slice(0,50), y=7)–> slice arrays along x & y, taking the first 50 x values, and only the 7th y value.Setting self.slices = None means “no slices” and will actually set self.slices to an empty dict().(self.slices = None –> (self.slices is None) == False, but (self.slices == dict()) == True.)Notes:- only applies slices along arrays which actually contain the related coordinates,e.g. if z=10 appears in slice but loading an array with only x & y, won’t apply z=10 slice.- supports fractional indexing, as per interprets_fractional_indexing.Non-integer values between -1 and 1 can be used to infer to a fraction of the dimension length,with negative values referring to a distance from the end, just like with integer indexing.Example: dict(x=slice(-0.3, None, 0.01), y=0.8), where x and y each have length 1000–> equivalent to dict(x=slice(-300, None, 10), y=800).
- slicestr(*, sep=', ', keep_None=False)
string representation of self.slices, for use in filenames, titles, etc.
comma-separated, alphabetized, ignoring slice(None).Supports single-indexes (e.g. x=5), slices (e.g. y=slice(0, 4)),and fractional indexing (e.g. z=slice(0, 0.5, 0.01)),though fractional indexing will be converted to ints.sep: str, separator between sliceskeep_None: bool, whether to keep slices with value None in the string.
- standardized_slices()
returns a copy of self.slices, but calling interprets_fractional_indexing on all slices,
using lengths from self.maindims_full_sizes.
- property tile_snaps
instructions for tiling results from snaps, concatenating along a maindim.
False –> no tiling.(dim, snaps iterable) –> tile snaps along dim, concatenating along dim.Exactly 1 snap indicator must be None, ‘here’, or ‘current’ to indicate “the current snap”.E.g., (‘x’, [5, ‘current’, ‘snap100’]) –> results get stacked along x, like this:[results from 5th snap, results from current snap, results from snap with name==’snap100’]Coordinates will be shifted by appropriate offsets, too,with coords in ‘current’ matching maindims coords for current snap.
- property timeout
None or int
max duration, in seconds. Must be None or integer (due to limitations of signal.alarm method)None –> no time limit.Note: if time_limit is reached, will raise a TimeoutError and save the result so far.(in this case, any not-yet-calculated values will each be RESULT_MISSING.)
- title_with_slices(slices=UNSET, *, sep=', ', keep_None=False)
return self.title with slicestr appended (after sep), if slicestr is not empty.
see self.slicestr() for more details.slices: None, dict, or UNSETslices to use instead of self.slices, if provided (i.e. not UNSET).(original slices will be restored after this operation)
- property toplevel_scale_coords
dict of {coord_name: coord_scaling} to apply to top-level outputs of self(var).
(Never applies to internal calls of self(var), only applies at self.call_depth==1.)Useful if making plots and want to scale coords by some factor.E.g., self.toplevel_scale_coords = {‘t’: 1000} to convert s to ms.CAUTION: coord units labels will remain unaffected.
- tree(var=UNSET, **kw_quant_tree_from_quantity_loader)
return QuantTree of MatchedQuantity objects from matching var and all dependencies,
using self.KNOWN_VARS and self.KNOWN_PATTERNS when searching for matches.var must be provided; var=UNSET will raise an error (helpful if tried calling this as a classmethod).See also: type(self).cls_var_tree, for the classmethod version of this function.Most of the time it is possible to get tree without any details from self,but sometimes not. e.g. when getting collision frequencies, self.fluid affects deps.additional kwargs will be passed to QuantTree.from_quantity_loader(…),which passes kwargs from self.kw_call_options() into self.using(**kw) while getting deps.
- property typevar_crash_if_nan
bool. whether to crash methods if typevar output would be ‘nan’.
False –> return NaN when typevar gives ‘nan’, instead of crashing.“typevar” here refers to any var used for checking which formula to use, from various options,e.g. ‘ntype’ in MhdMultifluidLoader or ‘ionfrac_type’ in MhdIonizationLoader.The relevant methods can check if self.typevar_crash_if_nan before returning a ‘nan’ result.
- property unset
alias to unset_var
- unset_var(var, behavior_attrs=[], *, missing_ok=True, **kw_using)
remove var from self.setvars (but only at values stored with relevant behavior).
[TODO] define rules for which vars unset which other vars…e.g. for eppic right now, set_var(‘n’) sets ‘den’ but not ‘n’;unset_var(‘n’) unsets nothing… but should probably alias to unset_var(‘den’).behavior_attrs: list of stringsonly remove cached values where self.behavior matches cached behavior for these attrs.if empty, remove all cached values for var, regardless of associated behavior.missing_ok: boolwhether it is okay for there to be zero matching cached values for var.raise CacheNotApplicableError if missing_ok=False when there are no matching cached values.additional kwargs, if provided, go to self.using(**kw) during the operation.return list of CachedQuantity objects which were removed from self.setvars.
- unset_var_internal(var, behavior_attrs, forall=[], *, ukey=None, missing_ok=True)
unset var from self.setvars.
KNOWN_SETTERS functions may wish to use this method, to unset dependent values.E.g. if u depends on n, and n is changed, may wish to unset the value of u.behavior_attrs: list of stringsthe behavior attrs relevant to setting this var.forall: list of stringsif provided, tells which behavior attrs to ignore when unsetting the var.ukey: None or stringif provided, ignore ‘units’ behavior attr when unsetting the var(due to assuming that ukey was provided when setting the var,hence that the set var could be retrieved in any units system)missing_ok: boolwhether it is okay for there to be zero matching cached values for var.raise CacheNotApplicableError if missing_ok=False when there are no matching cached values.return list of CachedQuantity objects which were removed from self.setvars.
- property using
alias to using_attrs
- using_at_call_depth(depth, **attrs_and_values)
context manager for setting attrs_and_values but only while call_depth == depth.
E.g.:
with self.using_at_call_depth(3, verbose=3):self(‘sgyrof’)# while self.call_depth == 3 inside of this ‘with’ block, uses self.verbose=3.# but everywhere else, uses original value of verbose.# assuming originally verbose=False (or unset), this example will print:| | (call_depth=2) get var=’q’| | (call_depth=2) get var=’mod_B’| | (call_depth=2) get var=’m’# compare this to simply using self.verbose=3, which would print:| (call_depth=1) get var=’sgyrof’| | (call_depth=2) get var=’q’| | (call_depth=2) get var=’mod_B’| | | (call_depth=3) get var=’B_dot_B’| | | | (call_depth=4) get var=’B_xyz’| | | | | (call_depth=5) get var=’B’| | (call_depth=2) get var=’m’Equivalent to self.call_depth_manager.using_obj_attrs_at(depth, **attrs_and_values)
- using_at_next_call_depth(**attrs_and_values)
context manager for setting attrs_and_values but only while call_depth == self.call_depth + 1
Equivalent to self.using_at_call_depth(self.call_depth + 1, **attrs_and_values).
(Also equivalent to self.call_depth_manager.using_obj_attrs_at_next(**attrs_and_values).)
- using_attrs(attrs_as_dict={}, _unset_sentinel=ATTR_UNSET, **attrs_and_values)
returns context manager which sets attrs of obj upon entry; restores original values upon exit.
_unset_sentinel: any value, default ATTR_UNSETupon entry, delete any attrs with value _unset_sentinel (compared via ‘is’).E.g. using_attrs(obj, _unset_sentinel=None, x=None) –> del obj.x upon entry.
- using_first_dimpoint(dims=None)
return context manager which sets dimensions to their first values (when called); restore original on exit.
Useful for testing a single code at a single dimpoint without needing to set each dimension individually.dims: None or iterable of strs appearing in self.dimensions.keys()dimensions to include. None –> use all dimensions.
- zeros_like_maindims(**kw_zeros_like)
return array of all 0s like maindims var results (use ints to save space).
Most users will find it sufficient to just load self.maindims_coords(),but zeros_like_maindims() is provided for more advanced abstractions,which rely on the fully-formed array, without caring about the actual values.(see, e.g., LoiLoader’s get_dloi().)Just like self.get_maindims_coords(), the result here depends on self.slices.kwargs go to np.zeros(). Default dtype is int, to save space.