Oh, that sounds valuable.  I ended up adding it at a low level- there is now a FilteredIOBrick, which takes a (list of) filter callbacks and takes under a second.  But a yt-ish way to do it would be nicer.

-------- Original message --------
From: Matthew Turk <matthewturk@gmail.com>
Date: 01/16/2015 18:24 (GMT-06:00)
To: Discussion of the yt analysis package <yt-users@lists.spacepope.org>
Subject: Re: [yt-users] cut_region: can I make an expression dimensionless?

Hi Stuart,

Actually the more I look at this, the more I think it's probably quite easy to turn this into a data selector itself, avoiding the need for a cut region.  Should be straightforward to add it to selection_routines and selection_data_containers and have it work out of the box.

On Fri, Jan 16, 2015 at 6:20 PM, Matthew Turk <matthewturk@gmail.com> wrote:

On Wed, Jan 14, 2015 at 11:03 AM, Stuart Levy <salevy@illinois.edu> wrote:
Using one of Sam's past e-mails to answer my own question, it at least syntactically works to use the '.uq' unit-quantity attribute of a YT object to get something that has the units of the object, so e.g. 0.78 * obj['x'].uq is 0.78 in x's length units.  So it actually seems to work to say:

   cr = ds.cut_region( dd, ["obj['z']-(obj['x']**2 + obj['y']**2)/(2.0*obj['z'].uq) < 0.78*obj['z'].uq"])


As it turns out, I'll look for another lower-level way to do this - with the above cut_region applied, 32GB of RAM isn't enough to process a single data field of about 512^3, and it takes several minutes of CPU time even to start.    But it's good to know that the above is possible.

Glad you kind of got it working ... this is kind of ridiculous that it takes so much, though.  What I think could cut it dowen considerably is to reduce the numebr of sequential numpy operations; right now it's computing them and storing temporary arrays like crazy.  Unfortunately I don't know how one might do this with the current setup of cut_region.

Perhaps one way would be to make a derived field that is each component, and inside it do each operation inline, then apply the conditional there?

On 1/14/15 10:26 AM, Stuart Levy wrote:
Hello yt people,

I'm hoping to write a cut_region expression that (a) depends on position and (b) does it in a nonlinear way - I'd like to do a sort of paraboloidal cut, like

    ds.cut_region(dd, "obj['z'] - (obj['x']**2 + obj['y']**2)/2.0 < 0.78")
er, correction - cut_region()'s 2nd arg is a [] list of strings rather than a string, so I'd tried

          ds.cut_region(dd, ["obj['z'] - (obj['x']**2 + obj['y']**2)/2.0 < 0.78"])

But this runs afoul of the unit-checking - obj['z'] doesn't have the same units as obj['x']**2.

Somehow I either need to cast all the obj[] terms to be dimensionless ("trust me, I promise it's right"), or else give dimensions of length to the constants.   Should there be a way to do either one?

yt-users mailing list