view artifacts/src/main/java/org/dive4elements/river/artifacts/model/fixings/FixingColumn.java @ 9415:9744ce3c3853

Rework of fixanalysis computation and dWt and WQ facets. Got rid of strange remapping and bitshifting code by explicitely saving the column information and using it in the facets. The facets also put the valid station range into their xml-metadata
author gernotbelger
date Thu, 16 Aug 2018 16:27:53 +0200
parents
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