From 0a30ccee1defae458d79a68952ab322acda04176 Mon Sep 17 00:00:00 2001 From: Leon Radeck Date: Mon, 30 Apr 2018 14:06:57 +1000 Subject: [PATCH] Distinguish metrics that depend on start of race or start of competitor by naming them accordingly. --- .../Sailing_StringMessages.properties | 15 +++--- .../Sailing_StringMessages_de.properties | 15 +++--- .../data/HasRaceOfCompetitorContext.java | 37 +++++++------- .../data/RaceOfCompetitorWithContext.java | 49 ++++++++++++------- 4 files changed, 66 insertions(+), 50 deletions(-) diff --git a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties index 9658df2452e..257e3255ecb 100644 --- a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties +++ b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties @@ -72,8 +72,8 @@ NumberOfTacks=Number of Tacks NumberOfJibes=Number of Jibes NumberOfPenaltyCircles=Number of Penalty Circles RankGainsOrLosses=Rank Gains or Losses -DistanceToStarboardSideAtStart=Distance to Starboard Side (% of Length) -DistanceToStarboardSideAtStartVsRankAtFirstMark=Relative Distance to Starboard Side (X) vs. Rank at First Mark (Y) +DistanceToStarboardSideAtStartOfCompetitor=Relative Distance to Starboard Side at Start of Competitor +DistanceToStarboardSideAtStartOfCompetitorVsRankAtFirstMark=Relative Distance to Starboard Side at Start of Competitor (X) vs. Rank at First Mark (Y) NumberOfPodiumFinish=Number of Podium Finishes NumberOfWins=Number of Wins RankGainsOrLossesBetweenFirstMarkAndFinish=Rank Gains or Losses (1st Mark -> Finish) @@ -94,23 +94,24 @@ PassingSide=Passing Side TackAtStart=Tack at Start SpeedTenSecondsAfterStart=Speed 10s After Start RankThirtySecondsAfterStart=Rank 30s After Start -WindwardDistanceToAdvantageousEndOfLine=Windward Distance to Advantageous End of Line -AbsoluteWindwardDistanceToStarboardSideAtStart=Absolute Windward Distance to Starboardside of Line +WindwardDistanceToAdvantageousEndOfLineAtStartOfRace=Windward Distance to Advantageous End of Line at Start of Race +WindwardDistanceToAdvantageousEndOfLineAtStartOfCompetitor=Windward Distance to Starboard Side of Line at Start of Competitor RankAfterHalfOfTheFirstLeg=Rank after the half of the first leg AdvantageousEndOfLine=Advantageous End of Line TimeSpentInSeconds=Time Spent in Seconds MedalRace=Medal Race -WindwardDistanceToAdvantageousEndOfLineVsRelativeDistanceToAdvantageousEndOfLine=Windward Distance to Advantageous End of Line (X) vs. Relative Distance to Advantageous End of Line (Y) +WindwardDistanceToAdvantageousEndOfLineAtStartOfRaceVsRelativeDistanceToAdvantageousEndOfLine=Windward Distance to Advantageous End of Line at Start of Race (X) vs. Relative Distance to Advantageous End of Line at Start of Race (Y) WindSourceType=Wind Source Type +AbsoluteWindwardDistanceToStarboardSideAtStartOfCompetitor=Absolute Windward Distance to Starboardside of Line at Start of Competitor WindSourceName=Wind Source Name -RelativeDistanceToAdvantageousEndOfLine=Relative Distance to Advantageous End of Line +RelativeDistanceToAdvantageousEndOfLineAtStartOfRace=Relative Distance to Advantageous End of Line at Start of Race windFrom=True Wind Direction (TWD) windSpeedKnots=True Wind Speed (kts) speedInKnots=Speed (kts) bearing=Direction (°T) WindTrack=Wind Track timeSpentFoiling=Time spent foiling -DistanceToStarboadSideAtStartVsFinalRank=Relative Distance to Starboardside at Start (X) vs. Final Rank (Y) +DistanceToStarboardSideAtStartOfCompetitorVsFinalRank=Relative Distance to Starboard Side at Start of Competitor (X) vs. Final Rank (Y) yaw=Yaw pitch=Pitch heel=Heel diff --git a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties index f01e023ae09..083af2b4533 100644 --- a/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties +++ b/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages_de.properties @@ -70,10 +70,10 @@ NumberOfTacks=Anzahl der Wenden NumberOfJibes=Anzahl der Halsen NumberOfPenaltyCircles=Anzahl der Straf-Kreise RankGainsOrLosses=Positions-Verluste oder -Gewinne -DistanceToStarboardSideAtStart=Distanz zur Steuerbordseite (% der Länge) -DistanceToStarboardSideAtStartVsRankAtFirstMark=Relative Distanz zur Steuerbordseite (X) vs. Position beim ersten Wegpunkt (Y) +DistanceToStarboardSideAtStartOfCompetitor=Relative Distanz zur Steuerbordseite beim Start des Teilnehmers +DistanceToStarboardSideAtStartOfCompetitorVsRankAtFirstMark=Relative Distanz zur Steuerbordseite beim Start des Teilnehmers (X) vs. Position beim ersten Wegpunkt (Y) NumberOfPodiumFinish=Azahl der Podium-Siege -DistanceToStarboadSideAtStartVsFinalRank=Relative Distanz zur Steuerbordseite zum Start (X) vs. finale Platzierung (Y) +DistanceToStarboardSideAtStartOfCompetitorVsFinalRank=Relative Distanz zur Steuerbordseite zum Start des Teilnehmers (X) vs. finale Platzierung (Y) NumberOfWins=Anzahl der Siege RankGainsOrLossesBetweenFirstMarkAndFinish=Positions-Verluste oder -Gewinne (1ter Wegpunkt -> Ziel) IsTracked=Ist getracked @@ -93,8 +93,9 @@ PassingSide=Passierende Seite TackAtStart=Startbug SpeedTenSecondsAfterStart=Geschwindigkeit 10s nach dem Startzeitpunkt RankThirtySecondsAfterStart=Absolute Platzierung 30s nach dem Startzeitpunkt -WindwardDistanceToAdvantageousEndOfLine=Windwärtige Distanz zum Bevorteilten Ende der Startlinie -AbsoluteWindwardDistanceToStarboardSideAtStart=Absolute Windwärtige Distanz zur Steuerbordseite beim Start +WindwardDistanceToAdvantageousEndOfLineAtStartOfRace=Windwärtige Distanz zum Bevorteilten Ende der Startlinie zum Start des Rennens +WindwardDistanceToAdvantageousEndOfLineAtStartOfCompetitor=Windwärtige Distanz zum Bevorteilten Ende der Startlinie zum Start des Teilnehmers +AbsoluteWindwardDistanceToStarboardSideAtStartOfCompetitor=Absolute Windwärtige Distanz zur Steuerbordseite beim Start des Teilnehmers RankAfterHalfOfTheFirstLeg=Platzierung nach der Hälfte des ersten Schenkels AdvantageousEndOfLine=Bevorteiltes Ende der Startlinie TimeSpentInSeconds=Benötigte Zeit in Sekunden @@ -110,8 +111,8 @@ timeSpentFoiling=Zeit auf Foils yaw=Gierung pitch=Neigung heel=Krängung -WindwardDistanceToAdvantageousEndOfLineVsRelativeDistanceToAdvantageousEndOfLine=Windwärtige Distanz zum Bevorteilten Ende der Startlinie (X) vs. Relative Distanz zum Bevorteilten Ende der Startlinie (Y) -RelativeDistanceToAdvantageousEndOfLine=Relative Distanz zum Bevorteilten Ende der Startlinie +WindwardDistanceToAdvantageousEndOfLineAtStartOfRaceVsRelativeDistanceToAdvantageousEndOfLine=Windwärtige Distanz zum Bevorteilten Ende der Startlinie zum Start des Rennens (X) vs. Relative Distanz zum Bevorteilten Ende der Startlinie zum Start des Rennens (Y) +RelativeDistanceToAdvantageousEndOfLineAtStartOfRace=Relative Distanz zum Bevorteilten Ende der Startlinie zum Start des Rennens rideHeight=Foiling-Höhe rideHeightPort=Foiling-Höhe Backbord-Rumpf rideHeightStarboard=Foiling-Höhe Steuerbord-Rumpf diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasRaceOfCompetitorContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasRaceOfCompetitorContext.java index 4785bcc000f..b0e873a9d10 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasRaceOfCompetitorContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/data/HasRaceOfCompetitorContext.java @@ -23,7 +23,7 @@ public interface HasRaceOfCompetitorContext { @Dimension(messageKey="TackAtStart", ordinal=12) public Tack getTackAtStart() throws NoWindException; - @Dimension(messageKey="DistanceToStarboardSideAtStart", ordinal=13) + @Dimension(messageKey="DistanceToStarboardSideAtStartOfCompetitor", ordinal=13) public ClusterDTO getPercentageClusterForDistanceToStarboardSideAtStart(); @Dimension(messageKey="RelativeScoreInPercent", ordinal=14) @@ -32,14 +32,17 @@ public interface HasRaceOfCompetitorContext { @Statistic(messageKey="DistanceAtStart", resultDecimals=2, ordinal=0) public Distance getDistanceToStartLineAtStart(); - @Statistic(messageKey="DistanceToStarboardSideAtStart", resultDecimals=2, ordinal=1) - public Double getNormalizedDistanceToStarboardSideAtStart(); + @Statistic(messageKey="DistanceToStarboardSideAtStartOfCompetitor", resultDecimals=2, ordinal=1) + public Double getNormalizedDistanceToStarboardSideAtStartOfCompetitor(); - @Statistic(messageKey="DistanceToStarboardSideAtStartVsRankAtFirstMark", resultDecimals=2, ordinal=1) - public Pair getNormalizedDistanceToStarboardSideAtStartVsRankAtFirstMark(); + @Statistic(messageKey="DistanceToStarboardSideAtStartOfCompetitorVsRankAtFirstMark", resultDecimals=2, ordinal=1) + public Pair getNormalizedDistanceToStarboardSideAtStartOfCompetitorVsRankAtFirstMark(); - @Statistic(messageKey="WindwardDistanceToAdvantageousEndOfLine", resultDecimals=2, ordinal=2) - public Distance getWindwardDistanceToAdvantageousLineEndAtStart(); + @Statistic(messageKey="WindwardDistanceToAdvantageousEndOfLineAtStartOfRace", resultDecimals=2, ordinal=2) + public Distance getWindwardDistanceToAdvantageousLineEndAtStartofRace(); + + @Statistic(messageKey="WindwardDistanceToAdvantageousEndOfLineAtStartOfCompetitor", resultDecimals=2, ordinal=2) + public Distance getWindwardDistanceToAdvantageousLineEndAtStartofCompetitor(); @Connector(messageKey="SpeedWhenStarting", ordinal=3) public Speed getSpeedWhenStarting(); @@ -48,10 +51,10 @@ public interface HasRaceOfCompetitorContext { public Speed getSpeedTenSecondsBeforeStart(); @Connector(messageKey="SpeedTenSecondsAfterStart", ordinal=5) - public Speed getSpeedTenSecondsAfterStart(); + public Speed getSpeedTenSecondsAfterStartOfRace(); @Statistic(messageKey="RankThirtySecondsAfterStart", resultDecimals=2, ordinal=6) - public Double getRankThirtySecondsAfterStart(); + public Double getRankThirtySecondsAfterStartOfRace(); @Statistic(messageKey="RankAfterHalfOfTheFirstLeg", resultDecimals=2, ordinal=7) public Double getRankAfterHalfOfTheFirstLeg(); @@ -80,15 +83,15 @@ public interface HasRaceOfCompetitorContext { @Statistic(messageKey="LineLengthAtStart", resultDecimals=1) public Distance getLineLengthAtStart(); - @Statistic(messageKey="AbsoluteWindwardDistanceToStarboardSideAtStart", resultDecimals=2) - Distance getAbsoluteWindwardDistanceToStarboardSideAtStart(); + @Statistic(messageKey="AbsoluteWindwardDistanceToStarboardSideAtStartOfCompetitor", resultDecimals=2) + Distance getAbsoluteWindwardDistanceToStarboardSideAtStartOfCompetitor(); - @Statistic(messageKey="DistanceToStarboadSideAtStartVsFinalRank", resultDecimals=2) - Pair getRelativeDistanceToStarboardSideAtStartVsFinalRank(); + @Statistic(messageKey="DistanceToStarboardSideAtStartOfCompetitorVsFinalRank", resultDecimals=2) + Pair getRelativeDistanceToStarboardSideAtStartOfCompetitorVsFinalRank(); - @Statistic(messageKey="WindwardDistanceToAdvantageousEndOfLineVsRelativeDistanceToAdvantageousEndOfLine", resultDecimals=2) - Pair getWindwardDistanceToAdvantageousEndOfLineVsRelativeDistanceToAdvantageousEndOfLine(); + @Statistic(messageKey="WindwardDistanceToAdvantageousEndOfLineAtStartOfRaceVsRelativeDistanceToAdvantageousEndOfLine", resultDecimals=2) + Pair getWindwardDistanceToAdvantageousEndOfLineAtStartOfRaceVsRelativeDistanceToAdvantageousEndOfLineAtStartOfRace(); - @Statistic(messageKey="RelativeDistanceToAdvantageousEndOfLine", resultDecimals=2) - Double getRelativeDistanceToAdvantageousEndOfLine(); + @Statistic(messageKey="RelativeDistanceToAdvantageousEndOfLineAtStartOfRace", resultDecimals=2) + Double getRelativeDistanceToAdvantageousEndOfLineAtStartOfRace(); } diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/RaceOfCompetitorWithContext.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/RaceOfCompetitorWithContext.java index 77547f3eea6..f40ffb6049a 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/RaceOfCompetitorWithContext.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/impl/data/RaceOfCompetitorWithContext.java @@ -64,7 +64,7 @@ public class RaceOfCompetitorWithContext implements HasRaceOfCompetitorContext { @Override public ClusterDTO getPercentageClusterForDistanceToStarboardSideAtStart() { - Double normalizedDistance = getNormalizedDistanceToStarboardSideAtStart(); + Double normalizedDistance = getNormalizedDistanceToStarboardSideAtStartOfCompetitor(); if (normalizedDistance == null) { return null; } @@ -80,7 +80,7 @@ public class RaceOfCompetitorWithContext implements HasRaceOfCompetitorContext { } @Override - public Double getNormalizedDistanceToStarboardSideAtStart() { + public Double getNormalizedDistanceToStarboardSideAtStartOfCompetitor() { TrackedRace trackedRace = getTrackedRace(); TrackedLegOfCompetitor firstTrackedLegOfCompetitor = trackedRace.getTrackedLeg(competitor, trackedRace.getRace().getCourse().getFirstLeg()); TimePoint competitorStartTime = firstTrackedLegOfCompetitor.getStartTime(); @@ -94,15 +94,16 @@ public class RaceOfCompetitorWithContext implements HasRaceOfCompetitorContext { } @Override - public Pair getNormalizedDistanceToStarboardSideAtStartVsRankAtFirstMark(){ - return new Pair (getNormalizedDistanceToStarboardSideAtStart(), getRankAtFirstMark()); + public Pair getNormalizedDistanceToStarboardSideAtStartOfCompetitorVsRankAtFirstMark(){ + return new Pair (getNormalizedDistanceToStarboardSideAtStartOfCompetitor(), getRankAtFirstMark()); } - @Override - public Distance getWindwardDistanceToAdvantageousLineEndAtStart() { + public Distance getWindwardDistanceToAdvantageousLineEndAtStartOf(TimePoint timepoint) { + if(timepoint == null) { + return null; + } TrackedRace trackedRace = getTrackedRace(); - TimePoint startOfRace = trackedRace.getStartOfRace(); - LineDetails startLine = trackedRace.getStartLine(startOfRace); + LineDetails startLine = trackedRace.getStartLine(timepoint); Mark advantageousMark = null; switch (startLine.getAdvantageousSideWhileApproachingLine()) { case PORT: @@ -117,17 +118,27 @@ public class RaceOfCompetitorWithContext implements HasRaceOfCompetitorContext { } GPSFixTrack advantageousMarkTrack = trackedRace.getOrCreateTrack(advantageousMark); - Position advantageousMarkPosition = advantageousMarkTrack.getEstimatedPosition(startOfRace, false); + Position advantageousMarkPosition = advantageousMarkTrack.getEstimatedPosition(timepoint, false); GPSFixTrack competitorTrack = trackedRace.getTrack(getCompetitor()); - Position competitorPosition = competitorTrack.getEstimatedPosition(startOfRace, false); + Position competitorPosition = competitorTrack.getEstimatedPosition(timepoint, false); TrackedLeg trackedLeg = trackedRace.getTrackedLeg(trackedRace.getRace().getCourse().getFirstLeg()); - Distance distance = trackedLeg.getWindwardDistance(competitorPosition, advantageousMarkPosition, startOfRace, WindPositionMode.LEG_MIDDLE); + Distance distance = trackedLeg.getWindwardDistance(competitorPosition, advantageousMarkPosition, timepoint, WindPositionMode.LEG_MIDDLE); return distance; } @Override - public Distance getAbsoluteWindwardDistanceToStarboardSideAtStart() { + public Distance getWindwardDistanceToAdvantageousLineEndAtStartofRace() { + return getWindwardDistanceToAdvantageousLineEndAtStartOf(getTrackedRace().getStartOfRace()); + } + + @Override + public Distance getWindwardDistanceToAdvantageousLineEndAtStartofCompetitor() { + return getWindwardDistanceToAdvantageousLineEndAtStartOf(getTrackedRace().getTrackedLeg(getCompetitor(), getTrackedRace().getRace().getCourse().getFirstLeg()).getStartTime()); + } + + @Override + public Distance getAbsoluteWindwardDistanceToStarboardSideAtStartOfCompetitor() { TrackedLegOfCompetitor firstTrackedLegOfCompetitor = getTrackedRace().getTrackedLeg(competitor, getTrackedRace().getRace().getCourse().getFirstLeg()); TimePoint competitorStartTime = firstTrackedLegOfCompetitor.getStartTime(); if(competitorStartTime == null) { @@ -176,7 +187,7 @@ public class RaceOfCompetitorWithContext implements HasRaceOfCompetitorContext { } @Override - public Speed getSpeedTenSecondsAfterStart() { + public Speed getSpeedTenSecondsAfterStartOfRace() { TimePoint startOfRace = getTrackedRace().getStartOfRace(); if (startOfRace == null) { return null; @@ -185,7 +196,7 @@ public class RaceOfCompetitorWithContext implements HasRaceOfCompetitorContext { } @Override - public Double getRankThirtySecondsAfterStart() { + public Double getRankThirtySecondsAfterStartOfRace() { TimePoint startOfRace = getTrackedRace().getStartOfRace(); if (startOfRace == null) { return null; @@ -288,17 +299,17 @@ public class RaceOfCompetitorWithContext implements HasRaceOfCompetitorContext { } @Override - public Pair getRelativeDistanceToStarboardSideAtStartVsFinalRank(){ - return new Pair<>(getNormalizedDistanceToStarboardSideAtStart(), getTrackedRaceContext().getRankAtFinishForCompetitor(getCompetitor())); + public Pair getRelativeDistanceToStarboardSideAtStartOfCompetitorVsFinalRank(){ + return new Pair<>(getNormalizedDistanceToStarboardSideAtStartOfCompetitor(), getTrackedRaceContext().getRankAtFinishForCompetitor(getCompetitor())); } @Override - public Pair getWindwardDistanceToAdvantageousEndOfLineVsRelativeDistanceToAdvantageousEndOfLine(){ - return new Pair<>(getWindwardDistanceToAdvantageousLineEndAtStart().getMeters(), getRelativeDistanceToAdvantageousEndOfLine()); + public Pair getWindwardDistanceToAdvantageousEndOfLineAtStartOfRaceVsRelativeDistanceToAdvantageousEndOfLineAtStartOfRace(){ + return new Pair<>(getWindwardDistanceToAdvantageousLineEndAtStartofRace().getMeters(), getRelativeDistanceToAdvantageousEndOfLineAtStartOfRace()); } @Override - public Double getRelativeDistanceToAdvantageousEndOfLine() { + public Double getRelativeDistanceToAdvantageousEndOfLineAtStartOfRace() { TrackedRace trackedRace = getTrackedRace(); TimePoint startOfRace = trackedRace.getStartOfRace(); LineDetails startLine = trackedRace.getStartLine(startOfRace);