88    YTSelectionContainer3D ,
99)
1010from  yt .data_objects .static_output  import  Dataset 
11- from  yt .funcs  import  iter_fields , validate_object , validate_sequence 
11+ from  yt .fields .derived_field  import  DerivedField 
12+ from  yt .funcs  import  iter_fields , validate_object 
1213from  yt .geometry .selection_routines  import  points_in_cells 
1314from  yt .utilities .exceptions  import  YTIllDefinedCutRegion 
1415from  yt .utilities .on_demand_imports  import  _scipy 
@@ -54,14 +55,14 @@ def __init__(
5455        if  locals  is  None :
5556            locals  =  {}
5657        validate_object (data_source , YTSelectionContainer )
57-         validate_sequence ( conditionals )
58+         conditionals   =   list ( always_iterable ( conditionals ) )
5859        for  condition  in  conditionals :
59-             validate_object (condition , str )
60+             validate_object (condition , ( str ,  DerivedField ) )
6061        validate_object (ds , Dataset )
6162        validate_object (field_parameters , dict )
6263        validate_object (base_object , YTSelectionContainer )
6364
64-         self .conditionals  =  list ( always_iterable ( conditionals )) 
65+         self .conditionals  =  conditionals 
6566        if  isinstance (data_source , YTCutRegion ):
6667            # If the source is also a cut region, add its conditionals 
6768            # and set the source to be its source. 
@@ -82,6 +83,10 @@ def __init__(
8283    def  _check_filter_fields (self ):
8384        fields  =  []
8485        for  cond  in  self .conditionals :
86+             if  isinstance (cond , DerivedField ):
87+                 fields .append (cond .name )
88+                 continue 
89+ 
8590            for  field  in  re .findall (r"\[([A-Za-z0-9_,.'\"\(\)]+)\]" , cond ):
8691                fd  =  field .replace ('"' , "" ).replace ("'" , "" )
8792                if  ","  in  fd :
@@ -125,8 +130,11 @@ def blocks(self):
125130            m  =  m .copy ()
126131            with  obj ._field_parameter_state (self .field_parameters ):
127132                for  cond  in  self .conditionals :
128-                     ss  =  eval (cond )
129-                     m  =  np .logical_and (m , ss , m )
133+                     if  isinstance (cond , DerivedField ):
134+                         ss  =  cond (obj )
135+                     else :
136+                         ss  =  eval (cond )
137+                     m  &=  ss 
130138            if  not  np .any (m ):
131139                continue 
132140            yield  obj , m 
@@ -144,12 +152,15 @@ def _cond_ind(self):
144152        locals ["obj" ] =  obj 
145153        with  obj ._field_parameter_state (self .field_parameters ):
146154            for  cond  in  self .conditionals :
147-                 res  =  eval (cond , locals )
155+                 if  isinstance (cond , DerivedField ):
156+                     res  =  cond (obj )
157+                 else :
158+                     res  =  eval (cond , locals )
148159                if  ind  is  None :
149160                    ind  =  res 
150161                if  ind .shape  !=  res .shape :
151162                    raise  YTIllDefinedCutRegion (self .conditionals )
152-                 np . logical_and ( res ,  ind ,  ind ) 
163+                 ind   &=   res 
153164        return  ind 
154165
155166    def  _part_ind_KDTree (self , ptype ):
0 commit comments