changeset 6374:48e92ff57f23

SedimentLoad*: Set range to fraction/fractions values.
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Thu, 20 Jun 2013 09:06:23 +0200
parents be283f9bc079
children 2f39cf68a1dd
files artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoad.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFactory.java
diffstat 3 files changed, 124 insertions(+), 68 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoad.java	Wed Jun 19 16:53:27 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoad.java	Thu Jun 20 09:06:23 2013 +0200
@@ -13,6 +13,8 @@
 import java.util.Set;
 
 import org.dive4elements.river.artifacts.model.NamedObjectImpl;
+import org.dive4elements.river.artifacts.model.Range;
+
 
 /** Gives access to Fractions (at kms). */
 public class SedimentLoad
@@ -89,68 +91,79 @@
         return kms.get(km);
     }
 
-    public void setCoarse(double km, double coarse) {
+    public void setCoarse(double km, double coarse, Range range) {
         if (kms.containsKey(km)) {
             kms.get(km).setCoarse(coarse);
         }
         else {
             SedimentLoadFraction f = new SedimentLoadFraction();
             f.setCoarse(coarse);
-            kms.put(km, f);
-        }
-    }
-
-    public void setFineMiddle(double km, double fine_middle) {
-        if (kms.containsKey(km)) {
-            kms.get(km).setFine_middle(fine_middle);
-        }
-        else {
-            SedimentLoadFraction f = new SedimentLoadFraction();
-            f.setFine_middle(fine_middle);
-            kms.put(km, f);
-        }
-    }
-
-    public void setSand(double km, double sand) {
-        if (kms.containsKey(km)) {
-            kms.get(km).setSand(sand);
-        }
-        else {
-            SedimentLoadFraction f = new SedimentLoadFraction();
-            f.setSand(sand);
+            f.setCoarseRange(range);
             kms.put(km, f);
         }
     }
 
-    public void setSuspSand(double km, double susp_sand) {
+    public void setFineMiddle(double km, double fine_middle, Range range) {
         if (kms.containsKey(km)) {
-            kms.get(km).setSusp_sand(susp_sand);
+            kms.get(km).setFine_middle(fine_middle);
+            kms.get(km).setFineMiddleRange(range);
         }
         else {
             SedimentLoadFraction f = new SedimentLoadFraction();
-            f.setSusp_sand(susp_sand);
+            f.setFine_middle(fine_middle);
+            f.setFineMiddleRange(range);
             kms.put(km, f);
         }
     }
 
-    public void setSuspSandBed(double km, double susp_sand_bed) {
+    public void setSand(double km, double sand, Range range) {
+        if (kms.containsKey(km)) {
+            kms.get(km).setSand(sand);
+            kms.get(km).setSandRange(range);
+        }
+        else {
+            SedimentLoadFraction f = new SedimentLoadFraction();
+            f.setSand(sand);
+            f.setSandRange(range);
+            kms.put(km, f);
+        }
+    }
+
+    public void setSuspSand(double km, double susp_sand, Range range) {
+        if (kms.containsKey(km)) {
+            kms.get(km).setSusp_sand(susp_sand);
+            kms.get(km).setSuspSandRange(range);
+        }
+        else {
+            SedimentLoadFraction f = new SedimentLoadFraction();
+            f.setSusp_sand(susp_sand);
+            f.setSuspSandRange(range);
+            kms.put(km, f);
+        }
+    }
+
+    public void setSuspSandBed(double km, double susp_sand_bed, Range range) {
         if (kms.containsKey(km)) {
             kms.get(km).setSusp_sand_bed(susp_sand_bed);
+            kms.get(km).setSuspSandBedRange(range);
         }
         else {
             SedimentLoadFraction f = new SedimentLoadFraction();
             f.setSusp_sand_bed(susp_sand_bed);
+            f.setSuspSandBedRange(range);
             kms.put(km, f);
         }
     }
 
-    public void setSuspSediment(double km, double susp_sediment) {
+    public void setSuspSediment(double km, double susp_sediment, Range range) {
         if (kms.containsKey(km)) {
             kms.get(km).setSusp_sediment(susp_sediment);
+            kms.get(km).setSuspSedimentRange(range);
         }
         else {
             SedimentLoadFraction f = new SedimentLoadFraction();
             f.setSusp_sediment(susp_sediment);
+            f.setSuspSedimentRange(range);
             kms.put(km, f);
         }
     }
@@ -166,13 +179,15 @@
         }
     }
 
-    public void setTotal(double km, double total) {
+    public void setTotal(double km, double total, Range range) {
         if (kms.containsKey(km)) {
             kms.get(km).setTotal(total);
+            kms.get(km).setTotalRange(range);
         }
         else {
             SedimentLoadFraction f = new SedimentLoadFraction();
             f.setTotal(total);
+            f.setTotalRange(range);
             kms.put(km, f);
         }
     }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadCalculation.java	Wed Jun 19 16:53:27 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadCalculation.java	Thu Jun 20 09:06:23 2013 +0200
@@ -155,42 +155,42 @@
                 SedimentLoadFraction f = load.getFraction(km);
                 if (f.getCoarse() > 0d) {
                     double c = resLoad.getFraction(km).getCoarse();
-                    resLoad.setCoarse(km, c + f.getCoarse());
+                    resLoad.setCoarse(km, c + f.getCoarse(), f.getCoarseRange());
                     cSum++;
                 }
                 if (f.getFine_middle() > 0d) {
                     double fm = resLoad.getFraction(km).getFine_middle();
-                    resLoad.setFineMiddle(km, fm + f.getFine_middle());
+                    resLoad.setFineMiddle(km, fm + f.getFine_middle(), f.getFineMiddleRange());
                     fmSum++;
                 }
                 if (f.getSand() > 0d) {
                     double s = resLoad.getFraction(km).getSand();
-                    resLoad.setSand(km, s + f.getSand());
+                    resLoad.setSand(km, s + f.getSand(), f.getSandRange());
                     sSum++;
                 }
                 if (f.getSusp_sand() > 0d) {
                     double s = resLoad.getFraction(km).getSusp_sand();
-                    resLoad.setSuspSand(km, s + f.getSusp_sand());
+                    resLoad.setSuspSand(km, s + f.getSusp_sand(), f.getSuspSandRange());
                     ssSum++;
                 }
                 if (f.getSusp_sand_bed() > 0d) {
                     double s = resLoad.getFraction(km).getSusp_sand_bed();
-                    resLoad.setSuspSandBed(km, s + f.getSusp_sand_bed());
+                    resLoad.setSuspSandBed(km, s + f.getSusp_sand_bed(), f.getSuspSandBedRange());
                     ssbSum++;
                 }
                 if (f.getSusp_sediment() > 0d) {
                     double s = resLoad.getFraction(km).getSusp_sediment();
-                    resLoad.setSuspSediment(km, s + f.getSusp_sediment());
+                    resLoad.setSuspSediment(km, s + f.getSusp_sediment(), f.getSuspSedimentRange());
                     sseSum++;
                 }
             }
             SedimentLoadFraction fr = resLoad.getFraction(km);
-            resLoad.setCoarse(km, fr.getCoarse()/cSum);
-            resLoad.setFineMiddle(km, fr.getFine_middle()/fmSum);
-            resLoad.setSand(km, fr.getSand()/sSum);
-            resLoad.setSuspSand(km, fr.getSusp_sand()/ssSum);
-            resLoad.setSuspSandBed(km, fr.getSusp_sand_bed()/ssbSum);
-            resLoad.setSuspSediment(km, fr.getSusp_sediment()/sseSum);
+            resLoad.setCoarse(km, fr.getCoarse()/cSum, fr.getCoarseRange());
+            resLoad.setFineMiddle(km, fr.getFine_middle()/fmSum, fr.getFineMiddleRange());
+            resLoad.setSand(km, fr.getSand()/sSum, fr.getSandRange());
+            resLoad.setSuspSand(km, fr.getSusp_sand()/ssSum, fr.getSuspSandRange());
+            resLoad.setSuspSandBed(km, fr.getSusp_sand_bed()/ssbSum, fr.getSuspSandBedRange());
+            resLoad.setSuspSediment(km, fr.getSusp_sediment()/sseSum, fr.getSuspSedimentRange());
         }
         resLoad.setDescription("");
         resLoad.setEpoch(true);
@@ -264,6 +264,7 @@
         return result;
     }
 
+    /** Add up the loads of a year. */
     private SedimentLoad calculateTotalLoad(SedimentLoad load, int year) {
         logger.debug("calculateTotalLoad");
         boolean problemThisYear = false;
@@ -319,7 +320,7 @@
                 fraction.getSand() +
                 fraction.getSusp_sand() +
                 fraction.getSusp_sediment();
-            load.setTotal(km, total);
+            load.setTotal(km, total, fraction.getTotalRange());
         }
         return load;
     }
@@ -337,13 +338,13 @@
             double bedSand = fraction.getSusp_sand_bed();
             double sediment = fraction.getSusp_sediment();
             double total = fraction.getTotal();
-            load.setCoarse(km, (coarse * dens));
-            load.setFineMiddle(km, (fineMiddle * dens));
-            load.setSand(km, (sand * dens));
-            load.setSuspSand(km, (suspSand * dens));
-            load.setSuspSandBed(km, (bedSand * dens));
-            load.setSuspSediment(km, (sediment * dens));
-            load.setTotal(km, (total * dens));
+            load.setCoarse(km, (coarse * dens), fraction.getCoarseRange());
+            load.setFineMiddle(km, (fineMiddle * dens), fraction.getFineMiddleRange());
+            load.setSand(km, (sand * dens), fraction.getSandRange());
+            load.setSuspSand(km, (suspSand * dens), fraction.getSuspSandRange());
+            load.setSuspSandBed(km, (bedSand * dens), fraction.getSuspSandBedRange());
+            load.setSuspSediment(km, (sediment * dens), fraction.getSuspSedimentRange());
+            load.setTotal(km, (total * dens), fraction.getTotalRange());
         }
         return load;
     }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFactory.java	Wed Jun 19 16:53:27 2013 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadFactory.java	Thu Jun 20 09:06:23 2013 +0200
