From fc88d2de442841fbcb555778d629e9283a6a4a73 Mon Sep 17 00:00:00 2001 From: tizayi Date: Thu, 5 Oct 2023 10:58:26 +0100 Subject: [PATCH] working requested min and max --- src/plot/plotStore.ts | 6 - src/results/rangeDiagram.tsx | 4 +- src/results/resultsBar.tsx | 262 +++++++++++++++++++++++++++-------- src/results/resultsStore.ts | 21 ++- 4 files changed, 226 insertions(+), 67 deletions(-) diff --git a/src/plot/plotStore.ts b/src/plot/plotStore.ts index 8f7cb15..e786061 100644 --- a/src/plot/plotStore.ts +++ b/src/plot/plotStore.ts @@ -5,12 +5,6 @@ export enum PlotAxes { pixel = "pixel", reciprocal = "reciprocal", } -export enum ScatteringOptions { - q = "q", - s = "s", - d = "d", - twoTheta = `2${'\u03B8'}` -} export interface PlotConfig { detector: boolean; diff --git a/src/results/rangeDiagram.tsx b/src/results/rangeDiagram.tsx index 83e513f..fc81c63 100644 --- a/src/results/rangeDiagram.tsx +++ b/src/results/rangeDiagram.tsx @@ -22,8 +22,8 @@ export default function RangeDiagram(props: { diff --git a/src/results/resultsBar.tsx b/src/results/resultsBar.tsx index 6ad1b9c..f75276b 100644 --- a/src/results/resultsBar.tsx +++ b/src/results/resultsBar.tsx @@ -4,14 +4,29 @@ import { CardContent, Divider, FormControl, - Grid, + FormControlLabel, + FormLabel, InputLabel, + MenuItem, + Paper, Select, Stack, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + TextField, Typography, } from "@mui/material"; import NumericRange from "../calculations/numericRange"; -import { useResultStore } from "./resultsStore"; +import { ScatteringOptions, useResultStore } from "./resultsStore"; +import { AngleUnits, ReciprocalWavelengthUnits, WavelengthUnits } from "../utils/units"; +import { useBeamlineConfigStore } from "../data-entry/beamlineconfigStore"; +import RangeDiagram from "./rangeDiagram"; +import Radio from '@mui/material/Radio'; +import RadioGroup from '@mui/material/RadioGroup'; @@ -19,10 +34,45 @@ export default function ResultsBar(props: { visableQRange: NumericRange; fullQrange: NumericRange; }): JSX.Element { - const quantityQ = useResultStore(state => state.q); - const quantityS = useResultStore(state => state.s); - const quantityD = useResultStore(state => state.d); - const quantityTheta = useResultStore(state => state.twoTheta); + const resultStore = useResultStore() + const updateQUnits = useResultStore(state => state.updateQUnits); + const updateSUnits = useResultStore(state => state.updateSUnits); + const updateDUnits = useResultStore(state => state.updateDUnits); + const updateThetaUnits = useResultStore(state => state.updateThetaUnits); + const wavelength = useBeamlineConfigStore(state => state.wavelength); + + const qRange = new NumericRange(resultStore.q.fromQ(props.visableQRange.min), resultStore.q.fromQ(props.visableQRange.max)); + const sRange = new NumericRange(resultStore.s.fromQ(props.visableQRange.min), resultStore.s.fromQ(props.visableQRange.max)); + const dRange = new NumericRange(resultStore.d.fromQ(props.visableQRange.min), resultStore.d.fromQ(props.visableQRange.max)); + const thetaRange = new NumericRange(resultStore.twoTheta.fromQ(props.visableQRange.min), resultStore.twoTheta.fromQ(props.visableQRange.max)); + + let ajustedVisibleRange: NumericRange; + let ajustedFullRange: NumericRange; + let ajustedRequestedRange: NumericRange; + + switch (resultStore.requested) { + case ScatteringOptions.s: + ajustedVisibleRange = sRange; + ajustedFullRange = new NumericRange(resultStore.s.fromQ(props.fullQrange.min), resultStore.s.fromQ(props.fullQrange.max)); + ajustedRequestedRange = new NumericRange(resultStore.s.fromQ(resultStore.requestedRange.min), resultStore.s.fromQ(resultStore.requestedRange.max)); + break; + case ScatteringOptions.d: + ajustedVisibleRange = dRange; + ajustedFullRange = new NumericRange(resultStore.d.fromQ(props.fullQrange.min), resultStore.d.fromQ(props.fullQrange.max)); + ajustedRequestedRange = new NumericRange(resultStore.d.fromQ(resultStore.requestedRange.min), resultStore.d.fromQ(resultStore.requestedRange.max)); + break; + case ScatteringOptions.twoTheta: + ajustedVisibleRange = thetaRange; + ajustedFullRange = new NumericRange(resultStore.twoTheta.fromQ(props.fullQrange.min), resultStore.twoTheta.fromQ(props.fullQrange.max)); + ajustedRequestedRange = new NumericRange(resultStore.twoTheta.fromQ(resultStore.requestedRange.min), resultStore.twoTheta.fromQ(resultStore.requestedRange.max)); + break; + default: + ajustedVisibleRange = qRange; + ajustedFullRange = new NumericRange(resultStore.q.fromQ(props.fullQrange.min), resultStore.q.fromQ(props.fullQrange.max)); + ajustedRequestedRange = new NumericRange(resultStore.q.fromQ(resultStore.requestedRange.min), resultStore.q.fromQ(resultStore.requestedRange.max)); + break; + } + return ( @@ -33,57 +83,161 @@ export default function ResultsBar(props: { - - - Values - - q - - s - - d - - twoTheta - - - Min - - {quantityQ.fromQ(props.visableQRange.min).toFixed(4)} - - {quantityS.fromQ(props.visableQRange.min).toFixed(4)} - - {quantityD.fromQ(props.visableQRange.min).toFixed(4)} - - {quantityTheta.fromQ(props.visableQRange.min).toFixed(4)} - - - Max - - {quantityQ.fromQ(props.visableQRange.max).toFixed(4)} - - {quantityS.fromQ(props.visableQRange.max).toFixed(4)} - - {quantityD.fromQ(props.visableQRange.max).toFixed(4)} - - {quantityTheta.fromQ(props.visableQRange.max).toFixed(4)} - - - Units - - q - + + + Values + Min + Max + Units + + + + - - - - + q + {qRange.min.toFixed(4)} + {qRange.max.toFixed(4)} + + + q + + + + + s + {sRange.min.toFixed(4)} + {sRange.max.toFixed(4)} + + + s + + + + + d + {dRange.min.toFixed(4)} + {dRange.max.toFixed(4)} + + + d + + + + + two theta + {thetaRange.min.toFixed(4)} + {thetaRange.max.toFixed(4)} + + + theta + + + + + +
+ - - Other side - + + + + + Requested min {resultStore.requested} value: + Requested max {resultStore.requested} value: + + + { + resultStore.updateRequestedRange(new NumericRange(parseFloat(event.target.value) ?? 0, resultStore.requestedRange.max)) + }} + /> + { + resultStore.updateRequestedRange(new NumericRange(resultStore.requestedRange.min, parseFloat(event.target.value) ?? 1)) + }} + /> + + + Requested Quantiy + resultStore.updateRequested(event.target.value as ScatteringOptions)} + > + } label={ScatteringOptions.q} /> + } label={ScatteringOptions.s} /> + } label={ScatteringOptions.d} /> + } label={ScatteringOptions.twoTheta} /> + + + + + + diff --git a/src/results/resultsStore.ts b/src/results/resultsStore.ts index 84e5b7f..3d0a885 100644 --- a/src/results/resultsStore.ts +++ b/src/results/resultsStore.ts @@ -87,14 +87,23 @@ export class TwoTheta implements ScatteringQuantity { } } +export enum ScatteringOptions { + q = "q", + s = "s", + d = "d", + twoTheta = `2${'\u03B8'}` +} + export interface ResultStore { + requested: ScatteringOptions; q: ScatteringQuantity; s: ScatteringQuantity; d: ScatteringQuantity; twoTheta: ScatteringQuantity; requestedRange: NumericRange; - updateRequested: (newRange: NumericRange) => void; + updateRequested: (quantity: ScatteringOptions) => void; + updateRequestedRange: (newRange: NumericRange) => void; updateQUnits: (newunits: ReciprocalWavelengthUnits) => void; updateSUnits: (newunits: ReciprocalWavelengthUnits) => void; updateDUnits: (newunits: WavelengthUnits) => void; @@ -102,15 +111,17 @@ export interface ResultStore { } export const useResultStore = create((set) => ({ + requested: ScatteringOptions.q, q: new Q(ReciprocalWavelengthUnits.nanmometres), s: new S(ReciprocalWavelengthUnits.nanmometres), d: new D(WavelengthUnits.nanmometres), twoTheta: new TwoTheta(AngleUnits.radians, 0), requestedRange: new NumericRange(0, 1), - updateRequested: (newRange: NumericRange) => { set({ requestedRange: newRange }) }, + updateRequested: (quantity: ScatteringOptions) => { set({ requested: quantity }) }, + updateRequestedRange: (newRange: NumericRange) => { set({ requestedRange: newRange }) }, updateQUnits: (newunits: ReciprocalWavelengthUnits) => set({ q: new Q(newunits) }), - updateSUnits: (newunits: ReciprocalWavelengthUnits) => set({ q: new S(newunits) }), - updateDUnits: (newunits: WavelengthUnits) => set({ q: new D(newunits) }), - updateThetaUnits: (newunits: AngleUnits, wavelength: number) => set({ q: new TwoTheta(newunits, wavelength) }) + updateSUnits: (newunits: ReciprocalWavelengthUnits) => set({ s: new S(newunits) }), + updateDUnits: (newunits: WavelengthUnits) => set({ d: new D(newunits) }), + updateThetaUnits: (newunits: AngleUnits, wavelength: number) => set({ twoTheta: new TwoTheta(newunits, wavelength) }) }));