changeset 9204:4f411c6ee3ae

Individual facets/themes for single years i the S-Info collisions output
author mschaefer
date Mon, 02 Jul 2018 17:40:39 +0200
parents 9831f6c60473
children 3dae6b78e1da b38be7ea53e2
files artifacts/doc/conf/artifacts/sinfo.xml artifacts/doc/conf/themes.xml artifacts/doc/conf/themes/default.xml artifacts/doc/conf/themes/second.xml artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCalculationResult.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcFacet.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcOverviewResult.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionState.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoProcessor.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/CollisionCalcProcessor.java
diffstat 11 files changed, 158 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/doc/conf/artifacts/sinfo.xml	Mon Jul 02 13:00:59 2018 +0200
+++ b/artifacts/doc/conf/artifacts/sinfo.xml	Mon Jul 02 17:40:39 2018 +0200
@@ -281,6 +281,8 @@
         <outputmode name="sinfo_collision" description="output.sinfo_collision" mime-type="image/png" type="chart">
           <facets>
             <facet name="sinfo_facet_collision_calc_count" description="bed collisions" />
+            <facet name="sinfo_facet_collision_calc_count.2" description="bed collisions" />
+            <facet name="sinfo_facet_collision_calc_count.3" description="bed collisions" />
             <facet name="longitudinal_section.annotations" description="facet.longitudinal_section.annotations" />
             <facet name="sinfo_collision.manualpoints" description="Manual Points" />
           </facets>
--- a/artifacts/doc/conf/themes.xml	Mon Jul 02 13:00:59 2018 +0200
+++ b/artifacts/doc/conf/themes.xml	Mon Jul 02 17:40:39 2018 +0200
@@ -442,6 +442,9 @@
         <mapping from="sinfo_facet_bedheight_difference.filtered" to="SInfoBedHeightDifference" />
         
         <mapping from="sinfo_facet_collision_calc_count" to="SInfoCollisionCount" />
+        <mapping from="sinfo_facet_collision_calc_count.2" to="SInfoCollisionCount2" />
+        <mapping from="sinfo_facet_collision_calc_count.3" to="SInfoCollisionCount3" />
+        
         <mapping from="sinfo_facet_flood_duration" to="SInfoFloodDuration" />
         <mapping from="mainvalue.1.duration" to="SInfoMainValues1" />
         <mapping from="mainvalue.2.duration" to="SInfoMainValues2" />
--- a/artifacts/doc/conf/themes/default.xml	Mon Jul 02 13:00:59 2018 +0200
+++ b/artifacts/doc/conf/themes/default.xml	Mon Jul 02 17:40:39 2018 +0200
@@ -3070,6 +3070,24 @@
         </inherits>
         <fields>
             <field name="pointsize" type="int" display="Punktdicke" default="3" />
+            <field name="pointcolor" type="Color" display="Punktfarbe" default="64, 192, 64" />
+        </fields>
+    </theme>
+    <theme name="SInfoCollisionCount2">
+        <inherits>
+            <inherit from="LongitudinalSectionPoints" />
+        </inherits>
+        <fields>
+            <field name="pointsize" type="int" display="Punktdicke" default="2" />
+            <field name="pointcolor" type="Color" display="Punktfarbe" default="192, 0, 0" />
+        </fields>
+    </theme>
+    <theme name="SInfoCollisionCount3">
+        <inherits>
+            <inherit from="LongitudinalSectionPoints" />
+        </inherits>
+        <fields>
+            <field name="pointsize" type="int" display="Punktdicke" default="2" />
             <field name="pointcolor" type="Color" display="Punktfarbe" default="48, 96, 255" />
         </fields>
     </theme>
--- a/artifacts/doc/conf/themes/second.xml	Mon Jul 02 13:00:59 2018 +0200
+++ b/artifacts/doc/conf/themes/second.xml	Mon Jul 02 17:40:39 2018 +0200
@@ -3058,6 +3058,24 @@
         </inherits>
         <fields>
             <field name="pointsize" type="int" display="Punktdicke" default="3" />
