Skip to content

No "code_length" when loading ART Datasets #5024

@AsierLambarri

Description

@AsierLambarri

When loading ART Datasets it seems that no ´code_length´ attribute is loaded into the dataset. Instead, the attribute ´length_unit´ is loaded. This collides with some functionalities where the former is required to do unit conversion behind the curtains.

An Example: Im loading an snapshot from Agora-ART v18 dataset and plotting the dark matter alongside with the halos, using ´annotate_sphere´ with the keyword coord_system="data" to do so:

ds = yt.load(fn) 
ds.code_length = ds.length_unit
ad = ds.all_data()

max_dens, center = search_max_in_field(ds, 'stars', 'particle_mass')

print(f'The center will be located at {center.in_units("Mpc")} with density {max_dens}')


# DM
p = yt.ParticleProjectionPlot(ds,'z',('darkmatter','particle_mass'), center=center, width=width, density=True)
p.set_unit(("darkmatter", "particle_mass"), "Msun/kpc**2")
p.set_font(
     {  
        "size": 20,
    }

)
p.set_axes_unit('kpccm')
p.annotate_timestamp(redshift=True, text_args={"color":"black"})
p.set_xlabel('x [comoving kpc]')
p.set_ylabel('')


for i in tqdm(range(0, len(filtered_halos))):
    sub_tree_id = filtered_halos['Sub_tree_id'].iloc[i]
    position_x = filtered_halos['position_x'].iloc[i]
    position_y = filtered_halos['position_y'].iloc[i]
    position_z = filtered_halos['position_z'].iloc[i]
    virial_radius = filtered_halos['virial_radius'].iloc[i]

    if sub_tree_id == 1:
        p.annotate_sphere(unyt_array([position_x, position_y, position_z], 'kpccm'), radius=(1*virial_radius, 'kpccm'),coord_system='data',
                    circle_args={"color": "green", "linestyle": "dashed", "linewidth": 2})
    else:    
        p.annotate_sphere(unyt_array([position_x,position_y,position_z], 'kpccm'),
                        radius=(0.5*virial_radius, 'kpccm'),
                         coord_system='data', circle_args={"color": "white", "linewidth": 2})

p.show()

YT throws the following error:

UnitParseError: Could not find unit symbol 'code_length' in the provided symbols.

The above exception was the direct cause of the following exception:
(...)
YTPlotCallbackError: annotate_sphere callback failed

Im guessing ART doesn't store the code units as such but as "unit_{length, mass, etc}". There are workarounds to this, i.e. using axis or plot relative coordinates for the example above. There may be other cases where there is no workaround tho.

Im using python3.10 and yt 4.3.1.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions