view artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthCalculator.java @ 8980:b194fa64506a

SINFO - show results themes according to spec, either raw data or floating mean values. Some improvements to error handling and handling of empty results.
author gernotbelger
date Thu, 05 Apr 2018 18:30:34 +0200
parents b5600453bb8f
children d5802f22e4f5
line wrap: on
line source
/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
 * Software engineering by
 *  Björnsen Beratende Ingenieure GmbH
 *  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
 *
 * 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.flowdepth;

import java.util.ArrayList;
import java.util.Collection;

import org.apache.commons.lang.math.DoubleRange;
import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider;
import org.dive4elements.river.artifacts.sinfo.common.SInfoResultRow;
import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType;
import org.dive4elements.river.artifacts.sinfo.tkhcalculation.TkhCalculator;
import org.dive4elements.river.artifacts.sinfo.tkhstate.BedHeightsFinder;
import org.dive4elements.river.artifacts.sinfo.util.WstInfo;

/**
 * @author Gernot Belger
 */
final class FlowDepthCalculator {

    private final Collection<SInfoResultRow> rows = new ArrayList<>();

    private final BedHeightsFinder bedHeight;

    private final TkhCalculator tkhCalculator;

    private final RiverInfoProvider riverInfoProvider;

    private final String bedHeightLabel;

    private final String wstLabel;

    public FlowDepthCalculator(final RiverInfoProvider riverInfoProvider, final String wstLabel, final BedHeightsFinder bedHeight,
            final TkhCalculator tkhCalculator) {

        this.riverInfoProvider = riverInfoProvider;
        this.wstLabel = wstLabel;

        this.bedHeight = bedHeight;
        this.tkhCalculator = tkhCalculator;

        this.bedHeightLabel = bedHeight.getInfo().getDescription();
    }

    public FlowDepthCalculationResult execute(final String label, final WstInfo wstInfo, final DoubleRange calcRange) {

        final Collection<Double> stations = this.bedHeight.getStations();
        for (final Double station : stations) {
            if (calcRange.containsDouble(station))
                calculateResultRow(station);
        }

        final boolean hasTkh = this.tkhCalculator.hasTkh();

        return new FlowDepthCalculationResult(label, wstInfo, this.bedHeight.getInfo(), hasTkh, this.rows);
    }

    private void calculateResultRow(final double station) {

        final SInfoResultRow row = SInfoResultRow.create();

        row.putValue(SInfoResultType.waterlevelLabel, this.wstLabel);
        row.putValue(SInfoResultType.soundingLabel, this.bedHeightLabel);

        // REMARK: access the gauge once only during calculation
        final String gaugeLabel = this.riverInfoProvider.findGauge(station);
        row.putValue(SInfoResultType.gaugeLabel, gaugeLabel);

        // REMARK: access the location once only during calculation
        final String location = this.riverInfoProvider.getLocation(station);
        row.putValue(SInfoResultType.location, location);

        if (this.tkhCalculator.calculateTkh(station, row))
            this.rows.add(row);
    }
}

http://dive4elements.wald.intevation.org