teichmann@8033: /* Copyright (C) 2014 by Bundesanstalt für Gewässerkunde teichmann@8033: * Software engineering by Intevation GmbH teichmann@8033: * teichmann@8033: * This file is Free Software under the GNU AGPL (>=v3) teichmann@8033: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@8033: * documentation coming with Dive4Elements River for details. teichmann@8033: */ teichmann@8033: package org.dive4elements.river.artifacts.model.minfo; teichmann@8033: teichmann@8033: import java.io.Serializable; teichmann@8033: import java.util.ArrayList; teichmann@8033: import java.util.Collections; teichmann@8033: import java.util.Date; teichmann@8033: import java.util.List; teichmann@8033: import java.util.NavigableMap; teichmann@8033: import java.util.TreeMap; teichmann@8033: teichmann@8033: import org.dive4elements.river.utils.EpsilonComparator; teichmann@8033: teichmann@8033: public class SedimentLoadData implements Serializable teichmann@8033: { teichmann@8033: public static final double STATION_EPS = 0.0001; teichmann@8033: teichmann@8033: public static final int GF_COARSE = 0; teichmann@8033: public static final int GF_FINE_MIDDLE = 1; teichmann@8033: public static final int GF_SAND = 2; teichmann@8033: public static final int GF_SUSP_SAND = 3; teichmann@8033: public static final int GF_SUSP_SAND_BED = 4; teichmann@8033: public static final int GF_SUSP_SEDIMENT = 5; teichmann@8033: public static final int GF_MAX = 5; teichmann@8033: teichmann@8033: public static final int grainFractionIndex(String name) { teichmann@8033: if ("coarse".equals(name)) return GF_COARSE; teichmann@8033: if ("fine_middle".equals(name)) return GF_FINE_MIDDLE; teichmann@8033: if ("sand".equals(name)) return GF_SAND; teichmann@8033: if ("susp_sand".equals(name)) return GF_SUSP_SAND; teichmann@8033: if ("susp_sand_bed".equals(name)) return GF_SUSP_SAND_BED; teichmann@8033: if ("suspended_sediment".equals(name)) return GF_SUSP_SEDIMENT; teichmann@8033: return -1; teichmann@8033: } teichmann@8033: teichmann@8033: public static class Value implements Serializable { teichmann@8033: teichmann@8033: private double value; teichmann@8033: teichmann@8033: private Load load; teichmann@8033: teichmann@8033: public Value() { teichmann@8033: } teichmann@8033: teichmann@8033: public Value(Load load, double value) { teichmann@8033: this.load = load; teichmann@8033: this.value = value; teichmann@8033: } teichmann@8033: teichmann@8033: public double getValue() { teichmann@8033: return value; teichmann@8033: } teichmann@8033: teichmann@8033: public Load getLoad() { teichmann@8033: return load; teichmann@8033: } teichmann@8033: } // class Value teichmann@8033: teichmann@8033: teichmann@8033: public static class Load implements Serializable { teichmann@8033: teichmann@8033: private int id; teichmann@8033: teichmann@8033: private String description; teichmann@8033: teichmann@8033: private Date startTime; teichmann@8033: private Date stopTime; teichmann@8033: teichmann@8033: public Load() { teichmann@8033: } teichmann@8033: teichmann@8033: public Load(int id, String description, Date startTime, Date stopTime) { teichmann@8033: this.id = id; teichmann@8033: this.description = description; teichmann@8033: this.startTime = startTime; teichmann@8033: this.stopTime = stopTime; teichmann@8033: } teichmann@8033: teichmann@8033: public int getId() { teichmann@8033: return id; teichmann@8033: } teichmann@8033: teichmann@8033: public String getDescription() { teichmann@8033: return description; teichmann@8033: } teichmann@8033: teichmann@8033: public Date getStartTime() { teichmann@8033: return startTime; teichmann@8033: } teichmann@8033: teichmann@8033: public Date getStopTime() { teichmann@8033: return stopTime; teichmann@8033: } teichmann@8033: teichmann@8033: public boolean isEpoch() { teichmann@8033: return startTime != null && stopTime != null; teichmann@8033: } teichmann@8033: } // class SedimentLoad teichmann@8033: teichmann@8033: public static class Station implements Serializable { teichmann@8033: teichmann@8033: public static final int BED_LOAD = 0; teichmann@8033: public static final int SUSPENDED = 1; teichmann@8033: teichmann@8033: public interface Visitor { teichmann@8033: boolean accept(Station station); teichmann@8033: boolean accept(int grainFraction); teichmann@8033: boolean visit(Value value, int grainFraction); teichmann@8033: } teichmann@8033: teichmann@8033: private double station; teichmann@8033: teichmann@8033: private int type; teichmann@8033: teichmann@8033: private List> grainFractions; teichmann@8033: teichmann@8033: public Station() { teichmann@8033: this(BED_LOAD, 0.0); teichmann@8033: } teichmann@8033: teichmann@8033: public Station(int type, double station) { teichmann@8033: grainFractions = new ArrayList>(GF_MAX+1); teichmann@8033: for (int i = 0; i < GF_MAX+1; ++i) { teichmann@8033: grainFractions.add(new ArrayList()); teichmann@8033: } teichmann@8033: this.type = type; teichmann@8033: this.station = station; teichmann@8033: } teichmann@8033: teichmann@8033: public double getStation() { teichmann@8033: return station; teichmann@8033: } teichmann@8033: teichmann@8033: public int getType() { teichmann@8033: return type; teichmann@8033: } teichmann@8033: teichmann@8033: public void addValue(int grainFraction, Value value) { teichmann@8033: grainFractions.get(grainFraction).add(value); teichmann@8033: } teichmann@8033: teichmann@8033: public boolean hasGrainFraction(String grainFraction) { teichmann@8033: return hasGrainFraction(grainFractionIndex(grainFraction)); teichmann@8033: } teichmann@8033: teichmann@8033: public boolean hasGrainFraction(int grainFraction) { teichmann@8033: List values = grainFractions.get(grainFraction); teichmann@8033: return !values.isEmpty(); teichmann@8033: } teichmann@8033: teichmann@8033: public void visit(Visitor visitor) { teichmann@8033: if (!visitor.accept(this)) { teichmann@8033: return; teichmann@8033: } teichmann@8033: teichmann@8033: for (int i = 0; i < GF_MAX+1; ++i) { teichmann@8033: List values = grainFractions.get(i); teichmann@8033: if (values.isEmpty() || !visitor.accept(i)) { teichmann@8033: continue; teichmann@8033: } teichmann@8033: for (Value value: values) { teichmann@8033: if (!visitor.visit(value, i)) { teichmann@8033: break; teichmann@8033: } teichmann@8033: } teichmann@8033: } teichmann@8033: } teichmann@8033: teichmann@8033: public boolean inside(double a, double b) { teichmann@8033: return station >= a && station <= b; teichmann@8033: } teichmann@8033: } // class Station teichmann@8033: teichmann@8033: teichmann@8033: private TreeMap> stations; teichmann@8033: teichmann@8033: public SedimentLoadData() { teichmann@8033: stations = new TreeMap>(EpsilonComparator.CMP); teichmann@8033: } teichmann@8033: teichmann@8033: public void addStation(Station station) { teichmann@8033: Double key = station.getStation(); teichmann@8033: List sts = stations.get(key); teichmann@8033: if (sts == null) { teichmann@8033: sts = new ArrayList(2); teichmann@8033: stations.put(key, sts); teichmann@8033: } teichmann@8033: sts.add(station); teichmann@8033: } teichmann@8033: teichmann@8033: teichmann@8033: public NavigableMap> range(double from, double to) { teichmann@8033: teichmann@8033: if (from > to) { teichmann@8033: double t = from; from = to; to = t; teichmann@8033: } teichmann@8033: teichmann@8033: return stations.subMap(from, true, to, true); teichmann@8033: } teichmann@8033: } teichmann@8033: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :