Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/artifacts/GaugeDischargeArtifact.java @ 5838:5aa05a7a34b7
Rename modules to more fitting names.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 15:23:37 +0200 |
parents | flys-artifacts/src/main/java/org/dive4elements/river/artifacts/GaugeDischargeArtifact.java@bd047b71ab37 |
children | 4897a58c8746 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/GaugeDischargeArtifact.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,187 @@ +package org.dive4elements.river.artifacts; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; + +import org.dive4elements.artifactdatabase.state.Facet; + +import org.dive4elements.artifacts.Artifact; +import org.dive4elements.artifacts.ArtifactFactory; +import org.dive4elements.artifacts.CallMeta; + +import org.dive4elements.river.artifacts.model.FacetTypes; +import org.dive4elements.river.artifacts.model.WQKms; + +import org.dive4elements.river.artifacts.states.DefaultState; + +import org.dive4elements.river.artifacts.model.Calculation; +import org.dive4elements.river.artifacts.model.CalculationResult; + +import org.dive4elements.river.artifacts.model.DischargeTables; + +import org.dive4elements.river.model.Gauge; +import org.dive4elements.river.model.River; + +import org.dive4elements.river.utils.FLYSUtils; + + +/** + * Artifact to get discharge curves at gauges. + */ +public class GaugeDischargeArtifact +extends WINFOArtifact +implements FacetTypes +{ + /** The logger for this class. */ + private static Logger logger = Logger.getLogger(GaugeDischargeArtifact.class); + + /** The name of the artifact. */ + public static final String ARTIFACT_NAME = "gaugedischarge"; + + + /** + * Trivial Constructor. + */ + public GaugeDischargeArtifact() { + logger.debug("GaugeDischargeArtifact.GaugeDischargeArtifact()"); + } + + + /** + * Gets called from factory, to set things up. + * Especially, when loaded via datacage mechanisms, provide the + * data document. + * @param data filled with stuff from dc, if any. + */ + @Override + public void setup( + String identifier, + ArtifactFactory factory, + Object context, + CallMeta callMeta, + Document data) + { + logger.debug("GaugeDischargeArtifact.setup"); + String ids = StaticFLYSArtifact.getDatacageIDValue(data); + addStringData("ids", ids); + logger.debug("id for gaugedischarge: " + ids); + super.setup(identifier, factory, context, callMeta, data); + } + + + /** Return the name of this artifact. */ + public String getName() { + return ARTIFACT_NAME; + } + + + /** + * Setup state and facet, copy from master artifact. + */ + @Override + protected void initialize(Artifact art, Object context, CallMeta meta) { + logger.debug("GaugeDischargeArtifact.initialize"); + List<Facet> fs = new ArrayList<Facet>(); + FLYSArtifact artifact = (FLYSArtifact) art; + importData(artifact, "river"); + + // Get the location(s) + //importData(artifact, "ld_mode", ld_from, ld_to, ld_locations + addStringData("ld_from", "0"); + addStringData("ld_to", "1000"); + addStringData("ld_mode", "distance"); + + DefaultState state = (DefaultState) getCurrentState(context); + state.computeInit(this, hash(), context, meta, fs); + if (!fs.isEmpty()) { + logger.debug("Facets to add in GaugeDischargeArtifact.initialize. (" + + state.getID() + "/ " + getCurrentStateId() + ")."); + addFacets(getCurrentStateId(), fs); + } + else { + logger.debug("No facets to add in GaugeDischargeArtifact.initialize (" + + state.getID() + "/ "+getCurrentStateId()+")."); + } + } + + + /** Get the Gauges name which came with datacage data-document. */ + public String getGaugeName() { + return this.getDataAsString("ids"); + } + + + /** Get the Gauges which came with datacage data-document. */ + public Gauge getGauge() { + River river = FLYSUtils.getRiver(this); + return river.determineGaugeByName(getGaugeName()); + } + + + /** + * Returns the data that is used to create discharge curves. + * @return CalculationResult with WQKms. + */ + public CalculationResult getDischargeCurveData() { + + River river = FLYSUtils.getRiver(this); + if (river == null) { + return error(new WQKms[0], "no.river.selected"); + } + /* + // This one would allow to automatically pick the right Gauge. + double [] distance = FLYSUtils.getKmRange(this); + logger.debug("getDischargeCurveData: get range"); + + if (distance == null) { + return error(new WQKms[0], "no.range.found"); + } + + List<Gauge> gauges = river.determineGauges(distance[0], distance[1]); + logger.debug("getDischargeCurveData: got " + gauges.size() + " gauges"); + + if (gauges.isEmpty()) { + return error(new WQKms[0], "no.gauge.selected"); + } + + String [] names = new String[gauges.size()]; + + for (int i = 0; i < names.length; ++i) { + names[i] = gauges.get(i).getName(); + logger.debug("getDischargeCurveData: name " + names[i]); + } + */ + + DischargeTables dt = new DischargeTables(river.getName(), getDataAsString("ids")); + + Map<String, double [][]> map = dt.getValues(100); + + ArrayList<WQKms> res = new ArrayList<WQKms>(); + + Gauge gauge = river.determineGaugeByName(this.getDataAsString("ids")); + + String name = getGaugeName(); + double [][] values = map.get(name); + if (values == null) { + logger.error("No values for this gauge / discharge found."); + return error(new WQKms[0], "no.gauge.found"); + } + for (int i = 0 ; i < values[0].length; i++) { + values[0][i] += gauge.getDatum().doubleValue(); + } + double [] kms = new double[values[0].length]; + Arrays.fill(kms, gauge.getStation().doubleValue()); + res.add(new WQKms(kms, values[0], values[1], name)); + + return new CalculationResult( + res.toArray(new WQKms[res.size()]), + new Calculation()); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :