Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion METexpress
Submodule METexpress updated 1 files
+1 −1 MATScommon
36 changes: 22 additions & 14 deletions apps/scorecard/server/dataFunctions/processScorecard.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/* eslint-disable no-shadow */
/* eslint-disable no-console */
/* eslint-disable no-await-in-loop */
import { Meteor } from "meteor/meteor";
import { matsTypes, matsParamUtils, matsCollections } from "meteor/randyp:mats-common";
import { fetch } from "meteor/fetch";
Expand Down Expand Up @@ -227,7 +228,8 @@ global.processScorecard = async function (plotParams) {
scorecardDocument.results.blocks = {};
scorecardDocument.queryMap.blocks = {};
// fill in the blocks - these are all initially default values
plotParams.curves.forEach(async function (curve) {
for (let cidx = 0; cidx < plotParams.curves.length; cidx += 1) {
const curve = plotParams.curves[cidx];
/**
* Here we are going to pre-load as much as possible for the queries, *before*
* we start with the hideous 6th degree loop. This will include:
Expand Down Expand Up @@ -399,19 +401,22 @@ global.processScorecard = async function (plotParams) {
: scorecardCurve.threshold;
scorecardCurve.level =
scorecardCurve.level === undefined ? ["level_NA"] : scorecardCurve.level;
regions.forEach(function (regionText) {
for (let ridx = 0; ridx < regions.length; ridx += 1) {
const regionText = regions[ridx];
const region = sanitizeKeys(regionText);
if (scorecardDocument.results.blocks[label].data[region] === undefined) {
scorecardDocument.results.blocks[label].data[region] = {};
scorecardDocument.queryMap.blocks[label].data[region] = {};
}
scorecardCurve.statistic.forEach(function (statText) {
for (let sidx = 0; sidx < scorecardCurve.statistic.length; sidx += 1) {
const statText = scorecardCurve.statistic[sidx];
const stat = sanitizeKeys(statText);
if (scorecardDocument.results.blocks[label].data[region][stat] === undefined) {
scorecardDocument.results.blocks[label].data[region][stat] = {};
scorecardDocument.queryMap.blocks[label].data[region][stat] = {};
}
scorecardCurve.variable.forEach(function (variableText) {
for (let vidx = 0; vidx < scorecardCurve.variable.length; vidx += 1) {
const variableText = scorecardCurve.variable[vidx];
const variable = sanitizeKeys(variableText);
if (
scorecardDocument.results.blocks[label].data[region][stat][variable] ===
Expand All @@ -420,7 +425,8 @@ global.processScorecard = async function (plotParams) {
scorecardDocument.results.blocks[label].data[region][stat][variable] = {};
scorecardDocument.queryMap.blocks[label].data[region][stat][variable] = {};
}
scorecardCurve.threshold.forEach(function (thresholdText) {
for (let tidx = 0; tidx < scorecardCurve.threshold.length; tidx += 1) {
const thresholdText = scorecardCurve.threshold[tidx];
const threshold = sanitizeKeys(thresholdText);
if (
scorecardDocument.results.blocks[label].data[region][stat][variable][
Expand All @@ -434,7 +440,8 @@ global.processScorecard = async function (plotParams) {
threshold
] = {};
}
scorecardCurve.level.forEach(function (levelText) {
for (let lidx = 0; lidx < scorecardCurve.level.length; lidx += 1) {
const levelText = scorecardCurve.level[lidx];
const level = sanitizeKeys(levelText);
if (
scorecardDocument.results.blocks[label].data[region][stat][variable][
Expand All @@ -448,7 +455,8 @@ global.processScorecard = async function (plotParams) {
threshold
][level] = {};
}
fcstLengths.forEach(function (fcstlenText) {
for (let fidx = 0; fidx < fcstLengths.length; fidx += 1) {
const fcstlenText = fcstLengths[fidx];
const fcstlen = sanitizeKeys(fcstlenText);

// make deep copy of query template
Expand Down Expand Up @@ -577,13 +585,13 @@ global.processScorecard = async function (plotParams) {
threshold
][level][fcstlen] = "undefined";
}
});
});
});
});
});
});
});
}
}
}
}
}
}
}

// store the document
try {
Expand Down
218 changes: 140 additions & 78 deletions apps/surface/server/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -643,78 +643,6 @@ const doCurveParams = async function () {
}
}

const statOptionsMap = {
RMSE: "scalar",

"Bias (Model - Obs)": "scalar",

N: "scalar",

"Model average": "scalar",

"Obs average": "scalar",

"Std deviation": "scalar",

"MAE (temp and dewpoint only)": "scalar",
};

if (
(await matsCollections.statistic.findOneAsync({ name: "statistic" })) === undefined
) {
await matsCollections.statistic.insertAsync({
name: "statistic",
type: matsTypes.InputTypes.select,
optionsMap: statOptionsMap,
options: Object.keys(statOptionsMap),
controlButtonCovered: true,
unique: false,
default: Object.keys(statOptionsMap)[0],
controlButtonVisibility: "block",
displayOrder: 2,
displayPriority: 1,
displayGroup: 3,
});
}

if (
(await matsCollections["x-statistic"].findOneAsync({ name: "x-statistic" })) ===
undefined
) {
await matsCollections["x-statistic"].insertAsync({
name: "x-statistic",
type: matsTypes.InputTypes.select,
optionsMap: statOptionsMap,
options: Object.keys(statOptionsMap),
controlButtonCovered: true,
unique: false,
default: Object.keys(statOptionsMap)[0],
controlButtonVisibility: "block",
displayOrder: 4,
displayPriority: 1,
displayGroup: 2,
});
}

if (
(await matsCollections["y-statistic"].findOneAsync({ name: "y-statistic" })) ===
undefined
) {
await matsCollections["y-statistic"].insertAsync({
name: "y-statistic",
type: matsTypes.InputTypes.select,
optionsMap: statOptionsMap,
options: Object.keys(statOptionsMap),
controlButtonCovered: true,
unique: false,
default: Object.keys(statOptionsMap)[0],
controlButtonVisibility: "block",
displayOrder: 4,
displayPriority: 1,
displayGroup: 3,
});
}

const statVarOptionsMap = {
// THIS IS KEYED BY REGION-TYPE BECAUSE OUR MYSQL OBS TABLE DOESN'T HAVE RH
// FOR SOME REASON OR OTHER, SO IT NEEDS TO BE EXCLUDED AS A VARIABLE
Expand Down Expand Up @@ -760,6 +688,8 @@ const doCurveParams = async function () {
"m0.sum_ob_ws",
"0",
],
"U-Wind Speed at 10m (m/s)": ["0", "m0.N_dw", "m0.sum_du", "0", "0", "0"],
"V-Wind Speed at 10m (m/s)": ["0", "m0.N_dw", "m0.sum_dv", "0", "0", "0"],
},
"Select stations": {
"Temperature at 2m (°C)": [
Expand All @@ -786,6 +716,22 @@ const doCurveParams = async function () {
"(if(m0.ws is not null,o.ws,null))",
"(abs(o.ws - m0.ws))",
],
"U-Wind Speed at 10m (m/s)": [
"0",
"(o.ws + m0.ws)",
"(o.ws*sin(o.wd/57.2658) - m0.ws*sin(m0.wd/57.2658))",
"0",
"0",
"0",
],
"V-Wind Speed at 10m (m/s)": [
"0",
"(o.ws + m0.ws)",
"(o.ws*cos(o.wd/57.2658) - m0.ws*cos(m0.wd/57.2658))",
"0",
"0",
"0",
],
},
};

Expand All @@ -801,12 +747,16 @@ const doCurveParams = async function () {
"Relative Humidity at 2m (%)": "RH (%)",
"Dewpoint at 2m (°C)": "°C",
"Wind Speed at 10m (m/s)": "m/s",
"U-Wind Speed at 10m (m/s)": "m/s",
"V-Wind Speed at 10m (m/s)": "m/s",
},
N: {
"Temperature at 2m (°C)": "Number",
"Relative Humidity at 2m (%)": "Number",
"Dewpoint at 2m (°C)": "Number",
"Wind Speed at 10m (m/s)": "Number",
"U-Wind Speed at 10m (m/s)": "Number",
"V-Wind Speed at 10m (m/s)": "Number",
},
"Model average": {
"Temperature at 2m (°C)": "°C",
Expand Down Expand Up @@ -834,6 +784,9 @@ const doCurveParams = async function () {
},
};

const defaultVariableOptions = Object.keys(statVarOptionsMap["Predefined region"]);
const defaultVariable = defaultVariableOptions[0];

if (
(await matsCollections.variable.findOneAsync({ name: "variable" })) === undefined
) {
Expand All @@ -842,11 +795,12 @@ const doCurveParams = async function () {
type: matsTypes.InputTypes.select,
superiorNames: ["region-type"],
optionsMap: statVarOptionsMap,
dependentNames: ["statistic"],
statVarUnitMap,
options: Object.keys(statVarOptionsMap["Predefined region"]),
options: defaultVariableOptions,
controlButtonCovered: true,
unique: false,
default: Object.keys(statVarOptionsMap["Predefined region"])[0],
default: defaultVariable,
controlButtonVisibility: "block",
displayOrder: 3,
displayPriority: 1,
Expand All @@ -863,11 +817,12 @@ const doCurveParams = async function () {
type: matsTypes.InputTypes.select,
superiorNames: ["region-type"],
optionsMap: statVarOptionsMap,
dependentNames: ["x-statistic"],
statVarUnitMap,
options: Object.keys(statVarOptionsMap["Predefined region"]),
options: defaultVariableOptions,
controlButtonCovered: true,
unique: false,
default: Object.keys(statVarOptionsMap["Predefined region"])[0],
default: defaultVariable,
controlButtonVisibility: "block",
displayOrder: 5,
displayPriority: 1,
Expand All @@ -884,18 +839,125 @@ const doCurveParams = async function () {
type: matsTypes.InputTypes.select,
superiorNames: ["region-type"],
optionsMap: statVarOptionsMap,
dependentNames: ["y-statistic"],
statVarUnitMap,
options: Object.keys(statVarOptionsMap["Predefined region"]),
options: defaultVariableOptions,
controlButtonCovered: true,
unique: false,
default: Object.keys(statVarOptionsMap["Predefined region"])[0],
default: defaultVariable,
controlButtonVisibility: "block",
displayOrder: 5,
displayPriority: 1,
displayGroup: 3,
});
}

const statOptionsMap = {
"Temperature at 2m (°C)": {
RMSE: "scalar",
"Bias (Model - Obs)": "scalar",
N: "scalar",
"Model average": "scalar",
"Obs average": "scalar",
"Std deviation": "scalar",
"MAE (temp and dewpoint only)": "scalar",
},
"Relative Humidity at 2m (%)": {
RMSE: "scalar",
"Bias (Model - Obs)": "scalar",
N: "scalar",
"Model average": "scalar",
"Obs average": "scalar",
"Std deviation": "scalar",
"MAE (temp and dewpoint only)": "scalar",
},
"Dewpoint at 2m (°C)": {
RMSE: "scalar",
"Bias (Model - Obs)": "scalar",
N: "scalar",
"Model average": "scalar",
"Obs average": "scalar",
"Std deviation": "scalar",
"MAE (temp and dewpoint only)": "scalar",
},
"Wind Speed at 10m (m/s)": {
RMSE: "scalar",
"Bias (Model - Obs)": "scalar",
N: "scalar",
"Model average": "scalar",
"Obs average": "scalar",
"Std deviation": "scalar",
"MAE (temp and dewpoint only)": "scalar",
},
"U-Wind Speed at 10m (m/s)": {
"Bias (Model - Obs)": "scalar",
N: "scalar",
},
"V-Wind Speed at 10m (m/s)": {
"Bias (Model - Obs)": "scalar",
N: "scalar",
},
};

if (
(await matsCollections.statistic.findOneAsync({ name: "statistic" })) === undefined
) {
await matsCollections.statistic.insertAsync({
name: "statistic",
type: matsTypes.InputTypes.select,
optionsMap: statOptionsMap,
options: Object.keys(statOptionsMap[defaultVariable]),
superiorNames: ["variable"],
controlButtonCovered: true,
unique: false,
default: Object.keys(statOptionsMap[defaultVariable])[0],
controlButtonVisibility: "block",
displayOrder: 2,
displayPriority: 1,
displayGroup: 3,
});
}

if (
(await matsCollections["x-statistic"].findOneAsync({ name: "x-statistic" })) ===
undefined
) {
await matsCollections["x-statistic"].insertAsync({
name: "x-statistic",
type: matsTypes.InputTypes.select,
optionsMap: statOptionsMap,
options: Object.keys(statOptionsMap[defaultVariable]),
superiorNames: ["x-variable"],
controlButtonCovered: true,
unique: false,
default: Object.keys(statOptionsMap[defaultVariable])[0],
controlButtonVisibility: "block",
displayOrder: 4,
displayPriority: 1,
displayGroup: 2,
});
}

if (
(await matsCollections["y-statistic"].findOneAsync({ name: "y-statistic" })) ===
undefined
) {
await matsCollections["y-statistic"].insertAsync({
name: "y-statistic",
type: matsTypes.InputTypes.select,
optionsMap: statOptionsMap,
options: Object.keys(statOptionsMap[defaultVariable]),
superiorNames: ["y-variable"],
controlButtonCovered: true,
unique: false,
default: Object.keys(statOptionsMap[defaultVariable])[0],
controlButtonVisibility: "block",
displayOrder: 4,
displayPriority: 1,
displayGroup: 3,
});
}

if ((await matsCollections.truth.findOneAsync({ name: "truth" })) === undefined) {
await matsCollections.truth.insertAsync({
name: "truth",
Expand Down
Loading