From fe06ba18ba1e12ed7bbe6a75a81edf846b78cab1 Mon Sep 17 00:00:00 2001 From: Karina Ruzaeva Date: Fri, 28 Jun 2019 13:20:51 +0200 Subject: [PATCH 1/5] +FEM --- client/src/analysis/components/FEM.tsx | 121 +++++++++++++++++++++++++ client/src/analysis/types.ts | 9 ++ client/src/messages.ts | 8 +- 3 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 client/src/analysis/components/FEM.tsx diff --git a/client/src/analysis/components/FEM.tsx b/client/src/analysis/components/FEM.tsx new file mode 100644 index 0000000000..3d31b4db33 --- /dev/null +++ b/client/src/analysis/components/FEM.tsx @@ -0,0 +1,121 @@ +import * as React from "react"; +import { useState } from "react"; +import { useDispatch } from "react-redux"; +import { defaultDebounce } from "../../helpers"; +import ResultList from "../../job/components/ResultList"; +import { AnalysisTypes } from "../../messages"; +import { cbToRadius, inRectConstraint, riConstraint, roConstraints } from "../../widgets/constraints"; +import DraggableHandle from "../../widgets/DraggableHandle"; +import Ring from "../../widgets/Ring"; +import { HandleRenderFunction } from "../../widgets/types"; +import * as analysisActions from "../actions"; +import { AnalysisProps } from "../types"; +import AnalysisLayoutTwoCol from "./AnalysisLayoutTwoCol"; +import useDefaultFrameView from "./DefaultFrameView"; +import Toolbar from "./Toolbar"; + +const FEMAnalysis: React.SFC = ({ analysis, dataset }) => { + const { shape } = dataset.params; + const [scanHeight, scanWidth, imageHeight, imageWidth] = shape; + const minLength = Math.min(imageWidth, imageHeight); + + const [cx, setCx] = useState(imageWidth / 2); + const [cy, setCy] = useState(imageHeight / 2); + const [ri, setRi] = useState(minLength / 4); + const [ro, setRo] = useState(minLength / 2); + + const riHandle = { + x: cx - ri, + y: cy, + } + const roHandle = { + x: cx - ro, + y: cy, + } + + const handleCenterChange = defaultDebounce((newCx: number, newCy: number) => { + setCx(newCx); + setCy(newCy); + }); + const handleRIChange = defaultDebounce(setRi); + const handleROChange = defaultDebounce(setRo); + + const frameViewHandles: HandleRenderFunction = (handleDragStart, handleDrop) => (<> + + + + ); + + const frameViewWidgets = ( + + ) + + const dispatch = useDispatch(); + + const runAnalysis = () => { + dispatch(analysisActions.Actions.run(analysis.id, 1, { + type: AnalysisTypes.APPLY_RING_MASK, + parameters: { + shape: "ring", + cx, cy, ri, ro, + } + })); + }; + + const { + frameViewTitle, frameModeSelector, + handles: resultHandles, + widgets: resultWidgets, + } = useDefaultFrameView({ + scanWidth, + scanHeight, + analysisId: analysis.id, + }) + + const subtitle = ( + <>{frameViewTitle} Ring: center=(x={cx.toFixed(2)}, y={cy.toFixed(2)}), ri={ri.toFixed(2)}, ro={ro.toFixed(2)} + ) + + const toolbar = + + return ( + + + } + right={<> + + } + toolbar={toolbar} + /> + ); +} + +export default FEMAnalysis; \ No newline at end of file diff --git a/client/src/analysis/types.ts b/client/src/analysis/types.ts index 95eed0dee6..a1393d48ec 100644 --- a/client/src/analysis/types.ts +++ b/client/src/analysis/types.ts @@ -4,6 +4,7 @@ import DiskMaskAnalysis from "./components/DiskMaskAnalysis"; import PointSelectionAnalysis from "./components/PointSelectionAnalysis"; import RadialFourierAnalysis from "./components/RadialFourierAnalysis"; import RingMaskAnalysis from "./components/RingMaskAnalysis"; +import FEM from "./components/FEM"; export type AnalysisStatus = "busy" | "idle"; @@ -59,6 +60,14 @@ export const AnalysisMetadata: { [s: string]: AnalysisMetadataItem } = { title: "Disk", component: DiskMaskAnalysis, }, + + [AnalysisTypes.FEM]: { + desc: "Apply a disk mask with center cx, cy; radius r", + title: "FEM (SD over Ring)", + component: FEM, + }, + + [AnalysisTypes.CENTER_OF_MASS]: { desc: "Compute the center of mass of all diffraction images", title: "Center of mass", diff --git a/client/src/messages.ts b/client/src/messages.ts index e98f2197fb..af6bb356ba 100644 --- a/client/src/messages.ts +++ b/client/src/messages.ts @@ -293,6 +293,7 @@ export enum AnalysisTypes { SUM_FRAMES_ROI = "SUM_FRAMES_ROI", PICK_FRAME = "PICK_FRAME", RADIAL_FOURIER = "RADIAL_FOURIER", + FEM = "FEM" } export interface RingMaskDetails { @@ -300,6 +301,11 @@ export interface RingMaskDetails { parameters: MaskDefRing, } +export interface FEMDetails { + type: AnalysisTypes.FEM, + parameters: MaskDefRing, +} + export interface DiskMaskDetails { type: AnalysisTypes.APPLY_DISK_MASK, parameters: MaskDefDisk, @@ -331,7 +337,7 @@ export interface RadialFourierDetails { } export type AnalysisParameters = MaskDefRing | MaskDefDisk | CenterOfMassParams | PointDef | PickFrameParams | RadialFourierParams; -export type AnalysisDetails = RingMaskDetails | DiskMaskDetails | CenterOfMassDetails | PointDefDetails | SumFramesDetails | PickFrameDetails | RadialFourierDetails; +export type AnalysisDetails = RingMaskDetails | DiskMaskDetails | CenterOfMassDetails | PointDefDetails | SumFramesDetails | PickFrameDetails | RadialFourierDetails | FEMDetails; export interface StartJobRequest { job: { From 9d40dc238b8311131d45f60c7e7b39f9834a5727 Mon Sep 17 00:00:00 2001 From: Karina Ruzaeva Date: Mon, 1 Jul 2019 11:43:46 +0200 Subject: [PATCH 2/5] small changes --- client/src/analysis/components/FEM.tsx | 2 +- client/src/analysis/types.ts | 2 +- client/src/messages.ts | 1 + src/libertem/analysis/fem.py | 25 +++++++++++++++++++++++++ src/libertem/web/jobs.py | 3 ++- 5 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 src/libertem/analysis/fem.py diff --git a/client/src/analysis/components/FEM.tsx b/client/src/analysis/components/FEM.tsx index 3d31b4db33..14ca15276d 100644 --- a/client/src/analysis/components/FEM.tsx +++ b/client/src/analysis/components/FEM.tsx @@ -70,7 +70,7 @@ const FEMAnalysis: React.SFC = ({ analysis, dataset }) => { const runAnalysis = () => { dispatch(analysisActions.Actions.run(analysis.id, 1, { - type: AnalysisTypes.APPLY_RING_MASK, + type: AnalysisTypes.FEM, parameters: { shape: "ring", cx, cy, ri, ro, diff --git a/client/src/analysis/types.ts b/client/src/analysis/types.ts index a1393d48ec..2599044a44 100644 --- a/client/src/analysis/types.ts +++ b/client/src/analysis/types.ts @@ -1,10 +1,10 @@ import { AnalysisTypes, DatasetOpen, PickFrameDetails, SumFramesDetails } from "../messages"; import CenterOfMassAnalysis from "./components/CenterOfMassAnalysis"; import DiskMaskAnalysis from "./components/DiskMaskAnalysis"; +import FEM from "./components/FEM"; import PointSelectionAnalysis from "./components/PointSelectionAnalysis"; import RadialFourierAnalysis from "./components/RadialFourierAnalysis"; import RingMaskAnalysis from "./components/RingMaskAnalysis"; -import FEM from "./components/FEM"; export type AnalysisStatus = "busy" | "idle"; diff --git a/client/src/messages.ts b/client/src/messages.ts index af6bb356ba..3728cbf8bb 100644 --- a/client/src/messages.ts +++ b/client/src/messages.ts @@ -239,6 +239,7 @@ export interface MaskDefRing { ro: number } + export interface MaskDefDisk { shape: "disk", cx: number, diff --git a/src/libertem/analysis/fem.py b/src/libertem/analysis/fem.py new file mode 100644 index 0000000000..3b6137ebe0 --- /dev/null +++ b/src/libertem/analysis/fem.py @@ -0,0 +1,25 @@ +from libertem.viz import visualize_simple + +from .base import BaseAnalysis, AnalysisResult, AnalysisResultSet + +import libertem.udf.FEM as FEM + + +class ApplyFEM(BaseAnalysis): + TYPE = "UDF" + + def get_udf(self): + center = (self.parameters["cy"], self.parameters["cx"]) + rad_in = self.parameters["ri"] + rad_out = self.parameters["ro"] + return FEM.FEMUDF(center=center, rad_in=rad_in, rad_out=rad_out) + + def get_udf_results(self, udf_results): + + return AnalysisResultSet([ + AnalysisResult(raw_data=udf_results.intensity, + visualized=visualize_simple( + udf_results.intensity.reshape(self.dataset.shape.nav)), + key="intensity", title="intensity", + desc="result from SD calculation over ring"), + ]) diff --git a/src/libertem/web/jobs.py b/src/libertem/web/jobs.py index e707d66973..81edd7c458 100644 --- a/src/libertem/web/jobs.py +++ b/src/libertem/web/jobs.py @@ -6,7 +6,7 @@ from libertem.analysis import ( DiskMaskAnalysis, RingMaskAnalysis, PointMaskAnalysis, - COMAnalysis, SumAnalysis, PickFrameAnalysis, RadialFourierAnalysis + COMAnalysis, SumAnalysis, PickFrameAnalysis, RadialFourierAnalysis, ApplyFEM ) from .base import CORSMixin, run_blocking, log_message, result_images from .messages import Message @@ -30,6 +30,7 @@ def get_analysis_by_type(self, type_): "RADIAL_FOURIER": RadialFourierAnalysis, "SUM_FRAMES": SumAnalysis, "PICK_FRAME": PickFrameAnalysis, + "FEM": ApplyFEM, } return analysis_by_type[type_] From 331b98f48420d5969a5f12b45add727dc093f060 Mon Sep 17 00:00:00 2001 From: Karina Ruzaeva Date: Mon, 1 Jul 2019 13:01:45 +0200 Subject: [PATCH 3/5] fixed jobs --- src/libertem/analysis/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libertem/analysis/__init__.py b/src/libertem/analysis/__init__.py index 4790a03263..81330397ae 100644 --- a/src/libertem/analysis/__init__.py +++ b/src/libertem/analysis/__init__.py @@ -6,6 +6,7 @@ from .point import PointMaskAnalysis from .masks import MasksAnalysis from .raw import PickFrameAnalysis +from .fem import ApplyFEM __all__ = [ 'SumAnalysis', @@ -16,4 +17,5 @@ 'PointMaskAnalysis', 'MasksAnalysis', 'PickFrameAnalysis', + 'ApplyFEM', ] From d9b0a2670ccfbb5bdc5deb6ff4bf0ee9d4cff708 Mon Sep 17 00:00:00 2001 From: Karina Ruzaeva Date: Mon, 1 Jul 2019 15:12:34 +0200 Subject: [PATCH 4/5] title fixed --- client/src/analysis/components/FEM.tsx | 2 +- client/src/analysis/types.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/analysis/components/FEM.tsx b/client/src/analysis/components/FEM.tsx index 14ca15276d..031995179b 100644 --- a/client/src/analysis/components/FEM.tsx +++ b/client/src/analysis/components/FEM.tsx @@ -96,7 +96,7 @@ const FEMAnalysis: React.SFC = ({ analysis, dataset }) => { return ( Date: Thu, 4 Jul 2019 11:17:26 +0200 Subject: [PATCH 5/5] +FEMAnalysis name --- src/libertem/analysis/__init__.py | 4 ++-- src/libertem/analysis/fem.py | 2 +- src/libertem/web/jobs.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libertem/analysis/__init__.py b/src/libertem/analysis/__init__.py index 81330397ae..798a64cf2c 100644 --- a/src/libertem/analysis/__init__.py +++ b/src/libertem/analysis/__init__.py @@ -6,7 +6,7 @@ from .point import PointMaskAnalysis from .masks import MasksAnalysis from .raw import PickFrameAnalysis -from .fem import ApplyFEM +from .fem import FEMAnalysis __all__ = [ 'SumAnalysis', @@ -17,5 +17,5 @@ 'PointMaskAnalysis', 'MasksAnalysis', 'PickFrameAnalysis', - 'ApplyFEM', + 'FEMAnalysis', ] diff --git a/src/libertem/analysis/fem.py b/src/libertem/analysis/fem.py index 3b6137ebe0..7c05cdf6e9 100644 --- a/src/libertem/analysis/fem.py +++ b/src/libertem/analysis/fem.py @@ -5,7 +5,7 @@ import libertem.udf.FEM as FEM -class ApplyFEM(BaseAnalysis): +class FEMAnalysis(BaseAnalysis): TYPE = "UDF" def get_udf(self): diff --git a/src/libertem/web/jobs.py b/src/libertem/web/jobs.py index 81edd7c458..62beec6898 100644 --- a/src/libertem/web/jobs.py +++ b/src/libertem/web/jobs.py @@ -6,7 +6,7 @@ from libertem.analysis import ( DiskMaskAnalysis, RingMaskAnalysis, PointMaskAnalysis, - COMAnalysis, SumAnalysis, PickFrameAnalysis, RadialFourierAnalysis, ApplyFEM + COMAnalysis, SumAnalysis, PickFrameAnalysis, RadialFourierAnalysis, FEMAnalysis ) from .base import CORSMixin, run_blocking, log_message, result_images from .messages import Message @@ -30,7 +30,7 @@ def get_analysis_by_type(self, type_): "RADIAL_FOURIER": RadialFourierAnalysis, "SUM_FRAMES": SumAnalysis, "PICK_FRAME": PickFrameAnalysis, - "FEM": ApplyFEM, + "FEM": FEMAnalysis, } return analysis_by_type[type_]