diff --git a/docs/examples/example_002_coord_aliases.ipynb b/docs/examples/example_002_coord_aliases.ipynb index da79081..f80c2c3 100644 --- a/docs/examples/example_002_coord_aliases.ipynb +++ b/docs/examples/example_002_coord_aliases.ipynb @@ -86,14 +86,14 @@ "name": "stderr", "output_type": "stream", "text": [ - "yt_xarray : [INFO ] 2023-02-06 12:24:30,361: Inferred geometry type is cartesian. To override, use ds.yt.set_geometry\n", - "yt_xarray : [INFO ] 2023-02-06 12:24:30,362: Attempting to detect if yt_xarray will require field interpolation:\n", - "yt_xarray : [INFO ] 2023-02-06 12:24:30,363: Cartesian geometry on uniform grid: yt_xarray will not interpolate.\n", - "yt : [INFO ] 2023-02-06 12:24:30,452 Parameters: current_time = 0.0\n", - "yt : [INFO ] 2023-02-06 12:24:30,454 Parameters: domain_dimensions = [15 10 15]\n", - "yt : [INFO ] 2023-02-06 12:24:30,456 Parameters: domain_left_edge = [-0.03571429 -0.05555556 -0.03571429]\n", - "yt : [INFO ] 2023-02-06 12:24:30,457 Parameters: domain_right_edge = [1.03571429 1.05555556 1.03571429]\n", - "yt : [INFO ] 2023-02-06 12:24:30,458 Parameters: cosmological_simulation = 0\n" + "yt_xarray : [INFO ] 2024-04-03 16:33:53,933: Inferred geometry type is cartesian. To override, use ds.yt.set_geometry\n", + "yt_xarray : [INFO ] 2024-04-03 16:33:53,933: Attempting to detect if yt_xarray will require field interpolation:\n", + "yt_xarray : [INFO ] 2024-04-03 16:33:53,933: Cartesian geometry on uniform grid: yt_xarray will not interpolate.\n", + "yt : [INFO ] 2024-04-03 16:33:53,959 Parameters: current_time = 0.0\n", + "yt : [INFO ] 2024-04-03 16:33:53,960 Parameters: domain_dimensions = [15 10 15]\n", + "yt : [INFO ] 2024-04-03 16:33:53,960 Parameters: domain_left_edge = [-0.03571429 -0.05555556 -0.03571429]\n", + "yt : [INFO ] 2024-04-03 16:33:53,960 Parameters: domain_right_edge = [1.03571429 1.05555556 1.03571429]\n", + "yt : [INFO ] 2024-04-03 16:33:53,961 Parameters: cosmological_simulation = 0\n" ] } ], @@ -119,20 +119,20 @@ "name": "stderr", "output_type": "stream", "text": [ - "yt : [INFO ] 2023-02-06 12:24:30,593 xlim = -0.055556 1.055556\n", - "yt : [INFO ] 2023-02-06 12:24:30,593 ylim = -0.035714 1.035714\n", - "yt : [INFO ] 2023-02-06 12:24:30,594 xlim = -0.055556 1.055556\n", - "yt : [INFO ] 2023-02-06 12:24:30,595 ylim = -0.035714 1.035714\n", - "yt : [INFO ] 2023-02-06 12:24:30,600 Making a fixed resolution buffer of (('stream', 'temp')) 800 by 800\n" + "yt : [INFO ] 2024-04-03 16:33:54,007 xlim = -0.055556 1.055556\n", + "yt : [INFO ] 2024-04-03 16:33:54,007 ylim = -0.035714 1.035714\n", + "yt : [INFO ] 2024-04-03 16:33:54,008 xlim = -0.055556 1.055556\n", + "yt : [INFO ] 2024-04-03 16:33:54,008 ylim = -0.035714 1.035714\n", + "yt : [INFO ] 2024-04-03 16:33:54,012 Making a fixed resolution buffer of (('stream', 'temp')) 800 by 800\n" ] }, { "data": { "text/html": [ - "
" + "
" ], "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -145,13 +145,1064 @@ "slc.set_log(('stream', 'temp'), False)" ] }, + { + "cell_type": "markdown", + "id": "318cedc8-87a3-4de3-9790-de7525dc06cb", + "metadata": {}, + "source": [ + "## cf-compliant coordinate names\n", + "\n", + "Additionally, the conversion of xarray coordinate name to the expected yt name can use [cf_xarray](https://cf-xarray.readthedocs.io) in the process of disambiguation. Note that this will only work if cf_xarray is installed (`pip install cf_xarray`). \n", + "\n", + "\n", + "First, let's import a cf_xarray sample dataset and checkout the `air` variable:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ca0ad965-4e8c-497a-9562-2348f9f7567b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'air' (time: 4, lat: 25, lon: 50)>\n",
+       "[5000 values with dtype=float32]\n",
+       "Coordinates:\n",
+       "  * lat        (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 22.5 20.0 17.5 15.0\n",
+       "  * lon        (lon) float32 200.0 202.5 205.0 207.5 ... 315.0 317.5 320.0 322.5\n",
+       "  * time       (time) datetime64[ns] 2013-01-01 ... 2013-01-01T18:00:00\n",
+       "    cell_area  (lat, lon) float32 2.989e+09 2.989e+09 ... 1.116e+10 1.116e+10\n",
+       "Attributes: (12/13)\n",
+       "    long_name:      4xDaily Air temperature at sigma level 995\n",
+       "    units:          degK\n",
+       "    precision:      2\n",
+       "    GRIB_id:        11\n",
+       "    GRIB_name:      TMP\n",
+       "    var_desc:       Air temperature\n",
+       "    ...             ...\n",
+       "    level_desc:     Surface\n",
+       "    statistic:      Individual Obs\n",
+       "    parent_stat:    Other\n",
+       "    actual_range:   [185.16 322.1 ]\n",
+       "    cell_measures:  area: cell_area\n",
+       "    standard_name:  air_temperature
" + ], + "text/plain": [ + "\n", + "[5000 values with dtype=float32]\n", + "Coordinates:\n", + " * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 22.5 20.0 17.5 15.0\n", + " * lon (lon) float32 200.0 202.5 205.0 207.5 ... 315.0 317.5 320.0 322.5\n", + " * time (time) datetime64[ns] 2013-01-01 ... 2013-01-01T18:00:00\n", + " cell_area (lat, lon) float32 2.989e+09 2.989e+09 ... 1.116e+10 1.116e+10\n", + "Attributes: (12/13)\n", + " long_name: 4xDaily Air temperature at sigma level 995\n", + " units: degK\n", + " precision: 2\n", + " GRIB_id: 11\n", + " GRIB_name: TMP\n", + " var_desc: Air temperature\n", + " ... ...\n", + " level_desc: Surface\n", + " statistic: Individual Obs\n", + " parent_stat: Other\n", + " actual_range: [185.16 322.1 ]\n", + " cell_measures: area: cell_area\n", + " standard_name: air_temperature" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from cf_xarray.datasets import airds\n", + "airds.air" + ] + }, + { + "cell_type": "markdown", + "id": "014b52bf-45a3-49f6-b13d-4b9d3a83cf3a", + "metadata": {}, + "source": [ + "the 'lat' and 'lon' variables are mapped to standard names via attributes:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "fda0e93d-db39-4927-86bc-180b7d3ddf81", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'lon' (lon: 50)>\n",
+       "array([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n",
+       "       225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n",
+       "       250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n",
+       "       275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n",
+       "       300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5],\n",
+       "      dtype=float32)\n",
+       "Coordinates:\n",
+       "  * lon      (lon) float32 200.0 202.5 205.0 207.5 ... 315.0 317.5 320.0 322.5\n",
+       "Attributes:\n",
+       "    standard_name:  longitude\n",
+       "    long_name:      Longitude\n",
+       "    units:          degrees_east\n",
+       "    axis:           X
" + ], + "text/plain": [ + "\n", + "array([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n", + " 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n", + " 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n", + " 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n", + " 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5],\n", + " dtype=float32)\n", + "Coordinates:\n", + " * lon (lon) float32 200.0 202.5 205.0 207.5 ... 315.0 317.5 320.0 322.5\n", + "Attributes:\n", + " standard_name: longitude\n", + " long_name: Longitude\n", + " units: degrees_east\n", + " axis: X" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "airds.lon" + ] + }, + { + "cell_type": "markdown", + "id": "d66903ee-1bd2-43a0-ae48-2f9d2e1969a9", + "metadata": {}, + "source": [ + "we'll load in the first time step, which for refernce looks like:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0133b970-ca4e-4c7a-b80b-3881e293878d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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rl0bFy5cQKNGjQrMY069jh49il69emHQoEEAHvXfunLlCoKCgoz7KBQKtGrVCq1atcKMGTMQGBiIyMhITJgwAVqtNs/nT0SlE0eNUYmXkpKCc+fOmbxu3bqFd955B7du3cLo0aNx+fJlfPvtt5g5cyYmTJgApdK8W7tTp06oVq0ahg4divPnz+Po0aOYNm0aAJg8cntcYGAgFAoFdu3ahbt37yItLQ0A0L59e3z55Zc4fPgwLly4gKFDh5q0SHTs2BE1a9bE0KFD8csvv+Dw4cP44IMPTI49cOBAlC1bFr169cLhw4dx/fp1/PTTTxgzZgz+/PNPs6+Zq6srRowYgUmTJuHgwYO4ePEihg0bZnJdatasiYEDB2LIkCHYuXMnrl+/jpMnTyI8PBw//PADAGD06NHYvXs3Pv74Y/z+++9YvXo19uzZU+C1ebyuISEh6N27N3788UfcuHEDx44dwwcffIDTp08DAGbMmIGNGzfiww8/xK+//opLly5hy5Ytxuu/fv16rF27FhcvXsQff/yBr776Ck5OTggMDJQ8tzn1qlGjhrHF59KlS3jzzTdx584d4zFOnDiBefPm4fTp04iPj8fOnTtx9+5d1KlTB8CjEYLnz59HXFwc/v77b4tb/oioBLF1JyUiKUOHDhUA8rxGjBghhBDip59+Ek2bNhVarVb4+fmJyZMnC51OZ8zftm1bY+fgXL169RJDhw41vr906ZJo1aqV0Gq1onbt2uL7778XAMTevXuFEHk7SwshxOzZs4Wfn59QKBTGY6WkpIiXX35ZuLu7i4CAALF+/XqTztJCCBEXFydat24ttFqtqFmzpti7d69JZ2khhEhISBBDhgwRZcuWFQ4ODqJq1api5MiRIiUlJd9rVFDn7QcPHohBgwYJZ2dn4evrKxYsWJDnemRnZ4sZM2aIypUrC41GI/z9/UWfPn3E+fPnjfusWbNGVKhQQTg5OYnevXuLOXPmCD8/P2P6zJkzRf369fOUKzU1VYwePVqUL19eaDQaERAQIAYOHCji4+ON++zdu1e0bNlSODk5CXd3d9GsWTOxZs0aIYQQkZGRonnz5sLd3V24uLiIFi1aiP379+d7DZ4kV6979+6JXr16CVdXV+Hj4yOmTZsmhgwZYuwA/dtvv4nOnTuLcuXKCQcHB1GzZk3x6aefGo+flJQkOnXqJFxdXQUAcejQIWMaO0sTlS4KIZ7o1EBk544ePYrWrVvj6tWrqFatmq2LI+unn37CCy+8gH/++adYJlQcOXIkLl++jMOHDz/1c5VG69evx7hx40rczONElD/2ESK7FxkZCVdXV9SoUQNXr17F2LFj0apVq1IRBD2uYsWK6NGjR56JAa21aNEidOrUCS4uLtizZw82bNiAFStWFOk5nhWurq7IyckxTipJRCUfAyGyew8ePMDkyZMRHx+PsmXLomPHjvnOwlxSNW/eHL///jsAy0d7mePkyZNYsGABHjx4gKpVq+KTTz7B66+/XuTnMdfhw4fRtWvXAtNz+2zZQu7CvE+OViOikouPxoioVHn48CFu375dYLrUKDQioicxECIiIiK7xeHzREREZLcYCBEREZHdYiBEREREdouBEBEREdktBkJERERktxgIERERkd1iIERERER2i4EQERER2a3/A0G8Sw2fVHFYAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "airds.air.isel({'time':0}).plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b5966414-6b2a-4c62-b525-ce1dd7db2203", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'standard_name': 'longitude',\n", + " 'long_name': 'Longitude',\n", + " 'units': 'degrees_east',\n", + " 'axis': 'X'}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "airds.lon.attrs" + ] + }, + { + "cell_type": "markdown", + "id": "61532c54-41ca-4073-a0a9-081c63163584", + "metadata": {}, + "source": [ + "since 'lat' and 'lon' are in the base `known_coord_aliases`, let's remove them (after first resetting the dictionary):" + ] + }, { "cell_type": "code", - "execution_count": null, - "id": "247aabc2-3797-495b-a6ee-411c0467162d", + "execution_count": 9, + "id": "c467f6ef-e7f8-4471-83bd-01265280e953", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "yt_xarray.reset_coordinate_aliases()\n", + "_ = yt_xarray.known_coord_aliases.pop('lat')\n", + "_ = yt_xarray.known_coord_aliases.pop('lon')" + ] + }, + { + "cell_type": "markdown", + "id": "faff8885-c43f-46b3-8aa9-96999a104ca2", + "metadata": {}, + "source": [ + "and now when we go to load a yt dataset, yt_xarray will use cf_xarray to determine that 'lat' and 'lon' should point to latitude and longitude, respectively.\n", + "\n", + "But first... as of this writing, there is a bug in handling longitude ranges, so we'll first adjust the longitude values to be degrees west ([bug report here](https://github.com/data-exp-lab/yt_xarray/issues/85)). The following copies over the original attributes after modifying the longitude variable:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "1225ef6a-54cc-4885-9aa1-75cd3afdecf8", + "metadata": {}, + "outputs": [], + "source": [ + "attrs = airds.lon.attrs.copy()\n", + "airds['lon'] = airds.lon.values - 360.\n", + "airds.lon.attrs.update(attrs)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "f5cd1e3c-87ed-40a7-bbe5-120cc4d42b09", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "yt_xarray : [INFO ] 2024-04-03 16:33:55,041: Inferred geometry type is geodetic. To override, use ds.yt.set_geometry\n", + "yt_xarray : [INFO ] 2024-04-03 16:33:55,045: Attempting to detect if yt_xarray will require field interpolation:\n", + "yt_xarray : [INFO ] 2024-04-03 16:33:55,048: Geodetic geometry on uniform grid within geodetic bounds: yt_xarray will not interpolate.\n", + "yt : [INFO ] 2024-04-03 16:33:55,104 Parameters: current_time = 1.3569984e+18\n", + "yt : [INFO ] 2024-04-03 16:33:55,106 Parameters: domain_dimensions = [25 50 1]\n", + "yt : [INFO ] 2024-04-03 16:33:55,107 Parameters: domain_left_edge = [ 13.75 -161.25 -0.5 ]\n", + "yt : [INFO ] 2024-04-03 16:33:55,108 Parameters: domain_right_edge = [ 76.25 -36.25 0.5 ]\n", + "yt : [INFO ] 2024-04-03 16:33:55,108 Parameters: cosmological_simulation = 0\n", + "yt : [INFO ] 2024-04-03 16:33:55,135 xlim = -161.250000 -36.250000\n", + "yt : [INFO ] 2024-04-03 16:33:55,136 ylim = 13.750000 76.250000\n", + "yt : [INFO ] 2024-04-03 16:33:55,136 Setting origin='native' for geographic geometry.\n", + "yt : [INFO ] 2024-04-03 16:33:55,137 xlim = -161.250000 -36.250000\n", + "yt : [INFO ] 2024-04-03 16:33:55,137 ylim = 13.750000 76.250000\n", + "yt : [INFO ] 2024-04-03 16:33:55,182 Making a fixed resolution buffer of (('stream', 'air')) 800 by 800\n" + ] + }, + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds_yt = airds.yt.load_grid('air', sel_dict={'time':0}, geometry='geographic', use_callable=False)\n", + "slc = yt.SlicePlot(ds_yt, 'altitude', 'air')\n", + "slc.set_log('air', False)" + ] } ], "metadata": { @@ -170,7 +1221,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.0" + "version": "3.10.11" } }, "nbformat": 4, diff --git a/docs/faq.rst b/docs/faq.rst index ec82c4b..69a922c 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -26,7 +26,9 @@ yt datasets have a fixed expectation for coordinate names. In cartesian, these coordinate names are ``'x'``, ``'y'``, ``'z'`` while for geographic coordinate systems the coordinate names are ``'latitude'``, ``'longtiude'`` and then either ``'altitude'`` or ``'depth'``. To work with xarray variables defined with coordinate names that -differ from these, yt_xarray provides some coordinate aliasing. +differ from these, yt_xarray provides some coordinate aliasing, which in part relies +on `cf_xarray `_ (if it is installed) for +additional conversion to standard names. See :doc:`examples/example_002_coord_aliases` for an example. diff --git a/yt_xarray/__init__.py b/yt_xarray/__init__.py index 3edc4b0..63c089c 100644 --- a/yt_xarray/__init__.py +++ b/yt_xarray/__init__.py @@ -8,5 +8,5 @@ # import the xarray accessor so it is registered with xarray from .accessor import YtAccessor -from .accessor._xr_to_yt import known_coord_aliases +from .accessor._xr_to_yt import known_coord_aliases, reset_coordinate_aliases from .yt_xarray import open_dataset diff --git a/yt_xarray/accessor/_xr_to_yt.py b/yt_xarray/accessor/_xr_to_yt.py index 8925736..2ff1209 100644 --- a/yt_xarray/accessor/_xr_to_yt.py +++ b/yt_xarray/accessor/_xr_to_yt.py @@ -324,10 +324,26 @@ def interp_validation(self, geometry): } -known_coord_aliases = {} +_default_known_coord_aliases = {} for ky, vals in _coord_aliases.items(): for val in vals: - known_coord_aliases[val] = ky + _default_known_coord_aliases[val] = ky + +known_coord_aliases = _default_known_coord_aliases.copy() + + +def reset_coordinate_aliases(): + kys_to_pop = [ + ky + for ky in known_coord_aliases.keys() + if ky not in _default_known_coord_aliases + ] + for ky in kys_to_pop: + known_coord_aliases.pop(ky) + + for ky, val in _default_known_coord_aliases.items(): + known_coord_aliases[ky] = val + _expected_yt_axes = { "cartesian": set(["x", "y", "z"]), diff --git a/yt_xarray/tests/test_xr_to_yt.py b/yt_xarray/tests/test_xr_to_yt.py index 0ba73f1..e9638fa 100644 --- a/yt_xarray/tests/test_xr_to_yt.py +++ b/yt_xarray/tests/test_xr_to_yt.py @@ -566,3 +566,9 @@ def _bad_import(name, globals=None, locals=None, fromlist=(), level=0): with pytest.raises(ValueError, match=f"{clist[0]} is not"): _ = xr2yt._convert_to_yt_internal_coords(clist, xr_da) + + +def test_coord_alias_reset(): + xr2yt.known_coord_aliases["blah"] = "lwkerj" + xr2yt.reset_coordinate_aliases() + assert "blah" not in xr2yt.known_coord_aliases