teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.model.sq; sascha@3289: rrenkert@4837: import java.util.Arrays; teichmann@3992: import java.util.List; 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: rrenkert@4813: public static final double LOG_10_8 = Math.log(10) - Math.log(8); rrenkert@4813: public static final double SCALE_8 = Math.log(10) - Math.log(6.3); teichmann@3981: rrenkert@4813: public static final double LOG_8_6 = Math.log(8) - Math.log(6.3); rrenkert@4813: public static final double SCALE_4 = Math.log(10) - Math.log(6.3); teichmann@3981: teichmann@3992: protected Map data; teichmann@3981: teichmann@3992: protected List sieves; teichmann@3992: teichmann@4002: protected SieveArray sieveArray; teichmann@4002: sascha@3289: public Measurement() { sascha@3289: } sascha@3289: teichmann@3992: public Measurement(Map data, List sieves) { sascha@3289: this.data = data; teichmann@3992: this.sieves = sieves; 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@4001: public Object getData(String name) { teichmann@3981: return data.get(name); teichmann@3981: } teichmann@3981: teichmann@4001: public Map getData() { teichmann@4001: return data; teichmann@4001: } teichmann@4001: 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() { teichmann@4005: return get("BL_G"); sascha@3389: } sascha@3389: sascha@3922: public double BL_C() { teichmann@4005: return get("BL_C"); sascha@3290: } sascha@3290: sascha@3922: public double BL_S() { teichmann@4005: return get("BL_S"); 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@3289: @Override sascha@3289: public String toString() { sascha@3289: return "Measurement: " + data; sascha@3289: } sascha@3928: sascha@3928: /** teichmann@3992: * Gets the sieves for this instance. teichmann@3992: * teichmann@3992: * @return The sieves. teichmann@3992: */ teichmann@3992: public List getSieves() { teichmann@3992: return this.sieves; teichmann@3992: } teichmann@3992: teichmann@3992: /** teichmann@3992: * Gets the sieveArray for this instance. teichmann@3992: * teichmann@3992: * @return The sieveArray. teichmann@3992: */ teichmann@3992: public SieveArray getSieveArray() { teichmann@4002: if (sieveArray == null) { teichmann@4002: sieveArray = calculateSieveArray(); teichmann@4002: } rrenkert@4813: adjustSieves(); teichmann@4002: return sieveArray; sascha@3928: } teichmann@3981: teichmann@3992: protected Sieve findSieve(double diameter) { teichmann@3992: for (Sieve s: sieves) { teichmann@3992: if (s.matchesDiameter(diameter)) { teichmann@3992: return s; teichmann@3981: } teichmann@3981: } teichmann@3992: return null; teichmann@3981: } teichmann@3981: teichmann@3992: protected void deleteSieve(double diameter) { teichmann@3992: for (int i = sieves.size()-1; i >= 0; --i) { teichmann@3992: if (sieves.get(i).matchesDiameter(diameter)) { teichmann@3992: sieves.remove(i); teichmann@3992: break; teichmann@3992: } teichmann@3992: } teichmann@3981: } teichmann@3981: teichmann@4001: public void adjustSieves() { teichmann@3981: teichmann@3981: // If we already have an 8mm diameter sieve teichmann@3981: // we dont need to 'invent' it. teichmann@3992: if (findSieve(8d) != null) { 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@3992: Sieve six = findSieve(6.3d); teichmann@3992: Sieve ten = findSieve(10d); teichmann@3992: Sieve four = findSieve(4d); teichmann@3992: teichmann@3992: if (six == null || ten == null || four == null) { teichmann@4006: log.warn("missing diameter"); teichmann@3981: return; teichmann@3981: } teichmann@3981: teichmann@3992: double sixValue = six.getLoad(); teichmann@3992: double tenValue = ten.getLoad(); teichmann@3992: double fourValue = four.getLoad(); teichmann@3981: teichmann@3992: deleteSieve(6.3); teichmann@3981: rrenkert@4813: double eightValue = ((LOG_10_8 / SCALE_8*sixValue) + tenValue); rrenkert@4813: double newFourValue = ((LOG_8_6 / SCALE_4*sixValue) + fourValue); teichmann@3981: rrenkert@4813: deleteSieve(4.0); teichmann@3992: sieves.add(new Sieve(8d, eightValue)); teichmann@3992: sieves.add(new Sieve(4d, newFourValue)); rrenkert@4813: sieveArray.adjust( rrenkert@4813: eightValue/sieveArray.totalLoad(), rrenkert@4813: newFourValue/sieveArray.totalLoad()); teichmann@7704: teichmann@7704: if (log.isDebugEnabled()) { teichmann@7704: log.debug("Adjusted loads: " + Arrays.toString(sieveArray.getLoads())); teichmann@7704: log.debug("Adjusted norm loads:" + Arrays.toString(sieveArray.getNormLoads())); teichmann@7704: } teichmann@4002: } teichmann@3981: teichmann@4005: protected SieveArray calculateSieveArray() { teichmann@3981: teichmann@3992: SieveArray sa = new SieveArray(); teichmann@3981: teichmann@3992: for (Sieve s: sieves) { teichmann@3992: sa.doSieving(s); teichmann@3981: } teichmann@3981: teichmann@3992: sa.calculateNormLoads(); teichmann@3981: teichmann@3992: return sa; teichmann@3981: } sascha@3289: } sascha@3289: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :