diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java @ 3992:a9c93b7c9da1

Simpify the S(Q) fraction sieving stuff.
author Sascha L. Teichmann <teichmann@intevation.de>
date Sun, 30 Sep 2012 21:15:23 +0200
parents 6bcc50e2cc7d
children ab3a4ad82ae1
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java	Sun Sep 30 19:03:26 2012 +0200
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Measurement.java	Sun Sep 30 21:15:23 2012 +0200
@@ -1,5 +1,6 @@
 package de.intevation.flys.artifacts.model.sq;
 
+import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.logging.Log;
@@ -16,13 +17,11 @@
     public static final double ADD_4 = Math.log(8) - Math.log(6.3)/Math.log(10);
     public static final double SCALE_4 = Math.log(6.3);
 
-    public static final double [] SIEVE_DIAMETERS = {
-        100d,   63d,  31.5d,    16d,
-          8d,    4d,     2d,     1d,
-        0.5d, 0.25d, 0.125d, 0.063d
-    };
+    protected Map<String, Object> data;
 
-    protected Map<String, Object> data;
+    protected List<Sieve> sieves;
+
+    protected SieveArray  sieveArray;
 
     protected Measurement prev;
     protected Measurement next;
@@ -30,8 +29,11 @@
     public Measurement() {
     }
 
-    public Measurement(Map<String, Object> data) {
+    public Measurement(Map<String, Object> data, List<Sieve> sieves) {
         this.data = data;
+        this.sieves = sieves;
+        adjustOriginalSieves();
+        this.sieveArray = calculateSieveArray();
     }
 
     public Measurement head() {
@@ -110,24 +112,30 @@
         return S_SS() + S_BL_S() + S_BL_FG() + S_BL_CG();
     }
 
-    public double SIEB(int i) {
-        return get(siebString(i));
-    }
-
-    public double RSIEB(int i) {
-        return get(rsiebString(i));
-    }
-
-    public double REST() {
-        return get("REST");
-    }
-
     @Override
     public String toString() {
         return "Measurement: " + data;
     }
 
     /**
+     * Gets the sieves for this instance.
+     *
+     * @return The sieves.
+     */
+    public List<Sieve> getSieves() {
+        return this.sieves;
+    }
+
+    /**
+     * Gets the sieveArray for this instance.
+     *
+     * @return The sieveArray.
+     */
+    public SieveArray getSieveArray() {
+        return this.sieveArray;
+    }
+
+    /**
      * Gets the prev for this instance.
      *
      * @return The prev.
@@ -163,138 +171,70 @@
         this.next = next;
     }
 
-    protected int findSieveIndex(double diameter) {
-        for (int i = 1; i <= 22; ++i) {
-            double size = SIEB(i);
-            if (Math.abs(size - diameter) < 0.00001) {
-                return i;
+    protected Sieve findSieve(double diameter) {
+        for (Sieve s: sieves) {
+            if (s.matchesDiameter(diameter)) {
+                return s;
             }
         }
-        return -1;
-    }
-
-    public static int sieve(double value) {
-        for (int i = 0; i < SIEVE_DIAMETERS.length; ++i) {
-            if (value >= SIEVE_DIAMETERS[i]) {
-                return i+1;
-            }
-        }
-        return SIEVE_DIAMETERS.length;
-    }
-
-    private static final String rsiebString(int idx) {
-        return String.format("RSIEB%02d", idx);
-    }
-
-    private static final String siebString(int idx) {
-        return String.format("SIEB%02d", idx);
-    }
-
-    private static final String quantString(int idx) {
-        return String.format("QUANT%02d", idx);
+        return null;
     }
 
-    private static final String normQuantString(int idx) {
-        return String.format("NORMQUANT%02d", idx);
-    }
-
-    protected void deleteSieve(int idx) {
-        data.remove(rsiebString(idx));
-        data.remove(siebString(idx));
-    }
-
-    protected void putSieve(int idx, double diameter, double value) {
-        data.put(rsiebString(idx), Double.valueOf(value));
-        data.put(siebString(idx), Double.valueOf(diameter));
+    protected void deleteSieve(double diameter) {
+        for (int i = sieves.size()-1; i >= 0; --i) {
+            if (sieves.get(i).matchesDiameter(diameter)) {
+                sieves.remove(i);
+                break;
+            }
+        }
     }
 
-    protected double totalRSIEB() {
-        double sum = 0d;
-        for (int i = 1; i <= 21; ++i) {
-            Double x = (Double)data.get(rsiebString(i));
-            if (x != null) {
-                sum += x;
-            }
-        }
-        return sum;
-    }
-
-    protected double totalQUANT() {
-        double sum = 0d;
-        for (int i = 1; i <= 22; ++i) {
-            Double x = (Double)data.get(quantString(i));
-            if (x != null) {
-                sum += x;
-            }
-        }
-        return sum;
-    }
-
-    public void adjustOriginalSieves() {
+    protected void adjustOriginalSieves() {
 
         // If we already have an 8mm diameter sieve
         // we dont need to 'invent' it.
-        if (findSieveIndex(8d) > -1) {
+        if (findSieve(8d) != null) {
             return;
         }
 
         // create a new 8mm sieve.
         // delete 6.3mm sieve.
         // modify 4mm sieve.
-        //
-        int sixIdx  = findSieveIndex(6.3d);
-        int tenIdx  = findSieveIndex(10d);
-        int fourIdx = findSieveIndex(4d);
 
-        if (sixIdx < 0 || tenIdx < 0 || fourIdx < 0) {
+        Sieve six  = findSieve(6.3d);
+        Sieve ten  = findSieve(10d);
+        Sieve four = findSieve(4d);
+
+        if (six == null || ten == null || four == null) {
             log.warn("missind diameter");
             return;
         }
 
-        double sixValue  = RSIEB(sixIdx);
-        double tenValue  = RSIEB(tenIdx);
-        double fourValue = RSIEB(fourIdx);
+        double sixValue  = six.getLoad();
+        double tenValue  = ten.getLoad();
+        double fourValue = four.getLoad();
 
-        deleteSieve(sixIdx);
+        deleteSieve(6.3);
 
         double eightValue   = ADD_8 - SCALE_8*sixValue + tenValue;
         double newFourValue = ADD_4 - SCALE_4*sixValue + fourValue;
 
-        putSieve(22, 8d, eightValue);
-        putSieve(fourIdx, 4d, newFourValue);
+        sieves.add(new Sieve(8d, eightValue));
+        sieves.add(new Sieve(4d, newFourValue));
    }
 
 
-    public void fillSieveCategories() {
-        adjustOriginalSieves();
+    public SieveArray calculateSieveArray() {
 
-        for (int i = 1; i <= 22; ++i) {
-            Double rsieb = (Double)getData(rsiebString(i));
-            Double sieb  = (Double)getData(siebString(i));
-            if (rsieb == null || sieb == null) {
-                continue;
-            }
+        SieveArray sa = new SieveArray();
 
-            int idx = sieve(sieb);
-            String quantString = quantString(idx);
-            Double old = (Double)getData(quantString);
-            old = old == null ? 0d : rsieb + old;
-            putData(quantString, old);
+        for (Sieve s: sieves) {
+            sa.doSieving(s);
         }
 
-        double totalQUANT = totalQUANT();
+        sa.calculateNormLoads();
 
-        for (int i = 1; i <= 22; ++i) {
-            String qs = quantString(i);
-            String ns = normQuantString(i);
-            Double quant = (Double)getData(qs);
-            if (quant == null) {
-                putData(ns, Double.valueOf(0d));
-            }
-            else {
-                putData(ns, quant / totalQUANT);
-            }
-        }
+        return sa;
     }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org