Skip to content

Commit b7dfc6a

Browse files
authored
Merge pull request #53 from tiqi-group/24-add-support-for-continuous-2d-scans-with-real-time-parameter
24 add support for continuous 2d scans with real time parameter
2 parents 1625237 + e2ff13d commit b7dfc6a

File tree

22 files changed

+714
-460
lines changed

22 files changed

+714
-460
lines changed

frontend/src/components/ResultChannelPlot.tsx

Lines changed: 99 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,37 @@ const formatAxisLabel = (value: string): string => {
2424
return isNaN(num) ? value : num.toFixed(3);
2525
};
2626

27+
function hasDayBreak(data: string[]) {
28+
const first = new Date(data[0]);
29+
const last = new Date(data.at(-1) || data[0]);
30+
return !isNaN(first.getDay()) && first.getDay() != last.getDay();
31+
}
32+
33+
function formatTime(timestamp: string) {
34+
const date = new Date(timestamp);
35+
const h = date.getHours();
36+
const m = date.getMinutes();
37+
const s = date.getSeconds();
38+
return `${h}:${m}:${s}`;
39+
}
40+
41+
function formatDateTime(timestamp: string) {
42+
const date = new Date(timestamp);
43+
const year = date.getFullYear();
44+
const month = date.getMonth();
45+
const day = date.getDate();
46+
const time = formatTime(timestamp);
47+
return `${year}-${month}-${day} ${time}`;
48+
}
49+
50+
function timeAxisProps(data: string[]) {
51+
return {
52+
axisLabel: {
53+
formatter: hasDayBreak(data) ? formatDateTime : formatTime,
54+
},
55+
};
56+
}
57+
2758
function updateVisualMap(chart: ECharts, selectedChannelName: string | undefined) {
2859
const opt = chart.getOption();
2960

@@ -59,7 +90,7 @@ function updateVisualMap(chart: ECharts, selectedChannelName: string | undefined
5990
const ResultChannelPlot = ({
6091
experimentData,
6192
loading,
62-
title,
93+
title: titleText,
6394
subtitle,
6495
channelNames,
6596
repetitions = 1,
@@ -114,12 +145,23 @@ const ResultChannelPlot = ({
114145
scale: true,
115146
boundaryGap: ["1%", "1%"],
116147
};
148+
const title = {
149+
text: titleText,
150+
left: "center",
151+
subtext: subtitle,
152+
subtextStyle: {
153+
lineHeight: 0,
154+
},
155+
top: "-1%",
156+
};
117157
let chartSeries: EChartsOption["series"] = [];
158+
const nOrdinaryParameters =
159+
scanParameters.length -
160+
scanParameters.reduce((total, param) => (param.realtime ? total + 1 : total), 0);
118161

119-
if (scanParameters.length === 0 && timestampEntry) {
120-
xAxis.type = "time";
121-
xAxis.name = "Time";
162+
if (nOrdinaryParameters === 0 && timestampEntry) {
122163
xAxisData = timestampEntry.scanValues as string[];
164+
Object.assign(xAxis, { type: "time", name: "Time", ...timeAxisProps(xAxisData) });
123165

124166
const fullDataSet = xAxisData.map((xVal, index) => [
125167
xVal,
@@ -150,18 +192,44 @@ const ResultChannelPlot = ({
150192
);
151193
} else if (scanParameters.length === 2) {
152194
const [xScan, yScan] = scanParameters;
195+
const xScanValues =
196+
xScan.realtime && timestampEntry
197+
? timestampEntry.scanValues
198+
: xScan.scan_values;
199+
const yScanValues =
200+
yScan.realtime && timestampEntry
201+
? timestampEntry.scanValues
202+
: yScan.scan_values;
153203
const series = [];
154204

155205
for (const resultChannel of resultChannels) {
156206
const data: [number | string, number | string, number][] = [];
157-
for (let i = 0; i < xScan.scan_values.length; i++) {
158-
for (let j = 0; j < yScan.scan_values.length; j++) {
207+
if (xScan.realtime) {
208+
for (let i = 0; i < xScanValues.length; i++) {
159209
data.push([
160-
xScan.scan_values[i],
161-
yScan.scan_values[j],
162-
resultChannel.data[i * yScan.scan_values.length + j],
210+
xScanValues[Math.floor(i / yScanValues.length)],
211+
yScanValues[i % yScanValues.length],
212+
resultChannel.data[i],
163213
]);
164214
}
215+
} else if (yScan.realtime) {
216+
for (let i = 0; i < yScanValues.length; i++) {
217+
data.push([
218+
xScanValues[i % xScanValues.length],
219+
yScanValues[Math.floor(i / xScanValues.length)],
220+
resultChannel.data[i],
221+
]);
222+
}
223+
} else {
224+
for (let i = 0; i < xScanValues.length; i++) {
225+
for (let j = 0; j < yScanValues.length; j++) {
226+
data.push([
227+
xScanValues[i],
228+
yScanValues[j],
229+
resultChannel.data[i * yScanValues.length + j],
230+
]);
231+
}
232+
}
165233
}
166234

167235
series.push({
@@ -173,16 +241,12 @@ const ResultChannelPlot = ({
173241
});
174242
}
175243

244+
const categoryAxisProps = {
245+
axisLabel: { formatter: formatAxisLabel },
246+
};
247+
176248
return {
177-
title: {
178-
text: title,
179-
left: "center",
180-
subtext: subtitle,
181-
subtextStyle: {
182-
lineHeight: 0,
183-
},
184-
top: "-1%",
185-
},
249+
title,
186250
legend: {
187251
selectedMode: "single",
188252
left: "right",
@@ -197,18 +261,22 @@ const ResultChannelPlot = ({
197261
},
198262
tooltip: {},
199263
xAxis: {
200-
type: "category",
201-
axisLabel: { formatter: formatAxisLabel },
202264
name: xScan.variable_id,
265+
type: "category",
203266
nameLocation: "middle",
204267
nameGap: 25,
268+
...(xScan.realtime
269+
? timeAxisProps(xScanValues as string[])
270+
: categoryAxisProps),
205271
},
206272
yAxis: {
207-
type: "category",
208-
axisLabel: { formatter: formatAxisLabel },
209273
name: yScan.variable_id,
274+
type: "category",
210275
nameLocation: "middle",
211276
nameGap: 45,
277+
...(yScan.realtime
278+
? timeAxisProps(yScanValues as string[])
279+
: categoryAxisProps),
212280
},
213281
series,
214282
visualMap: {
@@ -220,15 +288,7 @@ const ResultChannelPlot = ({
220288
}
221289

222290
return {
223-
title: {
224-
text: title,
225-
left: "center",
226-
subtext: subtitle,
227-
subtextStyle: {
228-
lineHeight: 0,
229-
},
230-
top: "-1%",
231-
},
291+
title,
232292
textStyle: { fontFamily: "sans-serif", fontSize: 12 },
233293
tooltip: { trigger: "axis" },
234294
toolbox: {
@@ -259,7 +319,14 @@ const ResultChannelPlot = ({
259319
yAxis,
260320
series: chartSeries,
261321
};
262-
}, [experimentData, title, subtitle, scanParameters, repetitions, showRepetitions]);
322+
}, [
323+
experimentData,
324+
titleText,
325+
subtitle,
326+
scanParameters,
327+
repetitions,
328+
showRepetitions,
329+
]);
263330

264331
const updateChart = useCallback(
265332
(chart: ECharts) => {

0 commit comments

Comments
 (0)