+            <field name="pointcolor" type="Color" display="Punktfarbe" default="64, 192, 64" />
+        </fields>
+    </theme>
+    <theme name="SInfoCollisionCount2">
+        <inherits>
+            <inherit from="LongitudinalSectionPoints" />
+        </inherits>
+        <fields>
+            <field name="pointsize" type="int" display="Punktdicke" default="2" />
+            <field name="pointcolor" type="Color" display="Punktfarbe" default="192, 0, 0" />
+        </fields>
+    </theme>
+    <theme name="SInfoCollisionCount3">
+        <inherits>
+            <inherit from="LongitudinalSectionPoints" />
+        </inherits>
+        <fields>
+            <field name="pointsize" type="int" display="Punktdicke" default="2" />
             <field name="pointcolor" type="Color" display="Punktfarbe" default="48, 96, 255" />
         </fields>
     </theme>
@@ -3070,7 +3088,7 @@
             <field name="pointcolor" type="Color" display="Punktfarbe" default="68, 216, 40" />
         </fields>
     </theme>
-    <theme name="MainValues1">
+    <theme name="SInfoMainValues1">
         <inherits>
             <inherit from="MainValuesW" />
         </inherits>
@@ -3078,7 +3096,7 @@
             <field name="linecolor" type="Color" display="Farbe" default="0, 96, 192" />
         </fields>
     </theme>
-    <theme name="MainValues2">
+    <theme name="SInfoMainValues2">
         <inherits>
             <inherit from="MainValuesW" />
         </inherits>
@@ -3086,7 +3104,7 @@
             <field name="linecolor" type="Color" display="Farbe" default="192, 0, 0" />
         </fields>
     </theme>
-    <theme name="MainValues3">
+    <theme name="SInfoMainValues3">
         <inherits>
             <inherit from="MainValuesW" />
         </inherits>
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCalculationResult.java	Mon Jul 02 13:00:59 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AbstractCalculationResult.java	Mon Jul 02 17:40:39 2018 +0200
@@ -66,6 +66,10 @@
         return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() };
     }
 
+    public double[][] getStationPoints(final IResultType type, final int index) {
+        return getStationPoints(type);
+    }
+
     protected final <TYPE> List<TYPE> getValues(final IResultType type) {
 
         final List<TYPE> values = new ArrayList<>();
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcFacet.java	Mon Jul 02 13:00:59 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcFacet.java	Mon Jul 02 17:40:39 2018 +0200
@@ -47,7 +47,7 @@
 
         final CollisionCalculationResults data = (CollisionCalculationResults) res.getData();
 
-        return data.getResults().get(this.index);
+        return data.getResults().get(0); // first result is always the one and only CollisionCalcOverviewResult
     }
 
     /** Copy deeply. */
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcOverviewResult.java	Mon Jul 02 13:00:59 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalcOverviewResult.java	Mon Jul 02 17:40:39 2018 +0200
@@ -16,11 +16,14 @@
 import org.dive4elements.river.artifacts.common.ExportContextCSV;
 import org.dive4elements.river.artifacts.common.ExportContextPDF;
 import org.dive4elements.river.artifacts.common.GeneralResultType;
+import org.dive4elements.river.artifacts.common.IResultType;
 import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource;
 import org.dive4elements.river.artifacts.common.ResultRow;
 import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType;
 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
 
