Source code for yt.data_objects.analyzer_objects
import inspect
from yt.utilities.object_registries import analysis_task_registry
[docs]
class AnalysisTask:
def __init_subclass__(cls, *args, **kwargs):
if hasattr(cls, "skip") and not cls.skip:
return
analysis_task_registry[cls.__name__] = cls
def __init__(self, *args, **kwargs):
# This should only get called if the subclassed object
# does not override
if len(args) + len(kwargs) != len(self._params):
raise RuntimeError
self.__dict__.update(zip(self._params, args, strict=False))
self.__dict__.update(kwargs)
def __repr__(self):
# Stolen from YTDataContainer.__repr__
s = f"{self.__class__.__name__}: "
s += ", ".join(f"{i}={getattr(self, i)}" for i in self._params)
return s
[docs]
def analysis_task(params=None):
if params is None:
params = ()
def create_new_class(func):
cls = type(func.__name__, (AnalysisTask,), {"eval": func, "_params": params})
return cls
return create_new_class
[docs]
@analysis_task(("field",))
def MaximumValue(params, data_object):
v = data_object.quantities["MaxLocation"](params.field)[0]
return v
[docs]
@analysis_task()
def CurrentTimeYears(params, ds):
return ds.current_time * ds["years"]
[docs]
class SlicePlotDataset(AnalysisTask):
_params = ["field", "axis", "center"]
def __init__(self, *args, **kwargs):
from yt.visualization.api import SlicePlot
self.SlicePlot = SlicePlot
AnalysisTask.__init__(self, *args, **kwargs)
[docs]
def eval(self, ds):
slc = self.SlicePlot(ds, self.axis, self.field, center=self.center)
return slc.save()
[docs]
class QuantityProxy(AnalysisTask):
_params = None
quantity_name = None
def __repr__(self):
# Stolen from YTDataContainer.__repr__
s = f"{self.__class__.__name__}: "
s += ", ".join([str(list(self.args))])
s += ", ".join(f"{k}={v}" for k, v in self.kwargs.items())
return s
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
[docs]
def eval(self, data_object):
rv = data_object.quantities[self.quantity_name](*self.args, **self.kwargs)
return rv
[docs]
class ParameterValue(AnalysisTask):
_params = ["parameter"]
def __init__(self, parameter, cast=None):
self.parameter = parameter
if cast is None:
def _identity(x):
return x
cast = _identity
self.cast = cast
[docs]
def eval(self, ds):
return self.cast(ds.get_parameter(self.parameter))
[docs]
def create_quantity_proxy(quantity_object):
args, varargs, kwargs, defaults = inspect.getargspec(quantity_object[1])
# Strip off 'data' which is on every quantity function
params = args[1:]
if kwargs is not None:
params += kwargs
dd = {"_params": params, "quantity_name": quantity_object[0]}
cls = type(quantity_object[0], (QuantityProxy,), dd)
return cls