import React, {Component} from 'react';
import {azint_unit, DefaultService, plot_type, plot_unit_x, plots} from "../openapi";
import MultiLinePlotWrapper from "./MultiLinePlotWrapper";
import { ReactNode } from "react";
type MyProps = {
type: plot_type;
binning: number;
angle: boolean;
azint: azint_unit;
};
type MyState = {
plots : plots,
connection_error: boolean
}
type PlotlyPlot = {
x: number[],
y: (number | null)[],
z?: (number | null)[],
type: string,
mode?: string,
name?: string,
colorscale?: string
}
type PlotlyData = PlotlyPlot[]
function AxisTypeX(unit: plot_unit_x) : string | ReactNode {
if (unit == plot_unit_x.Q_RECIP_A)
return "Q [Å-1]";
else if (unit == plot_unit_x.ANGLE_DEG)
return "Rotation angle [deg]";
else if (unit == plot_unit_x.ADU)
return "ADU";
else if (unit == plot_unit_x.D_A)
return "d [Å]";
else if (unit == plot_unit_x.GRID_UM)
return "Grid position [µm]";
else
return "Image number";
}
function AxisTypeY(plot: plot_type) : string | ReactNode {
switch (plot) {
case plot_type.IMAGE_COLLECTION_EFFICIENCY:
return "Efficiency";
case plot_type.SPOT_COUNT:
case plot_type.SPOT_COUNT_LOW_RES:
case plot_type.SPOT_COUNT_INDEXED:
case plot_type.SPOT_COUNT_ICE:
return "Spot count";
case plot_type.AZINT:
case plot_type.AZINT_1D:
case plot_type.BKG_ESTIMATE:
return "Arbitrary units";
case plot_type.ROI_MAX_COUNT:
case plot_type.ROI_SUM:
case plot_type.ROI_MEAN:
return "Photon count";
case plot_type.INDEXING_RATE:
return "Indexing rate";
case plot_type.ERROR_PIXELS:
case plot_type.STRONG_PIXELS:
return "Pixel count";
case plot_type.RECEIVER_DELAY:
return "Delay";
case plot_type.RECEIVER_FREE_SEND_BUF:
return "Free buffers";
case plot_type.INDEXING_UNIT_CELL_LENGTH:
return "Length [Å]";
case plot_type.RESOLUTION_ESTIMATE:
return "Resolution [Å]";
case plot_type.INDEXING_UNIT_CELL_ANGLE:
return "Angle [deg]";
case plot_type.MAX_PIXEL_VALUE:
return "Max pixel value";
case plot_type.ROI_WEIGHTED_X:
case plot_type.ROI_WEIGHTED_Y:
return "Position [pixel]";
case plot_type.INDEXING_TIME:
case plot_type.PROCESSING_TIME:
return "Time [s]";
case plot_type.PROFILE_RADIUS:
return "Profile radius [Å-1]";
case plot_type.B_FACTOR:
return "B-factor [Å2]";
case plot_type.BEAM_CENTER_X:
case plot_type.BEAM_CENTER_Y:
return "Beam center [pixel]";
default:
return "?";
}
}
class DataProcessingPlot extends Component {
interval: ReturnType | undefined;
state: MyState = {
plots: {
plot : [
{
x: [0, 100, 200, 300, 400, 500],
y: [0.1, 0.3, 0.5, 0.2, 0.0, 0.1],
title: "Example"
}
],
unit_x: plot_unit_x.IMAGE_NUMBER
},
connection_error: true
}
getValues() {
DefaultService.getPreviewPlot(this.props.type, this.props.binning, undefined, this.props.angle, this.props.azint)
.then(data => this.setState({plots: data, connection_error: false}))
.catch(error => {
this.setState({connection_error: true});
});
}
componentDidMount() {
this.getValues();
this.interval = setInterval(() => this.getValues(), 1000);
}
componentWillUnmount() {
clearInterval(this.interval);
}
render() {
if (this.state.connection_error
|| (this.state.plots === undefined)
|| (this.state.plots.plot === null)
|| (this.state.plots.plot.length === 0))
return No plots available
;
let data: PlotlyData = [];
if ((this.state.plots.plot[0].z !== undefined)
&& (this.state.plots.plot[0].z.length > 0)) {
data.push({
x: this.state.plots.plot[0].x,
y: this.state.plots.plot[0].y,
z: this.state.plots.plot[0].z,
type: "heatmap",
colorscale: "Viridis"
})
return
} else {
this.state.plots.plot.map(d =>
data.push({
x: d.x,
y: d.y,
type: "scatter",
mode: "line",
name: d.title
}));
return
}
}
}
export default DataProcessingPlot;