import {ChangeEvent, memo, useEffect, useState} from 'react'; import {FormControlLabel, Checkbox, Stack, Radio, RadioGroup, Typography} from "@mui/material"; import NumberTextField from "./NumberTextField"; import {azim_int_settings} from "../client"; import {putConfigAzimIntMutation} from "../client/@tanstack/react-query.gen"; import _ from "lodash"; import FormControl from "@mui/material/FormControl"; import SettingsPanel from "./SettingsPanel"; import {useUpload} from "./useUpload"; type MyProps = { s?: azim_int_settings }; const default_azim_int_settings : azim_int_settings = { solid_angle_corr: true, polarization_corr: true, high_q_recipA: 5, low_q_recipA: 0.1, q_spacing: 0.1, azimuthal_bins: 1, force_cpu: false } function AzIntSettings({s: serverS}: MyProps) { const [s, setS] = useState(default_azim_int_settings); const [lastDownloadedS, setLastDownloadedS] = useState(default_azim_int_settings); const [downloadCounter, setDownloadCounter] = useState(0); const [lowQError, setLowQError] = useState(false); const [highQError, setHighQError] = useState(false); const [qSpacingError, setQSpacingError] = useState(false); const [highQ, setHighQ] = useState(5); const { submit, pending, snackbar } = useUpload(putConfigAzimIntMutation()); useEffect(() => { if ((serverS !== undefined) && !_.isEqual(serverS, lastDownloadedS)) { setS(serverS); setLastDownloadedS(serverS); setDownloadCounter(c => c + 1); setHighQ(serverS.high_q_recipA ?? highQ); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [serverS]); const dirty = !_.isEqual(s, lastDownloadedS); return ( submit(s)} uploadDisabled={pending || ((s.high_q_recipA !== undefined) && (s.high_q_recipA <= s.low_q_recipA)) || highQError || lowQError || qSpacingError} snackbar={snackbar}> { setS(prev => ({...prev, q_spacing: val})); setQSpacingError(err); }} fullWidth/> { setS(prev => ({...prev, low_q_recipA: val})); setLowQError(err); }} fullWidth/> { setHighQ(val); setS(prev => ({...prev, high_q_recipA: val})); setHighQError(err); }} fullWidth/> ) => { // No high Q means integrating out to the highest Q the detector reaches. setS(prev => event.target.checked ? _.omit(prev, "high_q_recipA") : {...prev, high_q_recipA: highQ}); }} />} label="High Q to detector edge"/> ) => { setS(prev => ({...prev, solid_angle_corr: event.target.checked})); }} />} label="Solid angle correction"/> ) => { setS(prev => ({...prev, polarization_corr: event.target.checked})); }} />} label="Polarization correction"/> ) => { setS(prev => ({...prev, force_cpu: event.target.checked})); }} />} label="Force CPU calculation in FPGA workflow"/> Azimuthal bins ) => { setS(prev => ({...prev, azimuthal_bins: Number(event.target.value)})); }} > {[1, 2, 4, 8, 16, 32, 64, 128].map((value) => ( } label={value.toString()} /> ))} ); } export default memo(AzIntSettings);