Mercurial > dive4elements > river
changeset 5914:1058b3436dad
D4E river artifacts: Removed historical discharge calculation from WINFO artifact and use access instead.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Tue, 07 May 2013 17:32:33 +0200 |
parents | 37a0f4f7c54f |
children | 4fafe8d147b2 |
files | artifacts/src/main/java/org/dive4elements/river/artifacts/WINFOArtifact.java artifacts/src/main/java/org/dive4elements/river/artifacts/access/HistoricalDischargeAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/Calculation6.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/Timerange.java artifacts/src/main/java/org/dive4elements/river/artifacts/states/HistoricalDischargeComputeState.java |
diffstat | 5 files changed, 148 insertions(+), 98 deletions(-) [+] |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/WINFOArtifact.java Tue May 07 12:47:05 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/WINFOArtifact.java Tue May 07 17:32:33 2013 +0200 @@ -28,7 +28,6 @@ import org.dive4elements.river.artifacts.model.Calculation3; import org.dive4elements.river.artifacts.model.Calculation4; import org.dive4elements.river.artifacts.model.Calculation5; -import org.dive4elements.river.artifacts.model.Calculation6; import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DischargeTables; @@ -536,29 +535,6 @@ } - public CalculationResult getHistoricalDischargeData() { - Gauge gauge = RiverUtils.getReferenceGauge(this); - String rawTimerange = getDataAsString("year_range"); - String rawValues = getDataAsString("historical_values"); - int mode = getDataAsInteger("historical_mode"); - - long[] timerange = RiverUtils.longArrayFromString(rawTimerange); - double[] values = RiverUtils.doubleArrayFromString(rawValues); - - Calendar start = new GregorianCalendar(); - start.setTimeInMillis(timerange[0]); - Calendar end = new GregorianCalendar(); - end.setTimeInMillis(timerange[1]); - - Calculation6 calc = new Calculation6( - mode, - new long[] { start.getTimeInMillis(), end.getTimeInMillis() }, - values); - - return calc.calculate(gauge); - } - - /** * Get corrected waterline against surface/profile. */ @@ -574,8 +550,6 @@ // Find W/C at km, linear naive approach. WQCKms triple = (WQCKms) wqckms[idx-1]; - int old_idx = 0; - if (triple.size() == 0) { logger.warn("Calculation of c/waterline is empty."); return Lines.createWaterLines(points, 0.0f);
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/access/HistoricalDischargeAccess.java Tue May 07 12:47:05 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/access/HistoricalDischargeAccess.java Tue May 07 17:32:33 2013 +0200 @@ -17,12 +17,23 @@ public class HistoricalDischargeAccess extends RiverAccess { public static enum EvaluationMode { - W, Q + W(0), Q(1); + + private final int mode; + + EvaluationMode(int mode) { + this.mode = mode; + } + + public int getMode() { + return mode; + } } public static final String DATA_EVALUATION_TIME = "year_range"; public static final String DATA_EVALUATION_MODE = "historical_mode"; - public static final String DATA_INPUT_VALUES = "historical_values"; + public static final String DATA_INPUT_VALUES = "historical_values"; + public static final String DATA_REFERENCE_GAUGE = "reference_gauge"; private Timerange evaluationTimerange; private EvaluationMode evaluationMode; @@ -30,6 +41,8 @@ private double[] qs; private double[] ws; + private Long officialGaugeNumber; + public HistoricalDischargeAccess(D4EArtifact artifact) { super(artifact); } @@ -51,6 +64,7 @@ return evaluationMode; } + /** * This method returns the time range specified by <i>year_range</i> * parameter. This parameter has to be a string that consists of two long @@ -67,6 +81,7 @@ Date end = new Date(startend[1]); evaluationTimerange = new Timerange(start, end); + evaluationTimerange.sort(); } } @@ -114,4 +129,11 @@ return ws; } + + public Long getOfficialGaugeNumber() { + if (officialGaugeNumber == null) { + officialGaugeNumber = getLong(DATA_REFERENCE_GAUGE); + } + return officialGaugeNumber; + } }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Calculation6.java Tue May 07 12:47:05 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Calculation6.java Tue May 07 17:32:33 2013 +0200 @@ -19,6 +19,9 @@ import org.dive4elements.river.model.Gauge; import org.dive4elements.river.model.TimeInterval; +import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess; +import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess.EvaluationMode; + /** * Historical Discharge Calculation. @@ -26,31 +29,84 @@ */ public class Calculation6 extends Calculation { - private static final Logger logger = Logger.getLogger(Calculation6.class); + private static final Logger log = Logger.getLogger(Calculation6.class); - private int mode; - private long[] timerange; - private double[] values; + private int mode; + private long [] timerange; + private double [] values; + private Long officialGaugeNumber; - public static final int MODE_W = 0; - public static final int MODE_Q = 1; public static final double SCALE = 1d; + public Calculation6(HistoricalDischargeAccess access) { + EvaluationMode mode = access.getEvaluationMode(); + Timerange tr = access.getEvaluationTimerange(); + double [] vs = mode != null && mode == EvaluationMode.W + ? access.getWs() + : access.getQs(); + + Long officialGaugeNumber = access.getOfficialGaugeNumber(); + + if (mode == null) { + // TODO: i18n + addProblem("hist.discharge.mode.not.set"); + } + if (tr == null) { + // TODO: i18n + addProblem("hist.discharge.time.interval.not.set"); + } + if (vs == null || vs.length == 0) { + // TODO: i18n + addProblem("hist.discharge.values.not.set"); + } + + if (officialGaugeNumber == null) { + // TODO: i18n + addProblem("hist.discharge.reference.gauge.not.set"); + } + + if (!hasProblems()) { + set( + mode.getMode(), + new long [] { tr.getStart(), tr.getEnd()}, + values, + officialGaugeNumber); + } + } + + protected void set( + int mode, + long [] timerange, + double [] values, + Long officialGaugeNumber + ) { + this.mode = mode; + this.timerange = timerange; + this.values = values; + this.officialGaugeNumber = officialGaugeNumber; + } + public Calculation6(int mode, long[] timerange, double[] values) { this.mode = mode; this.timerange = timerange; this.values = values; } - public CalculationResult calculate(Gauge gauge) { - if (!checkParameters() || gauge == null) { - logger.warn("Parameters not valid for calculation."); - + public CalculationResult calculate() { + if (hasProblems()) { + log.warn("Parameters not valid for calculation."); return null; } - if (logger.isDebugEnabled()) { + Gauge gauge = Gauge.getGaugeByOfficialNumber(officialGaugeNumber); + if (gauge == null) { + // TODO: i18n + addProblem("hist.discharge.gauge.not.found"); + return null; + } + + if (log.isDebugEnabled()) { debug(); } @@ -59,7 +115,7 @@ int numTables = dts.size(); - logger.debug("Take " + numTables + " into account."); + log.debug("Take " + numTables + " into account."); if (numTables == 0) { addProblem("cannot.find.hist.q.tables"); @@ -68,31 +124,12 @@ WQTimerange[] wqt = prepareTimerangeData(refTable, dts); WQKms[] wqs = prepareWQData(dts); - logger.debug("Number of calculation results: " + wqt.length); + log.debug("Number of calculation results: " + wqt.length); return new CalculationResult(new HistoricalDischargeData(wqt, wqs), this); } - protected boolean checkParameters() { - if (!(mode == MODE_W || mode == MODE_Q)) { - logger.warn("Invalid mode '" + mode + "' for calculation."); - return false; - } - - if (timerange == null || timerange.length < 2) { - logger.warn("Invalid timerange for calculation."); - return false; - } - - if (values == null || values.length == 0) { - logger.warn("No values for W or Q specified."); - return false; - } - - return true; - } - protected DischargeTable fetchReferenceTable(Gauge gauge) { return gauge.fetchMasterDischargeTable(); } @@ -132,7 +169,7 @@ return true; } - logger.debug("DischargeTable not in range: " + start + " -> " + stop); + log.debug("DischargeTable not in range: " + start + " -> " + stop); return false; } @@ -188,9 +225,12 @@ List<WQTimerange> wqts = new ArrayList<WQTimerange>(values.length); for (double value : values) { - logger.debug("Prepare data for value: " + value); + log.debug("Prepare data for value: " + value); - String name = mode == MODE_W ? "W=" + value : "Q=" + value; + String name = mode == EvaluationMode.W.getMode() + ? "W=" + value + : "Q=" + value; + WQTimerange wqt = null; for (DischargeTable dt : dts) { @@ -199,12 +239,12 @@ double w; double q; - if (mode == MODE_W) { + if (mode == EvaluationMode.W.getMode()) { w = value; q = findValueForW(dt, w, DischargeTables.HISTORICAL_SCALE); if (Double.isNaN(q)) { - logger.warn("Cannot find Q for W: " + w); + log.warn("Cannot find Q for W: " + w); addProblem("cannot.find.hist.q.for.w", w, ti[0], ti[1]); continue; } @@ -214,7 +254,7 @@ w = findValueForQ(dt, q, DischargeTables.HISTORICAL_SCALE); } - logger.debug("Q=" + q + " | W=" + w); + log.debug("Q=" + q + " | W=" + w); if (wqt == null) { wqt = new WQTimerange(name); @@ -238,15 +278,17 @@ values.length); for (double value : values) { - logger.debug("Prepare data plus diff for value: " + value); + log.debug("Prepare data plus diff for value: " + value); - String name = mode == MODE_W ? "W=" + value : "Q=" + value; + String name = mode == EvaluationMode.W.getMode() + ? "W=" + value + : "Q=" + value; HistoricalWQTimerange wqt = null; double ref; double diff; - if (refTable != null && mode == MODE_W) { + if (refTable != null && mode == EvaluationMode.W.getMode()) { ref = findValueForW(refTable, value, DischargeTables.MASTER_SCALE); } @@ -265,12 +307,12 @@ double w; double q; - if (mode == MODE_W) { + if (mode == EvaluationMode.W.getMode()) { w = value; q = findValueForW(dt, w, DischargeTables.HISTORICAL_SCALE); if (Double.isNaN(q)) { - logger.warn("Cannot find Q for W: " + w); + log.warn("Cannot find Q for W: " + w); addProblem("cannot.find.hist.q.for.w", w, ti[0], ti[1]); continue; } @@ -282,14 +324,14 @@ w = findValueForQ(dt, q, DischargeTables.HISTORICAL_SCALE); if (Double.isNaN(w)) { - logger.warn("Cannot find W for Q: " + q); + log.warn("Cannot find W for Q: " + q); addProblem("cannot.find.hist.w.for.q", q, ti[0], ti[1]); continue; } diff = ref - w; } - logger.debug("Q=" + q + " | W=" + w + " | Ref = " + ref); + log.debug("Q=" + q + " | W=" + w + " | Ref = " + ref); if (wqt == null) { wqt = new HistoricalWQTimerange(name); @@ -315,7 +357,7 @@ Date end = ti.getStopTime(); if (end == null) { - logger.warn("TimeInterval has no stop time set!"); + log.warn("TimeInterval has no stop time set!"); end = new Date(); } @@ -337,19 +379,14 @@ } /** - * Writes the parameters used for this calculation to logger. + * Writes the parameters used for this calculation to log. */ public void debug() { - StringBuilder sb = new StringBuilder(); - for (double value : values) { - sb.append(String.valueOf(value) + " "); - } - - logger.debug("========== Calculation6 =========="); - logger.debug(" Mode: " + mode); - logger.debug(" Timerange: " + timerange[0] + " - " + timerange[1]); - logger.debug(" Input values: " + sb.toString()); - logger.debug("=================================="); + log.debug("========== Calculation6 =========="); + log.debug(" Mode: " + mode); + log.debug(" Timerange: " + timerange[0] + " - " + timerange[1]); + log.debug(" Input values: " + Arrays.toString(values)); + log.debug("=================================="); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Timerange.java Tue May 07 12:47:05 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Timerange.java Tue May 07 17:32:33 2013 +0200 @@ -45,5 +45,11 @@ public long getEnd() { return end; } + + public void sort() { + if (start > end) { + long t = start; start = end; end = t; + } + } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/HistoricalDischargeComputeState.java Tue May 07 12:47:05 2013 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/HistoricalDischargeComputeState.java Tue May 07 17:32:33 2013 +0200 @@ -13,16 +13,21 @@ import java.util.List; import org.apache.log4j.Logger; -import org.w3c.dom.Element; import org.dive4elements.artifactdatabase.state.Facet; + import org.dive4elements.artifacts.Artifact; import org.dive4elements.artifacts.CallContext; + import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; + import org.dive4elements.river.artifacts.D4EArtifact; -import org.dive4elements.river.artifacts.WINFOArtifact; + +import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess.EvaluationMode; + import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess; -import org.dive4elements.river.artifacts.access.HistoricalDischargeAccess.EvaluationMode; + +import org.dive4elements.river.artifacts.model.Calculation6; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DataFacet; import org.dive4elements.river.artifacts.model.FacetTypes; @@ -36,9 +41,12 @@ import org.dive4elements.river.artifacts.model.ReportFacet; import org.dive4elements.river.artifacts.model.WQKms; import org.dive4elements.river.artifacts.model.WQTimerange; + import org.dive4elements.river.artifacts.resources.Resources; + import org.dive4elements.river.model.TimeInterval; +import org.w3c.dom.Element; /** * State to calculate historical discharge curves. @@ -46,9 +54,9 @@ * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> */ public class HistoricalDischargeComputeState -extends DefaultState -implements FacetTypes { - +extends DefaultState +implements FacetTypes +{ private static final Logger logger = Logger .getLogger(HistoricalDischargeComputeState.class); @@ -67,10 +75,12 @@ CallContext context, List<Facet> facets, Object old) { logger.debug("HistoricalDischargeComputeState.computeAdvance"); - WINFOArtifact winfo = (WINFOArtifact) artifact; + HistoricalDischargeAccess access = + new HistoricalDischargeAccess(artifact); - CalculationResult res = old instanceof CalculationResult ? (CalculationResult) old - : winfo.getHistoricalDischargeData(); + CalculationResult res = old instanceof CalculationResult + ? (CalculationResult)old + : new Calculation6(access).calculate(); if (facets == null) { return res; @@ -81,8 +91,6 @@ } HistoricalDischargeData data = (HistoricalDischargeData) res.getData(); - HistoricalDischargeAccess access = new HistoricalDischargeAccess( - artifact); WQTimerange[] wqts = (WQTimerange[]) data.getWQTimeranges(); if (wqts != null && wqts.length > 0) { @@ -103,8 +111,11 @@ return res; } - protected void prepareFacets(List<Facet> facets, WQTimerange[] wqts, - HistoricalDischargeAccess access) { + protected void prepareFacets( + List<Facet> facets, + WQTimerange[] wqts, + HistoricalDischargeAccess access + ) { int i = 0; for (WQTimerange wqt : wqts) {