diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation6.java @ 2311:b8df8d1476ba

Compute differences between discharge table values and reference discharge table values in historical discharge curve calculation. flys-artifacts/trunk@3991 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Thu, 09 Feb 2012 10:57:35 +0000
parents abb390101595
children c0dfa36add96
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation6.java	Thu Feb 09 10:21:16 2012 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation6.java	Thu Feb 09 10:57:35 2012 +0000
@@ -47,6 +47,7 @@
             debug();
         }
 
+        DischargeTable  refTable = fetchReferenceTable(gauge);
         List<DischargeTable> dts = fetchDischargeTables(gauge);
 
         int numTables = dts.size();
@@ -57,7 +58,7 @@
             addProblem("cannot.find.hist.q.tables");
         }
 
-        WQTimerange[] wqt = prepareCalculationData(dts);
+        WQTimerange[] wqt = prepareCalculationData(refTable, dts);
 
         logger.debug("Number of calculation results: " + wqt.length);
 
@@ -85,6 +86,11 @@
     }
 
 
+    protected DischargeTable fetchReferenceTable(Gauge gauge) {
+        return gauge.fetchMasterDischargeTable();
+    }
+
+
     protected List<DischargeTable> fetchDischargeTables(Gauge gauge) {
         List<DischargeTable> relevant = new ArrayList<DischargeTable>();
         List<DischargeTable> all      = gauge.getDischargeTables();
@@ -122,15 +128,30 @@
     }
 
 
-    protected WQTimerange[] prepareCalculationData(List<DischargeTable> dts) {
-        List<WQTimerange> wqts = new ArrayList<WQTimerange>(values.length);
+    protected WQTimerange[] prepareCalculationData(
+        DischargeTable       refTable,
+        List<DischargeTable> dts
+    ) {
+        if (refTable == null) {
+            addProblem("cannot.find.hist.q.reftable");
+            return prepareSimpleData(dts);
+        }
+        else {
+            return prepareData(refTable, dts);
+        }
+    }
+
+
+    protected WQTimerange[] prepareSimpleData(List<DischargeTable> dts) {
+        List<WQTimerange> wqts =
+            new ArrayList<WQTimerange>(values.length);
 
         boolean debug = logger.isDebugEnabled();
 
         for (double value: values) {
             logger.debug("Prepare data for value: " + value);
 
-            String      name = mode == MODE_W ? "W=" + value : "Q=" + value;
+            String name      = mode == MODE_W ? "W=" + value : "Q=" + value;
             WQTimerange wqt  = null;
 
             for (DischargeTable dt: dts) {
@@ -184,6 +205,85 @@
     }
 
 
+    protected HistoricalWQTimerange[] prepareData(
+        DischargeTable       refTable,
+        List<DischargeTable> dts
+    ) {
+        List<HistoricalWQTimerange> wqts =
+            new ArrayList<HistoricalWQTimerange>(values.length);
+
+        boolean debug = logger.isDebugEnabled();
+
+        for (double value: values) {
+            logger.debug("Prepare data plus diff for value: " + value);
+
+            String name = mode == MODE_W ? "W=" + value : "Q=" + value;
+            HistoricalWQTimerange wqt  = null;
+
+            double ref;
+
+            if (refTable != null && mode == MODE_W) {
+                ref = findValueForW(refTable, value);
+            }
+            else if (refTable != null) {
+                ref = findValueForQ(refTable, value);
+            }
+            else {
+                ref = Double.NaN;
+            }
+
+            for (DischargeTable dt: dts) {
+                TimeInterval ti = dt.getTimeInterval();
+
+                Date start = ti.getStartTime();
+                Date end   = ti.getStopTime();
+
+                if (end == null) {
+                    logger.warn("TimeInterval has no stop time set!");
+
+                    end = new Date();
+                }
+
+                Timerange t = new Timerange(ti.getStartTime(),ti.getStopTime());
+                double    w;
+                double    q;
+
+                if (mode == MODE_W) {
+                    w = value;
+                    q = findValueForW(dt, w);
+
+                    if (Double.isNaN(q)) {
+                        logger.warn("Cannot find Q for W: " + w);
+                        addProblem("cannot.find.hist.q.for.w", w, start, end);
+                        continue;
+                    }
+                }
+                else {
+                    q = value;
+                    w = findValueForQ(dt, q);
+                }
+
+                if (debug) {
+                    logger.debug("Q=" + q + " | W=" + w);
+                }
+
+                if (wqt == null) {
+                    wqt = new HistoricalWQTimerange(name);
+                }
+
+                wqt.add(w, q, ref-value, t);
+            }
+
+            if (wqt != null) {
+                wqts.add(wqt);
+            }
+        }
+
+        return (HistoricalWQTimerange[])
+            wqts.toArray(new HistoricalWQTimerange[wqts.size()]);
+    }
+
+
     protected double findValueForW(DischargeTable dt, double w) {
         double[][] vs = DischargeTables.loadDischargeTableValues(dt,SCALE,true);
         return DischargeTables.getQForW(vs, w);

http://dive4elements.wald.intevation.org