@@ -13,6 +13,8 @@
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 
 import net.sf.ehcache.Cache;
 import net.sf.ehcache.Element;
@@ -22,7 +24,12 @@
 import org.hibernate.Session;
 import org.hibernate.type.StandardBasicTypes;
 
+import org.dive4elements.river.model.MeasurementStation;
+
 import org.dive4elements.river.artifacts.cache.CacheFactory;
+
+import org.dive4elements.river.artifacts.model.Range;
+import org.dive4elements.river.artifacts.model.RiverFactory;
 import org.dive4elements.river.artifacts.model.StaticSedimentLoadCacheKey;
 import org.dive4elements.river.backend.SessionHolder;
 
@@ -264,6 +271,22 @@
         Session session = SessionHolder.HOLDER.get();
         SQLQuery sqlQuery = null;
 
+        List<MeasurementStation> allStations = RiverFactory.getRiver(river).getMeasurementStations();
+        TreeMap<Double,MeasurementStation> floatStations = new TreeMap<Double, MeasurementStation>();
+        TreeMap<Double,MeasurementStation> suspStations = new TreeMap<Double, MeasurementStation>();
+        for (MeasurementStation measurementStation: allStations) {
+            if (measurementStation.getMeasurementType() == null ||
+                measurementStation.getRange() == null) {
+                continue;
+            }
+            if (measurementStation.getMeasurementType().equals("Schwebstoff")) {
+                suspStations.put(measurementStation.getRange().getA().doubleValue(), measurementStation);
+            }
+            else if (measurementStation.getMeasurementType().equals("Geschiebe")) {
+                floatStations.put(measurementStation.getRange().getA().doubleValue(), measurementStation);
+            }
+        }
+
         Calendar start = Calendar.getInstance();
         start.set(syear - 1, 11, 31);
         Calendar end = Calendar.getInstance();
