Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java @ 9533:d9fda7af24ca
No discharge zone calculation and output for gauges unknown in flys for sinfo collision (Meilenstein 2, 2.2.1)
author | mschaefer |
---|---|
date | Thu, 04 Oct 2018 12:48:57 +0200 |
parents | 853f2dafc16e |
children | 0c114309d2a0 |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java Tue Oct 02 18:19:44 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java Thu Oct 04 12:48:57 2018 +0200 @@ -24,7 +24,6 @@ import org.dive4elements.river.artifacts.model.Calculation; import org.dive4elements.river.artifacts.model.CalculationResult; import org.dive4elements.river.artifacts.model.DateRange; -import org.dive4elements.river.artifacts.model.river.RiverInfoProvider; import org.dive4elements.river.artifacts.resources.Resources; import org.dive4elements.river.artifacts.sinfo.SINFOArtifact; import org.dive4elements.river.artifacts.sinfo.common.GaugeDischargeValuesFinder; @@ -33,7 +32,6 @@ import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils; import org.dive4elements.river.artifacts.sinfo.util.RiverInfo; import org.dive4elements.river.backend.utils.DateUtil; -import org.dive4elements.river.model.Gauge; import org.dive4elements.river.model.MainValueType.MainValueTypeKey; import org.dive4elements.river.model.River; import org.dive4elements.river.model.sinfo.CollisionAggregateValue; @@ -88,19 +86,12 @@ overViewRows); results.addResult(overviewResult, problems); - // create q-for-w-finders for all gauges of the calculation km range - final RiverInfoProvider infoProvider = RiverInfoProvider.forRange(this.context, river, calcRange); - final Map<Gauge, GaugeDischargeValuesFinder> qFinders = new HashMap<>(); - final Map<Gauge, GaugeMainValueFinder> zoneFinders = new HashMap<>(); - for (final Gauge gauge : river.determineGauges(calcRange.getMinimumDouble(), calcRange.getMaximumDouble())) { - qFinders.put(gauge, GaugeDischargeValuesFinder.loadValues(gauge, problems)); - zoneFinders.put(gauge, GaugeMainValueFinder.loadValues(MainValueTypeKey.Q, gauge, problems)); - } + // calculate secondary results for each year + final Map<String, GaugeDischargeValuesFinder> qFinders = new HashMap<>(); + final Map<String, GaugeMainValueFinder> zoneFinders = new HashMap<>(); final Collection<ResultRow> detailsRows = new ArrayList<>(); - - // calculate secondary results for each year for (final Integer year : detailYears) - calculateDetails(detailsRows, infoProvider, access.getLowerKm(), access.getUpperKm(), year, qFinders, zoneFinders); + calculateDetails(detailsRows, river, access.getLowerKm(), access.getUpperKm(), year, qFinders, zoneFinders, problems); final CollisionCalcDetailResult detailResult = new CollisionCalcDetailResult("Details", detailsRows); results.addResult(detailResult, problems); @@ -145,17 +136,52 @@ /** * Calculates the collision details for a km range of a river and a year, and adds them to a ResultRow collection */ - private void calculateDetails(final Collection<ResultRow> rows, final RiverInfoProvider riverInfo, final double fromKm, final double toKm, - final int year, final Map<Gauge, GaugeDischargeValuesFinder> qFinders, final Map<Gauge, GaugeMainValueFinder> zoneFinders) { - for (final CollisionValue collision : CollisionValue.getValues(riverInfo.getRiver(), fromKm, toKm, DateUtil.getStartDateFromYear(year), + private void calculateDetails(final Collection<ResultRow> rows, final River river, final double fromKm, final double toKm, + final int year, final Map<String, GaugeDischargeValuesFinder> qFinders, final Map<String, GaugeMainValueFinder> zoneFinders, + final Calculation problems) { + + for (final CollisionValue collision : CollisionValue.getValues(river, fromKm, toKm, DateUtil.getStartDateFromYear(year), DateUtil.getEndDateFromYear(year))) { - final Gauge gauge = riverInfo.getGauge(collision.getStation(), true); - final double q = qFinders.get(gauge).getDischarge(collision.getGaugeW()); + final String gaugeName = collision.getGaugeName(); + final double q = getQ(qFinders, gaugeName, collision.getGaugeW().doubleValue(), river, problems); final double qOut = Double.isInfinite(q) ? Double.NaN : q; + final String zone = getZone(zoneFinders, gaugeName, q, river, problems); rows.add(ResultRow.create().putValue(GeneralResultType.station, collision.getStation()) - .putValue(GeneralResultType.dateShort, collision.getEventDate()).putValue(SInfoResultType.collisionGaugeW, collision.getGaugeW()) - .putValue(GeneralResultType.gaugeLabelCm, collision.getGaugeName()).putValue(SInfoResultType.dischargeLong, qOut) - .putValue(SInfoResultType.dischargeZone, zoneFinders.get(gauge).findZoneName(q))); + .putValue(GeneralResultType.dateShort, collision.getEventDate()) + .putValue(SInfoResultType.collisionGaugeW, collision.getGaugeW()) + .putValue(GeneralResultType.gaugeLabelCm, gaugeName) + .putValue(SInfoResultType.dischargeLong, qOut) + .putValue(SInfoResultType.dischargeZone, zone)); } } + + /** + * Gets the discharge of a gauge and a W + */ + private double getQ(final Map<String, GaugeDischargeValuesFinder> qFinders, final String gaugeName, final double w, + final River river, final Calculation problems) { + // Find the gauge and load its discharge table, if not already in the map + final String gnKey = gaugeName.toLowerCase(); + if (!qFinders.containsKey(gnKey)) + qFinders.put(gnKey, GaugeDischargeValuesFinder.loadValues(river, gaugeName, problems)); + // Interpolate W. + if (qFinders.get(gnKey) == null) + return Double.NaN; + return qFinders.get(gnKey).getDischarge(w); + } + + /** + * Gets the main value zone name of a gauge and a Q + */ + private String getZone(final Map<String, GaugeMainValueFinder> zoneFinders, final String gaugeName, final double q, + final River river, final Calculation problems) { + // Find the gauge and load its main value list, if not already in the map + final String gnKey = gaugeName.toLowerCase(); + if (!zoneFinders.containsKey(gnKey)) + zoneFinders.put(gnKey, GaugeMainValueFinder.loadValues(MainValueTypeKey.Q, river, gaugeName, problems)); + // Build the zone name + if (zoneFinders.get(gnKey) == null) + return ""; + return zoneFinders.get(gnKey).findZoneName(q); + } } \ No newline at end of file