diff --git a/build.xml b/build.xml
index 52de481e..577cb737 100644
--- a/build.xml
+++ b/build.xml
@@ -319,7 +319,7 @@
-
+
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 524e2d34..c7dd5fc2 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -5,10 +5,10 @@ MAINTAINER Tatiana Burek
#
# This Dockerfile checks out METviewer from GitHub and builds the specified branch or tag.
#
-ENV METVIEWER_GIT_NAME main_v5.1
-ENV METCALCPY_GIT_NAME main_v2.1
-ENV METPLOTPY_GIT_NAME main_v2.1
-ENV METDATAIO_GIT_NAME main_v2.1
+ENV METVIEWER_GIT_NAME v6.0.0-beta2
+ENV METCALCPY_GIT_NAME v3.0.0-beta2
+ENV METPLOTPY_GIT_NAME v3.0.0-beta2
+ENV METDATAIO_GIT_NAME v3.0.0-beta2
#
# Constants
diff --git a/docs/Contributors_Guide/index.rst b/docs/Contributors_Guide/index.rst
index a1ddc46f..b08361e8 100644
--- a/docs/Contributors_Guide/index.rst
+++ b/docs/Contributors_Guide/index.rst
@@ -1,7 +1,6 @@
-
-===================
+###################
Contributor's Guide
-===================
+###################
.. toctree::
:titlesonly:
diff --git a/docs/Contributors_Guide/testing.rst b/docs/Contributors_Guide/testing.rst
index 78f7da56..6a64b28a 100644
--- a/docs/Contributors_Guide/testing.rst
+++ b/docs/Contributors_Guide/testing.rst
@@ -1,8 +1,9 @@
+**************
Testing Module
-==============
+**************
-Testing example - install and run on dakota
--------------------------------------------
+Testing Example - Install and Run on dakota
+===========================================
**Testing directory and branch information**
@@ -45,8 +46,8 @@ stored in the
`git store `_ .
Also, **auto_test.sh** should be modified to send emails with testing results.
-Testing - capture
------------------
+Testing - Capture
+=================
The testing module is used to execute the regression testing of a specified
version of METviewer. The capture tool is invoked by using the mv_test.sh
@@ -173,13 +174,13 @@ directory structure might look like this, for example...
...
-Testing - verify
-----------------
+Testing - Verify
+================
The mv_compare.sh script accepts a branch and a tag that it uses to identify a test subdirectory and a second "expected" branch and tag that it uses to identify a comparison test directory. If tags are omitted the HEAD is used. The compare script looks for corresponding image files in the corresponding plots directories and does a binary comparison of the corresponding files. Differences will be reported as errors.
-auto test
----------
+Auto Test
+=========
The auto_test.sh script defines the branch, optionally a tag, directories, and database credentials for a version under test and a comparison version. It performs the following steps.
@@ -286,8 +287,8 @@ to pass, produced and expected files should be byte identical.
NOTE: R scripts create visually similar results but bitwise different
image files on different platforms.
-Testing submodules
-------------------
+Testing Submodules
+==================
**LoadDataTest** recreates and refills the mv_test database with MET output
data and compares the number of rows in each table with the expected number.
diff --git a/docs/Users_Guide/barplots.rst b/docs/Users_Guide/barplots.rst
index 32e65f76..3c263781 100644
--- a/docs/Users_Guide/barplots.rst
+++ b/docs/Users_Guide/barplots.rst
@@ -1,8 +1,9 @@
+*********
Bar Plots
-=========
+*********
Description
------------
+===========
A bar plot shows comparisons among discrete categories. One axis of the
chart shows the specific categories being compared, while the other
@@ -22,7 +23,7 @@ Bar plots often represent counts or frequencies, however, bar plots can
represent means, medians, standard deviations, or any other statistic.
How-To
--------
+======
Selection of options to produce the plot proceeds approximately
counter-clockwise around the METviewer window. The steps to create a series
@@ -92,7 +93,7 @@ plot are:
There are many other options for plots, but these are the basics.
Example
---------
+=======
The image below shows an example of the plot and set-up options for a
series plot in METviewer. This example uses the database
diff --git a/docs/Users_Guide/batch.rst b/docs/Users_Guide/batch.rst
index 63e719cc..688ff52c 100644
--- a/docs/Users_Guide/batch.rst
+++ b/docs/Users_Guide/batch.rst
@@ -1,5 +1,6 @@
+*********************
Batch Plotting Module
-=====================
+*********************
The batch plotting system is used to generate a number of plots of data in
the METviewer database. The usage statement:
@@ -170,7 +171,8 @@ conceptually, a list of **** structures.
| **:** Turns on a difference curve should be plotted for the y2 series; calculated as the pairwise difference between the members of the first series minus the second - example:list(c("series1","series2"), c("series3","series4")).
|
-**Template Formatting**
+Template Formatting
+===================
Template values have the syntax
{var_name[?param1=val1[¶m2=val2[...]]]}. For example,
@@ -439,10 +441,11 @@ starting at 1 for each fcst_var.
|
MODE Statistics
----------------
+===============
Single Object Statistics
-~~~~~~~~~~~~~~~~~~~~~~~~
+------------------------
+
MODE statistics are broken up into two categories: single and pair
statistics. Single statistics are suffixed with a three letter code which
indicates the group of objects over which the statistic should be calculated
@@ -597,7 +600,7 @@ RATIO\_ with AREARAT\_ and OBJ with OBJA.
- OBJFBIAS
Pair Object Statistics
-~~~~~~~~~~~~~~~~~~~~~~
+----------------------
MODE object pair statistics are specified using the following format:
STATNAME_CC where STATNAME is one of the Object Pair Statistics in the
diff --git a/docs/Users_Guide/boxplot.rst b/docs/Users_Guide/boxplot.rst
index a5cb6d26..e505dc15 100644
--- a/docs/Users_Guide/boxplot.rst
+++ b/docs/Users_Guide/boxplot.rst
@@ -1,8 +1,9 @@
+*********
Box Plots
-=========
+*********
Description
------------
+===========
Box plots, or box and whisker plots, are a way to summarize a distribution
of values using Tukey's 5-number summary
@@ -27,7 +28,7 @@ threshold. Here, each forecast and observation is binary, but the
verification statistic is continuous.
How-To
----------
+======
Selection of options to produce the plot proceeds approximately
counter-clockwise around the METviewer window. The steps to create a
@@ -105,7 +106,7 @@ There are many other options for plots, but these are the basics.
Example
---------
+=======
The example below shows a boxplot of the RMSE for 2m temperature over
the CONUS. Many of the standard METviewer plotting options are available
diff --git a/docs/Users_Guide/common.rst b/docs/Users_Guide/common.rst
index 0245046d..891cc6a7 100644
--- a/docs/Users_Guide/common.rst
+++ b/docs/Users_Guide/common.rst
@@ -1,5 +1,6 @@
+*********************
Common XML Structures
-=====================
+*********************
The database loading module and batch plotting module both use XML input files. Some XML structures can be used in either input file. These common structures are documented below.
diff --git a/docs/Users_Guide/contourplot.rst b/docs/Users_Guide/contourplot.rst
index 6dc62863..debd71eb 100644
--- a/docs/Users_Guide/contourplot.rst
+++ b/docs/Users_Guide/contourplot.rst
@@ -1,8 +1,9 @@
+*************
Contour Plots
-=============
+*************
Description
------------
+===========
Contour plots are a very general plot type somewhat similar to a scatter
plot. The axes are specified by the user, and any will do so long as the
@@ -13,7 +14,7 @@ examine the difference in statistics between two NWP models as a contour
plot, as is shown in the example below.
How-To
--------
+======
Selection of options to produce the plot proceeds approximately
counter-clockwise around the METviewer window. The steps to create a contour
@@ -76,7 +77,7 @@ plot are:
There are many other options for plots, but these are the basics.
Example
---------
+=======
The example is a contour plot of temperature mean error (bias) for one
model at different pressure levels over a range of initialization times.
diff --git a/docs/Users_Guide/database_loading.rst b/docs/Users_Guide/database_loading.rst
index 74c26e6b..39b0d761 100644
--- a/docs/Users_Guide/database_loading.rst
+++ b/docs/Users_Guide/database_loading.rst
@@ -1,5 +1,6 @@
+***********************
Database Loading Module
-=======================
+***********************
The database loading module is used to insert, update, and delete MET output
data in the database. The tool is invoked using the mv_load.sh script. The
@@ -134,7 +135,7 @@ change it to
Example
--------
+=======
Here is a simple example:
@@ -203,7 +204,8 @@ specified by the named folder_dates.
...
Troubleshooting
----------------
+===============
+
.. _test:
.. list-table::
diff --git a/docs/Users_Guide/database_scrubbing.rst b/docs/Users_Guide/database_scrubbing.rst
index 01f3ff05..956114b1 100644
--- a/docs/Users_Guide/database_scrubbing.rst
+++ b/docs/Users_Guide/database_scrubbing.rst
@@ -1,5 +1,6 @@
+*************************
Database Scrubbing Module
-=========================
+*************************
The database scrubbing utility is used to to delete data from METviewer
databases that meets some user-specified selection criteria. The usage
@@ -58,7 +59,7 @@ performed (**FALSE**).
|
Examples
---------
+========
**Example 1: Prune by describing the data ()**
diff --git a/docs/Users_Guide/eclvplots.rst b/docs/Users_Guide/eclvplots.rst
index 1f1f94ad..2bf1bccf 100644
--- a/docs/Users_Guide/eclvplots.rst
+++ b/docs/Users_Guide/eclvplots.rst
@@ -1,8 +1,9 @@
+******************************
Economic Cost/Loss Value Plots
-==============================
+******************************
Description
------------
+===========
The Economic Cost Loss Value statistic is sometimes also called the
Relative value score (:ref:`Richardson, 2000`;
@@ -23,11 +24,12 @@ The ECLV score can range from -:math:`\infty` to 1.
Like ROC diagrams, it gives information that can be used in decision making.
Line Type
----------
+=========
+
ECLV requires the ECLV line type generated by either Point-Stat or Grid-Stat.
How-To
-------
+======
Selection of options to produce the ECLV plot proceeds approximately
counter-clockwise around the METviewer window.
@@ -81,7 +83,7 @@ counter-clockwise around the METviewer window.
Example
---------
+=======
The figure below shows an ECLV plot. In this example, three different
forecasting systems are used to predict precipitation at two different
diff --git a/docs/Users_Guide/etb_plot.rst b/docs/Users_Guide/etb_plot.rst
index 01159734..1ae97729 100644
--- a/docs/Users_Guide/etb_plot.rst
+++ b/docs/Users_Guide/etb_plot.rst
@@ -1,8 +1,9 @@
+********************************
Equivalence Testing Bounds Plots
-================================
+********************************
Description
------------
+===========
A statistical hypothesis is an assertion about the distribution function for one or more random variables.
Generally, two hypotheses are considered, a null hypothesis denoted by H0, and an alternative denoted by
@@ -32,7 +33,7 @@ In this case, H0 is accepted if the CI bounds fall completely between the tolera
and H0 is rejected otherwise.
How-To
--------
+======
Selection of options to produce the plot proceeds approximately
counter-clockwise around the METviewer window. The steps to create a
@@ -104,7 +105,7 @@ There are many other options for plots, but these are the basics.
Example
---------
+=======
The image below shows an example of the plot and set-up options for a
series plot in METviewer. This example uses the database
diff --git a/docs/Users_Guide/index.rst b/docs/Users_Guide/index.rst
index 237d3271..c7553d0e 100644
--- a/docs/Users_Guide/index.rst
+++ b/docs/Users_Guide/index.rst
@@ -1,6 +1,6 @@
-============
+############
User's Guide
-============
+############
**Foreword: A note to METviewer users**
diff --git a/docs/Users_Guide/installation.rst b/docs/Users_Guide/installation.rst
index 00ac5e20..d368621d 100644
--- a/docs/Users_Guide/installation.rst
+++ b/docs/Users_Guide/installation.rst
@@ -1,17 +1,18 @@
.. _install:
+****************************
METviewer Installation Guide
-============================
+****************************
Introduction
-------------
+============
This chapter describes how to install METviewer. METviewer has been
developed and tested on Linux operating systems. Support for additional
platforms and compilers may be added in future releases.
Installing METviewer
---------------------
+====================
METviewer relies on the following tools. These must be installed and tested
prior to installing METviewer:
@@ -117,8 +118,8 @@ clone `METdataio repository `_
git clone https://github.com/dtcenter/METdataio.git
-Configure and build METviewer
-_____________________________
+Configure and Build METviewer
+-----------------------------
#. Configure the batch and loading tools:
@@ -225,7 +226,8 @@ _____________________________
ln -s /d3/projects/METViewer/src_dev/apps/verif/metviewer/sql/mv_mysql.sql mv_mysql.sql
Making a Database Accessible in the METviewer Web Application
--------------------------------------------------------------
+=============================================================
+
To make a new database accessible in the METviewer Web Application click
on "Reload list of databases" button in the upper right corner of the
main JSP page. The list of available databases should be updated and a
diff --git a/docs/Users_Guide/overview.rst b/docs/Users_Guide/overview.rst
index 5b494767..10826d6a 100644
--- a/docs/Users_Guide/overview.rst
+++ b/docs/Users_Guide/overview.rst
@@ -1,9 +1,9 @@
+*********************
Overview of METviewer
-=====================
+*********************
-
-Purpose and organization of the User's Guide
---------------------------------------------
+Purpose and Organization of the User's Guide
+============================================
The goal of this User's Guide is to provide basic information for users of
the METviewer database and display system to enable users to create plots
@@ -13,7 +13,7 @@ The METviewer User's Guide is organized as follows.
The Developmental Testbed Center (DTC)
---------------------------------------
+======================================
METviewer has been developed, and will be maintained and enhanced, by the
Developmental Testbed Center (`DTC `_ ). The main
@@ -34,8 +34,8 @@ modeling community for testing and evaluation of new model capabilities,
applications in new environments, and so on.
-METviewer goals and design philosophy
--------------------------------------
+METviewer Goals and Design Philosophy
+=====================================
The METviewer tool reads MET verification statistics output from a database
and creates plots using the R statistical package. The tool includes a web
@@ -55,7 +55,7 @@ private sector, and operational modeling and prediction centers.
METviewer Requirements
-----------------------
+======================
METviewer requires installation of Java, Apache / Tomcat, MySQL, and R
statistics.
@@ -70,7 +70,7 @@ statistics.
.. _userspec:
METviewer User Specifications
------------------------------
+=============================
The top menu allows the user to select a database and type for the plot.
@@ -121,7 +121,7 @@ trying to compare the skill of one or more predictions.
METviewer Output
-----------------
+================
METviewer output all appears in the tabbed boxes at the top right quadrant
of the web browser. The plot will show by default, but the user can click any
@@ -160,7 +160,7 @@ recommended that the user click through at least the plot and xml windows
and save this output.
METviewer Plot Formatting Specifications
-----------------------------------------
+========================================
METviewer plot formatting options appear in the tabbed boxes at the bottom
right quadrant of the web browser. The “Titles & Labels” tab will show by
@@ -193,7 +193,7 @@ reset all options to the defaults.
METviewer Series Formatting Specifications
-------------------------------------------
+==========================================
At the bottom of the METviewer window is the series formatting box. It allows
the user to control the minute details of each line on a plot, including
@@ -205,7 +205,7 @@ place (so subsequent plots are identical in format).
METviewer History Menu
-----------------------
+======================
Along the left of the METviewer GUI, hidden by default, is the history menu.
To open this menu, click the arrow at the top left side right underneath
@@ -215,8 +215,8 @@ from this menu to recover plots they may have neglected to save. Clicking
on the button showing loads the plot.
-Future development plans
-------------------------
+Future Development Plans
+========================
METviewer is an evolving verification database and display software package.
New capabilities are planned in controlled, successive version releases. Bug
@@ -226,8 +226,8 @@ releases of METviewer. Additionally, updates to accommodate new features of
the MET software are often required.
-Code support
-------------
+Code Support
+============
METviewer support is provided through the
`METplus GitHub Discussions Forum `_.
diff --git a/docs/Users_Guide/perfdiag.rst b/docs/Users_Guide/perfdiag.rst
index 7fae76d7..055547ec 100644
--- a/docs/Users_Guide/perfdiag.rst
+++ b/docs/Users_Guide/perfdiag.rst
@@ -1,8 +1,9 @@
+********************
Performance Diagrams
-====================
+********************
Description
------------
+===========
Performance diagrams are used to show the relationship between categorical
statistics, with axes representing detection and success (1 - false alarm)
@@ -23,7 +24,8 @@ to the right side. CSI amounts are listed to the right side of the plot,
with better values falling closer to the top.
Line Type
----------
+=========
+
Performance requires categorical statistics generated by either Point-Stat
or Grid-Stat. These are:
@@ -32,7 +34,7 @@ or Grid-Stat. These are:
* CTS
How-To
--------
+======
Selection of options to produce the reliability diagram proceeds
approximately counter-clockwise around the METviewer window.
@@ -84,7 +86,7 @@ approximately counter-clockwise around the METviewer window.
There are many other options for plots, but these are the basics.
Example
---------
+=======
The reliability diagram shown below is for 3 hour accumulated
precipitation over the CONUS for 8 ensemble members at the 18 hour
diff --git a/docs/Users_Guide/references.rst b/docs/Users_Guide/references.rst
index c42baaf8..1eb12194 100644
--- a/docs/Users_Guide/references.rst
+++ b/docs/Users_Guide/references.rst
@@ -1,5 +1,6 @@
+**********
References
-==========
+**********
.. _Hoaglin:
diff --git a/docs/Users_Guide/release-notes.rst b/docs/Users_Guide/release-notes.rst
index a2b44c47..0e1615ed 100644
--- a/docs/Users_Guide/release-notes.rst
+++ b/docs/Users_Guide/release-notes.rst
@@ -9,6 +9,24 @@ When applicable, release notes are followed by the GitHub issue number which
describes the bugfix, enhancement, or new feature:
https://github.com/dtcenter/METviewer/issues
+Version `v6.0.0-beta2 `_ release notes (20231116)
+----------------------------------------------------------------------------------------
+
+ .. dropdown:: New Features
+
+ * New feature to specify the color of the no resolution and no skill lines for the reliability diagram (`#465 `_)
+ * Hide/show the legend entries line by line (`#501 `_)
+
+ .. dropdown:: Enhancements
+ * Reorganise results tabs in METviewer UI (`#387 `_)
+
+ .. dropdown:: Bugfixes
+ * Fixed loading Reliability plot XML with EE to UI (`#494 `_)
+ * Fixed printing error messages to the Log tab (`#495 `_)
+
+ .. dropdown:: Internal
+
+
Version `v6.0.0-beta1 `_ release notes (20230918)
----------------------------------------------------------------------------------------
diff --git a/docs/Users_Guide/reliabilityplots.rst b/docs/Users_Guide/reliabilityplots.rst
index f6ba23d6..cda0ff25 100644
--- a/docs/Users_Guide/reliabilityplots.rst
+++ b/docs/Users_Guide/reliabilityplots.rst
@@ -1,8 +1,10 @@
+
+*****************
Reliability Plots
-=================
+*****************
Description
------------
+===========
Reliability (or attributes) diagrams are used to show the conditional bias
of probabilistic forecasts. If a probability forecast is reliable, then
@@ -26,13 +28,14 @@ Reliability diagrams can be used to make adjustments to the conditional
bias of the forecast probabilities.
Line Type
----------
+=========
+
Reliability diagrams require the probability statistics (PCT line type)
generated by either Point-Stat or Grid-Stat.
How-To
--------
+======
Selection of options to produce the reliability diagram proceeds
approximately counter-clockwise around the METviewer window.
@@ -101,7 +104,7 @@ There are many other options for plots, but these are the basics.
Example
---------
+=======
The reliability diagram shown below is for the probability of 24 hour
precipitation with accumulations greater than or equal to 12.7 cm occurring
diff --git a/docs/Users_Guide/rocplot.rst b/docs/Users_Guide/rocplot.rst
index 3e942f6c..004db4c7 100644
--- a/docs/Users_Guide/rocplot.rst
+++ b/docs/Users_Guide/rocplot.rst
@@ -1,8 +1,9 @@
+*********************************************
Receiver Operating Characteristic (ROC) Plots
-==============================================
+*********************************************
Description
------------
+===========
MET produces a hit rate (Probability of Detection; POD) and Probability of
False Detection (POFD) values for each user-specified threshold of a forecast
@@ -24,7 +25,8 @@ conditioned on the forecasts.
Line Type
----------
+=========
+
ROC requires probability statistics generated by either Point-Stat or
Grid-Stat. These line types are:
@@ -33,7 +35,7 @@ Grid-Stat. These line types are:
* CTC
How-To
--------
+======
Selection of options to produce the ROC plot proceeds approximately
counter-clockwise around the METviewer window.
@@ -100,7 +102,7 @@ There are many other options for plots, but these are the basics.
Example
---------
+=======
The plot shown below is for two different probability of precipitation
forecasts. The dashed diagonal line represents the no-skill line. Ideal
diff --git a/docs/Users_Guide/scorecard.rst b/docs/Users_Guide/scorecard.rst
index 37413d85..708ef122 100644
--- a/docs/Users_Guide/scorecard.rst
+++ b/docs/Users_Guide/scorecard.rst
@@ -1,16 +1,17 @@
+**********
Scorecards
-==========
+**********
Description
------------
+===========
A scorecard is a graphical representation of significance and performance
of a comparison, normally a comparison between two models. The scorecard
can only be produced using xml code. The xml code specifications are
listed in the detail below. There is no GUI interface.
-EMC vs. NCAR method of determining p-values for Aggregation statistics
-----------------------------------------------------------------------
+EMC vs. NCAR Method of Determining p-values for Aggregation Statistics
+======================================================================
In statistics, the p-value represents the probability of a statistic having a value at least as
extreme as observed, in this case a difference between two
@@ -42,7 +43,8 @@ compared to a resampled distribution rather than a known,
theoretical distribution.
Line Type
----------
+=========
+
Scorecards can be run with either summary or aggregation logic. Aggregation
logic is the default and generally, the better choice. The following are
line types scorecards support:
@@ -70,7 +72,7 @@ line types scorecards support:
* RPS
How-To
--------
+======
The scorecard module is used to generate a scorecard PNG and HTML images
using data in the METviewer database. The usage statement:
@@ -316,7 +318,7 @@ system folders.
image. Default value: Verification Scorecard
Example
--------
+=======
The image below shows the output of scorecard_example.xml.
diff --git a/docs/Users_Guide/seriesplots.rst b/docs/Users_Guide/seriesplots.rst
index cefc74b2..c045928e 100644
--- a/docs/Users_Guide/seriesplots.rst
+++ b/docs/Users_Guide/seriesplots.rst
@@ -1,8 +1,9 @@
+************
Series Plots
-============
+************
Description
------------
+===========
The series plot is the most general of all the METviewer plotting options.
A series plot is really just a special case of a scatter plot, where the
@@ -15,7 +16,7 @@ lead times or thresholds (on the X-axis). The tremendous flexibility of
this plot means that the user must specify many options.
How-To
--------
+======
Selection of options to produce the plot proceeds approximately
counter-clockwise around the METviewer window. The steps to create a
@@ -93,7 +94,7 @@ There are many other options for plots, but these are the basics.
Example
---------
+=======
The image below shows an example of the plot and set-up options for a
series plot in METviewer. This example uses the database
diff --git a/docs/Users_Guide/spreadskillplot.rst b/docs/Users_Guide/spreadskillplot.rst
index 2ef6ad66..d4308029 100644
--- a/docs/Users_Guide/spreadskillplot.rst
+++ b/docs/Users_Guide/spreadskillplot.rst
@@ -1,8 +1,9 @@
+**********************
Spread vs. Skill Plots
-=======================
+**********************
Description
------------
+===========
Spread vs. Skill plots are widely used to evaluate the quality of ensemble
forecasting systems. One goal of ensemble forecasting is to have the
@@ -17,7 +18,7 @@ ratio is 1.
How-To
--------
+======
Selection of options to produce the spread vs. skill plot proceeds
approximately counter-clockwise around the METviewer window.
@@ -89,7 +90,7 @@ approximately counter-clockwise around the METviewer window.
There are many other options for plots, but these are the basics.
Example
---------
+=======
This example shows the 2-m temperature RMSE and spread for a series of
forecast lead times for an ensemble. Plotted are the spread and the skill.
diff --git a/docs/Users_Guide/taylordiag.rst b/docs/Users_Guide/taylordiag.rst
index 9b1d4e67..b3ff159f 100644
--- a/docs/Users_Guide/taylordiag.rst
+++ b/docs/Users_Guide/taylordiag.rst
@@ -1,8 +1,9 @@
+***************
Taylor Diagrams
-===============
+***************
Description
------------
+===========
Taylor diagrams are used to show a relationship between continuous
statistics (:ref:`Taylor, 2001`). This type of plot is used to
@@ -32,12 +33,13 @@ So, better forecasts lie closer on the Taylor diagram to observation
point, while worse forecasts lie further away.
Line Type
----------
+=========
+
Taylor requires continuous statistics, SL1L2, generated by either
Point-Stat or Grid-Stat.
How-To
--------
+======
Selection of options to produce the Taylor diagram proceeds
approximately counter-clockwise around the METviewer window.
@@ -90,7 +92,7 @@ There are many other options for plots, but these are the basics.
Example
--------
+=======
The example Taylor diagram below shows the downward longwave radiation
flux (DLWRF) correlation and standard deviation for one model and seven
diff --git a/docs/Users_Guide/web_service.rst b/docs/Users_Guide/web_service.rst
index 1b269694..4d2e8d5b 100644
--- a/docs/Users_Guide/web_service.rst
+++ b/docs/Users_Guide/web_service.rst
@@ -1,5 +1,6 @@
+*********************
METviewer Web Service
-=====================
+*********************
The METviewer web service is a web-server driven API that parses XML
requests and returns results in an XML structure. All calls are
@@ -33,13 +34,13 @@ loose ordering:
#. Plot request for user selected database and plot information
API Request/Response Formats
-----------------------------
+============================
The following sections each describe a web service API function in terms
of the request/response XML structure.
List Databases
-~~~~~~~~~~~~~~
+--------------
List the METviewer databases that are available on the system for access
through the web app. The returned list reflects the contents of the
@@ -64,7 +65,7 @@ Response:
List Values
-~~~~~~~~~~~
+-----------
The list_val request is used to conditionally list the distinct values in
the stat_header table of the selected database. The stat_field element
@@ -148,7 +149,7 @@ vice versa.
List Statistics
-~~~~~~~~~~~~~~~
+---------------
The list_stat request builds a list of all statistics available in the
METviewer database for the specified fcst_var. It is primarily used to
@@ -182,7 +183,7 @@ criteria is not supported in list_stat requests.
Generate Plot
-~~~~~~~~~~~~~
+-------------
Once a user has provided all the information for a complete plot
specification, the plot request handles the parsing of the plot
@@ -210,9 +211,10 @@ element.
NAs produced by integer overflow
-Open app with predefine database
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Use this url to open METviewer main page with predefine database:
+Open App with Predefined Database
+---------------------------------
+
+Use this url to open METviewer main page with predefined database:
http://www.dtcenter.org/met/metviewer/metviewer1.jsp?db=name_of_database
diff --git a/docs/conf.py b/docs/conf.py
index a198e896..f852d30b 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -42,7 +42,7 @@
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', 'Contributors_Guide']
+exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
# Suppress certain warning messages
suppress_warnings = ['ref.citation']
diff --git a/docs/index.rst b/docs/index.rst
index f4333c92..a2a4def7 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -1,12 +1,14 @@
===========================
METviewer version |version|
===========================
+
Developed by the `Developmental Testbed Center `_, Boulder, CO
.. image:: _static/METplus_banner_photo_web.png
History
-------
+
The Model Evaluation Tools (MET) were developed by the Developmental
Testbed Center (DTC) and released in January 2008. The goal of the tools
was to provide the community with a platform independent and extensible
@@ -36,6 +38,7 @@ contributions.
METplus Concept
---------------
+
METplus is the overarching, or umbrella, repository and hence framework for
the Unified Forecast System verification capability. It is intended to be
extensible through adding additional capability developed by the community.
@@ -112,12 +115,9 @@ To cite this documentation in publications, please refer to the METviewer User's
:caption: METviewer
Users_Guide/index
+ Contributors_Guide/index
Index
=====
* :ref:`genindex`
-
-
-
-
diff --git a/docs/version b/docs/version
index 9d9136f3..23df389a 100644
--- a/docs/version
+++ b/docs/version
@@ -1 +1 @@
-6.0.0-beta2-dev
+6.0.0-beta3-dev
diff --git a/java/edu/ucar/metviewer/MVPlotJob.java b/java/edu/ucar/metviewer/MVPlotJob.java
index ff3b9745..493bbecd 100644
--- a/java/edu/ucar/metviewer/MVPlotJob.java
+++ b/java/edu/ucar/metviewer/MVPlotJob.java
@@ -195,6 +195,7 @@ public class MVPlotJob {
protected String _strLty = "";
protected String _strLwd = "";
protected String _strConSeries = "";
+ protected String showLegend = null;
protected String _strLegend = "";
protected String _strY1Lim = "";
protected String _strX1Lim = "";
@@ -232,6 +233,9 @@ public class MVPlotJob {
protected List lines = new ArrayList<>();
+ protected String referenceLineCol = "#FF0000";
+ protected String noskillLineCol = "#FF0000";
+
/**
* Deep copy of the MVPlotJob, useful for inheritance.
@@ -350,6 +354,8 @@ public MVPlotJob copy() {
job._strLegendNcol = _strLegendNcol;
job._strCaptionWeight = _strCaptionWeight;
job._strCaptionCol = _strCaptionCol;
+ job.referenceLineCol = referenceLineCol;
+ job.noskillLineCol = noskillLineCol;
job._strCaptionSize = _strCaptionSize;
job._strCaptionOffset = _strCaptionOffset;
job._strCaptionAlign = _strCaptionAlign;
@@ -409,6 +415,7 @@ public MVPlotJob copy() {
job._strLty = _strLty;
job._strLwd = _strLwd;
job._strConSeries = _strConSeries;
+ job.showLegend = showLegend;
job._strLegend = _strLegend;
job._strY1Lim = _strY1Lim;
job._strX1Lim = _strX1Lim;
@@ -1814,6 +1821,14 @@ public void setConSeries(String conSeries) {
_strConSeries = conSeries;
}
+ public String getShowLegend() {
+ return showLegend;
+ }
+
+ public void setShowLegend(String showLegend) {
+ this.showLegend = showLegend;
+ }
+
public String getLegend() {
return _strLegend;
}
@@ -2378,5 +2393,21 @@ public String getLineType() {
}
return "N/A";
}
+
+ public String getReferenceLineCol() {
+ return referenceLineCol;
+ }
+
+ public void setReferenceLineCol(String referenceLineCol) {
+ this.referenceLineCol = referenceLineCol;
+ }
+
+ public String getNoskillLineCol() {
+ return noskillLineCol;
+ }
+
+ public void setNoskillLineCol(String noskillLineCol) {
+ this.noskillLineCol = noskillLineCol;
+ }
}
diff --git a/java/edu/ucar/metviewer/MVPlotJobParser.java b/java/edu/ucar/metviewer/MVPlotJobParser.java
index a6a68f6f..e5f6e2a5 100644
--- a/java/edu/ucar/metviewer/MVPlotJobParser.java
+++ b/java/edu/ucar/metviewer/MVPlotJobParser.java
@@ -192,6 +192,10 @@ public final class MVPlotJobParser {
MVPlotJob.class.getDeclaredMethod("setCaptionWeight", String.class));
formatToStrValues
.put("caption_col", MVPlotJob.class.getDeclaredMethod("setCaptionCol", String.class));
+ formatToStrValues
+ .put("reference_line_col", MVPlotJob.class.getDeclaredMethod("setReferenceLineCol", String.class));
+ formatToStrValues
+ .put("noskill_line_col", MVPlotJob.class.getDeclaredMethod("setNoskillLineCol", String.class));
formatToStrValues
.put("caption_size", MVPlotJob.class.getDeclaredMethod("setCaptionSize", String.class));
formatToStrValues.put("caption_offset",
@@ -238,6 +242,8 @@ public final class MVPlotJobParser {
formatToStrValues.put("lwd", MVPlotJob.class.getDeclaredMethod("setLwd", String.class));
formatToStrValues
.put("con_series", MVPlotJob.class.getDeclaredMethod("setConSeries", String.class));
+ formatToStrValues
+ .put("show_legend", MVPlotJob.class.getDeclaredMethod("setShowLegend", String.class));
formatToStrValues
.put("legend", MVPlotJob.class.getDeclaredMethod("setLegend", String.class));
formatToStrValues.put("y1_lim", MVPlotJob.class.getDeclaredMethod("setY1Lim", String.class));
@@ -895,10 +901,10 @@ public static StringBuilder serializeJob(MVPlotJob job, DatabaseInfo databaseInf
xmlStr.append("").append(job.getRelyEventHist()).append("");
xmlStr.append("").append(job.getAddSkillLine()).append("");
xmlStr.append("").append(job.getAddNoSkillLine()).append("");
- xmlStr.append("").append(job.getAddReferenceLine())
- .append("");
- xmlStr.append("").append(job.getAddPointThresholds())
- .append("");
+ xmlStr.append("").append(job.getNoskillLineCol()).append("");
+ xmlStr.append("").append(job.getAddReferenceLine()).append("");
+ xmlStr.append("").append(job.getReferenceLineCol()).append("");
+ xmlStr.append("").append(job.getAddPointThresholds()).append("");
xmlStr.append("").append(job.getReverseConnectionOrder())
.append("");
xmlStr.append("").append(job.getCreateHtml())
@@ -1039,6 +1045,7 @@ public static StringBuilder serializeJob(MVPlotJob job, DatabaseInfo databaseInf
"" + job.getLty() + "" +
"" + job.getLwd() + "" +
"" + job.getConSeries() + "" +
+ "" + job.getShowLegend() + "" +
"" +
"" + job.getY1Lim() + "" +
@@ -1919,7 +1926,11 @@ else if (node.tag.equals("roc_calc")) {
} else if (node.tag.equals("add_noskill_line")) {
job.setAddNoSkillLine(node.value.equalsIgnoreCase("true"));
} else if (node.tag.equals("add_reference_line")) {
- job.setAddReferenceLine(node.value.equalsIgnoreCase("true"));
+ job.setAddReferenceLine(node.value.equalsIgnoreCase("true"));}
+ else if (node.tag.equals("reference_line_col")) {
+ job.setReferenceLineCol(node.value);}
+ else if (node.tag.equals("noskill_line_col")) {
+ job.setNoskillLineCol(node.value);
} else if (node.tag.equals("create_html")) {
job.setCreateHtml(node.value.equalsIgnoreCase("true"));
}
diff --git a/java/edu/ucar/metviewer/jobManager/JobManager.java b/java/edu/ucar/metviewer/jobManager/JobManager.java
index 2b77200e..65797586 100644
--- a/java/edu/ucar/metviewer/jobManager/JobManager.java
+++ b/java/edu/ucar/metviewer/jobManager/JobManager.java
@@ -122,6 +122,14 @@ protected void validateNumDepSeries(MVPlotJob job, int intNumDepSeries) throws V
throw new ValidationException("length of con_series differs from number of series ("
+ intNumDepSeries + ")");
}
+ if (job.getShowLegend() == null){
+ throw new ValidationException("ERROR: show_legend parameter is not provided.");
+ }else {
+ if (intNumDepSeries != MVUtil.parseRCol(job.getShowLegend()).length) {
+ throw new ValidationException("length of show_legend differs from number of series ("
+ + intNumDepSeries + ")");
+ }
+ }
}
protected int getNumDepSeries(int intNumDep1Series, int intNumDep2Series, MVPlotJob job) {
@@ -295,6 +303,10 @@ protected Map createInfoMap(MVPlotJob job, int intNumDepSeries)
MVUtil.rep(1, intNumDepSeries)) : job.getLwd());
info.put("con_series", job.getConSeries().isEmpty() ? MVUtil.printRCol(
MVUtil.rep(0, intNumDepSeries)) : job.getConSeries());
+
+ if(job.getShowLegend() != null){
+ info.put("show_legend",MVUtil.printRCol(MVUtil.rep(0, intNumDepSeries)));
+ }
info.put("legend", job.getLegend().isEmpty() ? "c()" : job.getLegend());
info.put("y1_lim", job.getY1Lim().isEmpty() ? "c()" : job.getY1Lim());
info.put("x1_lim", job.getX1Lim().isEmpty() ? "c()" : job.getX1LimR());
@@ -629,6 +641,7 @@ protected Map addPlotConfigs(Map yamlInfo, MVPlo
info.put("show_signif", rListToList(job.getShowSignif()));
info.put("con_series", rListToListNumeric(job.getConSeries()));
+ info.put("show_legend", rListToListNumeric(job.getShowLegend()));
info.put("plot_ci", rListToList(job.getPlotCI()));
diff --git a/java/edu/ucar/metviewer/jobManager/RelyJobManager.java b/java/edu/ucar/metviewer/jobManager/RelyJobManager.java
index 0e3b6fd6..abd00643 100644
--- a/java/edu/ucar/metviewer/jobManager/RelyJobManager.java
+++ b/java/edu/ucar/metviewer/jobManager/RelyJobManager.java
@@ -152,6 +152,8 @@ protected void run(MVPlotJob job) throws ParseException, ValidationException, IO
yamlInfo.put("add_reference_line", job.getAddReferenceLine() ? "True" : "False");
yamlInfo.put("rely_event_hist", job.getRelyEventHist().equals("TRUE") ? "True" : "False");
yamlInfo.put("inset_hist", job.getInsetHist() ? "True" : "False");
+ yamlInfo.put("reference_line_col", job.getReferenceLineCol());
+ yamlInfo.put("noskill_line_col", job.getNoskillLineCol());
rscriptStatManager.prepareDataFileAndRscript(job, plotFixPerm, yamlInfo, new ArrayList<>());
job.setPlotTmpl(this.getPythonScript());
diff --git a/webapp/metviewer/js/metviewer_common.js b/webapp/metviewer/js/metviewer_common.js
index 2c428a24..93d10117 100644
--- a/webapp/metviewer/js/metviewer_common.js
+++ b/webapp/metviewer/js/metviewer_common.js
@@ -658,6 +658,7 @@ var firstSeriesFormatting = {
lwd: "1",
show_signif: "No",
con_series: "1",
+ show_legend: "1",
legend: "",
id: "1"
};
@@ -2514,6 +2515,7 @@ function updateSeriesHist() {
var plot_ci = [];
var plot_disp = [];
var show_signif = [];
+ var show_legend = [];
var colors = [];
var pch = [];
var lty = [];
@@ -2567,6 +2569,7 @@ function updateSeriesHist() {
lty = initXML.find("plot").find("lty").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
lwd = initXML.find("plot").find("lwd").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
con_series = initXML.find("plot").find("con_series").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
+ show_legend = initXML.find("plot").find("show_legend").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
order_series = initXML.find("plot").find("order_series").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
type = initXML.find("plot").find("type").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
legend = initXML.find("plot").find("legend").text().replace("c(", "").replace(/\)$/, "").replace(/"/g, "").split(",");
@@ -2616,6 +2619,7 @@ function updateSeriesHist() {
series_formatting.lty = oldSeriesData[i]['lty'];
series_formatting.lwd = oldSeriesData[i]['lwd'];
series_formatting.con_series = oldSeriesData[i]['con_series'];
+ series_formatting.show_legend = oldSeriesData[i]['show_legend'];
series_formatting.legend = oldSeriesData[i]['legend'];
series_formatting.id = number_series + 1;
isSeriesOld = true;
@@ -2649,6 +2653,7 @@ function updateSeriesHist() {
series_formatting.lty = lty[number_series].trim();
series_formatting.lwd = lwd[number_series].trim();
series_formatting.con_series = con_series[number_series].trim();
+ series_formatting.show_legend = show_legend[number_series].trim();
series_formatting.legend = legend[number_series].trim();
series_formatting.color = colors[number_series].trim();
series_formatting.id = number_series + 1;
@@ -2852,6 +2857,7 @@ function updateSeriesEns() {
var lty = [];
var lwd = [];
var con_series = [];
+ var show_legend = [];
var order_series = [];
var legend = [];
var type = [];
@@ -2881,6 +2887,7 @@ function updateSeriesEns() {
lty = initXML.find("plot").find("lty").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
lwd = initXML.find("plot").find("lwd").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
con_series = initXML.find("plot").find("con_series").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
+ show_legend = initXML.find("plot").find("show_legend").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
order_series = initXML.find("plot").find("order_series").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
type = initXML.find("plot").find("type").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
legend = initXML.find("plot").find("legend").text().replace("c(", "").replace(/\)$/, "").replace(/"/g, "").split(",");
@@ -2936,6 +2943,7 @@ function updateSeriesEns() {
series_formatting.lty = oldSeriesData[i]['lty'];
series_formatting.lwd = oldSeriesData[i]['lwd'];
series_formatting.con_series = oldSeriesData[i]['con_series'];
+ series_formatting.show_legend = oldSeriesData[i]['show_legend'];
series_formatting.legend = oldSeriesData[i]['legend'];
series_formatting.id = number_series + 1;
isSeriesOld = true;
@@ -2969,6 +2977,7 @@ function updateSeriesEns() {
series_formatting.lty = lty[number_series].trim();
series_formatting.lwd = lwd[number_series].trim();
series_formatting.con_series = con_series[number_series].trim();
+ series_formatting.show_legend = show_legend[number_series].trim();
series_formatting.legend = legend[number_series].trim();
series_formatting.color = colors[number_series].trim();
series_formatting.id = number_series + 1;
@@ -3040,6 +3049,7 @@ function updateSeriesPerf() {
var lty = [];
var lwd = [];
var con_series = [];
+ var show_legend = [];
var order_series = [];
var legend = [];
var type = [];
@@ -3069,6 +3079,7 @@ function updateSeriesPerf() {
lty = initXML.find("plot").find("lty").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
lwd = initXML.find("plot").find("lwd").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
con_series = initXML.find("plot").find("con_series").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
+ show_legend = initXML.find("plot").find("show_legend").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
order_series = initXML.find("plot").find("order_series").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
type = initXML.find("plot").find("type").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
legend = initXML.find("plot").find("legend").text().replace("c(", "").replace(/\)$/, "").replace(/"/g, "").split(",");
@@ -3102,6 +3113,7 @@ function updateSeriesPerf() {
series_formatting.lty = oldSeriesData[i]['lty'];
series_formatting.lwd = oldSeriesData[i]['lwd'];
series_formatting.con_series = oldSeriesData[i]['con_series'];
+ series_formatting.show_legend = oldSeriesData[i]['show_legend'];
series_formatting.legend = oldSeriesData[i]['legend'];
series_formatting.id = number_series + 1;
isSeriesOld = true;
@@ -3135,6 +3147,7 @@ function updateSeriesPerf() {
series_formatting.lty = lty[number_series].trim();
series_formatting.lwd = lwd[number_series].trim();
series_formatting.con_series = con_series[number_series].trim();
+ series_formatting.show_legend = show_legend[number_series].trim();
series_formatting.legend = legend[number_series].trim();
series_formatting.color = colors[number_series].trim();
series_formatting.id = number_series + 1;
@@ -3180,7 +3193,12 @@ function updateSeries(isCheckAll) {
var series_formatting = {};
var isFixedFormatting = $("#seriesLock").is(':checked');
var newSeriesData = [];
- var selected_mode = $("#plot_data").multiselect("getChecked").val();
+ var selected_mode;
+ try {
+ selected_mode = $("#plot_data").multiselect("getChecked").val();
+ } catch (e) {
+ selected_mode = 'stat';
+ }
var y_axis;
var fcst_var_indexes;
var plot_ci = [];
@@ -3191,6 +3209,7 @@ function updateSeries(isCheckAll) {
var lty = [];
var lwd = [];
var con_series = [];
+ var show_legend = [];
var order_series = [];
var legend = [];
var type = [];
@@ -3220,6 +3239,7 @@ function updateSeries(isCheckAll) {
lty = initXML.find("plot").find("lty").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
lwd = initXML.find("plot").find("lwd").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
con_series = initXML.find("plot").find("con_series").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
+ show_legend = initXML.find("plot").find("show_legend").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
var order_series_el = initXML.find("plot").find("order_series").text();
if (order_series_el && order_series_el.length > 0) {
order_series = initXML.find("plot").find("order_series").text().replace("c(", "").replace(")", "").replace(/"/g, "").split(",");
@@ -3264,7 +3284,6 @@ function updateSeries(isCheckAll) {
}
}
}
-
series_perm = [];
series_perm[0] = '';
}
@@ -3314,6 +3333,7 @@ function updateSeries(isCheckAll) {
series_formatting.lty = oldSeriesData[i]['lty'];
series_formatting.lwd = oldSeriesData[i]['lwd'];
series_formatting.con_series = oldSeriesData[i]['con_series'];
+ series_formatting.show_legend = oldSeriesData[i]['show_legend'];
series_formatting.legend = oldSeriesData[i]['legend'];
series_formatting.id = number_series + 1;
isSeriesOld = true;
@@ -3343,6 +3363,7 @@ function updateSeries(isCheckAll) {
series_formatting.lty = lty[number_series].trim();
series_formatting.lwd = lwd[number_series].trim();
series_formatting.con_series = con_series[number_series].trim();
+ series_formatting.show_legend = show_legend[number_series].trim();
series_formatting.legend = legend[number_series].trim();
series_formatting.color = colors[number_series].trim();
series_formatting.id = number_series + 1;
@@ -3415,6 +3436,7 @@ function updateSeries(isCheckAll) {
series_formatting.lty = lty[number_series].trim();
series_formatting.lwd = lwd[number_series].trim();
series_formatting.con_series = con_series[number_series].trim();
+ series_formatting.show_legend = show_legend[number_series].trim();
series_formatting.legend = legend[number_series].trim();
series_formatting.color = colors[number_series].trim();
series_formatting.id = number_series + 1;
@@ -3476,6 +3498,7 @@ function updateSeries(isCheckAll) {
series_formatting.lty = lty[number_series].trim();
series_formatting.lwd = lwd[number_series].trim();
series_formatting.con_series = con_series[number_series].trim();
+ series_formatting.show_legend = show_legend[number_series].trim();
series_formatting.legend = legend[number_series].trim();
series_formatting.color = colors[number_series].trim();
series_formatting.id = number_series + 1;
@@ -3978,6 +4001,19 @@ function createXMLRely(plot) {
agg_stat.append($('').text($('#eveq_dis').is(':checked')));
agg_stat.append($('').text($('#cl_step').val()));
plot.append(agg_stat);
+ var reference_line_col = $('#reference_line_col').val();
+ if (reference_line_col.startsWith("#")) {
+ plot.append($('').text(reference_line_col));
+ } else {
+ plot.append($('').text("#" + reference_line_col));
+ }
+ var noskill_line_col = $('#noskill_line_col').val();
+ if (noskill_line_col.startsWith("#")) {
+ plot.append($('').text(noskill_line_col));
+ } else {
+ plot.append($('').text("#" + noskill_line_col));
+ }
+
plot = createXMLCommon(plot);
return plot;
}
@@ -4120,8 +4156,12 @@ function createXMLSeries(plot) {
} catch (err) {
console.log("Can't save row " + lastSelRow);
}
- var selected_mode = $("#plot_data").multiselect("getChecked").val();
-
+ var selected_mode;
+ try {
+ selected_mode = $("#plot_data").multiselect("getChecked").val();
+ } catch (e) {
+ selected_mode = 'stat';
+ }
var dep = $('');
dep.append(createDepElementForAxis(1, fcst_var_y1_indexes, selected_mode));
@@ -4375,7 +4415,7 @@ function createXMLCommon(plot) {
var allSeries = sortSeries();
- var ciArr = [], dispArr = [], colorsArr = [], pchArr = [], typeArr = [], ltyArr = [], lwdArr = [], conArr = [],
+ var ciArr = [], dispArr = [], colorsArr = [], pchArr = [], typeArr = [], ltyArr = [], lwdArr = [], conArr = [], showLegendArr=[],
orderArr = [], legendArr = [], showSignArr = [], linesArr = [];
for (var i = 0; i < allSeries.length; i++) {
if (allSeries[i].order !== '') {
@@ -4397,6 +4437,7 @@ function createXMLCommon(plot) {
ltyArr.push(allSeries[i].lty);
lwdArr.push(allSeries[i].lwd);
conArr.push(allSeries[i].con_series);
+ showLegendArr.push(allSeries[i].show_legend);
orderArr.push(allSeries[i].order);
legendArr.push('"' + allSeries[i].legend + '"');
} else {
@@ -4427,6 +4468,7 @@ function createXMLCommon(plot) {
plot.append($('').text("c(" + ltyArr.join() + ")"));
plot.append($('').text("c(" + lwdArr.join() + ")"));
plot.append($('').text("c(" + conArr.join() + ")"));
+ plot.append($('').text("c(" + showLegendArr.join() + ")"));
plot.append($('').text("c(" + orderArr.join() + ")"));
plot.append($('').text($('#plot_cmd').val()));
plot.append($('').text("c(" + legendArr.join() + ")"));
@@ -6366,6 +6408,21 @@ function loadXMLRely() {
$('#add_reference_line').prop('checked', false);
}
}
+ if (initXML.find("plot").find("reference_line_col")) {
+ var reference_line_col = $(initXML.find("plot").find("reference_line_col")).text();
+ if (reference_line_col.length > 7) {
+ reference_line_col = reference_line_col.substring(0, 7);
+ }
+ $('#reference_line_col').colorpicker('setColor', reference_line_col);
+ }
+ if (initXML.find("plot").find("noskill_line_col")) {
+ var noskill_line_col = $(initXML.find("plot").find("noskill_line_col")).text();
+ if (noskill_line_col.length > 7) {
+ noskill_line_col = noskill_line_col.substring(0, 7);
+ }
+ $('#noskill_line_col').colorpicker('setColor', noskill_line_col);
+ }
+
loadXMLStatistics();
$("#event_equal").prop('checked', $(initXML.find("plot").find("event_equal")).text() == "true").trigger("change");
@@ -7474,7 +7531,7 @@ function initPage() {
datatype: "local",
autowidth: true,
shrinkToFit: true,
- colNames: ['ID', '#', 'Y axis', 'Hide', 'Title', 'Conf Interval', 'Line Color', 'Point Symbol', 'Series Line Type', 'Line Type', 'Line Width', 'Show Significant', 'Connect Across NA', 'Legend Text'],
+ colNames: ['ID', '#', 'Y axis', 'Hide', 'Title', 'Conf Interval', 'Line Color', 'Point Symbol', 'Series Line Type', 'Line Type', 'Line Width', 'Show Significant', 'Connect Across NA', 'Show Legend', 'Legend Text'],
colModel: [
{name: 'id', index: 'id', hidden: true},
{name: 'order', width: 10, index: 'order', sortable: false},
@@ -7571,6 +7628,17 @@ function initPage() {
width: 30,
align: "center"
},
+ {
+ name: 'show_legend',
+ index: 'show_legend',
+ width: 30,
+ align: "center",
+ editable: true,
+ edittype: "select",
+ formatter: 'select',
+ editoptions: {value: "0:No;1:Yes"},
+ sortable: false,
+ },
{
name: 'legend',
index: 'legend',
@@ -8137,6 +8205,8 @@ function initPage() {
});
$('#caption_col').colorpicker('setColor', '#333333');
+
+
$("#error_message").dialog({
modal: true,
autoOpen: false,
diff --git a/webapp/metviewer/js/metviewer_common.min.js b/webapp/metviewer/js/metviewer_common.min.js
index a59cd767..7035fe6b 100644
--- a/webapp/metviewer/js/metviewer_common.min.js
+++ b/webapp/metviewer/js/metviewer_common.min.js
@@ -28,7 +28,7 @@ init_hour:"INIT_HOUR",fcst_rad:"FCST_RAD",vx_mask:"VX_MASK"},indy_var_value_to_t
valid_hour:"VALID_HOUR",fcst_init_beg:"FCST_INIT_BEG",init_hour:"INIT_HOUR",fcst_lev:"FCST_LEV",obtype:"OBTYPE",vx_mask:"VX_MASK",interp_mthd:"INTERP_MTHD",interp_pnts:"INTERP_PNTS",fcst_thresh:"FCST_THRESH",obs_thresh:"OBS_THRESH",n_bin:"N_BIN",cov_thresh:"COV_THRESH"},rhist_fixed_var_map={fcst_var:"FCST_VAR",model:"MODEL",fcst_lead:"FCST_LEAD",fcst_valid_beg:"FCST_VALID_BEG",valid_hour:"VALID_HOUR",fcst_init_beg:"FCST_INIT_BEG",init_hour:"INIT_HOUR",fcst_lev:"FCST_LEV",obtype:"OBTYPE",vx_mask:"VX_MASK",
interp_mthd:"INTERP_MTHD",interp_pnts:"INTERP_PNTS",fcst_thresh:"FCST_THRESH",obs_thresh:"OBS_THRESH",n_rank:"N_RANK",cov_thresh:"COV_THRESH"},relp_fixed_var_map={fcst_var:"FCST_VAR",model:"MODEL",fcst_lead:"FCST_LEAD",fcst_valid_beg:"FCST_VALID_BEG",valid_hour:"VALID_HOUR",fcst_init_beg:"FCST_INIT_BEG",init_hour:"INIT_HOUR",fcst_lev:"FCST_LEV",obtype:"OBTYPE",vx_mask:"VX_MASK",interp_mthd:"INTERP_MTHD",interp_pnts:"INTERP_PNTS",fcst_thresh:"FCST_THRESH",obs_thresh:"OBS_THRESH",n_ens:"N_ENS",cov_thresh:"COV_THRESH"},
perf_fixed_var_map={fcst_var:"FCST_VAR",model:"MODEL",fcst_lead:"FCST_LEAD",fcst_valid_beg:"FCST_VALID_BEG",valid_hour:"VALID_HOUR",fcst_init_beg:"FCST_INIT_BEG",init_hour:"INIT_HOUR",fcst_lev:"FCST_LEV",obtype:"OBTYPE",vx_mask:"VX_MASK",interp_mthd:"INTERP_MTHD",interp_pnts:"INTERP_PNTS",fcst_thresh:"FCST_THRESH",obs_thresh:"OBS_THRESH",cov_thresh:"COV_THRESH"},fcst_var_y1_indexes=[1],series_var_y1_indexes=[1],fcst_var_y2_indexes=[],series_var_y2_indexes=[],fixed_var_indexes=[],date_period_indexes=
-[1],firstSeriesFormatting={order:"1",hide:"No",plot_ci:"none",color:"",pch:20,type:"b",lty:"1",lwd:"1",show_signif:"No",con_series:"1",legend:"",id:"1"},seriesDiffY1=[],seriesDiffY2=[],previousIndVarValResponse,fixVarValResponse={},seriesY1VarValResponse={},seriesY2VarValResponse={},xml='',group_name_to_value_map,indy_var_vals_to_attr,fcst_vars=[],fcst_vars_stats=[],lines=[];
+[1],firstSeriesFormatting={order:"1",hide:"No",plot_ci:"none",color:"",pch:20,type:"b",lty:"1",lwd:"1",show_signif:"No",con_series:"1",show_legend:"1",legend:"",id:"1"},seriesDiffY1=[],seriesDiffY2=[],previousIndVarValResponse,fixVarValResponse={},seriesY1VarValResponse={},seriesY2VarValResponse={},xml='',group_name_to_value_map,indy_var_vals_to_attr,fcst_vars=[],fcst_vars_stats=[],lines=[];
function cleanUp(){fcst_var_y1_indexes=[1];series_var_y1_indexes=[1];fcst_var_y2_indexes=[];series_var_y2_indexes=[];fixed_var_indexes=[];date_period_indexes=[1];seriesDiffY1=[];seriesDiffY2=[];previousIndVarValResponse=null;fixVarValResponse={};seriesY1VarValResponse={};seriesY2VarValResponse={};group_name_to_value_map=null;fcst_vars=[];fcst_vars_stats=[];lines=[]}
function isModeStat(a){if(0<=$.inArray(a,listStatModeRatio))return!0;a=a.split("_");return 2==a.length?0<=$.inArray(a[0],listStatMode)||"ACOVACOV"==a[0]?!0:!1:!1}function isMtdStat(a){if(0<=$.inArray(a,listStatMtdRatio))return!0;a=a.split("_");for(var b="",d=0;d'+a+"FCST_VAR",error:function(a,b,c){},success:function(a){a=$(a).find("val");for(var b=0;b",">").replace("<",
"<"));$.ajax({async:!1,url:"servlet",type:"POST",dataType:"xml",contentType:"application/xml",data:''+g+""+k+"",error:function(){},success:function(a){var b=$(a).find("val");a=[];if(0",{value:h,text:h,
-title:value_to_desc_map[g.text()],selected:f});a.push(f)}else 0!=c&&g.text()===$(b[c-1]).text()&&a[a.length-1].text(a[a.length-1].text()+"*")}f=$("input[name='multiselect_database']:checked").length-1;for(c=0;c",{value:"N/A",text:"N/A"}),f.appendTo(e);try{e.multiselect("refresh")}catch(v){}d=
+title:value_to_desc_map[g.text()],selected:f});a.push(f)}else 0!=c&&g.text()===$(b[c-1]).text()&&a[a.length-1].text(a[a.length-1].text()+"*")}f=$("input[name='multiselect_database']:checked").length-1;for(c=0;c",{value:"N/A",text:"N/A"}),f.appendTo(e);try{e.multiselect("refresh")}catch(z){}d=
[]}})}var h=$("#series_var_"+a+"_"+b);h.empty();$.each(series_var_value_to_title_stat_map,function(a,b){h.append('")});try{h.multiselect("refresh")}catch(p){}}}
function updateSeriesVarValEns(a,b){$("#listdt").jqGrid("clearGridData");var d=$("#series_var_val_y1_"+a);d.empty();var e=getSelectedDatabases();if(e){try{var c=$("#series_var_y1_"+a).multiselect("getChecked").val()}catch(f){c=$("#series_var_y1_"+a+" option:first-child").val()}$.ajax({async:!1,url:"servlet",type:"POST",contentType:"application/xml",dataType:"xml",processData:!1,data:''+e+""+c+'',
error:function(){},success:function(c){seriesY1VarValResponse[a]=c;var e=$(c).find("val");c=[];if(0",{value:h,text:h,selected:p}),c.push(p)):0!=f&&h.text()===$(e[f-1]).text()&&c[c.length-1].text(c[c.length-1].text()+"*")}p=$("input[name='multiselect_database']:checked").length-1;for(f=0;f'+e+"<"+f+"_field>"+c+""+f+'_field>NA',error:function(){},success:function(c){seriesY1VarValResponse[a]=c;var e=$(c).find("val");c=[];if(0").replace("<","<").replace("&","&")===b:0<=$.inArray(g.text().replace(">",">").replace("<","<").replace("&","&"),b);0===f||0!==f&&g.text()!==$(e[f-1]).text()?(m=$("",{value:g.text(),text:g.text(),selected:m}),c.push(m)):0!==f&&g.text()===$(e[f-1]).text()&&c[c.length-1].text(c[c.length-1].text()+"*")}m=$("input[name='multiselect_database']:checked").length-1;for(f=0;f",{value:"N/A",text:"N/A"});m.appendTo(d);try{d.multiselect("refresh")}catch(q){}}b=[]}})}}
function updateSeriesRely(){var a=$("#rely_event_hist").prop("checked"),b=$("#listdt");b.jqGrid("clearGridData");var d=jQuery.extend(!0,{},firstSeriesFormatting);d.title="Reliability Curve";d.y_axis="Y1";d.order=1;d.color="#333333";d.id=1;b.jqGrid("addRowData",1,d);"true"==a&&(d=jQuery.extend(!0,{},firstSeriesFormatting),d.title="Event Histogram",d.y_axis="Y1",d.order=2,d.color="#AAAAAA",d.id=2,d.type="h",d.lwd=50,b.jqGrid("addRowData",2,d))}
-function updateSeriesEns(){var a=$("#listdt");a.saveCell(lastSelRow,lastSelCol);var b=a.jqGrid("getRowData");a.jqGrid("clearGridData");var d,e=0,c={},f=$("#seriesLock").is(":checked"),g=[],k=[],h=[],p=[],m=[],q=[],t=[],u=[],x=[],v=[],z=[],A=[];if(null!=initXML){k=initXML.find("plot").find("plot_ci").text().replace("c(","").replace(")","").replace(/"/g,"").split(",");h=initXML.find("plot").find("plot_disp").text().replace("c(","").replace(")","").replace(/"/g,"").split(",");p=initXML.find("plot").find("show_signif").text().replace("c(",
+function updateSeriesEns(){var a=$("#listdt");a.saveCell(lastSelRow,lastSelCol);var b=a.jqGrid("getRowData");a.jqGrid("clearGridData");var d,e=0,c={},f=$("#seriesLock").is(":checked"),g=[],k=[],h=[],p=[],m=[],q=[],t=[],u=[],A=[],z=[],w=[],y=[],B=[];if(null!=initXML){k=initXML.find("plot").find("plot_ci").text().replace("c(","").replace(")","").replace(/"/g,"").split(",");h=initXML.find("plot").find("plot_disp").text().replace("c(","").replace(")","").replace(/"/g,"").split(",");p=initXML.find("plot").find("show_signif").text().replace("c(",
"").replace(")","").replace(/"/g,"").split(",");for(var n=0;n=r;r++){var y="y"+r;if(1==r){var B=fcst_var_y1_indexes;var w=permuteSeries(createSeriesMapForPermutation(series_var_y1_indexes,y),0)}else B=fcst_var_y2_indexes,w=permuteSeries(createSeriesMapForPermutation(series_var_y2_indexes,
-y),0);for(var G=0;Ga)return[];if(1==a)return["#FF0000"];for(var b=[],d=1/(a-1),e=0,c=0;c=r;r++){var x="y"+r;if(1==r){var C=fcst_var_y1_indexes;var v=
+permuteSeries(createSeriesMapForPermutation(series_var_y1_indexes,x),0)}else C=fcst_var_y2_indexes,v=permuteSeries(createSeriesMapForPermutation(series_var_y2_indexes,x),0);for(var H=0;Ha)return[];if(1==a)return["#FF0000"];for(var b=[],d=1/(a-1),e=0,c=0;ca)return"FF0000";if(1a.length;)a="0"+a;return a}
function permuteSeries(a,b){var d=Object.keys(a);if(1>d.length)return[];var e=a[d[b]];if(d.length==b+1)return e;a=permuteSeries(a,b+1);if(1>e.length)return a;b=[];for(d=0;d");b.a
currentTab&&(a.append($("").text($("#contour_intervals").val())),a.append($("").text($("#color_palette").val())),a.append($("").text($("#add_color_bar").is(":checked"))),a.append($("").text($("#reverse_y").is(":checked"))),a.append($("").text($("#reverse_x").is(":checked"))),a.append($("").text($("#add_contour_overlay").is(":checked"))))}else if("Box"===currentTab)d=$("input:radio[name ='statistics']:checked").val(),
d="revision_statistics"===d?$("revision_box_plot.R_tmpl"):$("box_plot.R_tmpl"),a.append(d),a=createXMLBox(a);else if("Bar"===currentTab)d=$("bar_plot.R_tmpl"),a.append(d),a=createXMLBox(a);else if("Hist"===currentTab){var e=$("input:radio[name='hist_line_type']:checked").val();"rhist"===e?d=$("rhist.R_tmpl"):"phist"===e?d=$("phist.R_tmpl"):"relp"===e&&(d=$("relp.R_tmpl"));
a.append(d);a=createXMLHist(a)}else"Roc"===currentTab?(d=$("roc.R_tmpl"),a.append(d),a=createXMLRoc(a)):"Rely"===currentTab?(d=$("rely.R_tmpl"),a.append(d),a=createXMLRely(a)):"Ens_ss"===currentTab?(d=$("ens_ss.R_tmpl"),a.append(d),a=createXMLEns(a)):"Perf"===currentTab?(d=$("performance.R_tmpl"),a.append(d),a=createXMLPerf(a),a=createXMLCommon(a)):"Taylor"===currentTab?(d=$("taylor_plot.R_tmpl"),
-a.append(d),a=createXMLTaylor(a),a=createXMLCommon(a)):"Eclv"===currentTab&&(d=$("eclv.R_tmpl"),a.append(d),a=createXMLEclv(a));b.append(a);b=$("").append(b).html().replace(/label="/g,'label=">');$.ajax({url:"servlet",processData:!1,contentType:"application/xml",type:"POST",data:b,dataType:"xml",success:function(a){try{var b=$(a),c=b.find("plot");if(0===b.find("error").length){updateResult(c.text());var e=b.find("r_error");e&&0eclv.R_tmpl"),a.append(d),a=createXMLEclv(a));b.append(a);b=$("").append(b).html().replace(/label="/g,'label=">');$.ajax({url:"servlet",processData:!1,contentType:"application/xml",type:"POST",data:b,dataType:"xml",success:function(a){try{var b=$(a),c=b.find("plot");if(0===b.find("error").length){updateResult(c.text());var d=b.find("r_error");d&&0").text($("#ensss_pts").val()));a.append($("").text($("input:radio[name='ensss_pts_disp']:checked").val()));return a=createXMLCommon(a)}
function createXMLRoc(a){try{$("#listdt").saveCell(lastSelRow,lastSelCol)}catch(c){console.log("Can't save row "+lastSelRow)}a.append(createSeriesElementForAxis(1,series_var_y1_indexes));a=createXMLPlotFix(a);var b=$("");"pct"==$("input:radio[name='roc_type']:checked").val()?(b.append($("").text("true")),b.append($("").text("false"))):(b.append($("").text("false")),b.append($("").text("true")));a.append(b);b=$("");try{var d=
$("#summary_curve").multiselect("getChecked")}catch(c){d=[]}for(var e=0;e").text(d[e].value));d=$("");d.text($("#add_point_thresholds").prop("checked"));e=$("");e.text($("#reverse_connection_order").prop("checked"));a.append(b);a.append(d);a.append(e);return a=createXMLCommon(a)}
@@ -158,7 +158,7 @@ d.append($("").text($("#boot_ci").val())),d.append($("").
function createXMLHist(a){try{$("#listdt").saveCell(lastSelRow,lastSelCol)}catch(b){console.log("Can't save row "+lastSelRow)}a.append(createSeriesElementForAxis(1,series_var_y1_indexes));a=createXMLPlotFix(a);a.append($("").text($("input:radio[name='normalized_histogram']:checked").val()));return a=createXMLCommon(a)}
function createXMLRely(a){try{$("#listdt").saveCell(lastSelRow,lastSelCol)}catch(c){console.log("Can't save row "+lastSelRow)}a.append(createSeriesElementForAxis(1,series_var_y1_indexes));a=createXMLPlotFix(a);var b=$("");b.text($("#rely_event_hist").prop("checked"));a.append(b);b=$("");try{var d=$("#summary_curve").multiselect("getChecked")}catch(c){d=[]}for(var e=0;e").text(d[e].value));a.append(b);d=$("");
d.text($("#add_skill_line").prop("checked"));a.append(d);d=$("");d.text($("#add_noskill_line").prop("checked"));a.append(d);d=$("");d.text($("#add_reference_line").prop("checked"));a.append(d);d=$("");d.text($("#inset_hist").prop("checked"));a.append(d);d=$("");d.append($("").text("true"));d.append($("").text($("#boot_repl").val()));d.append($("").text($("#boot_random_seed").val()));d.append($("").text($("#boot_ci").val()));
-d.append($("").text($("#eveq_dis").is(":checked")));d.append($("").text($("#cl_step").val()));a.append(d);return a=createXMLCommon(a)}
+d.append($("").text($("#eveq_dis").is(":checked")));d.append($("").text($("#cl_step").val()));a.append(d);d=$("#reference_line_col").val();d.startsWith("#")?a.append($("").text(d)):a.append($("").text("#"+d));d=$("#noskill_line_col").val();d.startsWith("#")?a.append($("").text(d)):a.append($("").text("#"+d));return a=createXMLCommon(a)}
function createXMLBox(a){a=createXMLSeries(a);a=createXMLCommon(a);a.append($("").text($("#box_pts").is(":checked")));a.append($("").text($("#box_outline").is(":checked")));a.append($("").text($("#box_notch").is(":checked")));a.append($("").text($("#box_avg").is(":checked")));a.append($("").text($("#box_boxwex").val()));return a}
function createXMLPlotFix(a){var b=$("");if("none"!==$("#fixed_var_table").css("display"))for(var d=0;d").attr("name",$("#fixed_var_"+fixed_var_indexes[d]).val()).attr("equalize",$("#fix_var_event_equal_"+fixed_var_indexes[d]).is(":checked")),c=$("").attr("name",$("#fixed_var_"+fixed_var_indexes[d]).val()+"_"+d),f=$("#fixed_var_val_"+fixed_var_indexes[d]).val();if(f){for(var g=0;g").text(f[g]));e.append(c);
b.append(e)}}a.append(b);return a}
@@ -168,7 +168,7 @@ $(c[e]).text()).attr("plot_val","").text($(c[e]).text()));else for(f=parseInt(f)
" />").text("true")),b.append($("").text($("#boot_repl").val())),b.append($("").text($("#boot_random_seed").val())),b.append($("").text($("#boot_ci").val())),b.append($("").text($("#eveq_dis").is(":checked"))),b.append($("").text($("#cacheAggStat").is(":checked"))),a.append(b)):"calculations_statistics"===d&&"none"!==b&&(e=$(""),e.append($("").text("true")),a.append(e));a.append($("").text($("#plot_stat").val()));
return a}
function createXMLTaylor(a){try{$("#listdt").saveCell(lastSelRow,lastSelCol)}catch(d){console.log("Can't save row "+lastSelRow)}var b=$("");b.append(createDepElementForAxis(1,fcst_var_y1_indexes,selected_mode));a.append(b);a.append(createSeriesElementForAxis(1,series_var_y1_indexes));a=createXMLPlotFix(a);a.append($("").text($("#txtPlotCond").val()));a.append($("").text($("input:radio[name='taylor_voc']:checked").val()));a.append($("").text($("input:radio[name='show_gamma']:checked").val()));return a}
-function createXMLSeries(a){try{$("#listdt").saveCell(lastSelRow,lastSelCol)}catch(p){console.log("Can't save row "+lastSelRow)}var b=$("#plot_data").multiselect("getChecked").val(),d=$("");d.append(createDepElementForAxis(1,fcst_var_y1_indexes,b));d.append(createDepElementForAxis(2,fcst_var_y2_indexes,b));a.append(d);a.append(createSeriesElementForAxis(1,series_var_y1_indexes));a.append(createSeriesElementForAxis(2,series_var_y2_indexes));a=createXMLPlotFix(a);a.append($("").text($("#txtPlotCond").val()));
+function createXMLSeries(a){try{$("#listdt").saveCell(lastSelRow,lastSelCol)}catch(p){console.log("Can't save row "+lastSelRow)}try{var b=$("#plot_data").multiselect("getChecked").val()}catch(p){b="stat"}var d=$("");d.append(createDepElementForAxis(1,fcst_var_y1_indexes,b));d.append(createDepElementForAxis(2,fcst_var_y2_indexes,b));a.append(d);a.append(createSeriesElementForAxis(1,series_var_y1_indexes));a.append(createSeriesElementForAxis(2,series_var_y2_indexes));a=createXMLPlotFix(a);a.append($("").text($("#txtPlotCond").val()));
b=$("").attr("name",$("#indy_var").val()).attr("equalize",$("#indy_var_event_equal").is(":checked"));var e=$('[name="multiselect_indy_var_val"]');if(0<$("#indy_var_val").multiselect("getChecked").length)for(d=0;d").attr("label",$("#"+f+"_label").val()).attr("plot_val",$("#"+f+"_plot_val").val()).text(c.val()))}}else{var g=moment.tz($("#date_period_start").val(),"YYYY-MM-DD HH:mm:ss","UTC");e=moment.tz($("#date_period_end").val(),
"YYYY-MM-DD HH:mm:ss","UTC");f=$("#date_period_by").val().trim();d=$("#date_period_by_unit").val();c=$(previousIndVarValResponse).find("val");if(0===f.length)for(d=0;d").attr("label",$(c[d]).text()).attr("plot_val","").text($(c[d]).text()));else for(f=parseInt(f),"days"===d&&(f*=24),g=g.clone();g<=e;){var k=g.format("YYYY-MM-DD HH:mm:ss"),h=!1;for(d=0;d").attr("label",k).attr("plot_val","").text(k));g.add(f,"hour")}}a.append(b);c=$("input:radio[name ='statistics']:checked").val();b=$("#calc_stat").val();d=$("#agg_stat").val();e=$("#revis_stat").val();"aggregation_statistics"===c&&"none"!==d?(b=$(""),b.append($("").text("true")),b.append($("").text($("#boot_repl").val())),b.append($("").text($("#boot_random_seed").val())),b.append($("").text($("#boot_ci").val())),
@@ -185,11 +185,11 @@ a.append($("").text($("#ytlab_horiz").val()));a.append($("").text($("#grid_lwd").val()));a.append($("").text($("#grid_x").val()));a.append($("").text($("#x2tlab_orient").val()));a.append($("").text($("#x2tlab_perp").val()));a.append($("").text($("#x2tlab_horiz").val()));a.append($("").text($("#x2tlab_size").val()));a.append($("").text($("#x2lab_size").val()));a.append($("").text($("#x2lab_offset").val()));a.append($("").text($("#x2lab_align").val()));
a.append($("").text($("#y2tlab_orient").val()));a.append($("").text($("#y2tlab_perp").val()));a.append($("").text($("#y2tlab_horiz").val()));a.append($("").text($("#y2tlab_size").val()));a.append($("").text($("#y2lab_size").val()));a.append($("").text($("#y2lab_offset").val()));a.append($("").text($("#y2lab_align").val()));a.append($("").text($("#legend_box").val()));0==$("#legend_inset_min").val().trim().length||
0==$("#legend_inset_max").val().trim().length?a.append($("").text("c()")):a.append($("").text("c("+$("#legend_inset_min").val()+","+$("#legend_inset_max").val()+")"));a.append($("").text($("#legend_ncol").val()));a.append($("").text($("#legend_size").val()));a.append($("").text($("#caption_weight").val()));e=$("#caption_col").val();e.startsWith("#")?a.append($("").text(e)):a.append($("").text("#"+
-e));a.append($("").text($("#caption_size").val()));a.append($("").text($("#caption_offset").val()));a.append($("").text($("#caption_align").val()));a.append($("").text($("#ci_alpha").val()));a.append($("").text($("#eqbound_low").val()));a.append($("").text($("#eqbound_high").val()));var g=sortSeries();b=[];d=[];c=[];f=[];var k=[],h=[],p=[],m=[],q=[],t=[],u=[],x=[];for(e=0;e").attr("type",z).attr("line_pos",v).attr("color",g[e].color).attr("lty",g[e].lty).attr("lwd",g[e].lwd))}if(0");for(g=0;g").text("c("+b.join()+")"));a.append($("").text("c("+u.join()+")"));a.append($("").text("c("+d.join()+")"));a.append($("").text("c("+c.join()+")"));a.append($("").text("c("+f.join()+")"));a.append($("").text("c("+k.join()+")"));a.append($("").text("c("+h.join()+")"));a.append($("").text("c("+p.join()+")"));a.append($("").text("c("+
-m.join()+")"));a.append($("").text("c("+q.join()+")"));a.append($("").text($("#plot_cmd").val()));a.append($("").text("c("+t.join()+")"));a.append($("").text("TRUE"));0===$("#y1_lim_min").val().trim().length||0===$("#y1_lim_max").val().trim().length?a.append($("").text("c()")):a.append($("").text("c("+$("#y1_lim_min").val()+","+$("#y1_lim_max").val()+")"));0===$("#x1_lim_min").val().trim().length||0===$("#x1_lim_max").val().trim().length?
-a.append($("").text("c()")):a.append($("").text("c("+$("#x1_lim_min").val()+","+$("#x1_lim_max").val()+")"));a.append($("").text($("#y1_bufr").val()));0===$("#y2_lim_min").val().trim().length||0===$("#y2_lim_max").val().trim().length?a.append($("").text("c()")):a.append($("").text("c("+$("#y2_lim_min").val()+","+$("#y2_lim_max").val()+")"));return a}
+e));a.append($("").text($("#caption_size").val()));a.append($("").text($("#caption_offset").val()));a.append($("").text($("#caption_align").val()));a.append($("").text($("#ci_alpha").val()));a.append($("").text($("#eqbound_low").val()));a.append($("").text($("#eqbound_high").val()));var g=sortSeries();b=[];d=[];c=[];f=[];var k=[],h=[],p=[],m=[],q=[],t=[],u=[],A=[],z=[];for(e=0;e").attr("type",y).attr("line_pos",w).attr("color",g[e].color).attr("lty",g[e].lty).attr("lwd",
+g[e].lwd))}if(0");for(g=0;g").text("c("+b.join()+")"));a.append($("").text("c("+A.join()+")"));a.append($("").text("c("+d.join()+")"));a.append($("").text("c("+c.join()+")"));a.append($("").text("c("+f.join()+")"));a.append($("").text("c("+k.join()+")"));a.append($("").text("c("+h.join()+")"));a.append($("").text("c("+p.join()+")"));a.append($("").text("c("+
+m.join()+")"));a.append($("").text("c("+q.join()+")"));a.append($("").text("c("+t.join()+")"));a.append($("").text($("#plot_cmd").val()));a.append($("").text("c("+u.join()+")"));a.append($("").text("TRUE"));0===$("#y1_lim_min").val().trim().length||0===$("#y1_lim_max").val().trim().length?a.append($("").text("c()")):a.append($("").text("c("+$("#y1_lim_min").val()+","+$("#y1_lim_max").val()+")"));0===$("#x1_lim_min").val().trim().length||
+0===$("#x1_lim_max").val().trim().length?a.append($("").text("c()")):a.append($("").text("c("+$("#x1_lim_min").val()+","+$("#x1_lim_max").val()+")"));a.append($("").text($("#y1_bufr").val()));0===$("#y2_lim_min").val().trim().length||0===$("#y2_lim_max").val().trim().length?a.append($("").text("c()")):a.append($("").text("c("+$("#y2_lim_min").val()+","+$("#y2_lim_max").val()+")"));return a}
function sortSeries(){$("#listdt").saveCell(lastSelRow,lastSelCol);for(var a=$("#listdt").jqGrid("getRowData"),b=[],d=0;dparseInt(b.id)?1:parseInt(a.id)"),e=0;e").attr("name",$("#series_var_y"+a+"_"+b[e]).val()),f=$("#group_series_var_y"+a+"_"+b[e]).is(":checked");try{var g=$("#series_var_val_y"+a+"_"+b[e]).multiselect("getChecked")}catch(h){}g||(g=[]);if(Array.isArray(g)){if(0").text(k))}else for(f=0;f").text(g[f]));
d.append(c)}}else{if("object"===typeof g)if(f){k="";for(f=0;f").text(k))}else for(f=0;f").text(k));else c.append($("").text(g));d.append(c)}}return d}
@@ -285,7 +285,8 @@ function loadXMLRely(){var a=$(initXML.find("plot").find("lines"));if(a){a=$(a.f
try{$("#series_var_y1_"+(a+1)).val(e).multiselect("refresh")}catch(c){}$(b[a]).find("val").each(function(){d.push($(this).text())});"fcst_init_beg"==e||"fcst_valid_beg"==e||"fcst_valid"==e||"fcst_init"==e?$("#series_var_val_y1_date_period_button_"+(a+1)).css("display","block"):$("#series_var_val_y1_date_period_button_"+(a+1)).css("display","none");updateSeriesVarValHist(a+1,d)}else series_var_y1_indexes=[],updateSeriesVarValHist(1,[]);updatePlotFix();if(initXML.find("plot").find("summary_curve")&&
0").text(b.panel.text());b.panel.empty();b.panel.append(a)},create:function(a,b){}});$("#tab-south").tabs({collapsible:!1});innerLayout=$("#plot_display").layout({name:"inner",closable:!1,center__paneSelector:"#plot_display_inner",
center__size:"70%",center__spacing_closed:20,center__togglerLength_closed:20,center__resizable:!0,center__closable:!1,center__togglerAlign_closed:"top",center__minSize:0,resizeWhileDragging:!0,south__togglerAlign_closed:"top",south__fxName:"slide",south__initClosed:!1,south__initClose:!0,south__togglerClass:"history-toggler",south__spacing_closed:20,south__togglerLength_closed:20,south__size:"30%",south__paneSelector:"#tab-south",south__resizable:!0,south__minSize:0,south__closable:!0,autoBindCustomButtons:!0});
-$("body").on("resize",function(){$("#plot_display_inner").tabs("refresh")});$("").attr("id","west-closer").prependTo("body > .ui-layout-west");outerLayout.addCloseBtn("#west-closer","west");$("#listdt").jqGrid({datatype:"local",autowidth:!0,shrinkToFit:!0,colNames:"ID;#;Y axis;Hide;Title;Conf Interval;Line Color;Point Symbol;Series Line Type;Line Type;Line Width;Show Significant;Connect Across NA;Legend Text".split(";"),colModel:[{name:"id",index:"id",hidden:!0},{name:"order",width:10,
-index:"order",sortable:!1},{name:"y_axis",width:30,index:"y_axis",align:"center"},{name:"hide",index:"hide",width:30,align:"center",editable:!0,edittype:"checkbox",editoptions:{value:"Yes:No"}},{name:"title",index:"title",width:300},{name:"plot_ci",index:"plot_ci",width:70,editable:!0,edittype:"select",formatter:"select",editoptions:{value:"none:none;boot:boot;std:std;met_prm:met_prm;met_boot:met_boot"},align:"center"},{name:"color",index:"color",width:40,editable:!0,edittype:"custom",editoptions:{custom_element:myelem,
+$("body").on("resize",function(){$("#plot_display_inner").tabs("refresh")});$("").attr("id","west-closer").prependTo("body > .ui-layout-west");outerLayout.addCloseBtn("#west-closer","west");$("#listdt").jqGrid({datatype:"local",autowidth:!0,shrinkToFit:!0,colNames:"ID;#;Y axis;Hide;Title;Conf Interval;Line Color;Point Symbol;Series Line Type;Line Type;Line Width;Show Significant;Connect Across NA;Show Legend;Legend Text".split(";"),colModel:[{name:"id",index:"id",hidden:!0},{name:"order",
+width:10,index:"order",sortable:!1},{name:"y_axis",width:30,index:"y_axis",align:"center"},{name:"hide",index:"hide",width:30,align:"center",editable:!0,edittype:"checkbox",editoptions:{value:"Yes:No"}},{name:"title",index:"title",width:300},{name:"plot_ci",index:"plot_ci",width:70,editable:!0,edittype:"select",formatter:"select",editoptions:{value:"none:none;boot:boot;std:std;met_prm:met_prm;met_boot:met_boot"},align:"center"},{name:"color",index:"color",width:40,editable:!0,edittype:"custom",editoptions:{custom_element:myelem,
custom_value:myvalue},formatter:colorDisplayFmatter,unformat:colorDisplayUnmatter,align:"center"},{name:"pch",index:"pch",editable:!0,width:70,align:"center",edittype:"select",formatter:"select",editoptions:{value:"20:Small circle;19:Circle;15:Square;17:Triangle;18:Rhombus;1:Ring"}},{name:"type",index:"type",sortable:!1,editable:!0,edittype:"select",formatter:"select",editoptions:{value:"p:points;l:lines;o:overplotted;b:joined lines;s:stair steps;h:histogram-like;n:nothing"},width:50,align:"center"},
{name:"lty",index:"lty",sortable:!1,editable:!0,edittype:"select",formatter:"select",editoptions:{value:"1:solid;2:dashed;3:dotted;4:dot-dash;5:long dash;6:long short"},width:70,align:"center"},{name:"lwd",index:"lwd",sortable:!1,editable:!0,sorttype:"int",width:40,align:"center"},{name:"show_signif",index:"hide",width:30,align:"center",editable:!0,edittype:"checkbox",editoptions:{value:"Yes:No"}},{name:"con_series",index:"con_series",sortable:!1,editable:!0,edittype:"select",formatter:"select",editoptions:{value:"0:No;1:Yes"},
-width:30,align:"center"},{name:"legend",index:"legend",sortable:!1,width:150,align:"left",editable:!0}],rowNum:-1,height:"auto",pager:"#pagerdt",pginput:!1,pgtext:!1,pgbuttons:!1,viewrecords:!0,caption:"Series Formatting",cmTemplate:{title:!1},cellEdit:!0,hoverrows:!1,url:"clientArray",cellsubmit:"clientArray",afterInsertRow:function(a,b){$("#color_"+b.id).colorpicker({parts:"header map bar hex rgb alpha preview swatches footer".split(" "),altField:"#color_"+b.id})},beforeEditCell:function(a,b,c,
-d,e){lastSelRow=d;lastSelCol=e}});$("#listdt").jqGrid("navGrid","#pagerdt",{edit:!1,add:!1,del:!1,search:!1,refresh:!1});var a=$("#addDiffCurveDialogForm").dialog({autoOpen:!1,height:"auto",width:"auto",modal:!0,buttons:{"Create Derived Curve":function(){var b=!1,c=$("input:radio[name=yAxisDiff]:checked").val(),d=jQuery("input[name=derive_oper]:checked").val();-1!==c.indexOf("1")?$("#series1Y1").val()&&$("#series2Y1").val()&&(seriesDiffY1.push($("#series1Y1").val()+","+$("#series2Y1").val()+","+d),
-b=!0):$("#series1Y2").val()&&$("#series2Y2").val()&&(seriesDiffY2.push($("#series1Y2").val()+","+$("#series2Y2").val()+","+d),b=!0);a.dialog("close");b&&(updateSeries(),$("#event_equal").prop("checked",!0).trigger("change"))},Cancel:function(){a.dialog("close")}},open:function(){$("input[name=derive_oper][value=DIFF]").prop("checked",!0);for(var a=$("#listdt").jqGrid("getRowData"),b=0;b").attr("value",a[b].title).text(a[b].title)),$("#series2Y2").append($("").attr("value",a[b].title).text(a[b].title)),series2Names.push(a[b].title)):($("#series1Y1").append($("").attr("value",
-a[b].title).text(a[b].title)),$("#series2Y1").append($("").attr("value",a[b].title).text(a[b].title)),series1Names.push(a[b].title)))}0<$("#series1Y2 option").length&&0<$("#series1Y1 option").length?createNewDerivedSeriesName(1):(0==$("#series1Y2 option").length&&($("#y2AxisDiff").attr("disabled",!0),createNewDerivedSeriesName(1)),0==$("#series1Y1 option").length&&($("#y1AxisDiff").attr("disabled",!0),$("#y1AxisDiff").removeAttr("checked"),$("#y2AxisDiff").prop("checked",!0),$("#series1Y2").removeAttr("disabled"),
-$("#series2Y2").removeAttr("disabled"),$("#series1Y1").attr("disabled",!0),$("#series2Y1").attr("disabled",!0),createNewDerivedSeriesName(2)))},close:function(){}}),b=$("#addLineDialogForm").dialog({autoOpen:!1,height:"auto",width:"auto",modal:!0,buttons:{"Add line":function(){var a=$("input[name='line_type']:checked").val(),c=$("#line_pos").val();lines.push({type:a,line_pos:c});b.dialog("close");"Hist"===currentTab||"Roc"===currentTab||"Rely"===currentTab||"Eclv"===currentTab?updateSeriesHist():
-"Ens_ss"===currentTab?updateSeriesEns():updateSeries()},Cancel:function(){b.dialog("close")}},open:function(){$("input[name=derive_oper][value=DIFF]").prop("checked",!0);for(var a=$("#listdt").jqGrid("getRowData"),b=0;b").attr("value",a[b].title).text(a[b].title)),$("#series2Y2").append($("").attr("value",a[b].title).text(a[b].title)),series2Names.push(a[b].title)):($("#series1Y1").append($("").attr("value",a[b].title).text(a[b].title)),$("#series2Y1").append($("").attr("value",a[b].title).text(a[b].title)),series1Names.push(a[b].title)))}0<
-$("#series1Y2 option").length&&0<$("#series1Y1 option").length?createNewDerivedSeriesName(1):(0==$("#series1Y2 option").length&&($("#y2AxisDiff").attr("disabled",!0),createNewDerivedSeriesName(1)),0==$("#series1Y1 option").length&&($("#y1AxisDiff").attr("disabled",!0),$("#y1AxisDiff").removeAttr("checked"),$("#y2AxisDiff").prop("checked",!0),$("#series1Y2").removeAttr("disabled"),$("#series2Y2").removeAttr("disabled"),$("#series1Y1").attr("disabled",!0),$("#series2Y1").attr("disabled",!0),createNewDerivedSeriesName(2)))},
-close:function(){}});$("#listdt").jqGrid("navButtonAdd","#pagerdt",{caption:"Add Derived Curve",title:"Add Derived Curve",buttonicon:"ui-icon-plus",onClickButton:function(){"Roc"===currentTab||"Rely"===currentTab||"Ens_ss"===currentTab||"Perf"===currentTab||"Hist"===currentTab||"Eclv"===currentTab||"Contour"===currentTab||"revision_statistics"===$("input:radio[name ='statistics']:checked").val()?d.dialog("open"):1<$("#listdt").jqGrid("getRowData").length?a.dialog("open"):c.dialog("open")}}).jqGrid("navButtonAdd",
-"#pagerdt",{caption:"Remove Derived Curve",title:"Remove Derived Curve",buttonicon:"ui-icon-trash",onClickButton:function(){var a=$(this).jqGrid("getGridParam","selrow");if(a){var b=$(this).getRowData(a);if(b.title.startsWith("DIFF")||b.title.startsWith("RATIO")||b.title.startsWith("SS")||b.title.startsWith("ETB")){$(this).jqGrid("delRowData",a);$("#1","#gbox_listdt").css({display:""});a=b.title.slice(0,-1);if(b.title.startsWith("DIFF")){var c=a.replace("DIFF (","").split('"-"');for(a=0;aThis is not a derived curve"),$(b).find(".ui-jqdialog-titlebar-close").focus()}else b="#alertmod_"+this.p.id,$.jgrid.viewModal(b,
-{gbox:"#gbox_"+$.jgrid.jqID(this.p.id),jqm:!0}),$(b).find(".ui-jqdialog-titlebar-close").focus()}}).jqGrid("navButtonAdd","#pagerdt",{caption:"Add Line",title:"Add Line",buttonicon:"ui-icon-plus",onClickButton:function(){"Perf"===currentTab||"Taylor"===currentTab||"Contour"===currentTab?e.dialog("open"):b.dialog("open")}}).jqGrid("navButtonAdd","#pagerdt",{caption:"Remove Line",title:"Remove Line",buttonicon:"ui-icon-trash",onClickButton:function(){var a=$(this).jqGrid("getGridParam","selrow");if(a){var b=
-$(this).getRowData(a);if(b.title.startsWith("vert_line")||b.title.startsWith("horiz_line")){$(this).jqGrid("delRowData",a);a=null;for(var c=0;c');
+width:30,align:"center"},{name:"show_legend",index:"show_legend",width:30,align:"center",editable:!0,edittype:"select",formatter:"select",editoptions:{value:"0:No;1:Yes"},sortable:!1},{name:"legend",index:"legend",sortable:!1,width:150,align:"left",editable:!0}],rowNum:-1,height:"auto",pager:"#pagerdt",pginput:!1,pgtext:!1,pgbuttons:!1,viewrecords:!0,caption:"Series Formatting",cmTemplate:{title:!1},cellEdit:!0,hoverrows:!1,url:"clientArray",cellsubmit:"clientArray",afterInsertRow:function(a,b){$("#color_"+
+b.id).colorpicker({parts:"header map bar hex rgb alpha preview swatches footer".split(" "),altField:"#color_"+b.id})},beforeEditCell:function(a,b,c,d,e){lastSelRow=d;lastSelCol=e}});$("#listdt").jqGrid("navGrid","#pagerdt",{edit:!1,add:!1,del:!1,search:!1,refresh:!1});var a=$("#addDiffCurveDialogForm").dialog({autoOpen:!1,height:"auto",width:"auto",modal:!0,buttons:{"Create Derived Curve":function(){var b=!1,c=$("input:radio[name=yAxisDiff]:checked").val(),d=jQuery("input[name=derive_oper]:checked").val();
+-1!==c.indexOf("1")?$("#series1Y1").val()&&$("#series2Y1").val()&&(seriesDiffY1.push($("#series1Y1").val()+","+$("#series2Y1").val()+","+d),b=!0):$("#series1Y2").val()&&$("#series2Y2").val()&&(seriesDiffY2.push($("#series1Y2").val()+","+$("#series2Y2").val()+","+d),b=!0);a.dialog("close");b&&(updateSeries(),$("#event_equal").prop("checked",!0).trigger("change"))},Cancel:function(){a.dialog("close")}},open:function(){$("input[name=derive_oper][value=DIFF]").prop("checked",!0);for(var a=$("#listdt").jqGrid("getRowData"),
+b=0;b").attr("value",a[b].title).text(a[b].title)),$("#series2Y2").append($("").attr("value",
+a[b].title).text(a[b].title)),series2Names.push(a[b].title)):($("#series1Y1").append($("").attr("value",a[b].title).text(a[b].title)),$("#series2Y1").append($("").attr("value",a[b].title).text(a[b].title)),series1Names.push(a[b].title)))}0<$("#series1Y2 option").length&&0<$("#series1Y1 option").length?createNewDerivedSeriesName(1):(0==$("#series1Y2 option").length&&($("#y2AxisDiff").attr("disabled",!0),createNewDerivedSeriesName(1)),0==$("#series1Y1 option").length&&
+($("#y1AxisDiff").attr("disabled",!0),$("#y1AxisDiff").removeAttr("checked"),$("#y2AxisDiff").prop("checked",!0),$("#series1Y2").removeAttr("disabled"),$("#series2Y2").removeAttr("disabled"),$("#series1Y1").attr("disabled",!0),$("#series2Y1").attr("disabled",!0),createNewDerivedSeriesName(2)))},close:function(){}}),b=$("#addLineDialogForm").dialog({autoOpen:!1,height:"auto",width:"auto",modal:!0,buttons:{"Add line":function(){var a=$("input[name='line_type']:checked").val(),c=$("#line_pos").val();
+lines.push({type:a,line_pos:c});b.dialog("close");"Hist"===currentTab||"Roc"===currentTab||"Rely"===currentTab||"Eclv"===currentTab?updateSeriesHist():"Ens_ss"===currentTab?updateSeriesEns():updateSeries()},Cancel:function(){b.dialog("close")}},open:function(){$("input[name=derive_oper][value=DIFF]").prop("checked",!0);for(var a=$("#listdt").jqGrid("getRowData"),b=0;b").attr("value",a[b].title).text(a[b].title)),$("#series2Y2").append($("").attr("value",a[b].title).text(a[b].title)),series2Names.push(a[b].title)):($("#series1Y1").append($("").attr("value",a[b].title).text(a[b].title)),
+$("#series2Y1").append($("").attr("value",a[b].title).text(a[b].title)),series1Names.push(a[b].title)))}0<$("#series1Y2 option").length&&0<$("#series1Y1 option").length?createNewDerivedSeriesName(1):(0==$("#series1Y2 option").length&&($("#y2AxisDiff").attr("disabled",!0),createNewDerivedSeriesName(1)),0==$("#series1Y1 option").length&&($("#y1AxisDiff").attr("disabled",!0),$("#y1AxisDiff").removeAttr("checked"),$("#y2AxisDiff").prop("checked",!0),$("#series1Y2").removeAttr("disabled"),
+$("#series2Y2").removeAttr("disabled"),$("#series1Y1").attr("disabled",!0),$("#series2Y1").attr("disabled",!0),createNewDerivedSeriesName(2)))},close:function(){}});$("#listdt").jqGrid("navButtonAdd","#pagerdt",{caption:"Add Derived Curve",title:"Add Derived Curve",buttonicon:"ui-icon-plus",onClickButton:function(){"Roc"===currentTab||"Rely"===currentTab||"Ens_ss"===currentTab||"Perf"===currentTab||"Hist"===currentTab||"Eclv"===currentTab||"Contour"===currentTab||"revision_statistics"===$("input:radio[name ='statistics']:checked").val()?
+d.dialog("open"):1<$("#listdt").jqGrid("getRowData").length?a.dialog("open"):c.dialog("open")}}).jqGrid("navButtonAdd","#pagerdt",{caption:"Remove Derived Curve",title:"Remove Derived Curve",buttonicon:"ui-icon-trash",onClickButton:function(){var a=$(this).jqGrid("getGridParam","selrow");if(a){var b=$(this).getRowData(a);if(b.title.startsWith("DIFF")||b.title.startsWith("RATIO")||b.title.startsWith("SS")||b.title.startsWith("ETB")){$(this).jqGrid("delRowData",a);$("#1","#gbox_listdt").css({display:""});
+a=b.title.slice(0,-1);if(b.title.startsWith("DIFF")){var c=a.replace("DIFF (","").split('"-"');for(a=0;aThis is not a derived curve"),
+$(b).find(".ui-jqdialog-titlebar-close").focus()}else b="#alertmod_"+this.p.id,$.jgrid.viewModal(b,{gbox:"#gbox_"+$.jgrid.jqID(this.p.id),jqm:!0}),$(b).find(".ui-jqdialog-titlebar-close").focus()}}).jqGrid("navButtonAdd","#pagerdt",{caption:"Add Line",title:"Add Line",buttonicon:"ui-icon-plus",onClickButton:function(){"Perf"===currentTab||"Taylor"===currentTab||"Contour"===currentTab?e.dialog("open"):b.dialog("open")}}).jqGrid("navButtonAdd","#pagerdt",{caption:"Remove Line",title:"Remove Line",buttonicon:"ui-icon-trash",
+onClickButton:function(){var a=$(this).jqGrid("getGridParam","selrow");if(a){var b=$(this).getRowData(a);if(b.title.startsWith("vert_line")||b.title.startsWith("horiz_line")){$(this).jqGrid("delRowData",a);a=null;for(var c=0;c');
$("#seriesLock").change(function(){$(this).is(":checked")?$(this).attr("checked","checked"):$(this).removeAttr("checked")});$("#generate_plot").button({}).click(function(){sendXml()});var f=$("#upload_file_dialog").dialog({modal:!0,autoOpen:!1,buttons:{OK:function(){$("#formUpload").submit()},Cancel:function(){f.dialog("close")}}});$("#load_xml").button({}).click(function(){f.dialog("open")});$("#reload_databases").button({}).click(function(){requestDBUpdate()});$("input[name=show_history_choice][value=show_history_success]").prop("checked",
!0);$("#show_history_choice").buttonset();$("#grid_col").colorpicker({parts:"header map bar hex rgb alpha preview swatches footer".split(" "),showOn:"focus alt click",altField:"#grid_col"});$("#grid_col").colorpicker("setColor","#CCCCCC");$("#caption_col").colorpicker({parts:"header map bar hex rgb alpha preview swatches footer".split(" "),showOn:"focus alt click",altField:"#caption_col"});$("#caption_col").colorpicker("setColor","#333333");$("#error_message").dialog({modal:!0,autoOpen:!1,buttons:{Ok:function(){$(this).dialog("close")}}});
$("#r_error_message").dialog({modal:!1,autoOpen:!1,height:360,buttons:{Ok:function(){$(this).dialog("close")}}});$("#refresh_history").button({icons:{primary:"ui-icon-refresh"},text:!1}).click(function(){refreshHistory()});$.ajaxSetup({beforeSend:function(){$("#modal").css("display","block");$("#fade").css("display","block")},complete:function(){$("#modal").css("display","none");$("#fade").css("display","none")}});$("#download_plot").button({icons:{primary:"ui-icon-disk"},text:!1}).click(function(){downloadPlot()});
@@ -387,8 +388,8 @@ function addThemeSwitcher(a,b){$('