From e131c056a84454e3c3ce0b41a6e8af63a82415a2 Mon Sep 17 00:00:00 2001 From: Lee Zeman Date: Wed, 21 Feb 2018 15:15:14 -0800 Subject: [PATCH] Stop requiring a monthly dataset for Annual Cycle Graphs --- .../AnnualCycleGraph/AnnualCycleGraph.js | 17 ++-- src/components/graphs/DualAnnualCycleGraph.js | 78 +++++++++---------- .../graphs/SingleAnnualCycleGraph.js | 29 +++---- 3 files changed, 63 insertions(+), 61 deletions(-) diff --git a/src/components/graphs/AnnualCycleGraph/AnnualCycleGraph.js b/src/components/graphs/AnnualCycleGraph/AnnualCycleGraph.js index c87de6e2..1bbe0c43 100644 --- a/src/components/graphs/AnnualCycleGraph/AnnualCycleGraph.js +++ b/src/components/graphs/AnnualCycleGraph/AnnualCycleGraph.js @@ -34,7 +34,7 @@ export default class AnnualCycleGraph extends React.Component { // TODO: model_id, variable_id, and experiment are used only to set the // initial instance. Could instead make `initialInstance` a prop, which // the client computes according to their own recipe. Not sure whether - // this is a gain or not, since the same computation (`firstMonthlyMetadata`) + // this is a gain or not, since the same computation (`initialInstance`) // would be done in each client. static propTypes = { meta: PropTypes.array, @@ -58,17 +58,22 @@ export default class AnnualCycleGraph extends React.Component { super(props); const { start_date, end_date, ensemble_member } = - this.firstMonthlyMetadata(this.props); + this.initialInstance(this.props); this.state = { instance: { start_date, end_date, ensemble_member }, graphSpec: blankGraphSpec, }; } - firstMonthlyMetadata({ meta, model_id, variable_id, experiment }) { - return _.findWhere( - meta, - { model_id, variable_id, experiment, timescale: 'monthly' } + initialInstance({ meta, model_id, variable_id, experiment }) { + //selects a starting instance, preferring the highest-resolution data available. + return ( + _.findWhere(meta, + { model_id, variable_id, experiment, timescale: 'monthly' }) || + _.findWhere(meta, + { model_id, variable_id, experiment, timescale: 'seasonal' }) || + _.findWhere(meta, + { model_id, variable_id, experiment, timescale: 'yearly' }) ); } diff --git a/src/components/graphs/DualAnnualCycleGraph.js b/src/components/graphs/DualAnnualCycleGraph.js index dfcc18c3..b026c3a5 100644 --- a/src/components/graphs/DualAnnualCycleGraph.js +++ b/src/components/graphs/DualAnnualCycleGraph.js @@ -11,8 +11,10 @@ import AnnualCycleGraph from './AnnualCycleGraph'; export default function DualAnnualCycleGraph(props) { function getMetadata(instance) { + console.log("starting getMetadata"); + // Find and return metadata matching model_id, experiment, variable_id - // and instance (start_date, end_date, ensemble_name) for monthly, seasonal + // and instance (start_date, end_date, ensemble_member) for monthly, seasonal // and annual timescales. // Do the the same for comparand_id and comparandMeta. @@ -22,49 +24,43 @@ export default function DualAnnualCycleGraph(props) { comparand_id, comparandMeta, } = props; + var findMetadataForInstance = function (variable, timeres, metadataList) { + return _.findWhere(metadataList, { + model_id, experiment, + ...instance, + timescale: timeres, + variable_id: variable + }); + } + // Set up metadata sets for variable - const monthlyVariableMetadata = _.findWhere(meta, { - model_id, experiment, variable_id, - ...instance, - timescale: 'monthly', - }); - const seasonalVariablelMetadata = findMatchingMetadata( - monthlyVariableMetadata, { timescale: 'seasonal' }, meta - ); - const yearlyVariableMetadata = findMatchingMetadata( - monthlyVariableMetadata, { timescale: 'yearly' }, meta - ); - - let metadataSets = [ + const monthlyVariableMetadata = findMetadataForInstance(variable_id, 'monthly', meta); + const seasonalVariableMetadata = findMetadataForInstance(variable_id, 'seasonal', meta); + const yearlyVariableMetadata = findMetadataForInstance(variable_id, 'yearly', meta); + + let metadataSets =[ monthlyVariableMetadata, - seasonalVariablelMetadata, + seasonalVariableMetadata, yearlyVariableMetadata, ]; - // Extend metadata sets with comparand, if present and different from variable - const monthlyComparandMetadata = findMatchingMetadata( - monthlyVariableMetadata, { variable_id: comparand_id }, comparandMeta - ); - - if ( - monthlyVariableMetadata && monthlyComparandMetadata && - monthlyComparandMetadata.unique_id !== monthlyVariableMetadata.unique_id - ) { - const seasonalComparandlMetadata = findMatchingMetadata( - monthlyComparandMetadata, { timescale: 'seasonal' }, comparandMeta - ); - const yearlyComparandMetadata = findMatchingMetadata( - monthlyComparandMetadata, { timescale: 'yearly' }, comparandMeta - ); - - metadataSets = metadataSets.concat([ - monthlyComparandMetadata, - seasonalComparandlMetadata, - yearlyComparandMetadata, - ]); - } - - return metadataSets; + // Extend metadata sets with comparand, if different from variable + // Include only comparand time resolutions present for the variable. + if(variable_id !== comparand_id) { + if(monthlyVariableMetadata) { + metadataSets = metadataSets.concat( + findMetadataForInstance(comparand_id, 'monthly', comparandMeta)); + } + if(seasonalVariableMetadata) { + metadataSets = metadataSets.concat( + findMetadataForInstance(comparand_id, 'seasonal', comparandMeta)); + } + if(yearlyVariableMetadata) { + metadataSets = metadataSets.concat( + findMetadataForInstance(comparand_id, 'yearly', comparandMeta)); + } + } + return _.compact(metadataSets); } function dataToGraphSpec(meta, data) { @@ -78,9 +74,9 @@ export default function DualAnnualCycleGraph(props) { // graph line colors. const sortByVariable = dataSeries => { const seriesName = dataSeries[0].toLowerCase(); - if (seriesName.search(props.variable_id) !== -1) { + if (seriesName.search(props.variable_id.toLowerCase()) !== -1) { return 0; - } else if (seriesName.search(props.comparand_id) !== -1) { + } else if (seriesName.search(props.comparand_id.toLowerCase()) !== -1) { return 1; } else { // if only one variable is selected, it won't be in any series names. diff --git a/src/components/graphs/SingleAnnualCycleGraph.js b/src/components/graphs/SingleAnnualCycleGraph.js index dcb42b10..b375c92a 100644 --- a/src/components/graphs/SingleAnnualCycleGraph.js +++ b/src/components/graphs/SingleAnnualCycleGraph.js @@ -17,23 +17,24 @@ export default function SingleAnnualCycleGraph(props) { model_id, experiment, variable_id, meta, } = props; + + var findMetadataForResolution = function (resolution) { + return _.findWhere(meta, { + model_id, experiment, variable_id, + ...instance, + timescale: resolution, + }); + } - const monthlyVariableMetadata = _.findWhere(meta, { - model_id, experiment, variable_id, - ...instance, - timescale: 'monthly', - }); - const seasonalVariablelMetadata = findMatchingMetadata( - monthlyVariableMetadata, { timescale: 'seasonal' }, meta - ); - const yearlyVariableMetadata = findMatchingMetadata( - monthlyVariableMetadata, { timescale: 'yearly' }, meta - ); - const metadataSets = [ + const monthlyVariableMetadata = findMetadataForResolution('monthly'); + const seasonalVariableMetadata = findMetadataForResolution('seasonal'); + const yearlyVariableMetadata = findMetadataForResolution('yearly'); + + const metadataSets = _.compact([ monthlyVariableMetadata, - seasonalVariablelMetadata, + seasonalVariableMetadata, yearlyVariableMetadata, - ]; + ]); return metadataSets; }