From bb1e6eaf7d861e23a67422539b370bd4b129c0ec Mon Sep 17 00:00:00 2001 From: bikegeek <3753118+bikegeek@users.noreply.github.com> Date: Fri, 21 Jan 2022 12:14:26 -0700 Subject: [PATCH] Update develop-ref after PR #1354 (#1367) * Feature 1091 extent cycloneplotter (#1218) * Github #1091 add support to define plot's extent * Github #1091 Add support for defining plot's extent * Github #1091 add support for defining plot extent * GitHub #1091 Provide support to define plotting a bounding box of interest and replace deprecated cartopy attributes. * Github Issue #1091 Add configuration support to define the bounding box defining the area of interest to plot. * Github Issue #1091 provide support to define bounding box defining the area of interest to plot. * Github Issue #1091 Removed unused shapely imports * GItHub Issue #1091 Removed duplicate CYCLONE_PLOTTER_GLOBAL_PLOT * Github #1091 Include config settings needed to indicate the region of interest to be plotted. * Github Issue #1091 Keep only the North Hemisphere lon and lats in the config file to serve as example for plotting a specific area of the map. * convert file back to unix format via dos2unix and added change that was lost in merge * return None from function instead of exiting so that METplus clean up functionality will still run * fixed indentation * fixed indentation - for loop should not be nested inside other for loop * fixed check for failure in retrieve_data function * feature 1223 error if file not found (#1238) * feature 1252 allow dictionary value for time_summary.width (#1253) * feature 1213 obs_quality_inc/exc (#1260) * Feature 1203 ioda2nc (#1262) * Add default title for the new use case issue template. * Feature 1019 harmonic preprocessing (#1272) Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com> * Feature 1266 gen ens prod missing ensembles (#1275) * Feature 1049 statistics list (#1271) * first attempt at a table #1049 * 2nd attempt, smaller, different formatting table #1049 * trying to get rid of git error message by adding this to the index #1049 * alignment #1049 * trying to text wrap in a table #1049 * attempting to create text wrapping in tables #1049 * removing role, trying to wrap text #1049 * removing html break, trying to wrap text #1049 * adding code to wrap text #1049 * removing code to wrap text #1049 * fixing naming typo #1049 * hitting returns in table #1049 * removing typo file, removing line breaks #1049 * attempting a simple table for text wrapping #1049 * attempting to bold header row in simple table #1049 * simple table line break attempt #1049 * simple table line break attempt #2 #1049 * simple table line break attempt #3 #1049 * trying another | #1049 * 2 trying another | #1049 * 3 trying another | #1049 * trying a blank line #1049 * trying reformating grid #1049 * 2 trying reformating grid #1049 * 3 trying reformating grid #1049 * 4 trying reformating grid #1049 * adding in one more table row #1049 * adding more text #1049 * trying glossary format #1049 * 2 trying glossary format #1049 * 3 trying glossary format #1049 * 4 trying glossary format #1049 * adding glossary format 2D objects #1049 * fixing glossary format 2D objects #1049 * adding glossary items #1049 * fixing glossary format #1049 * hopefully all examples are working #1049 * changing reference to tool * removing 2D object examples * removing the unwrapped table * adding ACC into the example * fixing formatting #1049 * fixing formatting take 2 #1049 * fixing formatting take 3 #1049 * bolding and language change #1049 * fixing spacing #1049 * fixing spacing again #1049 * changing title #1049 * trying superscript #1049 * superscript glossary #1049 * removing quotes #1049 * fixing spacing #1049 * Tara has decided to go with the glossary format. Removing table example. #1049 * Adding 2D objects #1049 * 2D objects fix #1049 * 2D objects fix attempt 2 #1049 * 2D objects fix attempt 3 #1049 * 2D objects fix attempt 4 #1049 * 2D objects fix attempt 5 #1049 * 2D objects fix attempt 7 #1049 * 2D objects fix attempt 8 #1049 * ABR added #1049 * adding remaining AB items to list #1049 * adding remaining ACC_ items to list #1049 * ADLAND & AFSS entries #1049 * A entries #1049 * fixing formatting #1049 * fixing formatting #2 #1049 * removing new entries to make it run #1049 * adding a couple back in #1049 * adding a couple more back in #1049 * tool key at the bottom #1049 * spacing changes #1049 * spacing changes another try #1049 * fixing spacing #1049 * fixing spacing attempt 2 #1049 * fixing spacing attempt 3 #1049 * through AREA items #1049 * AMODEL listed twice but it's not #1049 * AMODEL listed twice but it's not #2 #1049 * AMODEL added question marks so it will run #1049 * final A entries #1049 * naming the glossary statistics in hopes of not conflicting with original glossary #1049 * removing glossary statistics space #1049 * Testing multiple glossary names * Per #1067, working on attempts to have multiple glossaries with the same term * Per #1067, working on attempts to have multiple glossaries with the same term * Per #1067, working on attempts to have multiple glossaries with the same term * Per #1067, removing code with attempts at mutiple glossaries * Per #1067, adding back three question marks due to duplicate term * paring down list, adding a table for review * problems with table * still trying to get it to publish * still trying to get a second line in the table * still trying to get a second line in the table 2 * testing different formatting * testing different formatting * trying to comment out the glossary inner workings * formatting again * line breaks in table #1049 * adding in some more for an example #1049 * adding new entries in through AREA #1049 * fixing line breaks #1049 * fixing line breaks #1049 #2 * fixing line breaks and warning messages #1049 * fixing line breaks #1049 * adding AREA_RATIO through ASPECT_DIFF * fixing typo #1049 * fixing typo #1049 * fixing typo #1049 take 2 * adding AXIS_ANG to BCMSE #1049 * adding spacing #1049 * adding spacing removing commas #1049 * removing comma #1049 * BOUNDARY_DIST thru BSS_SMPL #1049 * BOUNDARY_DIST splitting across 2 lines #1049 * cleaning up typos #1049 * calibration thru centriod_dist #1049 * centriod_lat thru centroid_y #1049 * fixing spacing #1049 * removing test glossary #1049 * climo_mean thru crtk_err #1049 * fixing crtk_err spacing #1049 * fixing spacing #1049 * CSI to CURVATURE_Y #1049 * CURVATURE_X & Y spacing #1049 * DEV_CAT to DURATION_DIFF #1049 * EC_VALUE to F #1049 * F_RATE TO FBS #1049 * Fixing spacing #1049 * fcst_clus thru fcst_conv_radius #1049 * removing CTOP_PRS #1049 * fixing the order of tools for FBAR and FBIAS #1049 * fixing spacing #1049 * adding grid-stat to all point-stat entries #1049 * adding fixing spacing #1049 * adding fixing spacing take 2 #1049 * adding fixing spacing take 3 #1049 * adding fixing spacing take 4 #1049 * adding fixing spacing take 5 #1049 * adding fixing spacing take 6 #1049 * adding fixing spacing take 7 #1049 * fixing spacing with a period take 7 #1049 * first attempt fcst_ #1049 * fixing typos #1049 * thru FOBAR #1049 * thru end of F #1049 * g thru h #1049 * i thru intensity #s #1049 * fixing typos #1049 * capturing example for Julie #1049 * thru k #1049 * fixing typos #1049 * thru L #1049 * thru MG #1049 * thru N_ENS #1049 * thru all N #1049 * fixing FBIAS alignment #1049 * fixing ME and MSE alignment #1049 * fixing ME alignment take 2 #1049 * thru OBS_E #1049 * fixing alignment #1049 * fixing alignment n_thresh #1049 * thru OBS_thresh #1049 * thru O #1049 * fixing OOBAR formating #1049 * thru PR_CORR #1049 * commented lines out with line total info #1049 * commented lines out with line total info take 2 #1049 * thru R #1049 * thru SPEED #1049 * thru S #1049 * thru T #1049 * thru U #1049 * thru V #1049 * thru V #1049 * thru Z #1049 * Update statistics_list.rst Tara is testing editing in UI * Update statistics_list.rst Updates through the A's * Update statistics_list.rst Cleaning up the A's * Update statistics_list.rst Standardizing MODE and MTD entries * Update statistics_list.rst Updating B's and C's * Update statistics_list.rst Testing adding TC-Stat and TCST to an entry * Update statistics_list.rst Clean up of a few A-Cs and then update of Ds * Update statistics_list.rst A few clean-ups and Es * Update statistics_list.rst Halfway through Fs... * Update statistics_list.rst A little clean up and the rest of Fs * Update statistics_list.rst G, H, I, Ks * Update statistics_list.rst L, M, Ns * Update statistics_list.rst A little clean-up and Os * Update statistics_list.rst A little clean-up and Os * Update statistics_list.rst Rs * Update statistics_list.rst S and Ts * Update statistics_list.rst The rest of the list * Update statistics_list.rst Removed Attr from Stat Type thru E * Update statistics_list.rst Remove Attr from Statistics Type through Gs * Update statistics_list.rst Remove Attr from Statistic Type through Rs * Update statistics_list.rst Remove Attr from Stat Type to the end * Update statistics_list.rst Cleaned up some Line Type typos * Update statistics_list.rst Still more Attr cleanup Co-authored-by: Julie Prestopnik Co-authored-by: TaraJensen * Feature 1263 v4.1.0 beta4 (#1277) * update version to note development towards beta5 * Feature 934 release stage doc (#1235) * Per #934 add stages of the METplus release cycle. * Per #934, adding link to descriptions of the release cycle in the User's Guide. * Per #934, made corrections * Per #934, changed Beta and Release Candidate (rc) from bold to subsubsections. * Update index.rst Co-authored-by: Julie Prestopnik * Feature 344 met util refactor (#1292) * removed deprecated sections from config examples * minor change to METplus release guide to add a link to the PDF of the User's Guide instead of downloading it and attaching it to the release * Feature 1285 extract tiles mtd times (#1315) * Feature 896 more met config (#1322) * removed incorrect search keyword * added workflow_dispatch event so workflow can be triggered by an external repository such as MET to test to ensure that changes from that repo will break anything in METplus * added another input argument for workflow_dispatch event * added job with name that shows the event name or the repository name if triggered by an external repository such as MET * GHA: add username that triggered external event to event info job name * added required input argument for external trigger that contains the commit hash of the push event that triggered in the other repo * change event info to show commit hash instead of username that merged the PR * changed input names to match names of event in repository that triggered workflow * feature 1320 OMP_NUM_THREADS (#1338) * Feature 1183 memory documentation (#1340) Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com> * add email address of user who triggered push event to job name * Feature 1166 series analysis field info (#1353) * Feature 1116 usecase smos (#1348) Co-authored-by: Mrinal Biswas * turn off new use case from every push * feature 1236 Control Members in EnsembleStat and GenEnsProd (#1357) * added optional argument to change the directory to untar new input data into so the same Dockerfile can be used to add data for other METplus components such as MET * feature 1358 v4.1.0-beta5 release (#1359) * update version for next development cycle * Feature 1216 usecase smap (#1361) * Adding a conf file for SMAP * Adding a directory to host the read file * Removing temp file * Updated the valid dates to match Todd's code * Adding documentation for SMAP case * Updates the valis dates to match Todd's code * Removing a tmp file * Typo in file name * Updating the input RTOFS to have the init time instead of the valid time ii the file name * updated file paths, tesing * updated use case descriptions, rearranged use case group testing * put new use case into its own group so that the diff logic can evaluate marine_and_cryosphere:3. The truth data for 3-4 does not exist yet so the diff fails. Co-authored-by: Mrinal Biswas Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com> * updated marine_and_cryo grouping * Feature 1230 stratosphere metrics (#1354) * Initial checkin for Meridial Mean use case * Changed the name and directories * Added some documentation * Fixed config variables * Issue 1230 Stratospheric metrics (zonal/meridional use case) put INPUT_BASE in the user_env_vars so the user doesn't need to set the INPUT_BASE environment in the current working shell * Issue #1230 remove import of metplotpy-this isn't called * Issue #1230_stratosphere_metric Add use case to the list of use cases to be run for testing * Issue 1230 Remove the INPUT_BASE from the user_env_vars section * Issue #1230 redundant files * Issue #1230 redundant files * Issue #1230 redundant files * Issue #120 replace INPUT_BASE with INPUT_FILE_NAME * Issue #1230 remove entry for INPUT_FILE_NAME, this goes in the system.conf * Update all_use_cases.txt Copy and pasted #11 from s2s use case for the Stratosphere use case but forgot to update the index to 12. * Update use_case_groups.json added use case #12 from s2s to test stratosphere use case * Issue #1230 put INPUT_FILE_NAME back under the user_env_vars * Issue #1230 forgot to include the filename * Issue #1230 clean up config file, remove uneccessary comments, group related entries in the user_env_vars * Issue #1230 remove extraneous and incorrect path to the input_filename setting * Removed pingouin dependency * Issue #1230 another cut and paste error fixed for the Stratosphere use case * Issue #1230 type in name, obs_Only should be obsOnly * Issue #1230 added the metdatadb to the env, code imports metdatadb and may require some of these dependencies * issue #1230 removed pingouin dependency from comment to reduce any confusion * issue #1230 turn off the test for the Stratosphere metrics use case * Added use case image Co-authored-by: Hank Fisher Co-authored-by: Minna Win Co-authored-by: bikegeek <3753118+bikegeek@users.noreply.github.com> Co-authored-by: Christina Kalb Co-authored-by: George McCabe <23407799+georgemccabe@users.noreply.github.com> Co-authored-by: johnhg Co-authored-by: Christina Kalb Co-authored-by: lisagoodrich <33230218+lisagoodrich@users.noreply.github.com> Co-authored-by: Julie Prestopnik Co-authored-by: TaraJensen Co-authored-by: jprestop Co-authored-by: j-opatz <59586397+j-opatz@users.noreply.github.com> Co-authored-by: Mrinal Biswas Co-authored-by: j-opatz Co-authored-by: Hank Fisher Co-authored-by: Hank Fisher Co-authored-by: Minna Win Co-authored-by: Christina Kalb --- .github/parm/use_case_groups.json | 5 + ci/docker/docker_env/scripts/metplotpy_env.sh | 2 - docs/_static/s2s-zonal_means.png | Bin 0 -> 26841 bytes .../UserScript_obsERA_obsOnly_Stratosphere.py | 137 ++++++++++++++++++ internal_tests/use_cases/all_use_cases.txt | 1 + ...serScript_obsERA_obsOnly_Stratosphere.conf | 56 +++++++ .../README | 9 ++ .../meridonial_mean.py | 82 +++++++++++ .../meridonial_mean.yaml | 2 + 9 files changed, 292 insertions(+), 2 deletions(-) create mode 100755 docs/_static/s2s-zonal_means.png create mode 100644 docs/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.py create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere.conf create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/README create mode 100755 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py create mode 100644 parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml diff --git a/.github/parm/use_case_groups.json b/.github/parm/use_case_groups.json index 96f44cd91c..85959b3fb9 100644 --- a/.github/parm/use_case_groups.json +++ b/.github/parm/use_case_groups.json @@ -154,6 +154,11 @@ "index_list": "11", "run": false }, + { + "category": "s2s", + "index_list": "12", + "run": false + }, { "category": "space_weather", "index_list": "0-1", diff --git a/ci/docker/docker_env/scripts/metplotpy_env.sh b/ci/docker/docker_env/scripts/metplotpy_env.sh index 1db44769ee..914c1b074b 100755 --- a/ci/docker/docker_env/scripts/metplotpy_env.sh +++ b/ci/docker/docker_env/scripts/metplotpy_env.sh @@ -10,7 +10,6 @@ # matplotlib==3.3.0 # scipy==1.5.1 # plotly==4.9.0 -# pingouin==0.3.8 # cartopy==0.18.0 # eofs==1.3.0 # cmocean==2.0 @@ -34,7 +33,6 @@ conda create -y --clone ${BASE_ENV} --name ${ENV_NAME} conda install -y --name ${ENV_NAME} -c conda-forge matplotlib==3.3.0 conda install -y --name ${ENV_NAME} -c conda-forge scipy==1.5.1 conda install -y --name ${ENV_NAME} -c conda-forge plotly==4.9.0 -conda install -y --name ${ENV_NAME} -c conda-forge pingouin==0.3.8 conda install -y --name ${ENV_NAME} -c conda-forge cartopy==0.18.0 conda install -y --name ${ENV_NAME} -c conda-forge eofs==1.3.0 conda install -y --name ${ENV_NAME} -c conda-forge cmocean==2.0 diff --git a/docs/_static/s2s-zonal_means.png b/docs/_static/s2s-zonal_means.png new file mode 100755 index 0000000000000000000000000000000000000000..3e5ab96dc491306227d6acb7dc71062a5734858b GIT binary patch literal 26841 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