+import gnu.trove.TDoubleArrayList;
+
 /**
  * Contains the results of a {@link CollisionCalculation}.
  *
@@ -32,8 +35,36 @@
 
     private static final String JASPER_FILE = "/jasper/templates/sinfo.collision.overview.jrxml";
 
-    public CollisionCalcOverviewResult(final String label, final Collection<ResultRow> rows) {
+    private final int[] singleYears;
+
+    public CollisionCalcOverviewResult(final String label, final int[] singleYears, final Collection<ResultRow> rows) {
         super(label, rows);
+        this.singleYears = singleYears;
+    }
+
+    public int[] getSingleYears() {
+        return this.singleYears;
+    }
+
+    @Override
+    public double[][] getStationPoints(final IResultType type, final int index) {
+
+        final TDoubleArrayList xPoints = new TDoubleArrayList(this.rows.size());
+        final TDoubleArrayList yPoints = new TDoubleArrayList(this.rows.size());
+
+        for (final ResultRow row : this.rows) {
+
+            if ((this.singleYears == null) || (Integer.valueOf(row.getValue(SInfoResultType.years).toString()) == this.singleYears[index])) {
+
+                final double station = row.getDoubleValue(GeneralResultType.station);
+                final double value = row.getDoubleValue(type);
+
+                xPoints.add(station);
+                yPoints.add(value);
+            }
+        }
+
+        return new double[][] { xPoints.toNativeArray(), yPoints.toNativeArray() };
     }
 
     @Override
@@ -45,7 +76,7 @@
     public void writeCSVHeader(final ExportContextCSV exportContextCSV, final RiverInfo river) {
         final int colSize = 3;
         exportContextCSV.writeTitleForTabs("sinfo.export.csv.title.collison.overview", 3); // Voraussetzung für Tabs ist, dass der Titel vor den Headern
-                                                                                           // geschrieben wird.
+        // geschrieben wird.
         // Das ist etwas doof.
 
         final Collection<String> header = new ArrayList<>(colSize);
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java	Mon Jul 02 13:00:59 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionCalculation.java	Mon Jul 02 17:40:39 2018 +0200
@@ -74,7 +74,7 @@
             for (final DateRange dr : access.getEpochs())
                 calculateOverview(overViewRows, river, access.getLowerKm(), access.getUpperKm(), dr.getFromYear(), dr.getToYear(), true);
         }
-        final CollisionCalcOverviewResult overviewResult = new CollisionCalcOverviewResult(access.getYearsHeader(), overViewRows);
+        final CollisionCalcOverviewResult overviewResult = new CollisionCalcOverviewResult(access.getYearsHeader(), access.getYears(), overViewRows);
         results.addResult(overviewResult, problems);
 
         // create q-for-w-finders for all gauges of the calculation km range
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionState.java	Mon Jul 02 13:00:59 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionState.java	Mon Jul 02 17:40:39 2018 +0200
@@ -78,10 +78,18 @@
 
         /* add themes for chart, for each result */
         final List<AbstractCalculationExportableResult> resultList = results.getResults();
+        int j = -1;
         for (int index = 0; index < resultList.size(); index++) {
             if (resultList.get(index) instanceof CollisionCalcOverviewResult) {
                 final CollisionCalcOverviewResult result = (CollisionCalcOverviewResult) resultList.get(index);
-                facets.add(CollisionCalcProcessor.createFacet(context, hash, this.id, result, index));
+                if (result.getSingleYears() == null)
+                    facets.add(CollisionCalcProcessor.createFacet(context, hash, this.id, result, index));
+                else {
+                    for (int i = 0; i <= result.getSingleYears().length - 1; i++) {
+                        j++;
+                        facets.add(CollisionCalcProcessor.createFacet(context, hash, this.id, result, j));
+                    }
+                }
             }
         }
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoProcessor.java	Mon Jul 02 13:00:59 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/AbstractSInfoProcessor.java	Mon Jul 02 17:40:39 2018 +0200
@@ -104,6 +104,38 @@
         return metaData.get("Y");
     }
 
+    protected final String buildSeriesForType1(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme,
+            final boolean visible,
+            final IResultType resultType, final Double gapDistance) {
+        final CallContext context = generator.getContext();
+        final Map<String, String> metaData = bundle.getFacet().getMetaData();
+
+        final Artifact artifact = bundle.getArtifact();
+
+        final StyledXYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme);
+        series.putMetaData(metaData, artifact, context);
+
+        final String facetName = bundle.getFacetName();
+
+        final AbstractCalculationResult data = (AbstractCalculationResult) bundle.getData(context);
+        if (data == null) {
+            // Check has been here before so we keep it for security reasons
+            // this should never happen though.
+            throw new IllegalStateException("Data is null for facet: " + facetName);
+        }
+
+        final double[][] points = generatePoints(context, artifact, data, facetName, resultType, bundle.getFacet().getIndex());
+
+        if (gapDistance == null)
+            StyledSeriesBuilder.addPoints(series, points, true);
+        else
+            StyledSeriesBuilder.addPoints(series, points, true, gapDistance);
+
+        generator.addAxisSeries(series, getAxisName(), visible);
+
+        return metaData.get("Y");
+    }
+
     protected final String buildSeriesForTkh(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme,
             final boolean visible) {
         final CallContext context = generator.getContext();
@@ -162,6 +194,18 @@
         return points;
     }
 
