Mercurial > dive4elements > river
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); } }