view artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixingColumn.java @ 9646:0380717105ba

Implemented alternative fitting strategy for Log-Linear function.
author Gernot Belger <g.belger@bjoernsen.de>
date Mon, 02 Dec 2019 17:56:15 +0100
parents 9744ce3c3853
children
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.model.fixings;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.dive4elements.river.artifacts.model.GaugeFinder;
import org.dive4elements.river.artifacts.model.GaugeRange;
import org.dive4elements.river.artifacts.model.Range;

public class FixingColumn extends Range {

    private static final long serialVersionUID = 1L;

    private Fixing fixing;

    private int columnId;

    private Date startTime;

    private String name;

    private List<SectorRange> sectors;

    public FixingColumn() {
    }

    public FixingColumn(final Fixing fixing, final int columnId, final Date startTime, final String name) {
        this.fixing = fixing;
        this.columnId = columnId;
        this.startTime = startTime;
        this.name = name;

        this.sectors = new ArrayList<>();
    }

    public int getId() {
        return this.columnId;
    }

    public Fixing getFixing() {
        return this.fixing;
    }

    public Date getStartTime() {
        return this.startTime;
    }

    public String getName() {
        return this.name;
    }

    public String getDescription() {
        return this.fixing.getDescription() + "/" + this.name;
    }

    public List<SectorRange> getSectors() {
        return this.sectors;
    }

    public boolean hasSectorsInRange(final Range range) {
        for (final SectorRange sector : this.sectors) {
            if (sector.intersects(range)) {
                return true;
            }
        }
        return false;
    }

    public List<SectorRange> getSectors(final Range range) {

        final List<SectorRange> result = new ArrayList<>(this.sectors.size());

        for (final SectorRange src : this.sectors) {
            final SectorRange dst = new SectorRange(src);
            if (range == null || dst.clip(range)) {
                result.add(dst);
            }
        }

        return result;
    }

    public int findQSector(final double km) {
        for (final SectorRange sector : this.sectors) {
            if (sector.inside(km)) {
                return sector.getSector();
            }
        }
        return -1;
    }

    public void buildSectors(final GaugeFinder gaugeFinder, final List<QRange> qRanges) {
        for (final QRange qRange : qRanges) {
            for (final GaugeRange gRange : gaugeFinder.getGauges()) {
                final SectorRange sector = new SectorRange(qRange);
                if (!sector.clip(gRange)) {
                    continue;
                }
                sector.setSector(gRange.classify(qRange.q));

                if (this.sectors.isEmpty() || !this.sectors.get(this.sectors.size() - 1).enlarge(sector)) {
                    this.sectors.add(sector);
                }
            } // for all gauges
        } // for all Q ranges
    }

    public void loadKmRange(final KMRangeLoader loader) {

        final double[] range = loader.get(this.columnId);

        if (range == null) {
            FixingsOverview.log.warn("No km range for column " + this.columnId + ".");
            return;
        }
        this.setStart(range[0]);
        this.setEnd(range[1]);
    }

    public void loadQRanges(final ColumnQRangeLoader loader, final GaugeFinder gaugeFinder) {
        final List<double[]> qrs = loader.get(this.columnId);
        if (qrs == null) {
            FixingsOverview.log.warn("No q ranges found for column " + this.columnId);
            return;
        }

        final List<QRange> qRanges = new ArrayList<>(qrs.size());

        for (final double[] qr : qrs) {
            final double q = qr[0];
            final double start = qr[1];
            final double end = qr[2];

            final QRange qRange = new QRange(start, end, q);
            if (qRange.clip(this)) {
                qRanges.add(qRange);
            }
        }

        buildSectors(gaugeFinder, qRanges);
    }
}

http://dive4elements.wald.intevation.org