Source code for yt.data_objects.selection_objects.boolean_operations

import numpy as np
from more_itertools import always_iterable

import yt.geometry
from yt.data_objects.selection_objects.data_selection_objects import (
    YTSelectionContainer,
    YTSelectionContainer3D,
)
from yt.data_objects.static_output import Dataset
from yt.funcs import validate_object, validate_sequence


[docs] class YTBooleanContainer(YTSelectionContainer3D): r""" This is a boolean operation, accepting AND, OR, XOR, and NOT for combining multiple data objects. This object is not designed to be created directly; it is designed to be created implicitly by using one of the bitwise operations (&, \|, ^, \~) on one or two other data objects. These correspond to the appropriate boolean operations, and the resultant object can be nested. Parameters ---------- op : string Can be AND, OR, XOR, NOT or NEG. dobj1 : yt.data_objects.selection_objects.data_selection_objects. YTSelectionContainer The first selection object dobj2 : yt.data_objects.selection_objects.base_objects.YTSelectionContainer The second object Examples -------- >>> import yt >>> ds = yt.load("IsolatedGalaxy/galaxy0030/galaxy0030") >>> sp = ds.sphere("c", 0.1) >>> dd = ds.r[:, :, :] >>> new_obj = sp ^ dd >>> print(new_obj.sum("cell_volume"), dd.sum("cell_volume") - sp.sum("cell_volume")) """ _type_name = "bool" _con_args = ("op", "dobj1", "dobj2") def __init__( self, op, dobj1, dobj2, ds=None, field_parameters=None, data_source=None ): YTSelectionContainer3D.__init__(self, None, ds, field_parameters, data_source) self.op = op.upper() self.dobj1 = dobj1 self.dobj2 = dobj2 name = f"Boolean{self.op}Selector" sel_cls = getattr(yt.geometry.selection_routines, name) self._selector = sel_cls(self) def _get_bbox(self): le1, re1 = self.dobj1._get_bbox() if self.op == "NOT": return le1, re1 else: le2, re2 = self.dobj2._get_bbox() return np.minimum(le1, le2), np.maximum(re1, re2)
[docs] class YTIntersectionContainer3D(YTSelectionContainer3D): """ This is a more efficient method of selecting the intersection of multiple data selection objects. Creating one of these objects returns the intersection of all of the sub-objects; it is designed to be a faster method than chaining & ("and") operations to create a single, large intersection. Parameters ---------- data_objects : Iterable of YTSelectionContainer The data objects to intersect Examples -------- >>> import yt >>> ds = yt.load("RedshiftOutput0005") >>> sp1 = ds.sphere((0.4, 0.5, 0.6), 0.15) >>> sp2 = ds.sphere((0.38, 0.51, 0.55), 0.1) >>> sp3 = ds.sphere((0.35, 0.5, 0.6), 0.15) >>> new_obj = ds.intersection((sp1, sp2, sp3)) >>> print(new_obj.sum("cell_volume")) """ _type_name = "intersection" _con_args = ("data_objects",) def __init__(self, data_objects, ds=None, field_parameters=None, data_source=None): validate_sequence(data_objects) for obj in data_objects: validate_object(obj, YTSelectionContainer) validate_object(ds, Dataset) validate_object(field_parameters, dict) validate_object(data_source, YTSelectionContainer) YTSelectionContainer3D.__init__(self, None, ds, field_parameters, data_source) self.data_objects = list(always_iterable(data_objects))
[docs] class YTDataObjectUnion(YTSelectionContainer3D): """ This is a more efficient method of selecting the union of multiple data selection objects. Creating one of these objects returns the union of all of the sub-objects; it is designed to be a faster method than chaining | (or) operations to create a single, large union. Parameters ---------- data_objects : Iterable of YTSelectionContainer The data objects to union Examples -------- >>> import yt >>> ds = yt.load("IsolatedGalaxy/galaxy0030/galaxy0030") >>> sp1 = ds.sphere((0.4, 0.5, 0.6), 0.1) >>> sp2 = ds.sphere((0.3, 0.5, 0.15), 0.1) >>> sp3 = ds.sphere((0.5, 0.5, 0.9), 0.1) >>> new_obj = ds.union((sp1, sp2, sp3)) >>> print(new_obj.sum("cell_volume")) """ _type_name = "union" _con_args = ("data_objects",) def __init__(self, data_objects, ds=None, field_parameters=None, data_source=None): validate_sequence(data_objects) for obj in data_objects: validate_object(obj, YTSelectionContainer) validate_object(ds, Dataset) validate_object(field_parameters, dict) validate_object(data_source, YTSelectionContainer) YTSelectionContainer3D.__init__(self, None, ds, field_parameters, data_source) self.data_objects = list(always_iterable(data_objects))