changeset 8060:25feef564d09

Sediment load: More of official epochs.
author Sascha L. Teichmann <teichmann@intevation.de>
date Fri, 18 Jul 2014 18:55:39 +0200
parents bde5f5ec7c72
children 0000ed802cad
files artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadDataCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadDataValueFilter.java
diffstat 2 files changed, 72 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadDataCalculation.java	Fri Jul 18 18:01:49 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadDataCalculation.java	Fri Jul 18 18:55:39 2014 +0200
@@ -21,6 +21,7 @@
 import org.dive4elements.river.artifacts.model.minfo.SedimentLoadData.Station;
 import org.dive4elements.river.artifacts.model.minfo.SedimentLoadDataValueFilter.And;
 import org.dive4elements.river.artifacts.model.minfo.SedimentLoadDataValueFilter.IsEpoch;
+import org.dive4elements.river.artifacts.model.minfo.SedimentLoadDataValueFilter.IsOfficial;
 import org.dive4elements.river.artifacts.model.minfo.SedimentLoadDataValueFilter.Not;
 import org.dive4elements.river.artifacts.model.minfo.SedimentLoadDataValueFilter.TimeRangeIntersects;
 import org.dive4elements.river.model.River;
@@ -125,31 +126,22 @@
         GrainFraction.make("minfo.susp.sediment.flys",      SUSP_SEDIMENT_FLYS),
     };
 
-    public static final class Sum implements Value.Visitor {
+    public static class Sum implements Value.Visitor {
 
-        private int    n;
-        private double sum;
-        private double scale;
+        protected int    n;
+        protected double sum;
 
         public Sum() {
         }
 
-        public Sum(double scale) {
-            this.scale = scale;
-        }
-
         public double getSum() {
-            return sum * scale;
+            return sum;
         }
 
         public int getN() {
             return n;
         }
 
-        public double getScale() {
-            return scale;
-        }
-
         public void reset() {
             n   = 0;
             sum = 0.0;
@@ -160,7 +152,17 @@
             sum += value.getValue();
             ++n;
         }
-    } // class Aggregate
+    } // class Sum
+
+    public static final class Avg extends Sum {
+        public Avg() {
+        }
+
+        @Override
+        public double getSum() {
+            return n == 0 ? 0.0 : sum/(double)n;
+        }
+    } // class Sum
 
 
     private String   river;
@@ -286,14 +288,53 @@
         boolean isKmUp = isKmUp();
         Set<Integer> missingFractions = new TreeSet<Integer>();
 
+        // They are not epochs, they are single years!
+        Not notEpochs = new Not(IsEpoch.INSTANCE);
+
         for (int [] epoch: epochs) {
             Value.Filter filter = new And()
-                .add(IsEpoch.INSTANCE)
+                .add(notEpochs)
                 .add(new TimeRangeIntersects(epoch[0], epoch[1]));
 
-            double scale = 1.0/(Math.max(epoch[0], epoch[1]) - Math.min(epoch[0], epoch[1]) + 1);
+            Avg avg = new Avg();
 
-            Sum sum = new Sum(scale);
+            for (GrainFraction gf: GRAIN_FRACTIONS) {
+                double [][] result = sum(
+                    sld, gf.getGrainFractions(), filter, avg, isKmUp,
+                    missingFractions);
+
+                if (result[0].length == 0 || DoubleUtil.isNaN(result[1])) {
+                    // TODO: resolve i18n
+                    addProblem("minfo.sediment.load.no.fractions",
+                        gf.getDescription());
+                    continue;
+                }
+                // TODO: Generate result data set for calculation.
+                // TODO: Optionally transform units.
+            }
+        }
+        // TODO: Generate messages for missing fractions.
+        // TODO: Bundle sub results.
+        return null;
+    }
+
+    private CalculationResult calculateOffEpochs() {
+        SedimentLoadData sld =
+            SedimentLoadDataFactory.INSTANCE.getSedimentLoadData(river);
+        if (sld == null) {
+            // TODO: i18n
+            return error("minfo.sediment.load.no.data");
+        }
+
+        boolean isKmUp = isKmUp();
+        Set<Integer> missingFractions = new TreeSet<Integer>();
+
+        for (int [] epoch: epochs) {
+            Value.Filter filter = new And()
+                .add(IsOfficial.INSTANCE)
+                .add(new TimeRangeIntersects(epoch[0], epoch[1]));
+
+            Sum sum = new Sum();
 
             for (GrainFraction gf: GRAIN_FRACTIONS) {
                 double [][] result = sum(
@@ -312,10 +353,6 @@
         }
         // TODO: Generate messages for missing fractions.
         // TODO: Bundle sub results.
-        return null;
-    }
-
-    private CalculationResult calculateOffEpochs() {
         // TODO: Implement me!
         return null;
     }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadDataValueFilter.java	Fri Jul 18 18:01:49 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadDataValueFilter.java	Fri Jul 18 18:55:39 2014 +0200
@@ -143,6 +143,7 @@
                 this.b = b;
             }
         }
+
         @Override
         public boolean accept(Value value) {
             Date c = value.getLoad().getStartTime();
@@ -152,6 +153,19 @@
                 : !(a.after(d) || c.after(b));
         }
     } // class TimeRangeIntersects
+
+    public static final class IsOfficial implements Filter {
+
+        public static final IsOfficial INSTANCE = new IsOfficial();
+
+        private IsOfficial() {
+        }
+
+        @Override
+        public boolean accept(Value value) {
+            return value.getLoad().getKind() == 1;
+        }
+    } // class IsOfficial
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
 

http://dive4elements.wald.intevation.org