import React from 'react'; import Paper from '@mui/material/Paper'; import {Stack, TextField, Radio, RadioGroup, FormControlLabel, FormControl, FormLabel, Checkbox} from "@mui/material"; import NumberTextField from "./NumberTextField"; import {dataset_settings, grid_scan, rotation_axis} from "../openapi"; import ButtonWithSnackbar from "./ButtonWithSnackbar"; type MyProps = { frame_time_us: number }; type MyState = { s: dataset_settings, beam_x_pxl_err: boolean, beam_y_pxl_err: boolean, detector_distance_mm_err: boolean, incident_energy_kev_err: boolean, images_per_trigger_err: boolean, image_time_us_err: boolean, ntrigger_err: boolean, mode: 'still' | 'rotation' | 'grid', goniometer: rotation_axis, grid: grid_scan, }; class DataCollection extends React.Component { state : MyState = { s : { beam_x_pxl: 0, beam_y_pxl: 0, detector_distance_mm: 100, incident_energy_keV: 12.398, images_per_trigger: 1, image_time_us: this.props.frame_time_us, ntrigger: 1 }, goniometer : { start: 0, step: 0.1, name: "omega", vector: [0,1,0] }, grid: { n_fast: 10, step_x_um: 10.0, step_y_um: 10.0, vertical: false, snake: false }, beam_x_pxl_err: false, beam_y_pxl_err: false, detector_distance_mm_err: false, incident_energy_kev_err: false, images_per_trigger_err: false, image_time_us_err: false, ntrigger_err: false, mode: 'still', } error() : boolean { return this.state.beam_x_pxl_err || this.state.beam_y_pxl_err || this.state.detector_distance_mm_err || this.state.incident_energy_kev_err || this.state.image_time_us_err || this.state.images_per_trigger_err || this.state.ntrigger_err; } getDatasetSettings = () => { let d = this.state.s; if (this.state.mode === 'rotation') d.goniometer = this.state.goniometer; else if (this.state.mode === 'grid') d.grid_scan = this.state.grid; return d; } render() { return
) => { this.setState(prevState => ({ s: {...prevState.s, file_prefix: event.target.value} })); } } value={this.state.s.file_prefix} sx={{width:"90%"}} /> { this.setState(prevState => ({ s: {...prevState.s, images_per_trigger: val}, images_per_trigger_err: err } )); }} min={1} default={this.state.s.images_per_trigger} /> { this.setState(prevState => ({ s: {...prevState.s, ntrigger: val}, ntrigger_err: err } )); }} min={1} default={this.state.s.ntrigger} /> { let image_time_us = Math.round(val * 1000.0); this.setState(prevState => ({ s: {...prevState.s, image_time_us: image_time_us }, image_time_us_err: err } )); }} units={"ms"} float={true} min={0.01} default={(this.state.s.image_time_us ?? 500) / 1000.0} /> { this.setState(prevState => ({ s: {...prevState.s, beam_x_pxl: val}, beam_x_pxl_err: err } )); }} units={"pxl"} float={true} default={this.state.s.beam_x_pxl} /> { this.setState(prevState => ({ s: {...prevState.s, beam_y_pxl: val}, beam_y_pxl_err: err } )); }} units={"pxl"} float={true} default={this.state.s.beam_y_pxl} /> { this.setState(prevState => ({ s: {...prevState.s, detector_distance_mm: val}, detector_distance_mm_err: err } )); }} units={"mm"} min={0.1} float={true} default={this.state.s.detector_distance_mm} /> { this.setState(prevState => ({ s: {...prevState.s, incident_energy_keV: val}, incident_energy_kev_err: err } )); }} min={0.1} max={500.0} units={"keV"} float={true} default={this.state.s.incident_energy_keV} /> this.setState({mode: event.target.value as 'still' | 'rotation' | 'grid'})}> } label="Still"/> } label="Rotation"/> } label="Grid scan"/> {this.state.mode === 'rotation' && ( this.setState(prevState => ( {goniometer : {...prevState.goniometer, start: val}} ))} units="°" float={true} default={this.state.goniometer.start} /> this.setState(prevState => ( {goniometer : {...prevState.goniometer, step: val}} ))} units="°" float={true} min={0.001} default={this.state.goniometer.step} /> this.setState(prevState => ( {goniometer : {...prevState.goniometer, name: e.target.value}} ))} /> )} {this.state.mode === 'grid' && ( this.setState((e) => this.setState( prevState => ( {grid : {...prevState.grid, n_fast: val}} )))} min={1} default={this.state.grid.n_fast} /> this.setState((e) => this.setState( prevState => ( {grid : {...prevState.grid, step_x_um: val}} )))} units="μm" float={true} default={this.state.grid.step_x_um} /> this.setState((e) => this.setState( prevState => ( {grid : {...prevState.grid, step_y_um: val}} )))} units="μm" float={true} default={this.state.grid.step_y_um} /> this.setState(prevState => ( {grid : {...prevState.grid, snake: e.target.checked}} ))} /> } label="Snake scan" /> this.setState(prevState => ( {grid : {...prevState.grid, vertical: e.target.checked}} ))} /> } label="Vertical scan" /> )}
} } export default DataCollection;