@@ -289,12 +312,12 @@
                     (Date) row[1],
                     null,
                     false);
-            getValues("coarse", sqlQuery, load);
-            getValues("fine_middle", sqlQuery, load);
-            getValues("sand", sqlQuery, load);
-            getValues("suspended_sediment", sqlQuery, load);
-            getValues("susp_sand_bed", sqlQuery, load);
-            getValues("susp_sand", sqlQuery, load);
+            getValues("coarse", sqlQuery, load, floatStations);
+            getValues("fine_middle", sqlQuery, load, floatStations);
+            getValues("sand", sqlQuery, load, floatStations);
+            getValues("suspended_sediment", sqlQuery, load, suspStations);
+            getValues("susp_sand_bed", sqlQuery, load, suspStations);
+            getValues("susp_sand", sqlQuery, load, suspStations);
 
             return load;
         }
@@ -334,12 +357,12 @@
                 kms.add((Double)row[3]);
                 load.setLoadTotal((Double)row[3], (Double)row[2]);
             }
-            getValues("coarse", sqlQuery, load);
-            getValues("fine_middle", sqlQuery, load);
-            getValues("sand", sqlQuery, load);
-            getValues("suspended_sediment", sqlQuery, load);
-            getValues("susp_sand_bed", sqlQuery, load);
-            getValues("susp_sand", sqlQuery, load);
+            getValues("coarse", sqlQuery, load, floatStations);
+            getValues("fine_middle", sqlQuery, load, floatStations);
+            getValues("sand", sqlQuery, load, floatStations);
+            getValues("suspended_sediment", sqlQuery, load, suspStations);
+            getValues("susp_sand_bed", sqlQuery, load, suspStations);
+            getValues("susp_sand", sqlQuery, load, floatStations);
             return load;
         }
         return new SedimentLoad();
@@ -356,34 +379,51 @@
     protected static void getValues (
         String fraction,
         SQLQuery query,
-        SedimentLoad load
+        SedimentLoad load,
+        TreeMap<Double, MeasurementStation> stations
     ) {
         query.setString("grain", fraction);
         List<Object[]> results = query.list();
         for (int i = 0; i < results.size(); i++) {
             Object[] row = results.get(i);
             double km = (Double)row[3];
+            MeasurementStation station = stations.get(km);
+            MeasurementStation nextStation = stations.ceilingEntry(km + 0.1d).getValue();
+            Range range = null;
+            if (station == null) {
+                log.warn("No measurement station for " + fraction + " km " + km);
+            }
+            else {
+                if (nextRange != null)
+                    range = new Range(station.getRange().getA().doubleValue(),
+                        nextStation.getRange().getA().doubleValue());
+                else {
+                    // TODO end-of-river instead of B.
+                    range = new Range(station.getRange().getA().doubleValue(),
+                        station.getRange().getB().doubleValue());
+                }
+            }
             double v = -1;
             if (row[2] != null) {
                 v = ((Double)row[2]).doubleValue();
             }
             if (fraction.equals("coarse")) {
-                load.setCoarse(km, v);
+                load.setCoarse(km, v, range);
             }
             else if (fraction.equals("sand")) {
-                load.setSand(km, v);
+                load.setSand(km, v, range);
             }
             else if (fraction.equals("fine_middle")) {
-                load.setFineMiddle(km, v);
+                load.setFineMiddle(km, v, range);
             }
             else if (fraction.equals("suspended_sediment")) {
-                load.setSuspSediment(km, v);
+                load.setSuspSediment(km, v, range);
             }
             else if (fraction.equals("susp_sand")) {
-                load.setSuspSand(km, v);
+                load.setSuspSand(km, v, range);
             }
             else if (fraction.equals("susp_sand_bed")) {
-                load.setSuspSandBed(km, v);
+                load.setSuspSandBed(km, v, range);
             }
         }
     }

http://dive4elements.wald.intevation.org