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>