view artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCurveFacet.java @ 9266:465347d12990

Station specific calculation of flood duration curve and infrastructure annotations
author mschaefer
date Wed, 18 Jul 2018 12:20:01 +0200
parents e5367900dd6d
children ae9dee74e43e
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */

package org.dive4elements.river.artifacts.sinfo.flood_duration;

import static org.dive4elements.river.exports.injector.InjectorConstants.CURRENT_KM;

import org.apache.log4j.Logger;
import org.dive4elements.artifactdatabase.state.DefaultFacet;
import org.dive4elements.artifactdatabase.state.Facet;
import org.dive4elements.artifacts.Artifact;
import org.dive4elements.artifacts.CallContext;
import org.dive4elements.river.artifacts.D4EArtifact;
import org.dive4elements.river.artifacts.model.CalculationResult;
import org.dive4elements.river.artifacts.sinfo.SINFOArtifact;
import org.dive4elements.river.artifacts.states.DefaultState.ComputeType;


/**
 * Data of a duration curve.
 */
public class FloodDurationCurveFacet extends DefaultFacet {

    private static Logger log = Logger.getLogger(FloodDurationCurveFacet.class);

    // /** Blackboard data provider key for durationcurve (wqday) data. */
    // public static String BB_DURATIONCURVE = "durationcurve";
    //
    // /** Blackboard data provider key for km of durationcurve. */
    // public static String BB_DURATIONCURVE_KM = "durationcurve.km";

    public FloodDurationCurveFacet() {
    }

    public FloodDurationCurveFacet(final String name, final String description) {
        super(0, name, description);
    }


    /**
     * Expose state computation from SINFOArtifact.
     */
    @Override
    public Object getData(final Artifact artifact, final CallContext context) {

        log.debug("Get data for flood duration curve data");

        final D4EArtifact flys = (D4EArtifact) artifact;

        final CalculationResult res = (CalculationResult) flys.compute(context, ComputeType.ADVANCE, false);

        final FloodDurationCalculationResults data = (FloodDurationCalculationResults) res.getData();

        final double currentKm = getCurrentKm(context);
        // TODO: entweder in data.getDurationCurve() reingeben, oder bei FloodDurationCalculationResults auswerten...
        // TODO: was ist aus perfromanz/speicher-sicht besser?

        // return data.getDurationCurve();
        return new FloodDurationCalculation(context).calcStationCurve(currentKm, (SINFOArtifact) flys);
    }

    /**
     * Returns the current km from the context.
     * If the context is null or doesn't contain a currentKm
     * then a double value of -1 will be returned.
     *
     * @param context
     *            The CallContext instance
     * @return the current km as double
     */
    // FIXME: copied from org.dive4elements.river.artifacts.model.fixings.FixingsFacet
    private double getCurrentKm(final CallContext context) {
        if (context == null)
            return Double.NaN;

        final Double dkm = (Double) context.getContextValue(CURRENT_KM);
        if (dkm == null)
            return Double.NaN;

        return dkm.doubleValue();
    }

    // private WQDay getTestData() {
    // final int[] days = new int[366];
    // final double[] ws = new double[366];
    // final double[] qs = new double[366];
    // for (int i = 0; i <= 365; i++) {
    // days[i] = i;
    // final double x = (i - 182.5) / 182.5;
    // ws[i] = 102.0 - (Math.pow(x, 5) + x);
    // qs[i] = 1600.0 - 800 * (Math.pow(x, 9) + x);
    // }
    // return new WQDay(days, ws, qs);
    // }

    // @Override
    // public List getStaticDataProviderKeys(final Artifact art) {
    // final List list = new ArrayList();
    // list.add(BB_DURATIONCURVE);
    // list.add(BB_DURATIONCURVE_KM);
    // return list;
    // }


    // /**
    // * Can provide whatever getData returns and additionally the location.
    // * @param key will respond on BB_DURATIONCURVE +KM
    // * @param param ignored
    // * @param context ignored
    // * @return whatever getData delivers or location.
    // */
    // @Override
    // public Object provideBlackboardData(final Artifact artifact,
    // final Object key,
    // final Object param,
    // final CallContext context
    // ) {
    // if (key.equals(BB_DURATIONCURVE)) {
    // return getData(artifact, context);
    // }
    // else if (key.equals(BB_DURATIONCURVE_KM)) {
    // return ((D4EArtifact)artifact).getDataAsString("ld_locations");
    // }
    // else {
    // return null;
    // }
    // }


    /** Create a deep copy. */
    @Override
    public Facet deepCopy() {
        final FloodDurationCurveFacet copy = new FloodDurationCurveFacet();
        copy.set(this);
        return copy;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org