6iwz1ux-INc2FaXv}R>^It)Q&Pnu93|+ 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 d@Tg9&*e)xucMQ6/METdatadb:/METcalcpy + +The file SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc needs to be +on disk somewhere on your computer and referenced correctly in the file +meridial_mean.yaml diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py new file mode 100755 index 0000000000..777be36ea6 --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 + +""" +Create meridonial mean statistics + +""" +import os +import sys +import logging +import yaml +import xarray as xr # http://xarray.pydata.org/ +import metcalcpy.util.read_env_vars_in_config as readconfig +import metcalcpy.pre_processing.directional_means as directional_means +import METreadnc.util.read_netcdf as read_netcdf + + +def main(): + """ + Use existing default meridonial mean config file found in METcalcpy to + grab the test file + """ + + + """ + Read Meridial Mean YAML configuration file + user can use their own, if none specified at the command line, + use the "default" example YAML config file, spectra_plot_coh2.py + Using a custom YAML reader so we can use environment variables + """ + + try: + input_config_file = os.getenv("YAML_CONFIG_NAME","meridonial_mean.yaml") + config = readconfig.parse_config(input_config_file) + logging.info(config) + except yaml.YAMLError as exc: + logging.error(exc) + + """ + Read METplus config file paramaters + """ + #input_file_name = os.environ.get("INPUT_FILE_NAME","SSWC_v1.0_varFull_ERAi_d20130106_s20121107_e20130307_c20160701.nc") + input_file = config["input_filename"] + + """ + Setup logging + """ + logfile = "meridonial_mean.log" + logging_level = os.environ.get("LOG_LEVEL","logging.INFO") + logging.basicConfig(stream=logfile, level=logging_level) + + """ + Read dataset + """ + try: + logging.info('Opening ' + input_file[0]) + file_reader = read_netcdf.ReadNetCDF() + + #file_reader returns a list of xarrays even if there is only one file requested to be read + #so we change it from a list to a single + ds = file_reader.read_into_xarray(input_file)[0] + except IOError as exc: + logging.error('Unable to open ' + input_file) + logging.error(exc) + sys.exit(1) + logging.debug(ds) + ds = ds[['uwndFull_TS','vwndFull_TS','tempFull_TS','geopFull_TS']] + ds = ds.rename({'timeEv60':'time', + 'lat':'latitude', # pyzome currently expects dimensions named latitude and longitude + 'lon':'longitude', + 'uwndFull_TS':'u', + 'vwndFull_TS':'v', + 'tempFull_TS':'T', + 'geopFull_TS':'Z'}) + + uzm = directional_means.zonal_mean(ds.u) + Tzm = directional_means.zonal_mean(ds.T) + T_6090 = directional_means.meridional_mean(Tzm, 60, 90) + + print(T_6090) + +if __name__ == '__main__': + main() diff --git a/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml new file mode 100644 index 0000000000..6cadc5160b --- /dev/null +++ b/parm/use_cases/model_applications/s2s/UserScript_obsERA_obsOnly_Stratosphere/meridonial_mean.yaml @@ -0,0 +1,2 @@ +input_filename: +- !ENV '${INPUT_FILE_NAME}'