Mercurial > dive4elements > river
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 :