Repository: geoschem/gcpy (language: python)

Issue:
[BUG/ISSUE] run_1mo_benchmark.py dies with an error if we restrict the types of plots that are created
**Describe the bug**
If we restrict the types of benchmark plots that are created (which we often do for testing purposes), then the run_1mo_benchmark.py script will die with an error:


      File "./run_1mo_benchmark.py", line 267, in <module>
         sigdiff_files=gcc_vs_gcc_sigdiff)
      File "/n/home09/ryantosca/GC/python/gcpy/gcpy/benchmark.py", line 3098, in make_benchmark_conc_plots
        for v in diff_sfc:
    UnboundLocalError: local variable 'diff_sfc' referenced before assignment

**To Reproduce**
Add the plots=['zonalmean'] keyword to make_benchmark_conc_plots:

```python
if gcc_vs_gcc:

    if plot_conc:
        # Concentration plots
        # (includes lumped species and separates by category)
        print('%%% Creating GCC vs. GCC concentration plots %%%')
        bmk.make_benchmark_conc_plots(gcc_vs_gcc_refspc,
                                      gcc_vs_gcc_refstr,
                                      gcc_vs_gcc_devspc,
                                      gcc_vs_gcc_devstr,
                                      dst=gcc_vs_gcc_plotsdir,
                                      overwrite=True,
                                      restrict_cats=['Oxidants'],
                                      plots=['zonalmean'],
                                      sigdiff_files=gcc_vs_gcc_sigdiff)
```

**Expected behavior**
The code should create all benchmark plots and print the list of significant differences. 

**Potential solution** 
This could be easily fixed by not trying to update the list of significant differences for e.g. surface plots when we are only creating zonal mean plots.  A few if statements can resolve this.


Discussion / hints:
This issue is now resolved by commit https://github.com/geoschem/gcpy/commit/c09304c56626ebd52abd3090d08cddf0d5e7bfb0.  We have added extra if statements to prevent the significant difference files from being created for plot types that have not been selected.

NOTE: In production, we will normally print all plot types (sfc, 500hPa, benchmark).  But it is useful to restrict the type of plots during debugging and/or development.

Fix patch:
diff --git a/.github/workflows/build-gcpy-environment.yml b/.github/workflows/build-gcpy-environment.yml
new file mode 100644
index 00000000..35b8fb19
--- /dev/null
+++ b/.github/workflows/build-gcpy-environment.yml
@@ -0,0 +1,39 @@
+---
+#
+# GitHub action to build the GCPy environment with micromamba
+# See: https://github.com/marketplace/actions/setup-micromamba
+#
+name: build-gcpy-environment
+
+on:
+  push:
+    branches: [ "main", "dev" ]
+  pull_request:
+    # The branches below must be a subset of the branches above
+    branches: [ "main", "dev" ]
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        python-version: ["3.9"]
+    steps:
+      - name: Checkout the GCPy repository
+        uses: actions/checkout@v2
+      - name: Create the GCPy environment
+        uses: mamba-org/setup-micromamba@v1
+        with:
+          micromamba-version: 'latest'
+          environment-file: environment.yml
+          environment-name: gcpy-test-env
+          init-shell: bash
+          cache-environment: true
+          generate-run-shell: true
+          post-cleanup: 'all'
+      - name: Test if "import gcpy" works
+        run: python -c "import gcpy"
+        shell: micromamba-shell {0}
+      - name: Test if we can create a plot
+        run: python -m gcpy.examples.plotting.create_test_plot
+        shell: micromamba-shell {0}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d6258b7e..7c68b041 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,11 @@ All notable changes to GCPy will be documented in this file.
 
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [Unreleased] - TBD
+### Added
+- Example script `create_test_plot.py`, which can be used to check that GCPy has been installed properly
+- GitHub action `build-gcpy-environment` which tests installation of the mamba environment specified in in `docs/source/environment.yml`
+
 ## [1.4.1] - 2023-12-08
 ### Fixed
 - Now use the proper default value for the `--weightsdir` argument to `gcpy/file_regrid.py`
diff --git a/gcpy/examples/plotting/__init__.py b/gcpy/examples/plotting/__init__.py
index b9f7dd64..7aa3eac5 100644
--- a/gcpy/examples/plotting/__init__.py
+++ b/gcpy/examples/plotting/__init__.py
@@ -1,5 +1,6 @@
 """
 GCPy import script
 """
+from .create_test_plot import *
 from .plot_single_panel import *
 from .plot_comparisons import *


Test patch:
diff --git a/gcpy/examples/plotting/create_test_plot.py b/gcpy/examples/plotting/create_test_plot.py
new file mode 100755
index 00000000..848677ff
--- /dev/null
+++ b/gcpy/examples/plotting/create_test_plot.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python
+
+"""
+Creates a dummy xarray DataArray object for testing the single_panel
+plotting routine.  This script can be a useful check to see whether the
+GCPy mamba/conda environment has been successfully installed.
+"""
+
+import numpy as np
+import xarray as xr
+import matplotlib.pyplot as plt
+import gcpy
+
+
+def main():
+    """
+    Main program: Creates a dummy plot
+    """
+    
+    # Get X and Y coordinate arrays
+    n_lat = 181
+    n_lon = 361
+    lat_vals = np.linspace(-90, 90, n_lat)
+    lon_vals = np.linspace(-180, 180, n_lon)
+    
+    # Create a dummy numpy array for plotting
+    # Populate it with the distance from the center of the plot
+    data = np.zeros([n_lat, n_lon])
+    for lat in range(n_lat):
+        for lon in range(n_lon):
+            data[lat, lon] = np.sqrt(lon_vals[lon]**2 + lat_vals[lat]**2)
+            
+    # Create a Dataarray from the numpy array
+    darr = xr.DataArray(
+        data=data,
+        dims=["lat", "lon"],
+        coords=dict(
+            lat=("lat", lat_vals),
+            lon=("lon", lon_vals),
+        ),
+    )
+    
+    # Create a plot
+    gcpy.plot.single_panel(
+        darr,
+        plot_type="single_level",
+        title="Test plot to check GCPy import",
+        extent=[-180, 180, -90, 90],
+        comap=plt.get_cmap("RdBu_r")
+    )
+    plt.show()
+
+
+if __name__ == '__main__':
+    main()