diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Segment.java @ 3441:bfbd478bd607

FixA: Moved Q -> W conversion code into segments to be reusable. flys-artifacts/trunk@5104 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 23 Jul 2012 14:19:07 +0000
parents cb11919cccf9
children fc351f12b906
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Segment.java	Mon Jul 23 11:52:21 2012 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Segment.java	Mon Jul 23 14:19:07 2012 +0000
@@ -1,5 +1,9 @@
 package de.intevation.flys.artifacts.model;
 
+import de.intevation.flys.model.DischargeTable;
+import de.intevation.flys.model.Gauge;
+import de.intevation.flys.model.River;
+
 import de.intevation.flys.utils.DoubleUtil;
 
 import gnu.trove.TDoubleArrayList;
@@ -7,6 +11,7 @@
 import java.io.Serializable;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 
@@ -15,7 +20,7 @@
 public class Segment
 implements   Serializable
 {
-    private static Logger logger = Logger.getLogger(Segment.class);
+    private static Logger log = Logger.getLogger(Segment.class);
 
     public static final Comparator<Segment> REF_CMP =
         new Comparator<Segment>() {
@@ -112,7 +117,7 @@
         for (String segmentStr: input.split(":")) {
             String [] parts = segmentStr.split(";");
             if (parts.length < 3) {
-                logger.warn("invalid segment: '" + segmentStr + "'");
+                log.warn("invalid segment: '" + segmentStr + "'");
                 continue;
             }
             try {
@@ -130,11 +135,84 @@
                 segments.add(new Segment(from, to, values));
             }
             catch (NumberFormatException nfe) {
-                logger.warn("invalid segment: '" + segmentStr + "'");
+                log.warn("invalid segment: '" + segmentStr + "'");
             }
         }
 
         return segments;
     }
+
+    public static boolean setReferencePointConvertQ(
+        List<Segment> segments,
+        River         river,
+        boolean       isQ,
+        Calculation   report
+    ) {
+        int numResults = -1;
+
+        boolean success = true;
+
+        // assign reference points
+        for (Segment segment: segments) {
+            Gauge gauge = river.maxOverlap(segment.getFrom(), segment.getTo());
+
+            if (gauge == null) {
+                log.warn("no gauge found. Defaults to mid point.");
+                segment.setReferencePoint(
+                    0.5*(segment.getFrom()+segment.getTo()));
+            }
+            else {
+                double ref = gauge.getStation().doubleValue();
+                log.debug(
+                    "reference gauge: " + gauge.getName() +
+                    " (km " + ref + ")");
+                segment.setReferencePoint(ref);
+            }
+
+            double [] values = segment.values;
+
+            if (numResults == -1) {
+                numResults = values.length;
+            }
+            else if (numResults != values.length) {
+                log.warn("wrong length of values");
+                return false;
+            }
+
+            // convert to Q if needed
+            if (!isQ && gauge != null) {
+
+                DischargeTable dt = gauge.fetchMasterDischargeTable();
+
+                double [][] table =
+                    DischargeTables.loadDischargeTableValues(dt, 1);
+
+                // need the original values for naming
+                segment.backup();
+
+                for (int i = 0; i < values.length; ++i) {
+                    double w = values[i] / 100.0;
+                    double [] qs = DischargeTables.getQsForW(table, w);
+                    if (qs.length == 0) {
+                        log.warn("No Qs found for W = " + values[i]);
+                        report.addProblem("cannot.find.w.for.q", values[i]);
+                        values[i] = Double.NaN;
+                        success = false;
+                    }
+                    else {
+                        values[i] = qs[0];
+                        if (qs.length > 1) {
+                            log.warn(
+                                "More than one Q found for W = " + values[i]);
+                        }
+                    }
+                }
+            }
+        } // for all segments
+
+        Collections.sort(segments, Segment.REF_CMP);
+
+        return success;
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org