Hi JC,<div><br></div><div>This is happening because the generation of the field happens grid by grid, so you're comparing the field for the entire region to the field for just one grid.</div><div><br></div><div>A very similar question was posed on yt-dev about a week ago, but for some reason I can't find a record of it in the archive. I've found it in my email so I'll paste it here. Sorry for it being in reverse order and a bit difficult to read.</div>
<div><br></div><div>Britton</div><div><br></div><div><br><br><div class="gmail_quote">---------- Forwarded message ----------<br>From: <b class="gmail_sendername">Geoffrey So</b> <span dir="ltr"><<a href="mailto:gsiisg@gmail.com">gsiisg@gmail.com</a>></span><br>
Date: Thu, Apr 26, 2012 at 4:11 PM<br>Subject: Re: [yt-dev] derived field from two datasets<br>To: <a href="mailto:yt-dev@lists.spacepope.org">yt-dev@lists.spacepope.org</a><br><br><br><div class="gmail_extra">ok changing the line to</div>
<div class="gmail_extra"><div class="im"><div class="gmail_extra"> data2 = pf2.h.grids[<a href="http://data.id/" target="_blank">data.id</a> - data._id_offset]</div></div><div>worked</div><div><br></div><div>Thanks so much:-)</div>
<div><br></div><div>From</div><span class="HOEnZb"><font color="#888888">G.S.</font></span><div><div class="h5"><br><div class="gmail_quote">On Thu, Apr 26, 2012 at 1:04 PM, Matthew Turk <span dir="ltr"><<a href="mailto:matthewturk@gmail.com" target="_blank">matthewturk@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Ah, don't ask for [field], just get .grids[ ... ].<br>
<br>-Matt<br><div><br>On Thu, Apr 26, 2012 at 4:02 PM, Geoffrey So <<a href="mailto:gsiisg@gmail.com" target="_blank">gsiisg@gmail.com</a>> wrote:<br>> The new add field line<br>> pf1.field_info.add_field("CompareIonization", function = _NewField,<br>
> validators = [ValidateGridType()])<br>> but that got me a new set of errors<br>> KeyError: <yt.data_objects.field_info_container.DerivedField object at<br>> 0x1065cbb90><br>><br>> full trace<br>> Traceback pasted to <a href="http://paste.yt-project.org/show/sIW43mg7AdRaKJELo0U1" target="_blank">http://paste.yt-project.org/show/sIW43mg7AdRaKJELo0U1</a><br>
><br>> From<br>> G.S.<br>><br>> On Thu, Apr 26, 2012 at 12:54 PM, Matthew Turk <<a href="mailto:matthewturk@gmail.com" target="_blank">matthewturk@gmail.com</a>><br>> wrote:<br>>><br>>> Hi Geoffrey,<br>
>><br>>> AH! Rats. I forgot one thing. In the call to add_field, include a<br>>> validator to ensure you're getting grids, not regions:<br>>><br>>> validators = [ValidateGridType()]<br>
>><br>>> This script, by the way, will *only* work with unigrid where the grid<br>>> IDs match between the two datasets. (Doing it with AMR is possible<br>>> but will be a hassle.) What that line does is cross-correlate grids<br>
>> between the two parameter files.<br>>><br>>> -Matt<br>>><br>>> On Thu, Apr 26, 2012 at 3:50 PM, Geoffrey So <<a href="mailto:gsiisg@gmail.com" target="_blank">gsiisg@gmail.com</a>> wrote:<br>
>> > Yeah I think that should do exactly what I want.<br>>> ><br>>> > The script is at<br>>> > <a href="http://paste.yt-project.org/show/2324/" target="_blank">http://paste.yt-project.org/show/2324/</a><br>
>> ><br>>> > gave me these error:<br>>> > <a href="http://paste.yt-project.org/show/5XFq1xU2iVxiA9MTtT3v" target="_blank">http://paste.yt-project.org/show/5XFq1xU2iVxiA9MTtT3v</a><br>>> ><br>
>> > pf_compare was ran without error, the error occurs when I tried to call<br>>> > on dd["CompareIonization"]<br>>> ><br>>> > Can you also explain what this line does with the <a href="http://data.id/" target="_blank">data.id</a> and<br>
>> > _id_offset?<br>>> > data2 = pf2.h.grids[<a href="http://data.id/" target="_blank">data.id</a> - data._id_offset][field]<br>>> ><br>>> > From<br>>> > G.S.<br>>> ><br>
>> > On Thu, Apr 26, 2012 at 12:15 PM, Matthew Turk <<a href="mailto:matthewturk@gmail.com" target="_blank">matthewturk@gmail.com</a>><br>>> > wrote:<br>>> >><br>>> >> Hi Geoffrey,<br>
>> >><br>>> >> On Thu, Apr 26, 2012 at 3:09 PM, Geoffrey So <<a href="mailto:gsiisg@gmail.com" target="_blank">gsiisg@gmail.com</a>> wrote:<br>>> >> > This is very close to what I was trying to do, except I wanted<br>
>> >> > something<br>>> >> > slightly more general where I can compare two distinct fields from<br>>> >> > two<br>>> >> > datasets. (what I am trying to do is to use<br>
>> >> > HI_Density/(HI_Density+HII_Density)) where the HI and HII are stored<br>>> >> > separately, so I'll need pf1 with field1 and pf2 with field2.)<br>>> >> ><br>>> >> > Rick recently showed me a rendering where people at Argonne made a<br>
>> >> > rendering<br>>> >> > of the fractional difference in HI or HII from two simulations, one<br>>> >> > with<br>>> >> > radiation transport one without, to compare the effects. The ability<br>
>> >> > to<br>>> >> > call two different fields from two different simulation parameters in<br>>> >> > creating a derived field would be essential to doing something like<br>>> >> > that.<br>
>> >><br>>> >> Here's a video of it, for everyone curious:<br>>> >><br>>> >> <a href="http://www.youtube.com/watch?v=hDh4NB31e2s" target="_blank">http://www.youtube.com/watch?v=hDh4NB31e2s</a><br>
>> >><br>>> >> ><br>>> >> > Forgive my yt skills. I tried to first use the script you provided<br>>> >> > as<br>>> >> > an<br>>> >> > example, but I wasn't sure how to get values from pf_compare, I tried<br>
>> >> ><br>>> >> > dd1=pf1.h.all_data()<br>>> >> > dd1['NewField']<br>>> >> ><br>>> >> > but it gives:<br>>> >> ><br>>> >> > TypeError: _NewField() takes exactly 4 arguments (2 given)<br>
>> >><br>>> >> Okay, I should have been more clear. What you want to do is call:<br>>> >><br>>> >> pf_compare(pf1, pf2, some_field)<br>>> >><br>>> >> And then pf1 should have the field accessible. It doesn't return the<br>
>> >> field; what it does is make the field accessible to yt functionality.<br>>> >><br>>> >> Here's a closer example, based on what you have asked for:<br>>> >><br>>> >> def pf_compare(pf1, pf2):<br>
>> >> def _NewField(field, data):<br>>> >> data2 = pf2.h.grids[<a href="http://data.id/" target="_blank">data.id</a> - data._id_offset][field]<br>>> >> return<br>>> >> data["HI_Density"]/(data2["HI_Density"]+data2["HII_Density"]))<br>
>> >> pf1.field_info.add_field("CompareIonization", function = _NewField)<br>>> >><br>>> >> pf1 = load( ... )<br>>> >> pf2 = load( ... )<br>>> >> pf1.h<br>
>> >> pf_compare(pf1, pf2)<br>>> >><br>>> >> # Now you can do:<br>>> >><br>>> >> dd = pf1.h.all_data()<br>>> >> dd["CompareIonization"]<br>
>> >><br>>> >><br>>> >> -Matt<br>>> >><br>>> >> ><br>>> >> ><br>>> >> ><br>>> >> > --------------------------------------------------------------------------------------<br>
>> >> ><br>>> >> > What I was hoping to be able to do is something like:<br>>> >> ><br>>> >> > def pf_compare(pf1, field1, pf2, field2):<br>>> >> > def _NewField(field1, data1, field2, data2):<br>
>> >> > return data1[field1] / data2[field2] # or any calculation<br>>> >> > involving data1,2 and field1,2<br>>> >> > pf1.field_info.add_field("NewField", function = _NewField)<br>
>> >> ><br>>> >> > pf1 = load('DD###1')<br>>> >> > pf2 = load('DD###2')<br>>> >> ><br>>> >> > and call<br>>> >> ><br>
>> >> > pf1.h.all_data()['NewField']<br>>> >> ><br>>> >> > Where "NewField" involves two different fields from two different<br>>> >> > dataset<br>
>> >> ><br>>> >> > This seems very possible from the example you wrote Matt, but I guess<br>>> >> > I'm<br>>> >> > stuck on how to call the values or make a plot of "NewField" once it<br>
>> >> > is<br>>> >> > defined.<br>>> >> ><br>>> >> > From<br>>> >> > G.S.<br>>> >> ><br>>> >> ><br>>> >> > On Thu, Apr 26, 2012 at 5:02 AM, Matthew Turk <<a href="mailto:matthewturk@gmail.com" target="_blank">matthewturk@gmail.com</a>><br>
>> >> > wrote:<br>>> >> >><br>>> >> >> Hi Geoffrey,<br>>> >> >><br>>> >> >> There's no example per se, but I'll try to give you one. This<br>
>> >> >> sketch<br>>> >> >> should give you an idea. There's a way to do this for AMR grids<br>>> >> >> which<br>>> >> >> would be similar (you'd use a covering grid) but I think you're<br>
>> >> >> using<br>>> >> >> static refinement so that makes it a bit easier. We want to wrap<br>>> >> >> this<br>>> >> >> in a function:<br>>> >> >><br>
>> >> >> def pf_compare(pf1, pf2, field):<br>>> >> >> def _NewField(field, data):<br>>> >> >> return data[field] / pf2.h.grids[<a href="http://data.id/" target="_blank">data.id</a> -<br>
>> >> >> data._id_offset][field]<br>>> >> >> pf1.field_info.add_field("Compare%s" % field, function =<br>>> >> >> _NewField)<br>>> >> >><br>
>> >> >> pf1 = load( ... )<br>>> >> >> pf2 = load( ... )<br>>> >> >> pf1.h<br>>> >> >> pf_compare(pf1, pf2, "Density")<br>>> >> >><br>
>> >> >> Now you should have CompareDensity.<br>>> >> >><br>>> >> >> Let me know if that works. In the discussion document for yt 3.0<br>>> >> >> Britton brought up that we should have a grammar for this type of<br>
>> >> >> situation.<br>>> >> >><br>>> >> >> -Matt<br>>> >> >><br>>> >> >> On Wed, Apr 25, 2012 at 3:39 PM, Geoffrey So <<a href="mailto:gsiisg@gmail.com" target="_blank">gsiisg@gmail.com</a>><br>
>> >> >> wrote:<br>>> >> >> > Hi, I was wondering if there's an example of how to create a<br>>> >> >> > derived<br>>> >> >> > field<br>
>> >> >> > from two different datasets.<br>>> >> >> ><br>>> >> >> > From<br>>> >> >> > G.S.<br>>> >> >> ><br>>> >> >> > _______________________________________________<br>
>> >> >> > yt-dev mailing list<br>>> >> >> > <a href="mailto:yt-dev@lists.spacepope.org" target="_blank">yt-dev@lists.spacepope.org</a><br>>> >> >> > <a href="http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org</a><br>
>> >> >> ><br>>> >> >> _______________________________________________<br>>> >> >> yt-dev mailing list<br>>> >> >> <a href="mailto:yt-dev@lists.spacepope.org" target="_blank">yt-dev@lists.spacepope.org</a><br>
>> >> >> <a href="http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org</a><br>>> >> ><br>>> >> ><br>
>> >> ><br>>> >> > _______________________________________________<br>>> >> > yt-dev mailing list<br>>> >> > <a href="mailto:yt-dev@lists.spacepope.org" target="_blank">yt-dev@lists.spacepope.org</a><br>
>> >> > <a href="http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org</a><br>>> >> ><br>>> >> _______________________________________________<br>
>> >> yt-dev mailing list<br>>> >> <a href="mailto:yt-dev@lists.spacepope.org" target="_blank">yt-dev@lists.spacepope.org</a><br>>> >> <a href="http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org</a><br>
>> ><br>>> ><br>>> ><br>>> > _______________________________________________<br>>> > yt-dev mailing list<br>>> > <a href="mailto:yt-dev@lists.spacepope.org" target="_blank">yt-dev@lists.spacepope.org</a><br>
>> > <a href="http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org</a><br>>> ><br>>> _______________________________________________<br>
>> yt-dev mailing list<br>>> <a href="mailto:yt-dev@lists.spacepope.org" target="_blank">yt-dev@lists.spacepope.org</a><br>>> <a href="http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org</a><br>
><br>><br>><br>> _______________________________________________<br>> yt-dev mailing list<br>> <a href="mailto:yt-dev@lists.spacepope.org" target="_blank">yt-dev@lists.spacepope.org</a><br>> <a href="http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org</a><br>
><br>_______________________________________________<br>yt-dev mailing list<br><a href="mailto:yt-dev@lists.spacepope.org" target="_blank">yt-dev@lists.spacepope.org</a><br><a href="http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org</a><br>
</div></blockquote></div><br></div></div></div><br>_______________________________________________<br>yt-dev mailing list<br><a href="mailto:yt-dev@lists.spacepope.org">yt-dev@lists.spacepope.org</a><br><a href="http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-dev-spacepope.org</a><br>
<br></div><br><div class="gmail_quote">On Tue, May 1, 2012 at 12:27 PM, Jean-Claude Passy <span dir="ltr"><<a href="mailto:jcpassy@gmail.com" target="_blank">jcpassy@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
Hi all,<br>
<br>
I am trying to compare the energy between two datasets. I execute
the following script that uses the derived field 'RelativeEnergy':<br>
<br>
<address>--------------------------------------------------------------------------------------------------------------------------------------------------</address>
<address>def _RelativeEnergy(field, data):</address>
<address> return
(data["TotalEnergy"]-data.pf.parameters["TotalEnergy_ref"])/data.pf.parameters["TotalEnergy_ref"]</address>
<address>add_field("RelativeEnergy", function=_RelativeEnergy)</address>
<address><br>
filen1 = 'helix/DD0000/CE0000'</address>
<address>pf1 = load(filen1)</address>
<address>region1 = pf1.h.region([0.5, 0.5, 0.5], [0.0, 0.0, 0.0],
[1.0, 1.0, 1.0])</address>
<address>energy1 = region1["TotalEnergy"]</address>
<address><br>
filen2 = 'parallel/DD0000/CE0000'</address>
<address>pf2 = load(filen2)</address>
<address>region2 = pf2.h.region([0.5, 0.5, 0.5], [0.0, 0.0, 0.0],
[1.0, 1.0, 1.0])</address>
<address>energy2 = region2["TotalEnergy"]</address>
<address><br>
# Adding reference energy into
pf2 </address>
<address>pf2.parameters["TotalEnergy_ref"] = energy1</address>
<address><br>
delta_energy = region2["RelativeEnergy"]</address>
<address><br>
pc = PlotCollection(pf2)</address>
<address>pc.add_slice("RelativeEnergy",2,center=[0.5, 0.5, 0.5])</address>
<address>pc.set_lim((0.4, 0.6, 0.4, 0.6))</address>
<address>pc.save('DeltaEnergy')</address>
<address>
--------------------------------------------------------------------------------------------------------------------------------------------------</address>
<br>
I get the error pasted here:
<a href="http://paste.yt-project.org/show/DPgMjV44JktpXExCljUj/" target="_blank">http://paste.yt-project.org/show/DPgMjV44JktpXExCljUj/</a><br>
The variable delta_energy looks good (same type and size and
energy1), but the problem arises when I try to take a slice of it.<br>
<br>
Any help much appreciated.<br>
Thanks a lot,<br>
<br>
JC<br>
</div>
<br>_______________________________________________<br>
yt-users mailing list<br>
<a href="mailto:yt-users@lists.spacepope.org" target="_blank">yt-users@lists.spacepope.org</a><br>
<a href="http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org</a><br>
<br></blockquote></div><br></div>