bug5932: modifying bravo to gps

This commit is contained in:
Lisa
2023-12-08 10:11:08 +01:00
parent c951ec4782
commit 656e82a919
8 changed files with 135 additions and 51 deletions
@@ -0,0 +1,22 @@
package com.sap.sailing.datamining.data;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sse.common.Distance;
import com.sap.sse.common.Duration;
import com.sap.sse.datamining.annotations.Connector;
import com.sap.sse.datamining.annotations.Statistic;
public interface HasGPSFixTrackContext {
@Connector(scanForStatistics=false)
HasRaceOfCompetitorContext getRaceOfCompetitorContext();
GPSFixTrack<Competitor, GPSFixMoving> getGPSFixTrack();
@Statistic(messageKey="timeSpentOnTackType", resultDecimals=1)
Duration getTimeSpentTackType();
@Statistic(messageKey="TackTypeDistance", resultDecimals=1)
Distance getDistanceSpentTackType();
}
@@ -9,7 +9,7 @@ import com.sap.sse.datamining.annotations.Statistic;
public interface HasTackTypeSegmentContext {
@Connector(scanForStatistics=false)
HasBravoFixTrackContext getBravoFixTrackContext();
HasGPSFixTrackContext getGPSFixTrackContext();
TimePoint getStartOfTackTypeSegment();
@@ -7,13 +7,15 @@ import java.util.concurrent.ExecutorService;
import com.sap.sailing.datamining.data.HasTackTypeSegmentContext;
import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext;
import com.sap.sailing.datamining.impl.data.BravoFixTrackWithContext;
import com.sap.sailing.datamining.impl.data.TackTypeSegmentWithContext;
import com.sap.sailing.datamining.shared.TackTypeSegmentsDataMiningSettings;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.NoWindException;
import com.sap.sailing.domain.common.tracking.BravoFix;
import com.sap.sailing.domain.tracking.BravoFixTrack;
import com.sap.sailing.domain.common.TackType;
import com.sap.sailing.domain.common.tracking.GPSFix;
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
import com.sap.sailing.datamining.impl.data.GPSFixTrackWithContext;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.TimePoint;
@@ -46,44 +48,44 @@ public class TackTypeSegmentRetrievalProcessor extends AbstractRetrievalProcesso
} else {
end = endOfRace;
}
final BravoFixTrack<Competitor> bravoFixTrack = trackedRace.getSensorTrack(element.getCompetitor(), BravoFixTrack.TRACK_NAME);
if (bravoFixTrack != null) {
boolean isTackType = false;
final GPSFixTrack<Competitor, GPSFixMoving> gpsFixTrack = trackedRace.getTrack(element.getCompetitor());
if (gpsFixTrack != null) {
TackType lastTackType = null;
TackType currentFixTackType = null;
TimePoint last = null;
TimePoint startOfSegment = null;
bravoFixTrack.lockForRead();
gpsFixTrack.lockForRead();
try {
for (final BravoFix bravoFix : bravoFixTrack.getFixes(startOfRace, /* fromInclusive */ true, end, /* toInclusive */ false)) {
for (final GPSFix gpsFix : gpsFixTrack.getFixes(startOfRace, /* fromInclusive */ true, end, /* toInclusive */ false)) { //SCHLEIFE die durch alle gps fixes des rennen geht
if (isAborted()) {
break;
}
TrackedLegOfCompetitor trackedLegComp = element.getTrackedRaceContext().getTrackedRace().getTrackedLeg(element.getCompetitor(), bravoFix.getTimePoint());
boolean currentFixIsTackType;
TrackedLegOfCompetitor trackedLegComp = element.getTrackedRaceContext().getTrackedRace().getTrackedLeg(element.getCompetitor(), gpsFix.getTimePoint());
try {
currentFixIsTackType = (bravoFix.isTackType(trackedLegComp.getTackType(bravoFix.getTimePoint())));
currentFixTackType = trackedLegComp.getTackType(gpsFix.getTimePoint());
} catch (NoWindException e) {
currentFixIsTackType=false;
currentFixTackType=null;
}
if (currentFixIsTackType != isTackType) {
if (currentFixIsTackType) {
startOfSegment = bravoFix.getTimePoint();
if (currentFixTackType != lastTackType) { //wenn Veränderung des TT:
if (settings.getMinimumTackTypeSegmentDuration() == null || startOfSegment.until(last) //wenn zu kleine segment dann:
.compareTo(settings.getMinimumTackTypeSegmentDuration()) >= 0) {
addOrMergeTackTypeSegment(element, tackTypeSegments, gpsFixTrack, startOfSegment,
last /* don't include the last interval ending at the non-TackType fix */);
} //wenn next abschnitt nicht null TT ist:
if (currentFixTackType != null) { // immer wenn TT sich ändert start UND ende, außer null
startOfSegment = gpsFix.getTimePoint();
} else {
if (settings.getMinimumTackTypeSegmentDuration() == null ||
startOfSegment.until(last).compareTo(settings.getMinimumTackTypeSegmentDuration()) >= 0) {
addOrMergeTackTypeSegment(element, tackTypeSegments, bravoFixTrack, startOfSegment,
last /* don't include the last interval ending at the non-TackType fix */);
}
startOfSegment = null;
}
isTackType = currentFixIsTackType;
} //veränderter TT wird aktualisiert
lastTackType = currentFixTackType;
}
last = bravoFix.getTimePoint();
last = gpsFix.getTimePoint();
}
} finally {
bravoFixTrack.unlockAfterRead();
gpsFixTrack.unlockAfterRead();
}
if (isTackType) {
addOrMergeTackTypeSegment(element, tackTypeSegments, bravoFixTrack, startOfSegment, end);
if (currentFixTackType == lastTackType && currentFixTackType!= null) {
addOrMergeTackTypeSegment(element, tackTypeSegments, gpsFixTrack, startOfSegment, end);
}
}
}
@@ -91,26 +93,26 @@ public class TackTypeSegmentRetrievalProcessor extends AbstractRetrievalProcesso
}
private void addOrMergeTackTypeSegment(HasRaceOfCompetitorContext element,
List<HasTackTypeSegmentContext> tackTypeSegments, final BravoFixTrack<Competitor> bravoFixTrack,
List<HasTackTypeSegmentContext> tackTypeSegments, final GPSFixTrack<Competitor, GPSFixMoving> gpsFixTrack,
TimePoint startOfSegment, TimePoint endOfSegment) {
if (tackTypeSegments.isEmpty() || settings.getMinimumDurationBetweenAdjacentTackTypeSegments() == null) {
tackTypeSegments.add(createTackTypeSegment(startOfSegment, endOfSegment, element, bravoFixTrack));
tackTypeSegments.add(createTackTypeSegment(startOfSegment, endOfSegment, element, gpsFixTrack));
} else {
final HasTackTypeSegmentContext previousSegment = tackTypeSegments.get(tackTypeSegments.size()-1);
final TimePoint previousEnd = previousSegment.getEndOfTackTypeSegment();
if (previousEnd.until(startOfSegment).compareTo(settings.getMinimumDurationBetweenAdjacentTackTypeSegments()) < 0) {
// merge:
tackTypeSegments.set(tackTypeSegments.size()-1, createTackTypeSegment(previousSegment.getStartOfTackTypeSegment(), endOfSegment, element, bravoFixTrack));
tackTypeSegments.set(tackTypeSegments.size()-1, createTackTypeSegment(previousSegment.getStartOfTackTypeSegment(), endOfSegment, element, gpsFixTrack));
} else {
// add; duration between the segments is large enough
tackTypeSegments.add(createTackTypeSegment(startOfSegment, endOfSegment, element, bravoFixTrack));
tackTypeSegments.add(createTackTypeSegment(startOfSegment, endOfSegment, element, gpsFixTrack));
}
}
}
private HasTackTypeSegmentContext createTackTypeSegment(TimePoint startOfSegment, TimePoint endOfSegment,
HasRaceOfCompetitorContext raceOfCompetitorContext, BravoFixTrack<Competitor> bravoFixTrack) {
return new TackTypeSegmentWithContext(new BravoFixTrackWithContext(raceOfCompetitorContext, bravoFixTrack), startOfSegment, endOfSegment);
HasRaceOfCompetitorContext raceOfCompetitorContext, GPSFixTrack<Competitor, GPSFixMoving> gpsFixTrack) {
return new TackTypeSegmentWithContext(new GPSFixTrackWithContext(raceOfCompetitorContext, gpsFixTrack), startOfSegment, endOfSegment);
}
}
@@ -0,0 +1,69 @@
package com.sap.sailing.datamining.impl.data;
import com.sap.sailing.datamining.data.HasGPSFixTrackContext;
import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sse.common.Distance;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
public class GPSFixTrackWithContext implements HasGPSFixTrackContext {
private final HasRaceOfCompetitorContext raceOfCompetitorContext;
private final GPSFixTrack<Competitor, GPSFixMoving> gpsFixTrack;
public GPSFixTrackWithContext(HasRaceOfCompetitorContext raceOfCompetitorContext, GPSFixTrack<Competitor, GPSFixMoving> gpsFixTrack) {
this.raceOfCompetitorContext = raceOfCompetitorContext;
this.gpsFixTrack = gpsFixTrack;
}
@Override
public HasRaceOfCompetitorContext getRaceOfCompetitorContext() {
return raceOfCompetitorContext;
}
@Override
public GPSFixTrack<Competitor, GPSFixMoving> getGPSFixTrack() {
return gpsFixTrack;
}
@Override
public Duration getTimeSpentTackType() {
if(getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace() != null) {
final TimePoint endOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfRace();
final TimePoint startOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getStartOfRace();
final TimePoint end;
if (endOfRace == null) {
final TimePoint endOfTracking = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfTracking();
end = endOfTracking == null ? MillisecondsTimePoint.now() : endOfTracking;
} else {
end = endOfRace;
}
return gpsFixTrack.getTimeSpentTackType(startOfRace, end);
}
return null;
}
@Override
public Distance getDistanceSpentTackType() {
if(getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace() != null) {
final TimePoint endOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfRace();
final TimePoint startOfRace = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getStartOfRace();
final TimePoint end;
if (endOfRace == null) {
final TimePoint endOfTracking = getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace().getEndOfTracking();
end = endOfTracking == null ? MillisecondsTimePoint.now() : endOfTracking;
} else {
end = endOfRace;
}
return gpsFixTrack.getDistanceSpentTackType(
startOfRace,
end);
}
return null;
}
}
@@ -2,7 +2,7 @@ package com.sap.sailing.datamining.impl.data;
import java.text.SimpleDateFormat;
import com.sap.sailing.datamining.data.HasBravoFixTrackContext;
import com.sap.sailing.datamining.data.HasGPSFixTrackContext;
import com.sap.sailing.datamining.data.HasTackTypeSegmentContext;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.common.tracking.GPSFixMoving;
@@ -13,28 +13,28 @@ import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
public class TackTypeSegmentWithContext implements HasTackTypeSegmentContext {
private final HasBravoFixTrackContext bravoFixTrackContext;
private final HasGPSFixTrackContext gpsFixTrackContext;
private final TimePoint startOfTackTypeSegment;
private final TimePoint endOfTackTypeSegment;
private static final SimpleDateFormat TIMEPOINT_FORMATTER = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
public TackTypeSegmentWithContext(HasBravoFixTrackContext bravoFixTrackContext, TimePoint startOfTackTypeSegment,
public TackTypeSegmentWithContext(GPSFixTrackWithContext gpsFixTrackWithContext, TimePoint startOfTackTypeSegment,
TimePoint endOfTackTypeSegment) {
super();
this.bravoFixTrackContext = bravoFixTrackContext;
this.gpsFixTrackContext = gpsFixTrackWithContext;
this.startOfTackTypeSegment = startOfTackTypeSegment;
this.endOfTackTypeSegment = endOfTackTypeSegment;
}
@Override
public String getName() {
return bravoFixTrackContext.getRaceOfCompetitorContext().getCompetitor().getName() + "@"
return gpsFixTrackContext.getRaceOfCompetitorContext().getCompetitor().getName() + "@"
+ TIMEPOINT_FORMATTER.format(startOfTackTypeSegment.asDate());
}
@Override
public HasBravoFixTrackContext getBravoFixTrackContext() {
return bravoFixTrackContext;
public HasGPSFixTrackContext getGPSFixTrackContext() {
return gpsFixTrackContext;
}
@Override
@@ -63,10 +63,10 @@ public class TackTypeSegmentWithContext implements HasTackTypeSegmentContext {
}
private Competitor getCompetitor() {
return getBravoFixTrackContext().getRaceOfCompetitorContext().getCompetitor();
return getGPSFixTrackContext().getRaceOfCompetitorContext().getCompetitor();
}
private TrackedRace getTrackedRace() {
return getBravoFixTrackContext().getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace();
return getGPSFixTrackContext().getRaceOfCompetitorContext().getTrackedRaceContext().getTrackedRace();
}
}
@@ -1,6 +1,5 @@
package com.sap.sailing.domain.common.tracking;
import com.sap.sailing.domain.common.TackType;
import com.sap.sailing.domain.common.impl.MeterDistance;
import com.sap.sse.common.Bearing;
import com.sap.sse.common.Distance;
@@ -41,7 +40,6 @@ public interface BravoFix extends SensorFix {
* for a fix to be considered foiling.
*/
boolean isFoiling(Distance minimumRideHeight);
boolean isTackType(TackType tackType);
@Statistic(messageKey="pitch", resultDecimals=1)
Bearing getPitch();
@@ -1,6 +1,5 @@
package com.sap.sailing.domain.common.tracking.impl;
import com.sap.sailing.domain.common.TackType;
import com.sap.sailing.domain.common.impl.MeterDistance;
import com.sap.sailing.domain.common.sensordata.BravoSensorDataMetadata;
import com.sap.sailing.domain.common.sensordata.ColumnMetadata;
@@ -74,9 +73,4 @@ public class BravoFixImpl extends SensorFixImpl implements BravoFix {
final Double bearingDeg = fix.get(BravoSensorDataMetadata.HEEL.getColumnIndex());
return bearingDeg == null ? null : new DegreeBearingImpl(bearingDeg);
}
@Override
public boolean isTackType(TackType tackType) {
return TackType.LONGTACK == tackType;
}
}
@@ -275,5 +275,4 @@ public class DynamicGPSFixMovingTrackImpl<ItemType> extends GPSFixTrackImpl<Item
public void setMillisecondsOverWhichToAverage(long millisecondsOverWhichToAverage) {
super.setMillisecondsOverWhichToAverage(millisecondsOverWhichToAverage);
}
}