import {ChangeEvent, memo, useEffect, useState} from 'react'; import {Grid, Slider, Switch, Typography} from "@mui/material"; import {putConfigSpotFinding, spot_finding_settings} from "../client"; import SettingsPanel from "./SettingsPanel"; import _ from "lodash"; type MyProps = { s?: spot_finding_settings, update: () => void }; const default_spot_finding_settings: spot_finding_settings = { enable: true, indexing: true, photon_count_threshold: 8, signal_to_noise_threshold: 3.0, min_pix_per_spot: 2, max_pix_per_spot: 50, high_resolution_limit: 2.5, low_resolution_limit: 50.0, quick_integration: false, high_resolution_limit_for_spot_count_low_res: 5.0, ice_ring_width_q_recipA: 0.02, high_res_gap_Q_recipA: 1.5 }; function putValues(x: spot_finding_settings) { putConfigSpotFinding({ body: x, throwOnError: true }) .catch(error => console.log(error) ); } function DataProcessingSettings({s: serverS, update}: MyProps) { const [s, setS] = useState(default_spot_finding_settings); const [lastDownloadedS, setLastDownloadedS] = useState(default_spot_finding_settings); const [highResGap, setHighResGap] = useState(1.5); // Only adopt the server copy when it actually changed, otherwise the // 1 s statistics poll would overwrite edits the user is making. useEffect(() => { if ((serverS !== undefined) && !_.isEqual(serverS, lastDownloadedS)) { setS(serverS); setLastDownloadedS(serverS); setHighResGap(serverS.high_res_gap_Q_recipA ?? highResGap); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [serverS]); const apply = (next: spot_finding_settings) => { setS(next); putValues(next); update(); }; const setPhotonCountThreshold = (event: Event, newValue: number | number[]) => apply({...s, photon_count_threshold: newValue as number}); const setSignalToNoiseThreshold = (event: Event, newValue: number | number[]) => apply({...s, signal_to_noise_threshold: newValue as number}); const setMinPixPerSpot = (event: Event, newValue: number | number[]) => apply({...s, min_pix_per_spot: newValue as number}); const setLowResolutionLimit = (event: Event, newValue: number | number[]) => apply({...s, low_resolution_limit: newValue as number}); const setHighResolutionLimit = (event: Event, newValue: number | number[]) => apply({...s, high_resolution_limit: newValue as number}); const setHighResolutionLimitForCountingLowResSpots = (event: Event, newValue: number | number[]) => apply({...s, high_resolution_limit_for_spot_count_low_res: newValue as number}); const setIceRingWidth = (event: Event, newValue: number | number[]) => apply({...s, ice_ring_width_q_recipA: newValue as number}); const enableSpotFindingToggle = (event: ChangeEvent) => apply({...s, enable: event.target.checked}); const enableIndexingToggle = (event: ChangeEvent) => apply({...s, indexing: event.target.checked}); const enableQuickIntegrationToggle = (event: ChangeEvent) => apply({...s, quick_integration: event.target.checked}); const enableHighResGapToggle = (event: ChangeEvent) => apply({...s, high_res_gap_Q_recipA: event.target.checked ? highResGap : undefined}); const handleHighResGap = (event: Event, newValue: number | number[]) => { const v = newValue as number; setHighResGap(v); apply({...s, high_res_gap_Q_recipA: v}); }; return ( Spot finding

Count threshold
Signal-to-noise threshold value.toFixed(1)} />
Minimum pixel / spot Low resolution limit [Å] value.toFixed(1)} /> High resolution limit [Å] value.toFixed(1)} /> High resolution limit for counting low resolution spots [Å] value.toFixed(1)} /> Ice ring width in Q-space [Å-1] value.toFixed(3)} /> High‑res gap Q-space filter [Å-1] value.toFixed(2)} />

Indexing

Quick MX integration
); } export default memo(DataProcessingSettings);