From ca8c24f103f026cf8e891cbf9c1dfcbbcc6725b0 Mon Sep 17 00:00:00 2001 From: TatianaBurek Date: Thu, 10 Feb 2022 14:42:53 -0700 Subject: [PATCH 1/6] Add the Python implementation of the Taylor diagram #370 --- java/edu/ucar/metviewer/MVPlotJob.java | 11 + java/edu/ucar/metviewer/MVPlotJobParser.java | 48 +- .../ucar/metviewer/jobManager/JobManager.java | 23 +- webapp/metviewer/js/metviewer_common.js | 252 ++++++++- webapp/metviewer/js/metviewer_common.min.js | 504 +++++++++--------- webapp/metviewer/metviewer1.jsp | 29 +- 6 files changed, 584 insertions(+), 283 deletions(-) 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..fe2bdfff 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,30 @@ 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); + + job.setNormalizedHistogram(node.value.equalsIgnoreCase("true")); + + } // boolean format settings 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/webapp/metviewer/js/metviewer_common.js b/webapp/metviewer/js/metviewer_common.js index 518465cd..de0dbc63 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() { @@ -3454,6 +3455,16 @@ 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; + number_series++; + newSeriesData.push(series_formatting); + } + //set default color for each series if it is not a upload if (initXML == null) { @@ -3493,6 +3504,8 @@ function updateSeries(isCheckAll) { } + + if (currentTab === 'Contour') { newSeriesData.reverse(); } else { @@ -4169,6 +4182,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 +4329,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() + ")")); @@ -7559,6 +7594,135 @@ function initPage() { close: function () { } }); + + + + var addLineDialogForm = $("#addLineDialogForm").dialog({ + autoOpen: false, + height: "auto", + width: "auto", + modal: true, + buttons: { + "Add line": function () { + var valid = false; + valid = true; + var lineType = $("input[name='line_type']:checked").val(); + var linePos = $("#line_pos").val(); + var line = { + 'type': lineType, + 'line_pos': linePos + }; + lines.push(line); + + addLineDialogForm.dialog("close"); + if (valid) { + updateSeries(); + } + + }, + 'Cancel': function () { + addLineDialogForm.dialog("close"); + } + }, + open: function () { + + $("input[name=derive_oper][value=DIFF]").prop('checked', true); + var allSeries = $("#listdt").jqGrid('getRowData'); + for (var i = 0; i < allSeries.length; i++) { + $("#listdt").jqGrid('setCell', allSeries[i].id, 'order', i + 1); + $("#listdt").jqGrid('getLocalRow', allSeries[i].id).order = i + 1; + } + var selected_mode = $("#plot_data").multiselect("getChecked").val(); + $('#series1Y2').empty(); + $('#series1Y1').empty(); + $('#series2Y2').empty(); + $('#series2Y1').empty(); + + $("#y1AxisDiff").prop("checked", true); + $("#y2AxisDiff").removeAttr("checked"); + + $('#series1Y2').prop("disabled", true); + $('#series2Y2').prop("disabled", true); + $('#series1Y1').removeProp('disabled'); + $('#series2Y1').removeProp('disabled'); + $('#y2AxisDiff').removeProp("disabled"); + $('#y1AxisDiff').removeProp("disabled"); + series1Names = []; + series2Names = []; + + + for (var i = 0; i < allSeries.length; i++) { + var isInclude = false; + if (allSeries[i].title.indexOf('DIFF') != 0 + && allSeries[i].title.indexOf('RATIO') != 0 + && allSeries[i].title.indexOf('SS') != 0 + && allSeries[i].title.indexOf('ETB') != 0) { + // curve can be included ONLY if it is MODE Ratio stat or any of Stat stats + if (selected_mode == "mode") { + var desc = allSeries[i].title.split(" "); + if (listStatModeRatio.indexOf(desc[desc.length - 1]) > -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", @@ -7657,7 +7821,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-plus", + 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", diff --git a/webapp/metviewer/js/metviewer_common.min.js b/webapp/metviewer/js/metviewer_common.min.js index 5c2fdee8..bdfed4ca 100644 --- a/webapp/metviewer/js/metviewer_common.min.js +++ b/webapp/metviewer/js/metviewer_common.min.js @@ -28,231 +28,232 @@ 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=[]; +[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=[]; 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'+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),n="",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, +!0):c.find(".non-pair").removeAttr("disabled"));if("N/A"===f){try{e.multiselect("disable")}catch(q){}try{l.multiselect("disable")}catch(q){}}else{try{e.multiselect("enable")}catch(q){}try{l.multiselect("enable")}catch(q){}}e=$("#series_var_"+a+"_"+b);e.empty();$.each(fix_var_value_to_title_mode_map,function(a,b){e.append('")});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),n="",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=$("