diff --git a/java/edu/ucar/metviewer/MVPlotJob.java b/java/edu/ucar/metviewer/MVPlotJob.java index b4854a69..9bbc3cd3 100644 --- a/java/edu/ucar/metviewer/MVPlotJob.java +++ b/java/edu/ucar/metviewer/MVPlotJob.java @@ -228,6 +228,8 @@ public class MVPlotJob { protected double eqboundHigh = -0.001; protected Boolean isCircularBlockBootstrap = Boolean.TRUE; + protected List lines = new ArrayList<>(); + /** * Deep copy of the MVPlotJob, useful for inheritance. @@ -434,6 +436,7 @@ public MVPlotJob copy() { job.eqboundLow = eqboundLow; job.eqboundHigh = eqboundHigh; + job.lines = new ArrayList<>(lines); return job; } @@ -2245,6 +2248,14 @@ public void setCircularBlockBootstrap(Boolean addCircularBlockBootstrap) { isCircularBlockBootstrap = addCircularBlockBootstrap; } + public List getLines() { + return lines; + } + + public void setLines(List lines) { + this.lines = lines; + } + public Boolean getReverseX() { return isReverseX; } diff --git a/java/edu/ucar/metviewer/MVPlotJobParser.java b/java/edu/ucar/metviewer/MVPlotJobParser.java index ae4b5f2f..462c47e8 100644 --- a/java/edu/ucar/metviewer/MVPlotJobParser.java +++ b/java/edu/ucar/metviewer/MVPlotJobParser.java @@ -814,7 +814,7 @@ public static StringBuilder serializeJob(MVPlotJob job, DatabaseInfo databaseInf xmlStr.append(""); // agg_stat - if ((job.getAggCtc() || job.getAggSl1l2() || job.getAggSal1l2() || job.getAggPct()|| job.getAggMctc() + if ((job.getAggCtc() || job.getAggSl1l2() || job.getAggSal1l2() || job.getAggPct() || job.getAggMctc() || job.getAggNbrCnt() || job.getAggSsvar() || job.getAggVl1l2() || job.getAggGrad() || job.getAggEcnt()) || job.isModeRatioJob()) { @@ -908,7 +908,7 @@ public static StringBuilder serializeJob(MVPlotJob job, DatabaseInfo databaseInf if (job.getPlotTmpl().equals("ens_ss.R_tmpl")) { xmlStr.append( "" + job.getEnsSsPts() + "" + - "" + (job.getEnsSsPtsDisp() ? "TRUE" : "FALSE")+ ""); + "" + (job.getEnsSsPtsDisp() ? "TRUE" : "FALSE") + ""); } //taylor @@ -1059,6 +1059,19 @@ public static StringBuilder serializeJob(MVPlotJob job, DatabaseInfo databaseInf xmlStr.append("" + job.getContourIntervals() + ""); } + if (!job.getLines().isEmpty()) { + StringBuilder linesStr = new StringBuilder(""); + for (LineAttributes lineAttributes : job.getLines()) { + linesStr.append(""); + } + linesStr.append(""); + xmlStr.append(linesStr); + } + + // close the plot job xmlStr.append(""); return xmlStr; @@ -1263,6 +1276,7 @@ else if (node.tag.equals("plot")) { String strCompleteness = ""; boolean boolPlotRun = !node.run.equalsIgnoreCase("false"); + if (job.getPlotTmpl().equals("roc.R_tmpl")) { // ROC jobs must have an aggregation method selected @@ -1376,7 +1390,7 @@ else if (node.tag.equals("indep")) { } else { String[][] listIndy = parseIndyNode(node, ""); int size = listIndy[0].length; - if(listIndy[2].length < size) { + if (listIndy[2].length < size) { String[] newListIndy = new String[size]; for (int j = 0; j < size; j++) { if (j < listIndy[2].length) { @@ -1769,8 +1783,8 @@ else if (node.tag.equals("agg_stat")) { if (nodeAggStat.tag.equals("agg_ctc")) { job.setAggCtc(val); } else if (nodeAggStat.tag.equals("agg_mctc")) { - job.setAggMctc(val);} - else if (nodeAggStat.tag.equals("agg_nbrctc")) { + job.setAggMctc(val); + } else if (nodeAggStat.tag.equals("agg_nbrctc")) { job.setAggNbrCtc(val); } else if (nodeAggStat.tag.equals("agg_sl1l2")) { job.setAggSl1l2(val); @@ -1913,6 +1927,28 @@ else if (node.tag.equals("normalized_histogram")) { job.setNormalizedHistogram(node.value.equalsIgnoreCase("true")); } + // + else if (node.tag.equals("lines") && node.children.length > 0) { + List lines = new ArrayList<>(); + for (int j = 0; j < node.children.length; j++) { + MVNode lineNode = node.children[j]; + if (lineNode.tag.equals("line")) { + LineAttributes lineAttributes = new LineAttributes(); + try { + lineAttributes.setColor(lineNode.getAttribute("color")); + lineAttributes.setLty(lineNode.getAttribute("lty")); + lineAttributes.setLwd(lineNode.getAttribute("lwd")); + lineAttributes.setPosition(lineNode.getAttribute("line_pos")); + lineAttributes.setType(lineNode.getAttribute("type")); + } catch (Exception e) { + logger.error("One of the lin's attribute is invalid or missing"); + } + lines.add(lineAttributes); + } + } + job.setLines(lines); + + } // boolean format settings diff --git a/java/edu/ucar/metviewer/jobManager/BarJobManager.java b/java/edu/ucar/metviewer/jobManager/BarJobManager.java index 08e67465..83833c4a 100644 --- a/java/edu/ucar/metviewer/jobManager/BarJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/BarJobManager.java @@ -8,6 +8,6 @@ public BarJobManager(MVBatch mvBatch) { } @Override protected String getPythonScript() { - return "/plots/bar/bar.py"; + return "/metplotpy/plots/bar/bar.py"; } } diff --git a/java/edu/ucar/metviewer/jobManager/BoxJobManager.java b/java/edu/ucar/metviewer/jobManager/BoxJobManager.java index 65694ba6..5576e9e6 100644 --- a/java/edu/ucar/metviewer/jobManager/BoxJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/BoxJobManager.java @@ -8,6 +8,6 @@ public BoxJobManager(MVBatch mvBatch) { } @Override protected String getPythonScript() { - return "/plots/box/box.py"; + return "/metplotpy/plots/box/box.py"; } } diff --git a/java/edu/ucar/metviewer/jobManager/ContourJobManager.java b/java/edu/ucar/metviewer/jobManager/ContourJobManager.java index 3676a8f1..61e25294 100644 --- a/java/edu/ucar/metviewer/jobManager/ContourJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/ContourJobManager.java @@ -58,6 +58,6 @@ protected Map createYamlInfoMap(MVPlotJob job) throws Validation } @Override protected String getPythonScript() { - return "/plots/contour/contour.py"; + return "/metplotpy/plots/contour/contour.py"; } } diff --git a/java/edu/ucar/metviewer/jobManager/EclvJobManager.java b/java/edu/ucar/metviewer/jobManager/EclvJobManager.java index 31928a59..e4f5d85c 100644 --- a/java/edu/ucar/metviewer/jobManager/EclvJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/EclvJobManager.java @@ -158,6 +158,6 @@ protected void run(MVPlotJob job) throws ValidationException, ParseException, IO } @Override protected String getPythonScript() { - return "/plots/eclv/eclv.py"; + return "/metplotpy/plots/eclv/eclv.py"; } } diff --git a/java/edu/ucar/metviewer/jobManager/EnsSsJobManager.java b/java/edu/ucar/metviewer/jobManager/EnsSsJobManager.java index 713a9b75..ff4c915f 100644 --- a/java/edu/ucar/metviewer/jobManager/EnsSsJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/EnsSsJobManager.java @@ -34,6 +34,6 @@ protected void validateNumDepSeries(MVPlotJob job, int intNumDepSeries) { } @Override protected String getPythonScript() { - return "/plots/ens_ss/ens_ss.py"; + return "/metplotpy/plots/ens_ss/ens_ss.py"; } } diff --git a/java/edu/ucar/metviewer/jobManager/EtbJobManager.java b/java/edu/ucar/metviewer/jobManager/EtbJobManager.java index eb0226d3..5c5a28e1 100644 --- a/java/edu/ucar/metviewer/jobManager/EtbJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/EtbJobManager.java @@ -12,7 +12,7 @@ public EtbJobManager(MVBatch mvBatch) { } @Override protected String getPythonScript() { - return "/plots/equivalence_testing_bounds/equivalence_testing_bounds.py"; + return "/metplotpy/plots/equivalence_testing_bounds/equivalence_testing_bounds.py"; } @Override diff --git a/java/edu/ucar/metviewer/jobManager/JobManager.java b/java/edu/ucar/metviewer/jobManager/JobManager.java index 5405376b..f2225005 100644 --- a/java/edu/ucar/metviewer/jobManager/JobManager.java +++ b/java/edu/ucar/metviewer/jobManager/JobManager.java @@ -12,14 +12,7 @@ import java.util.*; import java.util.regex.Matcher; -import edu.ucar.metviewer.DatabaseException; -import edu.ucar.metviewer.MVBatch; -import edu.ucar.metviewer.MVDataTable; -import edu.ucar.metviewer.MVOrderedMap; -import edu.ucar.metviewer.MVPlotJob; -import edu.ucar.metviewer.MVUtil; -import edu.ucar.metviewer.StopWatchException; -import edu.ucar.metviewer.ValidationException; +import edu.ucar.metviewer.*; /** * @author : tatiana $ @@ -541,6 +534,20 @@ protected Map createYamlInfoMap(MVPlotJob job) throws Validation yamlInfo.put("cl_step", 0.05); yamlInfo.put("equalize_by_indep", job.getEqualizeByIndep() ? "True" : "False"); + if(!job.getLines().isEmpty()){ + List > linesList = new ArrayList<>(); + for (LineAttributes lineAttributes : job.getLines()){ + Map line = new HashMap<>(); + line.put("type", lineAttributes.getType()); + line.put("line_style", linesRtoPython.get(lineAttributes.getLty())); + line.put("line_width", lineAttributes.getLwd()); + line.put("color", lineAttributes.getColor()); + line.put("position", lineAttributes.getPosition()); + linesList.add(line); + } + yamlInfo.put("lines", linesList); + } + return yamlInfo; } diff --git a/java/edu/ucar/metviewer/jobManager/PerformanceJobManager.java b/java/edu/ucar/metviewer/jobManager/PerformanceJobManager.java index 2c3ad11b..5cdb19bb 100644 --- a/java/edu/ucar/metviewer/jobManager/PerformanceJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/PerformanceJobManager.java @@ -29,7 +29,7 @@ protected int getNumberPlotCurves(Map.Entry[] listDep1Plot) { @Override protected String getPythonScript() { - return "/plots/performance_diagram/performance_diagram.py"; + return "/metplotpy/plots/performance_diagram/performance_diagram.py"; } @Override protected Map addPlotConfigs(Map yamlInfo, MVPlotJob job, int intNumDepSeries) throws ValidationException { diff --git a/java/edu/ucar/metviewer/jobManager/PhistJobManager.java b/java/edu/ucar/metviewer/jobManager/PhistJobManager.java index bdfce33d..f85b5e31 100644 --- a/java/edu/ucar/metviewer/jobManager/PhistJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/PhistJobManager.java @@ -23,6 +23,6 @@ public PhistJobManager(MVBatch mvBatch) { } @Override protected String getPythonScript() { - return "/plots/histogram/prob_hist.py"; + return "/metplotpy/plots/histogram/prob_hist.py"; } } diff --git a/java/edu/ucar/metviewer/jobManager/RelpJobManager.java b/java/edu/ucar/metviewer/jobManager/RelpJobManager.java index 2572a49a..3d57a9c1 100644 --- a/java/edu/ucar/metviewer/jobManager/RelpJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/RelpJobManager.java @@ -23,6 +23,6 @@ public RelpJobManager(MVBatch mvBatch) { } @Override protected String getPythonScript() { - return "/plots/histogram/rel_hist.py"; + return "/metplotpy/plots/histogram/rel_hist.py"; } } diff --git a/java/edu/ucar/metviewer/jobManager/RelyJobManager.java b/java/edu/ucar/metviewer/jobManager/RelyJobManager.java index 0ed29760..0e3b6fd6 100644 --- a/java/edu/ucar/metviewer/jobManager/RelyJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/RelyJobManager.java @@ -166,7 +166,7 @@ protected void run(MVPlotJob job) throws ParseException, ValidationException, IO @Override protected String getPythonScript() { - return "/plots/reliability_diagram/reliability.py"; + return "/metplotpy/plots/reliability_diagram/reliability.py"; } } diff --git a/java/edu/ucar/metviewer/jobManager/RhistJobManager.java b/java/edu/ucar/metviewer/jobManager/RhistJobManager.java index 3a8c1638..8942c4fc 100644 --- a/java/edu/ucar/metviewer/jobManager/RhistJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/RhistJobManager.java @@ -137,7 +137,7 @@ protected void run(MVPlotJob job) throws ParseException, ValidationException, IO } @Override protected String getPythonScript() { - return "/plots/histogram/rank_hist.py"; + return "/metplotpy/plots/histogram/rank_hist.py"; } } diff --git a/java/edu/ucar/metviewer/jobManager/RocJobManager.java b/java/edu/ucar/metviewer/jobManager/RocJobManager.java index 70119435..004a87b6 100644 --- a/java/edu/ucar/metviewer/jobManager/RocJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/RocJobManager.java @@ -100,7 +100,7 @@ protected void run(MVPlotJob job) throws ParseException, ValidationException, IO @Override protected String getPythonScript() { - return "/plots/roc_diagram/roc_diagram.py"; + return "/metplotpy/plots/roc_diagram/roc_diagram.py"; } } diff --git a/java/edu/ucar/metviewer/jobManager/SeriesJobManager.java b/java/edu/ucar/metviewer/jobManager/SeriesJobManager.java index 6bda207d..451bba99 100644 --- a/java/edu/ucar/metviewer/jobManager/SeriesJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/SeriesJobManager.java @@ -283,7 +283,7 @@ protected void run(MVPlotJob job) throws ParseException, ValidationException, IO @Override protected String getPythonScript() { - return "/plots/line/line.py"; + return "/metplotpy/plots/line/line.py"; } diff --git a/java/edu/ucar/metviewer/jobManager/TaylorJobManager.java b/java/edu/ucar/metviewer/jobManager/TaylorJobManager.java index 2735693f..917b64c5 100644 --- a/java/edu/ucar/metviewer/jobManager/TaylorJobManager.java +++ b/java/edu/ucar/metviewer/jobManager/TaylorJobManager.java @@ -46,7 +46,7 @@ protected int getNumberPlotCurves(Map.Entry[] listDep1Plot) { } @Override protected String getPythonScript() { - return "/plots/taylor_diagram/taylor_diagram.py"; + return "/metplotpy/plots/taylor_diagram/taylor_diagram.py"; } @Override diff --git a/webapp/metviewer/js/metviewer_common.js b/webapp/metviewer/js/metviewer_common.js index 518465cd..52ad3f58 100644 --- a/webapp/metviewer/js/metviewer_common.js +++ b/webapp/metviewer/js/metviewer_common.js @@ -672,6 +672,7 @@ var group_name_to_value_map; var indy_var_vals_to_attr; var fcst_vars = []; var fcst_vars_stats = []; +var lines = []; function cleanUp() { @@ -690,6 +691,7 @@ function cleanUp() { group_name_to_value_map = null; fcst_vars = []; fcst_vars_stats = []; + lines = []; } /** @@ -2575,11 +2577,11 @@ function updateSeriesHist() { series_perm = permuteSeries(createSeriesMapForPermutationEns(series_var_y1_indexes, "y1"), 0); var seriesName; - if (series_perm.length == 0) { + if (series_perm.length === 0) { series_perm[0] = ""; } - if (currentTab == 'Roc' || currentTab == 'Rely' || currentTab == 'Eclv') { + if (currentTab === 'Roc' || currentTab === 'Rely' || currentTab === 'Eclv') { var selected_stats; try { selected_stats = $("#summary_curve").multiselect("getChecked"); @@ -2660,7 +2662,24 @@ function updateSeriesHist() { number_series++; newSeriesData.push(series_formatting); } - + for (var i=0; i< lines.length; i++){ + series_formatting = jQuery.extend(true, {}, firstSeriesFormatting); + series_formatting.title = lines[i].type + '(' + lines[i].line_pos + ')'; + series_formatting.y_axis = "Y1"; + series_formatting.order = ''; + series_formatting.id = number_series + 1; + if(lines[i].hasOwnProperty("color")){ + series_formatting.color = lines[i].color; + } + if(lines[i].hasOwnProperty("lty")){ + series_formatting.lty = lines[i].lty; + } + if(lines[i].hasOwnProperty("lwd")){ + series_formatting.lwd = lines[i].lwd; + } + number_series++; + newSeriesData.push(series_formatting); + } //set default color for each series if it is not a upload if (initXML == null) { @@ -2963,6 +2982,24 @@ function updateSeriesEns() { number_series++; newSeriesData.push(series_formatting); } + for (var i=0; i< lines.length; i++){ + series_formatting = jQuery.extend(true, {}, firstSeriesFormatting); + series_formatting.title = lines[i].type + '(' + lines[i].line_pos + ')'; + series_formatting.y_axis = "Y1"; + series_formatting.order = ''; + series_formatting.id = number_series + 1; + if(lines[i].hasOwnProperty("color")){ + series_formatting.color = lines[i].color; + } + if(lines[i].hasOwnProperty("lty")){ + series_formatting.lty = lines[i].lty; + } + if(lines[i].hasOwnProperty("lwd")){ + series_formatting.lwd = lines[i].lwd; + } + number_series++; + newSeriesData.push(series_formatting); + } //set default color for each series if it is not a upload @@ -3454,6 +3491,25 @@ function updateSeries(isCheckAll) { } seriesDiffY2 = seriesDiff; + for (var i=0; i< lines.length; i++){ + series_formatting = jQuery.extend(true, {}, firstSeriesFormatting); + series_formatting.title = lines[i].type + '(' + lines[i].line_pos + ')'; + series_formatting.y_axis = "Y1"; + series_formatting.order = ''; + series_formatting.id = number_series + 1; + if(lines[i].hasOwnProperty("color")){ + series_formatting.color = lines[i].color; + } + if(lines[i].hasOwnProperty("lty")){ + series_formatting.lty = lines[i].lty; + } + if(lines[i].hasOwnProperty("lwd")){ + series_formatting.lwd = lines[i].lwd; + } + number_series++; + newSeriesData.push(series_formatting); + } + //set default color for each series if it is not a upload if (initXML == null) { @@ -3493,6 +3549,8 @@ function updateSeries(isCheckAll) { } + + if (currentTab === 'Contour') { newSeriesData.reverse(); } else { @@ -4169,6 +4227,8 @@ function createXMLCommon(plot) { var seriesDiffY1List = []; var arr; + + if (seriesDiffY1.length > 0) { for (var i = 0; i < seriesDiffY1.length; i++) { arr = seriesDiffY1[i].split(","); @@ -4314,27 +4374,47 @@ function createXMLCommon(plot) { var allSeries = sortSeries(); var ciArr = [], dispArr = [], colorsArr = [], pchArr = [], typeArr = [], ltyArr = [], lwdArr = [], conArr = [], - orderArr = [], legendArr = [], showSignArr = []; + orderArr = [], legendArr = [], showSignArr = [], linesArr=[]; for (var i = 0; i < allSeries.length; i++) { - ciArr.push('"' + allSeries[i].plot_ci + '"'); - if (allSeries[i].hide === "No") { - dispArr.push("TRUE"); - } else { - dispArr.push("FALSE"); + if(allSeries[i].order !==''){ + // only for the real series and not lines + ciArr.push('"' + allSeries[i].plot_ci + '"'); + if (allSeries[i].hide === "No") { + dispArr.push("TRUE"); + } else { + dispArr.push("FALSE"); + } + if (allSeries[i].show_signif === "No") { + showSignArr.push("FALSE"); + } else { + showSignArr.push("TRUE"); + } + colorsArr.push('"' + allSeries[i].color + 'FF"'); + pchArr.push(allSeries[i].pch); + typeArr.push('"' + allSeries[i].type + '"'); + ltyArr.push(allSeries[i].lty); + lwdArr.push(allSeries[i].lwd); + conArr.push(allSeries[i].con_series); + orderArr.push(allSeries[i].order); + legendArr.push('"' + allSeries[i].legend + '"'); + }else{ + var title = allSeries[i].title; + var type = title.split('(')[0]; + var linePos =title.split('(')[1].split(')')[0]; + linesArr.push($('').attr("type", type).attr("line_pos", linePos) + .attr('color', allSeries[i].color) + .attr('lty', allSeries[i].lty) + .attr('lwd', allSeries[i].lwd)); + } - if (allSeries[i].show_signif === "No") { - showSignArr.push("FALSE"); - } else { - showSignArr.push("TRUE"); + } + + if(linesArr.length > 0){ + var lines_xml = $(''); + for(var h = 0; h').text("c(" + ciArr.join() + ")")); plot.append($('').text("c(" + showSignArr.join() + ")")); @@ -5941,6 +6021,22 @@ function loadXMLStatistics(fcst_stat) { function loadXMLEclv() { + var linesEl = $(initXML.find("plot").find("lines")); + if (linesEl){ + var linesArr = $(linesEl.find("line")); + for (var j=0; j 0) { var series_arr = initXML.find("plot").find("series1").children(); @@ -5979,6 +6075,21 @@ function loadXMLEclv() { function loadXMLRoc() { var series_var_val; $("#event_equal").prop('checked', $(initXML.find("plot").find("event_equal")).text() == "true").trigger("change"); + var linesEl = $(initXML.find("plot").find("lines")); + if (linesEl){ + var linesArr = $(linesEl.find("line")); + for (var j=0; j 0) { var series_arr = initXML.find("plot").find("series1").children(); @@ -6085,6 +6196,22 @@ function loadXMLRoc() { } function loadXMLHist() { + var linesEl = $(initXML.find("plot").find("lines")); + if (linesEl){ + var linesArr = $(linesEl.find("line")); + for (var j=0; j 0) { var series_arr = initXML.find("plot").find("series1").children(); @@ -6221,6 +6364,21 @@ function loadXMLRely() { } function loadXMLEns() { + var linesEl = $(initXML.find("plot").find("lines")); + if (linesEl){ + var linesArr = $(linesEl.find("line")); + for (var j=0; j 0) { var series_arr = initXML.find("plot").find("series1").children(); @@ -6539,6 +6697,22 @@ function loadXMLSeries() { seriesDiffY2.push(t2[i]); } } + + var linesEl = $(initXML.find("plot").find("lines")); + if (linesEl){ + var linesArr = $(linesEl.find("line")); + for (var j=0; j -1) { + isInclude = true; + } + } else { + isInclude = true; + } + } + + + if (isInclude) { + var yAxisText = allSeries[i].y_axis; + + if (yAxisText.indexOf("2") !== -1) { + $('#series1Y2') + .append($("") + .attr("value", allSeries[i].title) + .text(allSeries[i].title)); + $('#series2Y2') + .append($("") + .attr("value", allSeries[i].title) + .text(allSeries[i].title)); + series2Names.push(allSeries[i].title); + } else { + $('#series1Y1') + .append($("") + .attr("value", allSeries[i].title) + .text(allSeries[i].title)); + $('#series2Y1') + .append($("") + .attr("value", allSeries[i].title) + .text(allSeries[i].title)); + + series1Names.push(allSeries[i].title); + } + } + } + + + if ($("#series1Y2 option").length > 0 && $("#series1Y1 option").length > 0) { + createNewDerivedSeriesName(1); + } else { + if ($("#series1Y2 option").length == 0) { + $('#y2AxisDiff').attr("disabled", true); + createNewDerivedSeriesName(1); + } + if ($("#series1Y1 option").length == 0) { + $('#y1AxisDiff').attr("disabled", true); + $("#y1AxisDiff").removeAttr("checked"); + $("#y2AxisDiff").prop("checked", true); + $('#series1Y2').removeAttr('disabled'); + $('#series2Y2').removeAttr('disabled'); + $('#series1Y1').attr("disabled", true); + $('#series2Y1').attr("disabled", true); + createNewDerivedSeriesName(2); + } + } + + + }, + close: function () { + } + }); + $("#listdt").jqGrid('navButtonAdd', '#pagerdt', { caption: "Add Derived Curve", title: "Add Derived Curve", @@ -7567,13 +7876,13 @@ function initPage() { if (currentTab === 'Roc' || currentTab === 'Rely' || currentTab === 'Ens_ss' || currentTab === 'Perf' || currentTab === "Hist" || currentTab === "Eclv" || currentTab === "Contour") { - $("#unavailableDiffCurveDialogForm").dialog("open"); + unavailableDiffCurveDialogForm.dialog("open"); } else { var allSeries = $("#listdt").jqGrid('getRowData'); if (allSeries.length > 1) { addDiffCurveDialogForm.dialog("open"); } else { - $("#incorrectDiffCurveDialogForm").dialog("open"); + incorrectDiffCurveDialogForm.dialog("open"); } } } @@ -7657,7 +7966,57 @@ function initPage() { $(idSelector).find(".ui-jqdialog-titlebar-close").focus(); } } - }).jqGrid('navButtonAdd', '#pagerdt', { + }) + + .jqGrid('navButtonAdd', '#pagerdt', { + caption: "Add Line", + title: "Add Line", + buttonicon: "ui-icon-plus", + onClickButton: function () { + if (currentTab === 'Perf' || currentTab === "Taylor" || currentTab === "Contour") { + unavailableLineDialogForm.dialog("open"); + } else { + addLineDialogForm.dialog("open"); + } + } + }) + .jqGrid('navButtonAdd', '#pagerdt', { + caption: "Remove Line", + title: "Remove Line", + buttonicon: "ui-icon-trash", + onClickButton: function () { + var sr = $(this).jqGrid('getGridParam', 'selrow'); + if (sr) { + var rowData = $(this).getRowData(sr); + if (rowData.title.startsWith("vert_line") + || rowData.title.startsWith("horiz_line")) { + $(this).jqGrid('delRowData', sr); + var index_to_remove = null + for (var i=0; i< lines.length; i++){ + var title = rowData.title; + var type = title.split('(')[0]; + var linePos =title.split('(')[1].split(')')[0]; + if(lines[i].type === type && lines[i].line_pos === linePos ){ + index_to_remove =i; + break; + } + } + if(index_to_remove !== null){ + lines.splice(index_to_remove, 1); + } + } + } else { + var idSelector = "#alertmod_" + this.p.id; + $.jgrid.viewModal(idSelector, { + gbox: "#gbox_" + $.jgrid.jqID(this.p.id), + jqm: true + }); + $(idSelector).find(".ui-jqdialog-titlebar-close").focus(); + } + } + }) + + .jqGrid('navButtonAdd', '#pagerdt', { caption: "Apply defaults", title: "Apply defaults", buttonicon: "ui-icon-transferthick-e-w", @@ -7667,26 +8026,38 @@ function initPage() { }); $("#listdt").setGridWidth($(window).width() - 20); - $("#unavailableDiffCurveDialogForm").dialog({ + var unavailableDiffCurveDialogForm = $("#unavailableDiffCurveDialogForm").dialog({ autoOpen: false, height: "auto", width: "auto", modal: true, buttons: { Ok: function () { - $(this).dialog("close"); + unavailableDiffCurveDialogForm.dialog("close"); } } }); - $("#incorrectDiffCurveDialogForm").dialog({ + var unavailableLineDialogForm = $("#unavailableLineDialogForm").dialog({ autoOpen: false, height: "auto", width: "auto", modal: true, buttons: { Ok: function () { - $(this).dialog("close"); + unavailableLineDialogForm.dialog("close"); + } + } + }); + + var incorrectDiffCurveDialogForm = $("#incorrectDiffCurveDialogForm").dialog({ + autoOpen: false, + height: "auto", + width: "auto", + modal: true, + buttons: { + Ok: function () { + incorrectDiffCurveDialogForm.dialog("close"); } } }); diff --git a/webapp/metviewer/js/metviewer_common.min.js b/webapp/metviewer/js/metviewer_common.min.js index 5c2fdee8..fbea19e9 100644 --- a/webapp/metviewer/js/metviewer_common.min.js +++ b/webapp/metviewer/js/metviewer_common.min.js @@ -28,231 +28,235 @@ 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=[]; -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=[]} -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="",e=0;e',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'+a+""+b+"",error:function(a,b,c){},success:function(a){a=$(a).find("val");for(var b=0;b'+b+ +function updateStatVariable(){$("#listdt").jqGrid("clearGridData");var a=$("#fcst_var_y1_1");var b=$("#indy_var_val");a.empty();try{a.multiselect("refresh")}catch(e){}b.empty();try{b.multiselect("refresh")}catch(e){}var d=fixed_var_indexes.slice();for(b=0;b'+b+ "FCST_VAR",error:function(){},success:function(b){var c=$(b).find("val");if(0",{value:h,text:h,title:value_to_desc_map[e.text()]});b.push(e)}else 0!=d&&e.text()===$(c[d-1]).text()&&b[b.length-1].text(b[b.length-1].text()+"*")}e=$("input[name='multiselect_database']:checked").length-1;for(d=0;d< -b.length;d++)b[d].text()!==b[d][0].value&&(c=b[d].text().substring(b[d][0].value.length,b[d].text().length).length,c===e?b[d].text(b[d][0].value+"*"):b[d].text(b[d][0].value)),b[d].appendTo(a);try{a.multiselect("refresh")}catch(k){}updateStatVal()}}})} -function updateForecastVariables(){$("#listdt").jqGrid("clearGridData");(selected_mode=$("#plot_data").multiselect("getChecked").val())||(selected_mode="stat");var a=$("#fcst_var_y1_1"),b=$("#fcst_var_y2_1");var e=$("#indy_var_val");a.empty();try{a.multiselect("refresh")}catch(c){}b.empty();try{b.multiselect("refresh")}catch(c){}e.empty();try{e.multiselect("refresh")}catch(c){}for(e=1;e'+e+"<"+selected_mode+"_field>FCST_VAR",error:function(){},success:function(d){var e=$(d).find("val");if(0",{value:k,text:k,title:value_to_desc_map[h.text()]});d.push(h)}else 0!==c&&h.text()===$(e[c-1]).text()&&d[d.length-1].text(d[d.length- -1].text()+"*")}h=$("input[name='multiselect_database']:checked").length-1;for(c=0;c'+d+"<"+selected_mode+"_field>FCST_VAR",error:function(){},success:function(c){var d=$(c).find("val");if(0",{value:l,text:l,title:value_to_desc_map[h.text()]});c.push(h)}else 0!==e&&h.text()===$(d[e-1]).text()&&c[c.length-1].text(c[c.length- +1].text()+"*")}h=$("input[name='multiselect_database']:checked").length-1;for(e=0;e",{value:g,text:g,title:value_to_desc_map[g],selected:h});g.appendTo(d)}try{d.multiselect("option","noneSelectedText","Select ratio stat"),d.multiselect("refresh")}catch(q){}var k= -$("#fcst_stat_mode_"+a+"_"+b),n="",m="";0",{value:g,text:g,title:value_to_desc_map[g],selected:h}),g.appendTo(k);k.multiselect({multiple:!1,selectedList:1,header:!1,minWidth:225,height:300,noneSelectedText:"Select attribute stat",allUnselected:!e,click:function(a, +function updateMode(a,b,d){var e=$("#fcst_stat_"+a+"_"+b);e.empty();var c;try{var f=$("#fcst_var_"+a+"_"+b).multiselect("getChecked").val()}catch(q){f=$("#fcst_var_"+a+"_"+b+" option:first-child").val()}for(c=0;c",{value:g,text:g,title:value_to_desc_map[g],selected:h});g.appendTo(e)}try{e.multiselect("option","noneSelectedText","Select ratio stat"),e.multiselect("refresh")}catch(q){}var l= +$("#fcst_stat_mode_"+a+"_"+b),p="",m="";0",{value:g,text:g,title:value_to_desc_map[g],selected:h}),g.appendTo(l);l.multiselect({multiple:!1,selectedList:1,header:!1,minWidth:225,height:300,noneSelectedText:"Select attribute stat",allUnselected:!d,click:function(a, b){a=this.id.split("_");$("#fcst_stat_"+a[a.length-2]+"_"+a[a.length-1]+" option").removeAttr("selected");try{$("#fcst_stat_"+a[a.length-2]+"_"+a[a.length-1]).multiselect("refresh")}catch(u){}a=$("#fcst_stat_mode_config_"+a[a.length-2]+"_"+a[a.length-1]);a.css("display","block");"ACOV"==b.value?a.find(".non-acov").attr("disabled",!0):a.find(".non-acov").removeAttr("disabled");-1'+b+"")});try{d.multiselect("refresh")}catch(q){}} -function updateMtd(a,b,e){var d=$("#fcst_stat_"+a+"_"+b);d.empty();var c;try{var f=$("#fcst_var_"+a+"_"+b).multiselect("getChecked").val()}catch(q){f=$("#fcst_var_"+a+"_"+b+" option:first-child").val()}for(c=0;c",{value:g,text:g,title:value_to_desc_map[g],selected:h});g.appendTo(d)}try{d.multiselect("option","noneSelectedText","Select ratio stat"),d.multiselect("refresh")}catch(q){}var k= -$("#fcst_stat_mode_"+a+"_"+b),n="",m="";if(0",{value:g,text:g,title:value_to_desc_map[g],selected:h}),g.appendTo(k);k.multiselect({multiple:!1,selectedList:1,header:!1,minWidth:225,height:300,noneSelectedText:"Select attribute stat",allUnselected:!e,click:function(a, +!1),c.find('[name="mode_stat_cluster"]').prop("checked",!0)),"A"==m[2]?(c.find('[name="mode_stat_matched"]').prop("checked",!0),c.find('[name="mode_stat_unmatched"]').prop("checked",!0)):"M"==m[2]?(c.find('[name="mode_stat_matched"]').prop("checked",!0),c.find('[name="mode_stat_unmatched"]').prop("checked",!1)):"U"==m[2]&&(c.find('[name="mode_stat_matched"]').prop("checked",!1),c.find('[name="mode_stat_unmatched"]').prop("checked",!0))),-1'+b+"")});try{e.multiselect("refresh")}catch(q){}} +function updateMtd(a,b,d){var e=$("#fcst_stat_"+a+"_"+b);e.empty();var c;try{var f=$("#fcst_var_"+a+"_"+b).multiselect("getChecked").val()}catch(q){f=$("#fcst_var_"+a+"_"+b+" option:first-child").val()}for(c=0;c",{value:g,text:g,title:value_to_desc_map[g],selected:h});g.appendTo(e)}try{e.multiselect("option","noneSelectedText","Select ratio stat"),e.multiselect("refresh")}catch(q){}var l= +$("#fcst_stat_mode_"+a+"_"+b),p="",m="";if(0",{value:g,text:g,title:value_to_desc_map[g],selected:h}),g.appendTo(l);l.multiselect({multiple:!1,selectedList:1,header:!1,minWidth:225,height:300,noneSelectedText:"Select attribute stat",allUnselected:!d,click:function(a, b){a=this.id.split("_");$("#fcst_stat_"+a[a.length-2]+"_"+a[a.length-1]+" option").removeAttr("selected");try{$("#fcst_stat_"+a[a.length-2]+"_"+a[a.length-1]).multiselect("refresh")}catch(u){}a=$("#fcst_stat_mode_config_"+a[a.length-2]+"_"+a[a.length-1]);a.css("display","block");a.find(".non-acov").removeAttr("disabled");-1'+b+"")});try{d.multiselect("refresh")}catch(q){}} -function updateStatVal(){var a=getSelectedDatabases();if(a){var b=$("#fcst_var_y1_1").multiselect("getChecked").val();$("#fcst_stat_y1_1").empty();var e=$("#fcst_stat_y1_1");b&&(b=b.replace("&","&").replace(">",">").replace("<","<"));e.empty();$.ajax({async:!1,url:"servlet",type:"POST",dataType:"xml",contentType:"application/xml",data:''+a+""+b+"",error:function(){}, -success:function(a){var b=$(a).find("val");a=[];if(0",{value:h,text:h,title:value_to_desc_map[g.text()]});a.push(g)}else 0!=d&&g.text()===$(b[d-1]).text()&&a[a.length-1].text(a[a.length-1].text()+"*")}g=$("input[name='multiselect_database']:checked").length-1;for(d=0;d",{value:"N/A",text:"N/A"}),g.appendTo(e);try{e.multiselect("refresh")}catch(k){console.log(k)}updateSeries()}})}} -function updateStats(a,b,e){var d=$("#fcst_stat_"+a+"_"+b),c=$("#fcst_stat_mode_"+a+"_"+b),f=$("#plot_data").multiselect("getChecked").val(),g=getSelectedDatabases();if(g){try{var h=$("#fcst_var_"+a+"_"+b).multiselect("getChecked").val()}catch(n){h=$("#fcst_var_"+a+"_"+b+" option:first-child").val()}if("stat"===f){d.empty();try{c.multiselect("destroy")}catch(n){}c.css("display","none");$("#fcst_stat_mode_config_"+a+"_"+b).css("display","none");try{d.multiselect("option","noneSelectedText","Select attribute stat")}catch(n){d.prop("disabled", -"disabled")}}else if(f){try{c.multiselect("enable")}catch(n){c.prop("disabled","")}try{d.multiselect("option","noneSelectedText","Select ratio stat")}catch(n){d.prop("disabled","disabled")}}else{d.empty();try{d.multiselect("option","noneSelectedText","Select value")}catch(n){d.prop("disabled","disabled")}}if("N/A"===h)try{d.multiselect("disable")}catch(n){d.prop("disabled","disabled")}else{try{d.multiselect("enable")}catch(n){d.prop("disabled","")}h&&(h=h.replace("&","&").replace(">",">").replace("<", -"<"));$.ajax({async:!1,url:"servlet",type:"POST",dataType:"xml",contentType:"application/xml",data:''+g+""+h+"",error:function(){},success:function(a){var b=$(a).find("val");a=[];if(0",{value:k,text:k, -title:value_to_desc_map[f.text()],selected:g});a.push(g)}else 0!=c&&f.text()===$(b[c-1]).text()&&a[a.length-1].text(a[a.length-1].text()+"*")}g=$("input[name='multiselect_database']:checked").length-1;for(c=0;c",{value:"N/A",text:"N/A"}),g.appendTo(d);try{d.multiselect("refresh")}catch(x){}e= -[]}})}var k=$("#series_var_"+a+"_"+b);k.empty();$.each(series_var_value_to_title_stat_map,function(a,b){k.append('")});try{k.multiselect("refresh")}catch(n){}}} -function updateSeriesVarValEns(a,b){$("#listdt").jqGrid("clearGridData");var e=$("#series_var_val_y1_"+a);e.empty();var d=getSelectedDatabases();if(d){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:''+d+""+c+'', -error:function(){},success:function(d){seriesY1VarValResponse[a]=d;var c=$(d).find("val");d=[];if(0",{value:k,text:k,selected:n}),d.push(n)):0!=f&&k.text()===$(c[f-1]).text()&&d[d.length-1].text(d[d.length-1].text()+"*")}n=$("input[name='multiselect_database']:checked").length-1;for(f=0;f",{value:"N/A",text:"N/A"});n.appendTo(e);try{e.multiselect("refresh")}catch(m){}}b=[]}})}} -function updateSeriesVarVal(a,b,e){var d=$("#series_var_val_"+a+"_"+b);d.empty();var c=getSelectedDatabases();if(c){if("Perf"===currentTab){var f="perf";var g=""}else f="Taylor"===currentTab?"taylor":$("#plot_data").multiselect("getChecked").val(),g=convertVarsAndStatsToXml();try{var h=$("#series_var_"+a+"_"+b).multiselect("getChecked").val()}catch(k){h=$("#series_var_"+a+"_"+b).find("option:first-child").val()}"undefined"!==typeof h&&$.ajax({async:!1,url:"servlet",type:"POST",data:''+ -c+"<"+f+"_field>"+h+""+g+"",dataType:"xml",processData:!1,contentType:"application/xml",error:function(){},success:function(c){"y1"===a?seriesY1VarValResponse[b]=c:seriesY2VarValResponse[b]=c;var f=$(c).find("val");c=[];if(0").replace("<","<").replace("&","&")===e:0<=$.inArray(k.text().replace(">",">").replace("<","<").replace("&", -"&"),e);0===g||0!==g&&k.text()!==$(f[g-1]).text()?(h=$("