Skip to content

Commit ddc9816

Browse files
authored
Merge pull request #3546 from ControlSystemStudio/CSSTUDIO-3420-branch2
CSSTUDIO-3420 Waterfall Plot widget optimization: Remove data points that are not plotted.
2 parents 6eba27b + 620809b commit ddc9816

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

app/display/waterfallplot/src/main/java/org/phoebus/applications/waterfallplotwidget/WaterfallPlotController.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.time.Duration;
1919
import java.time.Instant;
2020
import java.util.ArrayList;
21+
import java.util.HashMap;
2122
import java.util.LinkedList;
2223
import java.util.List;
2324
import java.util.Optional;
@@ -321,6 +322,8 @@ public synchronized void redraw(WaterfallPlotRuntime.PVData pvData) {
321322

322323
ConcurrentSkipListMap<Instant, ArrayList<Double>> instantToWaveform = waveformPVData.instantToValue();
323324
Instant startKey = instantToWaveform.ceilingKey(Instant.MIN);
325+
326+
Optional<Instant> previousInstant = Optional.empty();
324327
for (Instant t = t1.plus(stepsize); t.compareTo(t2) <= 0; t = t.plus(stepsize)) {
325328
timeValuesLinkedList.add(((double) t.toEpochMilli()) / 1000.0);
326329

@@ -333,6 +336,15 @@ public synchronized void redraw(WaterfallPlotRuntime.PVData pvData) {
333336
ArrayList<Double> waveform = instantToWaveform.get(instant);
334337
waveformLength = Math.max(waveformLength, waveform.size());
335338
zValuesLinkedList.add(waveform);
339+
340+
if (previousInstant.isPresent()) {
341+
// Optimization: Remove data points that are not plotted.
342+
for (var key : instantToWaveform.subMap(previousInstant.get(), false, instant, false).keySet()) {
343+
instantToWaveform.remove(key);
344+
}
345+
}
346+
347+
previousInstant = Optional.of(instant);
336348
}
337349
}
338350
} else if (pvData instanceof WaterfallPlotRuntime.ScalarPVsData scalarPVsData) {
@@ -344,6 +356,12 @@ public synchronized void redraw(WaterfallPlotRuntime.PVData pvData) {
344356

345357
waveformLength = 2 * pvNameToInstantToValue.size() + 1;
346358

359+
HashMap<String, Optional<Instant>> pvNameToPreviousInstant = new HashMap<>();
360+
for (var pvNameAndInstantToValue : pvNameToInstantToValue) {
361+
String pvName = pvNameAndInstantToValue.getKey();
362+
pvNameToPreviousInstant.put(pvName, Optional.empty());
363+
}
364+
347365
for (Instant t = t1.plus(stepsize); t.compareTo(t2) <= 0; t = t.plus(stepsize)) {
348366
timeValuesLinkedList.add(((double) t.toEpochMilli()) / 1000.0);
349367
ArrayList<Double> zValues = new ArrayList<>();
@@ -360,6 +378,16 @@ public synchronized void redraw(WaterfallPlotRuntime.PVData pvData) {
360378
} else {
361379
zValues.add(instantToValue.get(instant));
362380
zValues.add(instantToValue.get(instant));
381+
382+
Optional<Instant> previousInstant = pvNameToPreviousInstant.get(pvName);
383+
if (previousInstant.isPresent()) {
384+
// Optimization: Remove data points that are not plotted.
385+
for (var key : instantToValue.subMap(previousInstant.get(), false, instant, false).keySet()) {
386+
instantToValue.remove(key);
387+
}
388+
}
389+
390+
pvNameToPreviousInstant.put(pvName, Optional.of(instant));
363391
}
364392
}
365393

0 commit comments

Comments
 (0)