[yt-users] Problem trying to define a new field
Britton Smith
brittonsmith at gmail.com
Wed Nov 6 06:26:10 PST 2013
Hi Kearn,
Sorry, this thread fell through the cracks.
The specific error is because the get_field_parameter command couldn't get
the value. Looking at your code, you set with something called 'r_max',
but you were asking for 'rmax', without the underscore. I think that's it.
Britton
On Mon, Nov 4, 2013 at 4:12 PM, <k.grisdale at surrey.ac.uk> wrote:
> Hi Britton,
>
> Yes that makes a lot of sense. I have made the modifications and the
> code seems to work up to the point of the pc.add line and then crashes:
>
> Here is the code as is it stands:
>
> from yt.mods import *
>
> p6 = load("output_00006/info_00006.txt")
> cen = [0.5, 0.5, 0.5]
>
> sphere = p6.h.sphere(cen, 0.5/p6['cm'])
> r_max = sphere['Radius'][sphere['Density'] == sphere['Density'].max()]
> sphere.set_field_parameter('r_max', r_max)
>
>
>
> @derived_field(name = "Denin", units = "g/cm^3", take_log = False)
> def denunits(field, data):
> return(data["Density"]*1)
> @derived_field(name = "Presin", units = "g/cm^2", take_log = False)
> def presunits(field, data):
> return(data["Pressure"]*1)
>
> @derived_field(name = "RRsh", take_log = False)
> def RRshunits(field, data):
> r_max = data.get_field_parameter('rmax')
> return(data["Radius"]/r_max)
>
>
>
> pc = PlotCollection(p6, center = cen)
> pc.add_profile_object(sphere, ["RRsh", "Denin"], x_log=False)
> pc.add_profile_object(sphere, ["RRsh", "Presin"], x_log=False)
> pc.add_profile_object(sphere, ["RRsh", "VelocityMagnitude"], x_log=False)
> pc.save('test103')
>
> print sphere['Density']
>
>
> and the error message:
>
> Traceback (most recent call last):
> File "profiles2.py", line 27, in <module>
> pc.add_profile_object(sphere, ["RRsh", "Denin"], x_log=False)
> File
> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/visualization/plot_collection.py",
> line 961, in add_profile_object
> lazy_reader=lazy_reader)[0]
> File
> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/derived_quantities.py",
> line 92, in __call__
> return self._call_func_lazy(args, kwargs)
> File
> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/derived_quantities.py",
> line 99, in _call_func_lazy
> rv = self.func(GridChildMaskWrapper(g, self._data_source), *args,
> **kwargs)
> File
> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/derived_quantities.py",
> line 615, in _Extrema
> if data[field].size < 1:
> File
> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/derived_quantities.py",
> line 60, in __getitem__
> data = self.data_source._get_data_from_grid(self.grid, item)
> File
> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/data_containers.py",
> line 95, in save_state
> tr = func(self, grid, field, *args, **kwargs)
> File
> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/data_containers.py",
> line 2645, in _get_data_from_grid
> tr = grid[field]
> File
> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/grid_patch.py",
> line 157, in __getitem__
> self.get_data(key)
> File
> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/grid_patch.py",
> line 200, in get_data
> self._generate_field(field)
> File
> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/grid_patch.py",
> line 145, in _generate_field
> self[field] = self.pf.field_info[field](self)
> File
> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/field_info_container.py",
> line 395, in __call__
> dd = self._function(self, data)
> File "profiles2.py", line 22, in RRshunits
> return(data["Radius"]/r_max)
> TypeError: unsupported operand type(s) for /: 'float' and ‘NoneType'
>
> Thanks
>
> Kearn
> On 4 Nov 2013, at 15:53, Britton Smith <brittonsmith at gmail.com> wrote:
>
> Hi Kearn,
>
> Sorry, that was a typo on my part. sp should be "sphere". So, what's
> happening here is the following:
>
> I have made a sphere data container with the first line, and now I can
> access all of the field data for that sphere. So for example,
> sphere["Density"]
> will give me an array of all the densities for all the cells in the
> sphere. Since it's a numpy array, I can get the maximum density in the
> sphere by doing:
> sphere["Density"].max()
>
> Then, I can figure out which cell is the one that has the maximum
> density with:
> sphere["Density"] == sphere["Density"].max()
>
> If you print out that line by itself, it will be an array of Trues and
> Falses. Really, it will have only one True value and all the rest will be
> Falses. The point is that this True/False array can then be used as a
> filter on any other array of the same shape. So then, if I do:
> my_filter = sphere["Density"] == sphere["Density"].max()
>
> Then,
> sphere["Radius"][my_filter]
> will be the radius value for the cell that was True in the filter array,
> which is the cell with the maximum density.
>
> Does that make sense?
>
> Britton
>
>
> On Mon, Nov 4, 2013 at 3:38 PM, <k.grisdale at surrey.ac.uk> wrote:
>
>> Hi Britton,
>>
>> Thanks for the reply.
>>
>> I have tried to implement what you have suggest. But I get the
>> following error:
>>
>> File "profiles2.py", line 7, in <module>
>> r_max = sp['Radius'][sp['Density'] == sp['Density'].max()]
>> NameError: name 'sp' is not defined.
>>
>> To be honest I don’t quite follow the r_max = sp…etc line. could you
>> explain that a little?
>>
>> Thanks
>>
>> Kearn
>> On 4 Nov 2013, at 15:21, Britton Smith <brittonsmith at gmail.com> wrote:
>>
>> Hi Kearn,
>>
>> I recommend doing something like the following:
>>
>> Create a sphere on you're own with
>> sphere = pf.h.sphere(center, (radius, units))
>>
>> Then, calculate the maximum density and position of that with some
>> numpy array operations and set it as a "field parameter":
>> r_max = sp['Radius'][sp['Density'] == sp['Density'].max()]
>> sp.set_field_parameter('r_max', r_max)
>>
>> Then, in your field definition, you can do:
>> r_max = data.get_field_parameter('rmax')
>>
>> and then do the rest of the field definition just as you described.
>>
>> Finally, instead of add_profile_sphere, you can you add_profile_object
>> which will take the sphere you just created as an argument.
>>
>> That should do what you want. Feel free to write back if you have more
>> questions.
>>
>> Britton
>>
>>
>> On Mon, Nov 4, 2013 at 2:49 PM, <k.grisdale at surrey.ac.uk> wrote:
>>
>>> Hi yt-users
>>>
>>> I’m attempting to plot some profiles as a function of radius/radiusSH,
>>> where radiusSh is the radius of a shock. However I am not sure what the
>>> simplest way of getting yt to plot this. I have been using the following
>>> commands to produce the profiles.
>>> :
>>>
>>> pc = PlotCollection(p6, center = cen)
>>> pc.add_profile_sphere(0.5, "cm", ["Radius", "Density"], weight = "Denin”)
>>>
>>> I have also tried to define a new field:
>>>
>>>
>>> @derived_field(name = "RRsh", take_log = False, validators =
>>> [ValidateParameter("rsh")])
>>> def RRshunits(field, data):
>>> value, rsh = p6.h.find_max("Density")
>>> return(data["Radius"]/rsh)
>>>
>>> but this leads to the following error:
>>>
>>> Traceback (most recent call last):
>>> File "profiles.py", line 21, in <module>
>>> pc.add_profile_sphere(0.5, "cm", ["RRsh", "Denin"], weight = "Denin")
>>> File
>>> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/visualization/plot_collection.py",
>>> line 1058, in add_profile_sphere
>>> figure=figure, axes=axes)
>>> File
>>> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/visualization/plot_collection.py",
>>> line 961, in add_profile_object
>>> lazy_reader=lazy_reader)[0]
>>> File
>>> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/derived_quantities.py",
>>> line 92, in __call__
>>> return self._call_func_lazy(args, kwargs)
>>> File
>>> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/derived_quantities.py",
>>> line 99, in _call_func_lazy
>>> rv = self.func(GridChildMaskWrapper(g, self._data_source), *args,
>>> **kwargs)
>>> File
>>> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/derived_quantities.py",
>>> line 615, in _Extrema
>>> if data[field].size < 1:
>>> File
>>> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/derived_quantities.py",
>>> line 60, in __getitem__
>>> data = self.data_source._get_data_from_grid(self.grid, item)
>>> File
>>> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/data_containers.py",
>>> line 95, in save_state
>>> tr = func(self, grid, field, *args, **kwargs)
>>> File
>>> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/data_containers.py",
>>> line 2645, in _get_data_from_grid
>>> tr = grid[field]
>>> File
>>> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/grid_patch.py",
>>> line 157, in __getitem__
>>> self.get_data(key)
>>> File
>>> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/grid_patch.py",
>>> line 200, in get_data
>>> self._generate_field(field)
>>> File
>>> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/grid_patch.py",
>>> line 132, in _generate_field
>>> self.pf.field_info[field].check_available(self)
>>> File
>>> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/field_info_container.py",
>>> line 366, in check_available
>>> validator(data)
>>> File
>>> "/Applications/Code/yt/yt-x86_64/src/yt-hg/yt/data_objects/field_info_container.py",
>>> line 442, in __call__
>>> raise NeedsParameter(doesnt_have)
>>> yt.data_objects.field_info_container.NeedsParameter: (['rsh’])
>>>
>>> Am I missing something in my field definition or is their a simpler way
>>> to go about this?
>>>
>>> Thanks
>>>
>>> Kearn
>>> _______________________________________________
>>> yt-users mailing list
>>> yt-users at lists.spacepope.org
>>> http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>>>
>>
>> _______________________________________________
>> yt-users mailing list
>> yt-users at lists.spacepope.org
>> http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>>
>>
>>
>> _______________________________________________
>> yt-users mailing list
>> yt-users at lists.spacepope.org
>> http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>>
>>
> _______________________________________________
> yt-users mailing list
> yt-users at lists.spacepope.org
> http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>
>
>
> _______________________________________________
> yt-users mailing list
> yt-users at lists.spacepope.org
> http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.spacepope.org/pipermail/yt-users-spacepope.org/attachments/20131106/0cffde39/attachment.html>
More information about the yt-users
mailing list