{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "%matplotlib inline " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Example 3: Reading an NCEP BUFR data set\n", "NCEP BUFR (Binary Universal Form for the Representation of meteorological data) can be read two ways:\n", "\n", "- **Fortran code with BUFRLIB**\n", " \n", "- **py-ncepbufr, which is basically Python wrappers around BUFRLIB**\n", "\n", "In this example we'll use py-ncepbufr to read a snapshot of the Argo data tank from WCOSS, show how to navigate the BUFR structure, and how to extract and plot a profile.\n", "\n", "The py-ncepbufr library and installation instructions can be found at\n", "\n", "https://github.com/JCSDA/py-ncepbufr\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "- Once again we begin by importing the required libraries." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt # graphics library\n", "import numpy as np\n", "import ncepbufr # python wrappers around BUFRLIB\n", "import cartopy.crs as ccrs # cartographic coord reference system\n", "import cartopy.feature as cfeature # features (land, borders, coastlines)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- For the purposes of this demo I've made a local copy of the Argo data tank on WCOSS \n", "located at\n", "\n", "**/dcom/us007003/201808/b031/xx005** \n", " \n", "- Begin by opening the file" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "bufr = ncepbufr.open('xx005')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "- Movement and data access within the BUFR file is through these methods:\n", " - `bufr.advance()`\n", " - `bufr.load_subset()`\n", " - `bufr.read_subset()`\n", " - `bufr.rewind()`\n", " - `bufr.close()`\n", "- There is a lot more functionality to ncepbufr, such as searching on multiple mnenomics, printing or saving the BUFR table included in the file, printing or saving the inventory and subsets, setting and using checkpoints in the file. See the ncepbufr help for more details.\n", "\n", "- ***Important Note:*** Unlike pygrib, netCDF4-python or xarray, ncepbufr is unforgiving of mistakes. A BUFRLIB error will result in an *immediate* exit from the Python interpreter. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# move down to first message - a return code of 0 indicates success\n", "bufr.advance() " ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# load the message subset -- a return code of 0 indicates success\n", "bufr.load_subset() " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "- You can print the subset and determine the parameter names. BUFR dumps can be ***very*** verbose, so I'll just copy in the header and the first subset replication from a `bufr.dump_subset()` command.\n", "\n", "- I've highlighted in red the parameters I want to plot." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "
\n",
    "MESSAGE TYPE NC031005  \n",
    "\n",
    "004001  YEAR                      2018.0  YEAR                          YEAR                                            \n",
    "004002  MNTH                         8.0  MONTH                         MONTH                                           \n",
    "004003  DAYS                         1.0  DAY                           DAY                                             \n",
    "004004  HOUR                         0.0  HOUR                          HOUR                                            \n",
    "004005  MINU                        16.0  MINUTE                        MINUTE                                          \n",
    "035195  SEQNUM                       317  ( 4)CCITT IA5                 CHANNEL SEQUENCE NUMBER                         \n",
    "035021  BUHD                      IOPX01  ( 6)CCITT IA5                 BULLETIN BEING MONITORED (TTAAii)               \n",
    "035023  BORG                        KWBC  ( 4)CCITT IA5                 BULLETIN BEING MONITORED (CCCC)                 \n",
    "035022  BULTIM                    010029  ( 6)CCITT IA5                 BULLETIN BEING MONITORED (YYGGgg)               \n",
    "035194  BBB                      MISSING  ( 6)CCITT IA5                 BULLETIN BEING MONITORED (BBB)                  \n",
    "008202  RCTS                         0.0  CODE TABLE                    RECEIPT TIME SIGNIFICANCE                       \n",
    "004200  RCYR                      2018.0  YEAR                          YEAR   - TIME OF RECEIPT                        \n",
    "004201  RCMO                         8.0  MONTH                         MONTH  - TIME OF RECEIPT                        \n",
    "004202  RCDY                         1.0  DAY                           DAY    - TIME OF RECEIPT                        \n",
    "004203  RCHR                         0.0  HOUR                          HOUR   - TIME OF RECEIPT                        \n",
    "004204  RCMI                        31.0  MINUTE                        MINUTE - TIME OF RECEIPT                        \n",
    "033215  CORN                         0.0  CODE TABLE                    CORRECTED REPORT INDICATOR                      \n",
    "001087  WMOP                   6903327.0  NUMERIC                       WMO marine observing platform extended identifie\n",
    "001085  OPMM                        S2-X  (20)CCITT IA5                 Observing platform manufacturer's model         \n",
    "001086  OPMS        10151                             ( 32)CCITT IA5                Observing platform manufacturer's serial number \n",
    "002036  BUYTS                        2.0  CODE TABLE                    Buoy type                                       \n",
    "002148  DCLS                         8.0  CODE TABLE                    Data collection and/or location system          \n",
    "002149  BUYT                        14.0  CODE TABLE                    Type of data buoy                               \n",
    "022055  FCYN                        28.0  NUMERIC                       Float cycle number                              \n",
    "022056  DIPR                         0.0  CODE TABLE                    Direction of profile                            \n",
    "022067  IWTEMP                     846.0  CODE TABLE                    INSTRUMENT TYPE FOR WATER TEMPERATURE PROFILE ME\n",
    "005001  CLATH                   59.34223  DEGREES                       LATITUDE (HIGH ACCURACY)                        \n",
    "006001  CLONH                   -9.45180  DEGREES                       LONGITUDE (HIGH ACCURACY)                       \n",
    "008080  QFQF                        20.0  CODE TABLE                    Qualifier for GTSPP quality flag                \n",
    "033050  GGQF                         1.0  CODE TABLE                    Global GTSPP quality flag                       \n",
    "           (GLPFDATA)   636 REPLICATIONS\n",
    "    ++++++  GLPFDATA  REPLICATION #     1  ++++++\n",
    "007065  WPRES                    10000.0  PA                            Water pressure\n",
    "008080  QFQF                        10.0  CODE TABLE                    Qualifier for GTSPP quality flag                \n",
    "033050  GGQF                         1.0  CODE TABLE                    Global GTSPP quality flag                       \n",
    "022045  SSTH                     285.683  K                             Sea/water temperature\n",
    "008080  QFQF                        11.0  CODE TABLE                    Qualifier for GTSPP quality flag                \n",
    "033050  GGQF                         1.0  CODE TABLE                    Global GTSPP quality flag\n",
    "022064  SALNH                     35.164  PART PER THOUSAND             Salinity\n",
    "008080  QFQF                        12.0  CODE TABLE                    Qualifier for GTSPP quality flag                \n",
    "033050  GGQF                         1.0  CODE TABLE                    Global GTSPP quality flag                       \n",
    "
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "- Now we can load the data for plotting\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "temp = bufr.read_subset('SSTH').squeeze()-273.15 # convert from Kelvin to Celsius\n", "sal = bufr.read_subset('SALNH').squeeze()\n", "depth = bufr.read_subset('WPRES').squeeze()/10000. # convert from Pa to depth in meters\n", "# observation location, date, and receipt time\n", "lon = bufr.read_subset('CLONH')[0][0]\n", "lat = bufr.read_subset('CLATH')[0][0]\n", "date = bufr.msg_date\n", "receipt = bufr.receipt_time\n", "bufr.close()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "\n", "- Set up the plotting figure. But this time, just for fun, let's put both the temperature and salinity profiles on the same axes. This trick uses both the top and bottom axis for different parameters.\n", "\n", "- As these are depth profiles, we need twin x-axes and a shared y-axis for the depth.\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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duxYFi1axOMlyDQSK6X1nhQrW7fC/Pnw2285FWaEYmXv3kPLitind716UL++LaH10O/hh2fnRfksWLMG+vWDr76yfqZY7eMVKhBVGYcUca1a8NBDUKNGEa9PghGRXaqalv+eh+Jbth5PSWHbNhvR9NNP8Ouv5obx5ZfWcg1RoUJO5dmyZXQlWr8+1KljtpUi0KABfPSRrWdlWV/U9u2meEO/4evR0sLXFyywTk+ARYvgootM4dauDUceCcccY5aI0ohv2XoCo8zfk02b4LnnYOZM+OEHWL48W7FWqmROxhddBKecAk2bmiKtUSOpbZubNsEZZ8DixeapEa2l3KMHdOxoSje0VKkCRxwBxx5r75GgplLzLVuPJ5nYtw/eew/uvhu+/946mDp1gquust8TT7TP+3LJMuYodmrXtvcKmKJdv95az+F8+CFMn567yULEnAvq1rX3j4i9g0aPNkVcUt9FXtl6PInk66/hwgth9WrTFK++CpdeGrRUgVCunL1Ton1cq9o7KTPTlh07rOG/dKl5mW3cCBs22Ppnn1mZd94xRZuWZrbhtDRbRoyACwocI7D48crW40kkU6eaon3+eet58jNVREXEOtIqVjTXWICjjwY3QjwHkybZh8KRR5pS3rkze9DYG2/Yu61uXWjc2MzYoeXoo+HaaxPnLuiVrccTb9avt46umTNh3Dhr0nXr5hVtMXHhhbaAtYi3bTMnjbVrzc775ps2CnHDhkPLpqTAddclRk6vbBPMyJEjmTBhAuXLl6dcuXKMHj06h29rOAMGDKB379706dOHQYMGccstt3DCCblPUPHss89SpUoVrrzySsaNG0fPnj0L5K/riQN33WU+TmDNtDPPhNtusw4vT7GyaRM0bx7VjZiUFDNZhJZ69az/8eqrEyefV7YJZNasWUyZMoX58+dTqVIlNm7cyN5o/pFRiCVy1pAhQw6ujxs3jpYtW3plGwQHDsAnn8D48fDyy2aTveEGaNcuO9qUp8CowubN1mrduNGW1autM23BArPpAnToADfdlFO51qwZfH+jV7YJZM2aNdSpU+dgjINQ8PARI0bw7rvvkpmZyamnnsro0aMPiXfQtWtXHnvsMdq3b0/VqlW56aabmDJlCqmpqUyePJn69esfjJPbrFkzvv76a/r27UtqaiojR45k7NixTJw4EYAPP/yQZ555hrff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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize = (5,4))\n", "ax1 = plt.axes()\n", "ax1.plot(temp, depth,'r-')\n", "ax1.grid(axis = 'y')\n", "ax1.invert_yaxis() # flip the y-axis for ocean depths\n", "ax2 = ax1.twiny() # here's the second x-axis definition\n", "ax2.plot(np.nan, 'r-', label = 'Temperature')\n", "ax2.plot(sal, depth, 'b-', label = 'Salinity')\n", "ax2.legend()\n", "ax1.set_xlabel('Temperature (C)', color = 'red')\n", "ax1.set_ylabel('Depth (m)')\n", "ax2.set_xlabel('Salinity (PSU)', color = 'blue')\n", "ttl='ARGO T,S Profiles at lon:{:6.2f}, lat:{:6.2f}\\ntimestamp: {} received: {}\\n'.format(lon,lat,date,receipt)\n", "fig.suptitle(ttl,x = 0.5,y = 1.1,fontsize = 'large');" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Any questions?\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }