sascha@3289: package de.intevation.flys.artifacts.model.sq; sascha@3289: sascha@3289: import java.util.Map; sascha@3289: teichmann@3981: import org.apache.commons.logging.Log; teichmann@3981: import org.apache.commons.logging.LogFactory; teichmann@3981: sascha@3289: public class Measurement sascha@3289: { teichmann@3981: private static final Log log = teichmann@3981: LogFactory.getLog(Measurement.class); teichmann@3981: teichmann@3981: public static final double ADD_8 = Math.log(10) - Math.log(8)/Math.log(6.3); teichmann@3981: public static final double SCALE_8 = Math.log(6.3); teichmann@3981: teichmann@3981: public static final double ADD_4 = Math.log(8) - Math.log(6.3)/Math.log(10); teichmann@3981: public static final double SCALE_4 = Math.log(6.3); teichmann@3981: teichmann@3981: public static final double [] SIEVE_DIAMETERS = { teichmann@3981: 100d, 63d, 31.5d, 16d, teichmann@3981: 8d, 4d, 2d, 1d, teichmann@3981: 0.5d, 0.25d, 0.125d, 0.063d teichmann@3981: }; teichmann@3981: sascha@3289: protected Map data; sascha@3289: sascha@3928: protected Measurement prev; sascha@3928: protected Measurement next; sascha@3928: sascha@3289: public Measurement() { sascha@3289: } sascha@3289: sascha@3289: public Measurement(Map data) { sascha@3289: this.data = data; sascha@3289: } sascha@3289: teichmann@3981: public Measurement head() { teichmann@3981: Measurement current = this; teichmann@3981: while (current.prev != null) { teichmann@3981: current = current.prev; teichmann@3981: } teichmann@3981: return current; teichmann@3981: } teichmann@3981: sascha@3290: protected double get(String name) { sascha@3290: Number value = (Number)data.get(name); sascha@3290: return value != null ? value.doubleValue() : Double.NaN; sascha@3290: } sascha@3290: teichmann@3981: protected void set(String name, double value) { teichmann@3981: data.put(name, Double.valueOf(value)); teichmann@3981: } teichmann@3981: teichmann@3981: protected Object getData(String name) { teichmann@3981: return data.get(name); teichmann@3981: } teichmann@3981: teichmann@3981: protected void putData(String name, Object value) { teichmann@3981: data.put(name, value); teichmann@3981: } teichmann@3981: sascha@3290: public double S_SS() { sascha@3290: return get("TSAND"); sascha@3290: } sascha@3290: sascha@3290: public double S_SF() { sascha@3290: return get("TSCHWEB") - get("TSAND"); sascha@3290: } sascha@3290: sascha@3290: public double Q() { sascha@3393: return get("Q_BPEGEL"); sascha@3290: } sascha@3290: sascha@3389: public double TOTAL_BL() { sascha@3922: return get("TGESCHIEBE"); sascha@3290: } sascha@3290: sascha@3922: public double BL_G() { sascha@3389: // TODO: Implement me! sascha@3389: return Double.NaN; sascha@3389: } sascha@3389: sascha@3922: public double BL_C() { sascha@3290: // TODO: Implement me! sascha@3290: return Double.NaN; sascha@3290: } sascha@3290: sascha@3922: public double BL_S() { sascha@3290: // TODO: Implement me! sascha@3290: return Double.NaN; sascha@3290: } sascha@3290: sascha@3922: public double S_BL_S() { sascha@3922: return TOTAL_BL() * BL_S(); sascha@3922: } sascha@3922: sascha@3922: public double S_BL_FG() { sascha@3922: return TOTAL_BL() * BL_G(); sascha@3922: } sascha@3922: sascha@3922: public double S_BL_CG() { sascha@3922: return TOTAL_BL() * BL_C(); sascha@3290: } sascha@3289: sascha@3389: public double S_BL_1() { sascha@3389: return S_BL_S() + S_BL_FG() + S_BL_CG(); sascha@3389: } sascha@3293: sascha@3389: public double S_BL_2() { sascha@3389: return S_SS() + S_BL_S() + S_BL_FG() + S_BL_CG(); sascha@3389: } sascha@3293: sascha@3389: public double SIEB(int i) { teichmann@3981: return get(siebString(i)); sascha@3389: } sascha@3389: sascha@3389: public double RSIEB(int i) { teichmann@3981: return get(rsiebString(i)); sascha@3389: } sascha@3389: sascha@3389: public double REST() { sascha@3389: return get("REST"); sascha@3389: } sascha@3293: sascha@3289: @Override sascha@3289: public String toString() { sascha@3289: return "Measurement: " + data; sascha@3289: } sascha@3928: sascha@3928: /** sascha@3928: * Gets the prev for this instance. sascha@3928: * sascha@3928: * @return The prev. sascha@3928: */ sascha@3928: public Measurement getPrev() { sascha@3928: return this.prev; sascha@3928: } sascha@3928: sascha@3928: /** sascha@3928: * Sets the prev for this instance. sascha@3928: * sascha@3928: * @param prev The prev. sascha@3928: */ sascha@3928: public void setPrev(Measurement prev) { sascha@3928: this.prev = prev; sascha@3928: } sascha@3928: sascha@3928: /** sascha@3928: * Gets the next for this instance. sascha@3928: * sascha@3928: * @return The next. sascha@3928: */ sascha@3928: public Measurement getNext() { sascha@3928: return this.next; sascha@3928: } sascha@3928: sascha@3928: /** sascha@3928: * Sets the next for this instance. sascha@3928: * sascha@3928: * @param next The next. sascha@3928: */ sascha@3928: public void setNext(Measurement next) { sascha@3928: this.next = next; sascha@3928: } teichmann@3981: teichmann@3981: protected int findSieveIndex(double diameter) { teichmann@3981: for (int i = 1; i <= 22; ++i) { teichmann@3981: double size = SIEB(i); teichmann@3981: if (Math.abs(size - diameter) < 0.00001) { teichmann@3981: return i; teichmann@3981: } teichmann@3981: } teichmann@3981: return -1; teichmann@3981: } teichmann@3981: teichmann@3981: public static int sieve(double value) { teichmann@3981: for (int i = 0; i < SIEVE_DIAMETERS.length; ++i) { teichmann@3981: if (value >= SIEVE_DIAMETERS[i]) { teichmann@3981: return i+1; teichmann@3981: } teichmann@3981: } teichmann@3981: return SIEVE_DIAMETERS.length; teichmann@3981: } teichmann@3981: teichmann@3981: private static final String rsiebString(int idx) { teichmann@3981: return String.format("RSIEB%02d", idx); teichmann@3981: } teichmann@3981: teichmann@3981: private static final String siebString(int idx) { teichmann@3981: return String.format("SIEB%02d", idx); teichmann@3981: } teichmann@3981: teichmann@3981: private static final String quantString(int idx) { teichmann@3981: return String.format("QUANT%02d", idx); teichmann@3981: } teichmann@3981: teichmann@3981: private static final String normQuantString(int idx) { teichmann@3981: return String.format("NORMQUANT%02d", idx); teichmann@3981: } teichmann@3981: teichmann@3981: protected void deleteSieve(int idx) { teichmann@3981: data.remove(rsiebString(idx)); teichmann@3981: data.remove(siebString(idx)); teichmann@3981: } teichmann@3981: teichmann@3981: protected void putSieve(int idx, double diameter, double value) { teichmann@3981: data.put(rsiebString(idx), Double.valueOf(value)); teichmann@3981: data.put(siebString(idx), Double.valueOf(diameter)); teichmann@3981: } teichmann@3981: teichmann@3981: protected double totalRSIEB() { teichmann@3981: double sum = 0d; teichmann@3981: for (int i = 1; i <= 21; ++i) { teichmann@3981: Double x = (Double)data.get(rsiebString(i)); teichmann@3981: if (x != null) { teichmann@3981: sum += x; teichmann@3981: } teichmann@3981: } teichmann@3981: return sum; teichmann@3981: } teichmann@3981: teichmann@3981: protected double totalQUANT() { teichmann@3981: double sum = 0d; teichmann@3981: for (int i = 1; i <= 22; ++i) { teichmann@3981: Double x = (Double)data.get(quantString(i)); teichmann@3981: if (x != null) { teichmann@3981: sum += x; teichmann@3981: } teichmann@3981: } teichmann@3981: return sum; teichmann@3981: } teichmann@3981: teichmann@3981: public void adjustOriginalSieves() { teichmann@3981: teichmann@3981: // If we already have an 8mm diameter sieve teichmann@3981: // we dont need to 'invent' it. teichmann@3981: if (findSieveIndex(8d) > -1) { teichmann@3981: return; teichmann@3981: } teichmann@3981: teichmann@3981: // create a new 8mm sieve. teichmann@3981: // delete 6.3mm sieve. teichmann@3981: // modify 4mm sieve. teichmann@3981: // teichmann@3981: int sixIdx = findSieveIndex(6.3d); teichmann@3981: int tenIdx = findSieveIndex(10d); teichmann@3981: int fourIdx = findSieveIndex(4d); teichmann@3981: teichmann@3981: if (sixIdx < 0 || tenIdx < 0 || fourIdx < 0) { teichmann@3981: log.warn("missind diameter"); teichmann@3981: return; teichmann@3981: } teichmann@3981: teichmann@3981: double sixValue = RSIEB(sixIdx); teichmann@3981: double tenValue = RSIEB(tenIdx); teichmann@3981: double fourValue = RSIEB(fourIdx); teichmann@3981: teichmann@3981: deleteSieve(sixIdx); teichmann@3981: teichmann@3981: double eightValue = ADD_8 - SCALE_8*sixValue + tenValue; teichmann@3981: double newFourValue = ADD_4 - SCALE_4*sixValue + fourValue; teichmann@3981: teichmann@3981: putSieve(22, 8d, eightValue); teichmann@3981: putSieve(fourIdx, 4d, newFourValue); teichmann@3981: } teichmann@3981: teichmann@3981: teichmann@3981: public void fillSieveCategories() { teichmann@3981: adjustOriginalSieves(); teichmann@3981: teichmann@3981: for (int i = 1; i <= 22; ++i) { teichmann@3981: Double rsieb = (Double)getData(rsiebString(i)); teichmann@3981: Double sieb = (Double)getData(siebString(i)); teichmann@3981: if (rsieb == null || sieb == null) { teichmann@3981: continue; teichmann@3981: } teichmann@3981: teichmann@3981: int idx = sieve(sieb); teichmann@3981: String quantString = quantString(idx); teichmann@3981: Double old = (Double)getData(quantString); teichmann@3981: old = old == null ? 0d : rsieb + old; teichmann@3981: putData(quantString, old); teichmann@3981: } teichmann@3981: teichmann@3981: double totalQUANT = totalQUANT(); teichmann@3981: teichmann@3981: for (int i = 1; i <= 22; ++i) { teichmann@3981: String qs = quantString(i); teichmann@3981: String ns = normQuantString(i); teichmann@3981: Double quant = (Double)getData(qs); teichmann@3981: if (quant == null) { teichmann@3981: putData(ns, Double.valueOf(0d)); teichmann@3981: } teichmann@3981: else { teichmann@3981: putData(ns, quant / totalQUANT); teichmann@3981: } teichmann@3981: } teichmann@3981: } sascha@3289: } sascha@3289: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :