view artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCurveFacet.java @ 9252:c2a0028bfa9f

Work on S-Info flood duration curve chart
author mschaefer
date Thu, 12 Jul 2018 18:09:48 +0200
parents
children ef7b65576d4b
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 java.util.ArrayList;
import java.util.List;

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.model.WQDay;
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();

        return data.getDurationCurve();
        // return getTestData();
    }

    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