beamline staff changes as of 261020
No files matched your search
@@ -0,0 +1,605 @@
|
||||
[BECDockArea]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=false
|
||||
baseSize=@Size(0 0)
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 23 1142 746)
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimumSize=@Size(0 0)
|
||||
mode=creator
|
||||
mouseTracking=false
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=BEC - DailySetup
|
||||
workspace_is_locked=false
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Info.dockWidgetScrollArea.qt_scrollarea_viewport.Info]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
baseSize=@Size(0 0)
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 408 667)
|
||||
html_text="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\np, li { white-space: pre-wrap; }\nhr { height: 1px; border-width: 0; }\nli.unchecked::marker { content: \"\\2610\"; }\nli.checked::marker { content: \"\\2612\"; }\n</style></head><body style=\" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;\">\n<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p></body></html>"
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimumSize=@Size(0 0)
|
||||
mouseTracking=false
|
||||
plain_text=
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Progress.dockWidgetScrollArea.qt_scrollarea_viewport.Progress]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
baseSize=@Size(0 0)
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 201 667)
|
||||
html_text="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\np, li { white-space: pre-wrap; }\nhr { height: 1px; border-width: 0; }\nli.unchecked::marker { content: \"\\2610\"; }\nli.checked::marker { content: \"\\2612\"; }\n</style></head><body style=\" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;\">\n<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p></body></html>"
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimumSize=@Size(0 0)
|
||||
mouseTracking=false
|
||||
plain_text=
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_1.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_1]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
auto_range_x=true
|
||||
auto_range_y=true
|
||||
baseSize=@Size(0 0)
|
||||
color_palette=plasma
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
curve_json=[]
|
||||
enable_fps_monitor=false
|
||||
enable_popups=true
|
||||
enable_side_panel=false
|
||||
enable_toolbar=true
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 242 194)
|
||||
inner_axes=true
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
invert_x=false
|
||||
invert_y=false
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
legend_label_size=9
|
||||
lock_aspect_ratio=false
|
||||
max_dataset_size_mb=10
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimal_crosshair_precision=3
|
||||
minimumSize=@Size(0 0)
|
||||
mouseTracking=false
|
||||
outer_axes=false
|
||||
signal_x=
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
skip_large_dataset_check=false
|
||||
skip_large_dataset_warning=false
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
title=
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
x_grid=false
|
||||
x_label=
|
||||
x_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
x_log=false
|
||||
x_mode=auto
|
||||
y_grid=false
|
||||
y_label=
|
||||
y_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
y_log=false
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_2.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_2]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
auto_range_x=true
|
||||
auto_range_y=true
|
||||
baseSize=@Size(0 0)
|
||||
color_palette=plasma
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
curve_json=[]
|
||||
enable_fps_monitor=false
|
||||
enable_popups=true
|
||||
enable_side_panel=false
|
||||
enable_toolbar=true
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 243 194)
|
||||
inner_axes=true
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
invert_x=false
|
||||
invert_y=false
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
legend_label_size=9
|
||||
lock_aspect_ratio=false
|
||||
max_dataset_size_mb=10
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimal_crosshair_precision=3
|
||||
minimumSize=@Size(0 0)
|
||||
mouseTracking=false
|
||||
outer_axes=false
|
||||
signal_x=
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
skip_large_dataset_check=false
|
||||
skip_large_dataset_warning=false
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
title=
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
x_grid=false
|
||||
x_label=
|
||||
x_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
x_log=false
|
||||
x_mode=auto
|
||||
y_grid=false
|
||||
y_label=
|
||||
y_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
y_log=false
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_3.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_3]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
auto_range_x=true
|
||||
auto_range_y=true
|
||||
baseSize=@Size(0 0)
|
||||
color_palette=plasma
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
curve_json=[]
|
||||
enable_fps_monitor=false
|
||||
enable_popups=true
|
||||
enable_side_panel=false
|
||||
enable_toolbar=true
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 242 193)
|
||||
inner_axes=true
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
invert_x=false
|
||||
invert_y=false
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
legend_label_size=9
|
||||
lock_aspect_ratio=false
|
||||
max_dataset_size_mb=10
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimal_crosshair_precision=3
|
||||
minimumSize=@Size(0 0)
|
||||
mouseTracking=false
|
||||
outer_axes=false
|
||||
signal_x=
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
skip_large_dataset_check=false
|
||||
skip_large_dataset_warning=false
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
title=
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
x_grid=false
|
||||
x_label=
|
||||
x_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
x_log=false
|
||||
x_mode=auto
|
||||
y_grid=false
|
||||
y_label=
|
||||
y_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
y_log=false
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_4.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_4]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
auto_range_x=true
|
||||
auto_range_y=true
|
||||
baseSize=@Size(0 0)
|
||||
color_palette=plasma
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
curve_json=[]
|
||||
enable_fps_monitor=false
|
||||
enable_popups=true
|
||||
enable_side_panel=false
|
||||
enable_toolbar=true
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 243 193)
|
||||
inner_axes=true
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
invert_x=false
|
||||
invert_y=false
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
legend_label_size=9
|
||||
lock_aspect_ratio=false
|
||||
max_dataset_size_mb=10
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimal_crosshair_precision=3
|
||||
minimumSize=@Size(0 0)
|
||||
mouseTracking=false
|
||||
outer_axes=false
|
||||
signal_x=
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
skip_large_dataset_check=false
|
||||
skip_large_dataset_warning=false
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
title=
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
x_grid=false
|
||||
x_label=
|
||||
x_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
x_log=false
|
||||
x_mode=auto
|
||||
y_grid=false
|
||||
y_label=
|
||||
y_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
y_log=false
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_5.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_5]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
auto_range_x=true
|
||||
auto_range_y=true
|
||||
baseSize=@Size(0 0)
|
||||
color_palette=plasma
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
curve_json=[]
|
||||
enable_fps_monitor=false
|
||||
enable_popups=true
|
||||
enable_side_panel=false
|
||||
enable_toolbar=true
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 242 194)
|
||||
inner_axes=true
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
invert_x=false
|
||||
invert_y=false
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
legend_label_size=9
|
||||
lock_aspect_ratio=false
|
||||
max_dataset_size_mb=10
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimal_crosshair_precision=3
|
||||
minimumSize=@Size(0 0)
|
||||
mouseTracking=false
|
||||
outer_axes=false
|
||||
signal_x=
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
skip_large_dataset_check=false
|
||||
skip_large_dataset_warning=false
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
title=
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
x_grid=false
|
||||
x_label=
|
||||
x_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
x_log=false
|
||||
x_mode=auto
|
||||
y_grid=false
|
||||
y_label=
|
||||
y_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
y_log=false
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_6.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_6]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
auto_range_x=true
|
||||
auto_range_y=true
|
||||
baseSize=@Size(0 0)
|
||||
color_palette=plasma
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
curve_json=[]
|
||||
enable_fps_monitor=false
|
||||
enable_popups=true
|
||||
enable_side_panel=false
|
||||
enable_toolbar=true
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 243 194)
|
||||
inner_axes=true
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
invert_x=false
|
||||
invert_y=false
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
legend_label_size=9
|
||||
lock_aspect_ratio=false
|
||||
max_dataset_size_mb=10
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimal_crosshair_precision=3
|
||||
minimumSize=@Size(0 0)
|
||||
mouseTracking=false
|
||||
outer_axes=false
|
||||
signal_x=
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
skip_large_dataset_check=false
|
||||
skip_large_dataset_warning=false
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
title=
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
x_grid=false
|
||||
x_label=
|
||||
x_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
x_log=false
|
||||
x_mode=auto
|
||||
y_grid=false
|
||||
y_label=
|
||||
y_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
y_log=false
|
||||
|
||||
[BECDockArea.dockSettingsAction]
|
||||
autoRepeat=true
|
||||
checkable=false
|
||||
checked=false
|
||||
enabled=true
|
||||
iconText=Dock settings
|
||||
iconVisibleInMenu=true
|
||||
menuRole=@Variant(\0\0\0\x7f\0\0\0\x12QAction::MenuRole\0\0\0\0\x1)
|
||||
priority=@Variant(\0\0\0\x7f\0\0\0\x12QAction::Priority\0\0\0\0\x80)
|
||||
shortcut=
|
||||
shortcutContext=@Variant(\0\0\0\x7f\0\0\0\x14Qt::ShortcutContext\0\0\0\0\x1)
|
||||
shortcutVisibleInContextMenu=true
|
||||
statusTip=
|
||||
text=Dock settings
|
||||
toolTip=Dock settings
|
||||
whatsThis=
|
||||
|
||||
[Perspectives]
|
||||
1\Name=BEC - DailySetup
|
||||
1\State="@ByteArray(\0\0\x3\xd3x\xda\xa5\x93_K\xc3\x30\x14\xc5\xdf\xfd\x14\x97\xbc\xcf\xaei6'\xb4\x1d\xa3\x32\xf0\xc5?l\xd3G\xa9\xed\xb5\x4\xdb\x44\x92l\xa8\xf8\xe1M\xdaQDS\xa1\xec)\xc9\xb9'\xbf{r!\xf1\xf2\xbd\xa9\xe1\x80Js)\x12\x12\x9eO\t\xa0(d\xc9\x45\x95\x90\xddv=Y\x90\x65\x1a\xdf\x9bUy\xc8\x45\x81\xe5\x95,^mm\xf3\xa1\r6\xf0\xd0_$\xb0\xd3\xa8\xfa\xb3\xc5\x64R\x98\x9c\v\xab\xb8r\x1a\xf7gX\xd7\x32\x37m\x83\xa9\xd5\x37o57\xc6\xca\xb7\x8a\xa3\xb5\x98\x16\xf0\xe5\0{a\x12\xc2\xacg\xa5\x30\x87m\xfe\xdc\xa2 \xdb+\x85\xaet\xa7\x64\xa5Pk\xebx\xe4\x65\x85\x6n\xf2\x6\x7f\xe8\x90\xd5Rc\xe9\x1a\x5i\x1c\x38\xcc \xecZ\xbc\xc8\xdf\xa0V\xf3\x42\xfc\xa9'}\xea\xe8\x9f\xd4\xb5\x34O\xe1\x9f\xcc\x9d:&q{%\xf2\x82\xa2\xf1\xa0\x99\x17\x34\x1bx>\xff\x44\x9dRz\t\x94.\xc0\xadq\xd0iv=\x8e\xe6\xf4!Qo$:\xfem\xcc\vb\xe3\x41s/h~\xd2\x90:\xd7\xf4\x2X\xc8\x80\x32\xeb\x64~g\xd0\x7f!\xbb\x1f\xf8\x92\xe9\xd9\x37,-7\xa6)"
|
||||
size=1
|
||||
|
||||
[mainWindow]
|
||||
DockingState="@ByteArray(\0\0\x3\xd3x\xda\xa5\x93_K\xc3\x30\x14\xc5\xdf\xfd\x14\x97\xbc\xcf\xaei6'\xb4\x1d\xa3\x32\xf0\xc5?l\xd3G\xa9\xed\xb5\x4\xdb\x44\x92l\xa8\xf8\xe1M\xdaQDS\xa1\xec)\xc9\xb9'\xbf{r!\xf1\xf2\xbd\xa9\xe1\x80Js)\x12\x12\x9eO\t\xa0(d\xc9\x45\x95\x90\xddv=Y\x90\x65\x1a\xdf\x9bUy\xc8\x45\x81\xe5\x95,^mm\xf3\xa1\r6\xf0\xd0_$\xb0\xd3\xa8\xfa\xb3\xc5\x64R\x98\x9c\v\xab\xb8r\x1a\xf7gX\xd7\x32\x37m\x83\xa9\xd5\x37o57\xc6\xca\xb7\x8a\xa3\xb5\x98\x16\xf0\xe5\0{a\x12\xc2\xacg\xa5\x30\x87m\xfe\xdc\xa2 \xdb+\x85\xaet\xa7\x64\xa5Pk\xebx\xe4\x65\x85\x6n\xf2\x6\x7f\xe8\x90\xd5Rc\xe9\x1a\x5i\x1c\x38\xcc \xecZ\xbc\xc8\xdf\xa0V\xf3\x42\xfc\xa9'}\xea\xe8\x9f\xd4\xb5\x34O\xe1\x9f\xcc\x9d:&q{%\xf2\x82\xa2\xf1\xa0\x99\x17\x34\x1bx>\xff\x44\x9dRz\t\x94.\xc0\xadq\xd0iv=\x8e\xe6\xf4!Qo$:\xfem\xcc\vb\xe3\x41s/h~\xd2\x90:\xd7\xf4\x2X\xc8\x80\x32\xeb\x64~g\xd0\x7f!\xbb\x1f\xf8\x92\xe9\xd9\x37,-7\xa6)"
|
||||
Geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x17\0\0\x4u\0\0\x3\0\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\xf\0\0\0\0\0\0\0\0\x17\0\0\x4u\0\0\x3\0)
|
||||
State=@Variant(\0\0\0\x7f\0\0\0\x18PySide::PyObjectWrapper\0\0\0\0\xf\x80\x4\x95\x4\0\0\0\0\0\0\0\x43\0\x94.)
|
||||
|
||||
[manifest]
|
||||
widgets\1\closable=true
|
||||
widgets\1\floatable=true
|
||||
widgets\1\floating=false
|
||||
widgets\1\floating_abs_h=0
|
||||
widgets\1\floating_abs_w=0
|
||||
widgets\1\floating_abs_x=0
|
||||
widgets\1\floating_abs_y=0
|
||||
widgets\1\floating_rel_h=0
|
||||
widgets\1\floating_rel_w=0
|
||||
widgets\1\floating_rel_x=0
|
||||
widgets\1\floating_rel_y=0
|
||||
widgets\1\floating_screen=
|
||||
widgets\1\movable=true
|
||||
widgets\1\object_name=Info
|
||||
widgets\1\widget_class=TextBox
|
||||
widgets\2\closable=true
|
||||
widgets\2\floatable=true
|
||||
widgets\2\floating=false
|
||||
widgets\2\floating_abs_h=0
|
||||
widgets\2\floating_abs_w=0
|
||||
widgets\2\floating_abs_x=0
|
||||
widgets\2\floating_abs_y=0
|
||||
widgets\2\floating_rel_h=0
|
||||
widgets\2\floating_rel_w=0
|
||||
widgets\2\floating_rel_x=0
|
||||
widgets\2\floating_rel_y=0
|
||||
widgets\2\floating_screen=
|
||||
widgets\2\movable=true
|
||||
widgets\2\object_name=Plot_1
|
||||
widgets\2\widget_class=Waveform
|
||||
widgets\3\closable=true
|
||||
widgets\3\floatable=true
|
||||
widgets\3\floating=false
|
||||
widgets\3\floating_abs_h=0
|
||||
widgets\3\floating_abs_w=0
|
||||
widgets\3\floating_abs_x=0
|
||||
widgets\3\floating_abs_y=0
|
||||
widgets\3\floating_rel_h=0
|
||||
widgets\3\floating_rel_w=0
|
||||
widgets\3\floating_rel_x=0
|
||||
widgets\3\floating_rel_y=0
|
||||
widgets\3\floating_screen=
|
||||
widgets\3\movable=true
|
||||
widgets\3\object_name=Plot_2
|
||||
widgets\3\widget_class=Waveform
|
||||
widgets\4\closable=true
|
||||
widgets\4\floatable=true
|
||||
widgets\4\floating=false
|
||||
widgets\4\floating_abs_h=0
|
||||
widgets\4\floating_abs_w=0
|
||||
widgets\4\floating_abs_x=0
|
||||
widgets\4\floating_abs_y=0
|
||||
widgets\4\floating_rel_h=0
|
||||
widgets\4\floating_rel_w=0
|
||||
widgets\4\floating_rel_x=0
|
||||
widgets\4\floating_rel_y=0
|
||||
widgets\4\floating_screen=
|
||||
widgets\4\movable=true
|
||||
widgets\4\object_name=Plot_3
|
||||
widgets\4\widget_class=Waveform
|
||||
widgets\5\closable=true
|
||||
widgets\5\floatable=true
|
||||
widgets\5\floating=false
|
||||
widgets\5\floating_abs_h=0
|
||||
widgets\5\floating_abs_w=0
|
||||
widgets\5\floating_abs_x=0
|
||||
widgets\5\floating_abs_y=0
|
||||
widgets\5\floating_rel_h=0
|
||||
widgets\5\floating_rel_w=0
|
||||
widgets\5\floating_rel_x=0
|
||||
widgets\5\floating_rel_y=0
|
||||
widgets\5\floating_screen=
|
||||
widgets\5\movable=true
|
||||
widgets\5\object_name=Plot_4
|
||||
widgets\5\widget_class=Waveform
|
||||
widgets\6\closable=true
|
||||
widgets\6\floatable=true
|
||||
widgets\6\floating=false
|
||||
widgets\6\floating_abs_h=0
|
||||
widgets\6\floating_abs_w=0
|
||||
widgets\6\floating_abs_x=0
|
||||
widgets\6\floating_abs_y=0
|
||||
widgets\6\floating_rel_h=0
|
||||
widgets\6\floating_rel_w=0
|
||||
widgets\6\floating_rel_x=0
|
||||
widgets\6\floating_rel_y=0
|
||||
widgets\6\floating_screen=
|
||||
widgets\6\movable=true
|
||||
widgets\6\object_name=Plot_5
|
||||
widgets\6\widget_class=Waveform
|
||||
widgets\7\closable=true
|
||||
widgets\7\floatable=true
|
||||
widgets\7\floating=false
|
||||
widgets\7\floating_abs_h=0
|
||||
widgets\7\floating_abs_w=0
|
||||
widgets\7\floating_abs_x=0
|
||||
widgets\7\floating_abs_y=0
|
||||
widgets\7\floating_rel_h=0
|
||||
widgets\7\floating_rel_w=0
|
||||
widgets\7\floating_rel_x=0
|
||||
widgets\7\floating_rel_y=0
|
||||
widgets\7\floating_screen=
|
||||
widgets\7\movable=true
|
||||
widgets\7\object_name=Plot_6
|
||||
widgets\7\widget_class=Waveform
|
||||
widgets\8\closable=true
|
||||
widgets\8\floatable=true
|
||||
widgets\8\floating=false
|
||||
widgets\8\floating_abs_h=0
|
||||
widgets\8\floating_abs_w=0
|
||||
widgets\8\floating_abs_x=0
|
||||
widgets\8\floating_abs_y=0
|
||||
widgets\8\floating_rel_h=0
|
||||
widgets\8\floating_rel_w=0
|
||||
widgets\8\floating_rel_x=0
|
||||
widgets\8\floating_rel_y=0
|
||||
widgets\8\floating_screen=
|
||||
widgets\8\movable=true
|
||||
widgets\8\object_name=Progress
|
||||
widgets\8\widget_class=TextBox
|
||||
widgets\size=8
|
||||
|
||||
[profile]
|
||||
created_at=2026-10-10T16:30:18Z
|
||||
quick_select=true
|
||||
screenshot="@ByteArray(\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x4v\0\0\x2\xea\b\x6\0\0\0PE\xd3\x82\0\0\0\tpHYs\0\0\xe\xc4\0\0\xe\xc4\x1\x95+\xe\x1b\0\0 \0IDATx\x9c\xec\xddwT\x14W\x1b\xc0\xe1\xdfR\xa5\vbA\xb0\xb7\xa8\xd8\xc1\xde{\x8b\x5\x5{Kl\xb1\x63\x8b\xbd\xf7\xde{\x8d\r{\x8f\xc6h\xa2\x31\x89\x1a\x89\xbd\x97\xd8\xc5^@@`\xd9\xfd\xfe\xe0\x63#\xa1,e\x97\x65\xe1}\xce\xf1\x1c\x99\x99\x9d{\xe1\xce;\xe5\xdd{\xef(BB#\xd4\b!\x84\x10\x42\b!\x84\x10\x42\b\xa3\x63\x62\xe8\n\b!\x84\x10\x42\b!\x84\x10\x42\x88\xe4\x91\xc4\x8e\x10\x42\b!\x84\x10\x42\b!\x84\x91\x92\xc4\x8e\x10\x42\b!\x84\x10\x42\b!\x84\x91\x92\xc4N\x1a\xf2\xe4\xf9k\x9e<\x7fm\xe8j\b\x91hr\xcc\x1a'i\xb7\x8cK\xda^\x88\xb8Il\b!\xd2\"97\x89\xc4\x92\xc4\x8e\x10\x42\b!\x84\x10\x42\b!\x84\x91\x92\xc4\x8e\x10\x42\b!\x84\x10\x42\b!\x84\x91\x32\x33t\x5\x84\x10\x42\b!\x84\x30\x16\xc1\xc1\x9f\t\xfc\x14\x8c\x32Re\xe8\xaa\b\x91,\x16\x16\xe6\x64\xb2\xb4\xc0\xc1\xce\xda\xd0U\x11\x42\xe8\x88$v\x84\x10\x42\b!\x84H\x84\x80W\xef\xb0\xb2\x30'\xb7[V\xccL\xa5\xe3\xbb\x30Naa\x11|\f\f\xe5\xe9\xf3\x37\xb8\xe5t6tu\x84H\x91'\xcf_\x93+gVCW\xc3\xe0$\xb1#\x84\x10\x42\b!\x84\x16\xc1\xc1\x9f\xc9\x64i\x8eKvGCWE\x88\x14\xb1\xb4\x34'[VsL\xcd 8$\f\x1bkKCWI\b\x91\x42\xf2U\x83\x10\x42\b!\x84\x10Z\x4~\n&\x9b\xb3\x83\xa1\xab!2\x80;\xff\x4\xa4J9\xe\xf6\x36|\f\fN\x95\xb2\x84\x10\xfa%\x89\x1d!\x84\x10\x42\b!\xb4PF\xaa\x64\xf8\x95HW\xccLM\x89TE\x1a\xba\x1a\x42\b\x1d\x90\xab\x93\x10\x42\b!\x84\x10\x42\b\x91\xce\xa8\xd5j\xd4ju\xaa}N\x18\x8e\xcc\xb1#\x84\x10\x42\b!\x84\x10\"N~\xdbwq\xde\xff\x42\xa2\xb7\xafT\xd1\x93\xd6\xadZ\xea\xb1\x46\"1\xd4j5s\xe7-B\xadV3t\xc8@T*\x15\xc3G\x8c\xc5\xbbuK*V\xf0\x8c\xb1\xed\xd9s\xe7\xd9\xb9k/3\xa6M\xc2\xcc\xcc\x94\x99\xb3\xe6\x11\x16\x1e\xc6\xb8\x31#Q(\x14:\xad\xd3\xc2\xc5\xcby\xf2\xe4i\x8c\xe5\xb9r\xb9\x31\xb0\xffw:-+\xa3\x91\xc4\x8e\x10\x42\b!\x84\x10\x42\x88\x38\x9d\xf7\xbf\xc0\xa1\xc3G(T\xb0\x80\xd6m?}\xfa\xc4\xae\xdd{\t\r\xf9L\xa7N\xed\xf4R\x9f;\xb7\xefr\xe2\xe4)\xbe\xeb\xd5]/\xfb\xd7\xe6\xd1\xa3'l\xdf\xb1\x8b\x97\xaf^S\xbcXQ\xda\xb7\xf3&S\xa6L\x6\xa9Kb,Y\xb6\x12\xb5Z\x8d\xef\xa0\xfe\xec\xda\xbd\x17O\x8f\xb2\xb1\x12;\xf\x1f>b\xd7\xee\xbdL\x9d<\x8ey\xf3\x17\xb1|\xe5\x1a\xfa~\xd7S\xe7uY\xb4\x64\x5\xf3\x17,\xa6X\xd1\xaf\x30\x35\x35\x5@\xa5R\xb1k\xf7\xde\xa8:\xe\xec\xab\xf3\x32S\x9bR\x19\x89J\x15\x89\x85\x85\x45\xaa\x96+\x89\x1d!\x84\x10\x42\b!\x84\x10\xf1*T\xb0\0\a\xf6\xed\xe0\xed\xdb\xb7\xf1ncoo\x8f\xa9\xa9\x19\x43\x86\x8e`\xcc\xf8I\0:O\xee\xdc\xb9}\x97\x36\x1d\xba\xe2\x9c\x35\v]:u\xc0\xda\xdaJ\xa7\xfb\xd7\xe6\xda\xf5\x1b\xb4\xf2\xee@&KK\xdc\xdc\\\xd9\xb7\xff\0\xbb\xf7\xec\x63\xef\x1e?,\xcc\xcdS\xb5.\xda(\x14\n\x86\f\x1e\0\xc0\xe2\xa5+\x88P*\xb5~f\xce\xdc\x85\xac^\xbb\x81~}z1t\xc8\xc0\x14\xf5\xa0\xd9\xb5{/k\xd6m\xd4\xfc\xacV\xc3\xad[\xb7\x19\xd0\xaf\x37\x43\x6\xf\x8c\xb1\xed\xbc\xf9\x8bX\xb0p\tG~:\x86\xc9\x17\x65v\xeb\xda\x99\x36\xde^\xc9\xae\x43j\x89\x88P\xb2r\xf5Zv\xed\xda\xcb\xc3G\x8fY\xbbj\x19u\xea\xd4L\xd5:\x18l\x8e\x9d\xc7\x8f\x1f\x93'\x7fQ\x1e?~\x9c\xac\xf5\t9p\xf0 \r\x1a\x36Ni\x15\xc5\xffU\xaeR\x83\xa3G\x8f&{\xbd\xd0\x8f\x62\xee\x65\xf8\xe5\x97_\f]\x8d\x34\xc9\xd0\xc7\xac\x9c\x83\x92N\xae\tB\b!D\xda\xf6\xf6\xed[<*T\x8f\xf7\xdf\x8fG~\xc2\xcc\xcc\x94\xb9sf\xd0\xa2YS\xc6\x8c\x9f\xc4\xae\xdd{uV\xfe\xed[w\xf0i\xdf\x5\xe7\xacY\xf0\xdb\xbc>\xd5\x93:\0\xb3\xe7.$\xa7K\xe~?\xf5\x33\x87\xf\xee\x66\xcb\xa6\xf5\\\xbb~\x83\xbd\xfb\xe\xa6z]\x12\x43\xa9\x8c\xa4_\xdf^\xf4\xec\xde\x8dU\xab\xd7i\xdd~\xf5\xda\r\xf4\xec\xde\x8d\xfe\xfdz\xa3T\xa6lb\xedw\xef\xdes\xfb\xf6]J\x95p\xa7T\twJ\x97t\xc7wP\x7f\x6\xfb\xe\x88\xb5\xad\xef\xa0\xfe\xf8\xe\xeaO\x99\x92%4\xdb\xdf\xbe}7\xc1\x44\x62Z\xf1\xe8\xd1\x13Zx\xb5\x61\xdf\xbe\x3\x14(\x90\x9f\n\xe5=R=\xa9\x3:\xee\xb1\x13\x12\x12\x42Q\xf7rX\x98\x9bq\xed\x8a?\x96\x96\x96\xba\xdc\xbd\xc6\xaaU\xab\x99:c\x1e\0\x36\xd6\x99\xa8X\xbe\x1cm\xdaxS\xaf^=LLd>\xe8\xc4\xe8\xdb\xb7?\x87\x8e\x1c\xe7\xa7\x1f\xf7\xf2\xd5W_\xe9\xa5\x8cs\xe7\xce\xe1\xd3\xae\xab\xe6\xe7\x12\xc5\x8bP\xa6tI\xbc\xbcZR\xa6L\x99\x14\xef\xff\xc8\xd1\xa3l\xdb\xb6\x9d\x35\xabW\xea\xb4\xab[dd$G\x8f\xfe\xc4o\xbf\xfd\xc6\xd9s\xe7\xb1\xb3\xb3\xa3|y\xf:\xb4oG\x81\x2\xda\xbb\xa0\n\xfdH\x8d\x63v\xf1\xe2%\xdc\xbd{\x8f\x45\x8b\x16\xc4X~\xfa\xf4\xeft\xec\xd2\x83\a\xf7\xae\xc7y\x8e\t\xfd\xfc\x99o\xbe\xe9N\x8f\xee\xdfP\xbbvm\xbd\xd4\xcd\x18\xa5\xd7k\xc2\xf4\xe9\x33\xc8\x94)\x13\xbe\xbe\x83t\xbeo!\x84\xf1\xf2\x1d<\x8c-~\xfb\0\x30\x35\x35\xa1\xa2giJ\x97*\x81\x8fOk\x8a\x16M\xfcuk\xc5\x8aU\\\xb9v\x9d\xa5\x8b\x17\xa0P(\xa8\xdf\xe0k\xda\xf8x\xf1\xed\xb7\xdd\xb4~622\x92\x13'~e\xc7\xce\xdd\xf8\xff}\x99,N\x99)W\xae\x34\xadZ\xb5\xa4\x42yO\xad\x9fW\xa9T\x4\x6\x6\x62mm\x9d\xea\xc3\btI\xa9\x8c\xa4g\xaf>\xd4\xa8^\x95.]:\x19\xba:\x19Ntr\xe7\xf2\x95\xab\x9c\x39{^'\xf3\xed\xdc\xbau\x9b\xb6\x1d\xba\xf1\xfe\xfd{\x9a\x34i\xc0\xa6\xcd\xdb\x62m\x93={v\xdc\xdd\x8b\xe1^\xbc\x98\xde\xe6j\xb9{\xe7\x1eM\x1a\x37\xc0\xce\xde\xe\x80\x8a\x15<\xc9\x91=;\xf7\xee\xde\xd3Ky)5b\xd4\xb8$'\xd7V\xadY\xcf\xaa\x35\xebi\xdd\xaa%sgOKQ\xf9\x66\x66\x66\xcc\x9c\x31\x45\xebv\n\x85\x82\x41\x3\xfa\xc4X\xb6'\x8d&\xcb\xbe\x14\x11\xa1\xa4O\xbf\x41\xe4\xca\xe5Line truncated
|
||||
screenshot_at=2026-10-10T20:20:15Z
|
||||
@@ -0,0 +1,457 @@
|
||||
[BECDockArea]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=false
|
||||
baseSize=@Size(0 0)
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 23 1670 1505)
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimumSize=@Size(0 0)
|
||||
mode=creator
|
||||
mouseTracking=false
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=BEC - TestLayout4
|
||||
workspace_is_locked=false
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Info.dockWidgetScrollArea.qt_scrollarea_viewport.Info]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
baseSize=@Size(0 0)
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 816 1426)
|
||||
html_text="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\np, li { white-space: pre-wrap; }\nhr { height: 1px; border-width: 0; }\nli.unchecked::marker { content: \"\\2610\"; }\nli.checked::marker { content: \"\\2612\"; }\n</style></head><body style=\" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;\">\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Starting daily beamline setup</p>\n<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ Machine current OK (401.8 mA)</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ Beamline is not offline, (operation mode is attended)</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ FE shutter is open</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ Hutch shutter is open</p>\n<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ SS Xray eye is OUT</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ Cryostream temperature: 99.96 K</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ Detector height: 62.0 mm</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ Beamstop blocking beam: I2 = 8.76e-09</p>\n<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ Beamline energy set to 12400 eV</p>\n<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ Beam aligned</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Displacement: Beam X: -0.1 microns, Beam Y: -0.3 microns</p>\n<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ Flux measured</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Intensity at current transmission: 8.62e+11 ph/s</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Intensity at 100% transmission: 8.53e+12 ph/s</p>\n<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Total duration: 39.7 s</p></body></html>"
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimumSize=@Size(640 310)
|
||||
mouseTracking=false
|
||||
plain_text="Starting daily beamline setup\n\n✓ Machine current OK (401.8 mA)\n✓ Beamline is not offline, (operation mode is attended)\n✓ FE shutter is open\n✓ Hutch shutter is open\n\n✓ SS Xray eye is OUT\n✓ Cryostream temperature: 99.96 K\n✓ Detector height: 62.0 mm\n✓ Beamstop blocking beam: I2 = 8.76e-09\n\n✓ Beamline energy set to 12400 eV\n\n✓ Beam aligned\nDisplacement: Beam X: -0.1 microns, Beam Y: -0.3 microns\n\n✓ Flux measured\nIntensity at current transmission: 8.62e+11 ph/s\nIntensity at 100% transmission: 8.53e+12 ph/s\n\nTotal duration: 39.7 s"
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_1.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_1]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
auto_range_x=true
|
||||
auto_range_y=false
|
||||
baseSize=@Size(0 0)
|
||||
color_palette=plasma
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
curve_json=[]
|
||||
enable_fps_monitor=false
|
||||
enable_popups=true
|
||||
enable_side_panel=false
|
||||
enable_toolbar=true
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 575 341)
|
||||
inner_axes=true
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
invert_x=false
|
||||
invert_y=false
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
legend_label_size=9
|
||||
lock_aspect_ratio=false
|
||||
max_dataset_size_mb=10
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimal_crosshair_precision=3
|
||||
minimumSize=@Size(384 200)
|
||||
mouseTracking=false
|
||||
outer_axes=false
|
||||
signal_x=dcm_pitch
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
skip_large_dataset_check=false
|
||||
skip_large_dataset_warning=false
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
title=Scan: Current
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
x_grid=false
|
||||
x_label=dcm_pitch
|
||||
x_limits=@Variant(\0\0\0\x1a\xc0\x1a\xb0\xb0)(\x17v\xc0\x15\xa0\xc4\x15n&N)
|
||||
x_log=false
|
||||
x_mode=dcm_pitch
|
||||
y_grid=false
|
||||
y_label=lu_bpmsum
|
||||
y_limits=@Variant(\0\0\0\x1a\xc0g\xe2\xe0\x3|_\x2@\x9d\xf0\x41\x91k\xed@)
|
||||
y_log=false
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_2.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_2]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
auto_range_x=true
|
||||
auto_range_y=true
|
||||
baseSize=@Size(0 0)
|
||||
color_palette=plasma
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
curve_json=[]
|
||||
enable_fps_monitor=false
|
||||
enable_popups=true
|
||||
enable_side_panel=false
|
||||
enable_toolbar=true
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 575 304)
|
||||
inner_axes=true
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
invert_x=false
|
||||
invert_y=false
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
legend_label_size=9
|
||||
lock_aspect_ratio=false
|
||||
max_dataset_size_mb=10
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimal_crosshair_precision=3
|
||||
minimumSize=@Size(384 200)
|
||||
mouseTracking=false
|
||||
outer_axes=false
|
||||
signal_x=
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
skip_large_dataset_check=false
|
||||
skip_large_dataset_warning=false
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
title=
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
x_grid=false
|
||||
x_label=
|
||||
x_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
x_log=false
|
||||
x_mode=auto
|
||||
y_grid=false
|
||||
y_label=
|
||||
y_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
y_log=false
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_3.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_3]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
auto_range_x=true
|
||||
auto_range_y=true
|
||||
baseSize=@Size(0 0)
|
||||
color_palette=plasma
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
curve_json=[]
|
||||
enable_fps_monitor=false
|
||||
enable_popups=true
|
||||
enable_side_panel=false
|
||||
enable_toolbar=true
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 575 358)
|
||||
inner_axes=true
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
invert_x=false
|
||||
invert_y=false
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
legend_label_size=9
|
||||
lock_aspect_ratio=false
|
||||
max_dataset_size_mb=10
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimal_crosshair_precision=3
|
||||
minimumSize=@Size(384 200)
|
||||
mouseTracking=false
|
||||
outer_axes=false
|
||||
signal_x=
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
skip_large_dataset_check=false
|
||||
skip_large_dataset_warning=false
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
title=
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
x_grid=false
|
||||
x_label=
|
||||
x_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
x_log=false
|
||||
x_mode=auto
|
||||
y_grid=false
|
||||
y_label=
|
||||
y_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
y_log=false
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Plot_4.dockWidgetScrollArea.qt_scrollarea_viewport.Plot_4]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
auto_range_x=true
|
||||
auto_range_y=true
|
||||
baseSize=@Size(0 0)
|
||||
color_palette=plasma
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
curve_json=[]
|
||||
enable_fps_monitor=false
|
||||
enable_popups=true
|
||||
enable_side_panel=false
|
||||
enable_toolbar=true
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 575 294)
|
||||
inner_axes=true
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
invert_x=false
|
||||
invert_y=false
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
legend_label_size=9
|
||||
lock_aspect_ratio=false
|
||||
max_dataset_size_mb=10
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimal_crosshair_precision=3
|
||||
minimumSize=@Size(384 200)
|
||||
mouseTracking=false
|
||||
outer_axes=false
|
||||
signal_x=
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
skip_large_dataset_check=false
|
||||
skip_large_dataset_warning=false
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
title=
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
x_grid=false
|
||||
x_label=
|
||||
x_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
x_log=false
|
||||
x_mode=auto
|
||||
y_grid=false
|
||||
y_label=
|
||||
y_limits=@Variant(\0\0\0\x1a\0\0\0\0\0\0\0\0?\xf0\0\0\0\0\0\0)
|
||||
y_log=false
|
||||
|
||||
[BECDockArea.ads%3A%3ACDockManager.ads%3A%3ACDockSplitter.ads%3A%3ACDockSplitter.ads%3A%3ACDockAreaWidget.Progress.dockWidgetScrollArea.qt_scrollarea_viewport.Progress]
|
||||
acceptDrops=false
|
||||
accessibleDescription=
|
||||
accessibleIdentifier=
|
||||
accessibleName=
|
||||
autoFillBackground=true
|
||||
baseSize=@Size(0 0)
|
||||
contextMenuPolicy=@Variant(\0\0\0\x7f\0\0\0\x16Qt::ContextMenuPolicy\0\0\0\0\x1)
|
||||
cursor=@Variant(\0\0\0J\0\0)
|
||||
enabled=true
|
||||
focusPolicy=@Variant(\0\0\0\x7f\0\0\0\x10Qt::FocusPolicy\0\0\0\0\0)
|
||||
geometry=@Rect(0 0 256 1416)
|
||||
html_text="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\np, li { white-space: pre-wrap; }\nhr { height: 1px; border-width: 0; }\nli.unchecked::marker { content: \"\\2610\"; }\nli.checked::marker { content: \"\\2612\"; }\n</style></head><body style=\" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;\">\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ Pre checks</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ Set energy</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ Move beam</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">– Align beamstop</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">– Align collimator</p>\n<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">✓ Measure flux</p></body></html>"
|
||||
inputMethodHints=@Variant(\0\0\0\x7f\0\0\0\x14Qt::InputMethodHint\0\0\0\0\0)
|
||||
layoutDirection=@Variant(\0\0\0\x7f\0\0\0\x14Qt::LayoutDirection\0\0\0\0\0)
|
||||
maximumSize=@Size(16777215 16777215)
|
||||
minimumSize=@Size(256 310)
|
||||
mouseTracking=false
|
||||
plain_text=✓ Pre checks\n✓ Set energy\n✓ Move beam\n– Align beamstop\n– Align collimator\n✓ Measure flux
|
||||
sizeIncrement=@Size(0 0)
|
||||
sizePolicy=@Variant(\0\0\0K\0\0\0U)
|
||||
statusTip=
|
||||
tabletTracking=false
|
||||
toolTip=
|
||||
toolTipDuration=-1
|
||||
whatsThis=
|
||||
windowFilePath=
|
||||
windowModality=@Variant(\0\0\0\x7f\0\0\0\x13Qt::WindowModality\0\0\0\0\0)
|
||||
windowModified=false
|
||||
windowOpacity=1
|
||||
windowTitle=
|
||||
|
||||
[BECDockArea.dockSettingsAction]
|
||||
autoRepeat=true
|
||||
checkable=false
|
||||
checked=false
|
||||
enabled=true
|
||||
iconText=Dock settings
|
||||
iconVisibleInMenu=true
|
||||
menuRole=@Variant(\0\0\0\x7f\0\0\0\x12QAction::MenuRole\0\0\0\0\x1)
|
||||
priority=@Variant(\0\0\0\x7f\0\0\0\x12QAction::Priority\0\0\0\0\x80)
|
||||
shortcut=
|
||||
shortcutContext=@Variant(\0\0\0\x7f\0\0\0\x14Qt::ShortcutContext\0\0\0\0\x1)
|
||||
shortcutVisibleInContextMenu=true
|
||||
statusTip=
|
||||
text=Dock settings
|
||||
toolTip=Dock settings
|
||||
whatsThis=
|
||||
|
||||
[Perspectives]
|
||||
1\Name=BEC - TestLayout4
|
||||
1\State="@ByteArray(\0\0\x3:x\xda\x95\x92\xdfO\x83\x30\x10\xc7\xdf\xfd+.}\x9f@\xcb\x94%\xc0\xb2`\x96\xf8\xe2\x8f\xb0\xe9\xa3\x41\x38I#\xb4\xa6\xed\x16\x35\xfe\xf1\x16\xb6\x10\xa3\x65\x91\x87\xa6\xbd\xef]?\xed\xf7r\xf1\xf2\xbdm`\x8fJs)\x12\x12\x9c\xfb\x4P\x94\xb2\xe2\xa2N\xc8v\xb3\x9e\x45\x64\x99\xc6\xf7\x66U\xed\vQbu%\xcbW\x9b\xcb?\xb4\xc1\x16\x1e\x86\x8b\x4\xb6\x1a\xd5\x10[L&\x85)\xb8\xb0J\x97N\xe3!\x86u#\v\xd3?\xe0[=\x7fk\xb8\x31V\xbeU\x1cm\x89\xe9\x1_\x1d`'LB\xe8?kV\n\v\xd8\x14\xcf\xfds\x90\xed\x94\xc2.u\xa7\x64\xadPk[\xf1\xc8\xab\x1a\r\xdc\x14-\xfe\xd0!k\xa4\xc6\xaa\xfb\x8c\x97\xc6^\x87\x19\x85]\x8b\x17\xf9\x1b\xd4kNH\xce?Q\xa7t\x1e@D)\xc4\xde!\xb6\xfb\xd1\xcd\x98\xaf\xd9\xe0+<\xe1\xab\x91\xe6)\xf8\xe3\xea\xa0N\xf1\xd4_\xa1N\x10\x9d\xe\x62N\x10\x9b\xe\n\x9d\xa0\xf0T\xa7\xd9\xe5\x5\x30\xb6\0\xb6`\xc0\xe8\xc2\xdd\xf1^\t\xfc(\x80\xb9]\xae\x12o\x98T{\x1e\x99\xfc\xf4\xec\x1b\xd0\xbb\tD)"
|
||||
size=1
|
||||
|
||||
[mainWindow]
|
||||
DockingState="@ByteArray(\0\0\x3:x\xda\x95\x92\xdfO\x83\x30\x10\xc7\xdf\xfd+.}\x9f@\xcb\x94%\xc0\xb2`\x96\xf8\xe2\x8f\xb0\xe9\xa3\x41\x38I#\xb4\xa6\xed\x16\x35\xfe\xf1\x16\xb6\x10\xa3\x65\x91\x87\xa6\xbd\xef]?\xed\xf7r\xf1\xf2\xbdm`\x8fJs)\x12\x12\x9c\xfb\x4P\x94\xb2\xe2\xa2N\xc8v\xb3\x9e\x45\x64\x99\xc6\xf7\x66U\xed\vQbu%\xcbW\x9b\xcb?\xb4\xc1\x16\x1e\x86\x8b\x4\xb6\x1a\xd5\x10[L&\x85)\xb8\xb0J\x97N\xe3!\x86u#\v\xd3?\xe0[=\x7fk\xb8\x31V\xbeU\x1cm\x89\xe9\x1_\x1d`'LB\xe8?kV\n\v\xd8\x14\xcf\xfds\x90\xed\x94\xc2.u\xa7\x64\xadPk[\xf1\xc8\xab\x1a\r\xdc\x14-\xfe\xd0!k\xa4\xc6\xaa\xfb\x8c\x97\xc6^\x87\x19\x85]\x8b\x17\xf9\x1b\xd4kNH\xce?Q\xa7t\x1e@D)\xc4\xde!\xb6\xfb\xd1\xcd\x98\xaf\xd9\xe0+<\xe1\xab\x91\xe6)\xf8\xe3\xea\xa0N\xf1\xd4_\xa1N\x10\x9d\xe\x62N\x10\x9b\xe\n\x9d\xa0\xf0T\xa7\xd9\xe5\x5\x30\xb6\0\xb6`\xc0\xe8\xc2\xdd\xf1^\t\xfc(\x80\xb9]\xae\x12o\x98T{\x1e\x99\xfc\xf4\xec\x1b\xd0\xbb\tD)"
|
||||
Geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\0\0\0\0\x17\0\0\x6\x85\0\0\x5\xf7\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\xf\0\0\0\0\0\0\0\0\x17\0\0\x6\x85\0\0\x5\xf7)
|
||||
State=@Variant(\0\0\0\x7f\0\0\0\tPyObject\0\0\0\0\xf\x80\x4\x95\x4\0\0\0\0\0\0\0\x43\0\x94.)
|
||||
|
||||
[manifest]
|
||||
widgets\1\closable=true
|
||||
widgets\1\floatable=true
|
||||
widgets\1\floating=false
|
||||
widgets\1\floating_abs_h=0
|
||||
widgets\1\floating_abs_w=0
|
||||
widgets\1\floating_abs_x=0
|
||||
widgets\1\floating_abs_y=0
|
||||
widgets\1\floating_rel_h=0
|
||||
widgets\1\floating_rel_w=0
|
||||
widgets\1\floating_rel_x=0
|
||||
widgets\1\floating_rel_y=0
|
||||
widgets\1\floating_screen=
|
||||
widgets\1\movable=true
|
||||
widgets\1\object_name=Info
|
||||
widgets\1\widget_class=TextBox
|
||||
widgets\2\closable=true
|
||||
widgets\2\floatable=true
|
||||
widgets\2\floating=false
|
||||
widgets\2\floating_abs_h=0
|
||||
widgets\2\floating_abs_w=0
|
||||
widgets\2\floating_abs_x=0
|
||||
widgets\2\floating_abs_y=0
|
||||
widgets\2\floating_rel_h=0
|
||||
widgets\2\floating_rel_w=0
|
||||
widgets\2\floating_rel_x=0
|
||||
widgets\2\floating_rel_y=0
|
||||
widgets\2\floating_screen=
|
||||
widgets\2\movable=true
|
||||
widgets\2\object_name=Plot_1
|
||||
widgets\2\widget_class=Waveform
|
||||
widgets\3\closable=true
|
||||
widgets\3\floatable=true
|
||||
widgets\3\floating=false
|
||||
widgets\3\floating_abs_h=0
|
||||
widgets\3\floating_abs_w=0
|
||||
widgets\3\floating_abs_x=0
|
||||
widgets\3\floating_abs_y=0
|
||||
widgets\3\floating_rel_h=0
|
||||
widgets\3\floating_rel_w=0
|
||||
widgets\3\floating_rel_x=0
|
||||
widgets\3\floating_rel_y=0
|
||||
widgets\3\floating_screen=
|
||||
widgets\3\movable=true
|
||||
widgets\3\object_name=Plot_2
|
||||
widgets\3\widget_class=Waveform
|
||||
widgets\4\closable=true
|
||||
widgets\4\floatable=true
|
||||
widgets\4\floating=false
|
||||
widgets\4\floating_abs_h=0
|
||||
widgets\4\floating_abs_w=0
|
||||
widgets\4\floating_abs_x=0
|
||||
widgets\4\floating_abs_y=0
|
||||
widgets\4\floating_rel_h=0
|
||||
widgets\4\floating_rel_w=0
|
||||
widgets\4\floating_rel_x=0
|
||||
widgets\4\floating_rel_y=0
|
||||
widgets\4\floating_screen=
|
||||
widgets\4\movable=true
|
||||
widgets\4\object_name=Plot_3
|
||||
widgets\4\widget_class=Waveform
|
||||
widgets\5\closable=true
|
||||
widgets\5\floatable=true
|
||||
widgets\5\floating=false
|
||||
widgets\5\floating_abs_h=0
|
||||
widgets\5\floating_abs_w=0
|
||||
widgets\5\floating_abs_x=0
|
||||
widgets\5\floating_abs_y=0
|
||||
widgets\5\floating_rel_h=0
|
||||
widgets\5\floating_rel_w=0
|
||||
widgets\5\floating_rel_x=0
|
||||
widgets\5\floating_rel_y=0
|
||||
widgets\5\floating_screen=
|
||||
widgets\5\movable=true
|
||||
widgets\5\object_name=Plot_4
|
||||
widgets\5\widget_class=Waveform
|
||||
widgets\6\closable=true
|
||||
widgets\6\floatable=true
|
||||
widgets\6\floating=false
|
||||
widgets\6\floating_abs_h=0
|
||||
widgets\6\floating_abs_w=0
|
||||
widgets\6\floating_abs_x=0
|
||||
widgets\6\floating_abs_y=0
|
||||
widgets\6\floating_rel_h=0
|
||||
widgets\6\floating_rel_w=0
|
||||
widgets\6\floating_rel_x=0
|
||||
widgets\6\floating_rel_y=0
|
||||
widgets\6\floating_screen=
|
||||
widgets\6\movable=true
|
||||
widgets\6\object_name=Progress
|
||||
widgets\6\widget_class=TextBox
|
||||
widgets\size=6
|
||||
|
||||
[profile]
|
||||
created_at=2026-09-27T09:27:43Z
|
||||
quick_select=true
|
||||
screenshot="@ByteArray(\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x6\x86\0\0\x5\xe1\b\x6\0\0\0\xb7\x5(\x97\0\0\0\tpHYs\0\0\xe\xc4\0\0\xe\xc4\x1\x95+\xe\x1b\0\0 \0IDATx\x9c\xec\xddut\x14\xd7\xfb\xc7\xf1w\x1c\x12\x92\xe0n\xc5\xdd\x83\xb6Xp\xb7\xe0RZ\xac\xb8\x43)R\\\x8a\xbbK\xb1\xe0.-\x85\x1f-\x14)\x14)\xe\xa5XB\bNB\x2\x44v\x7f\x7f\xe4\xcb\x96\x94\x18\xc9\xc6\xe0\xf3:'\xe7$3w\xef}\xb2wv\xf6\xce<3w,\xfc_\x5\x1a\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x91\x8f\x9e\x65|\a \"\"\"\"\"\"\"\"\"\"\"\"qC\x89!\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x91O\x84\x12\x43\"\"\"\"\"\"\"\"\"\"\"\"\x9f\b%\x86\x12\x90{\xf7\x1fq\xef\xfe\xa3\xf8\xe\x43$\xca\xb4\xcd&N\xea\xb7O\x97\xfa^DD\xe4\xc3\xe8\xbbSDDD\x12\x13\x8d]$\xaa\x94\x18\x12\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\xf9\x44(1$\"\"\"\"\"\"\"\"\"\"\"\xf2\x89\xb0\x8e\xef\0\x44\x44\x44\x44\x44\x44\x44\x12;?\xbf\xd7\xf8\xbc\xf4#(\xd8\x10\xdf\xa1\x88\x88\x88\x98\x95\xad\xad\rI\xeclqv\xb4\x8f\xefPD\xc4L\x94\x18\x12\x11\x11\x11\x11\x11\x11\x89\x1\xaf\x87OIjkC\xd6\xcci\xb0\xb6\xd2\xc4\x1c\"\"\xf2qy\xf3&\x90\x17>\xaf\xf0\xb8\xff\x98\xcc\x19S\xc7w8\"1r\xef\xfe#\xb2\x64L\x13\xdf\x61\xc4;%\x86\x44\x44\x44\x44\x44\x44\x44\xa2\xc9\xcf\xef\x35I\xecl\xc8\x90.E|\x87\"\"\"\x12+\xec\xeclH\x9b\xc6\x6+k\xf0\xf3\x7f\x83\x83\xbd]|\x87$\"1\xa4K\x99\x44\x44\x44\x44\x44\x44\x44\xa2\xc9\xe7\xa5\x1fiS;\xc7w\x18\"\"\xf2\t\xbb\xfe\x8fW\x9c\xb4\xe3\xec\xe4\xc0\v\x1f\xbf\x38iKDb\x97\x12\x43\"\"\"\"\"\"\"\xd1\x14\x14l\xd0\xf4q\"\"\xf2I\xb0\xb6\xb2\"\xd8\x10\x1c\xdf\x61\x88\x88\x19h\xf4*\"\"\"\"\"\"\"\"\"\"\xf2\x89\x33\x1a\x8d\x18\x8d\xc6\x38{\x9d\xc4\x1f=cHDDDDDDDDDD\xcc\xc2}\xc3\x66N\x9d>\x13\xe5\xf2\xe5\xca\xba\xd0\xaci\xe3X\x8cH\xa2\xc2h42m\xfal\x8c\x46#\x3\a\xf4\xc1`00x\xe8\b\xdc\x9a\x35\xa6l\x19\x97PeO\x9c<\xc5\xa6\xcd\xdb\x98\x34\x61\f\xd6\xd6VL\x9e\x32\x9d\x37\x1o\x18\x39\xfc[,,,\xcc\x1a\xd3\xac\x39\v\xb8w\xcf#\xd4\xf2,Y2\xd3\xa7\xd7\x37\x66m\xebS\xa3\xc4\x90\x88\x88\x88\x88\x88\x88\x88\x88\x88\x88\x98\xc5\xa9\xd3g\xd8\xbdg\x1f\xb9s\xe5\x8c\xb4\xec\xcb\x97/\xd9\xbc\x65\x1b\xaf\xfc_\xd3\xae]\xabX\x89\xe7\xfa\xb5\x1b\x1c<\xfc+\xdft\xed\x14+\xf5G\xe6\xce\x9d{l\xd8\xb8\x19\xef\x87\x8f(X ?\xad[\xb9\x91$I\x92x\x89%*\xe6\xce_\x84\xd1h\xa4_\xdf^l\xde\xb2\r\x97R%\xdeK\f\xdd\xbe}\x87\xcd[\xb6\x31~\xecH\xa6\xcf\x98\xcd\x82\x45K\xe9\xf1M\x17\xb3\xc7\x32{\xee\x42\x66\xcc\x9c\x43\x81\xfc\xf9\xb0\xb2\xb2\x2\xc0`0\xb0y\xcb\xb6\x90\x18\xfb\xf4\x30{\x9bq-((\x18\x83!\x18[[\xdb\x38mW\x89!\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x31\x9b\xdc\xb9r\xb2s\xfb\x46\x9e<y\x12n\x19'''\xac\xac\xac\x19\x30p(\xc3G\x8d\x1\x30{r\xe8\xfa\xb5\x1b\xb4h\xf3%\xa9\xd3\xa4\xa2\x43\xbb\x36\xd8\xdb'5k\xfd\x91\xb9x\xe9\x32M\xdd\xda\x90\xc4\xce\x8e\xcc\x99\x33\xb1}\xc7N\xb6l\xdd\xce\xb6\xad\xee\xd8\xda\xd8\xc4i,\x91\xb1\xb0\xb0`@\xff\xde\0\xcc\x99\xb7\x90\xc0\xa0\xa0H_3u\xda,\x96,[I\xcf\xee]\x19\x38\xa0O\x8c\xee\xe0\xd9\xbc\x65\x1bK\x97\xaf\x32\xfdm4\xc2\xd5\xab\xd7\xe8\xdd\xb3\x1b\x3\xfa\xf7\tUv\xfa\x8c\xd9\xcc\x9c\x35\x97}?\xfd\x8c\xe5;mv\xfc\xb2=-\xdc\x9a\x44;\x86\xb8\x12\x18\x18\xc4\xa2%\xcb\xd8\xbcy\x1b\xb7\xef\xdc\x65\xd9\xe2\xf9\xb8\xbaV\x8e\xd3\x18\xe2\xed\x19\x43w\xef\xde%[\x8e\xfc\xdc\xbd{7Z\xeb#\xb2s\xd7.j\xd6\xaa\x13\xd3\x10\xe5\x7f\xcaW\xa8\xc4\xfe\xfd\xfb\xa3\xbd^bG\x81\x42\xc5\x39t\xe8P|\x87\x91 \xc5\xf7\x36\xab}\xd0\x87\xd3w\x82\x88\x88\x88\x88\x88\x88\xc8\xc7\xe5\xc9\x93'\x94*S1\xdc\x9f\xbd\xfb~\xc2\xda\xda\x8aiS'\xd1\xa8\x41=\x86\x8f\x1a\xc3\xe6-\xdb\xcc\xd6\xfe\xb5\xab\xd7i\xde\xba\x3\xa9\xd3\xa4\xc2}\xcd\x8a\x38O\n\x1\xfc\x30m\x16\x19\x33\xa4\xe7\xe8\xaf\a\xd8\xb3k\vkW\xaf\xe0\xe2\xa5\xcbl\xdb\xbe+\xce\x63\x89\x8a\xa0\xa0`z\xf6\xe8J\x97N\x1dY\xbc\x64y\xa4\xe5\x97,[I\x97N\x1d\xe9\xd5\xb3\x1b\x41\x41\xc1\x31j\xfb\xe9\xd3g\\\xbbv\x83\xa2\x85\vQ\xb4p!\x8a\x15)D\xbf\xbe\xbd\xe8\xdf\xaf\xf7{e\xfb\xf5\xed\x45\xbf\xbe\xbd(^\xa4\xb0\xa9\xfc\xb5k7\"LD&\x14w\xee\xdc\xa3Q\x93\x16l\xdf\xbe\x93\x9c\x39sP\xa6t\xa9\x38O\n\x81\x99\x13\x43\xfe\xfe\xfe\x64\xcb\x91\x9f\xdcy\v\xf3\xe6\xcd\x1bsV\x1d\xca\xe2\xc5K\xc8\x96#?\xd9r\xe4\xa7@\xa1\xe2|\xf5U'~\xfa\xe9'\f\x6\x43\xac\xb5\xf9\xb1\xe9\xd1\xa3\x17\xd9r\xe4\xe7\xea\xd5\xab\xb1\xd6\xc6\xc9\x93'M\xfd\x94-G~\xea\xd5o\xc4\x88\x11#9{\xf6\xacY\xea\xdf\xb7\x7f?\xed;t$ \xc0,\xf5\xbd\x15\x1c\x1c\xcc\x9e={\x19\x32\x64(\x95*\xbbR\xaf~#\xc6\x8c\x1d\xc7\xcd\x9b\x37\xcd\xda\x8e|\x98\xb8\xd8\x66\xe7\xcc\x99K\xef\xde}\xdf[~\xe4\xc8Q\xb2\xe5\xc8\x1f\xee>\xe6\xd5\xeb\xd7\xb4j\xddV\x89\xba\xff\xf8X\xbf\x13&N\x9c\xc4\x8c\x19\x33\x63\xa5n\x11\x11\x11\xf9\xf8\x5\x4\x4\x90\x36\x63n\xf6\xff\xf4s\xa4\x65\x83\x82\x82\xf9\xea\xeb\xae\xacZ\xb5\x1a\0ooo\xd2\x66\xcc\xcd\xe9\xd3\x7f\xc6v\x98\x11\x32\x18\f<\x7f\xfe\xdc\xec\xc7\x62\xaf_\xbf\x61\xed\xda\xf5|\xdd\xa9\x1b\xc5J\x94\xa7S\xe7o\xf8\xe3\x8fSfm\xe3\x43\xfc\xf7\xfd\x17\x11\x91\xd8\xf1\x36\x39\xf4Y\xf6l\x1c?a\x9e\xfd\xfe\xd5\xab\xd7h\xd1\xe6K\x9e={Fi\x97\x92\xac^\xb3\x9e\x99\xb3\xe6\x86\xfaY\xef\xbe\x89\v\x17/a4\x1a\xcd\xd2\x66Xn\\\xff\x9bj\xaeUptr\x4\xa0l\x19\x17\xd2\xa7K\xc7\xdf\x37\xfe\x8e\xb5\x36\x63\x62\xe8\xb0\x91\xe4-P\x9c\xc5KWD\xf9\x35\x8b\x97\xae o\x81\Line truncated
|
||||
screenshot_at=2026-09-27T09:27:43Z
|
||||
@@ -0,0 +1 @@
|
||||
,e18747,x10sa-cons-02.psi.ch,28.09.2026 21:41,file:///home/e18747/.config/libreoffice/4;
|
||||
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 53 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 918 KiB |
|
After Width: | Height: | Size: 424 KiB |
|
After Width: | Height: | Size: 915 KiB |
|
After Width: | Height: | Size: 849 KiB |
|
After Width: | Height: | Size: 920 KiB |
|
After Width: | Height: | Size: 828 KiB |
|
After Width: | Height: | Size: 829 KiB |
|
After Width: | Height: | Size: 825 KiB |
@@ -30,3 +30,46 @@ timestamp,energy_eV,flux_ph_s,beam_start_x_px,beam_start_y_px,vfm_ydr_start_mm,h
|
||||
2026-10-02T10:16:22,12400,-0.044,9.91e+12,,,,,,,,,,,-1.55143,-0.84055,2.98973,1.41274,1.91402,3.00507
|
||||
2026-10-02T10:21:56,12400,-0.044,8.22e+12,1001,952,-0.84053,1.91404,-0.84102,1.91453,0.5,-0.5,11.20,1.19,-1.55155,-0.84100,2.98875,1.41302,1.91456,3.00614
|
||||
2026-10-02T11:46:02,12400,-0.046,7.47e+12,984,963,-0.84101,1.91456,-0.84101,1.91396,-0.5,0.7,10.91,1.12,-1.55155,-0.84101,2.98877,1.41272,1.91395,3.00500
|
||||
2026-10-02T14:27:48,12400,-0.046,7.51e+12,953,969,-0.84102,1.91394,-0.84101,1.91180,-0.2,0.3,13.01,1.65,-1.55155,-0.84102,2.98880,1.41165,1.91182,3.00066
|
||||
2026-10-04T17:23:05,12400,-0.047,8.06e+12,1035,1081,-0.84162,1.91194,-0.83864,1.91375,-0.5,0.0,18.41,0.86,-1.55117,-0.83864,2.99429,1.41264,1.91375,3.00441
|
||||
2026-10-04T17:30:34,12400,-0.047,9.24e+12,994,967,-0.83864,1.91375,-0.83864,1.91371,-0.1,0.3,16.19,0.80,-1.55118,-0.83863,2.99434,1.41263,1.91373,3.00435
|
||||
2026-10-05T13:58:52,20000,-0.045,1.28e+12,933,891,-0.83851,1.91371,-0.84056,1.91048,-1.1,0.1,26.14,-0.07,-1.55180,-0.84059,2.99023,1.41099,1.91048,2.99785
|
||||
2026-10-05T14:00:11,20000,-0.045,1.28e+12,1000,971,-0.84057,1.91048,-0.84056,1.91093,0.5,-0.3,27.35,-0.22,-1.55179,-0.84058,2.99021,1.41123,1.91093,2.99878
|
||||
2026-10-05T14:04:31,20000,-0.046,1.31e+12,997,969,-0.84057,1.91085,-0.84055,1.91086,-0.6,-0.1,24.26,-0.19,-1.55178,-0.84056,2.99024,1.41121,1.91086,2.99865
|
||||
2026-10-05T14:50:12,12400,-0.049,7.69e+12,1001,967,-0.84055,1.91084,-0.84056,1.91122,0.1,0.1,17.17,-0.34,-1.55176,-0.84054,2.99021,1.41137,1.91120,2.99932
|
||||
2026-10-05T14:52:28,12400,-0.050,7.64e+12,992,969,-0.84054,1.91118,-0.84055,1.91122,0.1,-0.0,17.85,-0.35,-1.55176,-0.84055,2.99023,1.41136,1.91119,2.99931
|
||||
2026-10-07T09:46:42,12400,-0.119,7.26e+12,,,,,,,,,,,-1.55153,-0.84025,2.99058,1.41125,1.91103,2.99908
|
||||
2026-10-07T09:50:26,12400,-0.119,7.24e+12,,,,,,,,,,,-1.55153,-0.84025,2.99055,1.41126,1.91104,2.99909
|
||||
2026-10-07T09:54:58,12400,-0.119,7.25e+12,,,,,,,,,,,-1.55159,-0.84048,2.99009,1.41034,1.90919,2.99541
|
||||
2026-10-07T22:12:48,12400,-0.120,8.57e+12,,,,,,,,,,,-1.55164,-0.84046,2.99019,1.41031,1.90915,2.99535
|
||||
2026-10-07T22:21:21,12400,-0.120,8.55e+12,1003,969,-0.84045,1.90916,-0.84045,1.90993,-6.0,0.0,31.82,-3.14,-1.55163,-0.84047,2.99011,1.41070,1.90993,2.99691
|
||||
2026-10-07T22:25:08,12400,-0.120,3.01e+12,886,960,-0.84046,1.90986,-0.84068,1.90511,0.8,0.1,259.20,-3.45,-1.55168,-0.84069,2.98967,1.40829,1.90511,2.98729
|
||||
2026-10-08T09:38:54,12400,-0.119,8.58e+12,1094,966,-0.84067,1.90501,-0.84067,1.91027,0.9,0.2,31.67,-2.49,-1.55168,-0.84066,2.98976,1.41088,1.91027,2.99759
|
||||
2026-10-08T11:18:52,,,8.65e+09,,,,,,,,,,,-1.55167,-0.84067,2.98977,1.41085,1.91025,2.99755
|
||||
2026-10-08T11:23:02,15999,-0.118,3.18e+12,988,945,-0.84066,1.91025,-0.84130,1.91026,0.6,0.1,40.53,-1.92,-1.55183,-0.84130,2.98850,1.41086,1.91026,2.99760
|
||||
2026-10-08T11:46:45,15999,-0.118,3.29e+12,990,966,-0.84128,1.91027,-0.84128,1.91024,0.5,0.4,38.28,-1.28,-1.55182,-0.84128,2.98846,1.41085,1.91027,2.99762
|
||||
2026-10-08T12:23:01,20000,-0.118,1.18e+12,981,951,-0.84128,1.91026,-0.84177,1.90955,-0.6,-0.1,37.40,-1.39,-1.55193,-0.84179,2.98751,1.41052,1.90955,2.99617
|
||||
2026-10-08T12:36:12,12398,-0.122,7.54e+12,1014,1011,-0.84177,1.90955,-0.84063,1.91046,-0.0,0.3,27.70,-2.63,-1.55164,-0.84064,2.98980,1.41097,1.91046,2.99798
|
||||
2026-10-08T14:05:15,12400,-0.125,7.53e+12,1010,997,-0.84063,1.91038,-0.83988,1.91091,-0.6,-0.2,22.53,-2.62,-1.55143,-0.83988,2.99126,1.41118,1.91089,2.99881
|
||||
2026-10-09T08:39:08,12400,-0.123,7.52e+12,1021,1015,-0.83960,1.91196,-0.83836,1.91302,-0.7,-0.0,25.21,-2.48,-1.55103,-0.83836,2.99472,1.41226,1.91302,3.00306
|
||||
2026-10-09T09:09:02,12400,-0.123,7.84e+12,975,956,-0.83837,1.91304,-0.83871,1.91193,-0.4,-0.1,26.17,-2.47,-1.55112,-0.83871,2.99398,1.41169,1.91192,3.00089
|
||||
2026-10-11T13:43:17,12400,-0.003,9.40e+12,1046,974,-0.84349,1.90884,-0.84328,1.91123,-0.5,0.3,-11.57,0.25,-1.55229,-0.84327,2.98450,1.41135,1.91124,2.99953
|
||||
2026-10-11T13:44:35,12400,-0.003,8.89e+12,959,963,-0.84328,1.91121,-0.84349,1.90923,-1.0,-0.5,4.12,-0.10,-1.55233,-0.84350,2.98406,1.41036,1.90923,2.99553
|
||||
2026-10-11T13:46:10,15000,0.000,3.88e+12,997,974,-0.84348,1.90922,-0.84349,1.90922,-0.5,-0.7,7.75,-0.22,-1.55235,-0.84348,2.98409,1.41036,1.90924,2.99551
|
||||
2026-10-11T13:57:05,15000,-0.000,3.88e+12,999,972,-0.84348,1.90924,-0.84346,1.90924,-0.8,-0.5,7.18,-0.03,-1.55236,-0.84348,2.98415,1.41037,1.90926,2.99557
|
||||
2026-10-11T14:06:33,15000,0.000,3.89e+12,1000,972,-0.84349,1.90922,-0.84349,1.90923,-0.9,-0.5,5.01,-0.04,-1.55235,-0.84347,2.98411,1.41035,1.90923,2.99548
|
||||
2026-10-11T14:14:45,12400,-0.002,8.88e+12,997,971,-0.84349,1.90924,-0.84350,1.90923,-0.8,-0.3,4.65,-0.12,-1.55235,-0.84350,2.98404,1.41035,1.90923,2.99552
|
||||
2026-10-11T14:30:55,12400,-0.002,8.87e+12,998,974,-0.84348,1.90922,-0.84349,1.90924,-1.0,-0.9,4.66,-0.26,-1.55235,-0.84350,2.98410,1.41035,1.90922,2.99549
|
||||
2026-10-11T14:46:28,12400,-0.002,8.73e+12,988,976,-0.84348,1.90922,-0.84349,1.90925,0.7,-1.1,9.50,-0.33,-1.55234,-0.84349,2.98406,1.41034,1.90921,2.99547
|
||||
2026-10-11T14:51:26,12400,-0.002,8.75e+12,995,975,-0.84349,1.90923,-0.84348,1.90921,-0.5,-0.9,7.19,-0.16,-1.55234,-0.84347,2.98412,1.41038,1.90924,2.99546
|
||||
2026-10-11T15:00:54,12400,-0.002,8.77e+12,995,977,-0.84350,1.90924,-0.84325,1.90923,-0.5,0.3,6.43,0.09,-1.55229,-0.84326,2.98451,1.41035,1.90923,2.99550
|
||||
2026-10-11T15:14:21,12400,-0.002,8.83e+12,993,971,-0.84326,1.90925,-0.84327,1.90924,-0.0,-0.2,6.62,-0.12,-1.55229,-0.84326,2.98454,1.41036,1.90923,2.99549
|
||||
2026-10-11T15:17:41,12400,-0.002,8.86e+12,995,968,-0.84327,1.90923,-0.84326,1.90921,-0.2,0.2,6.43,0.13,-1.55230,-0.84328,2.98450,1.41035,1.90922,2.99549
|
||||
2026-10-12T09:45:04,12400,0.000,8.91e+12,983,951,-0.84303,1.90992,-0.84353,1.90914,-0.7,-0.3,4.88,0.31,-1.55229,-0.84354,2.98386,1.41029,1.90909,2.99524
|
||||
2026-10-14T08:55:40,12400,0.000,8.77e+12,1033,1005,-0.84345,1.90907,-0.84247,1.91088,-0.5,0.3,10.83,0.85,-1.55198,-0.84249,2.98585,1.41119,1.91089,2.99878
|
||||
2026-10-15T09:34:37,12400,-0.000,8.83e+12,959,923,-0.84246,1.91085,-0.84368,1.90935,0.7,-0.0,8.69,0.17,-1.55226,-0.84369,2.98353,1.41042,1.90936,2.99573
|
||||
2026-10-16T08:40:24,12400,-0.000,8.80e+12,1004,979,-0.84368,1.90932,-0.84343,1.90991,0.2,0.1,13.56,0.51,-1.55222,-0.84343,2.98403,1.41066,1.90985,2.99675
|
||||
2026-10-16T15:14:36,12400,-0.000,8.78e+12,982,956,-0.84344,1.90983,-0.84379,1.90948,0.6,-0.1,12.88,0.34,-1.55234,-0.84380,2.98332,1.41047,1.90947,2.99601
|
||||
2026-10-17T12:28:51,12400,-0.038,9.12e+12,1017,1181,-0.84379,1.90942,-0.83817,1.91044,-0.2,-0.6,6.60,-5.16,-1.55092,-0.83817,2.99459,1.41097,1.91047,2.99800
|
||||
2026-10-17T21:52:03,12400,-0.042,9.16e+12,993,968,-0.83965,1.91067,-0.83966,1.91068,-0.2,0.1,6.30,-3.83,-1.55129,-0.83964,2.99155,1.41106,1.91066,2.99839
|
||||
2026-10-19T09:06:34,12400,-0.044,9.12e+12,987,952,-0.83966,1.91067,-0.84014,1.91068,0.8,-0.2,5.30,-4.09,-1.55137,-0.84013,2.99058,1.41107,1.91067,2.99843
|
||||
|
@@ -10,3 +10,12 @@
|
||||
"2026-09-30T11:45:21",12400,5.307,-0.0417,0.14,0.874,0.102,0.152,0.224,-0.639,0.014,-0.0129,0.0118,-0.0001,-0.0399,-0.0652,6.1,-1.63
|
||||
2026-09-30T12:07:53,12400,5.307,-0.042,0.14,0.874,0.101,0.152,0.219,-0.639,0.0145,-0.0108,0.0138,0.000447,-0.0467,-0.066,7.24,-1.65
|
||||
2026-09-30T12:15:59,12400,5.307,-0.0418,0.14,0.874,0.101,0.152,0.221,-0.639,0.0144,-0.0105,0.012,-0.00118,-0.0414,-0.0618,6.36,-1.54
|
||||
2026-10-07T09:34:08,12400,5.307,-0.1193,0.130,0.881,0.088,0.163,0.184,-0.589,0.0961,0.0611,-0.0289,-0.1239,-0.1618,-0.0831,26.4,-2.1
|
||||
2026-10-11T14:05:28,12400,5.310,-0.0036,0.130,0.873,0.092,0.156,0.180,-0.637,0.0954,0.0073,-0.0118,0.0191,-0.0440,-0.0014,3.8,-0.1,0.25
|
||||
2026-10-11T14:14:13,12400,5.310,-0.0033,,,0.093,0.156,0.182,-0.636,0.0977,0.0072,-0.0168,0.0181,-0.0418,-0.0021,3.5,-0.1,0.25
|
||||
2026-10-11T14:23:25,12400,5.310,-0.0019,,,0.093,0.156,0.181,-0.637,0.1022,0.0046,-0.0068,0.0224,-0.0518,-0.0005,5.1,-0.1,0.25
|
||||
2026-10-11T14:30:23,12400,5.310,-0.0013,,,0.093,0.156,0.185,-0.635,0.0970,0.0061,-0.0078,0.0209,-0.0287,-0.0040,1.3,-0.2,0.25
|
||||
2026-10-11T14:45:55,12400,5.310,-0.0021,,,,,,,,,,,,,,,0.25
|
||||
2026-10-11T15:00:21,12400,5.310,-0.0023,0.130,0.873,0.093,0.174,0.177,-0.636,0.1009,0.0066,-0.0069,0.0183,-0.0608,-0.0088,6.6,-0.3,0.25
|
||||
2026-10-14T08:55:03,12400,5.310,0.0001,0.130,0.873,0.085,0.157,0.172,-0.638,0.1177,0.0063,-0.0048,0.0302,-0.0618,-0.0162,6.8,-0.5,0.25
|
||||
2026-10-17T12:28:09,12400,5.309,-0.0382,0.125,0.881,0.077,0.167,0.171,-0.529,0.1176,0.0800,-0.0212,-0.2063,-0.0501,-0.4810,4.8,-7.0,0.25
|
||||
|
@@ -0,0 +1,10 @@
|
||||
timestamp,energy_eV,id_gap_mm,pitch_offset_mrad,fe_x,fe_y,bsf_x,bsf_y,ss_x,ss_y,lu_Xnorm,lu_Ynorm,ss_Xnorm,ss_Ynorm,bcu_Xnorm,bcu_Ynorm,bcu_beam_x,bcu_beam_y
|
||||
2026-09-24T21:42:20,12400.0338140146,5.307,-0.042640079687493,0.140288499999999,0.872397500000001,0.097923887634334,0.153298136901654,0.21542,-0.64411,,,,,,,,
|
||||
2026-09-28T19:57:16,12399.9628462791,5.307,-0.044554079687435,0.140375499999999,0.872320000000001,0.105040205383357,0.148134944152631,0.22142,-0.6395,,,,,,,,
|
||||
2026-09-28T20:08:25,12399.9609373482,5.307,-0.044496079687582,0.1403535,0.872312500000001,0.104503286743221,0.148356196594037,0.22431,-0.64021,-0.001605502500174,-0.011175883290173,-0.01409593110007,,0.11351579437023,-0.118069917719052,,
|
||||
2026-09-30T08:58:15,12399.7329928229,5.307,-0.044525079687622,0.139911,0.88608,0.10406555023199,0.17099928588847,0.19652,-0.2202,0.081590727629084,0.411812820368516,0.033582789254866,,-0.112479632399972,-0.816516017074602,,
|
||||
2026-09-30T09:08:53,12399.747477715,5.307,-0.042524079687558,0.139926999999998,0.864803500000001,0.103701246643123,0.143616435241498,0.24392,-1.0175,-0.063997780917417,-0.289248157407647,-0.079407668513141,,0.034774101807238,0.983399612330604,,
|
||||
2026-09-30T10:49:14,12400.0475135773,5.30728340148926,-0.042002079687512,0.139973999999999,0.8737165,0.103015554809627,0.152205226135052,0.2194,-0.6346,0.012092898871937,-0.017654174479793,0.01164915499848,,-0.038458560216091,-0.056822442194876,,
|
||||
2026-09-30T11:04:59,12400.034824637,5.30728340148926,-0.041712079687562,0.140038499999999,0.873851000000002,0.102714193725642,0.152251956176556,0.22052,-0.64071,0.01188100007843,-0.012323516377797,0.013475582102897,-0.002578973845116,-0.042749327098526,-0.061238705041222,,
|
||||
2026-09-30T11:39:23,12400,5.307,-0.042,0.140108499999998,0.873990000000001,0.102007521057185,0.152334925842084,0.22002,-0.64121,0.0135,-0.0108,0.0095,0.000379,-0.0371,-0.0659,5.64,-1.65
|
||||
2026-09-30T11:45:21,12400,5.307,-0.0417,0.14,0.874,0.102,0.152,0.224,-0.639,0.014,-0.0129,0.0118,-0.0001,-0.0399,-0.0652,6.1,-1.63
|
||||
|
@@ -65,15 +65,15 @@ aerotech:
|
||||
mount: 0
|
||||
work: 0
|
||||
x:
|
||||
in: 0.05999397
|
||||
in: 0.05999735
|
||||
out: -10
|
||||
safe: -50
|
||||
y:
|
||||
mount: -0.0
|
||||
work: -0.02799609
|
||||
work: -0.03099898
|
||||
z:
|
||||
mount: 0
|
||||
work: -0.0090036
|
||||
work: -0.0090031
|
||||
bcu_bpm1:
|
||||
description: BCU BPM Channel 1
|
||||
deviceClass: ophyd.EpicsSignalRO
|
||||
@@ -302,7 +302,7 @@ bs_x:
|
||||
onFailure: buffer
|
||||
readoutPriority: baseline
|
||||
userParameter:
|
||||
in: 0.2038985
|
||||
in: 0.44000227
|
||||
bs_y:
|
||||
description: Beamstop Y
|
||||
deviceClass: ophyd_devices.EpicsMotor
|
||||
@@ -314,7 +314,7 @@ bs_y:
|
||||
onFailure: buffer
|
||||
readoutPriority: baseline
|
||||
userParameter:
|
||||
in: 0.9064885
|
||||
in: -3.3000017
|
||||
bs_z:
|
||||
description: Beamstop Z
|
||||
deviceClass: ophyd_devices.EpicsMotor
|
||||
@@ -560,6 +560,8 @@ dcm_pitch:
|
||||
enabled: true
|
||||
onFailure: buffer
|
||||
readoutPriority: baseline
|
||||
userParameter:
|
||||
offset: 0
|
||||
dcm_x:
|
||||
description: DCM Lateral
|
||||
deviceClass: ophyd_devices.EpicsMotorEC
|
||||
@@ -1310,6 +1312,17 @@ samcam_sigma:
|
||||
onFailure: buffer
|
||||
readOnly: true
|
||||
readoutPriority: monitored
|
||||
samcam_thresh:
|
||||
description: Sample Camera Threshold
|
||||
deviceClass: ophyd.EpicsSignal
|
||||
deviceConfig:
|
||||
auto_monitor: true
|
||||
read_pv: X10SA-ES-MS:Stats5:CentroidThreshold
|
||||
deviceTags:
|
||||
- scam
|
||||
enabled: true
|
||||
onFailure: buffer
|
||||
readoutPriority: baseline
|
||||
samcam_x:
|
||||
description: Sample Camera X
|
||||
deviceClass: ophyd.EpicsSignalRO
|
||||
@@ -1758,7 +1771,6 @@ transm:
|
||||
deviceClass: ophyd_devices.EpicsSignal
|
||||
deviceConfig:
|
||||
read_pv: X10SA-ES-SSFI:TRANSM-SET
|
||||
write_pv: X10SA-ES-SSFI:TRANSM-SET
|
||||
deviceTags:
|
||||
- transm
|
||||
enabled: true
|
||||
|
||||
@@ -2,68 +2,71 @@ def evalflux():
|
||||
|
||||
from APscripts import read_data_csv, fitpoly
|
||||
|
||||
data=read_data_csv('FLUX_x10sa_20260709_174259.txt')
|
||||
|
||||
einv=data[:, 0]
|
||||
fcalfinv = data[:, 6] # if energy top down
|
||||
data = read_data_csv("FLUX_x10sa_20260709_174259.txt")
|
||||
|
||||
einv = data[:, 0]
|
||||
fcalfinv = data[:, 6] # if energy top down
|
||||
|
||||
e = einv[::-1]
|
||||
flcf = fcalfinv[::-1]
|
||||
|
||||
# omit the last values (>= 27 keV)
|
||||
|
||||
len(e) # = 25
|
||||
len(e) # = 25
|
||||
e = e[0:21]
|
||||
flcf =flcf[0:21]/1.e9 ## divide by 1e9 for better readability
|
||||
flcf = flcf[0:21] / 1.0e9 ## divide by 1e9 for better readability
|
||||
|
||||
fitpoly(e, flcf, 3)
|
||||
|
||||
# Polynomial coefficients of the fit fct: 3 [-0.00026213 0.01171065 -0.05379571 0.04478851]
|
||||
|
||||
|
||||
def csplinex(x,y,en):
|
||||
def csplinex(x, y, en):
|
||||
from scipy.interpolate import CubicSpline
|
||||
|
||||
# Create spline
|
||||
cs = CubicSpline(x, y)
|
||||
y_cs = cs(en)
|
||||
y_cs = cs(en)
|
||||
return y_cs
|
||||
|
||||
|
||||
|
||||
def flux_bcu():
|
||||
e = get_current_energy()/1000.
|
||||
bcusum = read_av(dev.bcu_bpmsum,10)
|
||||
flux = fl_bcubpm(e,bcusum)
|
||||
return f"{flux:.2e}"
|
||||
|
||||
e = get_current_energy() / 1000.0
|
||||
bcusum = read_av(dev.bcu_bpmsum, 10)
|
||||
flux = fl_bcubpm(e, bcusum)
|
||||
return f"{flux:.2e}"
|
||||
|
||||
|
||||
def flux_i1():
|
||||
e = get_current_energy()/1000
|
||||
i1 = read_av(dev.i1,10)
|
||||
e = get_current_energy() / 1000
|
||||
i1 = read_av(dev.i1, 10)
|
||||
flux = fl_i1(e, i1)
|
||||
return f"{flux:.2e}"
|
||||
|
||||
def fl_bcubpm(e,bcusum):
|
||||
import numpy as np
|
||||
fact = 1.e9
|
||||
coeff = [-0.00026213, 0.01171065, -0.05379571, 0.04478851]
|
||||
if e > 24 :
|
||||
coeff = [4.83704287e-05, -3.17174523e-03, 7.33131161e-02, -5.91926617e-01, 1.66572494e+00]
|
||||
return f"{flux:.2e}"
|
||||
|
||||
|
||||
def fl_bcubpm(e, bcusum):
|
||||
import numpy as np
|
||||
|
||||
fact = 1.0e9
|
||||
coeff = [-0.00026213, 0.01171065, -0.05379571, 0.04478851]
|
||||
if e > 24:
|
||||
coeff = [4.83704287e-05, -3.17174523e-03, 7.33131161e-02, -5.91926617e-01, 1.66572494e00]
|
||||
polynomial = np.poly1d(coeff)
|
||||
fl = polynomial(e) * bcusum * fact
|
||||
#print(f'flux from {bcusum} with en {e} is {fl:.2e} ph/s')
|
||||
|
||||
return fl
|
||||
|
||||
def fl_i1(e,i1):
|
||||
# print(f'flux from {bcusum} with en {e} is {fl:.2e} ph/s')
|
||||
|
||||
return fl
|
||||
|
||||
|
||||
def fl_i1(e, i1):
|
||||
import pandas as pd
|
||||
|
||||
file = "luts/I1flcalf.csv"
|
||||
df = pd.read_csv(file)
|
||||
df = pd.read_csv(file)
|
||||
a = df["En"]
|
||||
b = df["Fl/I1"]
|
||||
|
||||
fl_i1 = csplinex(a,b,e) *i1
|
||||
print(f'flux from {i1} with en {e} is {fl_i1:.2} ph/s ')
|
||||
|
||||
fl_i1 = csplinex(a, b, e) * i1
|
||||
print(f"flux from {i1} with en {e} is {fl_i1:.2} ph/s ")
|
||||
|
||||
return fl_i1
|
||||
@@ -13,10 +13,12 @@ class KBMirror:
|
||||
self.P2 = 0.583490
|
||||
self.P3 = -0.372950
|
||||
self.L1 = -0.955798
|
||||
self.curv_approx_fact = 0.9550 # 0.9550 # origin: 1.0121
|
||||
self.s1 = 24.15
|
||||
self.curv_approx_fact = 0.9550 # 0.9550 # origin: 1.0121
|
||||
self.s1 = 24.15
|
||||
self.s2 = 1.45
|
||||
self.asym0 = 0.114 ## origin: 0.0.08 + 0.034 # user asymm, eg 0.4750, will be added ( - sign)
|
||||
self.asym0 = (
|
||||
0.114 ## origin: 0.0.08 + 0.034 # user asymm, eg 0.4750, will be added ( - sign)
|
||||
)
|
||||
|
||||
elif self.mirror_type == "PXII_HFM":
|
||||
self.C0 = 0.060453
|
||||
@@ -24,10 +26,12 @@ class KBMirror:
|
||||
self.P2 = 0.586057
|
||||
self.P3 = -0.088093
|
||||
self.L1 = -0.999445
|
||||
self.curv_approx_fact = 0.8810 # origin: # 0.995
|
||||
self.s1 = 24.90
|
||||
self.curv_approx_fact = 0.8810 # origin: # 0.995
|
||||
self.s1 = 24.90
|
||||
self.s2 = 0.7
|
||||
self.asym0 = 0.06455 ## origin: -0.0107 + 0.07525 # added user asymm 2.75 (-sign)
|
||||
self.asym0 = (
|
||||
0.06455 ## origin: -0.0107 + 0.07525 # added user asymm 2.75 (-sign)
|
||||
)
|
||||
|
||||
else:
|
||||
raise ValueError(f"Unknown mirror type: {self.mirror_type}")
|
||||
@@ -59,7 +63,7 @@ class KBMirror:
|
||||
return s2, R
|
||||
|
||||
def get_benders(self, th=3.0, defocus_mm=0.0, user_asymmetry=0.0):
|
||||
asym = self.asym0 - user_asymmetry #### sign is important!
|
||||
asym = self.asym0 - user_asymmetry #### sign is important!
|
||||
s2_target = self.s2 + defocus_mm / 1000
|
||||
curv = self.ellipse_to_curvature(s2_target, th)
|
||||
BU, BD = self.curvature_to_bend(curv, asym)
|
||||
@@ -69,16 +73,12 @@ class KBMirror:
|
||||
curv, asym = self.bend_to_curvature(BU, BD)
|
||||
s2_rb, R0 = self.curvature_to_ellipse(curv, th)
|
||||
defocus_mm = (s2_rb - self.s2) * 1000
|
||||
bend_rad_m = 1/curv *1000
|
||||
bend_rad_m = 1 / curv * 1000
|
||||
return {
|
||||
"curvature": curv,
|
||||
"bend_rad_m": bend_rad_m,
|
||||
"bend_rad0_m": R0,
|
||||
"bend_rad_m": bend_rad_m,
|
||||
"bend_rad0_m": R0,
|
||||
"asymmetry": asym,
|
||||
"s2": s2_rb,
|
||||
"defocus_mm": defocus_mm
|
||||
"defocus_mm": defocus_mm,
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -45,8 +45,40 @@ def exponential_func2(x, a, b, c, d):
|
||||
|
||||
##################################
|
||||
|
||||
|
||||
# ##### Sept 2026 Data ######################################
|
||||
def return_harmon():
|
||||
# from 3rd to 19th Energy range from 6 keV to 30 keV
|
||||
# harmonics, Sept 2026
|
||||
import numpy as np
|
||||
|
||||
nharm = 19
|
||||
h = [np.array([]) for _ in range(nharm + 1)]
|
||||
h[0] = np.array([0])
|
||||
h[1] = np.array([0])
|
||||
h[2] = np.array([0])
|
||||
h[3] = np.array([0.095, -0.276, 4.154]) # 3rd harmon
|
||||
h[4] = np.array([0.00692593, -0.131504, 1.45763, -0.864603])
|
||||
h[5] = np.array([0.00269444 , - 0.0616905 , 0.967925, - 0.295405])
|
||||
h[6] = np.array([ 0.00248148 , - 0.0767908 , 1.2178 , - 1.91516 ])
|
||||
h[7] = np.array([0.00110017 , - 0.0369968 , 0.77334 ,- 0.688198 ])
|
||||
h[8] = np.array([0.000643939 , - 0.0226645 , 0.570453 , - 0.0479048 ])
|
||||
h[9] = np.array([0.00021633 , -0.00619517 , 0.315392 , 0.971667 ])
|
||||
h[10] = np.array([ 0.000708236 , - 0.0357576 , 0.851686 - 2.48765 ])
|
||||
h[11] = np.array([ 0.000589549 , -0.0328631 , 0.837705 , - 2.90326 ])
|
||||
h[12] = np.array([ 0.00218182 , 0.1212 , 1.74739 ])
|
||||
h[13] = np.array([ 0.197702, 0.757869 ])
|
||||
h[14] = np.array([ 0.183733, 0.762778 ])
|
||||
h[15] = np.array([ 0.170381, 0.783155 ])
|
||||
h[16] = np.array([ 0.157321, 0.850464 ])
|
||||
h[17] = np.array([0.1466, 0.8906 ])
|
||||
h[18] = np.array([0.1362, 0.9538 ])
|
||||
h[19] = np.array([0.128, 0.985 ])
|
||||
|
||||
|
||||
return h
|
||||
|
||||
# ##### July 2025 Data ######################################
|
||||
def return_harmon_old():
|
||||
# from 3rd to 21th Energy range from 6 keV to 30 keV
|
||||
# harmonics, July 2025
|
||||
import numpy as np
|
||||
@@ -97,7 +129,7 @@ def plot_harmon(e_start, e_end, h_no, pr_out=False):
|
||||
plt.show()
|
||||
|
||||
|
||||
def setu19(en, *harm_no, detune=0, simul = 0):
|
||||
def setu19(en, *harm_no, detune=0, simul = 0, iexp = 0):
|
||||
"""
|
||||
set the U19 to the gaps defined in Jul2025, or the "theoretical" ones for higher
|
||||
harmonics
|
||||
@@ -106,32 +138,43 @@ def setu19(en, *harm_no, detune=0, simul = 0):
|
||||
en in keV, possibly select a special harmonics, or detune [0/1] to a value
|
||||
with a nicer beam shape but less flux
|
||||
"""
|
||||
g0 = dev.id_gap.readback.get()
|
||||
|
||||
fitpar_u19 = np.array([2.17078531, 0.519452, -0.00720255]) # measured from U19
|
||||
if not simul:
|
||||
g0 = dev.id_gap.readback.get()
|
||||
|
||||
#fitpar_u19 = np.array([2.17078531, 0.519452, -0.00720255]) # measured from U19
|
||||
fitpar_u19 = np.array([ 2.22322523, 0.50396248, -0.00783873]) # measured from U19, Sept2026
|
||||
|
||||
h_all = return_harmon()
|
||||
# dep on energy -> select harmonics
|
||||
if harm_no:
|
||||
harm = int(harm_no[0])
|
||||
|
||||
print("Selected harmonics is:", harm)
|
||||
|
||||
else:
|
||||
print("Using the default optimised harmonics")
|
||||
if en <= 7:
|
||||
harm = 3 # h = h[3]
|
||||
elif 7 < en <= 10:
|
||||
elif 7 < en <= 10.5:
|
||||
harm = 5
|
||||
elif 10 < en <= 13:
|
||||
elif 10.5 < en < 13:
|
||||
harm = 7
|
||||
elif 13 < en <= 16:
|
||||
elif 13 <= en <= 16.5:
|
||||
harm = 9
|
||||
elif 16 < en <= 19:
|
||||
elif 16.5 < en <= 19.5:
|
||||
harm = 11
|
||||
elif 19 < en <= 22: ## 22
|
||||
elif 19.5 < en <= 22.5:
|
||||
harm = 13
|
||||
elif 22.5 < en <= 25.5: ## 22
|
||||
harm = 15
|
||||
elif 25.5 < en <= 28.5: ## 22
|
||||
harm = 17
|
||||
elif 28.5 < en <= 30: ## 22
|
||||
harm = 19
|
||||
|
||||
|
||||
|
||||
if (en <= 22 and harm <=13):
|
||||
if (en <= 30 and harm <=19):
|
||||
h = h_all[harm]
|
||||
print(f"harmonics is {harm}.")
|
||||
|
||||
@@ -146,25 +189,17 @@ def setu19(en, *harm_no, detune=0, simul = 0):
|
||||
# 29: 15, 17, 19
|
||||
# 30: 19
|
||||
##
|
||||
if (en > 22 and harm_no):
|
||||
harm = int(harm_no[0])
|
||||
print("Selected harmonics is:", harm)
|
||||
n= harm
|
||||
if (iexp and harm_no):
|
||||
harm_selected = int(harm_no[0])
|
||||
print("Selected harmonics is:", harm_selected)
|
||||
n= harm_selected
|
||||
enorm = en / n
|
||||
g = exponential_func0(enorm, fitpar_u19[0], fitpar_u19[1], fitpar_u19[2])
|
||||
else:
|
||||
if 22 < en <= 25:
|
||||
n = 15
|
||||
enorm = en / n
|
||||
g = exponential_func0(enorm, fitpar_u19[0], fitpar_u19[1], fitpar_u19[2])
|
||||
elif 25 < en <= 29:
|
||||
n = 17
|
||||
enorm = en / n
|
||||
g = exponential_func0(enorm, fitpar_u19[0], fitpar_u19[1], fitpar_u19[2])
|
||||
elif 29 < en:
|
||||
n = 19
|
||||
enorm = en / n
|
||||
g = exponential_func0(enorm, fitpar_u19[0], fitpar_u19[1], fitpar_u19[2])
|
||||
elif (iexp):
|
||||
n = harm # default for that energy range, as set before
|
||||
enorm = en / n
|
||||
print('exp fct fit used')
|
||||
g = exponential_func0(enorm, fitpar_u19[0], fitpar_u19[1], fitpar_u19[2])
|
||||
|
||||
|
||||
if not simul:
|
||||
@@ -180,7 +215,7 @@ def setu19(en, *harm_no, detune=0, simul = 0):
|
||||
# print("move disabled!!")
|
||||
scans.umv(dev.id_gap, g, relative=False)
|
||||
|
||||
return g
|
||||
return round(g,4)
|
||||
|
||||
|
||||
##################################
|
||||
@@ -201,7 +236,8 @@ def harmon_walk(estart=7.5, end_en=13):
|
||||
|
||||
##################################
|
||||
def gap_harm(e=12.4):
|
||||
fitpar_u19 = np.array([2.17078531, 0.519452, -0.00720255])
|
||||
# old values fitpar_u19 = np.array([2.17078531, 0.519452, -0.00720255])
|
||||
fitpar_u19 = np.array([2.22322523, 0.50396248, -0.00783873])
|
||||
fitpar_u17 = np.array([2.17078572, 0.46477267, -0.005766])
|
||||
e = float(input("Please enter an energy between 6 and 30: "))
|
||||
|
||||
@@ -396,7 +432,7 @@ def gscan(deltag = 0.05,centre=0, gomax=0, detune=0,sett=1, silent=0, iplot=1, i
|
||||
indmax = np.argmax(bpm_data)
|
||||
gmax = gap_data[indmax]
|
||||
|
||||
gcen, xm = fit_plot(gap_data, bpm_data, model="voigt", silent=silent, iplot=iplot)
|
||||
gcen, xm = fit_plot(gap_data, bpm_data, tmodel="voigt", silent=silent, iplot=iplot)
|
||||
|
||||
if gomax:
|
||||
gm = xm
|
||||
@@ -419,3 +455,30 @@ def gscan(deltag = 0.05,centre=0, gomax=0, detune=0,sett=1, silent=0, iplot=1, i
|
||||
print("Fit too far off, try using option gomax=1")
|
||||
|
||||
return gm, xm
|
||||
|
||||
##################################
|
||||
|
||||
def bfield_x10sa(gap):
|
||||
if gap < 4.5 or gap > 20:
|
||||
print("no valid gap!")
|
||||
return
|
||||
|
||||
### values for the U19
|
||||
l_u = 19
|
||||
a = 3.22482942
|
||||
b = -0.30100054
|
||||
c = 0.00808649
|
||||
|
||||
b0 = exponential_func0(gap, a,b,c )
|
||||
b0= round(b0,4)
|
||||
# K = e/mc * l_u/2pi * B
|
||||
k = round(0.0934 *l_u * b0,2)
|
||||
|
||||
print(f'### X10SA and U19 ### ')
|
||||
print(f'for a gap of {gap} mm : ')
|
||||
print(f'B0 = {b0}')
|
||||
print(f'K = {k}')
|
||||
|
||||
return b0, k
|
||||
|
||||
##################################
|
||||
@@ -12,7 +12,7 @@ from pxii_bec.scripts import beamline_context as bl
|
||||
def get_data(filename):
|
||||
"""Open the raw DCM calibration data file."""
|
||||
|
||||
filename = bl.env.lut_dir / f"{filename}.csv"
|
||||
filename = bl.env.lut_dir / f"{filename}"
|
||||
|
||||
return pd.read_csv(filename)
|
||||
|
||||
@@ -168,8 +168,69 @@ def lut_plot(
|
||||
|
||||
return fit
|
||||
|
||||
def pitch_analysis(filename, save=False):
|
||||
"""Compare DCM pitch calibration against energy and Bragg angle."""
|
||||
|
||||
def pitch_analysis(filename, fit_order=3, save=False):
|
||||
df = get_data(filename)
|
||||
|
||||
fits = {}
|
||||
|
||||
for xname, fit_order in [("energy", 4), ("bragg", 2)]:
|
||||
|
||||
x = df[xname].to_numpy()
|
||||
pitch = df["pitch"].to_numpy()
|
||||
|
||||
fit = lut_plot(
|
||||
df[[xname, "pitch"]].to_numpy(),
|
||||
xname="Energy" if xname == "energy" else "Bragg angle",
|
||||
yname="pitch",
|
||||
title=f"DCM_Pitch_Calibration_{xname}",
|
||||
fit_order=fit_order,
|
||||
save=save,
|
||||
)
|
||||
|
||||
# Calculate residuals
|
||||
fitted_pitch = np.polyval(fit, x)
|
||||
residuals = pitch - fitted_pitch
|
||||
|
||||
rms = np.sqrt(np.mean(residuals**2))
|
||||
max_residual = np.max(np.abs(residuals))
|
||||
|
||||
print(f"\n{xname.capitalize()} fit (order {fit_order})")
|
||||
print(f"RMS residual: {rms:.6g}")
|
||||
print(f"Max residual: {max_residual:.6g}")
|
||||
|
||||
for xi, residual in zip(x, residuals):
|
||||
print(f" {xi:10.3f}: {residual:+.6g}")
|
||||
|
||||
fits[xname] = {
|
||||
"fit": fit,
|
||||
"residuals": residuals,
|
||||
"rms": rms,
|
||||
"max_residual": max_residual,
|
||||
}
|
||||
|
||||
return fits
|
||||
|
||||
def pitch_analysis_bragg(filename, fit_order=2, save=False):
|
||||
"""Fit and plot the DCM pitch calibration."""
|
||||
|
||||
df = get_data(filename)
|
||||
|
||||
pitch = df[["bragg", "pitch"]]
|
||||
|
||||
fit = lut_plot(
|
||||
pitch.to_numpy(),
|
||||
xname="Bragg angle",
|
||||
yname="pitch",
|
||||
title="DCM_Pitch_Calibration",
|
||||
fit_order=fit_order,
|
||||
save=save,
|
||||
)
|
||||
|
||||
return fit
|
||||
|
||||
def pitch_analysis_energy(filename, fit_order=3, save=False):
|
||||
"""Fit and plot the DCM pitch calibration."""
|
||||
|
||||
df = get_data(filename)
|
||||
@@ -328,8 +389,8 @@ def ge_edge_analysis(filename, save=False):
|
||||
# ----------------------------------------------------------
|
||||
|
||||
if save:
|
||||
signal_file = bl.env.lut_dir / f"{filename}_signal.png"
|
||||
derivative_file = bl.env.lut_dir / f"{filename}_derivative.png"
|
||||
signal_file = bl.env.daily_setup_dir / "Ge_edge_signal.png"
|
||||
derivative_file = bl.env.daily_setup_dir / "Ge_edge_derivative.png"
|
||||
|
||||
fig1.savefig(signal_file, bbox_inches="tight", dpi=150)
|
||||
fig2.savefig(derivative_file, bbox_inches="tight", dpi=150)
|
||||
@@ -347,25 +408,77 @@ def ge_edge_analysis(filename, save=False):
|
||||
"expected_edge": expected_edge,
|
||||
"measured_edge": measured_edge,
|
||||
"energy_offset": energy_offset,
|
||||
"derivative": derivative,
|
||||
"signal_png": signal_file,
|
||||
"derivative_png": derivative_file,
|
||||
}
|
||||
|
||||
def perp_analysis():
|
||||
def perp_analysis(filename):
|
||||
"""Select the DCM perpendicular translation calibration data."""
|
||||
|
||||
df = get_data()
|
||||
df = get_data(filename)
|
||||
sel = df[['energy','dcm_perp', 'xi_cam_x']]
|
||||
savefile = bl.env.lut_dir / "perp_actual_calc.csv"
|
||||
with open(savefile, 'w', encoding='utf-8') as f:
|
||||
f.write("energy,calc_perp,actual_perp\n")
|
||||
|
||||
conv_factor = 12365.75 / (2 * 3.13481)
|
||||
energies = [8000, 10000, 12400, 15000, 18000, 20000, 22000, 25000]
|
||||
for energy in energies:
|
||||
|
||||
df["costheta"] = np.cos(conv_factor / df["energy"])
|
||||
data = sel[sel['energy']== energy]
|
||||
print(data)
|
||||
|
||||
perp = df[["costheta", "bsccam_x"]]
|
||||
target = 149.4 # value of xi_cam_x at 12.4 keV
|
||||
|
||||
return (
|
||||
perp.to_numpy(),
|
||||
"costheta",
|
||||
"bsccam_x",
|
||||
)
|
||||
x = data["dcm_perp"].to_numpy()
|
||||
y = data["xi_cam_x"].to_numpy()
|
||||
|
||||
# Linear fit: gap = slope * energy + intercept
|
||||
slope, intercept = np.polyfit(x, y, 1)
|
||||
|
||||
# perp_value = intercept/-slope
|
||||
perp_value = (target - intercept)/slope
|
||||
calc_per = calc_perp_position(energy)
|
||||
|
||||
|
||||
with open(savefile, 'a', encoding='utf-8') as f:
|
||||
f.write(f"{energy},{calc_per:.4f},{perp_value:.4f}\n")
|
||||
|
||||
# print(
|
||||
# f"Energy = {energy} eV, "
|
||||
# f"Calculated perp = {calc_per:.4f}, "
|
||||
# f"Actual perp = {perp_value:.4f}"
|
||||
# )
|
||||
|
||||
|
||||
# fig, ax = plt.subplots(figsize = (5,7))
|
||||
# ax.scatter(x,y)
|
||||
# ax.set_title(f"{energy}")
|
||||
|
||||
# # Generate fitted line only over the measured range
|
||||
# x_fit = np.linspace(x.min(), x.max(), 100)
|
||||
# y_fit = slope * x_fit + intercept
|
||||
|
||||
# # # Plot fit first and get its automatically assigned colour
|
||||
# line, = ax.plot(
|
||||
# x_fit,
|
||||
# y_fit,
|
||||
# label=energy,
|
||||
# )
|
||||
# plt.show()
|
||||
|
||||
# return results
|
||||
|
||||
# conv_factor = 12365.75 / (2 * 3.13481)
|
||||
|
||||
# df["costheta"] = np.cos(conv_factor / df["energy"])
|
||||
|
||||
# perp = df[["costheta", "bsccam_x"]]
|
||||
|
||||
# return (
|
||||
# perp.to_numpy(),
|
||||
# "costheta",
|
||||
# "bsccam_x",
|
||||
# )
|
||||
|
||||
|
||||
def roll_analysis():
|
||||
@@ -528,4 +641,5 @@ def gap_analysis(save=False):
|
||||
|
||||
print("}")
|
||||
|
||||
return results
|
||||
return results
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
from collections import defaultdict, deque
|
||||
from enum import Enum
|
||||
|
||||
# from pxii_bec.scripts import beamline_context as bl
|
||||
|
||||
# from enums import BeamlineState, TemperatureMode
|
||||
@@ -74,7 +75,6 @@ class StateChangePlanner:
|
||||
state_name = BeamlineState(state_name)
|
||||
target = self._merged_state(state_name, modifier)
|
||||
|
||||
|
||||
plan = self._plan(target)
|
||||
|
||||
print("PLAN:")
|
||||
@@ -102,7 +102,7 @@ class StateChangePlanner:
|
||||
def available_states(self):
|
||||
"""Return a list of available states"""
|
||||
return list(self.states.keys())
|
||||
|
||||
|
||||
def state_devices(self):
|
||||
"""Return the set of devices that participate in
|
||||
beamline state definitions"""
|
||||
@@ -111,14 +111,13 @@ class StateChangePlanner:
|
||||
|
||||
for state in self.states.values():
|
||||
devices.update(state.keys())
|
||||
|
||||
|
||||
return sorted(devices)
|
||||
|
||||
def get_positions(self):
|
||||
"""Return current positions of devices that are used
|
||||
in state transitions"""
|
||||
return {name: self.devices[name].pos
|
||||
for name in self.state_devices()}
|
||||
return {name: self.devices[name].pos for name in self.state_devices()}
|
||||
|
||||
def print_positions(self):
|
||||
"""Return current state of all devices"""
|
||||
@@ -131,7 +130,7 @@ class StateChangePlanner:
|
||||
"""Return a dict of {device: (before, after)} pairs for devices that changed state"""
|
||||
after = self.get_positions()
|
||||
return {k: (before[k], after[k]) for k in before if before[k] != after[k]}
|
||||
|
||||
|
||||
def __get_closest_states(self):
|
||||
"""
|
||||
Return states ordered by number of mismatches.
|
||||
@@ -148,21 +147,9 @@ class StateChangePlanner:
|
||||
for dev, expected in config.items():
|
||||
|
||||
if not self.devices[dev].is_at(expected):
|
||||
mismatches.append(
|
||||
(
|
||||
dev,
|
||||
self.devices[dev].pos,
|
||||
expected,
|
||||
)
|
||||
)
|
||||
mismatches.append((dev, self.devices[dev].pos, expected))
|
||||
|
||||
results.append(
|
||||
(
|
||||
state.name,
|
||||
len(mismatches),
|
||||
mismatches,
|
||||
)
|
||||
)
|
||||
results.append((state.name, len(mismatches), mismatches))
|
||||
|
||||
return sorted(results, key=lambda x: x[1])
|
||||
|
||||
@@ -173,10 +160,7 @@ class StateChangePlanner:
|
||||
print(f"\n{state}: {count} mismatch(es)")
|
||||
|
||||
for dev, actual, expected in mismatches:
|
||||
print(
|
||||
f" {dev:15s} "
|
||||
f"{actual:10s} -> {expected}"
|
||||
)
|
||||
print(f" {dev:15s} " f"{actual:10s} -> {expected}")
|
||||
|
||||
def current_state(self):
|
||||
"""Return all current matching BeamlineState and TemperatureMode combinations,
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
def beampos_with_en(planner):
|
||||
deltat = 2
|
||||
record_beampos_until("23:00",planner,interval_minutes=deltat)
|
||||
deltat = 2
|
||||
record_beampos_until("23:00", planner, interval_minutes=deltat)
|
||||
bl_energy(6000)
|
||||
record_beampos_until("00:00",planner,interval_minutes=deltat)
|
||||
bl_energy(8000)
|
||||
record_beampos_until("01:00",planner,interval_minutes=deltat)
|
||||
bl_energy(10000)
|
||||
record_beampos_until("02:00",planner,interval_minutes=deltat)
|
||||
record_beampos_until("00:00", planner, interval_minutes=deltat)
|
||||
bl_energy(8000)
|
||||
record_beampos_until("01:00", planner, interval_minutes=deltat)
|
||||
bl_energy(10000)
|
||||
record_beampos_until("02:00", planner, interval_minutes=deltat)
|
||||
bl_energy(12000)
|
||||
record_beampos_until("03:00",planner,interval_minutes=deltat)
|
||||
record_beampos_until("03:00", planner, interval_minutes=deltat)
|
||||
bl_energy(12400)
|
||||
record_beampos_until("04:00",planner,interval_minutes=deltat)
|
||||
record_beampos_until("04:00", planner, interval_minutes=deltat)
|
||||
bl_energy(14000)
|
||||
record_beampos_until("05:00",planner,interval_minutes=deltat)
|
||||
record_beampos_until("05:00", planner, interval_minutes=deltat)
|
||||
bl_energy(16000)
|
||||
record_beampos_until("06:00",planner,interval_minutes=deltat)
|
||||
record_beampos_until("06:00", planner, interval_minutes=deltat)
|
||||
bl_energy(18000)
|
||||
record_beampos_until("07:00",planner,interval_minutes=deltat)
|
||||
record_beampos_until("07:00", planner, interval_minutes=deltat)
|
||||
@@ -63,14 +63,7 @@ def build_devices(yaml_file):
|
||||
return state_devices
|
||||
|
||||
|
||||
def update_position(
|
||||
device,
|
||||
position,
|
||||
value,
|
||||
axis=None,
|
||||
force=False,
|
||||
max_delta=0.5,
|
||||
):
|
||||
def update_position(device, position, value, axis=None, force=False, max_delta=0.5):
|
||||
"""
|
||||
Update a single saved position in memory.
|
||||
|
||||
@@ -189,13 +182,7 @@ def update_positions(updates):
|
||||
return save_and_reload()
|
||||
|
||||
|
||||
def save_current_position(
|
||||
device,
|
||||
position,
|
||||
axis=None,
|
||||
force=False,
|
||||
max_delta=0.5,
|
||||
):
|
||||
def save_current_position(device, position, axis=None, force=False, max_delta=0.5):
|
||||
"""
|
||||
Save the current motor position as a named position.
|
||||
"""
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
from dataclasses import dataclass
|
||||
import numpy as np
|
||||
|
||||
# from pxii_parameters import (EnergyDefaults, CamConversion)
|
||||
|
||||
|
||||
@@ -60,9 +61,7 @@ def convert_to_degrees(angle_mrad: float) -> float:
|
||||
return np.rad2deg(angle_mrad / 1000)
|
||||
|
||||
|
||||
def create_conversion_result(
|
||||
energy_ev: float, wavelength: float, bragg_angle_mrad: float
|
||||
) -> dict:
|
||||
def create_conversion_result(energy_ev: float, wavelength: float, bragg_angle_mrad: float) -> dict:
|
||||
"""
|
||||
Creates a dictionary containing converted values of energy and angles.
|
||||
|
||||
@@ -226,9 +225,7 @@ def validate_energy(energy_ev):
|
||||
return energy_ev
|
||||
|
||||
|
||||
def convert_from_bragg(
|
||||
bragg_angle_mrad: float, temp=120, print_result: bool = False
|
||||
) -> dict:
|
||||
def convert_from_bragg(bragg_angle_mrad: float, temp=120, print_result: bool = False) -> dict:
|
||||
"""
|
||||
Convert the Bragg angle to wavelength and energy, returning the result as a dictionary.
|
||||
|
||||
@@ -274,9 +271,7 @@ def convert_from_energy(energy_ev: float, temp=120, print_result: bool = False)
|
||||
"""
|
||||
energy_ev = validate_energy(energy_ev)
|
||||
wavelength = calculate_wavelength_from_energy(energy_ev)
|
||||
bragg_angle_mrad = float(
|
||||
calculate_bragg_angle_from_wavelength(wavelength, temp=temp)
|
||||
)
|
||||
bragg_angle_mrad = float(calculate_bragg_angle_from_wavelength(wavelength, temp=temp))
|
||||
result = create_conversion_result(energy_ev, wavelength, bragg_angle_mrad)
|
||||
if print_result:
|
||||
print_conversion_result(result)
|
||||
@@ -284,9 +279,7 @@ def convert_from_energy(energy_ev: float, temp=120, print_result: bool = False)
|
||||
|
||||
|
||||
def convert_from_wavelength(
|
||||
wavelength: float,
|
||||
temp: float = 120,
|
||||
print_result: bool = False,
|
||||
wavelength: float, temp: float = 120, print_result: bool = False
|
||||
) -> dict:
|
||||
"""
|
||||
Convert a given wavelength value into corresponding energy, Bragg angle, and
|
||||
@@ -312,19 +305,14 @@ def convert_from_wavelength(
|
||||
outside of the permitted range, returns None.
|
||||
"""
|
||||
energy_ev = calculate_energy_from_wavelength(wavelength)
|
||||
bragg_angle_mrad = float(
|
||||
calculate_bragg_angle_from_wavelength(wavelength, temp=temp)
|
||||
)
|
||||
bragg_angle_mrad = float(calculate_bragg_angle_from_wavelength(wavelength, temp=temp))
|
||||
result = create_conversion_result(energy_ev, wavelength, bragg_angle_mrad)
|
||||
if print_result:
|
||||
print_conversion_result(result)
|
||||
return result
|
||||
|
||||
|
||||
def calc_perp_position(
|
||||
energy_ev: float,
|
||||
print_result: bool = False,
|
||||
) -> float:
|
||||
def calc_perp_position(energy_ev: float, beam_offset = None, print_result: bool = False) -> float:
|
||||
"""
|
||||
Calculate the perpendicular motor position based on provided energy in electron-volts (eV).
|
||||
|
||||
@@ -344,8 +332,12 @@ def calc_perp_position(
|
||||
None
|
||||
"""
|
||||
result = convert_from_energy(energy_ev, print_result=False)
|
||||
|
||||
if beam_offset is None:
|
||||
beam_offset = EnergyDefaults.beam_offset
|
||||
|
||||
bragg_angle_rad = result["bragg_angle_mrad"] / 1000
|
||||
perp_offset = float(EnergyDefaults.beam_offset / (2 * np.cos(bragg_angle_rad))) - 3
|
||||
perp_offset = float(beam_offset / (2 * np.cos(bragg_angle_rad))) - 3
|
||||
if print_result:
|
||||
print(f"Perp = {perp_offset: .4f}")
|
||||
return perp_offset
|
||||
@@ -355,7 +347,7 @@ def calc_scam_microns(pixels, zoom=1000):
|
||||
"""Convert pixels to microns for the sample camera"""
|
||||
return float(pixels / (CamConversion.a * np.exp(CamConversion.b * zoom)))
|
||||
|
||||
|
||||
def calc_sscam_microns(pixels):
|
||||
"""Convert pixels to microns for the ss camera"""
|
||||
return pixels*20
|
||||
|
||||
return pixels * 20
|
||||
@@ -8,35 +8,172 @@ import numpy as np
|
||||
import pandas as pd
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
from pxii_bec.scripts import beamline_context as bl
|
||||
from pxii_bec.macros.beamline_planner import BeamlineState
|
||||
|
||||
# def compute_norm(n_readings=5):
|
||||
# """Average normalized BPM X/Y from repeated sets of four channels."""
|
||||
|
||||
# xn_values = []
|
||||
# yn_values = []
|
||||
def compute_norm_ss(n_readings=5):
|
||||
"""Average normalized BPM X/Y from repeated sets of four channels."""
|
||||
|
||||
# for _ in range(n_readings):
|
||||
# bpm1 = dev.bcu_bpm1.read()["bcu_bpm1"]["value"]
|
||||
# bpm2 = dev.bcu_bpm2.read()["bcu_bpm2"]["value"]
|
||||
# bpm3 = dev.bcu_bpm3.read()["bcu_bpm3"]["value"]
|
||||
# bpm4 = dev.bcu_bpm4.read()["bcu_bpm4"]["value"]
|
||||
xn_values = []
|
||||
yn_values = []
|
||||
for _ in range(n_readings):
|
||||
bpm1 = dev.ss_bpm1.read()["ss_bpm1"]["value"]
|
||||
bpm2 = dev.ss_bpm2.read()["ss_bpm2"]["value"]
|
||||
bpm3 = dev.ss_bpm3.read()["ss_bpm3"]["value"]
|
||||
bpm4 = dev.ss_bpm4.read()["ss_bpm4"]["value"]
|
||||
|
||||
# total = bpm1 + bpm2 + bpm3 + bpm4
|
||||
total = bpm1 + bpm2 + bpm3 + bpm4
|
||||
|
||||
# if total == 0:
|
||||
# continue
|
||||
if total == 0:
|
||||
continue
|
||||
|
||||
# xn = ((bpm1 + bpm2) - (bpm3 + bpm4)) / total
|
||||
# yn = ((bpm1 + bpm3) - (bpm2 + bpm4)) / total
|
||||
xn = ((bpm1 + bpm2) - (bpm3 + bpm4)) / total
|
||||
yn = ((bpm1 + bpm3) - (bpm2 + bpm4)) / total
|
||||
|
||||
# xn_values.append(xn)
|
||||
# yn_values.append(yn)
|
||||
xn_values.append(xn)
|
||||
yn_values.append(yn)
|
||||
|
||||
# time.sleep(0.1)
|
||||
time.sleep(0.1)
|
||||
|
||||
# return float(np.mean(xn_values)), float(np.mean(yn_values))
|
||||
return {
|
||||
"ss_Xnorm": float(np.mean(xn_values)),
|
||||
"ss_Ynorm": float(np.mean(yn_values)),
|
||||
}
|
||||
|
||||
|
||||
def compute_norm_lu(n_readings=5):
|
||||
"""Average normalized BPM X/Y from repeated sets of four channels."""
|
||||
|
||||
xn_values = []
|
||||
yn_values = []
|
||||
|
||||
for _ in range(n_readings):
|
||||
bpm1 = dev.lu_bpm1.read()["lu_bpm1"]["value"]
|
||||
bpm2 = dev.lu_bpm2.read()["lu_bpm2"]["value"]
|
||||
bpm3 = dev.lu_bpm3.read()["lu_bpm3"]["value"]
|
||||
bpm4 = dev.lu_bpm4.read()["lu_bpm4"]["value"]
|
||||
|
||||
total = bpm1 + bpm2 + bpm3 + bpm4
|
||||
|
||||
if total == 0:
|
||||
continue
|
||||
|
||||
xn = ((bpm1 + bpm2) - (bpm3 + bpm4)) / total
|
||||
yn = ((bpm1 + bpm3) - (bpm2 + bpm4)) / total
|
||||
|
||||
xn_values.append(xn)
|
||||
yn_values.append(yn)
|
||||
|
||||
time.sleep(0.1)
|
||||
|
||||
return {
|
||||
"lu_Xnorm": float(np.mean(xn_values)),
|
||||
"lu_Ynorm": float(np.mean(yn_values)),
|
||||
}
|
||||
|
||||
|
||||
|
||||
def run_calibration_ss():
|
||||
"""Scan bpm in x and y and record normalised x and y positions"""
|
||||
centred_x = 2.8625
|
||||
centred_y = -1.3874
|
||||
now = datetime.now()
|
||||
fnow = filenow()
|
||||
print(f"moving bpm to {centred_x}, {centred_y}")
|
||||
umv(dev.ss_bpm_y, centred_y)
|
||||
umv(dev.ss_bpm_x, centred_x)
|
||||
|
||||
# # # Calibrate in X
|
||||
# umv(dev.bsf_sl_xsize, 0.3)
|
||||
# umv(dev.bsf_sl_xsize, 0.4)
|
||||
# filename = bl.env.lut_dir / "bpm_calib" / f"ss_bpm_x_{fnow}.csv"
|
||||
# xn_data = []
|
||||
# x_positions = np.linspace(centred_x - 0.3, centred_x + 0.3, 51)
|
||||
# with open(filename, "w", encoding="utf-8") as f:
|
||||
# f.write(f"Xpos,Xnorm,BPM1,BPM2,BPM3,BPM4\n")
|
||||
# for x in x_positions:
|
||||
# umv(dev.ss_bpm_x, x)
|
||||
# print(f"Moving BPM X to {x} mm")
|
||||
# time.sleep(0.2)
|
||||
# xn, yn = compute_norm_ss()
|
||||
# xn_data.append(xn)
|
||||
# with open(filename, "a", encoding="utf-8") as f:
|
||||
# f.write(f"{x},{xn}\n")
|
||||
|
||||
# # Calibrate in Y
|
||||
umv(dev.ss_bpm_x, centred_x)
|
||||
umv(dev.bsf_sl_xsize, 0.3)
|
||||
umv(dev.bsf_sl_ysize, 0.4)
|
||||
filename = bl.env.lut_dir / "bpm_calib" / f"ss_bpm_y_{fnow}.csv"
|
||||
y_positions = np.linspace(centred_y - 0.04, centred_y + 0.04, 41)
|
||||
yn_data = []
|
||||
with open(filename, "w", encoding="utf-8") as f:
|
||||
f.write(f"Ypos,Ynorm,BPM1,BPM2,BPM3,BPM4\n")
|
||||
for y in y_positions:
|
||||
umv(dev.ss_bpm_y, y)
|
||||
print(f"Moving BPM Y to {y} mm")
|
||||
time.sleep(0.2)
|
||||
xn, yn = compute_norm_ss()
|
||||
yn_data.append(yn)
|
||||
with open(filename, "a", encoding="utf-8") as f:
|
||||
f.write(f"{y},{yn}\n")
|
||||
|
||||
umv(dev.ss_bpm_x, centred_x)
|
||||
umv(dev.ss_bpm_y, centred_y)
|
||||
umv(dev.bsf_sl_ysize, 3.0)
|
||||
umv(dev.bsf_sl_xsize, 3.0)
|
||||
|
||||
def run_calibration_lu():
|
||||
"""Scan bpm in x and y and record normalised x and y positions"""
|
||||
centred_x = 2.1816
|
||||
centred_y = 3.0175
|
||||
now = datetime.now()
|
||||
fnow = filenow()
|
||||
print(f"moving bpm to {centred_x}, {centred_y}")
|
||||
umv(dev.lu_bpm_y, centred_y)
|
||||
umv(dev.lu_bpm_x, centred_x)
|
||||
|
||||
# # Calibrate in X
|
||||
# umv(dev.bsf_sl_xsize, 0.3)
|
||||
# umv(dev.bsf_sl_xsize, 0.4)
|
||||
# filename = bl.env.lut_dir / "bpm_calib" / f"lu_bpm_x_{fnow}.csv"
|
||||
# xn_data = []
|
||||
# x_positions = np.linspace(centred_x - 0.3, centred_x + 0.3, 51)
|
||||
# with open(filename, "w", encoding="utf-8") as f:
|
||||
# f.write(f"Xpos,Xnorm\n")
|
||||
# for x in x_positions:
|
||||
# umv(dev.lu_bpm_x, x)
|
||||
# print(f"Moving BPM X to {x} mm")
|
||||
# time.sleep(0.2)
|
||||
# xn, yn = compute_norm_lu()
|
||||
# xn_data.append(xn)
|
||||
# with open(filename, "a", encoding="utf-8") as f:
|
||||
# f.write(f"{x},{xn}\n")
|
||||
|
||||
# # Calibrate in Y
|
||||
umv(dev.lu_bpm_x, centred_x)
|
||||
umv(dev.bsf_sl_xsize, 0.3)
|
||||
umv(dev.bsf_sl_ysize, 0.4)
|
||||
filename = bl.env.lut_dir / "bpm_calib" / f"lu_bpm_y_{fnow}.csv"
|
||||
y_positions = np.linspace(centred_y - 0.04, centred_y + 0.04, 41)
|
||||
yn_data = []
|
||||
with open(filename, "w", encoding="utf-8") as f:
|
||||
f.write(f"Ypos,Ynorm,BPM1,BPM2,BPM3,BPM4\n")
|
||||
for y in y_positions:
|
||||
umv(dev.lu_bpm_y, y)
|
||||
print(f"Moving BPM Y to {y} mm")
|
||||
time.sleep(0.2)
|
||||
xn, yn = compute_norm_lu()
|
||||
yn_data.append(yn)
|
||||
with open(filename, "a", encoding="utf-8") as f:
|
||||
f.write(f"{y},{yn}\n")
|
||||
|
||||
umv(dev.lu_bpm_x, centred_x)
|
||||
umv(dev.lu_bpm_y, centred_y)
|
||||
umv(dev.bsf_sl_ysize, 3.0)
|
||||
umv(dev.bsf_sl_xsize, 3.0)
|
||||
|
||||
def run_calibration(env):
|
||||
"""Scan bpm in x and y and record normalised x and y positions"""
|
||||
centred_x = 0.444
|
||||
@@ -86,27 +223,20 @@ def run_calibration(env):
|
||||
umv(dev.bcu_bpm_y, centred_y)
|
||||
umv(dev.ss_sl_ysize, 3.0)
|
||||
|
||||
def read_bpm_calibration_data(
|
||||
env,
|
||||
x_y,
|
||||
rundate,
|
||||
bpm_name="bcu_bpm",
|
||||
):
|
||||
|
||||
def read_bpm_calibration_data(env, x_y, rundate, bpm_name="bcu_bpm"):
|
||||
"""Read BPM calibration data from CSV."""
|
||||
|
||||
filename = env.lut_dir / f"bpm_calib/{bpm_name}_{x_y}_{rundate}.csv"
|
||||
|
||||
data = np.loadtxt(
|
||||
filename,
|
||||
delimiter=",",
|
||||
skiprows=1,
|
||||
)
|
||||
data = np.loadtxt(filename, delimiter=",", skiprows=1)
|
||||
|
||||
position = data[:, 0]
|
||||
bpm_norm = data[:, 1]
|
||||
|
||||
return position, bpm_norm
|
||||
|
||||
|
||||
# def fit_bpm_linear(env, filename, x_y, plot=True):
|
||||
# """
|
||||
# Fit the linear region of a BPM calibration scan.
|
||||
@@ -200,31 +330,17 @@ def read_bpm_calibration_data(
|
||||
# plt.tight_layout()
|
||||
# plt.show()
|
||||
|
||||
# return result
|
||||
|
||||
|
||||
# return result
|
||||
|
||||
|
||||
def polynomial_calibration(
|
||||
env,
|
||||
x_y,
|
||||
rundate,
|
||||
bpm_name="bcu_bpm",
|
||||
degree=5,
|
||||
signal_limit=0.9,
|
||||
plot=True,
|
||||
env, x_y, rundate, bpm_name="bcu_bpm", degree=5, signal_limit=0.9, plot=True
|
||||
):
|
||||
|
||||
# BPM centre during calibration run
|
||||
bpm_centre = {"x": 0.441,"y": -1.5405,}
|
||||
bpm_centre = {"x": 0.441, "y": -1.5405}
|
||||
|
||||
|
||||
xdata, ydata = read_bpm_calibration_data(
|
||||
env,
|
||||
x_y,
|
||||
rundate=rundate,
|
||||
bpm_name=bpm_name,
|
||||
)
|
||||
xdata, ydata = read_bpm_calibration_data(env, x_y, rundate=rundate, bpm_name=bpm_name)
|
||||
|
||||
# Keep useful BPM range
|
||||
mask = np.abs(ydata) < signal_limit
|
||||
@@ -262,26 +378,13 @@ def polynomial_calibration(
|
||||
print(f" crosshair_bpm_position = None")
|
||||
|
||||
if plot:
|
||||
signal_fit = np.linspace(
|
||||
signal.min(),
|
||||
signal.max(),
|
||||
500,
|
||||
)
|
||||
signal_fit = np.linspace(signal.min(), signal.max(), 500)
|
||||
|
||||
position_fit = np.polyval(coeffs, signal_fit)
|
||||
|
||||
plt.figure(figsize=(7, 5))
|
||||
plt.scatter(
|
||||
ydata,
|
||||
xdata,
|
||||
alpha=0.4,
|
||||
label="Calibration data",
|
||||
)
|
||||
plt.plot(
|
||||
signal_fit,
|
||||
position_fit,
|
||||
label=f"{degree}th-order polynomial",
|
||||
)
|
||||
plt.scatter(ydata, xdata, alpha=0.4, label="Calibration data")
|
||||
plt.plot(signal_fit, position_fit, label=f"{degree}th-order polynomial")
|
||||
|
||||
plt.xlabel(f"BPM {x_y} normalized signal")
|
||||
plt.ylabel(f"BPM {x_y} position (mm)")
|
||||
@@ -292,5 +395,3 @@ def polynomial_calibration(
|
||||
plt.show()
|
||||
|
||||
return coeffs
|
||||
|
||||
|
||||
@@ -5,7 +5,6 @@ from datetime import datetime
|
||||
|
||||
from bec_lib.device import Signal, Positioner
|
||||
|
||||
|
||||
# -------------------------------------------------------------------
|
||||
# Status Enum
|
||||
# -------------------------------------------------------------------
|
||||
|
||||
@@ -1,136 +1,134 @@
|
||||
import numpy as np
|
||||
import math, time
|
||||
import numpy as np
|
||||
import math, time
|
||||
import matplotlib.pyplot as plt
|
||||
import scipy
|
||||
|
||||
########################################################
|
||||
### scan FE slits and check BPMs before and after mirror
|
||||
### scan FE slits and check BPMs before and after mirror
|
||||
########################################################
|
||||
|
||||
def gaussfit(x,y,p):
|
||||
# define a gaussian fitting function where
|
||||
# p[0] = amplitude
|
||||
# p[1] = mean
|
||||
# p[2] = sigma
|
||||
# p[3] = const offset
|
||||
|
||||
fitfct = lambda p, x0: p[0]*np.exp(-(x0-p[1])**2/(2.0*p[2]**2))+p[3]
|
||||
#fitfct = lambda p, x0: p[0]*np.exp(-(x0-p[1])**2/(2.0*p[2]**2))
|
||||
errfct = lambda p, x0,y0: fitfct(p,x0)-y0
|
||||
|
||||
def gaussfit(x, y, p):
|
||||
# define a gaussian fitting function where
|
||||
# p[0] = amplitude
|
||||
# p[1] = mean
|
||||
# p[2] = sigma
|
||||
# p[3] = const offset
|
||||
|
||||
fitfct = lambda p, x0: p[0] * np.exp(-((x0 - p[1]) ** 2) / (2.0 * p[2] ** 2)) + p[3]
|
||||
# fitfct = lambda p, x0: p[0]*np.exp(-(x0-p[1])**2/(2.0*p[2]**2))
|
||||
errfct = lambda p, x0, y0: fitfct(p, x0) - y0
|
||||
|
||||
# guess fit parameters
|
||||
ind0 = np.where(y==max(y))[0]
|
||||
p0=np.c_[max(y), x[ind0], np.std(y), np.mean(y[0:5])]
|
||||
#p0=scipy.c_[max(y), np.where(y==max(y))[0], np.std(y)]
|
||||
# array generation [[]], and taking only one dimens
|
||||
ind0 = np.where(y == max(y))[0]
|
||||
p0 = np.c_[max(y), x[ind0], np.std(y), np.mean(y[0:5])]
|
||||
# p0=scipy.c_[max(y), np.where(y==max(y))[0], np.std(y)]
|
||||
# array generation [[]], and taking only one dimens
|
||||
# fit a gaussian to the correlation function
|
||||
|
||||
#print('p0 = ' , p0)
|
||||
p1, success = scipy.optimize.leastsq(errfct, p0.copy()[0],
|
||||
args=(x,y))
|
||||
# print('p0 = ' , p0)
|
||||
p1, success = scipy.optimize.leastsq(errfct, p0.copy()[0], args=(x, y))
|
||||
|
||||
#plt.figure()
|
||||
bestfit=fitfct(p1,x)
|
||||
#print('************************', x,y)
|
||||
plt.plot(x,y,'r*')
|
||||
plt.plot(x,bestfit,'r-')
|
||||
# plt.figure()
|
||||
bestfit = fitfct(p1, x)
|
||||
# print('************************', x,y)
|
||||
plt.plot(x, y, "r*")
|
||||
plt.plot(x, bestfit, "r-")
|
||||
|
||||
# different fit fct
|
||||
#popt, pcov = curve_fit(fitfct, x, y)
|
||||
#newfit=fitfct(popt,x)
|
||||
#plt.plot(x,newfit,'g+')
|
||||
# popt, pcov = curve_fit(fitfct, x, y)
|
||||
# newfit=fitfct(popt,x)
|
||||
# plt.plot(x,newfit,'g+')
|
||||
|
||||
|
||||
plt.show()
|
||||
|
||||
return bestfit, p1
|
||||
|
||||
def scan_fe_sl(dir = "y"):
|
||||
if dir in ["y","v"]:
|
||||
sdir ="vertical"
|
||||
|
||||
def scan_fe_sl(dir="y"):
|
||||
if dir in ["y", "v"]:
|
||||
sdir = "vertical"
|
||||
fe_size0 = dev.fe_sl_ysize.user_readback.get()
|
||||
print('Closing vertical FE slits to 0.1')
|
||||
print("Closing vertical FE slits to 0.1")
|
||||
umv(dev.fe_sl_ysize, 0.1)
|
||||
s = scans.line_scan(dev.fe_sl_ycen,-1,1, exp_time=02., steps=21, relative=True)
|
||||
s = scans.line_scan(dev.fe_sl_ycen, -1, 1, exp_time=02.0, steps=21, relative=True)
|
||||
time.sleep(0.1)
|
||||
umv(dev.fe_sl_ysize, fe_size0)
|
||||
print(f'Opening {sdir} FE slits to {fe_size0}')
|
||||
if dir in ["x","h"]:
|
||||
sdir ="horizontal"
|
||||
print(f"Opening {sdir} FE slits to {fe_size0}")
|
||||
if dir in ["x", "h"]:
|
||||
sdir = "horizontal"
|
||||
fe_size0 = dev.fe_sl_xsize.user_readback.get()
|
||||
print('Closing horizontal FE slits to 0.1')
|
||||
print("Closing horizontal FE slits to 0.1")
|
||||
umv(dev.fe_sl_xsize, 0.1)
|
||||
s = scans.line_scan(dev.fe_sl_xcen,-1,1, exp_time=02., steps=21, relative=True)
|
||||
s = scans.line_scan(dev.fe_sl_xcen, -1, 1, exp_time=02.0, steps=21, relative=True)
|
||||
time.sleep(0.1)
|
||||
umv(dev.fe_sl_xsize, fe_size0)
|
||||
print(f'Opening {sdir} FE slits to {fe_size0}')
|
||||
print(f"Opening {sdir} FE slits to {fe_size0}")
|
||||
else:
|
||||
print('no valid direction, doing nothing')
|
||||
|
||||
def mirrh(dir='y'):
|
||||
|
||||
#dat_ss = read_data_csv("/home/anuschka/SS_pitch2p94.csv")
|
||||
#dat_bcu = read_data_csv("/home/anuschka/BCU_pitch2p94.csv")
|
||||
print("no valid direction, doing nothing")
|
||||
|
||||
|
||||
def mirrh(dir="y"):
|
||||
|
||||
# dat_ss = read_data_csv("/home/anuschka/SS_pitch2p94.csv")
|
||||
# dat_bcu = read_data_csv("/home/anuschka/BCU_pitch2p94.csv")
|
||||
|
||||
scan_fe_sl(dir=dir)
|
||||
ind = -1
|
||||
if dir in ["x","h"]:
|
||||
slitmot = 'fe_sl_xcen'
|
||||
if dir in ["y","v"]:
|
||||
slitmot = 'fe_sl_ycen'
|
||||
|
||||
dat_ss = save_data(ind, slitmot, 'ss_bpmsum', isave = 0)
|
||||
dat_bcu = save_data(ind, slitmot, 'bcu_bpmsum', isave = 0)
|
||||
|
||||
if dir in ["x", "h"]:
|
||||
slitmot = "fe_sl_xcen"
|
||||
if dir in ["y", "v"]:
|
||||
slitmot = "fe_sl_ycen"
|
||||
|
||||
data_xs = dat_ss[0] # csv would be: dat_ss[:, 0]
|
||||
dat_ss = save_data(ind, slitmot, "ss_bpmsum", isave=0)
|
||||
dat_bcu = save_data(ind, slitmot, "bcu_bpmsum", isave=0)
|
||||
|
||||
data_xs = dat_ss[0] # csv would be: dat_ss[:, 0]
|
||||
data_ys = dat_ss[1]
|
||||
|
||||
|
||||
data_xb = dat_bcu[0]
|
||||
data_yb = dat_bcu[1]
|
||||
|
||||
#plt.figure()
|
||||
# plt.figure()
|
||||
|
||||
#plt.plot(data_xs, data_ys, "*")
|
||||
#plt.plot(data_xb, data_yb, "+")
|
||||
# plt.plot(data_xs, data_ys, "*")
|
||||
# plt.plot(data_xb, data_yb, "+")
|
||||
|
||||
data_ys_norm = data_ys/max(data_ys) # looks better than data_ys/sum(data_ys)
|
||||
data_yb_norm = data_yb/max(data_yb)
|
||||
data_ys_norm = data_ys / max(data_ys) # looks better than data_ys/sum(data_ys)
|
||||
data_yb_norm = data_yb / max(data_yb)
|
||||
|
||||
plt.figure()
|
||||
|
||||
plt.plot(data_xs, data_ys_norm, "*")
|
||||
plt.plot(data_xb, data_yb_norm, "+")
|
||||
|
||||
|
||||
y= data_ys_norm
|
||||
xm = np.where(y==max(y))[0]
|
||||
y = data_ys_norm
|
||||
xm = np.where(y == max(y))[0]
|
||||
xmi = data_xs[xm]
|
||||
#print('xm, xmi', xm, xmi)
|
||||
# print('xm, xmi', xm, xmi)
|
||||
|
||||
pf1 = [1, xmi , np.std(data_ys_norm), np.mean(y[0:5])] # bg = 0
|
||||
fit_s, ps = gaussfit(data_xs,data_ys_norm, pf1)
|
||||
pf1 = [1, xmi, np.std(data_ys_norm), np.mean(y[0:5])] # bg = 0
|
||||
fit_s, ps = gaussfit(data_xs, data_ys_norm, pf1)
|
||||
|
||||
y= data_yb_norm
|
||||
xm = np.where(y==max(y))[0]
|
||||
y = data_yb_norm
|
||||
xm = np.where(y == max(y))[0]
|
||||
xmi = data_xb[xm]
|
||||
#print('xm, xmi', xm, xmi)
|
||||
# print('xm, xmi', xm, xmi)
|
||||
|
||||
pf2 = [1, xmi, np.std(data_yb_norm), np.mean(y[0:5])] # bg = -11
|
||||
fit_b, pb = gaussfit(data_xb,data_yb_norm, pf2)
|
||||
|
||||
fit_b, pb = gaussfit(data_xb, data_yb_norm, pf2)
|
||||
|
||||
plt.figure()
|
||||
|
||||
plt.plot(data_xs, fit_s-ps[3], "*")
|
||||
plt.plot(data_xs, fit_s-ps[3])
|
||||
plt.plot(data_xb, fit_b-pb[3], "+")
|
||||
plt.plot(data_xb, fit_b-pb[3])
|
||||
plt.plot(data_xs, fit_s - ps[3], "*")
|
||||
plt.plot(data_xs, fit_s - ps[3])
|
||||
plt.plot(data_xb, fit_b - pb[3], "+")
|
||||
plt.plot(data_xb, fit_b - pb[3])
|
||||
|
||||
print('Fit Params of First BPM, SS, ps', ps)
|
||||
print('Fit Params of Second BPM, BCU, pb', pb)
|
||||
print("Fit Params of First BPM, SS, ps", ps)
|
||||
print("Fit Params of Second BPM, BCU, pb", pb)
|
||||
print()
|
||||
if abs(ps[1]-pb[1]) > 0.05:
|
||||
print('***** WARNING ******, mirror height not ok')
|
||||
if abs(ps[2]-pb[2]) > 0.05:
|
||||
print('***** WARNING ******, mirror not catching full beam')
|
||||
|
||||
if abs(ps[1] - pb[1]) > 0.05:
|
||||
print("***** WARNING ******, mirror height not ok")
|
||||
if abs(ps[2] - pb[2]) > 0.05:
|
||||
print("***** WARNING ******, mirror not catching full beam")
|
||||
@@ -0,0 +1,29 @@
|
||||
def create_daily_setup():
|
||||
dock = bec.gui.new("DailySetup")
|
||||
# plot1 = dock.new(widget="Waveform", object_name= "Plot_1")
|
||||
# plot2 = dock.new(widget="Waveform", object_name= "Plot_2", relative_to="Plot_1", where="bottom")
|
||||
# plot3 = dock.new(widget="Waveform", object_name= "Plot_3", relative_to = "Plot_2", where="bottom")
|
||||
# plot4 = dock.new(widget="Waveform", object_name= "Plot_4", relative_to="Plot_1", where="right")
|
||||
# plot5 = dock.new(widget="Waveform", object_name= "Plot_5", relative_to="Plot_2", where="right")
|
||||
# plot6 = dock.new(widget="Waveform", object_name= "Plot_6", relative_to="Plot_3", where="right")
|
||||
# log = dock.new(widget="TextBox", object_name= "Info", relative_to="Plot_1",where="left")
|
||||
# progress = dock.new(widget="TextBox", object_name= "Progress", relative_to="Info", where="left")
|
||||
progress = dock.new(widget="TextBox", object_name= "Progress")
|
||||
log = dock.new(widget="TextBox", object_name= "Info", relative_to="Progress", where ="right")
|
||||
plot1 = dock.new(widget="Waveform", object_name= "Plot_1", relative_to="Info", where ="right")
|
||||
plot2 = dock.new(widget="Waveform", object_name= "Plot_2", relative_to="Plot_1", where="right")
|
||||
plot3 = dock.new(widget="Waveform", object_name= "Plot_3", relative_to = "Plot_1", where="bottom")
|
||||
plot4 = dock.new(widget="Waveform", object_name= "Plot_4", relative_to="Plot_2", where="bottom")
|
||||
plot5 = dock.new(widget="Waveform", object_name= "Plot_5", relative_to = "Plot_3", where="bottom")
|
||||
plot6 = dock.new(widget="Waveform", object_name= "Plot_6", relative_to="Plot_4", where="bottom")
|
||||
dock.set_layout_ratios(
|
||||
horizontal=[1,2,1.2,1.2],
|
||||
vertical=[1,1,1],
|
||||
)
|
||||
|
||||
progress.set_plain_text("")
|
||||
log.set_plain_text("")
|
||||
|
||||
dock.save_profile()
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
"""
|
||||
This module manages the initialization of devices."""
|
||||
|
||||
#from guards import attach_guards
|
||||
#from policies import attach_policies
|
||||
#from build_devices import build_devices
|
||||
# from guards import attach_guards
|
||||
# from policies import attach_policies
|
||||
# from build_devices import build_devices
|
||||
|
||||
|
||||
class DeviceManager:
|
||||
|
||||
@@ -11,7 +11,7 @@ def en_plothist(hindex: int, signal_name: str, isave=1):
|
||||
s=scans.line_scan(dev.dcm_bragg, 178.5, 179.5, steps=240, relative=False
|
||||
data_x, data_y = en_plothist(-1,"bcu_bpmsum")
|
||||
|
||||
scanned with
|
||||
scanned with
|
||||
scans.line_scan(dev.aerotech.y,-0.05,0.05, steps=101, settling_time=0.5, relative=True)
|
||||
"""
|
||||
|
||||
@@ -21,54 +21,56 @@ def en_plothist(hindex: int, signal_name: str, isave=1):
|
||||
|
||||
if hindex < 0:
|
||||
h = bec.history[hindex]
|
||||
print('by scan number')
|
||||
print("by scan number")
|
||||
else:
|
||||
h = bec.history.get_by_scan_number(hindex)
|
||||
print('by scan number')
|
||||
print("by scan number")
|
||||
|
||||
md = h.metadata["bec"]
|
||||
sno = md['dataset_number']
|
||||
sno = md["dataset_number"]
|
||||
print(f"number of scan = {sno}")
|
||||
scanvar = list(md["args"].keys())[0] # string, returns the variable of the last performed scan
|
||||
#scanvar = list(md["args"].keys())[0] # string, returns the variable of the last performed scan
|
||||
# data = h.devices[device_name][signal].read()["value"]
|
||||
# data_x = h.devices.dcm_pitch.dcm_pitch.read()["value"]
|
||||
# data_y = h.devices.lu_bpmsum.lu_bpmsum.read()["value"]
|
||||
# data_x = h.devices[device_name][device_name].read()["value"]
|
||||
|
||||
# that works ...
|
||||
#print(list(md['args'].keys()))
|
||||
val = list(md['args'].keys())
|
||||
#val[0] = 'aerotech.x'
|
||||
devicenam = val[0]
|
||||
print('device = ', devicenam)
|
||||
# that works ...
|
||||
# print(list(md['args'].keys()))
|
||||
## val = list(md["args"].keys()) no longer !!!!! to be checked !!!
|
||||
# val[0] = 'aerotech.x'
|
||||
##devicenam = val[0]
|
||||
##print("device = ", devicenam)
|
||||
devicenam = md["scan_report_devices"][0].decode()
|
||||
|
||||
|
||||
data_xd = md["positions"] # last scan knows which device ... however, double array
|
||||
data_x = data_xd.flatten()
|
||||
print("dx = ", data_x)
|
||||
#data_y = h.devices[signal_name][signal_name].read()["value"]
|
||||
# data_y = h.devices[signal_name][signal_name].read()["value"]
|
||||
data_y1 = h.devices["bcu_bpmsum"]["bcu_bpmsum"].read()["value"]
|
||||
data_y2 = h.devices["ss_bpmsum"]["ss_bpmsum"].read()["value"]
|
||||
|
||||
#print("dy = ", data_y)
|
||||
|
||||
data_y = data_y1/data_y2
|
||||
rev = 0
|
||||
#if val[0][9] == 'x':
|
||||
# print("dy = ", data_y)
|
||||
|
||||
data_y = data_y1 / data_y2
|
||||
rev = 0
|
||||
# if val[0][9] == 'x':
|
||||
# rev = 1
|
||||
smoothplotgrad(data_x, data_y, reverse = rev)
|
||||
# g, xm = justfit(data_x, data_y, model=model, ibg=ibg)
|
||||
smoothplotgrad(data_x, data_y, reverse=rev)
|
||||
# g, xm = justfit(data_x, data_y, model=model, ibg=ibg)
|
||||
|
||||
# plt.ion()
|
||||
# plt.figure()
|
||||
# plt.plot(data_x, data_y, "*")
|
||||
# plt.plot(data_x, g.best_fit)
|
||||
# plt.xlabel(scanvar)
|
||||
# plt.ylabel(signal_name)
|
||||
# plt.show()
|
||||
# plt.ion()
|
||||
# plt.figure()
|
||||
# plt.plot(data_x, data_y, "*")
|
||||
# plt.plot(data_x, g.best_fit)
|
||||
# plt.xlabel(scanvar)
|
||||
# plt.ylabel(signal_name)
|
||||
# plt.show()
|
||||
|
||||
# gcen = g.pars["center"].value
|
||||
# gcen = g.pars["center"].value
|
||||
|
||||
|
||||
if isave:
|
||||
if isave:
|
||||
ans = "n"
|
||||
ans = input("Store data in csv file? y/n ")
|
||||
if ans == "y":
|
||||
@@ -79,5 +81,4 @@ def en_plothist(hindex: int, signal_name: str, isave=1):
|
||||
with open(filename, "w") as f:
|
||||
np.savetxt(f, combined, delimiter=",", fmt="%.9e")
|
||||
|
||||
|
||||
return data_x, data_y
|
||||
@@ -3,8 +3,9 @@
|
||||
|
||||
# if you know the attribute you are searching for:
|
||||
|
||||
|
||||
def check_attr(obj, attr):
|
||||
# att as string
|
||||
# att as string
|
||||
|
||||
attr = getattr(obj, attr)
|
||||
|
||||
@@ -13,7 +14,9 @@ def check_attr(obj, attr):
|
||||
print("values:", attr.values())
|
||||
print("items:", attr.items())
|
||||
|
||||
# Automatically Detect All Dictionary Attributes:
|
||||
|
||||
# Automatically Detect All Dictionary Attributes:
|
||||
|
||||
|
||||
def list_dict_attr_single(obj):
|
||||
for attr_name, value in vars(obj).items():
|
||||
@@ -22,8 +25,9 @@ def list_dict_attr_single(obj):
|
||||
print(" Keys:", list(value.keys()))
|
||||
print(" Items:")
|
||||
for key, val in value.items():
|
||||
print(f" {key} -> {val}")
|
||||
|
||||
print(f" {key} -> {val}")
|
||||
|
||||
|
||||
# Also Handle Nested Dictionaries:
|
||||
|
||||
|
||||
@@ -34,16 +38,11 @@ def list_dict_attr(obj):
|
||||
print(" " * indent + str(key) + ":", end=" ")
|
||||
if isinstance(value, dict):
|
||||
print()
|
||||
print_dict(value, indent+1)
|
||||
print_dict(value, indent + 1)
|
||||
else:
|
||||
print(value)
|
||||
|
||||
print(value)
|
||||
|
||||
for attr_name, value in vars(obj).items():
|
||||
if isinstance(value, dict):
|
||||
print(f"\nDictionary attribute: {attr_name}")
|
||||
print_dict(value)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,131 +1,132 @@
|
||||
#!/usr/bin/env python
|
||||
# ### PYTHON pro to determine the flux from the current
|
||||
# ### on a Si diode
|
||||
# ### A Pauluhn, Dec 2012
|
||||
# ### from IDL pro flux_diode.pro (2010)
|
||||
# ### PYTHON pro to determine the flux from the current
|
||||
# ### on a Si diode
|
||||
# ### A Pauluhn, Dec 2012
|
||||
# ### from IDL pro flux_diode.pro (2010)
|
||||
|
||||
|
||||
## NOTE: for TRANSFER DIODE:
|
||||
## switch off ANY ambient light
|
||||
## note that: 10 um Si, and 0 um Al for transfer diode Hamamatsu
|
||||
## switch off ANY ambient light
|
||||
## note that: 10 um Si, and 0 um Al for transfer diode Hamamatsu
|
||||
|
||||
# ### import the standard
|
||||
import os, sys, string, time
|
||||
# ### import the standard
|
||||
import os, sys, string, time
|
||||
import re
|
||||
import numpy as np
|
||||
import math
|
||||
|
||||
|
||||
|
||||
|
||||
def fluxcalc(curr, en, t_air, t_si, t_al):
|
||||
|
||||
#------ parameters:
|
||||
rsi = 2.33 # g/cm^3 density of Si
|
||||
ral = 2.699 # g/cm^3 density of Al
|
||||
rair = 1.205e-3 # g/cm^3 density of air
|
||||
# ------ parameters:
|
||||
rsi = 2.33 # g/cm^3 density of Si
|
||||
ral = 2.699 # g/cm^3 density of Al
|
||||
rair = 1.205e-3 # g/cm^3 density of air
|
||||
|
||||
eps_si = 3.62 # eV , energy req for charge separation in Si (el/hole pair)
|
||||
e = 1.602e-19 # As , elem charge
|
||||
eps_si = 3.62 # eV , energy req for charge separation in Si (el/hole pair)
|
||||
e = 1.602e-19 # As , elem charge
|
||||
|
||||
t_si = 0.0012 # thickness of diode in cm (==12 micrometres) ; [*10000]
|
||||
t_al = 0.002 # thickness of diode in cm (==20 micrometres)
|
||||
t_al = 0.002 # thickness of diode in cm (==20 micrometres)
|
||||
|
||||
#--------- calc----------------------------------------------------
|
||||
#energy deposit in Silicon
|
||||
#ratio of photoelectric cross section to density for Silicon
|
||||
#alog10(A_Si)= 4.158 - 2.238*alog10(Ep) - 0.477*alog10(Ep)^2 + 0.0789*alog10(Ep)^3
|
||||
# --------- calc----------------------------------------------------
|
||||
# energy deposit in Silicon
|
||||
# ratio of photoelectric cross section to density for Silicon
|
||||
# alog10(A_Si)= 4.158 - 2.238*alog10(Ep) - 0.477*alog10(Ep)^2 + 0.0789*alog10(Ep)^3
|
||||
|
||||
ps = np.poly1d([0.0789, - 0.477, - 2.238, 4.158])
|
||||
#print ps
|
||||
# ps.c
|
||||
# print ps(2.3)
|
||||
ps = np.poly1d([0.0789, -0.477, -2.238, 4.158])
|
||||
# print ps
|
||||
# ps.c
|
||||
# print ps(2.3)
|
||||
|
||||
leval = math.log10(en)
|
||||
hlp_si = ps(leval)
|
||||
a_si = np.pow(10, hlp_si)
|
||||
#efact = np.exp(-A_Si*rsi*t_Si)
|
||||
#sifact =1 - efact
|
||||
sifact = - np.expm1(-a_si*rsi*t_si)
|
||||
#print 'sifact = ', sifact
|
||||
leval = math.log10(en)
|
||||
hlp_si = ps(leval)
|
||||
a_si = np.pow(10, hlp_si)
|
||||
# efact = np.exp(-A_Si*rsi*t_Si)
|
||||
# sifact =1 - efact
|
||||
sifact = -np.expm1(-a_si * rsi * t_si)
|
||||
# print 'sifact = ', sifact
|
||||
|
||||
fl = 1000.*curr * eps_si/1.602/en/sifact *1.e13 # curr expected in A
|
||||
#print 'fl = ', fl
|
||||
fl = 1000.0 * curr * eps_si / 1.602 / en / sifact * 1.0e13 # curr expected in A
|
||||
# print 'fl = ', fl
|
||||
|
||||
# Aluminium attenuation
|
||||
# ratio of photoelectric cross section to density for Aluminium
|
||||
pa = np.poly1d([0.0638, -0.413, -2.349, 4.106])
|
||||
|
||||
#Aluminium attenuation
|
||||
#ratio of photoelectric cross section to density for Aluminium
|
||||
pa = np.poly1d([ 0.0638, - 0.413, - 2.349, 4.106])
|
||||
|
||||
hlp_al = pa(leval)
|
||||
a_al = pow(10, hlp_al)
|
||||
a_al = pow(10, hlp_al)
|
||||
|
||||
# attenuation due to aluminium
|
||||
alfact = np.exp(-a_al*ral*t_al)
|
||||
#print 'alfact = ', alfact
|
||||
alfact = np.exp(-a_al * ral * t_al)
|
||||
# print 'alfact = ', alfact
|
||||
# Air attenuation
|
||||
# ratio of photoelectric cross section to density for air
|
||||
|
||||
pair = np.poly1d([0.928, - 2.348, - 1.026, 3.153])
|
||||
pair = np.poly1d([0.928, -2.348, -1.026, 3.153])
|
||||
hlp_air = pair(leval)
|
||||
a_air = np.pow(10, hlp_air)
|
||||
a_air = np.pow(10, hlp_air)
|
||||
|
||||
#print('hlp_air, a_air, rair, t_air = ', hlp_air, a_air, rair , t_air)
|
||||
# print('hlp_air, a_air, rair, t_air = ', hlp_air, a_air, rair , t_air)
|
||||
|
||||
# attenuation due to air
|
||||
airfact = np.exp(-a_air*rair*t_air/10.)
|
||||
#airfact = 1.
|
||||
# attenuation due to air
|
||||
airfact = np.exp(-a_air * rair * t_air / 10.0)
|
||||
# airfact = 1.
|
||||
|
||||
|
||||
#print 'airfact = ', airfact
|
||||
#print ' t_air = ', t_air
|
||||
# print 'airfact = ', airfact
|
||||
# print ' t_air = ', t_air
|
||||
|
||||
# total flux from photocurrent
|
||||
fl = fl/alfact/airfact
|
||||
#print 'fl = ', fl
|
||||
# total flux from photocurrent
|
||||
fl = fl / alfact / airfact
|
||||
# print 'fl = ', fl
|
||||
|
||||
return fl
|
||||
|
||||
return fl
|
||||
|
||||
#
|
||||
# Main
|
||||
#
|
||||
|
||||
def flux_x10sa(curr, en, silent = 0):
|
||||
|
||||
def flux_x10sa(curr, en, silent=0):
|
||||
# curr = input('Please enter the current [in A] ')
|
||||
curr = float(curr)
|
||||
if not silent:
|
||||
print('Current = ', curr)
|
||||
print("Current = ", curr)
|
||||
# en = input('Please enter the energy [in keV] ')
|
||||
en = float(en)
|
||||
if not silent:
|
||||
print('Energy = ', en)
|
||||
print("Energy = ", en)
|
||||
## d_det = input('Please enter the detector distance [in mm] ')
|
||||
d_det = dev.det_z.user_readback.get()
|
||||
d_off = 15 ## at X10SA ### input('Please enter the OFFSET of the diode to det surface [in mm] ')
|
||||
|
||||
t_air = float(d_det) + float(d_off)
|
||||
d_off = (
|
||||
15 ## at X10SA ### input('Please enter the OFFSET of the diode to det surface [in mm] ')
|
||||
)
|
||||
|
||||
t_si = 12 # um ## at X10SA
|
||||
t_air = float(d_det) + float(d_off)
|
||||
|
||||
t_si = 12 # um ## at X10SA
|
||||
# t_si = input('Please enter the Si thickness of diode [in um] ') # if not silent:
|
||||
t_si = float(t_si) / 10000. # to cm
|
||||
t_si = float(t_si) / 10000.0 # to cm
|
||||
|
||||
t_al = 20 # um ## at X10SA
|
||||
# t_al = input('Please enter the Al thickness of diode [in um] ')
|
||||
t_al = float(t_al) / 10000. # to cm
|
||||
t_al = 20 # um ## at X10SA
|
||||
# t_al = input('Please enter the Al thickness of diode [in um] ')
|
||||
t_al = float(t_al) / 10000.0 # to cm
|
||||
|
||||
if not silent:
|
||||
print('Air path length (CARE ! add det distance and offset of diode) = ', t_air) # include additional diode distance
|
||||
print(
|
||||
"Air path length (CARE ! add det distance and offset of diode) = ", t_air
|
||||
) # include additional diode distance
|
||||
|
||||
|
||||
fl = fluxcalc(curr, en, t_air,t_si, t_al)
|
||||
fl = fluxcalc(curr, en, t_air, t_si, t_al)
|
||||
if not silent:
|
||||
print( " Diode Current = %.6f A " % curr)
|
||||
print( " Energy = %.4f keV " % en )
|
||||
print(" Diode Current = %.6f A " % curr)
|
||||
print(" Energy = %.4f keV " % en)
|
||||
|
||||
#print( " Thickness of active Si layer = %.4f\t cm " % t_si) #*10000.
|
||||
#print( " Thickness of Al layer in front of diode = %.4f\t cm " % t_al) #*10000.
|
||||
print( " Length of path of air in front of diode = %.4f\t mm " % t_air) #*10000.
|
||||
# print( " Thickness of active Si layer = %.4f\t cm " % t_si) #*10000.
|
||||
# print( " Thickness of Al layer in front of diode = %.4f\t cm " % t_al) #*10000.
|
||||
print(" Length of path of air in front of diode = %.4f\t mm " % t_air) # *10000.
|
||||
|
||||
print (" Flux = %6.2e\t ph/s " % fl)
|
||||
print(" Flux = %6.2e\t ph/s " % fl)
|
||||
|
||||
return fl
|
||||
|
||||
@@ -256,7 +256,7 @@ def bpm2flux(energy=None, bpmsum=None, transm=None):
|
||||
|
||||
"""
|
||||
calibration_min_energy = 6500
|
||||
calibration_max_energy = 21000
|
||||
# calibration_max_energy = 21000
|
||||
|
||||
if energy is None:
|
||||
energy = get_current_energy()
|
||||
@@ -266,14 +266,14 @@ def bpm2flux(energy=None, bpmsum=None, transm=None):
|
||||
# bpmsum = read_av(dev.bcu_bpmsum,10) # do not add to traffic jam
|
||||
|
||||
if transm is None:
|
||||
transm = dev.transm.read()["transm"]["value"]
|
||||
transm = dev.transm.read(cached=True)["transm"]["value"]
|
||||
|
||||
if not calibration_min_energy <= energy <= calibration_max_energy:
|
||||
raise ValueError(
|
||||
f"Energy {energy:.0f} eV is outside the calibrated range "
|
||||
f"{calibration_min_energy:.0f}–"
|
||||
f"{calibration_max_energy:.0f} eV"
|
||||
)
|
||||
# if not calibration_min_energy <= energy <= calibration_max_energy:
|
||||
# raise ValueError(
|
||||
# f"Energy {energy:.0f} eV is outside the calibrated range "
|
||||
# f"{calibration_min_energy:.0f}–"
|
||||
# f"{calibration_max_energy:.0f} eV"
|
||||
# )
|
||||
|
||||
# coeffs = [
|
||||
# 1.06436277e5,
|
||||
@@ -296,3 +296,17 @@ def bpm2flux(energy=None, bpmsum=None, transm=None):
|
||||
)
|
||||
|
||||
return float(flux), float(full_flux)
|
||||
|
||||
def transmission_for_flux(target_flux):
|
||||
"""
|
||||
Calculate the transmission required to give target_flux
|
||||
at the current energy.
|
||||
|
||||
Transmission is returned as a fraction from 0 to 1.
|
||||
"""
|
||||
|
||||
_, full_flux = bpm2flux()
|
||||
|
||||
transmission = target_flux / full_flux
|
||||
|
||||
return float(np.clip(transmission, 0.0, 1.0))
|
||||
@@ -10,7 +10,7 @@ def knife_plothist(hindex: int, signal_name: str, isave=1):
|
||||
Example:
|
||||
data_x, data_y = knife_plothist(-1,"xidode")
|
||||
|
||||
scanned with
|
||||
scanned with
|
||||
scans.line_scan(dev.aerotech.y,-0.05,0.05, steps=101, settling_time=0.5, relative=True)
|
||||
"""
|
||||
|
||||
@@ -20,13 +20,13 @@ def knife_plothist(hindex: int, signal_name: str, isave=1):
|
||||
|
||||
if hindex < 0:
|
||||
h = bec.history[hindex]
|
||||
print('by scan number')
|
||||
print("by scan number")
|
||||
else:
|
||||
h = bec.history.get_by_scan_number(hindex)
|
||||
print('by scan number')
|
||||
print("by scan number")
|
||||
|
||||
md = h.metadata["bec"]
|
||||
sno = md['dataset_number']
|
||||
sno = md["dataset_number"]
|
||||
print(f"number of scan = {sno}")
|
||||
scanvar = list(md["args"].keys())[0] # string, returns the variable of the last performed scan
|
||||
# data = h.devices[device_name][signal].read()["value"]
|
||||
@@ -34,37 +34,36 @@ def knife_plothist(hindex: int, signal_name: str, isave=1):
|
||||
# data_y = h.devices.lu_bpmsum.lu_bpmsum.read()["value"]
|
||||
# data_x = h.devices[device_name][device_name].read()["value"]
|
||||
|
||||
# that works ...
|
||||
#print(list(md['args'].keys()))
|
||||
val = list(md['args'].keys())
|
||||
#val[0] = 'aerotech.x'
|
||||
devicenam = val[0]
|
||||
print('device = ', devicenam)
|
||||
# that works ...
|
||||
# print(list(md['args'].keys()))
|
||||
val = list(md["args"].keys())
|
||||
# val[0] = 'aerotech.x'
|
||||
devicenam = val[0]
|
||||
print("device = ", devicenam)
|
||||
data_xd = md["positions"] # last scan knows which device ... however, double array
|
||||
data_x = data_xd.flatten()
|
||||
print("dx = ", data_x)
|
||||
#data_y = h.devices[signal_name][signal_name].read()["value"]
|
||||
data_y = h.devices["xidiode"]["xidiode"].read()["value"]
|
||||
# data_y = h.devices[signal_name][signal_name].read()["value"]
|
||||
data_y = h.devices["xidiode"]["xidiode"].read()["value"]
|
||||
print("dy = ", data_y)
|
||||
|
||||
rev = 0
|
||||
if val[0][9] == 'x':
|
||||
rev = 0
|
||||
if val[0][9] == "x":
|
||||
rev = 1
|
||||
smoothplotgrad(data_x, data_y, reverse = rev)
|
||||
# g, xm = justfit(data_x, data_y, model=model, ibg=ibg)
|
||||
smoothplotgrad(data_x, data_y, reverse=rev)
|
||||
# g, xm = justfit(data_x, data_y, model=model, ibg=ibg)
|
||||
|
||||
# plt.ion()
|
||||
# plt.figure()
|
||||
# plt.plot(data_x, data_y, "*")
|
||||
# plt.plot(data_x, g.best_fit)
|
||||
# plt.xlabel(scanvar)
|
||||
# plt.ylabel(signal_name)
|
||||
# plt.show()
|
||||
# plt.ion()
|
||||
# plt.figure()
|
||||
# plt.plot(data_x, data_y, "*")
|
||||
# plt.plot(data_x, g.best_fit)
|
||||
# plt.xlabel(scanvar)
|
||||
# plt.ylabel(signal_name)
|
||||
# plt.show()
|
||||
|
||||
# gcen = g.pars["center"].value
|
||||
# gcen = g.pars["center"].value
|
||||
|
||||
|
||||
if isave:
|
||||
if isave:
|
||||
ans = "n"
|
||||
ans = input("Store data in csv file? y/n ")
|
||||
if ans == "y":
|
||||
@@ -75,5 +74,4 @@ def knife_plothist(hindex: int, signal_name: str, isave=1):
|
||||
with open(filename, "w") as f:
|
||||
np.savetxt(f, combined, delimiter=",", fmt="%.9e")
|
||||
|
||||
|
||||
return data_x, data_y
|
||||
@@ -0,0 +1 @@
|
||||
,mcauley_k,x10sa-vcons-01.psi.ch,08.10.2026 15:28,file:///home/mcauley_k/.config/libreoffice/4;
|
||||
@@ -0,0 +1 @@
|
||||
,mcauley_k,x10sa-vcons-01.psi.ch,08.10.2026 13:22,file:///home/mcauley_k/.config/libreoffice/4;
|
||||
@@ -0,0 +1,62 @@
|
||||
Energy,Bragg,bcu_bpmsum
|
||||
10953.10,181.54,470.19
|
||||
10957.97,181.46,438.23
|
||||
10962.84,181.38,400.62
|
||||
10967.71,181.30,356.31
|
||||
10972.59,181.22,306.11
|
||||
10977.48,181.13,260.07
|
||||
10982.37,181.05,220.42
|
||||
10987.26,180.97,183.83
|
||||
10992.16,180.89,149.68
|
||||
10997.06,180.81,118.61
|
||||
11001.97,180.73,92.83
|
||||
11006.88,180.64,71.99
|
||||
11011.79,180.56,55.37
|
||||
11016.71,180.48,42.38
|
||||
11021.64,180.40,32.61
|
||||
11026.57,180.32,25.78
|
||||
11031.50,180.24,20.77
|
||||
11036.44,180.16,17.35
|
||||
11041.38,180.07,14.84
|
||||
11046.33,179.99,12.82
|
||||
11051.28,179.91,11.37
|
||||
11056.23,179.83,10.35
|
||||
11061.19,179.75,9.51
|
||||
11066.16,179.67,8.88
|
||||
11071.13,179.59,8.40
|
||||
11076.10,179.50,7.76
|
||||
11081.08,179.42,7.14
|
||||
11086.06,179.34,6.48
|
||||
11091.05,179.26,5.77
|
||||
11096.04,179.18,4.60
|
||||
11101.04,179.10,2.02
|
||||
11106.04,179.01,-0.36
|
||||
11111.05,178.93,-0.44
|
||||
11116.06,178.85,-0.49
|
||||
11121.07,178.77,-0.56
|
||||
11126.09,178.69,-0.61
|
||||
11131.12,178.61,-0.59
|
||||
11136.15,178.53,-0.78
|
||||
11141.18,178.44,-0.69
|
||||
11146.22,178.36,-0.77
|
||||
11151.26,178.28,-0.95
|
||||
11156.31,178.20,-0.89
|
||||
11161.36,178.12,-0.93
|
||||
11166.42,178.04,-0.83
|
||||
11171.48,177.95,-0.80
|
||||
11176.54,177.87,-0.86
|
||||
11181.62,177.79,-0.84
|
||||
11186.69,177.71,-0.84
|
||||
11191.77,177.63,-0.81
|
||||
11196.86,177.55,-0.87
|
||||
11201.95,177.47,-0.81
|
||||
11207.04,177.38,-0.87
|
||||
11212.14,177.30,-0.85
|
||||
11217.24,177.22,-0.87
|
||||
11222.35,177.14,-0.89
|
||||
11227.46,177.06,-0.89
|
||||
11232.58,176.98,-0.98
|
||||
11237.70,176.89,-1.00
|
||||
11242.83,176.81,-0.91
|
||||
11247.96,176.73,-0.94
|
||||
11253.10,176.65,-0.93
|
||||
|
@@ -0,0 +1,42 @@
|
||||
Energy,Bragg,ss_bpmsum,bcu_bpmsum,i1,transmission
|
||||
11003.00,180.71,40337.50,5034.70,-3.155e-08,0.124814
|
||||
11007.91,180.63,37732.95,4708.18,-2.250e-08,0.124776
|
||||
11012.83,180.55,34281.68,4266.30,-3.557e-08,0.124448
|
||||
11017.75,180.46,30615.46,3784.28,-1.949e-08,0.123607
|
||||
11022.67,180.38,26805.50,3293.21,-2.652e-08,0.122856
|
||||
11027.60,180.30,22925.68,2777.94,-4.461e-08,0.121172
|
||||
11032.54,180.22,19156.72,2341.29,-3.356e-08,0.122218
|
||||
11037.47,180.14,15677.61,1953.26,-3.456e-08,0.124589
|
||||
11042.42,180.06,12596.19,1561.34,-2.853e-08,0.123954
|
||||
11047.36,179.98,9918.65,1227.28,-2.351e-08,0.123734
|
||||
11052.32,179.89,7733.56,966.71,-4.260e-08,0.125003
|
||||
11057.27,179.81,5977.05,749.14,-2.954e-08,0.125336
|
||||
11062.23,179.73,4610.51,573.09,-3.155e-08,0.124301
|
||||
11067.20,179.65,3555.33,435.38,-3.758e-08,0.122458
|
||||
11072.17,179.57,2781.84,332.98,-3.255e-08,0.119699
|
||||
11077.14,179.49,2220.76,256.63,-3.758e-08,0.115557
|
||||
11082.12,179.40,1810.15,200.61,-2.552e-08,0.110823
|
||||
11087.11,179.32,1511.84,158.34,-3.255e-08,0.104733
|
||||
11092.09,179.24,1291.08,122.44,-2.753e-08,0.094832
|
||||
11097.09,179.16,1134.07,85.85,4.825e-06,0.075699
|
||||
11102.08,179.08,1016.08,26.46,1.285e-06,0.026045
|
||||
11107.09,179.00,927.11,1.40,-3.959e-08,0.001512
|
||||
11112.09,178.92,851.57,0.96,-3.657e-08,0.001123
|
||||
11117.10,178.83,790.39,0.71,-3.657e-08,0.000900
|
||||
11122.12,178.75,741.22,0.76,-3.858e-08,0.001029
|
||||
11127.14,178.67,701.79,0.69,-3.858e-08,0.000981
|
||||
11132.16,178.59,669.60,0.61,-3.858e-08,0.000907
|
||||
11137.19,178.51,643.20,0.52,-4.763e-08,0.000803
|
||||
11142.23,178.43,621.27,0.48,-3.758e-08,0.000771
|
||||
11147.27,178.35,601.54,0.48,-3.959e-08,0.000794
|
||||
11152.31,178.26,585.43,0.35,-4.763e-08,0.000592
|
||||
11157.36,178.18,565.35,0.36,-3.255e-08,0.000640
|
||||
11162.41,178.10,548.24,0.40,-3.858e-08,0.000726
|
||||
11167.47,178.02,530.61,0.33,-2.250e-08,0.000621
|
||||
11172.53,177.94,516.14,0.36,-4.562e-08,0.000707
|
||||
11177.60,177.86,502.31,0.16,-3.054e-08,0.000326
|
||||
11182.67,177.77,481.54,0.28,-4.763e-08,0.000577
|
||||
11187.74,177.69,458.78,0.00,-2.853e-08,0.000007
|
||||
11192.82,177.61,442.42,0.07,-5.064e-08,0.000160
|
||||
11197.91,177.53,420.53,0.02,-2.753e-08,0.000050
|
||||
11203.00,177.45,401.79,-0.06,-3.255e-08,-0.000153
|
||||
|
@@ -0,0 +1,62 @@
|
||||
Energy,Bragg,ss_bpmsum,bcu_bpmsum,transmission
|
||||
11087.00,179.33,38560.26,4535.26,0.117615
|
||||
11087.50,179.32,38275.33,4463.22,0.116608
|
||||
11088.00,179.31,37999.53,4402.33,0.115852
|
||||
11088.50,179.30,37721.18,4343.98,0.115160
|
||||
11088.99,179.29,37433.34,4282.19,0.114395
|
||||
11089.49,179.28,37162.01,4224.25,0.113671
|
||||
11089.99,179.28,36904.09,4161.01,0.112752
|
||||
11090.49,179.27,36648.40,4089.77,0.111595
|
||||
11090.99,179.26,36323.22,4012.69,0.110472
|
||||
11091.49,179.25,36017.72,3929.25,0.109092
|
||||
11091.99,179.24,35694.92,3845.33,0.107728
|
||||
11092.49,179.24,35384.70,3760.69,0.106280
|
||||
11092.99,179.23,35063.40,3678.15,0.104900
|
||||
11093.49,179.22,34734.79,3590.19,0.103360
|
||||
11093.99,179.21,34414.03,3499.21,0.101680
|
||||
11094.48,179.20,34086.77,3403.19,0.099839
|
||||
11094.98,179.19,33768.33,3300.05,0.097726
|
||||
11095.48,179.19,33447.18,3189.84,0.095369
|
||||
11095.98,179.18,33094.10,3068.68,0.092726
|
||||
11096.48,179.17,32745.61,2944.15,0.089910
|
||||
11096.98,179.16,32377.90,2807.15,0.086699
|
||||
11097.48,179.15,31997.60,2661.17,0.083168
|
||||
11097.98,179.15,31669.44,2509.51,0.079241
|
||||
11098.48,179.14,31301.86,2342.72,0.074843
|
||||
11098.98,179.13,30946.58,2168.22,0.070063
|
||||
11099.48,179.12,30599.35,1976.57,0.064595
|
||||
11099.98,179.11,30238.94,1777.62,0.058786
|
||||
11100.48,179.11,29827.78,1551.64,0.052020
|
||||
11100.98,179.10,29476.59,1319.85,0.044776
|
||||
11101.48,179.09,29100.97,1068.57,0.036719
|
||||
11101.98,179.08,28749.53,815.70,0.028373
|
||||
11102.48,179.07,28376.86,577.46,0.020350
|
||||
11102.98,179.06,27983.70,363.72,0.012998
|
||||
11103.48,179.06,27609.67,201.28,0.007290
|
||||
11103.98,179.05,27256.50,93.88,0.003444
|
||||
11104.48,179.04,26875.74,37.45,0.001394
|
||||
11104.98,179.03,26496.50,13.07,0.000493
|
||||
11105.48,179.02,26113.35,5.24,0.000200
|
||||
11105.98,179.02,25731.34,2.71,0.000105
|
||||
11106.48,179.01,25355.73,2.30,0.000091
|
||||
11106.98,179.00,24961.87,1.74,0.000070
|
||||
11107.48,178.99,24564.77,1.50,0.000061
|
||||
11107.98,178.98,24188.86,1.34,0.000055
|
||||
11108.48,178.97,23802.97,1.42,0.000059
|
||||
11108.98,178.97,23424.93,1.32,0.000056
|
||||
11109.48,178.96,23028.96,1.20,0.000052
|
||||
11109.99,178.95,22653.38,1.05,0.000047
|
||||
11110.49,178.94,22255.46,0.98,0.000044
|
||||
11110.99,178.93,21872.37,0.91,0.000041
|
||||
11111.49,178.93,21461.83,0.86,0.000040
|
||||
11111.99,178.92,21102.15,0.76,0.000036
|
||||
11112.49,178.91,20718.33,0.72,0.000035
|
||||
11112.99,178.90,20363.01,0.66,0.000033
|
||||
11113.49,178.89,19982.21,0.64,0.000032
|
||||
11113.99,178.88,19623.79,0.57,0.000029
|
||||
11114.49,178.88,19255.10,0.56,0.000029
|
||||
11114.99,178.87,18913.77,0.49,0.000026
|
||||
11115.50,178.86,18561.76,0.54,0.000029
|
||||
11116.00,178.85,18178.33,0.53,0.000029
|
||||
11116.50,178.84,17847.83,0.44,0.000024
|
||||
11117.00,178.84,17486.73,0.48,0.000028
|
||||
|
@@ -0,0 +1,42 @@
|
||||
Energy,Bragg,ss_bpmsum,bcu_bpmsum,transmission
|
||||
11003.00,180.71,39854.34,5135.60,0.128859
|
||||
11007.91,180.63,37192.26,4756.05,0.127877
|
||||
11012.83,180.55,34019.56,4326.89,0.127188
|
||||
11017.75,180.46,30427.58,3878.67,0.127472
|
||||
11022.67,180.38,26633.96,3368.52,0.126474
|
||||
11027.60,180.30,22820.00,2854.62,0.125093
|
||||
11032.54,180.22,19140.74,2436.85,0.127312
|
||||
11037.47,180.14,15684.96,1992.82,0.127053
|
||||
11042.42,180.06,12620.92,1595.40,0.126409
|
||||
11047.36,179.98,9966.27,1272.07,0.127637
|
||||
11052.32,179.89,7781.57,998.18,0.128274
|
||||
11057.27,179.81,6015.60,772.56,0.128426
|
||||
11062.23,179.73,4630.19,586.27,0.126618
|
||||
11067.20,179.65,3571.05,441.95,0.123758
|
||||
11072.17,179.57,2779.62,332.68,0.119686
|
||||
11077.14,179.49,2211.73,253.72,0.114715
|
||||
11082.12,179.40,1796.12,194.46,0.108265
|
||||
11087.11,179.32,1494.90,146.82,0.098212
|
||||
11092.09,179.24,1287.16,101.68,0.078999
|
||||
11097.09,179.16,1118.17,35.77,0.031992
|
||||
11102.08,179.08,989.75,1.87,0.001892
|
||||
11107.09,179.00,896.34,1.43,0.001593
|
||||
11112.09,178.92,821.20,1.06,0.001293
|
||||
11117.10,178.83,761.17,0.86,0.001135
|
||||
11122.12,178.75,714.76,0.70,0.000980
|
||||
11127.14,178.67,679.67,0.61,0.000890
|
||||
11132.16,178.59,648.22,0.58,0.000899
|
||||
11137.19,178.51,615.42,0.41,0.000660
|
||||
11142.23,178.43,595.71,0.35,0.000590
|
||||
11147.27,178.35,585.79,0.36,0.000606
|
||||
11152.31,178.26,561.83,0.28,0.000495
|
||||
11157.36,178.18,541.53,0.31,0.000567
|
||||
11162.41,178.10,526.27,0.23,0.000435
|
||||
11167.47,178.02,506.37,0.19,0.000376
|
||||
11172.53,177.94,485.59,0.12,0.000238
|
||||
11177.60,177.86,470.40,0.16,0.000341
|
||||
11182.67,177.77,449.74,0.08,0.000184
|
||||
11187.74,177.69,430.29,0.03,0.000063
|
||||
11192.82,177.61,407.55,0.07,0.000167
|
||||
11197.91,177.53,388.94,0.07,0.000178
|
||||
11203.00,177.45,373.55,0.10,0.000264
|
||||
|
@@ -0,0 +1,62 @@
|
||||
Energy,Bragg,ss_bpmsum,bcu_bpmsum,transmission
|
||||
11087.00,179.33,40803.39,4923.21,0.120657
|
||||
11087.50,179.32,40632.73,4872.86,0.119925
|
||||
11088.00,179.31,40434.30,4822.80,0.119275
|
||||
11088.50,179.30,40234.38,4773.51,0.118643
|
||||
11088.99,179.29,40033.04,4719.28,0.117885
|
||||
11089.49,179.28,39790.80,4665.41,0.117248
|
||||
11089.99,179.28,39643.25,4613.48,0.116375
|
||||
11090.49,179.27,39445.42,4562.87,0.115676
|
||||
11090.99,179.26,39261.94,4506.05,0.114769
|
||||
11091.49,179.25,39036.39,4442.76,0.113811
|
||||
11091.99,179.24,38813.22,4370.94,0.112615
|
||||
11092.49,179.24,38567.29,4298.37,0.111451
|
||||
11092.99,179.23,38327.95,4226.19,0.110264
|
||||
11093.49,179.22,38047.01,4148.71,0.109042
|
||||
11093.99,179.21,37755.27,4065.48,0.107680
|
||||
11094.48,179.20,37502.19,3971.56,0.105902
|
||||
11094.98,179.19,37253.79,3865.72,0.103767
|
||||
11095.48,179.19,36959.52,3760.99,0.101760
|
||||
11095.98,179.18,36698.11,3647.32,0.099387
|
||||
11096.48,179.17,36424.81,3528.30,0.096865
|
||||
11096.98,179.16,36123.06,3406.20,0.094294
|
||||
11097.48,179.15,35824.28,3277.61,0.091491
|
||||
11097.98,179.15,35526.06,3140.40,0.088397
|
||||
11098.48,179.14,35257.47,2991.72,0.084853
|
||||
11098.98,179.13,34954.34,2834.08,0.081080
|
||||
11099.48,179.12,34632.96,2655.23,0.076668
|
||||
11099.98,179.11,34339.50,2471.89,0.071984
|
||||
11100.48,179.11,34007.19,2259.99,0.066456
|
||||
11100.98,179.10,33662.66,2033.69,0.060414
|
||||
11101.48,179.09,33330.11,1786.32,0.053595
|
||||
11101.98,179.08,32997.13,1524.36,0.046197
|
||||
11102.48,179.07,32674.09,1240.42,0.037963
|
||||
11102.98,179.06,32266.53,951.76,0.029497
|
||||
11103.48,179.06,31933.44,679.88,0.021291
|
||||
11103.98,179.05,31636.60,435.79,0.013775
|
||||
11104.48,179.04,31369.22,249.95,0.007968
|
||||
11104.98,179.03,31027.85,120.78,0.003893
|
||||
11105.48,179.02,30634.91,50.59,0.001651
|
||||
11105.98,179.02,30266.85,18.11,0.000598
|
||||
11106.48,179.01,30028.47,6.72,0.000224
|
||||
11106.98,179.00,29680.09,3.60,0.000121
|
||||
11107.48,178.99,29252.87,2.66,0.000091
|
||||
11107.98,178.98,28968.99,2.14,0.000074
|
||||
11108.48,178.97,28606.73,1.86,0.000065
|
||||
11108.98,178.97,28298.05,1.75,0.000062
|
||||
11109.48,178.96,27894.51,1.59,0.000057
|
||||
11109.99,178.95,27513.24,1.50,0.000055
|
||||
11110.49,178.94,27192.70,1.41,0.000052
|
||||
11110.99,178.93,26814.59,1.44,0.000054
|
||||
11111.49,178.93,26416.19,1.27,0.000048
|
||||
11111.99,178.92,26059.44,1.25,0.000048
|
||||
11112.49,178.91,25677.19,1.18,0.000046
|
||||
11112.99,178.90,25304.06,1.06,0.000042
|
||||
11113.49,178.89,24924.72,1.02,0.000041
|
||||
11113.99,178.88,24519.39,0.98,0.000040
|
||||
11114.49,178.88,24145.24,0.89,0.000037
|
||||
11114.99,178.87,23793.34,0.87,0.000037
|
||||
11115.50,178.86,23402.14,0.86,0.000037
|
||||
11116.00,178.85,23018.34,0.82,0.000035
|
||||
11116.50,178.84,22650.08,0.75,0.000033
|
||||
11117.00,178.84,22289.77,0.75,0.000034
|
||||
|
@@ -0,0 +1,42 @@
|
||||
Energy,Bragg,ss_bpmsum,bcu_bpmsum,transmission
|
||||
11063.00,179.72,41623.66,5536.06,0.133003
|
||||
11064.99,179.69,41032.06,5438.49,0.132542
|
||||
11066.97,179.65,40347.29,5330.93,0.132126
|
||||
11068.96,179.62,39509.59,5209.13,0.131845
|
||||
11070.95,179.59,38586.20,5066.84,0.131312
|
||||
11072.94,179.56,37583.59,4918.55,0.130870
|
||||
11074.93,179.52,36431.57,4748.50,0.130340
|
||||
11076.92,179.49,35194.73,4559.41,0.129548
|
||||
11078.91,179.46,34009.67,4379.38,0.128769
|
||||
11080.90,179.42,32659.75,4160.74,0.127396
|
||||
11082.89,179.39,31263.11,3941.04,0.126061
|
||||
11084.88,179.36,29835.56,3709.27,0.124324
|
||||
11086.88,179.33,28378.22,3472.39,0.122361
|
||||
11088.87,179.29,26821.81,3213.89,0.119824
|
||||
11090.87,179.26,25347.66,2946.04,0.116225
|
||||
11092.86,179.23,23851.62,2660.02,0.111524
|
||||
11094.86,179.20,22343.16,2344.90,0.104949
|
||||
11096.86,179.16,20904.96,2001.88,0.095761
|
||||
11098.86,179.13,19466.62,1602.34,0.082312
|
||||
11100.85,179.10,18046.81,1109.74,0.061492
|
||||
11102.85,179.07,16677.32,503.70,0.030202
|
||||
11104.85,179.03,15405.53,64.00,0.004154
|
||||
11106.85,179.00,14160.19,4.63,0.000327
|
||||
11108.86,178.97,12967.10,3.32,0.000256
|
||||
11110.86,178.94,11840.61,2.65,0.000224
|
||||
11112.86,178.90,10772.04,2.25,0.000209
|
||||
11114.87,178.87,9778.05,1.91,0.000195
|
||||
11116.87,178.84,8896.02,1.72,0.000193
|
||||
11118.88,178.81,8040.33,1.58,0.000196
|
||||
11120.88,178.77,7246.21,1.48,0.000205
|
||||
11122.89,178.74,6527.67,1.31,0.000200
|
||||
11124.90,178.71,5895.60,1.21,0.000205
|
||||
11126.91,178.68,5300.24,1.12,0.000211
|
||||
11128.92,178.64,4771.84,1.00,0.000209
|
||||
11130.93,178.61,4293.77,0.96,0.000225
|
||||
11132.94,178.58,3877.26,0.88,0.000227
|
||||
11134.95,178.54,3486.78,1.04,0.000298
|
||||
11136.96,178.51,3154.25,0.93,0.000296
|
||||
11138.97,178.48,2852.14,0.87,0.000306
|
||||
11140.99,178.45,2595.68,0.83,0.000321
|
||||
11143.00,178.41,2371.33,0.67,0.000284
|
||||
|
@@ -0,0 +1,42 @@
|
||||
Energy,Bragg,ss_bpmsum,bcu_bpmsum,transmission
|
||||
11063.00,179.72,41667.03,5562.96,0.133510
|
||||
11064.99,179.69,41240.92,5482.80,0.132946
|
||||
11066.97,179.65,40665.57,5398.81,0.132761
|
||||
11068.96,179.62,40004.77,5296.21,0.132390
|
||||
11070.95,179.59,39198.19,5173.20,0.131975
|
||||
11072.94,179.56,38308.99,5046.00,0.131718
|
||||
11074.93,179.52,37308.79,4891.96,0.131121
|
||||
11076.92,179.49,36198.94,4717.20,0.130313
|
||||
11078.91,179.46,35098.92,4545.17,0.129496
|
||||
11080.90,179.42,33826.54,4338.63,0.128261
|
||||
11082.89,179.39,32524.71,4129.39,0.126962
|
||||
11084.88,179.36,31194.30,3903.90,0.125148
|
||||
11086.88,179.33,29761.99,3672.08,0.123381
|
||||
11088.87,179.29,28270.14,3419.86,0.120971
|
||||
11090.87,179.26,26795.87,3144.07,0.117334
|
||||
11092.86,179.23,25330.33,2849.29,0.112485
|
||||
11094.86,179.20,23815.25,2525.76,0.106057
|
||||
11096.86,179.16,22366.92,2167.55,0.096909
|
||||
11098.86,179.13,20882.63,1743.30,0.083481
|
||||
11100.85,179.10,19439.42,1212.69,0.062383
|
||||
11102.85,179.07,18039.23,555.41,0.030789
|
||||
11104.85,179.03,16717.41,70.81,0.004235
|
||||
11106.85,179.00,15439.94,3.98,0.000258
|
||||
11108.86,178.97,14174.59,2.53,0.000178
|
||||
11110.86,178.94,12986.81,2.03,0.000156
|
||||
11112.86,178.90,11820.02,1.62,0.000137
|
||||
11114.87,178.87,10770.63,1.37,0.000127
|
||||
11116.87,178.84,9786.64,1.23,0.000125
|
||||
11118.88,178.81,8871.50,1.20,0.000136
|
||||
11120.88,178.77,8014.78,1.10,0.000138
|
||||
11122.89,178.74,7217.88,0.99,0.000137
|
||||
11124.90,178.71,6508.82,0.77,0.000119
|
||||
11126.91,178.68,5862.46,0.69,0.000118
|
||||
11128.92,178.64,5274.38,0.64,0.000121
|
||||
11130.93,178.61,4750.03,0.55,0.000117
|
||||
11132.94,178.58,4265.10,0.37,0.000087
|
||||
11134.95,178.54,3846.43,0.35,0.000091
|
||||
11136.96,178.51,3456.73,0.28,0.000080
|
||||
11138.97,178.48,3116.88,0.37,0.000118
|
||||
11140.99,178.45,2832.64,0.18,0.000063
|
||||
11143.00,178.41,2559.37,0.18,0.000071
|
||||
|
@@ -0,0 +1,42 @@
|
||||
Energy,Bragg,ss_bpmsum,bcu_bpmsum,transmission
|
||||
11063.00,179.72,42766.45,5706.97,0.133445
|
||||
11064.99,179.69,42362.26,5654.93,0.133490
|
||||
11066.97,179.65,41803.16,5542.14,0.132577
|
||||
11068.96,179.62,41174.13,5428.07,0.131832
|
||||
11070.95,179.59,40377.74,5311.25,0.131539
|
||||
11072.94,179.56,39491.34,5188.41,0.131381
|
||||
11074.93,179.52,38488.72,5029.04,0.130663
|
||||
11076.92,179.49,37359.12,4863.41,0.130180
|
||||
11078.91,179.46,36273.09,4688.13,0.129245
|
||||
11080.90,179.42,35001.62,4488.06,0.128224
|
||||
11082.89,179.39,33697.03,4280.96,0.127043
|
||||
11084.88,179.36,32311.73,4058.17,0.125594
|
||||
11086.88,179.33,30905.01,3822.69,0.123691
|
||||
11088.87,179.29,29361.59,3553.22,0.121016
|
||||
11090.87,179.26,27887.20,3273.82,0.117395
|
||||
11092.86,179.23,26398.36,2972.25,0.112592
|
||||
11094.86,179.20,24844.98,2630.87,0.105891
|
||||
11096.86,179.16,23367.16,2246.50,0.096139
|
||||
11098.86,179.13,21824.37,1790.48,0.082041
|
||||
11100.85,179.10,20348.11,1220.85,0.059998
|
||||
11102.85,179.07,18918.98,519.55,0.027462
|
||||
11104.85,179.03,17522.10,54.03,0.003083
|
||||
11106.85,179.00,16196.63,3.72,0.000230
|
||||
11108.86,178.97,14868.96,2.51,0.000169
|
||||
11110.86,178.94,13647.45,1.93,0.000142
|
||||
11112.86,178.90,12456.36,1.56,0.000125
|
||||
11114.87,178.87,11361.93,1.55,0.000137
|
||||
11116.87,178.84,10313.20,1.33,0.000129
|
||||
11118.88,178.81,9359.12,1.24,0.000133
|
||||
11120.88,178.77,8462.53,1.27,0.000150
|
||||
11122.89,178.74,7636.72,1.05,0.000138
|
||||
11124.90,178.71,6880.61,0.96,0.000140
|
||||
11126.91,178.68,6203.29,0.83,0.000134
|
||||
11128.92,178.64,5572.87,0.78,0.000141
|
||||
11130.93,178.61,5016.50,0.64,0.000127
|
||||
11132.94,178.58,4503.12,0.62,0.000138
|
||||
11134.95,178.54,4049.98,0.54,0.000133
|
||||
11136.96,178.51,3653.15,0.48,0.000130
|
||||
11138.97,178.48,3302.12,0.44,0.000133
|
||||
11140.99,178.45,2969.27,0.38,0.000128
|
||||
11143.00,178.41,2685.31,0.35,0.000130
|
||||
|
@@ -0,0 +1,14 @@
|
||||
Energy,I2_in,I2_out
|
||||
30000,-2.406e-08, -1.616e-09
|
||||
28000,-3.529e-08, 1.249e-07
|
||||
26000,-2.202e-08, 5.239e-07
|
||||
24000,-3.019e-08, 1.122e-06
|
||||
22000,-2.61e-08, -3.223e-08
|
||||
20000,-2.508e-08, 9.529e-06
|
||||
18000,-3.019e-08, 4.014e-05
|
||||
16000,-3.631e-08, 8.072e-05
|
||||
14000,-1.998e-08, 0.0001758
|
||||
12000,-1.692e-08, 0.0003101
|
||||
10000,-1.488e-08, 0.0001962
|
||||
8000,-2.202e-08, 4.622e-05
|
||||
6000,-2.917e-08, 4.441e-05
|
||||
|
@@ -0,0 +1,2 @@
|
||||
timestamp,energy_eV,flux_ph_s,beam_start_x_px,beam_start_y_px,vfm_ydr_start_mm,hfm_xd_start_mm,vfm_ydr_final_mm,hfm_xd_final_mm,beam_final_x_um,beam_final_y_um,vfm_y_mm,vfm_ydr_mm,vfm_pitch_mrad,hfm_x_mm,hfm_xd_mm,hfm_pitch_mrad
|
||||
2026-09-20T20:56:20,12400.009895999128,8551180983998.611,992.9837196699019,966.3893864711606,-0.8453499999999963,1.9120150000000038,,1.9120100000000022,0.08792363645093884,0.23523677769901796,-1.5538537499999947,-0.8453549999999908,2.989410000000006,1.4117925000000042,1.9120100000000022,3.0009000000000015
|
||||
|
@@ -0,0 +1,14 @@
|
||||
energy,scan,reason
|
||||
6000,-5.561
|
||||
8000,-5.5432
|
||||
10000,-5.5349
|
||||
12000,-5.5297
|
||||
14000,-5.5268
|
||||
16000,-5.5244
|
||||
18000,-5.5218
|
||||
20000,-5.5203
|
||||
22000,-5.5194
|
||||
24000,-5.519
|
||||
26000,-5.5183
|
||||
28000,-5.5179
|
||||
30000,-5.518
|
||||
|
@@ -0,0 +1,15 @@
|
||||
energy,pitch,lu_Xnorm,lu_Ynorm,ss_Xnorm,ss_Ynorm,bcu_x,bcu_y,samcam_x,samcam_y,zoom=1000.0
|
||||
18500,-5.5278,0.079312,0.031407,0.57597,0.41821,21.95,0.86,0.4968,0.9468
|
||||
19000,-5.5277,0.10892,0.034869,0.672,-0.043649,22.96,0.79,1.274,0.7789
|
||||
19500,-5.5273,0.1123,0.037979,0.65287,0.41444,29.04,0.98,1.399,0.7602
|
||||
20000,-5.527,0.10889,0.042196,0.76301,0.55486,280.03,-0.09,1.669,0.9976
|
||||
20500,-5.5268,0.11885,0.048114,0.94538,0.64762,25.79,1.31,1.943,0.8993
|
||||
21000,-5.5264,0.11568,0.055515,1.157,0.84596,22.99,2.12,2.15,1.261
|
||||
21500,-5.5257,0.10583,0.061478,1.4832,1.0726,22.62,4.43,1.107,2.616
|
||||
22000,-5.5253,0.14069,0.053697,1.1677,0.83326,25.98,7.66,1.164,7.532
|
||||
22500,-5.5251,0.14969,0.059799,1.1592,-0.24509,26.08,6.51,1.278,8.663
|
||||
23000,-5.5247,0.14373,0.075002,1.5391,0.66679,26.93,7.41,1.376,5.2
|
||||
23500,-5.5243,0.14984,0.091189,2.0988,1.5083,27.65,6.24,0.9794,6.096
|
||||
24000,-5.5242,0.14755,0.10074,2.6501,1.955,29.90,6.02,0.9268,5.937
|
||||
24500,-5.5239,0.15082,0.11364,3.4195,2.5418,32.97,4.64,1.019,4.126
|
||||
25000,-5.5237,0.18897,0.10096,2.2261,1.6208,39.12,3.63,2.495,3.873
|
||||
|
@@ -0,0 +1,15 @@
|
||||
energy,pitch,lu_Xnorm,lu_Ynorm,ss_Xnorm,ss_Ynorm,bcu_x,bcu_y,samcam_x,samcam_y,zoom=1000.0
|
||||
6000,-5.5651,0.031085,0.036155,0.0052168,0.0041921,10.75,-1.11,-8.771,-4.583
|
||||
7000,-5.5546,0.026899,0.026529,-0.0073424,0.053473,6.16,-1.84,-0.7224,-2.887
|
||||
8000,-5.5484,0.066689,0.032268,0.005212,0.0042436,7.95,-2.62,0.9412,-3.068
|
||||
9000,-5.5441,0.041593,0.029141,-0.010786,0.042077,12.07,-0.95,-0.5363,-2.653
|
||||
10000,-5.5411,0.042201,0.013278,0.025073,0.053635,13.84,-0.60,1.682,-1.665
|
||||
11000,-5.5382,0.065656,0.022891,0.027213,0.041838,21.11,-0.06,1.831,-3.373
|
||||
12000,-5.5358,0.045707,0.02277,0.021949,0.053366,12.55,0.30,-0.132,-0.07301
|
||||
13000,-5.5344,0.046219,0.014825,0.079975,0.088181,17.28,0.47,0.2965,0.02576
|
||||
14000,-5.5325,0.071565,0.024777,0.096642,0.083641,20.87,0.44,-0.04888,0.1838
|
||||
15000,-5.5313,0.063579,0.021258,0.15225,0.12223,18.18,0.67,0.06056,0.4581
|
||||
16000,-5.5304,0.11033,0.023619,0.2533,0.17271,22.24,0.90,1.668,0.6958
|
||||
17000,-5.529,0.094652,0.026446,0.32328,0.23969,23.89,0.86,0.6903,0.5908
|
||||
18000,-5.5278,0.088299,0.029077,0.57684,0.074821,21.01,0.89,0.9228,0.9236
|
||||
energy,pitch,lu_Xnorm,lu_Ynorm,ss_Xnorm,ss_Ynorm,bcu_x,bcu_y,samcam_x,samcam_y,zoom=1000.0
|
||||
@@ -0,0 +1,14 @@
|
||||
energy,pitch,lu_Xnorm,lu_Ynorm,ss_Xnorm,ss_Ynorm,bcu_x,bcu_y,samcam_x,samcam_y,zoom=1000.0
|
||||
6000,-5.5651,0.031085,0.036155,0.0052168,0.0041921,10.75,-1.11,-8.771,-4.583
|
||||
7000,-5.5546,0.026899,0.026529,-0.0073424,0.053473,6.16,-1.84,-0.7224,-2.887
|
||||
8000,-5.5484,0.066689,0.032268,0.005212,0.0042436,7.95,-2.62,0.9412,-3.068
|
||||
9000,-5.5441,0.041593,0.029141,-0.010786,0.042077,12.07,-0.95,-0.5363,-2.653
|
||||
10000,-5.5411,0.042201,0.013278,0.025073,0.053635,13.84,-0.60,1.682,-1.665
|
||||
11000,-5.5382,0.065656,0.022891,0.027213,0.041838,21.11,-0.06,1.831,-3.373
|
||||
12000,-5.5358,0.045707,0.02277,0.021949,0.053366,12.55,0.30,-0.132,-0.07301
|
||||
13000,-5.5344,0.046219,0.014825,0.079975,0.088181,17.28,0.47,0.2965,0.02576
|
||||
14000,-5.5325,0.071565,0.024777,0.096642,0.083641,20.87,0.44,-0.04888,0.1838
|
||||
15000,-5.5313,0.063579,0.021258,0.15225,0.12223,18.18,0.67,0.06056,0.4581
|
||||
16000,-5.5304,0.11033,0.023619,0.2533,0.17271,22.24,0.90,1.668,0.6958
|
||||
17000,-5.529,0.094652,0.026446,0.32328,0.23969,23.89,0.86,0.6903,0.5908
|
||||
18000,-5.5278,0.088299,0.029077,0.57684,0.074821,21.01,0.89,0.9228,0.9236
|
||||
|
@@ -0,0 +1,28 @@
|
||||
energy,pitch,lu_Xnorm,lu_Ynorm,ss_Xnorm,ss_Ynorm,bcu_x,bcu_y,samcam_x,samcam_y,zoom=1000.0
|
||||
6000,-5.5651,0.031085,0.036155,0.0052168,0.0041921,10.75,-1.11,-8.771,-4.583
|
||||
7000,-5.5546,0.026899,0.026529,-0.0073424,0.053473,6.16,-1.84,-0.7224,-2.887
|
||||
8000,-5.5484,0.066689,0.032268,0.005212,0.0042436,7.95,-2.62,0.9412,-3.068
|
||||
9000,-5.5441,0.041593,0.029141,-0.010786,0.042077,12.07,-0.95,-0.5363,-2.653
|
||||
10000,-5.5411,0.042201,0.013278,0.025073,0.053635,13.84,-0.60,1.682,-1.665
|
||||
11000,-5.5382,0.065656,0.022891,0.027213,0.041838,21.11,-0.06,1.831,-3.373
|
||||
12000,-5.5358,0.045707,0.02277,0.021949,0.053366,12.55,0.30,-0.132,-0.07301
|
||||
13000,-5.5344,0.046219,0.014825,0.079975,0.088181,17.28,0.47,0.2965,0.02576
|
||||
14000,-5.5325,0.071565,0.024777,0.096642,0.083641,20.87,0.44,-0.04888,0.1838
|
||||
15000,-5.5313,0.063579,0.021258,0.15225,0.12223,18.18,0.67,0.06056,0.4581
|
||||
16000,-5.5304,0.11033,0.023619,0.2533,0.17271,22.24,0.90,1.668,0.6958
|
||||
17000,-5.529,0.094652,0.026446,0.32328,0.23969,23.89,0.86,0.6903,0.5908
|
||||
18000,-5.5278,0.088299,0.029077,0.57684,0.074821,21.01,0.89,0.9228,0.9236
|
||||
18500,-5.5278,0.079312,0.031407,0.57597,0.41821,21.95,0.86,0.4968,0.9468
|
||||
19000,-5.5277,0.10892,0.034869,0.672,-0.043649,22.96,0.79,1.274,0.7789
|
||||
19500,-5.5273,0.1123,0.037979,0.65287,0.41444,29.04,0.98,1.399,0.7602
|
||||
20000,-5.527,0.10889,0.042196,0.76301,0.55486,280.03,-0.09,1.669,0.9976
|
||||
20500,-5.5268,0.11885,0.048114,0.94538,0.64762,25.79,1.31,1.943,0.8993
|
||||
21000,-5.5264,0.11568,0.055515,1.157,0.84596,22.99,2.12,2.15,1.261
|
||||
21500,-5.5257,0.10583,0.061478,1.4832,1.0726,22.62,4.43,1.107,2.616
|
||||
22000,-5.5253,0.14069,0.053697,1.1677,0.83326,25.98,7.66,1.164,7.532
|
||||
22500,-5.5251,0.14969,0.059799,1.1592,-0.24509,26.08,6.51,1.278,8.663
|
||||
23000,-5.5247,0.14373,0.075002,1.5391,0.66679,26.93,7.41,1.376,5.2
|
||||
23500,-5.5243,0.14984,0.091189,2.0988,1.5083,27.65,6.24,0.9794,6.096
|
||||
24000,-5.5242,0.14755,0.10074,2.6501,1.955,29.90,6.02,0.9268,5.937
|
||||
24500,-5.5239,0.15082,0.11364,3.4195,2.5418,32.97,4.64,1.019,4.126
|
||||
25000,-5.5237,0.18897,0.10096,2.2261,1.6208,39.12,3.63,2.495,3.873
|
||||
|
@@ -0,0 +1 @@
|
||||
energy,scan,reason
|
||||
|
@@ -0,0 +1 @@
|
||||
energy,lu_bpmsum,lu_Xnorm,lu_Ynorm,samcam_x,samcam_y
|
||||
|
@@ -0,0 +1 @@
|
||||
energy,lu_bpmsum,lu_Xnorm,lu_Ynorm,samcam_x,samcam_y
|
||||
|
@@ -0,0 +1 @@
|
||||
energy,lu_bpmsum,lu_Xnorm,lu_Ynorm,samcam_x,samcam_y
|
||||
|
@@ -0,0 +1 @@
|
||||
energy,gap,lu_bpmsum,lu_Xnorm,lu_Ynorm,samcam_x,samcam_y
|
||||
|
@@ -0,0 +1 @@
|
||||
energy,gap,lu_bpmsum,lu_Xnorm,lu_Ynorm,samcam_x,samcam_y
|
||||
|
@@ -0,0 +1 @@
|
||||
energy,gap,lu_bpmsum,lu_Xnorm,lu_Ynorm,samcam_x,samcam_y
|
||||
|
@@ -0,0 +1,21 @@
|
||||
energy,gap,lu_bpmsum,lu_Xnorm,lu_Ynorm,samcam_x,samcam_y
|
||||
22000,4.5350,44.8,0.232,0.093,5.3,7.1
|
||||
22000,4.5360,46.0,0.230,0.092,5.3,7.2
|
||||
22000,4.5371,48.7,0.223,0.086,5.3,7.4
|
||||
22000,4.5381,52.3,0.216,0.081,5.1,7.6
|
||||
22000,4.5392,56.5,0.205,0.076,5.3,7.8
|
||||
22000,4.5403,61.0,0.199,0.074,5.1,7.9
|
||||
22000,4.5413,65.0,0.193,0.070,5.3,8.0
|
||||
22000,4.5424,69.7,0.188,0.066,5.4,8.2
|
||||
22000,4.5434,74.5,0.181,0.064,5.4,8.3
|
||||
22000,4.5445,79.0,0.179,0.063,5.4,8.4
|
||||
22000,4.5455,83.5,0.177,0.066,5.6,8.5
|
||||
22000,4.5466,88.1,0.175,0.058,5.7,8.7
|
||||
22000,4.5476,92.8,0.173,0.059,5.7,8.8
|
||||
22000,4.5487,96.8,0.172,0.058,5.9,8.9
|
||||
22000,4.5497,101.2,0.171,0.056,6.2,9.0
|
||||
22000,4.5508,105.2,0.175,0.058,6.3,9.1
|
||||
22000,4.5518,109.1,0.173,0.055,6.5,9.2
|
||||
22000,4.5529,112.5,0.174,0.057,6.8,9.3
|
||||
22000,4.5540,115.8,0.177,0.057,7.0,9.4
|
||||
22000,4.5550,120.1,0.181,0.056,7.3,9.5
|
||||
|
@@ -0,0 +1 @@
|
||||
energy,lu_bpmsum,lu_Xnorm,lu_Ynorm,xi_cam_x,xi_cam_y
|
||||
|
@@ -0,0 +1 @@
|
||||
energy,lu_bpmsum,lu_Xnorm,lu_Ynorm,xi_cam_x,xi_cam_y
|
||||
|
@@ -0,0 +1,21 @@
|
||||
energy,lu_bpmsum,lu_Xnorm,lu_Ynorm,xi_cam_x,xi_cam_y
|
||||
22000,44.0,0.231,0.097,151.6,207.8
|
||||
22000,45.2,0.229,0.090,151.7,207.7
|
||||
22000,47.8,0.219,0.085,151.8,207.7
|
||||
22000,51.2,0.211,0.084,151.8,207.7
|
||||
22000,55.3,0.200,0.079,152.0,207.9
|
||||
22000,59.2,0.199,0.075,152.1,208.2
|
||||
22000,63.9,0.191,0.074,152.3,208.3
|
||||
22000,68.3,0.188,0.069,152.5,208.3
|
||||
22000,72.8,0.179,0.067,152.6,208.5
|
||||
22000,77.3,0.180,0.065,152.8,208.7
|
||||
22000,82.3,0.175,0.063,152.9,208.9
|
||||
22000,86.3,0.174,0.063,152.9,209.0
|
||||
22000,90.6,0.175,0.062,153.1,209.1
|
||||
22000,94.9,0.174,0.060,153.2,209.3
|
||||
22000,99.3,0.173,0.059,153.2,209.5
|
||||
22000,102.7,0.177,0.058,153.5,209.6
|
||||
22000,106.3,0.179,0.060,153.7,209.7
|
||||
22000,110.0,0.179,0.059,153.9,210.0
|
||||
22000,113.4,0.182,0.055,154.5,210.1
|
||||
22000,117.0,0.185,0.056,155.2,210.0
|
||||
|
@@ -0,0 +1 @@
|
||||
energy,gap,lu_bpmsum,lu_Xnorm,lu_Ynorm,xi_cam_x,xi_cam_y
|
||||
|
@@ -0,0 +1 @@
|
||||
energy,gap,lu_bpmsum,lu_Xnorm,lu_Ynorm,xi_cam_x,xi_cam_y
|
||||
|
@@ -0,0 +1,21 @@
|
||||
energy,gap,lu_bpmsum,lu_Xnorm,lu_Ynorm,xi_cam_x,xi_cam_y
|
||||
22000,4.5350,45.1,0.229,0.099,151.0,208.2
|
||||
22000,4.5360,46.7,0.229,0.096,151.3,207.8
|
||||
22000,4.5371,49.5,0.218,0.093,151.5,207.8
|
||||
22000,4.5381,53.0,0.206,0.081,151.5,207.7
|
||||
22000,4.5392,57.0,0.203,0.080,151.7,207.8
|
||||
22000,4.5403,61.7,0.194,0.073,151.7,208.1
|
||||
22000,4.5413,66.2,0.190,0.073,151.7,208.2
|
||||
22000,4.5424,71.0,0.183,0.069,151.9,208.4
|
||||
22000,4.5434,75.8,0.177,0.065,152.2,208.4
|
||||
22000,4.5445,80.2,0.175,0.061,152.3,208.7
|
||||
22000,4.5455,85.3,0.174,0.061,152.4,208.6
|
||||
22000,4.5466,90.0,0.172,0.057,152.4,208.8
|
||||
22000,4.5476,94.1,0.171,0.058,152.5,209.1
|
||||
22000,4.5487,98.4,0.170,0.057,152.6,209.3
|
||||
22000,4.5497,102.6,0.170,0.057,152.7,209.5
|
||||
22000,4.5508,106.7,0.173,0.058,152.8,209.6
|
||||
22000,4.5518,110.3,0.174,0.053,153.0,209.9
|
||||
22000,4.5529,114.3,0.175,0.054,153.2,209.9
|
||||
22000,4.5540,118.7,0.179,0.054,153.8,210.1
|
||||
22000,4.5550,122.2,0.181,0.054,154.5,210.2
|
||||
|
@@ -0,0 +1 @@
|
||||
energy,gap,lu_bpmsum,lu_Xnorm,lu_Ynorm,xi_cam_x,xi_cam_y
|
||||
|
@@ -0,0 +1,49 @@
|
||||
energy,dcm_pitch,dcm_perp,lu_bpmsum,lu_Xnorm,lu_Ynorm,bcu_bpmsum,bcu_x,bcu_y,samcam_x,samcam_y
|
||||
8000,-5.55286,0.04620,10382.0,0.379,0.033,18703.1,52.99,-2.43,5.80,-4.14
|
||||
8000,-5.55214,0.07155,10235.3,0.224,0.031,18875.3,32.89,-1.90,3.28,-2.77
|
||||
8000,-5.55106,0.09660,10155.7,0.061,0.028,19050.1,12.94,-1.35,0.74,-1.51
|
||||
8000,-5.55060,0.12182,10114.6,-0.106,0.027,19252.7,-7.66,-1.17,-1.65,-0.76
|
||||
8000,-5.55019,0.14665,10160.7,-0.265,0.026,19396.7,-26.18,-1.09,-3.81,-0.36
|
||||
8000,-5.55156,0.09607,10148.6,0.061,0.031,19026.9,13.57,-2.09,1.09,-3.13
|
||||
10000,-5.54291,0.01022,2145.7,0.395,0.016,1868.8,57.74,-2.20,5.52,-2.71
|
||||
10000,-5.54193,0.03547,2119.8,0.223,0.012,1888.9,35.16,-1.53,3.19,-1.74
|
||||
10000,-5.54112,0.06052,2115.2,0.041,0.010,1901.9,13.97,-0.88,0.97,-0.60
|
||||
10000,-5.53993,0.08536,2125.5,-0.146,0.010,1909.1,-7.71,-0.39,-0.88,0.21
|
||||
10000,-5.53949,0.11065,2135.9,-0.326,0.009,1918.2,-28.53,-0.10,-3.06,0.73
|
||||
10000,-5.54126,0.06029,2112.4,0.038,0.013,1902.3,13.15,-1.30,1.00,-1.26
|
||||
12400,-5.53642,-0.01161,1782.3,0.388,0.022,657.9,277.26,-1.42,16.68,-1.23
|
||||
12400,-5.53584,0.01365,1738.8,0.226,0.022,564.8,278.98,-1.21,17.51,-0.86
|
||||
12400,-5.53465,0.03877,1731.9,0.050,0.021,471.9,279.66,-1.04,17.41,-0.62
|
||||
12400,-5.53410,0.06384,1734.4,-0.126,0.021,386.5,280.28,-0.83,18.10,-0.14
|
||||
12400,-5.53311,0.08874,1732.0,-0.296,0.020,308.4,281.61,-0.73,18.66,-0.46
|
||||
12400,-5.53485,0.03841,1747.4,0.050,0.023,472.2,279.84,-1.26,17.85,-0.81
|
||||
15000,-5.53253,-0.02426,695.1,0.421,0.022,866.3,62.69,-0.41,4.32,-0.26
|
||||
15000,-5.53230,0.00104,674.9,0.253,0.022,861.4,43.33,-0.29,2.93,0.14
|
||||
15000,-5.53088,0.02619,680.6,0.071,0.023,866.8,20.76,-0.07,0.83,0.76
|
||||
15000,-5.53015,0.05115,677.3,-0.114,0.023,865.9,-0.27,0.16,-1.30,1.36
|
||||
15000,-5.52958,0.07602,681.4,-0.292,0.023,870.8,-23.02,0.32,-3.59,1.77
|
||||
15000,-5.53126,0.02545,679.7,0.072,0.024,866.9,20.39,-0.25,0.46,0.23
|
||||
18000,-5.52928,-0.03216,243.5,0.435,0.029,640.6,69.31,-0.13,5.19,0.32
|
||||
18000,-5.52882,-0.00703,239.0,0.274,0.028,631.6,49.69,0.09,3.54,0.90
|
||||
18000,-5.52757,0.01802,238.9,0.097,0.030,629.4,29.03,0.24,3.00,1.11
|
||||
18000,-5.52697,0.04316,238.0,-0.088,0.027,626.1,6.21,0.37,-0.28,1.66
|
||||
18000,-5.52659,0.06831,238.2,-0.264,0.027,617.7,-14.69,0.48,-2.01,1.87
|
||||
18000,-5.52807,0.01776,238.7,0.095,0.029,633.1,27.99,0.08,2.48,0.71
|
||||
20000,-5.52754,-0.03533,149.7,0.435,0.037,527.0,66.01,-0.08,5.24,0.54
|
||||
20000,-5.52694,-0.01034,147.6,0.285,0.043,521.3,47.09,0.16,3.74,1.26
|
||||
20000,-5.52627,0.01477,145.6,0.120,0.042,518.5,26.86,0.26,2.06,1.62
|
||||
20000,-5.52534,0.03981,146.5,-0.055,0.043,519.0,4.67,0.36,-0.09,1.78
|
||||
20000,-5.52508,0.06494,145.3,-0.225,0.042,517.6,-16.06,0.51,-1.62,2.37
|
||||
20000,-5.52659,0.01419,147.6,0.120,0.043,522.5,25.43,0.11,1.45,1.26
|
||||
22000,-5.52673,-0.03786,94.7,0.439,0.053,313.7,67.87,7.18,5.76,6.28
|
||||
22000,-5.52583,-0.01278,94.1,0.300,0.052,317.2,48.70,7.29,3.82,6.87
|
||||
22000,-5.52511,0.01219,93.3,0.150,0.053,318.1,28.92,7.35,1.98,7.38
|
||||
22000,-5.52459,0.03735,91.3,-0.004,0.053,312.0,11.65,7.40,0.96,7.75
|
||||
22000,-5.52372,0.06234,92.6,-0.162,0.051,315.6,-8.83,7.44,-0.71,7.89
|
||||
22000,-5.52560,0.01166,91.8,0.148,0.051,317.4,28.94,7.29,2.31,7.03
|
||||
25000,-5.52520,-0.04066,48.7,0.451,0.079,29.4,77.93,3.13,7.55,3.69
|
||||
25000,-5.52441,-0.01570,47.4,0.338,0.080,28.9,61.02,3.24,6.35,3.91
|
||||
25000,-5.52372,0.00941,47.9,0.200,0.082,29.0,44.01,3.26,4.56,4.15
|
||||
25000,-5.52285,0.03461,47.3,0.061,0.079,28.8,25.60,3.33,1.59,4.69
|
||||
25000,-5.52227,0.05956,47.3,-0.066,0.086,28.3,9.14,3.37,-0.05,4.98
|
||||
25000,-5.52407,0.00896,47.0,0.204,0.089,28.7,44.89,3.06,4.34,4.10
|
||||
|
@@ -0,0 +1,50 @@
|
||||
energy,dcm_pitch,dcm_perp,lu_bpmsum,lu_Xnorm,lu_Ynorm,bcu_bpmsum,bcu_x,bcu_y,samcam_x,samcam_y
|
||||
8000,-5.54961,0.04605,10420.1,0.376,0.029,3631.0,49.15,0.67,11.52,5.97
|
||||
8000,-5.54898,0.07155,10266.3,0.220,0.027,3667.0,29.02,1.31,8.43,7.53
|
||||
8000,-5.54793,0.09656,10161.7,0.059,0.025,3697.5,11.59,1.91,6.77,8.73
|
||||
8000,-5.54753,0.12181,10166.7,-0.108,0.025,3752.0,-7.62,2.08,4.52,9.47
|
||||
8000,-5.54718,0.14661,10209.4,-0.268,0.027,3797.2,-25.53,1.91,2.31,9.32
|
||||
8000,-5.54866,0.09602,10151.4,0.060,0.030,3694.3,11.21,0.85,6.54,6.97
|
||||
10000,-5.53996,0.01018,2146.7,0.395,0.012,4173.7,66.21,1.79,12.24,7.50
|
||||
10000,-5.53888,0.03533,2129.8,0.223,0.012,4200.4,45.58,2.36,10.50,8.66
|
||||
10000,-5.53822,0.06040,2110.5,0.041,0.009,4217.4,23.42,2.99,8.02,9.71
|
||||
10000,-5.53729,0.08533,2123.7,-0.144,0.009,4260.4,1.73,3.14,5.71,9.93
|
||||
10000,-5.53651,0.11049,2146.2,-0.325,0.006,4305.9,-21.45,3.52,4.00,10.60
|
||||
10000,-5.53804,0.06020,2128.3,0.039,0.008,4249.9,22.88,2.71,7.66,9.10
|
||||
12400,-5.53337,-0.01144,1757.7,0.387,0.020,1127.9,58.33,2.14,10.95,9.30
|
||||
12400,-5.53288,0.01365,1743.4,0.225,0.020,1130.1,39.95,2.37,9.01,10.02
|
||||
12400,-5.53198,0.03880,1723.4,0.051,0.020,1129.9,21.41,2.61,7.42,10.79
|
||||
12400,-5.53123,0.06387,1726.8,-0.127,0.020,1140.3,0.12,2.72,4.85,11.23
|
||||
12400,-5.53050,0.08882,1727.8,-0.297,0.020,1142.7,-19.63,2.69,2.72,11.42
|
||||
12400,-5.53219,0.03821,1723.1,0.052,0.022,1130.2,20.94,2.23,7.10,9.85
|
||||
15000,-5.52989,-0.02420,705.4,0.420,0.020,836.9,69.62,2.37,11.75,9.80
|
||||
15000,-5.52923,0.00090,694.1,0.253,0.020,838.2,48.10,2.62,9.44,10.55
|
||||
15000,-5.52836,0.02601,681.9,0.074,0.020,831.4,28.62,2.82,8.14,10.89
|
||||
15000,-5.52743,0.05101,684.3,-0.113,0.020,837.3,6.72,3.04,6.66,11.74
|
||||
15000,-5.52688,0.07591,684.6,-0.288,0.020,837.2,-16.52,3.02,3.41,11.76
|
||||
15000,-5.52865,0.02558,681.3,0.073,0.021,833.9,27.52,2.50,7.92,10.32
|
||||
18000,-5.52676,-0.03221,243.0,0.439,0.026,634.8,75.86,2.82,12.73,10.09
|
||||
18000,-5.52612,-0.00702,238.4,0.278,0.025,626.2,55.97,2.96,11.24,10.60
|
||||
18000,-5.52531,0.01797,236.0,0.102,0.025,626.6,33.48,3.05,8.88,10.80
|
||||
18000,-5.52351,0.04318,243.1,-0.093,0.026,641.4,6.43,3.06,6.04,11.37
|
||||
18000,-5.52377,0.06826,237.3,-0.260,0.025,626.7,-11.72,3.15,4.89,11.57
|
||||
18000,-5.52575,0.01770,237.0,0.100,0.027,630.1,33.64,2.92,9.20,10.65
|
||||
20000,-5.52563,-0.03533,150.2,0.437,0.033,526.3,75.57,2.70,13.15,10.34
|
||||
20000,-5.52511,-0.01018,146.9,0.289,0.038,522.3,55.49,2.87,11.72,10.80
|
||||
20000,-5.52424,0.01472,145.2,0.127,0.038,520.9,35.38,2.91,9.80,11.07
|
||||
20000,-5.52293,0.03993,151.1,-0.055,0.039,526.7,11.34,3.04,7.27,11.70
|
||||
20000,-5.52270,0.06493,143.6,-0.216,0.040,519.3,-9.14,3.19,5.32,12.17
|
||||
20000,-5.52456,0.01452,145.2,0.125,0.039,522.2,34.39,2.85,9.25,10.98
|
||||
22000,-5.52438,-0.03785,95.3,0.442,0.050,307.4,74.28,8.27,13.62,17.13
|
||||
22000,-5.52351,-0.01287,94.0,0.309,0.052,306.3,56.94,8.33,12.47,17.58
|
||||
22000,-5.52293,0.01218,93.2,0.156,0.054,307.2,36.00,8.32,9.40,17.66
|
||||
22000,-5.52198,0.03724,91.8,-0.001,0.053,304.4,16.82,8.36,7.67,18.17
|
||||
22000,-5.52038,0.06232,95.9,-0.166,0.048,323.4,-11.03,8.43,3.74,18.77
|
||||
22000,-5.52334,0.01195,93.4,0.156,0.054,310.4,35.98,8.32,10.02,17.56
|
||||
25000,-5.52259,-0.04064,50.9,0.457,0.078,29.2,82.32,5.17,14.04,13.07
|
||||
25000,-5.52192,-0.01571,49.8,0.333,0.084,28.7,66.11,5.27,12.11,13.34
|
||||
25000,-5.52146,0.00935,49.5,0.200,0.084,28.4,48.09,5.35,9.55,13.67
|
||||
25000,-5.52038,0.03446,48.4,0.067,0.078,28.1,32.60,5.32,7.63,13.82
|
||||
25000,-5.52000,0.05949,47.6,-0.066,0.083,27.7,15.18,5.40,6.00,14.10
|
||||
25000,-5.52198,0.00916,48.5,0.204,0.085,28.1,48.98,5.29,9.77,13.60
|
||||
|
||||
|
@@ -0,0 +1,9 @@
|
||||
energy,calc_perp,actual_perp
|
||||
8000,0.0961,0.1716
|
||||
10000,0.0604,0.1549
|
||||
12400,0.0389,0.1239
|
||||
15000,0.0264,0.1273
|
||||
18000,0.0183,0.1242
|
||||
20000,0.0148,0.1322
|
||||
22000,0.0122,0.1089
|
||||
25000,0.0094,0.1293
|
||||
|
@@ -0,0 +1,7 @@
|
||||
energy,dcm_pitch,dcm_perp,lu_bpms,lu_Xnorm,lu_Ynorm,xi_cam_x,xi_cam_y
|
||||
12400,-5.54257,-0.01078,1691.2,0.385,0.022,154.5,207.5
|
||||
12400,-5.54190,0.01438,1661.5,0.220,0.021,151.8,207.5
|
||||
12400,-5.54071,0.03945,1650.8,0.043,0.021,149.4,207.8
|
||||
12400,-5.54013,0.06453,1660.1,-0.135,0.019,146.7,207.9
|
||||
12400,-5.53943,0.08952,1668.0,-0.309,0.018,144.3,207.8
|
||||
12400,-5.54117,0.03912,1656.2,0.043,0.021,149.4,207.9
|
||||
|
@@ -0,0 +1,37 @@
|
||||
energy,dcm_pitch,dcm_perp,lu_bpms,lu_Xnorm,lu_Ynorm,xi_cam_x,xi_cam_y
|
||||
8000,-5.55530,0.04620,10382.2,0.377,0.034,155.1,206.7
|
||||
8000,-5.55463,0.07151,10210.1,0.224,0.032,152.4,207.1
|
||||
8000,-5.55347,0.09661,10150.2,0.060,0.030,149.9,207.1
|
||||
8000,-5.55318,0.12173,10188.8,-0.105,0.027,147.2,207.1
|
||||
8000,-5.55286,0.14660,10257.9,-0.265,0.026,144.9,207.2
|
||||
8000,-5.55422,0.09602,10208.3,0.062,0.032,149.9,206.8
|
||||
10000,-5.54581,0.01000,2154.1,0.399,0.014,154.9,206.8
|
||||
10000,-5.54492,0.03521,2131.2,0.227,0.012,152.5,207.2
|
||||
10000,-5.54387,0.06022,2124.8,0.043,0.011,149.8,206.9
|
||||
10000,-5.54294,0.08527,2117.4,-0.142,0.010,147.2,207.1
|
||||
10000,-5.54245,0.11042,2132.4,-0.321,0.009,144.6,207.2
|
||||
10000,-5.54396,0.06000,2123.1,0.043,0.015,149.8,206.8
|
||||
12400,-5.53932,-0.01168,1777.2,0.393,0.025,154.7,208.1
|
||||
12400,-5.53857,0.01372,1753.2,0.226,0.023,151.9,208.0
|
||||
12400,-5.53758,0.03879,1741.0,0.051,0.023,149.3,207.8
|
||||
12400,-5.53680,0.06381,1746.4,-0.127,0.022,146.6,207.9
|
||||
12400,-5.53578,0.08885,1735.1,-0.297,0.021,144.3,207.9
|
||||
12400,-5.53784,0.03831,1738.9,0.053,0.024,149.4,207.9
|
||||
15000,-5.53508,-0.02455,702.0,0.424,0.025,155.1,207.9
|
||||
15000,-5.53491,0.00059,688.9,0.258,0.025,152.5,207.9
|
||||
15000,-5.53346,0.02566,686.8,0.076,0.025,149.7,207.5
|
||||
15000,-5.53282,0.05075,673.3,-0.108,0.023,147.2,207.7
|
||||
15000,-5.53201,0.07570,676.5,-0.287,0.023,144.6,207.8
|
||||
15000,-5.53387,0.02524,687.1,0.078,0.026,150.0,207.9
|
||||
18000,-5.53155,-0.03228,247.5,0.441,0.031,155.1,207.5
|
||||
18000,-5.53117,-0.00715,244.3,0.278,0.033,152.4,207.9
|
||||
18000,-5.52992,0.01783,240.1,0.100,0.029,149.9,207.9
|
||||
18000,-5.52894,0.04301,240.7,-0.085,0.029,147.3,207.7
|
||||
18000,-5.52873,0.06809,238.2,-0.259,0.028,144.9,207.9
|
||||
18000,-5.53033,0.01710,241.8,0.101,0.032,149.9,207.7
|
||||
20000,-5.53007,-0.03591,151.9,0.442,0.041,155.5,208.0
|
||||
20000,-5.52940,-0.01040,150.2,0.288,0.042,152.8,207.8
|
||||
20000,-5.52841,0.01479,143.4,0.122,0.045,150.1,207.8
|
||||
20000,-5.52754,0.03992,148.1,-0.056,0.042,147.5,207.7
|
||||
20000,-5.52720,0.06484,147.1,-0.223,0.040,145.0,207.7
|
||||
20000,-5.52897,0.01418,149.5,0.122,0.041,150.2,208.0
|
||||
|
@@ -0,0 +1,7 @@
|
||||
energy,dcm_pitch,dcm_perp,lu_bpms,lu_Xnorm,lu_Ynorm,xi_cam_x,xi_cam_y
|
||||
22000,-5.52975,-0.03800,95.9,0.445,0.057,155.6,208.2
|
||||
22000,-5.52920,-0.01307,95.4,0.305,0.054,153.2,208.1
|
||||
22000,-5.52841,0.01204,94.1,0.155,0.059,150.5,207.8
|
||||
22000,-5.52737,0.03716,91.9,-0.005,0.057,147.8,208.0
|
||||
22000,-5.52685,0.06211,90.4,-0.163,0.055,145.3,208.3
|
||||
22000,-5.52868,0.01139,93.3,0.156,0.058,150.5,207.9
|
||||
|
@@ -0,0 +1,7 @@
|
||||
energy,dcm_pitch,dcm_perp,lu_bpms,lu_Xnorm,lu_Ynorm,xi_cam_x,xi_cam_y
|
||||
25000,-5.52920,-0.09079,52.0,0.654,0.081,164.6,209.6
|
||||
25000,-5.52891,-0.06548,50.5,0.556,0.083,161.6,209.5
|
||||
25000,-5.52778,-0.04040,49.8,0.454,0.092,158.6,209.5
|
||||
25000,-5.52694,-0.01548,49.0,0.332,0.090,155.7,209.5
|
||||
25000,-5.52641,0.00966,47.2,0.207,0.088,152.7,209.4
|
||||
25000,-5.51861,-0.04039,29.1,0.349,0.120,149.6,208.4
|
||||
|
@@ -0,0 +1,6 @@
|
||||
energy,dcm_pitch,dcm_perp,lu_bpms,lu_Xnorm,lu_Ynorm,xi_cam_x,xi_cam_y
|
||||
25000,-5.52807,-0.04030,49.4,0.453,0.083,156.2,208.6
|
||||
25000,-5.52737,-0.01540,49.3,0.331,0.086,153.0,208.6
|
||||
25000,-5.52682,0.00982,47.5,0.208,0.088,150.5,208.3
|
||||
25000,-5.52612,0.03493,46.4,0.075,0.087,148.0,208.2
|
||||
25000,-5.52557,0.05990,47.5,-0.060,0.079,145.4,208.1
|
||||
|
@@ -0,0 +1,7 @@
|
||||
energy,dcm_pitch,dcm_perp,lu_bpms,lu_Xnorm,lu_Ynorm,xi_cam_x,xi_cam_y
|
||||
25000,-5.52821,-0.04084,50.0,0.455,0.088,157.8,209.4
|
||||
25000,-5.52786,-0.01596,49.2,0.338,0.087,155.0,209.1
|
||||
25000,-5.52714,0.00910,48.2,0.205,0.088,152.1,209.2
|
||||
25000,-5.52633,0.03430,47.3,0.074,0.094,149.2,209.0
|
||||
25000,-5.52589,0.05926,46.6,-0.062,0.092,146.4,209.2
|
||||
25000,-5.52743,0.00884,47.8,0.203,0.094,152.1,209.0
|
||||
|
@@ -0,0 +1,14 @@
|
||||
energy,23rd Sep,6th Sep,offset
|
||||
6000,-5.561,-5.5182,-0.0428
|
||||
8000,-5.5432,-5.5032,-0.04
|
||||
10000,-5.5349,-5.4956,-0.039300000000001
|
||||
12000,-5.5297,-5.4906,-0.0391
|
||||
14000,-5.5268,-5.4877,-0.0391
|
||||
16000,-5.5244,-5.4856,-0.0388
|
||||
18000,-5.5218,-5.4833,-0.0385
|
||||
20000,-5.5203,-5.482,-0.0383
|
||||
22000,-5.5194,-5.4807,-0.0387
|
||||
24000,-5.519,-5.4791,-0.0399
|
||||
26000,-5.5183,-5.4791,-0.0392
|
||||
28000,-5.5179,-5.4791,-0.0388
|
||||
30000,-5.518,,
|
||||
|
@@ -0,0 +1,10 @@
|
||||
Roll,Y pos
|
||||
3.000000,532.1747746692758
|
||||
3.375000,646.8383766556484
|
||||
3.750000,758.2370844371503
|
||||
4.125000,870.6457787689487
|
||||
4.500000,980.6793737229799
|
||||
4.875000,1080.7759963202259
|
||||
5.250000,1182.3265384715614
|
||||
5.625000,1290.697731056017
|
||||
6.000000,1376.2798011728055
|
||||
|
@@ -0,0 +1,10 @@
|
||||
Roll,Y pos
|
||||
1.000000,692.942650491312
|
||||
1.875000,755.6432908308136
|
||||
2.750000,819.8962183038443
|
||||
3.625000,883.0441749851776
|
||||
4.500000,944.625963858652
|
||||
5.375000,1004.513235574581
|
||||
6.250000,1061.1821742077382
|
||||
7.125000,1116.371127886505
|
||||
8.000000,1169.189245633994
|
||||
|
@@ -0,0 +1,10 @@
|
||||
Roll,Y pos
|
||||
3.000000,532.1747746692758
|
||||
3.375000,646.8383766556484
|
||||
3.750000,758.2370844371503
|
||||
4.125000,870.6457787689487
|
||||
4.500000,980.6793737229799
|
||||
4.875000,1080.7759963202259
|
||||
5.250000,1182.3265384715614
|
||||
5.625000,1290.697731056017
|
||||
6.000000,1376.2798011728055
|
||||
|
@@ -0,0 +1,10 @@
|
||||
Roll,Y pos
|
||||
1.000000,620.3258474297603
|
||||
1.875000,727.3412656967532
|
||||
2.750000,831.2895400246484
|
||||
3.625000,936.7106895320477
|
||||
4.500000,1039.8208898439514
|
||||
5.375000,1139.02499725308
|
||||
6.250000,1232.640351083367
|
||||
7.125000,1322.7239076386252
|
||||
8.000000,1408.4337046604637
|
||||
|
@@ -0,0 +1,10 @@
|
||||
Roll,Y pos
|
||||
3.000000,367.5626514183679
|
||||
3.250000,490.76539071940647
|
||||
3.500000,614.0409323259951
|
||||
3.750000,734.2089839347528
|
||||
4.000000,854.3453573633882
|
||||
4.250000,969.9637066596362
|
||||
4.500000,1084.8613752711697
|
||||
4.750000,1195.432631465686
|
||||
5.000000,1299.759493848411
|
||||
|
@@ -0,0 +1,10 @@
|
||||
Roll,Y pos
|
||||
1.000000,645.3410172392396
|
||||
1.875000,716.7857063422749
|
||||
2.750000,798.4006801804591
|
||||
3.625000,879.2062486869808
|
||||
4.500000,948.0120679453303
|
||||
5.375000,1010.590100145263
|
||||
6.250000,1067.4532506840437
|
||||
7.125000,1123.6687191435465
|
||||
8.000000,1176.749800578109
|
||||
|
@@ -0,0 +1,10 @@
|
||||
Roll,Y pos
|
||||
2.000000,329.981417633099
|
||||
2.250000,405.3057428861756
|
||||
2.500000,483.27540977301703
|
||||
2.750000,554.0746091974096
|
||||
3.000000,630.9466804651072
|
||||
3.250000,706.8771151250418
|
||||
3.500000,782.8947653437505
|
||||
3.750000,857.5768007188707
|
||||
4.000000,931.2567888482613
|
||||
|
@@ -0,0 +1 @@
|
||||
Roll,Y pos
|
||||
|
@@ -0,0 +1,10 @@
|
||||
Roll,Y pos
|
||||
2.000000,329.981417633099
|
||||
2.250000,405.3057428861756
|
||||
2.500000,483.27540977301703
|
||||
2.750000,554.0746091974096
|
||||
3.000000,630.9466804651072
|
||||
3.250000,706.8771151250418
|
||||
3.500000,782.8947653437505
|
||||
3.750000,857.5768007188707
|
||||
4.000000,931.2567888482613
|
||||
|
@@ -101,11 +101,38 @@ def fit(data, fit_params):
|
||||
params["base_intercept"].set(value=y_min)
|
||||
params["base_slope"].set(value=0)
|
||||
|
||||
# # Add peak-specific parameters
|
||||
# params.update(peak_model.guess(processed_data["y_to_fit"], x=processed_data["x_data"]))
|
||||
|
||||
# # Perform the fitting
|
||||
# lmfit_result = full_model.fit(processed_data["y_to_fit"], params, x=processed_data["x_data"])
|
||||
|
||||
# Add peak-specific parameters
|
||||
params.update(peak_model.guess(processed_data["y_to_fit"], x=processed_data["x_data"]))
|
||||
x_data = np.asarray(processed_data["x_data"])
|
||||
|
||||
params.update(
|
||||
peak_model.guess(
|
||||
processed_data["y_to_fit"],
|
||||
x=x_data,
|
||||
)
|
||||
)
|
||||
|
||||
# Constrain peak width to something physically resolvable by the scan
|
||||
step = np.median(np.diff(np.sort(x_data)))
|
||||
scan_range = np.ptp(x_data)
|
||||
|
||||
if "peak_sigma" in params:
|
||||
params["peak_sigma"].set(
|
||||
min=0.5 * step,
|
||||
max=0.5 * scan_range,
|
||||
)
|
||||
|
||||
# Perform the fitting
|
||||
lmfit_result = full_model.fit(processed_data["y_to_fit"], params, x=processed_data["x_data"])
|
||||
lmfit_result = full_model.fit(
|
||||
processed_data["y_to_fit"],
|
||||
params,
|
||||
x=x_data,
|
||||
)
|
||||
|
||||
# Find the X that gives the max Y
|
||||
max_index = np.argmax(processed_data["y_to_fit"])
|
||||
@@ -125,6 +152,7 @@ def fit(data, fit_params):
|
||||
|
||||
centre_stderr = lmfit_result.params["peak_center"].stderr
|
||||
height_stderr = lmfit_result.params["peak_height"].stderr
|
||||
|
||||
|
||||
snr = height / noise if noise > 0 else np.inf
|
||||
|
||||
@@ -166,8 +194,8 @@ def check_peak_fit(x_data, result, min_fwhm_steps=3):
|
||||
centre = result["centre"]
|
||||
fwhm = result["fwhm"]
|
||||
|
||||
step_size = np.mean(np.diff(x_data))
|
||||
fwhm_steps = result["fwhm"] / abs(step_size)
|
||||
|
||||
fwhm_steps = fwhm / step
|
||||
|
||||
problems = []
|
||||
|
||||
@@ -189,8 +217,19 @@ def check_peak_fit(x_data, result, min_fwhm_steps=3):
|
||||
|
||||
if centre_stderr is None:
|
||||
problems.append("centre uncertainty could not be estimated")
|
||||
elif centre_stderr > 0.2 * fwhm:
|
||||
problems.append(f"centre uncertainty is large " f"({centre_stderr:.3g})")
|
||||
elif centre_stderr > 0.5 * step:
|
||||
problems.append(
|
||||
f"centre uncertainty is large "
|
||||
f"({centre_stderr:.3g}, "
|
||||
f"{centre_stderr / step:.2f} scan steps)"
|
||||
)
|
||||
|
||||
print("FIT DEBUG")
|
||||
print(f"centre : {centre}")
|
||||
print(f"fwhm : {fwhm}")
|
||||
print(f"step : {step}")
|
||||
print(f"fwhm/step : {fwhm / step}")
|
||||
print(f"centre error : {result.get('centre_stderr')}")
|
||||
|
||||
return {"success": not problems, "problems": problems}
|
||||
|
||||
|
||||
@@ -4,104 +4,16 @@ import epics
|
||||
import time
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from pxii_bec.scripts import beamline_context as bl
|
||||
|
||||
# =============================================================================
|
||||
# Camera utilities
|
||||
# =============================================================================
|
||||
|
||||
def read_scintXY(zoom=800, image=False):
|
||||
"""Get the X and Y beam positions from the sample camera at
|
||||
a sepcified zoom. Default zoom is 800"""
|
||||
|
||||
# Target position on sample camera
|
||||
x_target = BeamMove.scint_target_x
|
||||
y_target = BeamMove.scint_target_y
|
||||
|
||||
results = {}
|
||||
|
||||
# Ensure shutter and detector cover are closed before changing states
|
||||
dev.bcu_shutter.put(0)
|
||||
if bl.d["det_cov"].pos != "close":
|
||||
bl.d["det_cov"].move("close")
|
||||
try:
|
||||
# set transmission to 10%
|
||||
current_transm = get_value(dev.transm)
|
||||
if abs(current_transm - 0.1) > 0.01:
|
||||
dev.transm.put(0.1)
|
||||
# set camera zoom
|
||||
if get_value(dev.scam_zoom) != zoom:
|
||||
umv(dev.scam_zoom, zoom)
|
||||
# move to beam visualisation
|
||||
|
||||
if not bl.planner.is_state(BeamlineState.BEAM_VISUALISATION):
|
||||
bl.planner.move_to(BeamlineState.BEAM_VISUALISATION)
|
||||
# open shutter
|
||||
dev.bcu_shutter.put(1)
|
||||
|
||||
# set autoexposure and check there is a reading in the image
|
||||
time.sleep(0.5)
|
||||
auto_exposure(cam="samcam", max_iter=25)
|
||||
time.sleep(0.2)
|
||||
|
||||
max_signal = get_value(dev.samcam_max)
|
||||
results["max_signal"] = max_signal
|
||||
|
||||
if max_signal < BeamMove.min_scint_signal:
|
||||
return {
|
||||
"ok": False,
|
||||
"message": (
|
||||
f"No beam detected on the scintillator "
|
||||
f"(max signal = {max_signal:.0f})"
|
||||
),
|
||||
"max_signal": max_signal,
|
||||
}
|
||||
|
||||
|
||||
x_px = dev.samcam_x.read()["samcam_x"]["value"]
|
||||
y_px = dev.samcam_y.read()["samcam_y"]["value"]
|
||||
results["X_pixels"] = x_px
|
||||
results["Y_pixels"] = y_px
|
||||
|
||||
results["ok"] = True
|
||||
results["message"] = (
|
||||
f"Beam detected at X={x_px:.1f}, Y ={y_px:.1f} px"
|
||||
)
|
||||
|
||||
# Calculate difference from target position
|
||||
diff_x = x_target - x_px
|
||||
diff_y = y_target - y_px
|
||||
results["X_diff_px"] = diff_x
|
||||
results["Y diff_px"] = diff_y
|
||||
|
||||
# Convert to pixels
|
||||
diff_x_mic = calc_scam_microns(diff_x, zoom)
|
||||
diff_y_mic = calc_scam_microns(diff_y, zoom)
|
||||
results["X_diff_microns"] = diff_x_mic
|
||||
results["Y_diff_microns"] = diff_y_mic
|
||||
|
||||
# Measure beamsize
|
||||
x_fwhm, y_fwhm = measure_beamsize()
|
||||
results["X_FWHM"] = x_fwhm
|
||||
results["Y_FWHM"] = y_fwhm
|
||||
|
||||
print(f"Beam position: X = {results['X_pixels']:.1f} px, "
|
||||
f"Y = {results['Y_pixels']:.1f} px\n"
|
||||
f"Distance from crosshair: X = {results['X_diff_microns']:.1f} microns, "
|
||||
f"Y = {results['Y_diff_microns']:.1f} microns\n",
|
||||
f"X size (fwhm) = {results["X_FWHM"]:.1f} microns, "
|
||||
f"Y size (fwhm) = {results["Y_FWHM"]:.1f} microns")
|
||||
|
||||
if image:
|
||||
imagedata = get_cam_image(Cameras.sample)
|
||||
results["image"] = imagedata
|
||||
|
||||
|
||||
return results
|
||||
|
||||
finally:
|
||||
# print("done")
|
||||
dev.bcu_shutter.put(0)
|
||||
|
||||
|
||||
def get_cam_image(prefix):
|
||||
@@ -291,3 +203,5 @@ def create_empty_daily_report(filename):
|
||||
|
||||
return filename
|
||||
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ from typing import Callable, List, Dict, Optional, Union
|
||||
from bec_lib.logger import bec_logger
|
||||
from bec_lib.device import Device
|
||||
|
||||
|
||||
def motor_resolver(bec_name):
|
||||
"""Used to handle aerotech and smargon motors"""
|
||||
|
||||
@@ -24,6 +25,7 @@ def motor_resolver(bec_name):
|
||||
|
||||
raise ValueError(f"Cannot resolve motor for '{bec_name}'")
|
||||
|
||||
|
||||
@dataclass
|
||||
class PositionDevice:
|
||||
"""Generic device that moves between named or numeric positions"""
|
||||
@@ -53,14 +55,20 @@ class PositionDevice:
|
||||
if isinstance(target, str):
|
||||
name = target.lower()
|
||||
try:
|
||||
bec_logger.logger.info(f"attempting to find position {name} from bec device {self.bec_name} userParameter.")
|
||||
bec_logger.logger.info(
|
||||
f"attempting to find position {name} from bec device {self.bec_name} userParameter."
|
||||
)
|
||||
bec_device: Device = dev[self.bec_name]
|
||||
position = bec_device.user_parameter[target]
|
||||
|
||||
bec_logger.logger.info(f"obtained position {position} - compare to cached value {self.positions.get(target)}")
|
||||
bec_logger.logger.info(
|
||||
f"obtained position {position} - compare to cached value {self.positions.get(target)}"
|
||||
)
|
||||
return position
|
||||
except Exception as e:
|
||||
bec_logger.logger.debug(f"Failed to fetch user parameter for device {self.bec_name} and target {target} from bec, falling back to cached position {e}")
|
||||
bec_logger.logger.debug(
|
||||
f"Failed to fetch user parameter for device {self.bec_name} and target {target} from bec, falling back to cached position {e}"
|
||||
)
|
||||
|
||||
if name not in self.positions:
|
||||
raise ValueError(f"Unknown position '{target}'")
|
||||
@@ -100,7 +108,6 @@ class PositionDevice:
|
||||
|
||||
return scans.mv(self.mot_device, pos, relative=False)
|
||||
|
||||
|
||||
# def set_position(self, target: Union[str, float]):
|
||||
# """Only to be used for testing purposes, bypasses guards"""
|
||||
# pos = self._resolve_target(target)
|
||||
@@ -129,5 +136,3 @@ class PositionDevice:
|
||||
|
||||
pos = self._resolve_target(target)
|
||||
return abs(self.actual - pos) <= self.tol
|
||||
|
||||
|
||||
@@ -88,42 +88,126 @@ def mono_pitch_scan(plot=True, window_name="Fitting", plot_widget=None):
|
||||
# Set fine pitch to middle of its' travel range
|
||||
scans.umv(EnergyDefaults.mono_fpitch, pos["dcm_fine_pitch"], relative=False)
|
||||
# Move DCM pitch to starting value
|
||||
scans.umv(EnergyDefaults.mono_pitch, pos["dcm_pitch"]-0.04, relative=False)
|
||||
pitch_offset = dev.dcm_pitch.user_parameter["offset"]
|
||||
scans.umv(EnergyDefaults.mono_pitch, pos["dcm_pitch"]+pitch_offset, relative=False)
|
||||
|
||||
# Go to peak using default parameters from EnergyDefaults
|
||||
if plot:
|
||||
print("Scanning monochromator pitch and moving to peak, with plotting.")
|
||||
result = go_to_peak(
|
||||
EnergyDefaults.mono_pitch,
|
||||
EnergyDefaults.signals["sig1"],
|
||||
-EnergyDefaults.pitch_scan["halfwidth"],
|
||||
EnergyDefaults.pitch_scan["halfwidth"],
|
||||
steps=EnergyDefaults.pitch_scan["steps"],
|
||||
relative=True,
|
||||
settle=0.01,
|
||||
plot=plot,
|
||||
confirm=False,
|
||||
min_fwhm_steps=1.1,
|
||||
window_name=window_name if plot else None,
|
||||
plot_widget=plot_widget if plot else None,
|
||||
)
|
||||
|
||||
extended_scan = False
|
||||
|
||||
if not result["success"]:
|
||||
extended_scan = True
|
||||
|
||||
extended_range = 2 * EnergyDefaults.pitch_scan["halfwidth"]
|
||||
extended_steps = 2 * EnergyDefaults.pitch_scan["steps"]
|
||||
|
||||
print("Scanning monochromator pitch over a broader range.")
|
||||
|
||||
result = go_to_peak(
|
||||
EnergyDefaults.mono_pitch,
|
||||
EnergyDefaults.signals["sig1"],
|
||||
-EnergyDefaults.pitch_scan["halfwidth"],
|
||||
EnergyDefaults.pitch_scan["halfwidth"],
|
||||
steps=EnergyDefaults.pitch_scan["steps"],
|
||||
-extended_range,
|
||||
extended_range,
|
||||
steps=extended_steps,
|
||||
relative=True,
|
||||
settle=0.01,
|
||||
plot=True,
|
||||
plot=plot,
|
||||
confirm=False,
|
||||
min_fwhm_steps=1.1,
|
||||
window_name=window_name,
|
||||
plot_widget=plot_widget,
|
||||
)
|
||||
else:
|
||||
print("Scanning monochromator pitch and moving to peak, without plotting.")
|
||||
result = go_to_peak(
|
||||
EnergyDefaults.mono_pitch,
|
||||
EnergyDefaults.signals["sig1"],
|
||||
-EnergyDefaults.pitch_scan["halfwidth"],
|
||||
EnergyDefaults.pitch_scan["halfwidth"],
|
||||
steps=EnergyDefaults.pitch_scan["steps"],
|
||||
relative=True,
|
||||
settle=0.01,
|
||||
plot=False,
|
||||
min_fwhm_steps=1.5,
|
||||
confirm=False,
|
||||
window_name=window_name if plot else None,
|
||||
plot_widget=plot_widget if plot else None,
|
||||
)
|
||||
|
||||
result["extended_scan"] = extended_scan
|
||||
return result
|
||||
|
||||
# if plot:
|
||||
# print("Scanning monochromator pitch and moving to peak, with plotting.")
|
||||
# result = go_to_peak(
|
||||
# EnergyDefaults.mono_pitch,
|
||||
# EnergyDefaults.signals["sig1"],
|
||||
# -EnergyDefaults.pitch_scan["halfwidth"],
|
||||
# EnergyDefaults.pitch_scan["halfwidth"],
|
||||
# steps=EnergyDefaults.pitch_scan["steps"],
|
||||
# relative=True,
|
||||
# settle=0.01,
|
||||
# plot=True,
|
||||
# confirm=False,
|
||||
# min_fwhm_steps=1.1,
|
||||
# window_name=window_name,
|
||||
# plot_widget=plot_widget,
|
||||
# )
|
||||
# result["extended_scan"] = False
|
||||
|
||||
# if not result["success"]:
|
||||
# extended_range = 2 * EnergyDefaults.pitch_scan["halfwidth"]
|
||||
# extended_steps = 2 * EnergyDefaults.pitch_scan["steps"]
|
||||
# print("Scanning monochromator pitch over a broader range.")
|
||||
# result = go_to_peak(
|
||||
# EnergyDefaults.mono_pitch,
|
||||
# EnergyDefaults.signals["sig1"],
|
||||
# -extended_range,
|
||||
# extended_range,
|
||||
# steps=extended_steps,
|
||||
# relative=True,
|
||||
# settle=0.01,
|
||||
# plot=True,
|
||||
# confirm=False,
|
||||
# min_fwhm_steps=1.1,
|
||||
# window_name=window_name,
|
||||
# plot_widget=plot_widget,
|
||||
# )
|
||||
# result["extended_scan"] = True
|
||||
|
||||
# else:
|
||||
# print("Scanning monochromator pitch and moving to peak, without plotting.")
|
||||
# result = go_to_peak(
|
||||
# EnergyDefaults.mono_pitch,
|
||||
# EnergyDefaults.signals["sig1"],
|
||||
# -EnergyDefaults.pitch_scan["halfwidth"],
|
||||
# EnergyDefaults.pitch_scan["halfwidth"],
|
||||
# steps=EnergyDefaults.pitch_scan["steps"],
|
||||
# relative=True,
|
||||
# settle=0.01,
|
||||
# plot=False,
|
||||
# min_fwhm_steps=1.1,
|
||||
# confirm=False,
|
||||
# )
|
||||
# result["extended_scan"] = False
|
||||
|
||||
# if not result["success"]:
|
||||
# extended_range = 2 * EnergyDefaults.pitch_scan["halfwidth"]
|
||||
# extended_steps = 2 * EnergyDefaults.pitch_scan["steps"]
|
||||
# print("Scanning monochromator pitch over a broader range.")
|
||||
# result2 = go_to_peak(
|
||||
# EnergyDefaults.mono_pitch,
|
||||
# EnergyDefaults.signals["sig1"],
|
||||
# -extended_range,
|
||||
# extended_range,
|
||||
# steps=extended_steps,
|
||||
# relative=True,
|
||||
# settle=0.01,
|
||||
# plot=True,
|
||||
# confirm=False,
|
||||
# min_fwhm_steps=1.1,
|
||||
# )
|
||||
# result["extended_scan"] = True
|
||||
# return result
|
||||
|
||||
|
||||
# Specific functions - need to be edited for each beamline
|
||||
|
||||
@@ -172,12 +256,13 @@ def get_dcm_motors_positions(energy_ev):
|
||||
"""
|
||||
# dcm_motor_values = get_value_from_lut(energy_ev)
|
||||
dcm_motor_values = {}
|
||||
pitch = float(np.poly1d(Calibration.pitch_calib)(energy_ev))
|
||||
# pitch = float(np.poly1d(Calibration.pitch_calib)(energy_ev))
|
||||
# pitch = -5.5
|
||||
fpitch = 5.0
|
||||
roll = EnergyDefaults.mono_roll_value
|
||||
perp = calc_perp_position(energy_ev, print_result=False)
|
||||
bragg_angle = convert_from_energy(energy_ev, print_result=False)["bragg_angle_mrad"]
|
||||
pitch = float(np.poly1d(Calibration.pitch_calib)(bragg_angle))
|
||||
dcm_motor_values.update(
|
||||
{
|
||||
"bragg_angle": bragg_angle,
|
||||
@@ -309,24 +394,36 @@ def bl_energy(
|
||||
# return gap
|
||||
|
||||
|
||||
# def calc_gap(energy_ev, print_result=True):
|
||||
# """Calculate the undulator gap for the given energy."""
|
||||
|
||||
# harmonic_values = Gap.get_harmonic_values(energy_ev)
|
||||
|
||||
# if harmonic_values is None:
|
||||
# return None
|
||||
|
||||
# gap = np.poly1d(harmonic_values)(energy_ev)
|
||||
# gap *= Gap.correction_factor
|
||||
|
||||
# if print_result:
|
||||
# harmonic = Gap.get_harmonic_by_energy(energy_ev)
|
||||
# print(f"Calculated gap is {gap:.3f} mm " f"using {harmonic}")
|
||||
|
||||
# return gap
|
||||
|
||||
def calc_gap(energy_ev, print_result=True):
|
||||
"""Calculate the undulator gap for the given energy."""
|
||||
|
||||
harmonic_values = Gap.get_harmonic_values(energy_ev)
|
||||
|
||||
if harmonic_values is None:
|
||||
return None
|
||||
|
||||
gap = np.poly1d(harmonic_values)(energy_ev)
|
||||
gap *= Gap.correction_factor
|
||||
harmonic, gap = Gap.calculate_gap(energy_ev)
|
||||
|
||||
if print_result:
|
||||
harmonic = Gap.get_harmonic_by_energy(energy_ev)
|
||||
print(f"Calculated gap is {gap:.3f} mm " f"using {harmonic}")
|
||||
print(
|
||||
f"Calculated gap is {gap:.4f} mm "
|
||||
f"using H{harmonic}"
|
||||
)
|
||||
|
||||
return gap
|
||||
|
||||
|
||||
def set_gap(energy_ev, print_result=False):
|
||||
"""Set the undulator gap."""
|
||||
|
||||
|
||||
@@ -0,0 +1,347 @@
|
||||
"""Script to change energy at PXII by setting gap, DCM motors and mirror stripe
|
||||
|
||||
Moving DCM motors - implemented for Bragg, pitch and perp
|
||||
Gap - optional, can be switched off using move_gap=False
|
||||
Mirrors - change of mirror stripe is not yet implemented
|
||||
Plotting optional
|
||||
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
|
||||
# from pxii_gap import set_gap
|
||||
# from mx_methods import go_to_peak
|
||||
# from pxii_parameters import EnergyDefaults, Calibration
|
||||
|
||||
# from calculator import (
|
||||
# calc_perp_position,
|
||||
# validate_energy,
|
||||
# convert_from_bragg,
|
||||
# convert_from_energy,
|
||||
# )
|
||||
|
||||
|
||||
def get_current_energy():
|
||||
"""
|
||||
Returns the energy in eV from the current bragg angle.
|
||||
"""
|
||||
current_bragg_angle = dev.dcm_bragg.user_readback.get(cached=True)
|
||||
current_energy = convert_from_bragg(current_bragg_angle, print_result=False)["energy_ev"]
|
||||
return current_energy
|
||||
|
||||
|
||||
# Functions below are common to all beamlines
|
||||
def calculate_energy_difference(current_energy, target_energy):
|
||||
"""
|
||||
Calculate the absolute difference in energy between the current energy level
|
||||
and the target energy level.
|
||||
"""
|
||||
return abs(target_energy - current_energy)
|
||||
|
||||
|
||||
def get_mirror_stripe(energy_ev):
|
||||
"""
|
||||
Determines the mirror stripe material based on the energy level provided
|
||||
and the specified thresholds for silicon, rhodium, and platinum.
|
||||
|
||||
Args:
|
||||
energy_ev (float): Energy level in electron volts, used to determine
|
||||
the corresponding material type.
|
||||
|
||||
Returns:
|
||||
str: A string indicating the material type corresponding to the provided
|
||||
energy level. Possible values are "silicon", "rhodium", or "platinum".
|
||||
"""
|
||||
if energy_ev <= EnergyDefaults.stripe_thresholds["silicon"]:
|
||||
return "silicon"
|
||||
if (
|
||||
EnergyDefaults.stripe_thresholds["silicon"]
|
||||
< energy_ev
|
||||
<= EnergyDefaults.stripe_thresholds["rhodium"]
|
||||
):
|
||||
return "rhodium"
|
||||
return "platinum"
|
||||
|
||||
|
||||
def set_mirror_stripe(energy_ev):
|
||||
"""
|
||||
Selects and sets the appropriate mirror stripe based on the given energy value
|
||||
in electron volts (eV).
|
||||
|
||||
Args:
|
||||
energy_ev (float): The energy value in electron volts
|
||||
|
||||
Returns:
|
||||
None
|
||||
"""
|
||||
selected_stripe = get_mirror_stripe(energy_ev)
|
||||
print(f"Selected mirror stripe: {selected_stripe}")
|
||||
|
||||
|
||||
def mono_pitch_scan(plot=True, window_name="Fitting", plot_widget=None):
|
||||
"""Scan the monochromator pitch and move to the peak."""
|
||||
# Move to the calculated pitch value for the current energy
|
||||
print("Starting Mono Pitch Scan.")
|
||||
energy = get_current_energy()
|
||||
pos = get_dcm_motors_positions(energy)
|
||||
print(f"Setting DCM Pitch to default value of {pos['dcm_pitch']}")
|
||||
# Set fine pitch to middle of its' travel range
|
||||
scans.umv(EnergyDefaults.mono_fpitch, pos["dcm_fine_pitch"], relative=False)
|
||||
# Move DCM pitch to starting value
|
||||
scans.umv(EnergyDefaults.mono_pitch, pos["dcm_pitch"]-0.12, relative=False)
|
||||
|
||||
# Go to peak using default parameters from EnergyDefaults
|
||||
if plot:
|
||||
print("Scanning monochromator pitch and moving to peak, with plotting.")
|
||||
result = go_to_peak(
|
||||
EnergyDefaults.mono_pitch,
|
||||
EnergyDefaults.signals["sig1"],
|
||||
-EnergyDefaults.pitch_scan["halfwidth"],
|
||||
EnergyDefaults.pitch_scan["halfwidth"],
|
||||
steps=EnergyDefaults.pitch_scan["steps"],
|
||||
relative=True,
|
||||
settle=0.01,
|
||||
plot=True,
|
||||
confirm=False,
|
||||
min_fwhm_steps=1.1,
|
||||
window_name=window_name,
|
||||
plot_widget=plot_widget,
|
||||
)
|
||||
else:
|
||||
print("Scanning monochromator pitch and moving to peak, without plotting.")
|
||||
result = go_to_peak(
|
||||
EnergyDefaults.mono_pitch,
|
||||
EnergyDefaults.signals["sig1"],
|
||||
-EnergyDefaults.pitch_scan["halfwidth"],
|
||||
EnergyDefaults.pitch_scan["halfwidth"],
|
||||
steps=EnergyDefaults.pitch_scan["steps"],
|
||||
relative=True,
|
||||
settle=0.01,
|
||||
plot=False,
|
||||
min_fwhm_steps=1.5,
|
||||
confirm=False,
|
||||
)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
# Specific functions - need to be edited for each beamline
|
||||
|
||||
|
||||
def move_gap_if_needed(energy_ev, move_gap=True):
|
||||
"""
|
||||
Move the gap position based on energy if the move_gap flag is set.
|
||||
|
||||
Args:
|
||||
energy_ev (float): The energy value in electron volts (eV) used for gap movement.
|
||||
move_gap (bool): A flag indicating whether the gap position should be moved or not.
|
||||
|
||||
Returns:
|
||||
None
|
||||
"""
|
||||
if move_gap:
|
||||
set_gap(energy_ev)
|
||||
else:
|
||||
print("Not moving gap.")
|
||||
|
||||
|
||||
# def get_roll(energy_ev):
|
||||
# """Calculates the roll based on calibration data."""
|
||||
# calib = Calibration()
|
||||
# roll = np.poly1d(calib.roll)(energy_ev)
|
||||
# if roll < 0:
|
||||
# return 0
|
||||
# if roll >= 9.95:
|
||||
# return 9.95
|
||||
# return float(roll)
|
||||
|
||||
|
||||
def get_dcm_motors_positions(energy_ev):
|
||||
"""
|
||||
Pitch and roll are calculated based on fits of the measured calibration values.
|
||||
Perp and Bragg are calculated based on the energy value via calculator.py.
|
||||
|
||||
Arguments:
|
||||
energy_ev (float): The energy value in electron volts for which the
|
||||
DCM motor positions are to be calculated.
|
||||
|
||||
Returns:
|
||||
dict: A dictionary containing the calculated DCM motor positions
|
||||
including values retrieved from the lookup table, Bragg angle
|
||||
in milliradians, and perpendicular position.
|
||||
"""
|
||||
# dcm_motor_values = get_value_from_lut(energy_ev)
|
||||
dcm_motor_values = {}
|
||||
pitch = float(np.poly1d(Calibration.pitch_calib)(energy_ev))
|
||||
# pitch = -5.5
|
||||
fpitch = 5.0
|
||||
roll = EnergyDefaults.mono_roll_value
|
||||
perp = calc_perp_position(energy_ev, print_result=False)
|
||||
bragg_angle = convert_from_energy(energy_ev, print_result=False)["bragg_angle_mrad"]
|
||||
dcm_motor_values.update(
|
||||
{
|
||||
"bragg_angle": bragg_angle,
|
||||
"perp": perp,
|
||||
"dcm_pitch": pitch,
|
||||
"dcm_roll": roll,
|
||||
"dcm_fine_pitch": fpitch,
|
||||
}
|
||||
)
|
||||
return dcm_motor_values
|
||||
|
||||
|
||||
def move_dcm_motors(energy_ev):
|
||||
"""
|
||||
Move the DCM bragg, pitch and perp motors to the required positions
|
||||
for the given energy in eV.
|
||||
|
||||
"""
|
||||
dcm_pos = get_dcm_motors_positions(energy_ev)
|
||||
print(
|
||||
f"Moving DCM bragg: {dcm_pos['bragg_angle']: .5g} mrad, "
|
||||
f"DCM perp: {dcm_pos['perp']: .3g} mm, "
|
||||
# f"DCM pitch fixed at -5.304 mrad, "
|
||||
f"DCM pitch: {dcm_pos['dcm_pitch']: .5g} mrad, "
|
||||
f"DCM Roll: {dcm_pos['dcm_roll']:.5g} V"
|
||||
)
|
||||
# umv(EnergyDefaults.energy, dcm_pos["bragg_angle"])
|
||||
# umv(EnergyDefaults.mono_perp, dcm_pos["perp"])
|
||||
# umv(EnergyDefaults.mono_pitch, dcm_pos["dcm_pitch"])
|
||||
# umv(EnergyDefaults.mono_roll, dcm_pos["dcm_roll"])
|
||||
# print("\n***DCM Roll movement is currently disabled ***\n")
|
||||
scans.umv(EnergyDefaults.mono_fpitch, dcm_pos["dcm_fine_pitch"], relative=False)
|
||||
scans.umv(
|
||||
EnergyDefaults.energy,
|
||||
dcm_pos["bragg_angle"],
|
||||
EnergyDefaults.mono_perp,
|
||||
dcm_pos["perp"],
|
||||
EnergyDefaults.mono_pitch,
|
||||
dcm_pos["dcm_pitch"],
|
||||
EnergyDefaults.mono_roll,
|
||||
dcm_pos["dcm_roll"],
|
||||
relative=False,
|
||||
)
|
||||
|
||||
|
||||
def bl_energy(
|
||||
energy_ev, move_gap=True, mono_scan=True, plot=True, window_name="Fitting", plot_widget=None
|
||||
):
|
||||
"""
|
||||
Adjusts the beamline's energy to the specified energy in electron volts (eV).
|
||||
The function validates the target energy, checks the current energy, and makes
|
||||
adjustments only if the energy difference is significant enough. It performs
|
||||
necessary operations including moving the gap, changing DCM motors, updating
|
||||
the mirror stripe, and scanning to find the optimal DCM pitch.
|
||||
|
||||
Args:
|
||||
energy_ev: Target energy in electron volts to which the beamline should be adjusted.
|
||||
move_gap: Boolean flag indicating whether to adjust the gap before setting energy.
|
||||
plot: Boolean flag indicating whether to plot the DCM pitch scan for finding the peak.
|
||||
|
||||
Returns:
|
||||
None
|
||||
"""
|
||||
energy_ev = validate_energy(energy_ev) # Ensure energy is valid.
|
||||
|
||||
# Check current energy to avoid unnecessary adjustments.
|
||||
|
||||
current_energy = get_current_energy()
|
||||
energy_diff = calculate_energy_difference(current_energy, energy_ev)
|
||||
|
||||
if energy_diff <= EnergyDefaults.min_energy_change:
|
||||
print(f"Energy change of {energy_diff:.2f} eV is too small, not changing energy.")
|
||||
return
|
||||
|
||||
transmission = get_value(dev.transm)
|
||||
|
||||
# Step 1: Move the gap if needed.
|
||||
move_gap_if_needed(energy_ev, move_gap)
|
||||
|
||||
# Step 2: Move and set the DCM motors.
|
||||
move_dcm_motors(energy_ev)
|
||||
|
||||
# Step 3: Reset the transmission after the energy change
|
||||
print(f"Setting transmission to {transmission}")
|
||||
dev.transm.put(transmission)
|
||||
|
||||
# Step 4: Update the mirror stripe.
|
||||
set_mirror_stripe(energy_ev)
|
||||
|
||||
# Step 5: Perform DCM pitch scan and move to peak.
|
||||
if mono_scan:
|
||||
if plot:
|
||||
result = mono_pitch_scan(plot=True, window_name=window_name, plot_widget=plot_widget)
|
||||
return result
|
||||
else:
|
||||
mono_pitch_scan(plot=False)
|
||||
|
||||
|
||||
# def new_calc_gap(energy_ev):
|
||||
# """
|
||||
# Calculates the gap based on the given energy
|
||||
# """
|
||||
# gapval = Gap()
|
||||
# harmonic_values = gapval.get_harmonic_values(energy_ev)
|
||||
# if harmonic_values is not None:
|
||||
# fit = np.poly1d(harmonic_values)(energy_ev)
|
||||
# gap_value = fit * 0.9994
|
||||
# return gap_value
|
||||
# return None
|
||||
|
||||
# def set_gap(energy_ev, print_result=True):
|
||||
# """
|
||||
# set the gap
|
||||
# """
|
||||
# gap = new_calc_gap(energy_ev)
|
||||
# # else:
|
||||
# # gap = calc_gap(energy_kev)
|
||||
# if gap is not None and Harmonics.min_gap_value <= gap <= 20:
|
||||
# umv(dev.id_gap, gap)
|
||||
# if print_result:
|
||||
# print(f"Setting gap to {gap:.3f} mm")
|
||||
# else:
|
||||
# umv(dev.id_gap, Harmonics.min_gap_value)
|
||||
# # msg = (
|
||||
# # f"Position {gap: .3f} mm is outside the allowed scan range of "
|
||||
# # f"4.5 to 20 mm. Not changing the gap."
|
||||
# # )
|
||||
# # raise ValueError(msg)
|
||||
# return gap
|
||||
|
||||
|
||||
def calc_gap(energy_ev, print_result=True):
|
||||
"""Calculate the undulator gap for the given energy."""
|
||||
|
||||
harmonic_values = Gap.get_harmonic_values(energy_ev)
|
||||
|
||||
if harmonic_values is None:
|
||||
return None
|
||||
|
||||
gap = np.poly1d(harmonic_values)(energy_ev)
|
||||
gap *= Gap.correction_factor
|
||||
|
||||
if print_result:
|
||||
harmonic = Gap.get_harmonic_by_energy(energy_ev)
|
||||
print(f"Calculated gap is {gap:.3f} mm " f"using {harmonic}")
|
||||
|
||||
return gap
|
||||
|
||||
|
||||
def set_gap(energy_ev, print_result=False):
|
||||
"""Set the undulator gap."""
|
||||
|
||||
gap = calc_gap(energy_ev)
|
||||
|
||||
if gap is not None and Gap.minimum_gap <= gap <= 20:
|
||||
umv(dev.id_gap, gap)
|
||||
|
||||
if print_result:
|
||||
harmonic = Gap.get_harmonic_by_energy(energy_ev)
|
||||
print(f"Setting gap to {gap:.3f} mm " f"using {harmonic}")
|
||||
|
||||
else:
|
||||
raise ValueError(
|
||||
f"Cannot calculate a valid gap for {energy_ev:.0f} eV. " f"Calculated gap: {gap}"
|
||||
)
|
||||
|
||||
return gap
|
||||
@@ -20,8 +20,7 @@ class EnergyDefaults:
|
||||
mono_fpitch = dev.dcm_fpitch
|
||||
mono_perp = dev.dcm_perp
|
||||
mono_roll = dev.dcm_froll
|
||||
mono_roll_value = 4.36
|
||||
LUT_table = "luts/energy_lut.csv"
|
||||
mono_roll_value = 3.88
|
||||
stripe_thresholds = {"silicon": 9000, "rhodium": 20000, "platinum": 40000}
|
||||
pitch_scan = {"halfwidth": 0.075, "steps": 20}
|
||||
|
||||
@@ -30,127 +29,105 @@ class EnergyDefaults:
|
||||
class Calibration:
|
||||
"""Calibration parameters for PXII optics"""
|
||||
|
||||
pitch_calib = [-7.60082220e-19, 6.09893342e-14, -1.81702221e-09, 2.45457520e-05, -5.61275367e00]
|
||||
# pitch_calib = [-7.60082220e-19, 6.09893342e-14, -1.81702221e-09, 2.45457520e-05, -5.61275367e00]
|
||||
|
||||
pitch_calib = [-1.84031410e-07,-6.76777668e-05, -5.59684124]
|
||||
|
||||
# roll = np.array([2.28291039e-03, -2.41928101e01])
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class Gap:
|
||||
"""Fit parameters to calculate undulator gap from energy."""
|
||||
"""PXII U19 undulator gap calibration.
|
||||
|
||||
Harmonic fits are from Anuschka's September 2026 calibration.
|
||||
For a requested energy, use the highest odd harmonic whose
|
||||
calculated gap remains >= minimum_gap.
|
||||
"""
|
||||
|
||||
minimum_gap = 4.5
|
||||
selection_min_gap = 4.505
|
||||
maximum_gap = 20.0
|
||||
correction_factor = 0.9994
|
||||
|
||||
# Anuschka's September 2026 harmonic fits.
|
||||
# Energy input is in keV, gap output is in mm.
|
||||
harmonics = {
|
||||
"H3": np.array([9.37600000e-04, 2.98800000e-01]),
|
||||
"H5": np.array([5.10102857e-04, 7.99666667e-01]),
|
||||
"H7": np.array([3.58874286e-04, 8.60410476e-01]),
|
||||
"H9": np.array([2.74520000e-04, 9.25540000e-01]),
|
||||
"H11": np.array([2.24457143e-04, 9.25714286e-01]),
|
||||
"H13": np.array([1.88834286e-04, 9.47505714e-01]),
|
||||
"H15": np.array([1.63434286e-04, 9.52602857e-01]),
|
||||
"H17": np.array([1.43320000e-04, 9.77500000e-01]),
|
||||
"H19": np.array([1.27940000e-04, 9.85770000e-01]),
|
||||
3: np.array([0.095, -0.276, 4.154]),
|
||||
5: np.array([0.00269444, -0.0616905, 0.967925, -0.295405]),
|
||||
7: np.array([0.00110017, -0.0369968, 0.77334, -0.688198]),
|
||||
9: np.array([0.00021633, -0.00619517, 0.315392, 0.971667]),
|
||||
11: np.array([0.000589549, -0.0328631, 0.837705, -2.90326]),
|
||||
13: np.array([0.197702, 0.757869]),
|
||||
15: np.array([0.170381, 0.783155]),
|
||||
17: np.array([0.1466, 0.8906]),
|
||||
19: np.array([0.128, 0.985]),
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def minimum_energy(cls, harmonic):
|
||||
"""
|
||||
Return the lowest energy that can be reached with this harmonic
|
||||
without the corrected gap going below the minimum gap.
|
||||
"""
|
||||
slope, intercept = cls.harmonics[harmonic]
|
||||
|
||||
# calc_gap() applies the correction factor afterwards,
|
||||
# so account for it here as well.
|
||||
raw_minimum_gap = cls.minimum_gap / cls.correction_factor
|
||||
|
||||
return (raw_minimum_gap - intercept) / slope
|
||||
def calculate_gap_for_harmonic(cls, energy_ev, harmonic):
|
||||
"""Calculate gap for a specified harmonic."""
|
||||
energy_kev = energy_ev / 1000.0
|
||||
return np.polyval(cls.harmonics[harmonic], energy_kev)
|
||||
|
||||
@classmethod
|
||||
def get_harmonic_by_energy(cls, energy_ev):
|
||||
"""
|
||||
Return the appropriate harmonic for the requested energy.
|
||||
Select the highest odd harmonic that gives a valid gap.
|
||||
|
||||
Switch to the next harmonic as soon as it can produce the
|
||||
requested energy without requiring a gap below minimum_gap.
|
||||
This selects the harmonic whose gap is closest to the
|
||||
minimum allowed gap of 4.5 mm, while maintaining a small
|
||||
safety margin of 0.005 mm.
|
||||
"""
|
||||
selected = None
|
||||
|
||||
valid = []
|
||||
|
||||
for harmonic in cls.harmonics:
|
||||
if energy_ev >= cls.minimum_energy(harmonic):
|
||||
selected = harmonic
|
||||
else:
|
||||
break
|
||||
gap = cls.calculate_gap_for_harmonic(
|
||||
energy_ev,
|
||||
harmonic,
|
||||
)
|
||||
|
||||
return selected
|
||||
if cls.selection_min_gap <= gap <= cls.maximum_gap:
|
||||
valid.append((harmonic, gap))
|
||||
|
||||
@classmethod
|
||||
def get_harmonic_values(cls, energy_ev):
|
||||
"""
|
||||
Return the fit coefficients for the appropriate harmonic.
|
||||
"""
|
||||
harmonic = cls.get_harmonic_by_energy(energy_ev)
|
||||
|
||||
if harmonic is None:
|
||||
if not valid:
|
||||
return None
|
||||
|
||||
return cls.harmonics[harmonic]
|
||||
# Closest valid gap to the minimum gap
|
||||
harmonic, gap = min(
|
||||
valid,
|
||||
key=lambda x: x[1] - cls.selection_min_gap,
|
||||
)
|
||||
|
||||
return harmonic
|
||||
|
||||
@classmethod
|
||||
def calculate_gap(cls, energy_ev):
|
||||
"""
|
||||
Calculate the corrected undulator gap for the requested energy.
|
||||
"""Return selected harmonic and calculated gap."""
|
||||
|
||||
Returns
|
||||
-------
|
||||
tuple
|
||||
(harmonic, gap)
|
||||
"""
|
||||
harmonic = cls.get_harmonic_by_energy(energy_ev)
|
||||
|
||||
if harmonic is None:
|
||||
raise ValueError(f"{energy_ev:.0f} eV is below the minimum calibrated energy.")
|
||||
raise ValueError(
|
||||
f"No valid harmonic found for {energy_ev:.0f} eV."
|
||||
)
|
||||
|
||||
slope, intercept = cls.harmonics[harmonic]
|
||||
|
||||
gap = slope * energy_ev + intercept
|
||||
gap *= cls.correction_factor
|
||||
gap = cls.calculate_gap_for_harmonic(
|
||||
energy_ev,
|
||||
harmonic,
|
||||
)
|
||||
|
||||
# Final check against actual motor limits
|
||||
if not cls.minimum_gap <= gap <= cls.maximum_gap:
|
||||
raise ValueError(
|
||||
f"Calculated gap {gap:.3f} mm for {energy_ev:.0f} eV "
|
||||
f"using {harmonic} is outside the allowed range "
|
||||
f"using H{harmonic} is outside the allowed range "
|
||||
f"{cls.minimum_gap:.1f}-{cls.maximum_gap:.1f} mm."
|
||||
)
|
||||
|
||||
return harmonic, gap
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class Harmonics:
|
||||
"""Anuschka's harmonics data for PXII U19 Undulator"""
|
||||
|
||||
min_gap_value = 4.5
|
||||
map = {
|
||||
3: np.array([1.07141725, -0.52834258]),
|
||||
4: np.array([0.007111, -0.13678409, 1.52295567, -1.06882785]),
|
||||
5: np.array([0.00315051, -0.0766359, 1.13107469, -0.86442062]),
|
||||
6: np.array([0.00162862, -0.04452336, 0.82948259, -0.37329674]),
|
||||
7: np.array([0.00080764, -0.02418882, 0.59212947, 0.15702886]),
|
||||
8: np.array([1.16699242e-03, -4.68207543e-02, 9.43972396e-01, -1.94201019e00]),
|
||||
9: np.array([0.00048419, -0.02010648, 0.55514114, -0.38180067]),
|
||||
10: np.array([2.11583333e-04, -8.03503571e-03, 3.43141595e-01, 6.02318000e-01]),
|
||||
11: np.array([0.00334392, -0.18405336, 3.58338994, -19.3640241]),
|
||||
12: np.array([3.20520798e-05, 2.39253145e-03, 8.09198503e-02, 2.22897377e00]),
|
||||
13: np.array([0.00278744, 0.07979874, 2.05143916]),
|
||||
}
|
||||
energy_ranges = {3: (0, 7), 5: (7, 10), 7: (10, 13), 9: (13, 16), 11: (16, 19), 13: (19, 22)}
|
||||
high_energy = [(15, (23, 25)), (17, (25, 29)), (19, (29, float("inf")))]
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class CamConversion:
|
||||
"""Convert pixels to microns for sample camera"""
|
||||
@@ -165,8 +142,8 @@ class BCU_BPM_X_Calibration:
|
||||
signal_limit = 0.90
|
||||
# centred_position = 0.441
|
||||
centred_position = -0.009 # where the bpm was during calibration
|
||||
crosshair_signal = -0.00339158
|
||||
crosshair_bpm_position = 0.0532
|
||||
crosshair_signal = -0.0209
|
||||
crosshair_bpm_position = 0.0738
|
||||
|
||||
|
||||
# @dataclass(frozen=True)
|
||||
@@ -174,8 +151,8 @@ class BCU_BPM_Y_Calibration:
|
||||
coeffs = (-0.14645507, 0.010016, 0.08258468, -0.00547233, -0.02715706, -1.54419084)
|
||||
signal_limit = 0.95
|
||||
centred_position = -1.540 # where the bpm was during calibration
|
||||
crosshair_signal = -0.00392027
|
||||
crosshair_bpm_position = -1.548
|
||||
crosshair_signal = 0.00156
|
||||
crosshair_bpm_position = -1.5459
|
||||
|
||||
|
||||
# @dataclass(frozen=True)
|
||||
|
||||
@@ -0,0 +1,353 @@
|
||||
"""PXII-specific operational helpers used by routine daily/weekly setup.
|
||||
|
||||
BEC loads macro files into a shared namespace, so these functions deliberately use
|
||||
the standard BEC globals (dev, umv, get_value, etc.) rather than importing other
|
||||
macro files. Nothing in this module should be promoted to mxcomm_* unless it is
|
||||
truly beamline-independent.
|
||||
"""
|
||||
|
||||
import time
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime
|
||||
|
||||
import numpy as np
|
||||
from pxii_bec.scripts import beamline_context as bl
|
||||
from pxii_bec.macros.beamline_planner import BeamlineState
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# Energy
|
||||
# =============================================================================
|
||||
|
||||
def daily_energy(energy, scan_mono=True, plot_widget=None):
|
||||
"""Set PXII energy/gap and optionally optimise DCM pitch."""
|
||||
|
||||
current_energy = get_current_energy()
|
||||
mono_result = {"extended_scan": False}
|
||||
|
||||
if abs(energy - current_energy) > 1:
|
||||
bl_energy(energy, window_name="DailySetup", plot_widget=plot_widget)
|
||||
# bl_energy performs the normal energy move. Keep mono_result benign
|
||||
# here so the result handling below is defined for both code paths.
|
||||
else:
|
||||
gap_actual = dev.id_gap.position
|
||||
gap_req = calc_gap(energy)
|
||||
|
||||
if abs(gap_actual - gap_req) > 0.05:
|
||||
if dev.id_gap.moving():
|
||||
return {
|
||||
"ok": False,
|
||||
"message": "Undulator gap is moving",
|
||||
"energy": current_energy,
|
||||
}
|
||||
umv(dev.id_gap, gap_req)
|
||||
|
||||
if scan_mono:
|
||||
mono_result = mono_pitch_scan(
|
||||
window_name="DailySetup", plot_widget=plot_widget
|
||||
)
|
||||
|
||||
new_energy = get_current_energy()
|
||||
calib_pitch = get_dcm_motors_positions(energy)["dcm_pitch"]
|
||||
pitch_offset = get_value(dev.dcm_pitch) - calib_pitch
|
||||
|
||||
if not mono_result.get("extended_scan", False):
|
||||
return {
|
||||
"ok": True,
|
||||
"message": (
|
||||
f"Beamline energy set to {new_energy:.0f} eV, "
|
||||
f"pitch offset = {pitch_offset:.3f} mrad"
|
||||
),
|
||||
"energy": new_energy,
|
||||
"pitch_offset": pitch_offset,
|
||||
}
|
||||
|
||||
return {
|
||||
"ok": True,
|
||||
"warning": True,
|
||||
"message": (
|
||||
"Warning - DCM pitch is not within expected tolerance. "
|
||||
"The DCM may need to be re-calibrated. "
|
||||
f"Pitch offset = {pitch_offset:.3f} mrad"
|
||||
),
|
||||
"energy": new_energy,
|
||||
"pitch_offset": pitch_offset,
|
||||
}
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# Sample-camera scintillator measurements
|
||||
# =============================================================================
|
||||
|
||||
def predict_scint_transmission(target_flux=None):
|
||||
"""Predict PXII transmission required for a scintillator measurement."""
|
||||
if target_flux is None:
|
||||
target_flux = BeamMove.scint_target_flux
|
||||
_, full_flux = bpm2flux()
|
||||
if not np.isfinite(full_flux) or full_flux <= 0:
|
||||
raise ValueError(
|
||||
"Cannot predict scintillator transmission: "
|
||||
f"invalid full flux ({full_flux:.3g} ph/s)"
|
||||
)
|
||||
return float(np.clip(target_flux / full_flux, 0.001, 1.0))
|
||||
|
||||
|
||||
def auto_exposure(cam="samcam", target=200, tol=5, gain=0.9,
|
||||
min_exp=0.00001, max_exp=0.2, max_iter=10):
|
||||
"""Adjust PXII camera exposure to reach the requested maximum signal."""
|
||||
if cam == "samcam":
|
||||
exposure = dev.samcam_exp.read()["samcam_exp"]["value"]
|
||||
else:
|
||||
exposure = dev.ss_xicam_exp.read()["ss_xicam_exp"]["value"]
|
||||
|
||||
print(f"Starting exposure = {exposure:.4f} s")
|
||||
for _ in range(max_iter):
|
||||
time.sleep(0.1)
|
||||
if cam == "samcam":
|
||||
maxval = dev.samcam_max.read()["samcam_max"]["value"]
|
||||
else:
|
||||
maxval = dev.ss_xicam_max.read()["ss_xicam_max"]["value"]
|
||||
if maxval is None:
|
||||
print("No reading — check camera.")
|
||||
break
|
||||
error = target - maxval
|
||||
if abs(error) <= tol:
|
||||
break
|
||||
new_exp = exposure * (1 + gain * error / target)
|
||||
new_exp = max(min_exp, min(max_exp, new_exp))
|
||||
if cam == "samcam":
|
||||
dev.samcam_exp.put(new_exp)
|
||||
else:
|
||||
dev.ss_xicam_exp.put(new_exp)
|
||||
exposure = new_exp
|
||||
print(f"New exposure time is {exposure:.3g}")
|
||||
return exposure
|
||||
|
||||
|
||||
def prepare_scint_measurement(autoexp=True, zoom=1000):
|
||||
"""Put PXII into the standard state for a scintillator measurement."""
|
||||
transmission = predict_scint_transmission()
|
||||
print(f"Predicted scintillator transmission: {transmission:.2%}")
|
||||
dev.transm.put(transmission)
|
||||
time.sleep(3)
|
||||
if get_value(dev.scam_zoom) != zoom:
|
||||
umv(dev.scam_zoom, zoom)
|
||||
if not bl.planner.is_state(BeamlineState.BEAM_VISUALISATION):
|
||||
bl.planner.move_to(BeamlineState.BEAM_VISUALISATION)
|
||||
dev.bcu_shutter.put(1)
|
||||
time.sleep(0.5)
|
||||
if autoexp:
|
||||
auto_exposure(cam="samcam", max_iter=25)
|
||||
return zoom
|
||||
|
||||
|
||||
def measure_beamsize(cam="samcam"):
|
||||
"""Return PXII sample-camera beam FWHM in microns."""
|
||||
a = dev.samcam_xsig.read()["samcam_xsig"]["value"]
|
||||
b = dev.samcam_ysig.read()["samcam_ysig"]["value"]
|
||||
zoom = dev.scam_zoom.read()["scam_zoom"]["value"]
|
||||
sx = calc_scam_microns(a, zoom=zoom) * 2.35
|
||||
sy = calc_scam_microns(b, zoom=zoom) * 2.35
|
||||
print(f"FWHM in um : {(sx, sy)}")
|
||||
return sx, sy
|
||||
|
||||
|
||||
def read_scintXY(image=False, measure_size=True):
|
||||
"""Read PXII beam position from the sample-camera scintillator image."""
|
||||
x_target = BeamMove.scint_target_x
|
||||
y_target = BeamMove.scint_target_y
|
||||
zoom = get_value(dev.scam_zoom)
|
||||
max_signal = get_value(dev.samcam_max)
|
||||
thresh = get_value(dev.samcam_thresh)
|
||||
if max_signal < thresh:
|
||||
return {
|
||||
"ok": False,
|
||||
"message": (
|
||||
"Insufficient signal for centroid calculation "
|
||||
f"(max signal = {max_signal:.0f}, threshold = {thresh:.0f})"
|
||||
),
|
||||
"max_signal": max_signal,
|
||||
}
|
||||
x_px = dev.samcam_x.read()["samcam_x"]["value"]
|
||||
y_px = dev.samcam_y.read()["samcam_y"]["value"]
|
||||
diff_x = x_target - x_px
|
||||
diff_y = y_target - y_px
|
||||
results = {
|
||||
"ok": True,
|
||||
"message": f"Beam detected at X={x_px:.1f}, Y={y_px:.1f} px",
|
||||
"max_signal": max_signal,
|
||||
"X_pixels": x_px,
|
||||
"Y_pixels": y_px,
|
||||
"X_diff_px": diff_x,
|
||||
"Y_diff_px": diff_y,
|
||||
"X_diff_microns": calc_scam_microns(diff_x, zoom),
|
||||
"Y_diff_microns": calc_scam_microns(diff_y, zoom),
|
||||
}
|
||||
if measure_size:
|
||||
results["X_FWHM"], results["Y_FWHM"] = measure_beamsize()
|
||||
print(
|
||||
f"Beam position: X = {x_px:.1f} px, Y = {y_px:.1f} px\n"
|
||||
f"Distance from crosshair: X = {results['X_diff_microns']:.1f} microns, "
|
||||
f"Y = {results['Y_diff_microns']:.1f} microns\n"
|
||||
)
|
||||
if image:
|
||||
results["image"] = get_cam_image(Cameras.sample)
|
||||
return results
|
||||
|
||||
|
||||
def finish_scint_measurement():
|
||||
dev.bcu_shutter.put(0)
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# Slit centring used by weekly checks
|
||||
# =============================================================================
|
||||
|
||||
@dataclass
|
||||
class SlitAxis:
|
||||
name: str
|
||||
centre_motor: object
|
||||
size_motor: object
|
||||
scan_range: float = 2.0
|
||||
|
||||
@dataclass
|
||||
class Slit:
|
||||
name: str
|
||||
x: SlitAxis
|
||||
y: SlitAxis
|
||||
|
||||
def centre_axis(axis, detector, slit_size=0.5, final_size=3.0, window_name=None, plot_widget=None):
|
||||
print(f"\nAligning {axis.name}")
|
||||
umv(axis.size_motor, slit_size)
|
||||
start = axis.centre_motor.position
|
||||
try:
|
||||
go_to_peak(axis.centre_motor, detector, start-axis.scan_range,
|
||||
start+axis.scan_range, 50, confirm=False, window_name=window_name,
|
||||
plot_widget=plot_widget)
|
||||
centre = get_value(axis.centre_motor)
|
||||
print(f"{axis.name}: centre = {centre:.4f}")
|
||||
return centre
|
||||
finally:
|
||||
umv(axis.size_motor, final_size)
|
||||
|
||||
def centre_slit(slit, detector, slit_size=0.5, final_size=3.0, window_name=None, x_plot_widget=None, y_plot_widget=None):
|
||||
print(f"\n=== Aligning {slit.name} ===")
|
||||
x = centre_axis(slit.x, detector, slit_size, final_size,window_name=window_name,plot_widget=x_plot_widget)
|
||||
y = centre_axis(slit.y, detector, slit_size, final_size, window_name=window_name,plot_widget=y_plot_widget)
|
||||
print(f"=== Finished {slit.name} ===")
|
||||
return {"x": x, "y": y}
|
||||
|
||||
def define_slits():
|
||||
def axis(prefix, direction):
|
||||
return SlitAxis(
|
||||
name=f"{prefix}_sl_{direction}",
|
||||
centre_motor=getattr(dev, f"{prefix}_sl_{direction}cen"),
|
||||
size_motor=getattr(dev, f"{prefix}_sl_{direction}size"),
|
||||
)
|
||||
return [Slit(name, axis(name, "x"), axis(name, "y"))
|
||||
for name in ("bsf", "ss", "bcu")]
|
||||
|
||||
def centre_one(name, detector, window_name=None, x_plot_widget=None, y_plot_widget=None):
|
||||
for slit in define_slits():
|
||||
if slit.name == name:
|
||||
return centre_slit(slit, detector,window_name=window_name,x_plot_widget=x_plot_widget,y_plot_widget=y_plot_widget)
|
||||
raise ValueError(f"Unknown PXII slit set: {name}")
|
||||
|
||||
|
||||
# =============================================================================
|
||||
# Ge energy calibration diagnostic
|
||||
# =============================================================================
|
||||
|
||||
def scan_ge(edge=11103.1, mode="coarse"):
|
||||
"""Scan the PXII Ge K edge and return the generated CSV filename."""
|
||||
if mode == "coarse":
|
||||
scan_range, scanpoints = 100, 41
|
||||
if mode == "medium":
|
||||
scan_range, scanpoints = 40, 41
|
||||
elif mode == "fine":
|
||||
scan_range, scanpoints = 15, 61
|
||||
else:
|
||||
raise ValueError(f"Unknown scan mode '{mode}'. Use 'coarse', 'medium' or 'fine'.")
|
||||
|
||||
start_eV, end_eV = edge-scan_range, edge+scan_range
|
||||
start_bragg = convert_from_energy(start_eV)["bragg_angle_mrad"]
|
||||
end_bragg = convert_from_energy(end_eV)["bragg_angle_mrad"]
|
||||
bragg_points = np.linspace(start_bragg, end_bragg, scanpoints)
|
||||
filename = bl.env.lut_dir / f"{datetime.now():%Y%m%d}_ge_edge_{mode}.csv"
|
||||
|
||||
with open(filename, "w") as f:
|
||||
f.write("Energy,Bragg,ss_bpmsum,bcu_bpmsum,transmission\n")
|
||||
|
||||
print(f"\nGe edge {mode} scan: {start_eV:.1f}-{end_eV:.1f} eV")
|
||||
bl_energy(start_eV)
|
||||
dev.transm.put(1)
|
||||
time.sleep(2)
|
||||
umv(dev.ss_f4_x, 6.0)
|
||||
time.sleep(3)
|
||||
|
||||
try:
|
||||
for bragg in bragg_points:
|
||||
scans.umv(dev.dcm_bragg, bragg, relative=False)
|
||||
energy = convert_from_bragg(bragg)["energy_ev"]
|
||||
ss = get_value(dev.ss_bpmsum)
|
||||
vals = []
|
||||
for _ in range(5):
|
||||
vals.append(dev.bcu_bpmsum.read()["bcu_bpmsum"]["value"])
|
||||
time.sleep(0.1)
|
||||
inten = float(np.mean(vals))
|
||||
transmission = inten / ss
|
||||
with open(filename, "a") as f:
|
||||
f.write(f"{energy:.2f},{bragg:.2f},{ss:.2f},{inten:.2f},{transmission:.6f}\n")
|
||||
finally:
|
||||
bl_energy(12400)
|
||||
dev.transm.put(0.1)
|
||||
time.sleep(2)
|
||||
|
||||
print(f"Scan complete. Results written to {filename}")
|
||||
return filename
|
||||
|
||||
def prepare_ss_xi_measurement(autoexp=True):
|
||||
"""Prepare for taking a reading of the beam from the SS Xray eye"""
|
||||
|
||||
# move to x-ray eye into the beam
|
||||
umv(dev.ss_xi_x, 7.0)
|
||||
|
||||
# set autoexposure and check there is a reading in the image
|
||||
if autoexp:
|
||||
auto_exposure(cam="ss_xicam", max_iter=25)
|
||||
|
||||
def finish_ss_xi_measurement():
|
||||
'''Move the SS xray eye out of the beam'''
|
||||
umv(dev.ss_xi_x, -7)
|
||||
|
||||
def read_ss_xicamXY():
|
||||
"""Read the beam position at the SS xray eye camera"""
|
||||
results = {}
|
||||
max_signal = get_value(dev.ss_xicam_max)
|
||||
results["max_signal"] = max_signal
|
||||
# thresh = get_value(dev.samcam_thresh)
|
||||
thresh = 150
|
||||
if max_signal < thresh:
|
||||
return {
|
||||
"ok": False,
|
||||
"message": (
|
||||
f"Insufficient signal for centroid calculation "
|
||||
f"(max signal = {max_signal:.0f}, threshold = {thresh:.0f})"
|
||||
),
|
||||
"max_signal": max_signal,
|
||||
}
|
||||
|
||||
|
||||
x_px = dev.ss_xicam_x.read()["ss_xicam_x"]["value"]
|
||||
y_px = dev.ss_xicam_y.read()["ss_xicam_y"]["value"]
|
||||
results["X_pixels"] = x_px
|
||||
results["Y_pixels"] = y_px
|
||||
|
||||
results["ok"] = True
|
||||
results["message"] = (
|
||||
f"Beam detected at X={x_px:.1f}, Y ={y_px:.1f} px"
|
||||
)
|
||||
print(f"Beam position: X = {results['X_pixels']:.1f} px, "
|
||||
f"Y = {results['Y_pixels']:.1f} px\n")
|
||||
|
||||
return results
|
||||
@@ -0,0 +1,30 @@
|
||||
import time
|
||||
import subprocess
|
||||
import shlex
|
||||
import csv
|
||||
import base64
|
||||
import numpy as np
|
||||
from datetime import datetime
|
||||
from contextlib import contextmanager
|
||||
from dataclasses import dataclass
|
||||
from pxii_bec.scripts import beamline_context as bl
|
||||
from pxii_bec.macros.beamline_planner import BeamlineState
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib.patches import Ellipse
|
||||
|
||||
def test_daily_html_report():
|
||||
filename = bl.env.daily_setup_dir / "daily_beam.png"
|
||||
image_src = image_to_data_uri(filename)
|
||||
|
||||
html = f"""
|
||||
<h1>Testing html</h1>
|
||||
<img src = '{image_src}' width='450'>
|
||||
<table>
|
||||
<tr><th>Pre- checks</th><th>OK</th>
|
||||
<tr><th>Set energy</th><th>OK</th>
|
||||
<th>Measure flux</th><th>OK</th>
|
||||
</table>
|
||||
"""
|
||||
|
||||
plot1, plot2, plot3, plot4, info, progress, report = select_daily_setup_gui()
|
||||
info.set_html_text(f"{html}")
|
||||