+    private double[][] generatePoints(final CallContext context, final Artifact artifact, final AbstractCalculationResult data, final String facetName,
+            final IResultType resultType, final int index) {
+
+        final double[][] points = data.getStationPoints(resultType, index);
+        if (facetName.endsWith(".filtered")) {
+            final Double radius = findRadius(context, artifact);
+            return movingAverage(radius, points);
+        }
+
+        return points;
+    }
+
     private double[][] movingAverage(final Double radius, final double[][] points) {
 
         if (radius == null)
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/CollisionCalcProcessor.java	Mon Jul 02 13:00:59 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/common/CollisionCalcProcessor.java	Mon Jul 02 17:40:39 2018 +0200
@@ -19,6 +19,7 @@
 import org.dive4elements.river.artifacts.common.AbstractCalculationResult;
 import org.dive4elements.river.artifacts.resources.Resources;
 import org.dive4elements.river.artifacts.sinfo.collision.CollisionCalcFacet;
+import org.dive4elements.river.artifacts.sinfo.collision.CollisionCalcOverviewResult;
 import org.dive4elements.river.artifacts.states.DefaultState.ComputeType;
 import org.dive4elements.river.exports.DiagramGenerator;
 import org.dive4elements.river.themes.ThemeDocument;
@@ -33,6 +34,10 @@
 
     public static final String FACET_COLLISION_CALC_COUNT = "sinfo_facet_collision_calc_count";
 
+    public static final String FACET_COLLISION_CALC_COUNT_2 = "sinfo_facet_collision_calc_count.2";
+
+    public static final String FACET_COLLISION_CALC_COUNT_3 = "sinfo_facet_collision_calc_count.3";
+
     private static final String I18N_AXIS_LABEL = "chart.collision_count.section.yaxis.label";
 
     private static final String I18N_SERIES_NAME_PATTERN = "collision.count.title";
@@ -41,6 +46,8 @@
 
     static {
         HANDLED_FACET_TYPES.add(FACET_COLLISION_CALC_COUNT);
+        HANDLED_FACET_TYPES.add(FACET_COLLISION_CALC_COUNT_2);
+        HANDLED_FACET_TYPES.add(FACET_COLLISION_CALC_COUNT_3);
     }
 
     public CollisionCalcProcessor() {
@@ -50,12 +57,24 @@
     @Override
     protected String generateSeries(final DiagramGenerator generator, final ArtifactAndFacet bundle, final ThemeDocument theme, final boolean visible) {
 
-        return buildSeriesForType(generator, bundle, theme, visible, SInfoResultType.collisionCount, null);
+        return buildSeriesForType1(generator, bundle, theme, visible, SInfoResultType.collisionCount, null);
     }
 
     public static final Facet createFacet(final CallContext context, final String hash, final String id, final AbstractCalculationResult result,
             final int index) {
-        final String facetDescription = Resources.getMsg(context.getMeta(), I18N_SERIES_NAME_PATTERN, I18N_SERIES_NAME_PATTERN, result.getLabel());
-        return new CollisionCalcFacet(index, FACET_COLLISION_CALC_COUNT, facetDescription, I18N_AXIS_LABEL, ComputeType.ADVANCE, id, hash);
+
+        final CollisionCalcOverviewResult ccoResult = (CollisionCalcOverviewResult) result;
+        String facetDescription;
+        String facetName;
+        if (ccoResult.getSingleYears() == null) {
+            facetDescription = Resources.getMsg(context.getMeta(), I18N_SERIES_NAME_PATTERN, I18N_SERIES_NAME_PATTERN, result.getLabel());
+            facetName = FACET_COLLISION_CALC_COUNT;
+        }
+        else {
+            facetDescription = Resources.getMsg(context.getMeta(), I18N_SERIES_NAME_PATTERN, I18N_SERIES_NAME_PATTERN,
+                    Integer.toString(ccoResult.getSingleYears()[index]));
+            facetName = new String[] { FACET_COLLISION_CALC_COUNT, FACET_COLLISION_CALC_COUNT_2, FACET_COLLISION_CALC_COUNT_3 }[index % 3].toString();
+        }
+        return new CollisionCalcFacet(index, facetName, facetDescription, I18N_AXIS_LABEL, ComputeType.ADVANCE, id, hash);
     }
 }
\ No newline at end of file

http://dive4elements.wald.intevation.org