1 package org.opentrafficsim.kpi.sampling.indicator;
2
3 import java.util.List;
4 import java.util.function.BiFunction;
5
6 import org.djunits.value.vdouble.scalar.Duration;
7 import org.djunits.value.vdouble.scalar.Speed;
8 import org.djunits.value.vdouble.scalar.Time;
9 import org.opentrafficsim.kpi.interfaces.GtuData;
10 import org.opentrafficsim.kpi.interfaces.LaneData;
11 import org.opentrafficsim.kpi.sampling.Query;
12 import org.opentrafficsim.kpi.sampling.Trajectory;
13 import org.opentrafficsim.kpi.sampling.TrajectoryGroup;
14
15
16
17
18
19
20
21
22
23
24
25 public class TotalDelay extends AbstractIndicator<Duration>
26 {
27
28
29 private final BiFunction<LaneData<?>, String, Speed> referenceSpeedProvider;
30
31
32
33
34
35 public TotalDelay(final Speed referenceSpeed)
36 {
37 this((lane, gtuTypeId) -> referenceSpeed);
38 }
39
40
41
42
43
44 public TotalDelay(final BiFunction<LaneData<?>, String, Speed> referenceSpeedProvider)
45 {
46 this.referenceSpeedProvider = referenceSpeedProvider;
47 }
48
49 @Override
50 protected <G extends GtuData> Duration calculate(final Query<G, ?> query, final Time startTime, final Time endTime,
51 final List<TrajectoryGroup<G>> trajectoryGroups)
52 {
53 double delay = 0.0;
54 for (TrajectoryGroup<?> trajectoryGroup : trajectoryGroups)
55 {
56 for (Trajectory<?> trajectory : trajectoryGroup.getTrajectories())
57 {
58 Speed referenceSpeedOnLane =
59 this.referenceSpeedProvider.apply(trajectoryGroup.getLane(), trajectory.getGtuTypeId());
60 double d = trajectory.getTotalDuration().si - trajectory.getTotalLength().si / referenceSpeedOnLane.si;
61 if (d > 0.0)
62 {
63 delay += d;
64 }
65 }
66 }
67 return Duration.instantiateSI(delay);
68 }
69
70 @Override
71 public String toString()
72 {
73 return "TotalDelay [referenceSpeed=" + this.referenceSpeedProvider + "]";
74 }
75
76 }