Merge branch 'CLEANUP' into 'master'
Cleanup of structure and fixes See merge request slic/cristallina!2
This commit is contained in:
0
.gitignore
vendored
Normal file → Executable file
0
.gitignore
vendored
Normal file → Executable file
@ -1,890 +0,0 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "e03fa003-fac5-44f7-b42f-2b718f6b966a",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\u001b]0;⊚slic\u0007"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from slic.core.adjustable import Adjustable, PVAdjustable, DummyAdjustable\n",
|
||||
"from slic.core.scanner import Scanner\n",
|
||||
"\n",
|
||||
"from slic.core.acquisition import BSAcquisition, PVAcquisition, SFAcquisition\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "cbd7faac-ff24-4e99-bb00-3536d868663f",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"2023-10-03 at 11:58:38 | INFO | Loading started.\n",
|
||||
"**** The executable \"caRepeater\" couldn't be located\n",
|
||||
"**** because of errno = \"No such file or directory\".\n",
|
||||
"**** You may need to modify your PATH environment variable.\n",
|
||||
"**** Unable to start \"CA Repeater\" process.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\u001b]0;⊚slic\u0007"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"2023-10-03 at 11:58:41 | WARNING | Cannot connect to stand server on saresc-vcons-02.psi.ch. Caught HTTPConnectionPool(host='saresc-vcons-02.psi.ch', port=9090): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fa618d15640>: Failed to establish a new connection: [Errno 111] Connection refused')).\n",
|
||||
"2023-10-03 at 11:58:41 | WARNING | No transmission value reported from {attenuator.ID}\n",
|
||||
"2023-10-03 at 11:58:42 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.\n",
|
||||
"2023-10-03 at 11:58:42 | INFO | Running at cristallina with pgroup p19150.\n",
|
||||
"2023-10-03 at 11:58:42 | INFO | Loading finished.\n",
|
||||
"CA client library is unable to contact CA repeater after 50 tries.\n",
|
||||
"Silence this message by starting a CA repeater daemon\n",
|
||||
"or by calling ca_pend_event() and or ca_poll() more often.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# %run /sf/cristallina/applications/slic/cristallina/cristallina.py"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"id": "1dae028f-116d-42ea-aead-298be9f01de3",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"dummy at: 0\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# setup dummy axis\n",
|
||||
"dummy = DummyAdjustable()\n",
|
||||
"print(f\"dummy at: {dummy.get_current_value()}\")\n",
|
||||
"\n",
|
||||
"# setup scanner\n",
|
||||
"scanner = Scanner(data_base_dir=\"/tmp/scan_data\", scan_info_dir=\"/tmp/scan_info\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "207bcb99-d34f-47c5-a417-4de42dfc253e",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# BS acquisition"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "7396532a-dd7b-4acf-8aa9-c12662405d00",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"bs_example_channels = ['SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG', \"SARFE10-PBIG050-EVR0:CALCI\", \"SARES30-CAMS156-XE:x_fit_amplitude\",] # \"SARES30-CAMS156-XE:FPICTURE\"]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "099cd6df-26d6-43e7-bf80-87eabc0a42b5",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n",
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Directory \"/tmp/scan_info\" does not exist, creating it...\n",
|
||||
"Directory \"/tmp/scan_data/scan0000_test_bs\" does not exist, creating it...\n",
|
||||
"\u001b[32mScan step 1 of 11\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 0.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"No channels specified, using default channel list.\n",
|
||||
"Data Header: {'htype': 'bsr_d-1.1', 'channels': [{'name': 'SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG', 'encoding': '>'}, {'name': 'SARFE10-PBIG050-EVR0:CALCI', 'encoding': '>'}]}\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /tmp/scan_data/scan0000_test_bs/scan0000_test_bs_step0000.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mScan step 2 of 11\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 1.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"No channels specified, using default channel list.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n",
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Data Header: {'htype': 'bsr_d-1.1', 'channels': [{'name': 'SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG', 'encoding': '>'}, {'name': 'SARFE10-PBIG050-EVR0:CALCI', 'encoding': '>'}]}\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /tmp/scan_data/scan0000_test_bs/scan0000_test_bs_step0001.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mScan step 3 of 11\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 2.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"No channels specified, using default channel list.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n",
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Data Header: {'htype': 'bsr_d-1.1', 'channels': [{'name': 'SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG', 'encoding': '>'}, {'name': 'SARFE10-PBIG050-EVR0:CALCI', 'encoding': '>'}]}\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /tmp/scan_data/scan0000_test_bs/scan0000_test_bs_step0002.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mScan step 4 of 11\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 3.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"No channels specified, using default channel list.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n",
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Data Header: {'htype': 'bsr_d-1.1', 'channels': [{'name': 'SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG', 'encoding': '>'}, {'name': 'SARFE10-PBIG050-EVR0:CALCI', 'encoding': '>'}]}\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /tmp/scan_data/scan0000_test_bs/scan0000_test_bs_step0003.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mScan step 5 of 11\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 4.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"No channels specified, using default channel list.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n",
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Data Header: {'htype': 'bsr_d-1.1', 'channels': [{'name': 'SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG', 'encoding': '>'}, {'name': 'SARFE10-PBIG050-EVR0:CALCI', 'encoding': '>'}]}\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /tmp/scan_data/scan0000_test_bs/scan0000_test_bs_step0004.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mScan step 6 of 11\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 5.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"No channels specified, using default channel list.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n",
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Data Header: {'htype': 'bsr_d-1.1', 'channels': [{'name': 'SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG', 'encoding': '>'}, {'name': 'SARFE10-PBIG050-EVR0:CALCI', 'encoding': '>'}]}\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /tmp/scan_data/scan0000_test_bs/scan0000_test_bs_step0005.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mScan step 7 of 11\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 6.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"No channels specified, using default channel list.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n",
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Data Header: {'htype': 'bsr_d-1.1', 'channels': [{'name': 'SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG', 'encoding': '>'}, {'name': 'SARFE10-PBIG050-EVR0:CALCI', 'encoding': '>'}]}\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /tmp/scan_data/scan0000_test_bs/scan0000_test_bs_step0006.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mScan step 8 of 11\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 7.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"No channels specified, using default channel list.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n",
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Data Header: {'htype': 'bsr_d-1.1', 'channels': [{'name': 'SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG', 'encoding': '>'}, {'name': 'SARFE10-PBIG050-EVR0:CALCI', 'encoding': '>'}]}\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /tmp/scan_data/scan0000_test_bs/scan0000_test_bs_step0007.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mScan step 9 of 11\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 8.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"No channels specified, using default channel list.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n",
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n",
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Data Header: {'htype': 'bsr_d-1.1', 'channels': [{'name': 'SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG', 'encoding': '>'}, {'name': 'SARFE10-PBIG050-EVR0:CALCI', 'encoding': '>'}]}\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /tmp/scan_data/scan0000_test_bs/scan0000_test_bs_step0008.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mScan step 10 of 11\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 9.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"No channels specified, using default channel list.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Data Header: {'htype': 'bsr_d-1.1', 'channels': [{'name': 'SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG', 'encoding': '>'}, {'name': 'SARFE10-PBIG050-EVR0:CALCI', 'encoding': '>'}]}\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /tmp/scan_data/scan0000_test_bs/scan0000_test_bs_step0009.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mScan step 11 of 11\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 10.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"No channels specified, using default channel list.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n",
|
||||
"[WARNING] bsread.data.helpers - 'type' channel field not found. Parse as 64-bit floating-point number float64 (default).\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Data Header: {'htype': 'bsr_d-1.1', 'channels': [{'name': 'SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG', 'encoding': '>'}, {'name': 'SARFE10-PBIG050-EVR0:CALCI', 'encoding': '>'}]}\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /tmp/scan_data/scan0000_test_bs/scan0000_test_bs_step0010.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mAll scan steps done\n",
|
||||
"\u001b[39m"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"perform the following scan:\n",
|
||||
"===========================\n",
|
||||
"\n",
|
||||
"A: DummyAdjustable \"Dummy\" at 10.0\n",
|
||||
"\n",
|
||||
" # A\n",
|
||||
"-- ----\n",
|
||||
" 0 0.0\n",
|
||||
" 1 1.0\n",
|
||||
" 2 2.0\n",
|
||||
" 3 3.0\n",
|
||||
" 4 4.0\n",
|
||||
" 5 5.0\n",
|
||||
" 6 6.0\n",
|
||||
" 7 7.0\n",
|
||||
" 8 8.0\n",
|
||||
" 9 9.0\n",
|
||||
"10 10.0\n",
|
||||
"\n",
|
||||
"record 10 pulses per step to \"scan0000_test_bs\" via:\n",
|
||||
"----------------------------------------------------\n",
|
||||
"- BSAcquisition: example_instrument/example_pgroup"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# setup acquisition \n",
|
||||
"acq = BSAcquisition('example_instrument', 'example_pgroup', default_channels=bs_example_channels, default_data_base_dir='/tmp')\n",
|
||||
"\n",
|
||||
"scanner.scan1D(dummy, 0, 10, step_size=1, n_pulses=10, filename='test_bs', acquisitions=[acq], step_info=None, return_to_initial_values=False)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 26,
|
||||
"id": "8df87c3c-5870-4dc5-9990-3d57187b8f40",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"False"
|
||||
]
|
||||
},
|
||||
"execution_count": 26,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from slic.core.scanner.scanbackend import is_only_sfdaq, is_sfdaq\n",
|
||||
"is_sfdaq([acq])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "34bc4109-0de2-4a4f-9bb3-0f8ea03973d9",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "13bc2a3c-e3c1-4b14-8cec-d0d4f334987a",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"is_sfdaq([acq])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 28,
|
||||
"id": "5a455e3a-ae7a-4d3c-9e14-b42c24de8f36",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"False"
|
||||
]
|
||||
},
|
||||
"execution_count": 28,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"CA.Client.Exception...............................................\n",
|
||||
" Warning: \"Virtual circuit unresponsive\"\n",
|
||||
" Context: \"SARES30-CPPM-MOBI2.psi.ch:5064\"\n",
|
||||
" Source File: ../tcpiiu.cpp line 926\n",
|
||||
" Current Time: Tue Oct 03 2023 17:51:00.456204338\n",
|
||||
"..................................................................\n",
|
||||
"CA.Client.Exception...............................................\n",
|
||||
" Warning: \"Virtual circuit unresponsive\"\n",
|
||||
" Context: \"SARES30-CPPM-MOBI1.psi.ch:5064\"\n",
|
||||
" Source File: ../tcpiiu.cpp line 926\n",
|
||||
" Current Time: Tue Oct 03 2023 17:54:13.473023696\n",
|
||||
"..................................................................\n",
|
||||
"Unexpected problem with CA circuit to server \"SARES30-CPPM-MOBI1.psi.ch:5064\" was \"Connection reset by peer\" - disconnecting\n",
|
||||
"CA.Client.Exception...............................................\n",
|
||||
" Warning: \"Virtual circuit disconnect\"\n",
|
||||
" Context: \"SARES30-CPPM-MOBI1.psi.ch:5064\"\n",
|
||||
" Source File: ../cac.cpp line 1237\n",
|
||||
" Current Time: Tue Oct 03 2023 17:54:42.135508142\n",
|
||||
"..................................................................\n",
|
||||
"Unexpected problem with CA circuit to server \"SARES30-CPPM-MOBI2.psi.ch:5064\" was \"No route to host\" - disconnecting\n",
|
||||
"CA.Client.Exception...............................................\n",
|
||||
" Warning: \"Virtual circuit disconnect\"\n",
|
||||
" Context: \"SARES30-CPPM-MOBI2.psi.ch:5064\"\n",
|
||||
" Source File: ../cac.cpp line 1237\n",
|
||||
" Current Time: Tue Oct 03 2023 18:06:26.581725132\n",
|
||||
"..................................................................\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"is_sfdaq([acq])"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 21,
|
||||
"id": "e2c866cd-4051-4a1c-b4c8-a4372e14a180",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Directory \"/tmp/scan_data/scan0008_test_pv\" does not exist, creating it...\n",
|
||||
"\u001b[32mScan step 1 of 11\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 0.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"No channels specified, using default channel list.\n",
|
||||
"Stopping because of: TaskError: Exception in Task\n",
|
||||
"caused by ConnectionError: connection to the following PVs timed out (1 sec): SARES30-MOBI1:MOT_1.RBV, SARES30-MOBI1:MOT_2.RBV, SARES30-MOBI1:MOT_3.RBV, SARES30-MOBI1:MOT_5.RBV, SARFE10-PBPS053:MOTOR_X2, SAROP31-OPPI151:MOTOR_X.RBV, SAROP31-OPPI151:MOTOR_Y.RBV\n",
|
||||
"Stopping caused: TaskError: Exception in Task\n",
|
||||
"caused by ConnectionError: connection to the following PVs timed out (1 sec): SARES30-MOBI1:MOT_1.RBV, SARES30-MOBI1:MOT_2.RBV, SARES30-MOBI1:MOT_3.RBV, SARES30-MOBI1:MOT_5.RBV, SARFE10-PBPS053:MOTOR_X2, SAROP31-OPPI151:MOTOR_X.RBV, SAROP31-OPPI151:MOTOR_Y.RBV\n",
|
||||
"Stopped current DAQ tasks:\n",
|
||||
"\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /tmp/scan_data/scan0008_test_pv/scan0008_test_pv_step0000.h5\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"perform the following scan:\n",
|
||||
"===========================\n",
|
||||
"\n",
|
||||
"A: DummyAdjustable \"Dummy\" at 0.0\n",
|
||||
"\n",
|
||||
" # A\n",
|
||||
"-- ----\n",
|
||||
" 0 0.0\n",
|
||||
" 1 1.0\n",
|
||||
" 2 2.0\n",
|
||||
" 3 3.0\n",
|
||||
" 4 4.0\n",
|
||||
" 5 5.0\n",
|
||||
" 6 6.0\n",
|
||||
" 7 7.0\n",
|
||||
" 8 8.0\n",
|
||||
" 9 9.0\n",
|
||||
"10 10.0\n",
|
||||
"\n",
|
||||
"record 10 pulses per step to \"scan0008_test_pv\" via:\n",
|
||||
"----------------------------------------------------\n",
|
||||
"- PVAcquisition: cristallina/p19150"
|
||||
]
|
||||
},
|
||||
"execution_count": 21,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"scanner.scan1D(dummy, 0, 10, step_size=1, n_pulses=10, filename='test_pv', acquisitions=[acq], step_info=None, return_to_initial_values=False)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "e35014f0-3e5d-49fb-bf7b-e8ffad4c92f2",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"id": "d5816898-f66e-4504-90cb-8d0e54ba3c23",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "NameError",
|
||||
"evalue": "name 'pvs' is not defined",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
|
||||
"Cell \u001b[0;32mIn[8], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m acq \u001b[38;5;241m=\u001b[39m PVAcquisition(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexample_instrument\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mexample_pgroup\u001b[39m\u001b[38;5;124m'\u001b[39m, default_channels\u001b[38;5;241m=\u001b[39m\u001b[43mpvs\u001b[49m, default_data_base_dir\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/tmp\u001b[39m\u001b[38;5;124m'\u001b[39m)\n",
|
||||
"\u001b[0;31mNameError\u001b[0m: name 'pvs' is not defined"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"acq = PVAcquisition('example_instrument', 'example_pgroup', default_channels=pvs, default_data_base_dir='/tmp')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e16c139f-3422-41fc-8557-5cbe39115535",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# SFAcquisition example\n",
|
||||
"\n",
|
||||
"This requires an existing `pgroup`. The `default_data_base_dir` cannot be used to specify arbitrary directories as a target, instead the data is located in `/sf/<instrument>/data/<pgroup>/raw/run<XXXX>/data/acq<YYYY>.*.h5`."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "3e374115-4807-47cf-8a3e-034462011493",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"id": "3d465878-2118-4dea-a24a-219ff4252d88",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# TODO: requires the stand client, need small howto how to start and configure or let it run all the time\n",
|
||||
"from slic.core.acquisition.spreadsheet import Spreadsheet\n",
|
||||
"\n",
|
||||
"import os\n",
|
||||
"os.chdir(\"/sf/cristallina/applications/slic/cristallina\")\n",
|
||||
"# %run /sf/cristallina/applications/slic/cristallina/cristallina.py\n",
|
||||
"from devices.diffractometer import diffractometer\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 27,
|
||||
"id": "c4f812f4-b6fa-463f-a367-121e139b972b",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"spreadsheet = Spreadsheet({\"TD\": diffractometer.td},\n",
|
||||
" placeholders=('comment', 'sample'),\n",
|
||||
" host='saresc-vcons-02.psi.ch',\n",
|
||||
" port=9090,)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 23,
|
||||
"id": "2c6852f5-9aa5-4d4b-8c1c-7558720f3e2e",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"Motor \"SARES30-CPCL-ECMC02:TD\" at 115.00409000000013 mm"
|
||||
]
|
||||
},
|
||||
"execution_count": 23,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"diffractometer.td"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 22,
|
||||
"id": "026350d2-a6bf-4b02-abcc-f560b22bbdfb",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
" a b c\n",
|
||||
"0 2 3 4"
|
||||
]
|
||||
},
|
||||
"execution_count": 22,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"spreadsheet.client.add_row(a=2, b=3, c=4)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 28,
|
||||
"id": "2dddb44b-689f-4cdb-858f-103610bef3c6",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Advanced run number to 192 for SF DAQ on http://sf-daq:10002 (status: idle, last run: 192).\n",
|
||||
" a b c run filename n_pulses comment sample scanned_adjs v_min v_max n_steps TD\n",
|
||||
"0 2.0 3.0 4.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN\n",
|
||||
"1 NaN NaN NaN 192.0 test_bs 10.0 Dummy 0.0 2.0 3.0 115.004265\n",
|
||||
"\u001b[32mScan step 1 of 3\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 0.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"Continuing run number 192.\n",
|
||||
"No detectors specified, using default detector list.\n",
|
||||
"No PVs specified, using default PV list.\n",
|
||||
"No channels specified, using default channel list.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████| 10/10 [00:00<00:00, 49.7 Hz]\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"run number: 192\n",
|
||||
"acq number: 1\n",
|
||||
"total acq number: 687\n",
|
||||
"\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /sf/cristallina/data/p19150/raw/run0192/data/acq0001.BSDATA.h5\n",
|
||||
"- /sf/cristallina/data/p19150/raw/run0192/data/acq0001.CAMERAS.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mScan step 2 of 3\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 1.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"Continuing run number 192.\n",
|
||||
"No detectors specified, using default detector list.\n",
|
||||
"No PVs specified, using default PV list.\n",
|
||||
"No channels specified, using default channel list.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████| 10/10 [00:00<00:00, 49.7 Hz]\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"run number: 192\n",
|
||||
"acq number: 2\n",
|
||||
"total acq number: 688\n",
|
||||
"\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /sf/cristallina/data/p19150/raw/run0192/data/acq0002.BSDATA.h5\n",
|
||||
"- /sf/cristallina/data/p19150/raw/run0192/data/acq0002.CAMERAS.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mScan step 3 of 3\n",
|
||||
"\u001b[39mDummyAdjustable \"Dummy\" at 2.0\n",
|
||||
"Moved adjustables, starting acquisition\n",
|
||||
"Continuing run number 192.\n",
|
||||
"No detectors specified, using default detector list.\n",
|
||||
"No PVs specified, using default PV list.\n",
|
||||
"No channels specified, using default channel list.\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████| 10/10 [00:00<00:00, 49.7 Hz]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"run number: 192\n",
|
||||
"acq number: 3\n",
|
||||
"total acq number: 689\n",
|
||||
"\n",
|
||||
"DAQTask: done\n",
|
||||
"\n",
|
||||
"Output files:\n",
|
||||
"-------------\n",
|
||||
"- /sf/cristallina/data/p19150/raw/run0192/data/acq0003.BSDATA.h5\n",
|
||||
"- /sf/cristallina/data/p19150/raw/run0192/data/acq0003.CAMERAS.h5\n",
|
||||
"Acquisition done\n",
|
||||
"\u001b[32mAll scan steps done\n",
|
||||
"\u001b[39m"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"perform the following scan:\n",
|
||||
"===========================\n",
|
||||
"\n",
|
||||
"A: DummyAdjustable \"Dummy\" at 2.0\n",
|
||||
"\n",
|
||||
"# A\n",
|
||||
"- ---\n",
|
||||
"0 0.0\n",
|
||||
"1 1.0\n",
|
||||
"2 2.0\n",
|
||||
"\n",
|
||||
"record 10 pulses per step to \"test_bs\" via:\n",
|
||||
"-------------------------------------------\n",
|
||||
"- SF DAQ on http://sf-daq:10002 (status: idle, last run: 192)"
|
||||
]
|
||||
},
|
||||
"execution_count": 28,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# setup acquisition \n",
|
||||
"\n",
|
||||
"bs_example_channels = ['SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG', \"SARFE10-PBIG050-EVR0:CALCI\", \"SARES30-CAMS156-XE:x_fit_amplitude\", \"SARES30-CAMS156-XE:FPICTURE\"]\n",
|
||||
"\n",
|
||||
"# this requires an existing pgroup\n",
|
||||
"acq = SFAcquisition('example_instrument', 'p19150', default_channels=bs_example_channels, default_data_base_dir='/tmp', spreadsheet=spreadsheet)\n",
|
||||
"scanner.scan1D(dummy, 0, 2, step_size=1, n_pulses=10, filename='test_bs', acquisitions=[acq], step_info=None, return_to_initial_values=False)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "d5c65482-4b5e-4baa-943f-e35cf384b67c",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python [conda env:conda-slic]",
|
||||
"language": "python",
|
||||
"name": "conda-env-conda-slic-py"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.18"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
0
acquisition/SF_acquisition03.ipynb → acquisition/SF_jupyter_acquisition.ipynb
Normal file → Executable file
0
acquisition/SF_acquisition03.ipynb → acquisition/SF_jupyter_acquisition.ipynb
Normal file → Executable file
@ -1,71 +0,0 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "bc11382b-bbae-4541-b117-58cc4cafd737",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Playing WAVE '/tmp/ImperialMarch60.wav' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import subprocess\n",
|
||||
"res = subprocess.run([\"aplay\", \"/tmp/ImperialMarch60.wav\"])\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "baf1c729-d9e3-484a-bf51-b9eaa5e6f3ff",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Playing WAVE '/tmp/ImperialMarch60.wav' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"proc = subprocess.Popen([\"aplay /tmp/ImperialMarch60.wav\"], shell=True,\n",
|
||||
" stdin=None, stdout=None, stderr=None, close_fds=True)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "436cfe45-c941-45fa-82af-ad1a8b819eb3",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python [conda env:conda-slic]",
|
||||
"language": "python",
|
||||
"name": "conda-env-conda-slic-py"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.18"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
@ -1,248 +0,0 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "e0a0b5eb-b6bd-4fb7-abe9-8c61318260f7",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\u001b]0;⊚slic\u0007"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from slic.core.adjustable import Adjustable, PVAdjustable, DummyAdjustable\n",
|
||||
"from slic.core.scanner import Scanner\n",
|
||||
"from slic.core.acquisition import BSAcquisition, PVAcquisition, SFAcquisition\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"id": "8f30e2a0-c4d7-4bdd-a0b5-48662d807568",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"2023-10-29 at 21:54:56 | INFO | Loading started.\n",
|
||||
"2023-10-29 at 21:54:57 | INFO | Connected to stand server\n",
|
||||
"2023-10-29 at 21:54:58 | INFO | Using undulator (Aramis) offset to PSSS energy of -62 eV.\n",
|
||||
"2023-10-29 at 21:54:58 | INFO | Running at cristallina with pgroup p21563.\n",
|
||||
"2023-10-29 at 21:54:58 | INFO | Loading finished.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%run /sf/cristallina/applications/slic/cristallina/cristallina.py\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"id": "85a7d2d3-794a-49e1-9dec-2c85ebad7730",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Run the scan only when gas monitor value larger than 10uJ (and smaller than 2000uJ):\n",
|
||||
"# required fraction defines ammount of data recorded to save the step and move on to the next one\n",
|
||||
"check_intensity_gas_monitor = PVCondition(\n",
|
||||
" \"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US\",\n",
|
||||
" vmin=75,\n",
|
||||
" vmax=2000,\n",
|
||||
" wait_time=0.5,\n",
|
||||
" required_fraction=0.8,\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"id": "a627e0fb-ecf2-4e14-8c8e-e470c9558059",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"True"
|
||||
]
|
||||
},
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"check_intensity_gas_monitor.check()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"id": "a0e05c2f-2b76-4a8f-8394-b04bb4d6b2f5",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"8285.310467258269"
|
||||
]
|
||||
},
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"undulators.get()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"id": "2175e207-6df8-434c-8d00-985f1149dc27",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from slic.utils import typename, nice_linspace, nice_arange"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"id": "18767387-ae51-4d1f-a4a1-1e0015016324",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"center = 11.779\n",
|
||||
"delta = 0.1\n",
|
||||
"\n",
|
||||
"#scan.scan1D(\n",
|
||||
"# diffractometer.theta,\n",
|
||||
"# center-delta,\n",
|
||||
"# center+delta,\n",
|
||||
"# step_size=0.025,"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"id": "6d22b87f-2063-4cb7-bef0-55a4263d4890",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([11.679, 11.704, 11.729, 11.754, 11.779, 11.804, 11.829, 11.854,\n",
|
||||
" 11.879, 11.904])"
|
||||
]
|
||||
},
|
||||
"execution_count": 18,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"CA.Client.Exception...............................................\n",
|
||||
" Warning: \"Virtual circuit disconnect\"\n",
|
||||
" Context: \"SAR-CPPM-EXPMX1.psi.ch:5064\"\n",
|
||||
" Source File: ../cac.cpp line 1237\n",
|
||||
" Current Time: Wed Nov 01 2023 15:13:05.052862079\n",
|
||||
"..................................................................\n",
|
||||
"CA.Client.Exception...............................................\n",
|
||||
" Warning: \"Virtual circuit unresponsive\"\n",
|
||||
" Context: \"SAR-CPPM-EXPMX1.psi.ch:5064\"\n",
|
||||
" Source File: ../tcpiiu.cpp line 926\n",
|
||||
" Current Time: Fri Nov 03 2023 09:09:46.672425316\n",
|
||||
"..................................................................\n",
|
||||
"Unexpected problem with CA circuit to server \"SAR-CPPM-EXPMX1.psi.ch:5064\" was \"No route to host\" - disconnecting\n",
|
||||
"CA.Client.Exception...............................................\n",
|
||||
" Warning: \"Virtual circuit disconnect\"\n",
|
||||
" Context: \"SAR-CPPM-EXPMX1.psi.ch:5064\"\n",
|
||||
" Source File: ../cac.cpp line 1237\n",
|
||||
" Current Time: Fri Nov 03 2023 09:25:12.648406223\n",
|
||||
"..................................................................\n",
|
||||
"CA.Client.Exception...............................................\n",
|
||||
" Warning: \"Virtual circuit disconnect\"\n",
|
||||
" Context: \"sf-saresc-cagw-01.psi.ch:5062\"\n",
|
||||
" Source File: ../cac.cpp line 1237\n",
|
||||
" Current Time: Sun Nov 05 2023 12:20:46.598231213\n",
|
||||
"..................................................................\n",
|
||||
"CA.Client.Exception...............................................\n",
|
||||
" Warning: \"Virtual circuit disconnect\"\n",
|
||||
" Context: \"sf-saresc-cagw-01.psi.ch:5062\"\n",
|
||||
" Source File: ../cac.cpp line 1237\n",
|
||||
" Current Time: Sun Nov 05 2023 12:22:30.890766667\n",
|
||||
"..................................................................\n",
|
||||
"CA.Client.Exception...............................................\n",
|
||||
" Warning: \"Virtual circuit unresponsive\"\n",
|
||||
" Context: \"SARES30-CPPM-MOBI1.psi.ch:5064\"\n",
|
||||
" Source File: ../tcpiiu.cpp line 926\n",
|
||||
" Current Time: Mon Nov 06 2023 11:43:52.744259068\n",
|
||||
"..................................................................\n",
|
||||
"Unexpected problem with CA circuit to server \"SARES30-CPPM-MOBI1.psi.ch:5064\" was \"Connection reset by peer\" - disconnecting\n",
|
||||
"CA.Client.Exception...............................................\n",
|
||||
" Warning: \"Virtual circuit disconnect\"\n",
|
||||
" Context: \"SARES30-CPPM-MOBI1.psi.ch:5064\"\n",
|
||||
" Source File: ../cac.cpp line 1237\n",
|
||||
" Current Time: Mon Nov 06 2023 11:44:07.434289668\n",
|
||||
"..................................................................\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"positions = nice_arange(center-delta, center+delta+0.025, 0.025)\n",
|
||||
"positions\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"id": "d995a8be-f9e7-46c5-add4-7b8717f14c9b",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"positions = [11.779, 11.679, 11.704, 11.729, 11.754, 11.804, 11.829, 11.854,\n",
|
||||
" 11.879]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "ccb7f011-65d2-41e9-9c83-0d1e8ab3a9d8",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"scan.ascan_list("
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python [conda env:conda-slic]",
|
||||
"language": "python",
|
||||
"name": "conda-env-conda-slic-py"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.18"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
6
acquisition/base.py
Normal file → Executable file
6
acquisition/base.py
Normal file → Executable file
@ -1,8 +1,12 @@
|
||||
|
||||
import time
|
||||
# setup logging
|
||||
from loguru import logger
|
||||
|
||||
|
||||
# TODO
|
||||
# Most of these are outdated and workarounds for previous issues.
|
||||
# Do not use without review as for example the CTA is now much better integrated.
|
||||
|
||||
def simple_scan():
|
||||
"""
|
||||
adjustable: Adjustable names to scan.
|
||||
|
25
acquisition/multiple_daqs.py
Normal file → Executable file
25
acquisition/multiple_daqs.py
Normal file → Executable file
@ -2,9 +2,26 @@
|
||||
|
||||
from slic.core.acquisition import SFAcquisition
|
||||
|
||||
rates = {'100Hz': 1, '50Hz': 2, '25Hz': 4, '10Hz': 10, '5Hz': 20, '1Hz': 100}
|
||||
RATES = {"100Hz": 1,
|
||||
"50Hz": 2,
|
||||
"25Hz": 4,
|
||||
"10Hz": 10,
|
||||
"5Hz": 20,
|
||||
"1Hz": 100,
|
||||
}
|
||||
|
||||
def generate_DAQS(instrument, pgroup,bs_channels, pvs, detectors):
|
||||
DAQS = {name:SFAcquisition(instrument, pgroup, default_channels=bs_channels, default_pvs=pvs, default_detectors=detectors, rate_multiplicator=r) for (name, r) in rates.items()}
|
||||
|
||||
def generate_DAQS(instrument, pgroup, bs_channels, pvs, detectors, spreadsheet=None):
|
||||
DAQS = {
|
||||
name: SFAcquisition(
|
||||
instrument,
|
||||
pgroup,
|
||||
default_channels=bs_channels,
|
||||
default_pvs=pvs,
|
||||
default_detectors=detectors,
|
||||
rate_multiplicator=r,
|
||||
spreadsheet=spreadsheet,
|
||||
)
|
||||
for (name, r) in RATES.items()
|
||||
}
|
||||
return DAQS
|
||||
|
||||
|
@ -1,128 +0,0 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"id": "d1bead0c-2489-4672-ab51-5e75974dd4ab",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "NameError",
|
||||
"evalue": "name 'attenuator' is not defined",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
|
||||
"Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mattenuator\u001b[49m\u001b[38;5;241m.\u001b[39mfoils\n",
|
||||
"\u001b[0;31mNameError\u001b[0m: name 'attenuator' is not defined"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"attenuator.foils\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "b2a73dd0-1136-44b7-b625-e5fdcd8ec8dc",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"attenuator.foils.pv_names.get()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "b1e94427-0f7d-4dd9-b61a-3d65135445ff",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"attenuator.foils.pv_index.get()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "66d002ac-1625-4b0d-91c5-f7daa1bd941b",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "NameError",
|
||||
"evalue": "name 'attenuator' is not defined",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
|
||||
"Cell \u001b[0;32mIn[2], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mattenuator\u001b[49m\u001b[38;5;241m.\u001b[39mfoils\u001b[38;5;241m.\u001b[39mpv_index\u001b[38;5;241m.\u001b[39mget()\n",
|
||||
"\u001b[0;31mNameError\u001b[0m: name 'attenuator' is not defined"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"attenuator.foils.pv_index.get()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "b0f5509a-944a-4a2e-a6d1-56785beb359a",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "NameError",
|
||||
"evalue": "name 'attenuator' is not defined",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
|
||||
"Cell \u001b[0;32mIn[3], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mattenuator\u001b[49m\u001b[38;5;241m.\u001b[39mfoils\u001b[38;5;241m.\u001b[39mpv_index\u001b[38;5;241m.\u001b[39mget()\n\u001b[1;32m 3\u001b[0m \u001b[38;5;66;03m# 0 := None\u001b[39;00m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;66;03m# 1 := 2\u001b[39;00m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;66;03m# 2 := 3\u001b[39;00m\n\u001b[1;32m 6\u001b[0m \u001b[38;5;66;03m# 3 := 4\u001b[39;00m\n\u001b[1;32m 7\u001b[0m \u001b[38;5;66;03m# 4 := 5\u001b[39;00m\n",
|
||||
"\u001b[0;31mNameError\u001b[0m: name 'attenuator' is not defined"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"attenuator.foils.pv_index.get()\n",
|
||||
"\n",
|
||||
"# 0 := None\n",
|
||||
"# 1 := 2\n",
|
||||
"# 2 := 3\n",
|
||||
"# 3 := 4\n",
|
||||
"# 4 := 5\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"id": "aa5aee6a-5b3f-4693-8b52-7e142872449b",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"attenuator.foils.pv_names"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python [conda env:conda-analysis_edge] *",
|
||||
"language": "python",
|
||||
"name": "conda-env-conda-analysis_edge-py"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.11.6"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
105
beamline/Cristallina_mono.py
Executable file
105
beamline/Cristallina_mono.py
Executable file
@ -0,0 +1,105 @@
|
||||
from types import SimpleNamespace
|
||||
from time import sleep
|
||||
import numpy as np
|
||||
|
||||
from slic.core.adjustable import Adjustable, PVAdjustable, PVEnumAdjustable
|
||||
from slic.core.adjustable.pvchangemon import PVChangeMonitor
|
||||
from slic.core.device import Device
|
||||
from slic.utils.hastyepics import get_pv as PV
|
||||
from slic.devices.general.motor import Motor
|
||||
from slic.devices.cameras import CameraCA
|
||||
|
||||
class CristallinaMono(Device):
|
||||
"""Cristallina mono SAROP31-ODCC110"""
|
||||
def __init__(self, ID, name="Cristallina double-channel-cut monochromator", **kwargs):
|
||||
super().__init__(ID, name=name, **kwargs)
|
||||
|
||||
self.TX = Motor(ID + ":MOT_TX1")
|
||||
self.bragg1 = Motor(ID + ":MOT_RX1")
|
||||
self.bragg2 = Motor(ID + ":MOT_RX2")
|
||||
self.energy = Motor(ID + ":MOT_ENY")
|
||||
self.energy_offset = Motor(ID + ":MOT_OFS")
|
||||
self.screen = CristallinaMonoScreen("SAROP31-PSCR110", name='SAROP31-PSCR110')
|
||||
|
||||
class CristallinaMonoScreen(Device):
|
||||
|
||||
def __init__(self, ID, name="Profile Monitor", **kwargs):
|
||||
super().__init__(ID, name=name, **kwargs)
|
||||
|
||||
self.cam = CameraCA(ID)
|
||||
|
||||
self.target = PVEnumAdjustable(ID + ":SCR_SP", name="target")
|
||||
self.target_pos = Motor(ID + ":MOT_TY1", name="target position")
|
||||
self.target_in_position = PVEnumAdjustable(ID + ":IN_POS",name="target in valid position")
|
||||
|
||||
def move_mono(self):
|
||||
return self.target.set_target_value(1)
|
||||
|
||||
def move_pink(self):
|
||||
return self.target.set_target_value(2)
|
||||
|
||||
def move_out(self):
|
||||
return self.target.set_target_value(0)
|
||||
|
||||
|
||||
|
||||
|
||||
# class DoubleCrystalMonoEnergy(Adjustable):
|
||||
|
||||
# def __init__(self, ID, name=None):
|
||||
# self.wait_time = 0.1
|
||||
|
||||
# pvname_setvalue = "SAROP21-ARAMIS:ENERGY_SP"
|
||||
# pvname_readback = "SAROP21-ARAMIS:ENERGY"
|
||||
# pvname_moving = "SAROP21-ODCM098:MOVING"
|
||||
# pvname_stop = "SAROP21-ODCM098:STOP.PROC"
|
||||
|
||||
# pv_setvalue = PV(pvname_setvalue)
|
||||
# pv_readback = PV(pvname_readback)
|
||||
# pv_moving = PV(pvname_moving)
|
||||
# pv_stop = PV(pvname_stop)
|
||||
|
||||
# units = pv_readback.units
|
||||
# super().__init__(ID, name=name, units=units)
|
||||
|
||||
# self.pvnames = SimpleNamespace(
|
||||
# setvalue = pvname_setvalue,
|
||||
# readback = pvname_readback,
|
||||
# moving = pvname_moving,
|
||||
# stop = pvname_stop
|
||||
# )
|
||||
|
||||
# self.pvs = SimpleNamespace(
|
||||
# setvalue = pv_setvalue,
|
||||
# readback = pv_readback,
|
||||
# moving = pv_moving,
|
||||
# stop = pv_stop
|
||||
# )
|
||||
|
||||
|
||||
# def get_current_value(self):
|
||||
# return self.pvs.readback.get()
|
||||
|
||||
# def set_current_value(self, value):
|
||||
# self.pvs.setvalue.put(value)
|
||||
# sleep(3)
|
||||
|
||||
# def set_target_value(self, value):
|
||||
# self.set_current_value(value)
|
||||
# # while abs(self.wait_for_valid_value() - value) > accuracy:
|
||||
# while self.is_moving():
|
||||
# sleep(self.wait_time)
|
||||
|
||||
|
||||
# def wait_for_valid_value(self):
|
||||
# val = np.nan
|
||||
# while not np.isfinite(val):
|
||||
# val = self.get_current_value()
|
||||
# return val
|
||||
|
||||
# def is_moving(self):
|
||||
# moving = self.pvs.moving.get()
|
||||
# return bool(moving)
|
||||
|
||||
# def stop(self):
|
||||
# self.pvs.stop.put(1)
|
0
beamline/PSSS_motion.py
Normal file → Executable file
0
beamline/PSSS_motion.py
Normal file → Executable file
0
devices/alignment_laser.py → beamline/alignment_laser.py
Normal file → Executable file
0
devices/alignment_laser.py → beamline/alignment_laser.py
Normal file → Executable file
0
exp_temp/apertures.py → beamline/apertures.py
Normal file → Executable file
0
exp_temp/apertures.py → beamline/apertures.py
Normal file → Executable file
0
exp_temp/attenuator_scans.py → beamline/attenuator_scans.py
Normal file → Executable file
0
exp_temp/attenuator_scans.py → beamline/attenuator_scans.py
Normal file → Executable file
0
beamline/bernina_mono.py
Normal file → Executable file
0
beamline/bernina_mono.py
Normal file → Executable file
81
beamline/components.py
Executable file
81
beamline/components.py
Executable file
@ -0,0 +1,81 @@
|
||||
from loguru import logger
|
||||
|
||||
from slic.devices.xoptics.aramis_attenuator import Attenuator
|
||||
from slic.devices.xoptics.pulsepicker import PulsePicker
|
||||
from slic.devices.xdiagnostics.intensitymonitor import IntensityMonitorPBPS
|
||||
from .Cristallina_mono import CristallinaMono
|
||||
from .alignment_laser import AlignmentLaser
|
||||
|
||||
from slic.devices.xoptics.kb import KBHor, KBVer
|
||||
from slic.devices.xoptics.offsetmirrors import OffsetMirror
|
||||
from slic.devices.xoptics.slits import SlitUnitCenterWidth
|
||||
|
||||
from .pp_shutter import PP_Shutter
|
||||
from .i0_chamber import i0_chamber
|
||||
from .apertures import slits107, slits149
|
||||
|
||||
# Attenuators
|
||||
upstream_attenuator = Attenuator("SARFE10-OATT053", description="Aramis attenuator OATT053")
|
||||
attenuator = Attenuator("SAROP31-OATA150", description="Cristallina attenuator OATA150")
|
||||
|
||||
def test_attenuators():
|
||||
for att in (upstream_attenuator, attenuator):
|
||||
tfundamental = att.get_transmission()
|
||||
try:
|
||||
assert tfundamental > 0
|
||||
except TypeError:
|
||||
logger.warning(f"No transmission value reported from {att.ID}")
|
||||
|
||||
test_attenuators()
|
||||
|
||||
# Shutter
|
||||
pp_shutter = PP_Shutter(
|
||||
"SARES30-LTIM01-EVR0:RearUniv0-Ena-SP", name="Cristallina pulse picker shutter"
|
||||
) # Shutter button when ufasing the pulse picker
|
||||
|
||||
|
||||
pulsepicker = PulsePicker(
|
||||
"SAROP31-OPPI151",
|
||||
"SARES30-LTIM01-EVR0:Pul3",
|
||||
name="Cristallina X-ray pulse picker OPPI151",
|
||||
)
|
||||
|
||||
|
||||
# Alignment laser
|
||||
alignment_laser = AlignmentLaser(
|
||||
"SAROP31-OLAS147:MOTOR_1", name="Cristallina alignment laser OLAS147"
|
||||
)
|
||||
|
||||
pbps113 = IntensityMonitorPBPS(
|
||||
"SAROP31-PBPS113",
|
||||
# vme_crate="SAROP31-CVME-PBPS1", # please check this!
|
||||
# link=9,
|
||||
description="Intensity/position monitor in the optics hutch",
|
||||
)
|
||||
|
||||
pbps149 = IntensityMonitorPBPS(
|
||||
"SAROP31-PBPS149",
|
||||
# vme_crate="SAROP31-CVME-PBPS2", # please check this!
|
||||
# link=9,
|
||||
description="Intensity/position monitor in the experimental hutch",
|
||||
)
|
||||
|
||||
# I0 chamber
|
||||
i0 = i0_chamber('SARES30-MCS20610')
|
||||
|
||||
# Slits
|
||||
slits149 = SlitUnitCenterWidth('SAROP31-OAPU149')
|
||||
slits107 = SlitUnitCenterWidth('SAROP31-OAPU107')
|
||||
slitsi0 = i0.slits
|
||||
|
||||
# KB mirrors
|
||||
kbHor = KBHor("SAROP31-OKBH154", description="Cristallina horizontal KB mirror")
|
||||
kbVer = KBVer("SAROP31-OKBV153", description="Cristallina vertical KB mirror")
|
||||
|
||||
# Mono
|
||||
mono = CristallinaMono("SAROP31-ODCC110")
|
||||
|
||||
# Offset mirrors
|
||||
m3 = OffsetMirror('SAROP31-ODMV152')
|
||||
#TODO the other two offset mirros
|
||||
|
35
beamline/i0_chamber.py
Normal file
35
beamline/i0_chamber.py
Normal file
@ -0,0 +1,35 @@
|
||||
from slic.core.device import Device, SimpleDevice
|
||||
from slic.core.adjustable import PVAdjustable
|
||||
from slic.devices.general.motor import Motor
|
||||
|
||||
class i0_chamber(Device):
|
||||
def __init__(self, ID, name="Cristallina I0 chamber with slits and foils", process_time=1, **kwargs):
|
||||
super().__init__(ID, name=name, **kwargs)
|
||||
|
||||
self.foils = Motor(ID+":MCS3")
|
||||
self.slits = i0_slits_unit(ID,name="Cristallina I0 chamber slits")
|
||||
|
||||
class i0_slits_unit(Device):
|
||||
def __init__(self, ID, **kwargs):
|
||||
super().__init__(ID, **kwargs)
|
||||
|
||||
self.x = SimpleDevice(ID + "-X",
|
||||
center = PVAdjustable(ID + "-XSLIT:SLIT_POS",units='mm'),
|
||||
width = PVAdjustable(ID + "-XSLIT:SLIT_WIDTH",units='mm')
|
||||
)
|
||||
|
||||
self.y = SimpleDevice(ID + "-Y",
|
||||
center = PVAdjustable(ID + "-YSLIT:SLIT_POS",units='mm'),
|
||||
width = PVAdjustable(ID + "-YSLIT:SLIT_WIDTH",units='mm')
|
||||
)
|
||||
|
||||
self.motors = i0_slits_motors(ID,name='Individual I0 chamber slit motors')
|
||||
|
||||
class i0_slits_motors(Device):
|
||||
def __init__(self, ID, **kwargs):
|
||||
super().__init__(ID, **kwargs)
|
||||
|
||||
self.x1 = Motor(ID + ":MCS4")
|
||||
self.x2 = Motor(ID + ":MCS5")
|
||||
self.y1 = Motor(ID + ":MCS2")
|
||||
self.y2 = Motor(ID + ":MCS1")
|
0
exp_temp/kb_focusing.py → beamline/kb_focusing.py
Normal file → Executable file
0
exp_temp/kb_focusing.py → beamline/kb_focusing.py
Normal file → Executable file
605
beamline/photon_energy.py
Executable file
605
beamline/photon_energy.py
Executable file
@ -0,0 +1,605 @@
|
||||
import time
|
||||
from time import sleep
|
||||
|
||||
import numpy as np
|
||||
from epics import PV
|
||||
|
||||
from logzero import logger as log
|
||||
|
||||
from slic.core.adjustable import Adjustable, PVAdjustable, PVEnumAdjustable
|
||||
from slic.core.scanner.scanbackend import wait_for_all # , stop_all
|
||||
|
||||
import subprocess
|
||||
|
||||
UND_NAME_FMT = "SARUN{:02}-UIND030"
|
||||
N_UND_CHIC = None
|
||||
|
||||
N_UNDS = list(range(3, 15 + 1))
|
||||
# N_UNDS.remove(N_UND_CHIC) # does not exist
|
||||
|
||||
# offsets fro undulators, PSSS and DCCM
|
||||
# convention: energy_device = energy_master - energy_offset_device
|
||||
# readback_energy is energy_undulator + offset_undulator
|
||||
# move the PSSS motor and the DCCM motor according to the energy_master
|
||||
# TODO: improve this hack
|
||||
|
||||
|
||||
### SETTINGS ####
|
||||
|
||||
PSSS_MOVE = True
|
||||
DCCM_MOVE = False
|
||||
TRAJECTORY_FEEDBACK_DISABLE_ENABLE = False
|
||||
POINTING_FEEDFORWARD = False
|
||||
|
||||
energy_offset_undulators = -21 # eV
|
||||
energy_offset_PSSS = -9 # eV
|
||||
energy_offset_DCCM = -11 # eV
|
||||
|
||||
DCCM_RX2_energy_offset = 32.4 # eV
|
||||
|
||||
################
|
||||
|
||||
|
||||
def print_configuration():
|
||||
print(f"PSSS_MOVE = {PSSS_MOVE}")
|
||||
print(f"DCCM_MOVE = {DCCM_MOVE}")
|
||||
print(f"TRAJECTORY_FEEDBACK_DISABLE_ENABLE = {TRAJECTORY_FEEDBACK_DISABLE_ENABLE}")
|
||||
print(f"POINTING_FEEDFORWARD = {POINTING_FEEDFORWARD}")
|
||||
print(f"Undulator energy offset = {energy_offset_undulators}")
|
||||
print(f"PSSS energy offset = {energy_offset_PSSS}")
|
||||
print(f"DCCM energy offset = {energy_offset_DCCM}")
|
||||
print(f" DCCM RX2 energy offset = {DCCM_RX2_energy_offset}")
|
||||
|
||||
|
||||
|
||||
def pointing_slope_X(energy):
|
||||
#delta_X_predicted = -0.0010097 * (energy - 10000)**2 + 0.002622 * (energy - 10000) - 0.3225 # function derived from calibration energy scan
|
||||
delta_X_predicted = (energy - 10000) * 10 # function derived from calibration energy scan
|
||||
#pointing_X_predicted = delta_X_predicted * 0.01829+ 0.009650
|
||||
pointing_X_predicted = delta_X_predicted / 113 * 4.5
|
||||
return pointing_X_predicted
|
||||
|
||||
|
||||
def pointing_slope_Y(energy):
|
||||
#delta_Y_predicted = ...
|
||||
delta_Y_predicted = (energy - 10000) * 10 # function derived from calibration energy scan
|
||||
#pointing_Y_predicted = ...
|
||||
pointing_Y_predicted = delta_Y_predicted / 113 * 4.5
|
||||
return pointing_Y_predictedS
|
||||
|
||||
|
||||
def set_PSSS_energy(energy: float):
|
||||
"""When scanning the energy with the undulator we
|
||||
adjust the spectrometer to follow.
|
||||
"""
|
||||
print(f"Adjusting PSSS to {energy}")
|
||||
PSSS_energy_PV_name = "SARFE10-PSSS059:ENERGY"
|
||||
PSSS_energy_PV = PV(PSSS_energy_PV_name)
|
||||
PSSS_energy_PV.put(energy, wait=True)
|
||||
|
||||
ret = subprocess.run(["python", "/sf/photo/src/PSSS_motor/qt/PSSS_motion.py", "-s", "-m5", "SARFE10-PSSS059"])
|
||||
|
||||
sleep(2)
|
||||
|
||||
if ret.returncode != 0:
|
||||
log.warning("WARNING: PSSS adjustment failed.")
|
||||
else:
|
||||
print("Finished adjusting PSSS.")
|
||||
|
||||
|
||||
def set_DCCM_energy(energy: float):
|
||||
"""When scanning the energy with the undulator we
|
||||
adjust the monochromator to follow.
|
||||
"""
|
||||
print(f"Adjusting DCCM to {energy}")
|
||||
|
||||
DCCM_energy_PV_name = "SAROP31-ODCC110:MOT_ENY"
|
||||
DCCM_energy_PV = PV(DCCM_energy_PV_name)
|
||||
|
||||
DCCM_energy_offset_PV_name = "SAROP31-ODCC110:MOT_OFS"
|
||||
DCCM_energy_offset_PV = PV(DCCM_energy_offset_PV_name)
|
||||
|
||||
DCCM_energy_offset_PV.put(DCCM_RX2_energy_offset, wait=True)
|
||||
DCCM_energy_PV.put(energy, wait=False)
|
||||
DCCM_energy_offset_PV.put(DCCM_RX2_energy_offset, wait=False)
|
||||
|
||||
print(f"Finished adjusting DCCM.")
|
||||
|
||||
sleep(0.2)
|
||||
|
||||
|
||||
def enable_trajectory_feedback():
|
||||
print(f"Enabling trajectory FB")
|
||||
TrFB_PV_name = "SFB_POINTING_AR:ONOFF1"
|
||||
TrFB_PV = PV(TrFB_PV_name)
|
||||
TrFB_PV.put("ON")
|
||||
sleep(0.2)
|
||||
|
||||
def disable_trajectory_feedback():
|
||||
print(f"Disabling trajectory FB")
|
||||
TrFB_PV_name = "SFB_POINTING_AR:ONOFF1"
|
||||
TrFB_PV = PV(TrFB_PV_name)
|
||||
TrFB_PV.put("OFF")
|
||||
sleep(0.2)
|
||||
|
||||
|
||||
def set_pointing(energy):
|
||||
print(f"Pointing correction")
|
||||
PointingSlopeX_PV_name = "SGE-HL-FPAR:X-SLOPE1"
|
||||
PointingSlopeY_PV_name = "SGE-HL-FPAR:Y-SLOPE1"
|
||||
PointingSlopeX_PV = PV(PointingSlopeX_PV_name)
|
||||
PointingSlopeY_PV = PV(PointingSlopeY_PV_name)
|
||||
|
||||
PointingSlopeX = pointing_slope_X(energy)
|
||||
PointingSlopeY = pointing_slope_Y(energy)
|
||||
print(f" X-slope = {PointingSlopeX} um")
|
||||
print(f" Y-slope = {PointingSlopeY} um")
|
||||
|
||||
PointingSlopeX_PV.put(PointingSlopeX)
|
||||
PointingSlopeY_PV.put(PointingSlopeY)
|
||||
sleep(0.2)
|
||||
|
||||
|
||||
|
||||
class PhotonEnergy(Adjustable):
|
||||
"""
|
||||
for n_und_ref=None (default), the reference undulator currently used by the machine will be used
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self, n_unds=N_UNDS, n_und_ref=None, scaled=True, ID="ARAMIS_UNDULATORS", name="Cristallina photon energy", units="eV"
|
||||
):
|
||||
# # don't allow setting these since there's no chic :)
|
||||
# chic_fudge_offset = 0
|
||||
# adjust_chic = False
|
||||
|
||||
super().__init__(ID, name=name, units=units)
|
||||
|
||||
machine_n_und_ref = get_machine_n_und_ref()
|
||||
|
||||
if n_und_ref is None:
|
||||
if machine_n_und_ref is None:
|
||||
raise ValueError(
|
||||
f"could not read reference undulator currently used by the machine, please specify n_und_ref"
|
||||
)
|
||||
n_und_ref = machine_n_und_ref
|
||||
|
||||
if n_und_ref != machine_n_und_ref:
|
||||
log.warning(
|
||||
f"the chosen reference undulator ({n_und_ref}) is not the reference undulator currently used by the machine ({machine_n_und_ref})"
|
||||
)
|
||||
|
||||
n_unds = list(n_unds)
|
||||
|
||||
if N_UND_CHIC in n_unds:
|
||||
log.warning(
|
||||
f"the CHIC ({N_UND_CHIC}) is in the list of active undulators: {n_unds}, and will be ignored/removed"
|
||||
)
|
||||
n_unds.remove(N_UND_CHIC)
|
||||
|
||||
if n_und_ref not in n_unds:
|
||||
raise ValueError(f"the reference undulator ({n_und_ref}) is not in the list of active undulators: {n_unds}")
|
||||
|
||||
self.n_unds = n_unds
|
||||
self.n_und_ref = n_und_ref
|
||||
|
||||
self.und_names = und_names = [UND_NAME_FMT.format(n) for n in n_unds]
|
||||
self.und_name_cal = und_name_cal = UND_NAME_FMT.format(n_und_ref)
|
||||
|
||||
self.adjs = {name: Undulator(name) for name in und_names}
|
||||
# self.chic = CHIC(chic_fudge_offset, name, units)
|
||||
# self.phases = Phases(n_unds)
|
||||
|
||||
# self.adjust_chic = adjust_chic
|
||||
self.scaled = scaled
|
||||
|
||||
self.convert = ConverterEK()
|
||||
|
||||
a = self.adjs[und_name_cal]
|
||||
self.scale = ScalerEK(a)
|
||||
|
||||
def set_target_value(self, energy_master, hold=False):
|
||||
|
||||
value = energy_master + energy_offset_undulators
|
||||
k = self.convert.K(value)
|
||||
|
||||
if np.isnan(k):
|
||||
print("K is nan for", value)
|
||||
return
|
||||
print(f"{k} <- {value}")
|
||||
|
||||
ks_current = [a.get_current_value(readback=False) for a in self.adjs.values()]
|
||||
|
||||
if self.scaled:
|
||||
header = "scaled: "
|
||||
ks_target = self.scale.K(value, ks_current)
|
||||
else:
|
||||
header = "all equal:"
|
||||
ks_target = k * np.ones_like(ks_current)
|
||||
|
||||
print(header, ks_target)
|
||||
print()
|
||||
|
||||
def change():
|
||||
|
||||
|
||||
if not DCCM_MOVE:
|
||||
print("no DCCM movement enabled")
|
||||
else:
|
||||
energy_DCCM = energy_master + energy_offset_DCCM
|
||||
set_DCCM_energy(energy_DCCM)
|
||||
|
||||
if not TRAJECTORY_FEEDBACK_DISABLE_ENABLE:
|
||||
print("No trajectory feedback disabling performed.")
|
||||
else:
|
||||
disable_trajectory_feedback()
|
||||
|
||||
print(f"Setting undulator energy to {value}")
|
||||
|
||||
# TODO: replace by set_all_target_values_and_wait when print not needed anymore
|
||||
tasks = []
|
||||
for (name, a), k_old, k_new in zip(self.adjs.items(), ks_current, ks_target):
|
||||
delta = k_old - k_new
|
||||
print(f"{name}: {k_old}\t->\t{k_new}\t({delta})")
|
||||
if np.isnan(k_new):
|
||||
print(f"{name} skipped since target K is nan")
|
||||
continue
|
||||
t = a.set_target_value(k_new, hold=False)
|
||||
tasks.append(t)
|
||||
wait_for_all(tasks)
|
||||
|
||||
# # make sure new K values have been written TODO: needed?
|
||||
# sleep(2) # check if this can be shortened back to 0.5
|
||||
|
||||
# # switching on radial motors ...
|
||||
# wait_for_all([
|
||||
# a.adj_radial_on.set_target_value(1, hold=False) for a in self.adjs.values()
|
||||
# ])
|
||||
|
||||
# # press a few times
|
||||
# for _ in range(3):
|
||||
# # ... and pushing go to ensure proper movements
|
||||
# wait_for_all([
|
||||
# a.adj_radial_go.set_target_value(1, hold=False) for a in self.adjs.values()
|
||||
# ])
|
||||
# sleep(0.2)
|
||||
|
||||
# # make sure the undulators finished moving TODO: needed?
|
||||
# sleep(5)
|
||||
|
||||
# if self.adjust_chic:
|
||||
# print("CHIC adjustment follows")
|
||||
## self.chic.set_target_value(value, hold=False).wait() #TODO: test whether an additional sleep is needed
|
||||
# self.phases.set(value)
|
||||
# print("CHIC adjustment done")
|
||||
# else:
|
||||
# print("CHIC adjustment skipped")
|
||||
|
||||
# make sure the undulators and phases finished moving TODO: needed?
|
||||
sleep(5)
|
||||
|
||||
if not PSSS_MOVE:
|
||||
print("no PSSS movement enabled")
|
||||
else:
|
||||
energy_PSSS = energy_master + energy_offset_PSSS
|
||||
print(f"Adjusting PSSS to {energy_PSSS}")
|
||||
set_PSSS_energy(energy_PSSS)
|
||||
|
||||
if not POINTING_FEEDFORWARD:
|
||||
print("No pointing correction performed.")
|
||||
else:
|
||||
set_pointing(energy_master)
|
||||
|
||||
|
||||
if not TRAJECTORY_FEEDBACK_DISABLE_ENABLE:
|
||||
print("No trajectory feedback enabling performed.")
|
||||
else:
|
||||
enable_trajectory_feedback()
|
||||
|
||||
|
||||
|
||||
return self._as_task(change, hold=hold)
|
||||
|
||||
|
||||
def get_current_value(self):
|
||||
n = self.und_name_cal
|
||||
a = self.adjs[n]
|
||||
k = a.get_current_value()
|
||||
energy = self.convert.E(k) - energy_offset_undulators
|
||||
|
||||
# all_ks = [a.get_current_value() for a in self.adjs.values()]
|
||||
# checks = np.isclose(all_ks, k, rtol=0, atol=0.001)
|
||||
# if not all(checks):
|
||||
# print(f"Warning: Ks are not all close to {k}:")
|
||||
# for name, k, chk in zip(self.adjs.keys(), all_ks, checks):
|
||||
# if not chk:
|
||||
# print(name, k)
|
||||
|
||||
return energy # if we need to fudge the number to match the mono, do it here!
|
||||
|
||||
|
||||
def get_current_value_undulators_real(self):
|
||||
n = self.und_name_cal
|
||||
a = self.adjs[n]
|
||||
k = a.get_current_value()
|
||||
energy = self.convert.E(k)
|
||||
|
||||
# all_ks = [a.get_current_value() for a in self.adjs.values()]
|
||||
# checks = np.isclose(all_ks, k, rtol=0, atol=0.001)
|
||||
# if not all(checks):
|
||||
# print(f"Warning: Ks are not all close to {k}:")
|
||||
# for name, k, chk in zip(self.adjs.keys(), all_ks, checks):
|
||||
# if not chk:
|
||||
# print(name, k)
|
||||
|
||||
return energy # if we need to fudge the number to match the mono, do it here!
|
||||
|
||||
|
||||
def get_current_value_DCCM(self):
|
||||
|
||||
DCCM_energy_PV_name = "SAROP31-ODCC110:MOT_ENY"
|
||||
DCCM_energy_PV = PV(DCCM_energy_PV_name)
|
||||
|
||||
energy = DCCM_energy_PV.get() - energy_offset_DCCM
|
||||
|
||||
return energy
|
||||
|
||||
def get_current_value_DCCM_real(self):
|
||||
|
||||
DCCM_energy_PV_name = "SAROP31-ODCC110:MOT_ENY"
|
||||
DCCM_energy_PV = PV(DCCM_energy_PV_name)
|
||||
|
||||
energy = DCCM_energy_PV.get()
|
||||
|
||||
return energy
|
||||
|
||||
|
||||
def get_current_value_PSSS(self):
|
||||
|
||||
PSSS_energy_PV_name = "SARFE10-PSSS059:ENERGY"
|
||||
PSSS_energy_PV = PV(PSSS_energy_PV_name)
|
||||
|
||||
energy = PSSS_energy_PV.get() - energy_offset_PSSS
|
||||
|
||||
return energy
|
||||
|
||||
def get_current_value_PSSS_real(self):
|
||||
|
||||
PSSS_energy_PV_name = "SARFE10-PSSS059:ENERGY"
|
||||
PSSS_energy_PV = PV(PSSS_energy_PV_name)
|
||||
|
||||
energy = PSSS_energy_PV.get()
|
||||
|
||||
return energy
|
||||
|
||||
def print_energies_with_offset_correction(self):
|
||||
print("Real photon energies with offset correction")
|
||||
print(f" Undulator = {self.get_current_value()} eV")
|
||||
print(f" PSSS = {self.get_current_value_PSSS()} eV")
|
||||
print(f" DCCM = {self.get_current_value_DCCM()} eV")
|
||||
|
||||
def print_energies(self):
|
||||
print("Real photon energies")
|
||||
print(f" Undulator = {self.get_current_value_undulators_real()} eV")
|
||||
print(f" PSSS = {self.get_current_value_PSSS_real()} eV")
|
||||
print(f" DCCM = {self.get_current_value_DCCM_real()} eV")
|
||||
|
||||
|
||||
def is_moving(self):
|
||||
return any(a.is_moving() for a in self.adjs)
|
||||
|
||||
|
||||
class Undulator(PVAdjustable):
|
||||
def __init__(self, name, accuracy=0.0005):
|
||||
pvname_setvalue = name + ":K_SET"
|
||||
pvname_readback = pvname_setvalue # name + ":K_READ" #TODO: there are no readback values?
|
||||
super().__init__(
|
||||
pvname_setvalue,
|
||||
pvname_readback=pvname_readback,
|
||||
accuracy=accuracy,
|
||||
active_move=True,
|
||||
name=name,
|
||||
internal=True,
|
||||
)
|
||||
self.adj_energy = PVAdjustable(name + ":FELPHOTENE", internal=True)
|
||||
|
||||
# self.adj_radial_on = PVAdjustable(name + ":RADIAL-ON", internal=True) #TODO: do not exist
|
||||
# self.adj_radial_go = PVAdjustable(name + ":RADIAL-GO", internal=True) #TODO: do not exist
|
||||
# self.adj_radial_on_proc = PVAdjustable(name + ":RADIAL-ON.PROC", internal=True)
|
||||
# self.adj_radial_go_proc = PVAdjustable(name + ":RADIAL-GO.PROC", internal=True)
|
||||
|
||||
@property
|
||||
def energy(self):
|
||||
return self.adj_energy.get_current_value() * 1000
|
||||
|
||||
|
||||
class ConverterEK:
|
||||
h = 4.135667696e-15 # eV * s
|
||||
c = 299792458 # m / s
|
||||
lambda_u = 15e-3 # m
|
||||
const = 2 * h * c / lambda_u # eV
|
||||
|
||||
electron_rest_energy = 0.51099895 # MeV
|
||||
|
||||
# was: pvname_electron_energy="SATCL01-MBND100:P-READ"
|
||||
# was: pvname_electron_energy="SATCB01:ENE-FILT-OP"
|
||||
def __init__(self, pvname_electron_energy="SARCL02-MBND100:P-READ"): # S30CB13:ENE-FILT-OP
|
||||
self.pv_electron_energy = PV(pvname_electron_energy)
|
||||
|
||||
def K(self, energy):
|
||||
f = self.get_factor()
|
||||
v = f / energy - 1
|
||||
return np.sqrt(2 * v)
|
||||
|
||||
def E(self, k_value):
|
||||
f = self.get_factor()
|
||||
v = 1 + k_value**2 / 2
|
||||
return f / v
|
||||
|
||||
def get_factor(self):
|
||||
return self.const * self.get_gamma_squared()
|
||||
|
||||
def get_gamma_squared(self):
|
||||
electron_energy = self.pv_electron_energy.get()
|
||||
gamma = electron_energy / self.electron_rest_energy
|
||||
return gamma**2
|
||||
|
||||
|
||||
class ScalerEK:
|
||||
def __init__(self, und_reference):
|
||||
self.und = und_reference
|
||||
|
||||
def K(self, energy_target, K_current=None):
|
||||
if K_current is None:
|
||||
K_current = self.und.get_current_value()
|
||||
K_current = np.asarray(K_current)
|
||||
energy_current = self.und.energy
|
||||
energy_ratio = energy_current / energy_target
|
||||
K_target_squared = energy_ratio * (K_current**2 + 2) - 2
|
||||
return np.sqrt(K_target_squared)
|
||||
|
||||
|
||||
# class CHIC(PVAdjustable):
|
||||
#
|
||||
# def __init__(self, fudge_offset, name, units):
|
||||
# self.fudge_offset = fudge_offset
|
||||
# name += " CHIC Energy"
|
||||
# super().__init__("SATUN-CHIC:PHOTON-ENERGY", name=name)
|
||||
# self.pvs.start = PV("SATUN-CHIC:APPLY-DELAY-OFFSET-PHASE")
|
||||
# self.units = units
|
||||
#
|
||||
#
|
||||
# def set_target_value(self, value, hold=False):
|
||||
# fudge_offset = self.fudge_offset
|
||||
# print("CHIC fudge offset is", fudge_offset)
|
||||
# value -= fudge_offset
|
||||
# value /= 1000
|
||||
#
|
||||
# def change():
|
||||
# sleep(1)
|
||||
# print("CHIC setvalue")
|
||||
# self.pvs.setvalue.put(value, wait=True)
|
||||
# print("CHIC start")
|
||||
# self.pvs.start.put(1, wait=True)
|
||||
# #TODO: test whether an additional sleep is needed
|
||||
# sleep(1)
|
||||
#
|
||||
# return self._as_task(change, hold=hold)
|
||||
#
|
||||
#
|
||||
# def get_current_value(self):
|
||||
# return super().get_current_value() * 1000
|
||||
|
||||
|
||||
# class TwoColorChicane(PVAdjustable):
|
||||
#
|
||||
# def __init__(self, name):#, t0=0):
|
||||
## self.t0 = t0
|
||||
## name += " Two Color Chicane"
|
||||
# super().__init__("SATUN14-MBND100:I-SET", "SATUN14-MBND100:I-READ", process_time=1, name=name)
|
||||
#
|
||||
## def set_target_value(self, value, hold=False):
|
||||
## super().set_target_value(value)
|
||||
#
|
||||
## def get_current_value(self):
|
||||
## return super().get_current_value()
|
||||
|
||||
|
||||
# class Phases:
|
||||
#
|
||||
# def __init__(self, n_unds=N_UNDS):
|
||||
# # 22 does not have a chicane
|
||||
# n_unds = n_unds.copy()
|
||||
# if 22 in n_unds:
|
||||
# n_unds.remove(22)
|
||||
#
|
||||
# # 22 does not have a chicane
|
||||
# n_unds_all = N_UNDS.copy()
|
||||
# if 22 in n_unds_all:
|
||||
# n_unds_all.remove(22)
|
||||
#
|
||||
# self.cb_auto_good = {i: PV(f"SATUN{i:02}-CHIC:AUTO-PHASING") for i in n_unds}
|
||||
# self.cb_auto_bad = {i: PV(f"SATUN{i:02}-CHIC:AUTO-PHASING") for i in set(n_unds_all) - set(n_unds)}
|
||||
#
|
||||
# self.pv_fixed_energy = PV("SATUN-CHIC:FIX_PHOTON_ENERGY")
|
||||
# self.pv_energy = PV("SATUN-CHIC:PHOTON-ENERGY")
|
||||
#
|
||||
#
|
||||
# def set(self, energy):
|
||||
# for cb in self.cb_auto_good.values(): cb.put(int(False))
|
||||
# for cb in self.cb_auto_bad.values(): cb.put(int(False))
|
||||
# sleep(0.1)
|
||||
#
|
||||
# pv_fixed_energy = self.pv_fixed_energy
|
||||
#
|
||||
# current_state = pv_fixed_energy.get()
|
||||
# pv_fixed_energy.put(int(True)) # enforce fixed energy
|
||||
#
|
||||
# self.pv_energy.put(energy / 1000) # in keV
|
||||
# sleep(0.1)
|
||||
#
|
||||
# for cb in self.cb_auto_good.values(): cb.put(int(True))
|
||||
# sleep(0.1)
|
||||
#
|
||||
# for cb in self.cb_auto_good.values(): cb.put(int(False))
|
||||
# for cb in self.cb_auto_bad.values(): cb.put(int(False))
|
||||
# sleep(0.1)
|
||||
#
|
||||
## pv_fixed_energy.put(current_state) # reset to original state
|
||||
|
||||
|
||||
# class Phases:
|
||||
|
||||
# def __init__(self, n_unds=N_UNDS):
|
||||
# # 22 does not have a chicane
|
||||
# n_unds = n_unds.copy()
|
||||
# if 22 in n_unds:
|
||||
# n_unds.remove(22)
|
||||
# self.pv_energy = PV("SATUN-CHIC:PHOTON-ENERGY")
|
||||
# self.pv_fixed_energy = PV("SATUN-CHIC:FIX_PHOTON_ENERGY")
|
||||
# self.adjs_apply = {i: PVAdjustable(f"SATUN{i:02}-CHIC:APPLY-DOP", internal=True) for i in n_unds}
|
||||
|
||||
|
||||
# def set(self, energy):
|
||||
# pv_energy = self.pv_energy
|
||||
# pv_fixed_energy = self.pv_fixed_energy
|
||||
|
||||
# current_state = pv_fixed_energy.get()
|
||||
# pv_fixed_energy.put(int(True)) # enforce fixed energy
|
||||
|
||||
# pv_energy.put(energy / 1000) # in keV
|
||||
|
||||
# sleep(0.1)
|
||||
# self.update()
|
||||
## sleep(10)
|
||||
|
||||
# pv_fixed_energy.put(current_state) # reset to original state
|
||||
|
||||
|
||||
# def update(self):
|
||||
# wait_for_all([
|
||||
# adj_apply.set_target_value(1) for adj_apply in self.adjs_apply.values()
|
||||
# ])
|
||||
|
||||
|
||||
def get_machine_n_und_ref():
|
||||
|
||||
for attempt in range(3):
|
||||
try:
|
||||
res = PVEnumAdjustable("SARUN:REF-UND").get()
|
||||
if not res.startswith("SARUN"):
|
||||
return None
|
||||
except AttributeError as e:
|
||||
print("Error getting undulator, retrying")
|
||||
print(e)
|
||||
time.sleep(1)
|
||||
else:
|
||||
break
|
||||
|
||||
n = len("SARUN")
|
||||
res = res[n:]
|
||||
try:
|
||||
res = int(res)
|
||||
except ValueError:
|
||||
return None
|
||||
return res
|
4
devices/pp_shutter.py → beamline/pp_shutter.py
Normal file → Executable file
4
devices/pp_shutter.py → beamline/pp_shutter.py
Normal file → Executable file
@ -3,7 +3,9 @@ from slic.utils import typename
|
||||
|
||||
|
||||
class PP_Shutter:
|
||||
"""Class for when pulse picker is used as a shutter. Opening and closing is done with turning on and off the event reciever universal output ON and OFF."""
|
||||
"""Class for when pulse picker is used as a shutter.
|
||||
Opening and closing is done with turning on and off the event receiver universal output ON and OFF.
|
||||
"""
|
||||
|
||||
def __init__(self, ID, name="X-ray Pulse Picker Shutter"):
|
||||
self.ID = ID
|
1
devices/pulse_picker.py → beamline/pulse_picker.py
Normal file → Executable file
1
devices/pulse_picker.py → beamline/pulse_picker.py
Normal file → Executable file
@ -1,6 +1,7 @@
|
||||
|
||||
from epics import PV
|
||||
|
||||
# TODO: all these values have not been checked since the reorganization of the EVR outputs!
|
||||
def pp_normal(opening = True):
|
||||
""" Set pulse picker to fixed open or closed mode.
|
||||
"""
|
4
beamline/undulator.py
Normal file → Executable file
4
beamline/undulator.py
Normal file → Executable file
@ -23,8 +23,8 @@ N_UNDS = list(range(3, 15 + 1))
|
||||
# Cristallina without calibration
|
||||
# offset is the difference between PSSS and undulator setpoint
|
||||
# sign convention: Undulator - PSSS
|
||||
energy_offset = -104 # eV
|
||||
|
||||
energy_offset = 0 # eV
|
||||
# PSSS = 8355 eV, machine = 8253 eV
|
||||
|
||||
# move the PSSS motor according to the energy
|
||||
# TODO: improve this hack
|
||||
|
BIN
channels/.pv_channels.py.swp
Executable file
BIN
channels/.pv_channels.py.swp
Executable file
Binary file not shown.
371
channels/bs_channels.py
Normal file → Executable file
371
channels/bs_channels.py
Normal file → Executable file
@ -1,16 +1,17 @@
|
||||
# Channels to save at Cristallina endstation
|
||||
|
||||
##########################################################################################################
|
||||
##########################################################################################################
|
||||
##########################################################################################################
|
||||
# BS channels
|
||||
### JUNGFRAU DETECTORS
|
||||
|
||||
from slic.core.acquisition.detcfg import DetectorConfig
|
||||
|
||||
# TODO: JF settings regarding raw conversion, compression, etc.
|
||||
detectors = [
|
||||
# "JF16T03V01",
|
||||
"JF17T16V01",
|
||||
"JF16T03V02", # 1.5M from 2025
|
||||
# "JF16T03V01", # 1.5M from 2022
|
||||
# "JF17T16V01", # 8M
|
||||
"JF20T01V01", # IO
|
||||
# "JF05T01V01", # 0.5M stripsel borrowed from Bernina, now registered in esc network
|
||||
]
|
||||
|
||||
# ALLOWED_PARAMS = dict(
|
||||
@ -22,38 +23,86 @@ detectors = [
|
||||
# downsample = tuple,
|
||||
# factor = Number,
|
||||
# geometry = bool,
|
||||
# remove_raw_files = bool,
|
||||
# roi = dict, #TODO: check on contents of the dict?
|
||||
# remove_raw_files = bool,
|
||||
# roi = dict, # TODO: test with these definitions: {'beam': [1775, 1875, 1070, 1170]} achtung: doesnt work with geometry = True
|
||||
# save_dap_results = bool
|
||||
# )
|
||||
|
||||
detectors_with_config = DetectorConfig(detectors)
|
||||
detectors = DetectorConfig(detectors)
|
||||
# detectors_with_config["JF16T03V01"]['save_dap_results'] = True
|
||||
# detectors_with_config["JF16T03V01"]['remove_raw_files'] = True
|
||||
|
||||
# JF 1.5M default settings
|
||||
detectors["JF16T03V02"]['remove_raw_files'] = True
|
||||
detectors["JF16T03V02"]['factor'] = 0.1 # Some useful compromise to save space.
|
||||
detectors["JF16T03V02"]['adc_to_energy'] = True
|
||||
detectors["JF16T03V02"]['compression'] = True
|
||||
detectors["JF16T03V02"]['save_dap_results'] = False
|
||||
detectors["JF16T03V02"]['geometry'] = True
|
||||
|
||||
# I0 JF default settings
|
||||
detectors["JF20T01V01"]['remove_raw_files'] = True
|
||||
detectors["JF20T01V01"]['factor'] = 1 # Some useful compromise to save space.
|
||||
detectors["JF20T01V01"]['adc_to_energy'] = True
|
||||
detectors["JF20T01V01"]['compression'] = True
|
||||
detectors["JF20T01V01"]['save_dap_results'] = False
|
||||
detectors["JF20T01V01"]['geometry'] = False
|
||||
|
||||
|
||||
detectors_I0_only = DetectorConfig(["JF20T01V01"])
|
||||
# I0 JF settings with finer resolution
|
||||
detectors["JF20T01V01"]['remove_raw_files'] = True
|
||||
detectors["JF20T01V01"]['factor'] = 0.1 # Less space saving but more resolution
|
||||
detectors["JF20T01V01"]['adc_to_energy'] = True
|
||||
detectors["JF20T01V01"]['compression'] = True
|
||||
detectors["JF20T01V01"]['save_dap_results'] = False
|
||||
detectors["JF20T01V01"]['geometry'] = False
|
||||
|
||||
|
||||
# detectors_with_config["JF16T03V01"]['disabled_modules'] = [0, 1] # bottom module:0, middle module:1, top module:2
|
||||
|
||||
#detectors["JF17T16V01"]['disabled_modules'] = [0, 1, 2, 3,
|
||||
# 9, 10, 11,
|
||||
# 12, 13, 14, 15] # bottom module:0, middle module:1, top module:2
|
||||
|
||||
|
||||
#detectors["JF17T16V01"]['remove_raw_files'] = True # We switched off quite a few modules, let's not keep all the raw data.
|
||||
#detectors["JF17T16V01"]['compression'] = True
|
||||
#detectors["JF17T16V01"]['adc_to_energy'] = True # We switched off quite a few modules, let's not keep all the raw data.
|
||||
#detectors["JF17T16V01"]['factor'] = 0.2 # Some useful compromise to save space.
|
||||
#detectors["JF17T16V01"]['save_dap_results'] = False
|
||||
#detectors["JF17T16V01"]['geometry'] = False
|
||||
|
||||
|
||||
detectors_MX = DetectorConfig()
|
||||
detectors_MX.add("JF17T16V01", adc_to_energy=True, compression=True, crystfel_lists_laser=True, double_pixels_action="mask", factor=12.08, remove_raw_files=True, save_dap_results=True, geometry=False)
|
||||
detectors_MX.add("JF17T16V01", adc_to_energy=True, compression=True, crystfel_lists_laser=True, double_pixels_action="mask", factor=12.00, remove_raw_files=True, save_dap_results=True, geometry=False)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
##########################################################################################################
|
||||
##########################################################################################################
|
||||
##########################################################################################################
|
||||
### BS CHANNELS
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### CAMERAS COLLECTED
|
||||
|
||||
camera_channels = [
|
||||
# "SARES30-CAMS156-PCO1:FPICTURE", # PCO edge camera for the wavefront analysis (from Alvra)
|
||||
# "SARES30-CAMS156-SMX-OAV:FPICTURE", # SwissMX OAV camera picture
|
||||
# "SARES30-CAMS156-SMX-OAV.jet_projection", #SWISSMX oav jET PROJECTION
|
||||
# "SARES30-CAMS156-SMX-OAV:FPICTURE", # SwissMX OAV camera picture
|
||||
# "SARES30-CAMS156-SMX-OAV.jet_projection", #SWISSMX oav jET PROJECTION
|
||||
# "SARES30-CAMS156-XE:FPICTURE", # X-ray eye
|
||||
]
|
||||
|
||||
####################
|
||||
# Machine gas intensity monitor
|
||||
channels_gas_monitor = [
|
||||
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG",
|
||||
# "SARFE10-PBPG050:SLOW-X",
|
||||
# "SARFE10-PBPG050:SLOW-Y",
|
||||
"SARFE10-PBIG050-EVR0:CALCI", # good for correlations with total beam intensity
|
||||
"SARFE10-PBPG050:HAMP-INTENSITY-CAL",
|
||||
]
|
||||
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### MACHINE
|
||||
|
||||
|
||||
# RF phases and amplitudes
|
||||
channels_RF = [
|
||||
@ -126,35 +175,38 @@ channels_RF = [
|
||||
"S30CB14-RLLE-DSP:AMPLT-VS",
|
||||
]
|
||||
|
||||
channels_Xeye = ["SARES30-CAMS156-XE:intensity",
|
||||
"SARES30-CAMS156-XE:x_center_of_mass",
|
||||
"SARES30-CAMS156-XE:x_fit_amplitude",
|
||||
"SARES30-CAMS156-XE:x_fit_mean",
|
||||
"SARES30-CAMS156-XE:x_fit_offset",
|
||||
"SARES30-CAMS156-XE:x_fit_standard_deviation",
|
||||
"SARES30-CAMS156-XE:x_fwhm",
|
||||
"SARES30-CAMS156-XE:x_profile",
|
||||
"SARES30-CAMS156-XE:x_rms",
|
||||
"SARES30-CAMS156-XE:y_center_of_mass",
|
||||
"SARES30-CAMS156-XE:y_fit_amplitude",
|
||||
"SARES30-CAMS156-XE:y_fit_mean",
|
||||
"SARES30-CAMS156-XE:y_fit_offset",
|
||||
"SARES30-CAMS156-XE:y_fit_standard_deviation",
|
||||
"SARES30-CAMS156-XE:y_fwhm",
|
||||
"SARES30-CAMS156-XE:y_profile",
|
||||
"SARES30-CAMS156-XE:y_rms",
|
||||
]
|
||||
|
||||
######################
|
||||
# PBPS053
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### FRONT-END
|
||||
|
||||
|
||||
####################
|
||||
# Gas intensity monitor PBPG050
|
||||
|
||||
channels_gas_monitor = [
|
||||
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG",
|
||||
# "SARFE10-PBPG050:SLOW-X",
|
||||
# "SARFE10-PBPG050:SLOW-Y",
|
||||
"SARFE10-PBIG050-EVR0:CALCI", # good for correlations with total beam intensity
|
||||
"SARFE10-PBPG050:HAMP-INTENSITY-CAL",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Beam position and intensity monitor PBPS053
|
||||
|
||||
channels_PBPS053 = [
|
||||
"SARFE10-PBPS053:INTENSITY",
|
||||
"SARFE10-PBPS053:XPOS",
|
||||
"SARFE10-PBPS053:YPOS",
|
||||
]
|
||||
|
||||
####################
|
||||
# PSSS059
|
||||
|
||||
###################
|
||||
# Spectrometer PSSS059
|
||||
|
||||
channels_PSSS059 = [
|
||||
"SARFE10-PSSS059:FIT-COM",
|
||||
"SARFE10-PSSS059:FIT-FWHM",
|
||||
@ -166,11 +218,13 @@ channels_PSSS059 = [
|
||||
"SARFE10-PSSS059:SPECTRUM_Y_SUM",
|
||||
"SARFE10-PSSS059:SPECTRUM_X",
|
||||
"SARFE10-PSSS059:SPECTRUM_Y",
|
||||
"SARFE10-PSSS059:FPICTURE",
|
||||
# "SARFE10-PSSS059:FPICTURE",
|
||||
"SARFE10-PSSS059:processing_parameters",
|
||||
]
|
||||
|
||||
# Large bandwidth camera
|
||||
###################
|
||||
# Spectrometer PSSS059, large bandwidth camera
|
||||
|
||||
channels_PSSS059_LB = [
|
||||
"SARFE10-PSSS059-LB:FIT-COM",
|
||||
"SARFE10-PSSS059-LB:FIT-FWHM",
|
||||
@ -183,24 +237,64 @@ channels_PSSS059_LB = [
|
||||
"SARFE10-PSSS059-LB:SPECTRUM_Y",
|
||||
"SARFE10-PSSS059-LB:SPECTRUM_Y_SUM",
|
||||
"SARFE10-PSSS059-LB:processing_parameters",
|
||||
"SARFE10-PSSS059-LB:FPICTURE",
|
||||
# "SARFE10-PSSS059-LB:FPICTURE", # only in special circumstances
|
||||
"SARFE10-PSSS059-LB:FIT-BRT",
|
||||
]
|
||||
|
||||
###################################
|
||||
## Bernina channels
|
||||
# Beam position monitor PBPS113
|
||||
channels_Bernina = [
|
||||
|
||||
###########################################################################
|
||||
#### BERNINA BRANCH until DCM
|
||||
|
||||
|
||||
###################
|
||||
# Bernina beam intensity and position monitor PBPS113 (alias PBPS103)
|
||||
|
||||
channels_PBPS113_bernina = [
|
||||
"SAROP21-PBPS103:INTENSITY",
|
||||
"SAROP21-PBPS103:INTENSITY_UJ",
|
||||
"SAROP21-PBPS103:Lnk9Ch0-PP_VAL_PD0",
|
||||
"SAROP21-PBPS103:Lnk9Ch0-PP_VAL_PD1",
|
||||
"SAROP21-PBPS103:Lnk9Ch0-PP_VAL_PD2",
|
||||
"SAROP21-PBPS103:Lnk9Ch0-PP_VAL_PD3",
|
||||
"SAROP21-PBPS103:XPOS",
|
||||
"SAROP21-PBPS103:YPOS",
|
||||
#"SAROP21-PPRM113:FPICTURE",
|
||||
"SAROP21-PPRM113:intensity",
|
||||
"SAROP21-PPRM113:x_fit_mean",
|
||||
"SAROP21-PPRM113:y_fit_mean",
|
||||
]
|
||||
###################################
|
||||
# Beam position monitor PBPS113
|
||||
|
||||
|
||||
###################
|
||||
# Bernina screen PPRM113
|
||||
|
||||
channels_PPRM113_bernina = [
|
||||
"SAROP21-PPRM113:intensity",
|
||||
"SAROP21-PPRM113:x_center_of_mass",
|
||||
"SAROP21-PPRM113:x_fit_amplitude",
|
||||
"SAROP21-PPRM113:x_fit_mean",
|
||||
"SAROP21-PPRM113:x_fit_offset",
|
||||
"SAROP21-PPRM113:x_fit_standard_deviation",
|
||||
"SAROP21-PPRM113:x_fwhm",
|
||||
"SAROP21-PPRM113:x_profile",
|
||||
"SAROP21-PPRM113:x_rms",
|
||||
"SAROP21-PPRM113:y_center_of_mass",
|
||||
"SAROP21-PPRM113:y_fit_amplitude",
|
||||
"SAROP21-PPRM113:y_fit_mean",
|
||||
"SAROP21-PPRM113:y_fit_offset",
|
||||
"SAROP21-PPRM113:y_fit_standard_deviation",
|
||||
"SAROP21-PPRM113:y_fwhm",
|
||||
"SAROP21-PPRM113:y_profile",
|
||||
"SAROP21-PPRM113:y_rms",
|
||||
# "SAROP31-PPRM113:FPICTURE", # full pictures for debugging purposes at the moment, from _ib process
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### CRISTALLINA BRANCH
|
||||
|
||||
|
||||
###################
|
||||
## Beam position and intensity monitor PBPS113
|
||||
|
||||
channels_PBPS113 = [
|
||||
"SAROP31-PBPS113:INTENSITY",
|
||||
"SAROP31-PBPS113:INTENSITY_UJ",
|
||||
@ -208,9 +302,11 @@ channels_PBPS113 = [
|
||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD1",
|
||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD2",
|
||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD3",
|
||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD4",
|
||||
"SAROP31-PBPS113:XPOS",
|
||||
"SAROP31-PBPS113:YPOS",
|
||||
]
|
||||
|
||||
channels_PBPS113_waveforms = [
|
||||
"SAROP31-PBPS113:Lnk9Ch0-WF-DATA",
|
||||
"SAROP31-PBPS113:Lnk9Ch1-WF-DATA",
|
||||
@ -230,8 +326,18 @@ channels_PBPS113_waveforms = [
|
||||
"SAROP31-PBPS113:Lnk9Ch15-WF-DATA",
|
||||
]
|
||||
|
||||
####################
|
||||
# Profile monitor PPRM113 (from _proc process)
|
||||
|
||||
###################
|
||||
# Diode PDIM113
|
||||
|
||||
channels_PDIM113 = [
|
||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD4",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Beam profile monitor PPRM113
|
||||
|
||||
channels_PPRM113 = [
|
||||
"SAROP31-PPRM113:intensity",
|
||||
"SAROP31-PPRM113:x_center_of_mass",
|
||||
@ -253,13 +359,10 @@ channels_PPRM113 = [
|
||||
# "SAROP31-PPRM113:FPICTURE", # full pictures for debugging purposes at the moment, from _ib process
|
||||
]
|
||||
|
||||
###########################
|
||||
# Beam position monitor PBPS149
|
||||
# "SARES30-CAMS156-PCO1:FPICTURE", # PCO edge camera for the wavefront analysis (from Alvra)
|
||||
# "SARES30-CAMS156-SMX-OAV:FPIC
|
||||
|
||||
###########################
|
||||
# Beam position monitor
|
||||
###################
|
||||
# Beam position and intensity monitor PBPS149
|
||||
|
||||
channels_PBPS149 = [
|
||||
"SAROP31-PBPS149:INTENSITY",
|
||||
"SAROP31-PBPS149:INTENSITY_UJ",
|
||||
@ -271,6 +374,7 @@ channels_PBPS149 = [
|
||||
"SAROP31-PBPS149:YPOS",
|
||||
]
|
||||
|
||||
|
||||
#######################
|
||||
# Profile monitor PPRM150 (from _proc process)
|
||||
channels_PPRM150 = [
|
||||
@ -294,14 +398,32 @@ channels_PPRM150 = [
|
||||
# "SAROP31-PPRM150:FPICTURE", # full pictures for debugging purposes at the moment, from _ib process
|
||||
]
|
||||
|
||||
|
||||
####################
|
||||
# Diode under screen between the KB's PSCD153
|
||||
|
||||
channels_PSCD153 = [
|
||||
"SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD4",
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### GENERAL PURPOSE EXPERIMENT
|
||||
|
||||
|
||||
#######################
|
||||
# Cristallina event reciever
|
||||
|
||||
channels_EVR = [
|
||||
"SAR-CVME-TIFALL6:EvtSet",
|
||||
]
|
||||
|
||||
|
||||
#######################
|
||||
# Digitizer
|
||||
|
||||
channels_digitizer = [
|
||||
# extra non-beam synchronous channels:
|
||||
#"SARES30-LTIM01-EVR0:DUMMY_PV1_NBS",
|
||||
@ -310,33 +432,132 @@ channels_digitizer = [
|
||||
#"SARES30-LTIM01-EVR0:DUMMY_PV4_NBS",
|
||||
# other EVR channels:
|
||||
"SARES30-LSCP1-FNS:CH0:VAL_GET", # Signal-Background
|
||||
"SARES30-LSCP1-FNS:CH1:VAL_GET", # Signal-Background
|
||||
"SARES30-LSCP1-FNS:CH2:VAL_GET", # Signal-Background
|
||||
"SARES30-LSCP1-FNS:CH3:VAL_GET", # Signal-Background
|
||||
"SARES30-LSCP1-FNS:CH4:VAL_GET", # Signal-Background
|
||||
"SARES30-LSCP1-FNS:CH5:VAL_GET", # Signal-Background
|
||||
"SARES30-LSCP1-FNS:CH6:VAL_GET", # Signal-Background
|
||||
"SARES30-LSCP1-FNS:CH7:VAL_GET", # Signal-Background
|
||||
"SARES30-LSCP1-CRISTA1:CH0:1", # Waveform signal
|
||||
"SARES30-LSCP1-CRISTA1:CH2:1", # Waveform trigger
|
||||
"SARES30-LSCP1-CRISTA1:CH1:1", # Waveform signal
|
||||
"SARES30-LSCP1-CRISTA1:CH2:1", # Waveform signal
|
||||
"SARES30-LSCP1-CRISTA1:CH3:1", # Waveform signal
|
||||
"SARES30-LSCP1-CRISTA1:CH4:1", # Waveform signal
|
||||
"SARES30-LSCP1-CRISTA1:CH5:1", # Waveform signal
|
||||
"SARES30-LSCP1-CRISTA1:CH6:1", # Waveform signal
|
||||
"SARES30-LSCP1-CRISTA1:CH7:1", # Waveform signal
|
||||
# "SARES30-LSCP1-CRISTA1:CH2:1", # Waveform trigger
|
||||
"SARES30-LTIM01-EVR0:CALCI", # Calculated intensity
|
||||
]
|
||||
|
||||
|
||||
#######################
|
||||
# Other BS channels that we sometimes use
|
||||
channels_other = [
|
||||
# "SARFE10-PPRM053:FPICTURE", # TODO: Test if this works here
|
||||
# "SARFE10-PPRM064:FPICTURE", # TODO: Test if this works here
|
||||
]
|
||||
# X-ray eye
|
||||
|
||||
channels_Xeye = [
|
||||
"SARES30-CAMS156-XE:intensity",
|
||||
"SARES30-CAMS156-XE:x_center_of_mass",
|
||||
"SARES30-CAMS156-XE:x_fit_amplitude",
|
||||
"SARES30-CAMS156-XE:x_fit_mean",
|
||||
"SARES30-CAMS156-XE:x_fit_offset",
|
||||
"SARES30-CAMS156-XE:x_fit_standard_deviation",
|
||||
"SARES30-CAMS156-XE:x_fwhm",
|
||||
"SARES30-CAMS156-XE:x_profile",
|
||||
"SARES30-CAMS156-XE:x_rms",
|
||||
"SARES30-CAMS156-XE:y_center_of_mass",
|
||||
"SARES30-CAMS156-XE:y_fit_amplitude",
|
||||
"SARES30-CAMS156-XE:y_fit_mean",
|
||||
"SARES30-CAMS156-XE:y_fit_offset",
|
||||
"SARES30-CAMS156-XE:y_fit_standard_deviation",
|
||||
"SARES30-CAMS156-XE:y_fwhm",
|
||||
"SARES30-CAMS156-XE:y_profile",
|
||||
"SARES30-CAMS156-XE:y_rms",
|
||||
# "SARES30-CAMS156-XE:FPICTURE",
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### CRISTALLINA-Q EXPERIMENT
|
||||
|
||||
|
||||
#######################
|
||||
# Diffractometer 1 bs_channels
|
||||
|
||||
ID_dm1 = "SARES31-GPS"
|
||||
diffractometer_1_bs = [
|
||||
ID_dm1 + ":ROT2THETA-BS",
|
||||
ID_dm1 + ":ROTTHETA-BS",
|
||||
ID_dm1 + ":TRX-BS",
|
||||
ID_dm1 + ":TRY-BS",
|
||||
ID_dm1 + ":TRZ-BS",
|
||||
ID_dm1 + ":TD-BS",
|
||||
ID_dm1 + ":TRXBASE-BS",
|
||||
ID_dm1 + ":TRYBASE-BS",
|
||||
ID_dm1 + ":TRYBASE-Avg-BS",
|
||||
ID_dm1 + "::CALC1",
|
||||
ID_dm1 + "::CALC2",
|
||||
ID_dm1 + "::CALC3",
|
||||
ID_dm1 + "::CALC4",
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### CHANNEL GROUPS
|
||||
|
||||
|
||||
bs_channels = (
|
||||
camera_channels
|
||||
+ channels_gas_monitor
|
||||
channels_gas_monitor
|
||||
# + channels_RF
|
||||
# + channels_Xeye
|
||||
+ channels_PBPS053
|
||||
+ channels_PSSS059
|
||||
+ channels_PSSS059_LB
|
||||
+ channels_PBPS113
|
||||
# + channels_PBPS113_waveforms
|
||||
+ channels_PDIM113
|
||||
# + channels_PPRM113
|
||||
+ channels_PBPS149
|
||||
# + channels_PBPS149_waveforms
|
||||
# + channels_PPRM150 # only if screen is inserted
|
||||
+ channels_PSCD153
|
||||
+ channels_EVR
|
||||
# + channels_digitizer
|
||||
+ channels_other
|
||||
+ channels_digitizer
|
||||
# + channels_Xeye
|
||||
# + diffractometer_1_bs
|
||||
# + camera_channels
|
||||
)
|
||||
|
||||
|
||||
bs_channels_cristallina_beamline = (
|
||||
channels_gas_monitor
|
||||
# + channels_RF
|
||||
+ channels_PBPS053
|
||||
+ channels_PSSS059
|
||||
+ channels_PSSS059_LB
|
||||
+ channels_PBPS113
|
||||
# + channels_PBPS113_waveforms
|
||||
+ channels_PDIM113
|
||||
# + channels_PPRM113
|
||||
+ channels_PBPS149
|
||||
# + channels_PBPS149_waveforms
|
||||
# + channels_PPRM150 # only if screen is inserted
|
||||
+ channels_PSCD153
|
||||
+ channels_EVR
|
||||
)
|
||||
|
||||
|
||||
bs_channels_bernina_DCM = (
|
||||
channels_gas_monitor
|
||||
# + channels_RF
|
||||
+ channels_PBPS053
|
||||
+ channels_PSSS059
|
||||
+ channels_PSSS059_LB
|
||||
+ channels_PBPS113_bernina
|
||||
# + channels_PPRM113_bernina
|
||||
)
|
||||
|
@ -1,259 +0,0 @@
|
||||
# Channels at Cristallina endstation
|
||||
|
||||
|
||||
##########################################################################################################
|
||||
# BS channels
|
||||
|
||||
# TODO: JF settings regarding raw conversion, compression, etc.
|
||||
detectors = [
|
||||
# "JF16T03V01",
|
||||
]
|
||||
|
||||
####################
|
||||
channels_gas_monitor = [
|
||||
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG",
|
||||
"SARFE10-PBPG050:SLOW-X",
|
||||
"SARFE10-PBPG050:SLOW-Y",
|
||||
"SARFE10-PBIG050-EVR0:CALCI", # good for correlations with total beam intensity
|
||||
"SARFE10-PBPG050:HAMP-INTENSITY-CAL",
|
||||
]
|
||||
|
||||
######################
|
||||
### PCO edge camera for the wavefront analysis
|
||||
channels_PCO = [
|
||||
"SARES30-CAMS156-PCO1:FPICTURE",
|
||||
]
|
||||
|
||||
######################
|
||||
### SwissMX OAV camera picture
|
||||
channels_OAV = [] # "SARES30-CAMS156-SMX-OAV:FPICTURE",
|
||||
|
||||
######################
|
||||
### PBPS053
|
||||
channels_PBPS053 = [
|
||||
"SARFE10-PBPS053:INTENSITY",
|
||||
"SARFE10-PBPS053:XPOS",
|
||||
"SARFE10-PBPS053:YPOS",
|
||||
]
|
||||
|
||||
###################################
|
||||
### Beam position monitor PBPS113
|
||||
channels_PBPS113 = [
|
||||
"SAROP31-PBPS113:INTENSITY",
|
||||
"SAROP31-PBPS113:INTENSITY_UJ",
|
||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD0",
|
||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD1",
|
||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD2",
|
||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD3",
|
||||
"SAROP31-PBPS113:Lnk9Ch0-PP_VAL_PD4",
|
||||
"SAROP31-PBPS113:XPOS",
|
||||
"SAROP31-PBPS113:YPOS",
|
||||
]
|
||||
|
||||
|
||||
####################
|
||||
## PSS059
|
||||
channels_pss059 = [
|
||||
# "SARFE10-PSSS059:FPICTURE", # full pictures only when really needed
|
||||
"SARFE10-PSSS059:SPECTRUM_X",
|
||||
"SARFE10-PSSS059:SPECTRUM_Y",
|
||||
"SARFE10-PSSS059:SPECTRUM_CENTER",
|
||||
"SARFE10-PSSS059:SPECTRUM_COM",
|
||||
"SARFE10-PSSS059:SPECTRUM_FWHM",
|
||||
"SARFE10-PSSS059:SPECTRUM_STD",
|
||||
"SARFE10-PSSS059:FIT_ERR",
|
||||
"SARFE10-PSSS059:processing_parameters",
|
||||
# SARFE10-PSSS059:SPECTRUM_AVG_CENTER
|
||||
# SARFE10-PSSS059:SPECTRUM_AVG_FWHM
|
||||
# SARFE10-PSSS059:SPECTRUM_AVG_Y
|
||||
]
|
||||
|
||||
|
||||
#######################
|
||||
# from _proc process
|
||||
channels_PPRM113 = [
|
||||
"SAROP31-PPRM113:intensity",
|
||||
"SAROP31-PPRM113:x_center_of_mass",
|
||||
"SAROP31-PPRM113:x_fit_amplitude",
|
||||
"SAROP31-PPRM113:x_fit_mean",
|
||||
"SAROP31-PPRM113:x_fit_offset",
|
||||
"SAROP31-PPRM113:x_fit_standard_deviation",
|
||||
"SAROP31-PPRM113:x_fwhm",
|
||||
"SAROP31-PPRM113:x_profile",
|
||||
"SAROP31-PPRM113:x_rms",
|
||||
"SAROP31-PPRM113:y_center_of_mass",
|
||||
"SAROP31-PPRM113:y_fit_amplitude",
|
||||
"SAROP31-PPRM113:y_fit_mean",
|
||||
"SAROP31-PPRM113:y_fit_offset",
|
||||
"SAROP31-PPRM113:y_fit_standard_deviation",
|
||||
"SAROP31-PPRM113:y_fwhm",
|
||||
"SAROP31-PPRM113:y_profile",
|
||||
"SAROP31-PPRM113:y_rms",
|
||||
# "SAROP31-PPRM113:FPICTURE", # full pictures for debugging purposes at the moment, from _ib process
|
||||
]
|
||||
|
||||
#######################
|
||||
# from _proc process
|
||||
channels_PPRM150 = [
|
||||
"SAROP31-PPRM150:intensity",
|
||||
"SAROP31-PPRM150:x_center_of_mass",
|
||||
"SAROP31-PPRM150:x_fit_amplitude",
|
||||
"SAROP31-PPRM150:x_fit_mean",
|
||||
"SAROP31-PPRM150:x_fit_offset",
|
||||
"SAROP31-PPRM150:x_fit_standard_deviation",
|
||||
"SAROP31-PPRM150:x_fwhm",
|
||||
"SAROP31-PPRM150:x_profile",
|
||||
"SAROP31-PPRM150:x_rms",
|
||||
"SAROP31-PPRM150:y_center_of_mass",
|
||||
"SAROP31-PPRM150:y_fit_amplitude",
|
||||
"SAROP31-PPRM150:y_fit_mean",
|
||||
"SAROP31-PPRM150:y_fit_offset",
|
||||
"SAROP31-PPRM150:y_fit_standard_deviation",
|
||||
"SAROP31-PPRM150:y_fwhm",
|
||||
"SAROP31-PPRM150:y_profile",
|
||||
"SAROP31-PPRM150:y_rms",
|
||||
# "SAROP31-PPRM150:FPICTURE", # full pictures for debugging purposes at the moment, from _ib process
|
||||
]
|
||||
|
||||
###########################
|
||||
# Beam position monitor
|
||||
channel_PBPS149 = [
|
||||
"SAROP31-PBPS149:INTENSITY",
|
||||
"SAROP31-PBPS149:INTENSITY_UJ",
|
||||
"SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD0",
|
||||
"SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD1",
|
||||
"SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD2",
|
||||
"SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD3",
|
||||
"SAROP31-PBPS149:Lnk9Ch0-PP_VAL_PD4",
|
||||
"SAROP31-PBPS149:XPOS",
|
||||
"SAROP31-PBPS149:YPOS",
|
||||
]
|
||||
|
||||
|
||||
further_channels = [
|
||||
####################
|
||||
## Digitizer
|
||||
# Integration limits
|
||||
"SARES30-LTIM01-EVR0:DUMMY_PV1_NBS",
|
||||
"SARES30-LTIM01-EVR0:DUMMY_PV2_NBS",
|
||||
"SARES30-LTIM01-EVR0:DUMMY_PV3_NBS",
|
||||
"SARES30-LTIM01-EVR0:DUMMY_PV4_NBS",
|
||||
# Signal-Background
|
||||
"SARES30-LSCP1-FNS:CH0:VAL_GET",
|
||||
# Waveform signal
|
||||
"SARES30-LSCP1-CRISTA1:CH0:1",
|
||||
# Waveform trigger
|
||||
"SARES30-LSCP1-CRISTA1:CH2:1",
|
||||
# Calculated intensity
|
||||
"SARES30-LTIM01-EVR0:CALCI",
|
||||
]
|
||||
|
||||
|
||||
channels = (
|
||||
channels_gas_monitor
|
||||
+ channels_PCO
|
||||
+ channels_OAV
|
||||
+ channels_PBPS053
|
||||
+ channels_pss059
|
||||
+ channels_PPRM113
|
||||
+ channels_PPRM150
|
||||
+ channel_PBPS149
|
||||
+ channel_PBPS149
|
||||
+ further_channels
|
||||
)
|
||||
|
||||
##########################################################################################################
|
||||
|
||||
pv_channels = [
|
||||
####################
|
||||
## OAPU044
|
||||
"SARFE10-OAPU044:MOTOR_X",
|
||||
"SARFE10-OAPU044:MOTOR_Y",
|
||||
"SARFE10-OAPU044:MOTOR_W",
|
||||
"SARFE10-OAPU044:MOTOR_H",
|
||||
####################
|
||||
## OATT053
|
||||
"SARFE10-OATT053:MOTOR_1",
|
||||
"SARFE10-OATT053:MOTOR_1.RBV",
|
||||
"SARFE10-OATT053:MOTOR_2",
|
||||
"SARFE10-OATT053:MOTOR_2.RBV",
|
||||
"SARFE10-OATT053:MOTOR_3",
|
||||
"SARFE10-OATT053:MOTOR_3.RBV",
|
||||
"SARFE10-OATT053:MOTOR_4",
|
||||
"SARFE10-OATT053:MOTOR_4.RBV",
|
||||
"SARFE10-OATT053:MOTOR_5",
|
||||
"SARFE10-OATT053:MOTOR_5.RBV",
|
||||
"SARFE10-OATT053:MOTOR_6",
|
||||
"SARFE10-OATT053:MOTOR_6.RBV",
|
||||
"SARFE10-OATT053:ENERGY",
|
||||
"SARFE10-OATT053:TRANS_SP",
|
||||
"SARFE10-OATT053:TRANS_RB",
|
||||
####################
|
||||
## OATA150
|
||||
"SAROP31-OATA150:MOTOR_1",
|
||||
"SAROP31-OATA150:MOTOR_2",
|
||||
"SAROP31-OATA150:MOTOR_3",
|
||||
"SAROP31-OATA150:MOTOR_4",
|
||||
"SAROP31-OATA150:MOTOR_5",
|
||||
"SAROP31-OATA150:MOTOR_6",
|
||||
####################
|
||||
## PSSS
|
||||
"SARFE10-PSSS059:MOTOR_Y3.VAL",
|
||||
"SARFE10-PSSS059:MOTOR_ROT_X3.VAL",
|
||||
"SARFE10-PSSS059:MOTOR_X5.VAL",
|
||||
"SARFE10-PSSS059:MOTOR_X3.VAL",
|
||||
###########################
|
||||
# KB mirrors
|
||||
"SAROP31-OKBV153:W_X.RBV",
|
||||
"SAROP31-OKBV153:W_Y.RBV",
|
||||
"SAROP31-OKBV153:W_RX.RBV",
|
||||
"SAROP31-OKBV153:W_RY.RBV",
|
||||
"SAROP31-OKBV153:W_RZ.RBV",
|
||||
"SAROP31-OKBV153:BU.RBV",
|
||||
"SAROP31-OKBV153:BD.RBV",
|
||||
"SAROP31-OKBV153:TY1.RBV",
|
||||
"SAROP31-OKBV153:TY2.RBV",
|
||||
"SAROP31-OKBV153:TY3.RBV",
|
||||
"SAROP31-OKBV153:TX1.RBV",
|
||||
"SAROP31-OKBV153:TX2.RBV",
|
||||
"SAROP31-OKBH154:W_X.RBV",
|
||||
"SAROP31-OKBH154:W_Y.RBV",
|
||||
"SAROP31-OKBH154:W_RX.RBV",
|
||||
"SAROP31-OKBH154:W_RY.RBV",
|
||||
"SAROP31-OKBH154:W_RZ.RBV",
|
||||
"SAROP31-OKBH154:BU.RBV",
|
||||
"SAROP31-OKBH154:BD.RBV",
|
||||
"SAROP31-OKBH154:TY1.RBV",
|
||||
"SAROP31-OKBH154:TY2.RBV",
|
||||
"SAROP31-OKBH154:TY3.RBV",
|
||||
"SAROP31-OKBH154:TX2.RBV",
|
||||
####################
|
||||
## FEL Photon Energy
|
||||
"SARUN:FELPHOTENE",
|
||||
###################
|
||||
## FEL Photon Pulse Energy
|
||||
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG",
|
||||
]
|
||||
|
||||
pvs_slits = [
|
||||
# TODO: PVS slits can't be read by the DAQ module currently. Therefore disabled it.
|
||||
# "SARFE10-OAPU044:MOTOR_X.VAL",
|
||||
# "SARFE10-OAPU044:MOTOR_X.RBV"
|
||||
]
|
||||
|
||||
pvs_apertures = [
|
||||
"SAROP31-OAPU149:MOTOR_X.VAL", # the x pos of the aperture
|
||||
"SAROP31-OAPU149:MOTOR_X.RBV", # the x pos of the aperture
|
||||
]
|
||||
|
||||
###############################
|
||||
smaract_channels = [
|
||||
"SARES30-XSMA156:X:MOTRBV",
|
||||
"SARES30-XSMA156:Y:MOTRBV",
|
||||
"SARES30-XSMA156:Z:MOTRBV",
|
||||
"SARES30-XSMA156:Ry:MOTRBV",
|
||||
"SARES30-XSMA156:Rx:MOTRBV",
|
||||
"SARES30-XSMA156:Rz:MOTRBV",
|
||||
]
|
||||
|
||||
pvs = pvs_slits + pv_channels + smaract_channels
|
@ -1,15 +0,0 @@
|
||||
# Channels at Cristallina endstation
|
||||
|
||||
|
||||
##########################################################################################################
|
||||
# BS channels
|
||||
|
||||
# TODO: JF settings regarding raw conversion, compression, etc.
|
||||
detectors_min = [
|
||||
# "JF16T03V01",
|
||||
]
|
||||
|
||||
|
||||
channels_min = ["SARFE10-PSSS059:SPECTRUM_Y"]
|
||||
|
||||
pvs_min = ["SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG"] # pvs_slits + pv_channels + smaract_channels
|
596
channels/pv_channels.py
Normal file → Executable file
596
channels/pv_channels.py
Normal file → Executable file
@ -1,15 +1,15 @@
|
||||
##########################################################################################################
|
||||
##########################################################################################################
|
||||
##########################################################################################################
|
||||
# Epics PVS
|
||||
### EPICS PVS
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### MACHINE
|
||||
|
||||
# Compression, charge settings
|
||||
#######################
|
||||
# Machine
|
||||
pvs_machine = [
|
||||
"SARCL02-MBND100:P-READ", # Predicted bunch energy
|
||||
"SARUN:FELPHOTENE.VAL", # Predicted photon energy from machine settings
|
||||
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG.VAL", # Average pulse energy from the gas detector
|
||||
]
|
||||
|
||||
# accelerator parameters
|
||||
@ -83,8 +83,10 @@ pvs_RF = [
|
||||
"S30CB14-RSYS:GET-VSUM-AMPLT-SCALE",
|
||||
]
|
||||
|
||||
|
||||
#######################
|
||||
# Undulator gap
|
||||
|
||||
pvs_undulator = [
|
||||
"SARUN03-UIND030:K_SET.VAL",
|
||||
"SARUN04-UIND030:K_SET.VAL",
|
||||
@ -99,17 +101,24 @@ pvs_undulator = [
|
||||
"SARUN13-UIND030:K_SET.VAL",
|
||||
"SARUN14-UIND030:K_SET.VAL",
|
||||
"SARUN15-UIND030:K_SET.VAL",
|
||||
"SFB_POINTING_AR:SP1",
|
||||
"SFB_POINTING_AR:SP2",
|
||||
"SFB_POINTING_AR:ONOFF1",
|
||||
"SGE-HL-FPAR:X-SLOPE1",
|
||||
"SGE-HL-FPAR:Y-SLOPE1",
|
||||
"SGE-HL-FPAR:X-OFFSET1",
|
||||
"SGE-HL-FPAR:Y-OFFSET1",
|
||||
]
|
||||
|
||||
####################
|
||||
# Machine gas intensity monitor
|
||||
pvs_gas_monitor = [
|
||||
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US",
|
||||
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-DS",
|
||||
]
|
||||
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### FRONT-END
|
||||
|
||||
#####################
|
||||
# Slits OAPU044
|
||||
|
||||
pvs_OAPU044 = [
|
||||
"SARFE10-OAPU044:MOTOR_X",
|
||||
"SARFE10-OAPU044:MOTOR_Y",
|
||||
@ -117,37 +126,30 @@ pvs_OAPU044 = [
|
||||
"SARFE10-OAPU044:MOTOR_H",
|
||||
]
|
||||
|
||||
|
||||
####################
|
||||
# Gas intensity monitor PBPG050
|
||||
|
||||
pvs_gas_monitor = [
|
||||
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US",
|
||||
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-DS",
|
||||
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-AVG",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Beam position monitor PBPS053
|
||||
# Beam position and intensity monitor PBPS053
|
||||
|
||||
pvs_PBPS053 = [
|
||||
"SARFE10-PBPS053:MOTOR_X1",
|
||||
"SARFE10-PBPS053:MOTOR_X2",
|
||||
# "SARFE10-PBPS053:MOTOR_X2", # Not available, disabled
|
||||
"SARFE10-PBPS053:MOTOR_PROBE",
|
||||
]
|
||||
|
||||
###################
|
||||
# Spectrometer PSSS059
|
||||
pvs_PSSS059 = [
|
||||
"SARFE10-PSSS055:MOTOR_X1.RBV",
|
||||
"SARFE10-PSSS055:MOTOR_Y1.RBV",
|
||||
"SARFE10-PSSS055:MOTOR_ROT_X1.RBV",
|
||||
"SARFE10-PSSS055:MOTOR_PROBE.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_X3.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_Y3.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_ROT_X3.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_Y4.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_ROT_X4.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_X5.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_Y5.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_Z5.RBV",
|
||||
"SARFE10-PSSS055:GRATING_SP",
|
||||
"SARFE10-PSSS059:CRYSTAL_SP",
|
||||
"SARFE10-PSSS059:SPC_ROI_YMIN",
|
||||
"SARFE10-PSSS059:SPC_ROI_YMAX",
|
||||
]
|
||||
|
||||
####################
|
||||
# Upstream attenuator OATT053
|
||||
|
||||
pvs_OATT053_old = [
|
||||
"SARFE10-OATT053:MOTOR_1",
|
||||
"SARFE10-OATT053:MOTOR_1.RBV",
|
||||
@ -169,6 +171,7 @@ pvs_OATT053_old = [
|
||||
|
||||
####################
|
||||
# New Upstream attenuator OATT053
|
||||
|
||||
pvs_OATT053 = [
|
||||
"SARFE10-OATT053:photonenergy", # Photon energy for Transmission
|
||||
"SARFE10-OATT053:transmission", # Total Transmission of all stages
|
||||
@ -183,19 +186,183 @@ pvs_OATT053 = [
|
||||
"SARFE10-OATT053:MOTOR_6", # motor Motor 6
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Beam profile monitor PPRM053
|
||||
|
||||
pvs_PPRM053 = [
|
||||
"SARFE10-PPRM053:MOTOR_PROBE.RBV",
|
||||
#"SARFE10-PPRM053:FPICTURE",
|
||||
#"SARFE10-PPRM064:FPICTURE", # TODO move to correct place
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Bernina mono
|
||||
pvs_Bernina = [
|
||||
# Diode PDIM053
|
||||
|
||||
# pvs_PDIM053 = [
|
||||
# ]
|
||||
|
||||
|
||||
###################
|
||||
# Spectrometer PSSS059
|
||||
|
||||
pvs_PSSS059 = [
|
||||
"SARFE10-PSSS055:MOTOR_X1.RBV",
|
||||
"SARFE10-PSSS055:MOTOR_Y1.RBV",
|
||||
"SARFE10-PSSS055:MOTOR_ROT_X1.RBV",
|
||||
"SARFE10-PSSS055:MOTOR_PROBE.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_X3.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_Y3.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_ROT_X3.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_Y4.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_ROT_X4.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_X5.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_Y5.RBV",
|
||||
"SARFE10-PSSS059:MOTOR_Z5.RBV",
|
||||
"SARFE10-PSSS055:GRATING_SP",
|
||||
"SARFE10-PSSS059:CRYSTAL_SP",
|
||||
"SARFE10-PSSS059:SPC_ROI_YMIN",
|
||||
"SARFE10-PSSS059:SPC_ROI_YMAX",
|
||||
"SARFE10-PSSS055:MOTOR_PROBE.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# PPRM064
|
||||
|
||||
# pvs_PPRM064 = [
|
||||
# ]
|
||||
|
||||
|
||||
###################
|
||||
# Alvra M1 horizontal offset mirror
|
||||
|
||||
# pvs_OOMH064 = [
|
||||
# ]
|
||||
|
||||
|
||||
###################
|
||||
# PPRM066
|
||||
|
||||
# pvs_PPRM066 = [
|
||||
# ]
|
||||
|
||||
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### BERNINA BRANCH until DCM
|
||||
|
||||
|
||||
###################
|
||||
# Bernina photon energy
|
||||
|
||||
pvs_photon_energy_bernina = [
|
||||
"SAROP21-ARAMIS:ENERGY_SP",
|
||||
"SAROP21-ARAMIS:ENERGY",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Bernina apertures OAPU092
|
||||
|
||||
pvs_OAPU092_bernina = [
|
||||
"SAROP21-OAPU092:MOTOR_X.RBV",
|
||||
"SAROP21-OAPU092:MOTOR_Y.RBV",
|
||||
"SAROP21-OAPU092:MOTOR_W.RBV",
|
||||
"SAROP21-OAPU092:MOTOR_H.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Bernina M1 vertical offset mirror
|
||||
|
||||
pvs_OOMV092_bernina = [
|
||||
"SAROP21-OOMV092:W_X.RBV",
|
||||
"SAROP21-OOMV092:W_Y.RBV",
|
||||
"SAROP21-OOMV092:W_RX.RBV",
|
||||
"SAROP21-OOMV092:W_RZ.RBV",
|
||||
"SAROP21-OOMV092:BU.RBV",
|
||||
"SAROP21-OOMV092:BD.RBV",
|
||||
"SAROP21-OOMV092:VS1.RBV",
|
||||
"SAROP21-OOMV092:VS2.RBV",
|
||||
"SAROP21-OOMV092:VS3.RBV",
|
||||
"SAROP21-OOMV092:TX.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Bernina post-M1 screen PPRM094
|
||||
|
||||
pvs_PPRM094_bernina = [
|
||||
"SAROP21-PPRM113:MOTOR_PROBE",
|
||||
#"SAROP21-PPRM113:FPICTURE",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Bernina M2 vertical offset mirror
|
||||
|
||||
pvs_OOMV096_bernina = [
|
||||
"SAROP21-OOMV096:W_X.RBV",
|
||||
"SAROP21-OOMV096:W_Y.RBV",
|
||||
"SAROP21-OOMV096:W_RX.RBV",
|
||||
"SAROP21-OOMV096:W_RZ.RBV",
|
||||
"SAROP21-OOMV096:BU.RBV",
|
||||
"SAROP21-OOMV096:BD.RBV",
|
||||
"SAROP21-OOMV096:VS1.RBV",
|
||||
"SAROP21-OOMV096:VS2.RBV",
|
||||
"SAROP21-OOMV096:VS3.RBV",
|
||||
"SAROP21-OOMV096:TX.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Bernina post-M2 screen PSCR097
|
||||
|
||||
pvs_PSCR097_bernina = [
|
||||
"SAROP21-PSCR097:MOTOR_Y1.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Bernina DCM ODCM098
|
||||
|
||||
pvs_ODCM098_bernina = [
|
||||
"SAROP21-ODCM098:RX12.RBV", # BRAGG
|
||||
"SAROP21-ODCM098:TX12.RBV", # Horizontal
|
||||
"SAROP21-ODCM098:T2.RBV", # Crystal gap T2
|
||||
"SAROP21-ODCM098:RZ1.RBV", # 1st xtal roll
|
||||
"SAROP21-ODCM098:RZ2.RBV", # 2nd xtal roll
|
||||
"SAROP21-ODCM098:RX2.RBV", # 2nd xtal pitch
|
||||
"SAROP21-ODCM098:ENERGY", # DCM photon energy
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Bernina apertures OAPU102
|
||||
|
||||
pvs_OAPU102_bernina = [
|
||||
"SAROP21-OAPU102:MOTOR_X.RBV",
|
||||
"SAROP21-OAPU102:MOTOR_Y.RBV",
|
||||
"SAROP21-OAPU102:MOTOR_W.RBV",
|
||||
"SAROP21-OAPU102:MOTOR_H.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Bernina spontaneous radiation monitor PSRD103
|
||||
|
||||
pvs_PSRD103_bernina = [
|
||||
"SAROP21-PSRD103:MOTOR_PROBE",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Bernina beam intensity and position monitor PBPS113 (alias PBPS103)
|
||||
|
||||
pvs_PBPS113_bernina = [
|
||||
"SAROP21-PBPS103:MOTOR_X1.DRBV",
|
||||
"SAROP21-PBPS103:MOTOR_Y1.DRBV",
|
||||
"SAROP21-PBPS103:MOTOR_X1.RBV",
|
||||
@ -205,8 +372,33 @@ pvs_Bernina = [
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Bernina pulse-picker OPPI113
|
||||
|
||||
pvs_OPPI113_bernina = [
|
||||
"SAROP21-OPPI113:MOTOR_X1.RBV", # X1 instead of X
|
||||
"SAROP21-OPPI113:MOTOR_Y1.RBV", # Y1 instead of X
|
||||
"SAROP21-OPPI113:TC1", # Pulse picker temperature
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Bernina screen PPRM113
|
||||
|
||||
pvs_PPRM113_bernina = [
|
||||
"SAROP21-PPRM113:MOTOR_PROBE.RBV",
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### CRISTALLINA BRANCH
|
||||
|
||||
|
||||
####################
|
||||
# First Cristallina horizontal offset mirror OOMH067
|
||||
# Cristallina M1 horizontal offset mirror OOMH067
|
||||
|
||||
pvs_OOMH067 = [
|
||||
"SAROP31-OOMH067:W_X.RBV",
|
||||
"SAROP31-OOMH067:W_Y.RBV",
|
||||
@ -222,14 +414,17 @@ pvs_OOMH067 = [
|
||||
"SAROP31-OOMH067:RY.RBV",
|
||||
]
|
||||
|
||||
|
||||
####################
|
||||
# Beam screen between the first two horizontal mirrors PSCR068
|
||||
pvs_PSCR068 = [
|
||||
"SAROP31-PSCR068:MOTOR_PROBE.RBV",
|
||||
]
|
||||
|
||||
|
||||
####################
|
||||
# Second Cristallina horizontal offset mirror OOMH084
|
||||
# Cristallina M2 horizontal offset mirror OOMH084
|
||||
|
||||
pvs_OOMH084 = [
|
||||
"SAROP31-OOMH084:W_X.RBV",
|
||||
"SAROP31-OOMH084:W_Y.RBV",
|
||||
@ -245,14 +440,18 @@ pvs_OOMH084 = [
|
||||
"SAROP31-OOMH084:RY.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Beam profile monitor PPRM085
|
||||
|
||||
pvs_PPRM085 = [
|
||||
"SAROP31-PPRM085:MOTOR_PROBE.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Slits OAPU107
|
||||
|
||||
pvs_OAPU107 = [
|
||||
"SAROP31-OAPU107:MOTOR_X.VAL",
|
||||
"SAROP31-OAPU107:MOTOR_X.RBV",
|
||||
@ -260,8 +459,34 @@ pvs_OAPU107 = [
|
||||
"SAROP31-OAPU107:MOTOR_Y.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
## Double channel-cut monochromator ODCC110
|
||||
|
||||
pvs_ODCC110 = [
|
||||
"SAROP31-ODCC110:MOT_RX1.RBV",
|
||||
"SAROP31-ODCC110:MOT_RX2.RBV",
|
||||
"SAROP31-ODCC110:MOT_ENY.RBV",
|
||||
"SAROP31-ODCC110:MOT_OFS.RBV",
|
||||
"SAROP31-ODCC110:MOT_TX1.RBV",
|
||||
"SAROP31-ODCC110:ENC_RX11",
|
||||
"SAROP31-ODCC110:ENC_RX12",
|
||||
"SAROP31-ODCC110:ENC_RX21",
|
||||
"SAROP31-ODCC110:ENC_RX22",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
## Infra-channel-cut-crystals screen PSCR110110
|
||||
|
||||
pvs_PSCR110 = [
|
||||
"SAROP31-PSCR110:MOT_TY1.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
## Beam position and intensity monitor PBPS113
|
||||
|
||||
pvs_PBPS113 = [
|
||||
"SAROP31-PBPS113:MOTOR_X1.DRBV",
|
||||
"SAROP31-PBPS113:MOTOR_Y1.DRBV",
|
||||
@ -270,20 +495,34 @@ pvs_PBPS113 = [
|
||||
"SAROP31-PBPS113:MOTOR_PROBE.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Diode PDIM113
|
||||
|
||||
pvs_PDIM113 = [
|
||||
"SAROP31-PDIM113:MOTOR_PROBE.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Beam profile monitor PPRM113
|
||||
|
||||
pvs_PPRM113 = [
|
||||
"SAROP31-PPRM113:MOTOR_PROBE.RBV",
|
||||
]
|
||||
|
||||
|
||||
####################
|
||||
# Alignment laser mirror OLAS147
|
||||
|
||||
pvs_OLAS147 = [
|
||||
"SAROP31-OLAS147:MOTOR_1.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Slits OAPU149
|
||||
|
||||
pvs_OAPU149 = [
|
||||
"SAROP31-OAPU149:MOTOR_X.RBV",
|
||||
"SAROP31-OAPU149:MOTOR_Y.RBV",
|
||||
@ -291,8 +530,10 @@ pvs_OAPU149 = [
|
||||
"SAROP31-OAPU149:MOTOR_H.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Beam position and intensity monitor PBPS149
|
||||
|
||||
pvs_PBPS149 = [
|
||||
"SAROP31-PBPS149:MOTOR_X1.DRBV",
|
||||
"SAROP31-PBPS149:MOTOR_Y1.DRBV",
|
||||
@ -301,14 +542,18 @@ pvs_PBPS149 = [
|
||||
"SAROP31-PBPS149:MOTOR_PROBE.RBV",
|
||||
]
|
||||
|
||||
|
||||
###################
|
||||
# Beam profile monitor PPRM150
|
||||
|
||||
pvs_PPRM150 = [
|
||||
"SAROP31-PPRM150:MOTOR_PROBE.RBV",
|
||||
]
|
||||
|
||||
|
||||
####################
|
||||
# Attenuators OATA150
|
||||
# Attenuators OATA150, old
|
||||
|
||||
pvs_OATA150_old = [
|
||||
"SAROP31-OATA150:MOTOR_1.RBV",
|
||||
"SAROP31-OATA150:MOTOR_2.RBV",
|
||||
@ -323,8 +568,10 @@ pvs_OATA150_old = [
|
||||
"SAROP31-OATA150:MOT2TRANS.VALD"
|
||||
]
|
||||
|
||||
|
||||
####################
|
||||
# New Attenuators OATA150
|
||||
# Attenuators OATA150
|
||||
|
||||
pvs_OATA150 = [
|
||||
"SAROP31-OATA150:photonenergy", # ai Photon energy for Transmission SAROP31-CPCL-OSAT150 swissfel
|
||||
"SAROP31-OATA150:transmission", # ai Total Transmission of all stages SAROP31-CPCL-OSAT150 swissfel
|
||||
@ -337,20 +584,25 @@ pvs_OATA150 = [
|
||||
"SAROP31-OATA150:MOTOR_4", # motor Motor 4 SAROP31-CPPM-MOT7171 swissfel
|
||||
"SAROP31-OATA150:MOTOR_5", # motor Motor 5 SAROP31-CPPM-MOT7171 swissfel
|
||||
"SAROP31-OATA150:MOTOR_6", # motor Motor 6
|
||||
"SAROP31-OATA150:UsrRec.TC1", # current transmission
|
||||
"SAROP31-OATA150:UsrRec.TR1", # resulting transmission
|
||||
"SAROP31-OATA150:UsrRec.TD", # setpoint transmission
|
||||
]
|
||||
|
||||
|
||||
|
||||
####################
|
||||
# Pulse picker OPPI151
|
||||
|
||||
pvs_OPPI151 = [
|
||||
"SAROP31-OPPI151:MOTOR_X.RBV",
|
||||
"SAROP31-OPPI151:MOTOR_Y.RBV",
|
||||
"SAROP31-OPPI151:MOTOR_X1.RBV", # X1 instead of X
|
||||
"SAROP31-OPPI151:MOTOR_Y1.RBV", # Y1 instead of X
|
||||
"SAROP31-OPPI151:TC1", # Pulse picker temperature
|
||||
]
|
||||
|
||||
|
||||
####################
|
||||
## Horizontal offset mirror ODMV152
|
||||
|
||||
pvs_ODMV152 = [
|
||||
"SAROP31-ODMV152:W_X.RBV",
|
||||
"SAROP31-ODMV152:W_Y.RBV",
|
||||
@ -364,8 +616,10 @@ pvs_ODMV152 = [
|
||||
"SAROP31-ODMV152:TX.RBV",
|
||||
]
|
||||
|
||||
|
||||
###########################
|
||||
# Vertical KB mirror OKBV153
|
||||
|
||||
pvs_OKBV153 = [
|
||||
"SAROP31-OKBV153:W_X.RBV",
|
||||
"SAROP31-OKBV153:W_Y.RBV",
|
||||
@ -381,14 +635,18 @@ pvs_OKBV153 = [
|
||||
"SAROP31-OKBV153:TX2.RBV",
|
||||
]
|
||||
|
||||
|
||||
####################
|
||||
# Screen between the KB's PSCD153
|
||||
|
||||
pvs_PSCD153 = [
|
||||
"SAROP31-PSCD153:MOTOR_PROBE.RBV"
|
||||
]
|
||||
|
||||
|
||||
###########################
|
||||
# Horizontal KB mirror OKBH154
|
||||
|
||||
pvs_OKBH154 = [
|
||||
"SAROP31-OKBH154:W_X.RBV",
|
||||
"SAROP31-OKBH154:W_Y.RBV",
|
||||
@ -403,16 +661,38 @@ pvs_OKBH154 = [
|
||||
"SAROP31-OKBH154:TX2.RBV",
|
||||
]
|
||||
|
||||
|
||||
###########################
|
||||
# Izero-slit unit
|
||||
|
||||
pvs_i0_chamber = [
|
||||
"SARES30-MCS20610:MCS1.RBV",
|
||||
"SARES30-MCS20610:MCS2.RBV",
|
||||
"SARES30-MCS20610:MCS3.RBV",
|
||||
"SARES30-MCS20610:MCS4.RBV",
|
||||
"SARES30-MCS20610:MCS5.RBV"
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### GENERAL PURPOSE EXPERIMENT
|
||||
|
||||
|
||||
####################
|
||||
# Standa motors (mainly used with the X-ray eye)
|
||||
|
||||
pvs_standa = [
|
||||
"SARES30-MOBI1:MOT_1.RBV",
|
||||
"SARES30-MOBI1:MOT_2.RBV",
|
||||
"SARES30-MOBI1:MOT_3.RBV",
|
||||
]
|
||||
|
||||
|
||||
####################
|
||||
# Newport 300 mm stage
|
||||
|
||||
pvs_newport_300 = [
|
||||
"SARES30-MOBI1:MOT_5.RBV",
|
||||
]
|
||||
@ -420,6 +700,7 @@ pvs_newport_300 = [
|
||||
|
||||
###############################
|
||||
# Smaract stages mini XYZ from SwissMX
|
||||
|
||||
pvs_smaract_xyz = [
|
||||
"SARES30-MCS2750:MOT_1.RBV",
|
||||
"SARES30-MCS2750:MOT_1.VAL",
|
||||
@ -429,15 +710,19 @@ pvs_smaract_xyz = [
|
||||
"SARES30-MCS2750:MOT_3.VAL",
|
||||
]
|
||||
|
||||
|
||||
####################
|
||||
# Attocube motors
|
||||
|
||||
pvs_attocube = [
|
||||
"SARES30-ATTOCUBE:A0-POS",
|
||||
"SARES30-ATTOCUBE:A1-POS",
|
||||
]
|
||||
|
||||
|
||||
###############################
|
||||
# Smaract stages from Juraj
|
||||
|
||||
pvs_smaract_juraj = [
|
||||
"SARES30-XSMA156:X:MOTRBV",
|
||||
"SARES30-XSMA156:Y:MOTRBV",
|
||||
@ -447,32 +732,148 @@ pvs_smaract_juraj = [
|
||||
"SARES30-XSMA156:Rz:MOTRBV",
|
||||
]
|
||||
|
||||
pvs_diffractometer_1 = [
|
||||
"SARES30-CPCL-ECMC02:ROT2THETA-PosAct",
|
||||
"SARES30-CPCL-ECMC02:ROTTHETA-PosAct",
|
||||
"SARES30-CPCL-ECMC02:TRXBASE-PosAct",
|
||||
"SARES30-CPCL-ECMC02:TRY-PosAct",
|
||||
"SARES30-CPCL-ECMC02:TRX-PosAct",
|
||||
"SARES30-CPCL-ECMC02:TRZ-PosAct",
|
||||
"SARES30-CPCL-ECMC02:TD-PosAct",
|
||||
|
||||
###############################
|
||||
# General purpose JJ-slits
|
||||
|
||||
pvs_JJ_slits = [
|
||||
"SARES30-MOBI2:MOT_X.RBV",
|
||||
"SARES30-MOBI2:MOT_Y.RBV",
|
||||
"SARES30-MOBI2:MOT_W.RBV",
|
||||
"SARES30-MOBI2:MOT_H.RBV",
|
||||
]
|
||||
|
||||
pvs = (
|
||||
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### CRISTALLINA-Q EXPERIMENT
|
||||
|
||||
|
||||
###############################
|
||||
# Diffractometer 1
|
||||
|
||||
ID_dm1 = "SARES31-GPS"
|
||||
pvs_diffractometer_1 = [
|
||||
ID_dm1 + ":ROT2THETA-PosAct",
|
||||
ID_dm1 + ":ROTTHETA-PosAct",
|
||||
ID_dm1 + ":TRXBASE-PosAct",
|
||||
ID_dm1 + ":TRY-PosAct",
|
||||
ID_dm1 + ":TRX-PosAct",
|
||||
ID_dm1 + ":TRZ-PosAct",
|
||||
ID_dm1 + ":TD-PosAct",
|
||||
ID_dm1 + ":m1s012-Drv01-TrqAct", # TRYBASE Mot 1 torque
|
||||
ID_dm1 + ":m1s013-Drv01-TrqAct", # TRYBASE Mot 2 torque
|
||||
ID_dm1 + ":m1s014-Drv01-TrqAct", # TRYBASE Mot 3 torque
|
||||
ID_dm1 + ":m1s015-Drv01-TrqAct", # TRYBASE Mot 4 torque
|
||||
ID_dm1 + ":m1s027-Drv01-TrqAct", # TD Mot torque
|
||||
ID_dm1 + ":m1s011-Drv01-TrqAct", # TRXBASE Mot torque
|
||||
ID_dm1 + ":m1s030-Drv01-TrqAct", # TRX Mot torque
|
||||
ID_dm1 + ":m1s031-Drv01-TrqAct", # TRY Mot torque
|
||||
ID_dm1 + ":m1s029-Drv01-TrqAct", # TRZ Mot torque
|
||||
ID_dm1 + ":m1s010-Drv01-TrqAct", # ROT2THETA Mot torque
|
||||
ID_dm1 + ":m1s028-Drv01-TrqAct", # ROTTHETA Mot torque
|
||||
]
|
||||
|
||||
|
||||
###############################
|
||||
# Diffractometer 2
|
||||
|
||||
ID_dm2 = "SARES32-GPS"
|
||||
pvs_diffractometer_2 = [
|
||||
ID_dm2 + ":ROTTHETA-PosAct",
|
||||
ID_dm2 + ":TRXBASE-PosAct",
|
||||
ID_dm2 + ":TRY-PosAct",
|
||||
ID_dm2 + ":TRX-PosAct",
|
||||
ID_dm2 + ":ROT2THETA-PosAct",
|
||||
ID_dm2 + ":TRZ-PosAct",
|
||||
ID_dm2 + ":TD-PosAct",
|
||||
ID_dm2 + ":ROTX-PosAct",
|
||||
ID_dm2 + ":ROTZ-PosAct",
|
||||
ID_dm2 + ":m0s012-Drv01-TrqAct", # TRYBASE Mot 1 torque
|
||||
ID_dm2 + ":m0s012-Drv01-TrqAct", # TRYBASE Mot 2 torque
|
||||
ID_dm2 + ":m0s014-Drv01-TrqAct", # TRYBASE Mot 3 torque
|
||||
ID_dm2 + ":m0s015-Drv01-TrqAct", # TRYBASE Mot 4 torque
|
||||
ID_dm2 + ":m0s027-Drv01-TrqAct", # TD Mot torque
|
||||
ID_dm2 + ":m0s011-Drv01-TrqAct", # TRXBASE Mot torque
|
||||
ID_dm2 + ":m0s030-Drv01-TrqAct", # TRX Mot torque
|
||||
ID_dm2 + ":m0s032-Drv01-TrqAct", # ROTX Mot torque
|
||||
ID_dm2 + ":m0s033-Drv01-TrqAct", # ROTZ Mot torque
|
||||
ID_dm2 + ":m0s010-Drv01-TrqAct", # ROT2THETA Mot torque
|
||||
ID_dm2 + ":m0s028-Drv01-TrqAct", # ROTTHETA Mot torque
|
||||
]
|
||||
|
||||
###############################
|
||||
# DilSc
|
||||
|
||||
ID_DilSc_LakeShore = "SARES31-DIL-LS1"
|
||||
pvs_DilSc_Lakeshore = [
|
||||
ID_DilSc_LakeShore + "A_KELVIN",
|
||||
ID_DilSc_LakeShore + "7_KELVIN",
|
||||
ID_DilSc_LakeShore + "8_KELVIN",
|
||||
|
||||
ID_DilSc_LakeShore + "A_RES",
|
||||
ID_DilSc_LakeShore + "7_RES",
|
||||
ID_DilSc_LakeShore + "8_RES",
|
||||
]
|
||||
|
||||
|
||||
###############################
|
||||
# Huber vertical stage
|
||||
|
||||
pvs_huber_z= [
|
||||
"SARES30-MOBI2:MOT_Z.RBV",
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### CRISTALLINA-MX EXPERIMENT
|
||||
|
||||
|
||||
###############################
|
||||
# Fast XY-stage
|
||||
|
||||
pvs_swissmx = [
|
||||
"SAR-EXPMX:MOT_FX.RBV",
|
||||
"SAR-EXPMX:MOT_FY.RBV",
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
###########################################################################
|
||||
#### CHANNEL GROUPS
|
||||
|
||||
###############################
|
||||
# All channels (slic updates the list based on these)
|
||||
|
||||
pv_channels = (
|
||||
pvs_machine
|
||||
# + pvs_RF
|
||||
# + pvs_undulator
|
||||
+ pvs_gas_monitor
|
||||
+ pvs_undulator
|
||||
+ pvs_OAPU044
|
||||
+ pvs_gas_monitor
|
||||
+ pvs_PBPS053
|
||||
+ pvs_OATT053
|
||||
+ pvs_PPRM053
|
||||
# + pvs_PDIM053
|
||||
+ pvs_PSSS059
|
||||
# + pvs_PPRM064
|
||||
# + pvs_OOMH064
|
||||
# + pvs_PPRM066
|
||||
+ pvs_OOMH067
|
||||
+ pvs_PSCR068
|
||||
+ pvs_OOMH084
|
||||
+ pvs_PPRM085
|
||||
+ pvs_OAPU107
|
||||
+ pvs_ODCC110
|
||||
+ pvs_PSCR110
|
||||
+ pvs_PBPS113
|
||||
+ pvs_PDIM113
|
||||
+ pvs_PPRM113
|
||||
+ pvs_OLAS147
|
||||
+ pvs_OAPU149
|
||||
@ -484,13 +885,94 @@ pvs = (
|
||||
+ pvs_OKBV153
|
||||
+ pvs_PSCD153
|
||||
+ pvs_OKBH154
|
||||
+ pvs_i0_chamber
|
||||
+ pvs_standa
|
||||
# + pvs_newport_300
|
||||
# + pvs_newport_300
|
||||
# + pvs_smaract_xyz
|
||||
+ pvs_diffractometer_1
|
||||
# + pvs_Bernina
|
||||
+ pvs_diffractometer_2
|
||||
+ pvs_DilSc_Lakeshore
|
||||
+ pvs_huber_z
|
||||
+ pvs_JJ_slits
|
||||
# + pvs_attocube
|
||||
# + pvs_smaract_juraj
|
||||
# + pvs_photon_energy_bernina
|
||||
# + pvs_OAPU092_bernina
|
||||
# + pvs_OOMV092_bernina
|
||||
# + pvs_PPRM094_bernina
|
||||
# + pvs_OOMV096_bernina
|
||||
# + pvs_PSCR097_bernina
|
||||
# + pvs_ODCM098_bernina
|
||||
# + pvs_OAPU102_bernina
|
||||
# + pvs_PSRD103_bernina
|
||||
# + pvs_PBPS113_bernina
|
||||
# + pvs_OPPI113_bernina
|
||||
# + pvs_PPRM113_bernina
|
||||
)
|
||||
|
||||
pv_channels_cristallina_beamline = (
|
||||
pvs_machine
|
||||
# + pvs_RF
|
||||
+ pvs_undulator
|
||||
+ pvs_OAPU044
|
||||
+ pvs_gas_monitor
|
||||
+ pvs_PBPS053
|
||||
+ pvs_OATT053
|
||||
+ pvs_PPRM053
|
||||
# + pvs_PDIM053
|
||||
+ pvs_PSSS059
|
||||
# + pvs_PPRM064
|
||||
# + pvs_OOMH064
|
||||
# + pvs_PPRM066
|
||||
+ pvs_OOMH067
|
||||
+ pvs_PSCR068
|
||||
+ pvs_OOMH084
|
||||
+ pvs_PPRM085
|
||||
+ pvs_OAPU107
|
||||
+ pvs_ODCC110
|
||||
+ pvs_PSCR110
|
||||
+ pvs_PBPS113
|
||||
+ pvs_PDIM113
|
||||
+ pvs_PPRM113
|
||||
+ pvs_OLAS147
|
||||
+ pvs_OAPU149
|
||||
+ pvs_PBPS149
|
||||
+ pvs_PPRM150
|
||||
+ pvs_OATA150
|
||||
+ pvs_OPPI151
|
||||
+ pvs_ODMV152
|
||||
+ pvs_OKBV153
|
||||
+ pvs_PSCD153
|
||||
+ pvs_OKBH154
|
||||
+ pvs_i0_chamber
|
||||
)
|
||||
|
||||
# + pvs_attocube
|
||||
# + pvs_smaract_juraj
|
||||
pv_channels_bernina_DCM = (
|
||||
pvs_machine
|
||||
# + pvs_RF
|
||||
+ pvs_undulator
|
||||
+ pvs_OAPU044
|
||||
+ pvs_gas_monitor
|
||||
+ pvs_PBPS053
|
||||
+ pvs_OATT053
|
||||
+ pvs_PPRM053
|
||||
# + pvs_PDIM053
|
||||
+ pvs_PSSS059
|
||||
# + pvs_PPRM064
|
||||
# + pvs_OOMH064
|
||||
# + pvs_PPRM066
|
||||
+ pvs_OOMH067
|
||||
+ pvs_PSCR068
|
||||
+ pvs_photon_energy_bernina
|
||||
+ pvs_OAPU092_bernina
|
||||
+ pvs_OOMV092_bernina
|
||||
+ pvs_PPRM094_bernina
|
||||
+ pvs_OOMV096_bernina
|
||||
+ pvs_PSCR097_bernina
|
||||
+ pvs_ODCM098_bernina
|
||||
+ pvs_OAPU102_bernina
|
||||
+ pvs_PSRD103_bernina
|
||||
+ pvs_PBPS113_bernina
|
||||
+ pvs_OPPI113_bernina
|
||||
+ pvs_PPRM113_bernina
|
||||
)
|
||||
|
313
cristallina.py
Normal file → Executable file
313
cristallina.py
Normal file → Executable file
@ -1,15 +1,18 @@
|
||||
#!/usr/bin/env python
|
||||
import sys
|
||||
import os
|
||||
from loguru import logger
|
||||
|
||||
# at the moment this allows us to group the subdirectories as modules easily
|
||||
# TODO: a more general way would be to have this cristallina as a installed package
|
||||
os.chdir("/sf/cristallina/applications/slic/cristallina")
|
||||
|
||||
# setup logging
|
||||
from loguru import logger
|
||||
|
||||
def setup_logging():
|
||||
def setup_general_logging():
|
||||
"""Setup logging to console and files in both the snapshots and
|
||||
the respective pgroup.
|
||||
"""
|
||||
|
||||
logger.remove()
|
||||
logger.add(
|
||||
sys.stderr,
|
||||
@ -19,18 +22,19 @@ def setup_logging():
|
||||
logger.info("Loading started.")
|
||||
|
||||
# create file handler which logs
|
||||
# TODO: better directory for general log files?
|
||||
try:
|
||||
logger.add(
|
||||
"/sf/cristallina/applications/slic/cristallina/log/cristallina.log",
|
||||
"/sf/cristallina/applications/beamline/snapshots/slic_logs/cristallina.log",
|
||||
format="{time:YYYY-MM-DD at HH:mm:ss} | {level} | {message}",
|
||||
level="DEBUG",
|
||||
rotation="1 week",
|
||||
)
|
||||
logger.info("Logging to snapshots.")
|
||||
except PermissionError as e:
|
||||
logger.warning("Cannot write log file.")
|
||||
logger.warning("Cannot write log file to snapshots.")
|
||||
logger.warning(e)
|
||||
|
||||
|
||||
def setup_logging_pgroup(pgroup, level="INFO"):
|
||||
try:
|
||||
logger.add(
|
||||
@ -39,130 +43,114 @@ def setup_logging_pgroup(pgroup, level="INFO"):
|
||||
level=level,
|
||||
rotation="1 week",
|
||||
)
|
||||
logger.info(f"Logging to pgroup {pgroup}.")
|
||||
except PermissionError as e:
|
||||
logger.warning(f"Cannot write log file to pgroup {pgroup}.")
|
||||
|
||||
|
||||
# We setup the logging before going further so that
|
||||
# other modules can write startup messages into the log file.
|
||||
setup_logging()
|
||||
setup_general_logging()
|
||||
|
||||
# TODO: this is later overwritten, probably not intended that way?
|
||||
# from epics import PV
|
||||
from beamline.alignment_laser import AlignmentLaser
|
||||
|
||||
from devices.alignment_laser import AlignmentLaser
|
||||
from slic.gui import GUI
|
||||
from slic.core.adjustable import Adjustable, PVAdjustable, DummyAdjustable
|
||||
from slic.core.acquisition import SFAcquisition, PVAcquisition
|
||||
from slic.core.condition import PVCondition
|
||||
from slic.core.scanner import Scanner
|
||||
from slic.devices.xdiagnostics.intensitymonitor import IntensityMonitorPBPS
|
||||
|
||||
|
||||
from slic.devices.general.motor import Motor
|
||||
from slic.devices.xoptics.pulsepicker import PulsePicker
|
||||
from slic.utils import devices, Marker, as_shortcut
|
||||
|
||||
from slic.utils import devices, Marker, as_shortcut, snapshot
|
||||
from slic.utils import Channels, Config, Elog, Screenshot, PV
|
||||
from slic.core.acquisition.fakeacquisition import FakeAcquisition
|
||||
|
||||
from slic.devices.timing.events import CTASequencer
|
||||
|
||||
from channels.bs_channels import (
|
||||
detectors,
|
||||
detectors_with_config,
|
||||
detectors_MX,
|
||||
bs_channels,
|
||||
camera_channels,
|
||||
)
|
||||
from channels.pv_channels import pvs
|
||||
|
||||
from channels.pv_channels import pv_channels
|
||||
from spreadsheet import overview
|
||||
|
||||
from channels.bs_channels import bs_channels_bernina_DCM
|
||||
from channels.pv_channels import pv_channels_bernina_DCM
|
||||
|
||||
from channels.bs_channels import bs_channels_cristallina_beamline
|
||||
from channels.pv_channels import pv_channels_cristallina_beamline
|
||||
|
||||
|
||||
# from channels_minimal import detectors_min, channels_min, pvs_min
|
||||
from devices.pp_shutter import PP_Shutter
|
||||
|
||||
|
||||
################# DEVICES #################
|
||||
dummy = DummyAdjustable(units="au")
|
||||
|
||||
# Attenuators
|
||||
from slic.devices.xoptics.aramis_attenuator import Attenuator
|
||||
from devices.knife_edge import KnifeEdge
|
||||
from devices.standa import standa
|
||||
from devices.newport import newport
|
||||
|
||||
Newport_large = Motor("SARES30-MOBI1:MOT_5")
|
||||
OWIS = Motor("SARES30-MOBI1:MOT_6") # small OWIS linear stage
|
||||
|
||||
attenuator = Attenuator("SAROP31-OATA150", description="Cristallina attenuator OATA150")
|
||||
|
||||
upstream_attenuator = Attenuator("SARFE10-OATT053", description="Aramis attenuator OATT053")
|
||||
|
||||
def test_attenuator():
|
||||
tfundamental = attenuator.get_transmission()
|
||||
try:
|
||||
assert tfundamental > 0
|
||||
except TypeError:
|
||||
logger.warning("No transmission value reported from {attenuator.ID}")
|
||||
dummy2 = DummyAdjustable(ID='DUMMY2', name='Dummy2', units="au")
|
||||
|
||||
|
||||
# test_attenuator()
|
||||
# from devices.knife_edge import KnifeEdge
|
||||
# from devices.standa import standa
|
||||
# from devices.newport import newport
|
||||
|
||||
front_end_attenuator = Attenuator(
|
||||
"SARFE10-OATT053", description="Front end attenuator OATT053"
|
||||
)
|
||||
cta = CTASequencer("SAR-CCTA-ESC")
|
||||
|
||||
pbps113 = IntensityMonitorPBPS(
|
||||
"SAROP31-PBPS113",
|
||||
# vme_crate="SAROP31-CVME-PBPS1", # please check this!
|
||||
# link=9,
|
||||
description="Intensity/position monitor in the optics hutch",
|
||||
from beamline.components import (
|
||||
upstream_attenuator,
|
||||
attenuator,
|
||||
pp_shutter,
|
||||
pulsepicker,
|
||||
alignment_laser,
|
||||
pbps113,
|
||||
slits107,slits149,slitsi0,
|
||||
mono,
|
||||
m3,
|
||||
i0,
|
||||
)
|
||||
|
||||
pbps149 = IntensityMonitorPBPS(
|
||||
"SAROP31-PBPS149",
|
||||
# vme_crate="SAROP31-CVME-PBPS2", # please check this!
|
||||
# link=9,
|
||||
description="Intensity/position monitor in the experimental hutch",
|
||||
)
|
||||
from beamline.components import kbHor, kbVer
|
||||
|
||||
from systems.components import cta
|
||||
|
||||
from gp_exp.components import Newport_large, OWIS, slitsjj
|
||||
|
||||
|
||||
|
||||
|
||||
# Undulators
|
||||
from beamline import undulator
|
||||
|
||||
undulators = undulator.Undulators()
|
||||
logger.info(
|
||||
f"Using undulator (Aramis) offset to PSSS energy of {undulator.energy_offset} eV."
|
||||
)
|
||||
|
||||
logger.info(f"Using undulator (Aramis) offset to PSSS energy of {undulator.energy_offset} eV.")
|
||||
|
||||
|
||||
# Shutter
|
||||
shutter = PP_Shutter(
|
||||
"SARES30-LTIM01-EVR0:RearUniv0-Ena-SP", name="Cristallina pulse picker shutter"
|
||||
) # Shutter button when using the pulse picker
|
||||
|
||||
pulsepicker = PulsePicker(
|
||||
"SAROP31-OPPI151",
|
||||
"SARES30-LTIM01-EVR0:Pul3",
|
||||
name="Cristallina X-ray pulse picker OPPI151",
|
||||
)
|
||||
# Undulators & mono
|
||||
from beamline import photon_energy
|
||||
|
||||
# Alignment laser
|
||||
alignment_laser = AlignmentLaser(
|
||||
"SAROP31-OLAS147:MOTOR_1", name="Cristallina alignment laser OLAS147"
|
||||
)
|
||||
cr_photon_energy = photon_energy.PhotonEnergy()
|
||||
|
||||
logger.info(f"Photon energy offsets: PSSS {photon_energy.energy_offset_PSSS} eV , DCCM {photon_energy.energy_offset_DCCM} eV, undulator {photon_energy.energy_offset_undulators} eV.")
|
||||
|
||||
|
||||
|
||||
|
||||
# Pulse picker shutter
|
||||
#pp_shutter = PP_Shutter(
|
||||
# "SARES30-LTIM01-EVR0:RearUniv0-Ena-SP", name="Cristallina pulse picker shutter"
|
||||
#) # Shutter buttton when using the pulse picker
|
||||
|
||||
## Slits
|
||||
from slic.devices.xoptics import slits
|
||||
|
||||
## Smaract & attocube stages
|
||||
from devices.smaract_device_def import smaract_Juraj, smaract_mini_XYZ
|
||||
from devices.attocube_device_def import attocube
|
||||
from devices.jj_device_def import jjslits
|
||||
|
||||
# KBs
|
||||
from slic.devices.xoptics.kb import KBHor, KBVer
|
||||
|
||||
kbHor = KBHor("SAROP31-OKBH154", description="Cristallina horizontal KB mirror")
|
||||
kbVer = KBVer("SAROP31-OKBV153", description="Cristallina vertical KB mirror")
|
||||
from gp_exp.smaract_device_def import smaract_Juraj, smaract_mini_XYZ
|
||||
# from gp_exp.attocube_device_def import attocube # disabled fbecause of issues with Adjustables
|
||||
from gp_exp.jj_device_def import jjslits
|
||||
|
||||
# Bernina monochromator
|
||||
from beamline.bernina_mono import BerninaMono
|
||||
@ -170,123 +158,157 @@ from beamline.bernina_mono import BerninaMono
|
||||
BerninaDCM = BerninaMono("SAROP21-ODCM098")
|
||||
|
||||
# Diffractometer
|
||||
from devices.diffractometer import Diffractometer
|
||||
from crq_exp.diffractometer import Diffractometer
|
||||
dm1 = Diffractometer("SARES31-GPS")
|
||||
dm2 = Diffractometer("SARES32-GPS")
|
||||
|
||||
diffractometer = Diffractometer("diffractometer")
|
||||
# Set according to which diffractometer is being used
|
||||
diffractometer = dm1
|
||||
|
||||
# Dilution fridge
|
||||
#from crq_exp.dilsc import Dilution
|
||||
|
||||
try:
|
||||
dilution = Dilution()
|
||||
except Exception as e:
|
||||
logger.warning(f"Error: Could not connect to dilution fridge. {e}")
|
||||
dilution = None
|
||||
|
||||
|
||||
from devices.dilsc import Dilution
|
||||
dilution = Dilution()
|
||||
# MX adajustables
|
||||
# import mx.mx_adjustables
|
||||
|
||||
# Temporary quick hack thermometer addition for stand
|
||||
#TODO: make in a thermometer class ...
|
||||
T_reg = PVAdjustable('SARES31-DIL-LS1:A_KELVIN')
|
||||
T_plato = PVAdjustable('SARES31-DIL-LS1:7_KELVIN')
|
||||
T_chip = PVAdjustable('SARES31-DIL-LS1:8_KELVIN')
|
||||
|
||||
|
||||
################# Stand setup ##################
|
||||
|
||||
# TODO: requires the stand client, need small howto how to start and configure or let it run all the time
|
||||
from slic.core.acquisition.spreadsheet import Spreadsheet
|
||||
from stand.time import Time
|
||||
|
||||
# setup spreadsheet for transmission to stand
|
||||
spreadsheet = Spreadsheet(
|
||||
{
|
||||
"Transmission" : attenuator.trans1st,
|
||||
|
||||
adjs_for_spreadsheet = {
|
||||
"Time": Time(),
|
||||
"T_reg": T_reg,
|
||||
"T_plato": T_plato,
|
||||
"T_chip":T_chip,
|
||||
"Transmission": attenuator.trans1st,
|
||||
"Upstream Transmission": upstream_attenuator.trans1st,
|
||||
"Energy_setpoint" : undulators,
|
||||
"Energy_offset": undulator.energy_offset,
|
||||
"Energy_setpoint": cr_photon_energy,
|
||||
"Energy_offset undulator": photon_energy.energy_offset_undulators,
|
||||
"TD": diffractometer.td,
|
||||
"TRX": diffractometer.tr_x,
|
||||
"TRY": diffractometer.tr_y,
|
||||
"TRXBASE": diffractometer.trx_base,
|
||||
"TRYBASE": diffractometer.try_base,
|
||||
"THETA": diffractometer.theta,
|
||||
"TWOTHETA": diffractometer.twotheta,
|
||||
"Magnet_X": dilution.x,
|
||||
"Magnet_Y": dilution.y,
|
||||
"Magnet_Z": dilution.z,
|
||||
"DilSc_T_plato": dilution.T_plato,
|
||||
"DilSc_T_pucksensor": dilution.T_pucksensor,
|
||||
},
|
||||
|
||||
"TWOTHETA": diffractometer.twotheta,
|
||||
}
|
||||
|
||||
|
||||
if dilution is not None:
|
||||
adjs_dilsc = {
|
||||
#"Magnet_X": dilution.x,
|
||||
#"Magnet_Y": dilution.y,
|
||||
#"Magnet_Z": dilution.z,
|
||||
"DilSc_T_chip": T_chip,
|
||||
"DilSc_T_plato": T_plato,
|
||||
#"DilSc_T_chip": dilution.T_chip,
|
||||
"DilSc_T_pucksensor": T_reg,
|
||||
}
|
||||
adjs_for_spreadsheet.update(adjs_dilsc)
|
||||
|
||||
|
||||
# temporary mono
|
||||
from exp_temp.mono import Mono_rotation
|
||||
|
||||
|
||||
# setup spreadsheet for transmission to stand
|
||||
spreadsheet = Spreadsheet(
|
||||
adjs_for_spreadsheet,
|
||||
placeholders=("comment", "sample", "run_usable"),
|
||||
host="saresc-vcons-02.psi.ch",
|
||||
port=9090,
|
||||
)
|
||||
|
||||
try:
|
||||
from stand_client import Client
|
||||
|
||||
from stand.client import Client
|
||||
stand_host = "saresc-vcons-02.psi.ch"
|
||||
stand_client = Client(host=stand_host, port=9090)
|
||||
response = stand_client.get()
|
||||
logger.info("Connected to stand server")
|
||||
except Exception as error:
|
||||
# catching with a broad net because different connection errors can occur.
|
||||
# catching excpetions with a broad net because different connection errors can occur.
|
||||
logger.warning(f"Cannot connect to stand server on {stand_host}. Disabling spreadsheet.")
|
||||
spreadsheet = None
|
||||
spreadsheet = None
|
||||
|
||||
# spreadsheet = Spreadsheet(adjs, placeholders=PLACEHOLDERS, host="127.0.0.1", port=8080))
|
||||
|
||||
################# DAQ Setup #################
|
||||
instrument = "cristallina"
|
||||
# experiment_type = "MX" # "MX" or "Q" for the different setups and detector configurations
|
||||
experiment_type = "Q" # "MX" or "Q" for the different setups and detector configurations
|
||||
|
||||
# pgroup = "p19739" # commissioning March 2022 -- July 2022
|
||||
# pgroup = "p20443" # commissioning Wavefront Sensor August 2022 (active)
|
||||
|
||||
# pgroup = "p20558" # SwissMX commissioning 3
|
||||
# pgroup = "p20557" # CrQ PMS commisioning 1
|
||||
# pgroup = "p20509" # CrQ commisioning DilSc1
|
||||
# pgroup = "p20519" # beamline commissioning 2
|
||||
# pgroup = "p20841" # CrQ PMS commisioning 2 (Jan 2023)
|
||||
# pgroup = "p20993" # CrQ commisioning DilSc2 (March 2023)
|
||||
# pgroup = "p21147" # SAXS
|
||||
# pgroup = "p21238" # Cristallina photon diagnostics p-group with Chris
|
||||
# pgroup = "p21224" # SwissMX commisioning 7
|
||||
|
||||
# pgroup = "p19150" # Scratch
|
||||
# pgroup = "p19152" # Scratch
|
||||
|
||||
# pgroup = "p20840" # Cr beamline commisioning (Jan-Feb 2023)
|
||||
# pgroup = "p21261" # CrQ PMS-3 July 2023
|
||||
|
||||
# pgroup = "p21528" # Cr-MX Colletier 2023-09-05
|
||||
# pgroup = "p21516" # Beamline commissioning September 26-27, November 7 2023
|
||||
# pgroup = "p21563" # Dil-Sc / diffractometer / tilted bunch / LiErF4 (/ TmVO4)
|
||||
|
||||
# pgroup = "p21569" # Dil-Sc / diffractometer / tilted bunch / LiErF4 (/ TmVO4), November 17-
|
||||
# pgroup = "p21592" # HVE commissioning
|
||||
# pgroup = "p21640" # Dil-Sc / diffractometer / LiErF4 : 4 March 2024
|
||||
|
||||
# pgroup = "p21920" # Beamline commissioning 2024
|
||||
|
||||
pgroup = "p21741" # CrQ - DilSc - SAXS LiHoF4
|
||||
from pgroups import pgroup, pgroup_scratch
|
||||
|
||||
# setup pgroup specific logger
|
||||
setup_logging_pgroup(pgroup)
|
||||
|
||||
daq = SFAcquisition(
|
||||
instrument,
|
||||
pgroup,
|
||||
default_channels=bs_channels,
|
||||
default_pvs=pvs,
|
||||
default_detectors=detectors,
|
||||
rate_multiplicator=1,
|
||||
spreadsheet=spreadsheet,
|
||||
)
|
||||
logger.info(f"Using Cristallina{experiment_type} setup for detectors.")
|
||||
|
||||
if experiment_type == "MX":
|
||||
daq = SFAcquisition(
|
||||
instrument,
|
||||
pgroup,
|
||||
default_channels=bs_channels,
|
||||
default_pvs=pv_channels,
|
||||
default_detectors=detectors_MX,
|
||||
rate_multiplicator=1,
|
||||
spreadsheet=spreadsheet,
|
||||
)
|
||||
elif experiment_type == "Q":
|
||||
daq = SFAcquisition(
|
||||
instrument,
|
||||
pgroup,
|
||||
default_channels=bs_channels,
|
||||
default_pvs=pv_channels,
|
||||
default_detectors=detectors,
|
||||
rate_multiplicator=1,
|
||||
spreadsheet=spreadsheet,
|
||||
)
|
||||
else:
|
||||
logger.error(f"Experiment type {experiment_type} not supported. Exiting.")
|
||||
sys.exit(1)
|
||||
|
||||
# default_channels=bs_channels,
|
||||
# default_pvs=pv_channels,
|
||||
|
||||
|
||||
daq.update_config_pvs()
|
||||
|
||||
# There is a new EPICS buffer, so the archiver is no longer used. This makes sure we are taking PVs from the right place.
|
||||
daq.update_config_pvs()
|
||||
try:
|
||||
daq.update_config_pvs()
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
from acquisition import multiple_daqs
|
||||
|
||||
DAQS = multiple_daqs.generate_DAQS(instrument, pgroup,bs_channels, pvs, detectors)
|
||||
DAQS = multiple_daqs.generate_DAQS(instrument, pgroup, bs_channels, pv_channels, detectors, spreadsheet)
|
||||
|
||||
# daq = FakeAcquisition(instrument, pgroup)
|
||||
# daqPV = PVAcquisition(instrument, pgroup, default_channels=channels_ks) # workaround for KS not going to DB
|
||||
# daq_fake = FakeAcquisition(instrument, pgroup)
|
||||
# daq_PV_only = PVAcquisition(instrument, pgroup, default_channels=channels_ks) # workaround for KS not going to DB
|
||||
|
||||
# Run the scan only when gas monitor value larger than 10uJ (and smaller than 2000uJ):
|
||||
# required fraction defines ammount of data recorded to save the step and move on to the next one
|
||||
check_intensity_gas_monitor = PVCondition(
|
||||
"SARFE10-PBPG050:PHOTON-ENERGY-PER-PULSE-US",
|
||||
vmin=4,
|
||||
vmin=400,
|
||||
vmax=2000,
|
||||
wait_time=0.5,
|
||||
required_fraction=0.8,
|
||||
@ -295,5 +317,6 @@ check_intensity_gas_monitor = PVCondition(
|
||||
scan = Scanner(default_acquisitions=[daq], condition=check_intensity_gas_monitor)
|
||||
gui = GUI(scan, show_goto=True, show_spec=True)
|
||||
|
||||
logger.info(f"Running at {instrument} with pgroup {pgroup}.")
|
||||
|
||||
logger.info(f"Running at {instrument} with pgroup {pgroup}. Experiment type: {experiment_type}.")
|
||||
logger.info("Loading finished.")
|
||||
|
74
crq_exp/diffractometer.py
Executable file
74
crq_exp/diffractometer.py
Executable file
@ -0,0 +1,74 @@
|
||||
""" Diffractometer
|
||||
|
||||
motorized axis:
|
||||
|
||||
SARES30-CPCL-ECMC02:ROT2THETA
|
||||
SARES30-CPCL-ECMC02:ROTTHETA
|
||||
SARES30-CPCL-ECMC02:TRXBASE
|
||||
SARES30-CPCL-ECMC02:TRYBASE
|
||||
|
||||
"""
|
||||
|
||||
from slic.core.adjustable import Adjustable, Linked
|
||||
|
||||
from slic.core.device import Device, SimpleDevice
|
||||
from slic.devices.general.motor import Motor
|
||||
|
||||
|
||||
class Diffractometer(Device):
|
||||
def __init__(self, ID, **kwargs):
|
||||
super().__init__(ID, **kwargs)
|
||||
|
||||
self.twotheta = Motor(ID + ":ROT2THETA") # , ID=None, name=None, units=None, internal=False):
|
||||
self.theta = Motor(ID + ":ROTTHETA") # , ID=None, name=None, units=None, internal=False):
|
||||
|
||||
self.trx_base = Motor(ID + ":TRXBASE") # , ID=None, name=None, units=None, internal=False):
|
||||
self.try_base = Motor(ID + ":TRYBASE") # , ID=None, name=None, units=None, internal=False):
|
||||
|
||||
self.tr_x = Motor(ID + ":TRX")
|
||||
self.tr_y = Motor(ID + ":TRY")
|
||||
self.tr_z = Motor(ID + ":TRZ")
|
||||
|
||||
self.td = Motor(ID + ":TD")
|
||||
|
||||
if ID == "SARES32-GPS":
|
||||
self.name = "DM2: Cristallina pulsed magnet diffractometer"
|
||||
# This diffractometer also has extra swivel stages
|
||||
self.rotx = Motor(ID + ":ROTX")
|
||||
self.rotz = Motor(ID + ":ROTZ")
|
||||
if ID == "SARES31-GPS":
|
||||
self.name = "DM1: Cristallina dilution fridge diffractometer"
|
||||
|
||||
# class Diffractometer(Device):
|
||||
# def __init__(self, ID, motor_naming="MOTOR", **kwargs):
|
||||
# super().__init__(ID, **kwargs)
|
||||
|
||||
# self.twotheta = Motor("SARES30-CPCL-ECMC02:ROT2THETA") # , ID=None, name=None, units=None, internal=False):
|
||||
# self.theta = Motor("SARES30-CPCL-ECMC02:ROTTHETA") # , ID=None, name=None, units=None, internal=False):
|
||||
|
||||
# self.trx_base = Motor("SARES30-CPCL-ECMC02:TRXBASE") # , ID=None, name=None, units=None, internal=False):
|
||||
# self.try_base = Motor("SARES30-CPCL-ECMC02:TRYBASE") # , ID=None, name=None, units=None, internal=False):
|
||||
|
||||
# self.tr_x = Motor("SARES30-CPCL-ECMC02:TRX")
|
||||
# self.tr_y = Motor("SARES30-CPCL-ECMC02:TRY")
|
||||
# self.tr_z = Motor("SARES30-CPCL-ECMC02:TRZ")
|
||||
|
||||
# self.td = Motor("SARES30-CPCL-ECMC02:TD")
|
||||
|
||||
|
||||
# Set speed:
|
||||
# diffractometer.theta._motor.VELO = 0.25
|
||||
|
||||
class ThetasCombined(Linked):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(self, *args, **kwargs)
|
||||
|
||||
def connect_axis(self):
|
||||
"""
|
||||
calculate offset to match scale factor
|
||||
"""
|
||||
|
||||
offset = self.secondary.get_current_value() - self.primary.get_current_value() * self.scale_factor
|
||||
self.offset = offset
|
||||
|
||||
|
182
crq_exp/dilsc.py
Executable file
182
crq_exp/dilsc.py
Executable file
@ -0,0 +1,182 @@
|
||||
""" DilSc prototype
|
||||
|
||||
"""
|
||||
|
||||
from slic.core.adjustable import Adjustable, PVAdjustable
|
||||
|
||||
from slic.core.device import Device, SimpleDevice
|
||||
|
||||
from frappy.client import SecopClient
|
||||
from frappy import states
|
||||
from frappy.datatypes import StatusType
|
||||
|
||||
|
||||
class Dilution(Device):
|
||||
def __init__(self, **kwargs):
|
||||
|
||||
self.name = 'DilSc'
|
||||
ID = self.name
|
||||
super().__init__(ID, **kwargs)
|
||||
|
||||
self.address = 'dilsc.psi.ch:5000'
|
||||
self.dilsc = SecopClient(self.address)
|
||||
self.dilsc.connect()
|
||||
|
||||
self.x = MagnetCoil("X", self.dilsc, 'x', limit_low=-0.6, limit_high=0.6)
|
||||
self.y = MagnetCoil("Y", self.dilsc, 'y', limit_low=-0.6, limit_high=0.6)
|
||||
self.z = MagnetCoil("Z", self.dilsc, 'z', limit_low=-5.2, limit_high=5.2)
|
||||
self.T_plato = Thermometer('T_plato', self.dilsc, limit_low=0, limit_high=300)
|
||||
self.T_chip = Thermometer('T_chip', self.dilsc, limit_low=0, limit_high=300)
|
||||
self.T_reg = Thermometer('T_reg', self.dilsc, limit_low=0, limit_high=300)
|
||||
|
||||
class Thermometer(Adjustable):
|
||||
|
||||
def __init__(self, name, dilsc_connection, limit_low=-0.0001, limit_high=0.0001):
|
||||
|
||||
super().__init__(name, limit_low=limit_low, limit_high=limit_high)
|
||||
self.dilsc = dilsc_connection
|
||||
|
||||
# Heater to regulate channel A on the Galgen LakeShore372. Give value in Ohm.
|
||||
self.heater_resistance = 82
|
||||
# Defines heater ranges and PID values for various control temperature regions.
|
||||
self.heater_settings = [
|
||||
{'range': 'off', 'pid': (800, 1, 0), 'temp_start': -1, 'temp_end': 0.00099},
|
||||
{'range': '300uA', 'pid': (800, 1, 0), 'temp_start': 0.001, 'temp_end': 0.037},
|
||||
{'range': '1mA', 'pid': (40, 14, 0), 'temp_start': 0.038, 'temp_end': 0.108},
|
||||
{'range': '3mA', 'pid': (4, 15, 0), 'temp_start': 0.110, 'temp_end': 0.350},
|
||||
{'range': '10mA', 'pid': (2, 12, 0), 'temp_start': 0.352, 'temp_end': 1.100},
|
||||
{'range': '30mA', 'pid': (2, 60, 0), 'temp_start': 1.100, 'temp_end': 2.300}
|
||||
]
|
||||
|
||||
def _check_connection(func):
|
||||
def checker(self, *args, **kwargs):
|
||||
if not self.dilsc.online:
|
||||
raise ConnectionError(f'No connection to dilsc at {self.address}')
|
||||
else:
|
||||
return func(self, *args, **kwargs)
|
||||
return checker
|
||||
|
||||
@_check_connection
|
||||
def set_heater_range(self, range_value):
|
||||
""" Sets the heater range for the control channel and sets the PID parameters for the associated control loop.
|
||||
TODO: Consider redoing so that it only works for the T_reg channel.
|
||||
TODO: the pid values are now sent with stringio and not saved as parameters in slic, this should be fixed.
|
||||
-
|
||||
"""
|
||||
heater_range_map = {
|
||||
'off': 0, '30uA': 1, '100uA': 2, '300uA': 3, '1mA': 4, '3mA': 5, '10mA': 6, '30mA': 7, '100mA': 8}
|
||||
if range_value not in heater_range_map:
|
||||
raise ValueError("Invalid range value. Allowed are: ['off','30uA','100uA','300uA','1mA','3mA','10mA','30mA','100mA']")
|
||||
enum_value = heater_range_map[range_value]
|
||||
self.dilsc.setParameter(self.name, 'htrrng', enum_value)
|
||||
|
||||
for setting in self.heater_settings:
|
||||
if setting['range'] == range_value:
|
||||
self.set_PID_parameters(*setting['pid'])
|
||||
break
|
||||
return
|
||||
|
||||
@_check_connection
|
||||
def get_current_value(self):
|
||||
cacheitem = self.dilsc.getParameter(f'{self.name}', 'value', trycache=False)
|
||||
return cacheitem.value
|
||||
|
||||
|
||||
@_check_connection
|
||||
def set_target_value(self, value, adjust_heater_range=True):
|
||||
if adjust_heater_range:
|
||||
range_to_set = None
|
||||
for setting in self.heater_settings:
|
||||
if setting['temp_start'] <= value and setting['temp_end'] >= value:
|
||||
range_to_set = setting['range']
|
||||
if range_to_set != None:
|
||||
self.set_heater_range(range_to_set)
|
||||
else:
|
||||
raise ValueError(f"Heater range for the target value {value} could not be set")
|
||||
self.dilsc.setParameter(f'{self.name}', 'target', value)
|
||||
|
||||
@_check_connection
|
||||
def get_target_value(self):
|
||||
cacheitem = self.dilsc.getParameter(f'{self.name}', 'target', trycache=False)
|
||||
return cacheitem.value
|
||||
|
||||
|
||||
@_check_connection
|
||||
def is_moving(self):
|
||||
response = self.dilsc.getParameter(f'{self.name}','status', trycache=False)
|
||||
return response[0][0] > StatusType.PREPARED
|
||||
|
||||
@_check_connection
|
||||
def get_PID_parameters(self):
|
||||
""" Returns the current PID parameters associated with the control loop for
|
||||
this thermometer.
|
||||
"""
|
||||
# response = self.dilsc.getParameter(f'{self.name}','ctrlpars', trycache=False)
|
||||
response = self.dilsc.execCommand('lscio', 'communicate', 'PID?')
|
||||
return response
|
||||
|
||||
@_check_connection
|
||||
def set_PID_parameters(self, p, i, d):
|
||||
""" Sets the PID parameters for the associated control loop.
|
||||
TODO:
|
||||
- This still returns a timeout error but sets the correct values.
|
||||
- The range is limited to less than the Lakeshore range allows, this needs
|
||||
to be fixed in frappy.
|
||||
"""
|
||||
# self.dilsc.setParameter(f'{self.name}', 'ctrlpars', {'p': p, 'i': i, 'd': d})
|
||||
command_string = f'PID {0},{p},{i},{d}; PID?'
|
||||
self.dilsc.execCommand('lscio', 'communicate', command_string)
|
||||
|
||||
|
||||
class MagnetCoil(Adjustable):
|
||||
|
||||
def __init__(self, name, dilsc_connection, direction, limit_low=-0.0001, limit_high=0.0001):
|
||||
|
||||
super().__init__(name, limit_low=-0.0001, limit_high=0.0001)
|
||||
|
||||
self.direction = direction.lower()
|
||||
|
||||
if self.direction not in ["x", "y", "z"]:
|
||||
raise ValueError("Direction must be either x, y or z.")
|
||||
|
||||
self.dilsc = dilsc_connection
|
||||
|
||||
|
||||
def _check_connection(func):
|
||||
def checker(self, *args, **kwargs):
|
||||
if not self.dilsc.online:
|
||||
raise ConnectionError(f'No connection to dilsc at {self.address}')
|
||||
else:
|
||||
return func(self, *args, **kwargs)
|
||||
return checker
|
||||
|
||||
@_check_connection
|
||||
def get_current_value(self):
|
||||
cacheitem = self.dilsc.getParameter(f'mf{self.direction}', 'value', trycache=False)
|
||||
return cacheitem.value
|
||||
|
||||
|
||||
@_check_connection
|
||||
def set_target_value(self, value):
|
||||
self.dilsc.setParameter(f'mf{self.direction}', 'target', value)
|
||||
|
||||
@_check_connection
|
||||
def is_moving(self):
|
||||
response = self.dilsc.getParameter(f'mf{self.direction}','status', trycache=False)
|
||||
return response[0][0] > StatusType.PREPARED
|
||||
|
||||
@_check_connection
|
||||
def set_ramp_speed(self, direction, value):
|
||||
""" Sets ramp speed for a given direction (x,y or z) and value in T/min.
|
||||
"""
|
||||
if value > 0.5:
|
||||
raise ValueError('Do not exceed 0.5 T/min unless you want a quench party')
|
||||
if value <= 0:
|
||||
raise ValueError('Only positive values are allowed')
|
||||
if self.direction not in ["x", "y", "z"]:
|
||||
raise ValueError("Direction must be either x, y or z.")
|
||||
else:
|
||||
self.dilsc.setParameter(direction, 'ramp', value)
|
||||
return
|
||||
|
||||
|
0
exp_temp/synchronization.py → crq_exp/synchronization.py
Normal file → Executable file
0
exp_temp/synchronization.py → crq_exp/synchronization.py
Normal file → Executable file
@ -1,50 +0,0 @@
|
||||
""" Diffractometer
|
||||
|
||||
motorized axis:
|
||||
|
||||
SARES30-CPCL-ECMC02:ROT2THETA
|
||||
SARES30-CPCL-ECMC02:ROTTHETA
|
||||
SARES30-CPCL-ECMC02:TRXBASE
|
||||
SARES30-CPCL-ECMC02:TRYBASE
|
||||
|
||||
"""
|
||||
|
||||
from slic.core.adjustable import Adjustable, Linked
|
||||
|
||||
from slic.core.device import Device, SimpleDevice
|
||||
from slic.devices.general.motor import Motor
|
||||
|
||||
|
||||
class Diffractometer(Device):
|
||||
def __init__(self, ID, motor_naming="MOTOR", **kwargs):
|
||||
super().__init__(ID, **kwargs)
|
||||
|
||||
self.twotheta = Motor("SARES30-CPCL-ECMC02:ROT2THETA") # , ID=None, name=None, units=None, internal=False):
|
||||
self.theta = Motor("SARES30-CPCL-ECMC02:ROTTHETA") # , ID=None, name=None, units=None, internal=False):
|
||||
|
||||
self.trx_base = Motor("SARES30-CPCL-ECMC02:TRXBASE") # , ID=None, name=None, units=None, internal=False):
|
||||
self.try_base = Motor("SARES30-CPCL-ECMC02:TRYBASE") # , ID=None, name=None, units=None, internal=False):
|
||||
|
||||
self.tr_x = Motor("SARES30-CPCL-ECMC02:TRX")
|
||||
self.tr_y = Motor("SARES30-CPCL-ECMC02:TRY")
|
||||
self.tr_z = Motor("SARES30-CPCL-ECMC02:TRZ")
|
||||
|
||||
self.td = Motor("SARES30-CPCL-ECMC02:TD")
|
||||
|
||||
|
||||
# Set speed:
|
||||
# diffractometer.theta._motor.VELO = 0.25
|
||||
|
||||
class ThetasCombined(Linked):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(self, *args, **kwargs)
|
||||
|
||||
def connect_axis(self):
|
||||
"""
|
||||
calculate offset to match scale factor
|
||||
"""
|
||||
|
||||
offset = self.secondary.get_current_value() - self.primary.get_current_value() * self.scale_factor
|
||||
self.offset = offset
|
||||
|
||||
|
102
devices/dilsc.py
102
devices/dilsc.py
@ -1,102 +0,0 @@
|
||||
""" DilSc prototype
|
||||
|
||||
"""
|
||||
|
||||
from slic.core.adjustable import Adjustable
|
||||
|
||||
from slic.core.device import Device, SimpleDevice
|
||||
|
||||
from frappy.client import SecopClient
|
||||
from frappy import states
|
||||
from frappy.datatypes import StatusType
|
||||
|
||||
|
||||
class Dilution(Device):
|
||||
def __init__(self, **kwargs):
|
||||
|
||||
self.name = 'DilSc'
|
||||
ID = self.name
|
||||
super().__init__(ID, **kwargs)
|
||||
|
||||
self.address = 'dilsc.psi.ch:5000'
|
||||
self.dilsc = SecopClient(self.address)
|
||||
self.dilsc.connect()
|
||||
|
||||
self.x = MagnetCoil("X", self.dilsc, 'x', limit_low=-0.6, limit_high=0.6)
|
||||
self.y = MagnetCoil("Y", self.dilsc, 'y', limit_low=-0.6, limit_high=0.6)
|
||||
self.z = MagnetCoil("Z", self.dilsc, 'z', limit_low=-5.2, limit_high=5.2)
|
||||
self.T_plato = Thermometer('T_plato', self.dilsc, limit_low=0, limit_high=300)
|
||||
self.T_pucksensor = Thermometer('T_pucksensor', self.dilsc, limit_low=0, limit_high=300)
|
||||
|
||||
|
||||
class Thermometer(Adjustable):
|
||||
|
||||
def __init__(self, name, dilsc_connection, limit_low=-0.0001, limit_high=0.0001):
|
||||
|
||||
super().__init__(name, limit_low=limit_low, limit_high=limit_high)
|
||||
self.dilsc = dilsc_connection
|
||||
|
||||
|
||||
def _check_connection(func):
|
||||
def checker(self, *args, **kwargs):
|
||||
if not self.dilsc.online:
|
||||
raise ConnectionError(f'No connection to dilsc at {self.address}')
|
||||
else:
|
||||
return func(self, *args, **kwargs)
|
||||
return checker
|
||||
|
||||
@_check_connection
|
||||
def get_current_value(self):
|
||||
cacheitem = self.dilsc.getParameter(f'{self.name}', 'value', trycache=False)
|
||||
return cacheitem.value
|
||||
|
||||
|
||||
@_check_connection
|
||||
def set_target_value(self, value):
|
||||
self.dilsc.setParameter(f'{self.name}', 'target', value)
|
||||
|
||||
@_check_connection
|
||||
def is_moving(self):
|
||||
response = self.dilsc.getParameter(f'{self.name}','status', trycache=False)
|
||||
return response[0][0] > StatusType.PREPARED
|
||||
|
||||
|
||||
|
||||
class MagnetCoil(Adjustable):
|
||||
|
||||
def __init__(self, name, dilsc_connection, direction, limit_low=-0.0001, limit_high=0.0001):
|
||||
|
||||
super().__init__(name, limit_low=-0.0001, limit_high=0.0001)
|
||||
|
||||
self.direction = direction.lower()
|
||||
|
||||
if self.direction not in ["x", "y", "z"]:
|
||||
raise ValueError("Direction must be either x, y or z.")
|
||||
|
||||
self.dilsc = dilsc_connection
|
||||
|
||||
|
||||
def _check_connection(func):
|
||||
def checker(self, *args, **kwargs):
|
||||
if not self.dilsc.online:
|
||||
raise ConnectionError(f'No connection to dilsc at {self.address}')
|
||||
else:
|
||||
return func(self, *args, **kwargs)
|
||||
return checker
|
||||
|
||||
@_check_connection
|
||||
def get_current_value(self):
|
||||
cacheitem = self.dilsc.getParameter(f'mf{self.direction}', 'value', trycache=False)
|
||||
return cacheitem.value
|
||||
|
||||
|
||||
@_check_connection
|
||||
def set_target_value(self, value):
|
||||
self.dilsc.setParameter(f'mf{self.direction}', 'target', value)
|
||||
|
||||
@_check_connection
|
||||
def is_moving(self):
|
||||
response = self.dilsc.getParameter(f'mf{self.direction}','status', trycache=False)
|
||||
return response[0][0] > StatusType.PREPARED
|
||||
|
||||
|
0
devices/knife_edge.py
Normal file → Executable file
0
devices/knife_edge.py
Normal file → Executable file
0
environment.txt
Normal file → Executable file
0
environment.txt
Normal file → Executable file
5
exp_temp/I0_foil_motor.py
Executable file
5
exp_temp/I0_foil_motor.py
Executable file
@ -0,0 +1,5 @@
|
||||
from slic.devices.general.motor import Motor
|
||||
from slic.devices.general.smaract import SmarActAxis
|
||||
|
||||
I0_foils = Motor("SARES30-MCS20610:MCS3")
|
||||
# I0_foils = SmarActAxis("SARES30-MCS20610:MCS3")
|
1013
exp_temp/channels.py
1013
exp_temp/channels.py
File diff suppressed because it is too large
Load Diff
184
exp_temp/fake_attenuator.py
Executable file
184
exp_temp/fake_attenuator.py
Executable file
@ -0,0 +1,184 @@
|
||||
from time import sleep
|
||||
|
||||
from slic.core.adjustable import Adjustable, PVAdjustable
|
||||
from slic.core.device import Device, SimpleDevice
|
||||
from slic.devices.general.motor import Motor
|
||||
from slic.utils.hastyepics import get_pv as PV
|
||||
|
||||
|
||||
|
||||
class Attenuator(Device):
|
||||
|
||||
def __init__(self, ID, energy_threshold=1500, name="Attenuator Aramis", process_time=1, **kwargs):
|
||||
super().__init__(ID, name=name, **kwargs)
|
||||
|
||||
|
||||
# self.motor_limits = motor_limits
|
||||
|
||||
# self.motors = motors = LimitedMotors(ID, motor_limits)
|
||||
self.motor_status_pvs = [PVAdjustable(f"{ID}:MOTOR_{i}.DMOV") for i in [1,2,3,4,5,6]]
|
||||
|
||||
# self.motors = LimitedMotors(ID, motor_limits)
|
||||
|
||||
self.trans1st = Transmission(ID, process_time=process_time)
|
||||
self.trans3rd = Transmission(ID, process_time=process_time, third_order=True)
|
||||
self.energy = LimitedEnergy(ID, energy_threshold, process_time)
|
||||
self.foils = [Foil(ID, i+1) for i in range(6)]
|
||||
|
||||
|
||||
def get_current_transmission(self):
|
||||
return self.trans1st.get_current_value()
|
||||
|
||||
def get_current_transmission_third_harmonic(self):
|
||||
return self.trans3rd.get_current_value()
|
||||
|
||||
def set_transmission(self, value, energy=None):
|
||||
self.energy.set_target_value(energy)
|
||||
self.trans1st.set_target_value(value)
|
||||
|
||||
def set_transmission_third_harmonic(self, value, energy=None):
|
||||
self.energy.set_target_value(energy)
|
||||
self.trans3rd.set_target_value(value)
|
||||
|
||||
|
||||
def set_foils_combination(self, combination: list, wait=False):
|
||||
assert len(combination) == 6, "Invalid combination entered"
|
||||
|
||||
for value in combination:
|
||||
assert value in self.foils[0].values, "wrong value entered"
|
||||
|
||||
|
||||
for i, (foil,value) in enumerate(zip(self.foils,combination)):
|
||||
print(f"setting {repr(foil)} to position {value}")
|
||||
foil.set_target_value(value)
|
||||
|
||||
if wait:
|
||||
self.foils[0].wait_for_motion()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class Transmission(PVAdjustable):
|
||||
|
||||
def __init__(self, ID, third_order=False, check_motors=True, **kwargs):
|
||||
#self.motors = motors
|
||||
self.third_order = third_order
|
||||
self.motors = [Motor(f"{ID}:MOTOR_{i}") for i in [1,2,3,4,5,6]]
|
||||
|
||||
self.check_motors = check_motors
|
||||
|
||||
prefix = ID + ":"
|
||||
# Changed for new attenuator IOC
|
||||
pvname_setvalue = prefix + "UsrRec.TD"
|
||||
pvname_readback = prefix + ("UsrRec.TC3" if third_order else "UsrRec.TC1")
|
||||
super().__init__(pvname_setvalue, pvname_readback, **kwargs)
|
||||
|
||||
self.pvnames.third_order_toggle = pvn = prefix + "UsrRec.HRM3"
|
||||
self.pvs.third_order_toggle = PV(pvn)
|
||||
|
||||
|
||||
pv_calculated = prefix + ("UsrRec.TR3" if third_order else "UsrRec.TR1")
|
||||
pv_current = prefix + ("UsrRec.TC3" if third_order else "UsrRec.TC1")
|
||||
|
||||
self.calculated_trans = PVAdjustable(pv_calculated).get_current_value()
|
||||
self.current_trans = PVAdjustable(pv_current).get_current_value()
|
||||
|
||||
def set_target_value(self, *args, **kwargs):
|
||||
self.set_third_order_toggle()
|
||||
t = super().set_target_value(*args, **kwargs)
|
||||
self.wait_for_motion()
|
||||
return t
|
||||
|
||||
def set_third_order_toggle(self):
|
||||
self.pvs.third_order_toggle.put(self.third_order)
|
||||
|
||||
def wait_for_motion(self):
|
||||
sleep(1) # to be certain that motion has started
|
||||
while True:
|
||||
if not self.is_moving():
|
||||
break # motion is completed
|
||||
sleep(0.25)
|
||||
|
||||
def is_moving(self):
|
||||
if self.check_motors:
|
||||
return any(m.is_moving() for m in self.motors)
|
||||
|
||||
else:
|
||||
return (self.calculated_trans != self.current_trans)
|
||||
|
||||
|
||||
|
||||
class LimitedEnergy(PVAdjustable):
|
||||
|
||||
def __init__(self, ID, threshold, wait_time):
|
||||
self.threshold = threshold
|
||||
self.wait_time = wait_time
|
||||
|
||||
super().__init__(ID + ":UsrRec.ERY")
|
||||
|
||||
prefix = ID + ":"
|
||||
self.pvnames.fel_energy = pvn = prefix + "ENY_CALC" # uses the new calculated energy from attenuator IOC
|
||||
self.pvs.fel_energy = PV(pvn)
|
||||
|
||||
|
||||
def set_target_value(self, value):
|
||||
threshold = self.threshold
|
||||
wait_time = self.wait_time
|
||||
|
||||
while not value:
|
||||
value = self.pvs.fel_energy.get()
|
||||
if value is not None:
|
||||
if value >= threshold:
|
||||
break
|
||||
|
||||
print(f"Machine photon energy ({value} eV) is below {threshold} eV - waiting for the machine to recover...")
|
||||
value = None
|
||||
sleep(wait_time)
|
||||
|
||||
super().set_target_value(value) # setting the energy is now instantanious, motors will still move afterwards.
|
||||
print(f"Set attenuator energy to {value} eV")
|
||||
|
||||
|
||||
class Foil(PVAdjustable):
|
||||
|
||||
def __init__(self, ID, number,check_motors=True):
|
||||
""" Foil with possible settings of 0,1,2,3 or 4.
|
||||
"""
|
||||
|
||||
assert 0 <= int(number) <= 6, "Invalid foil selected"
|
||||
super().__init__(ID + f":UsrRec.FI{number}")
|
||||
|
||||
self.values = [0, 1, 2, 3, 4]
|
||||
|
||||
prefix = ID + ":"
|
||||
|
||||
self.motors = [Motor(f"{ID}:MOTOR_{i}") for i in [1,2,3,4,5,6]]
|
||||
self.check_motors = check_motors
|
||||
|
||||
pv_calculated = prefix + "UsrRec.TR1"
|
||||
pv_current = prefix + "UsrRec.TC1"
|
||||
|
||||
self.calculated_trans = PVAdjustable(pv_calculated).get_current_value()
|
||||
self.current_trans = PVAdjustable(pv_current).get_current_value()
|
||||
|
||||
def set_target_value(self, *args, **kwargs):
|
||||
t = super().set_target_value(*args, **kwargs).wait()
|
||||
self.wait_for_motion()
|
||||
return t
|
||||
|
||||
def wait_for_motion(self):
|
||||
sleep(1) # to be certain that motion has started
|
||||
while True:
|
||||
if not self.is_moving():
|
||||
break # motion is completed
|
||||
sleep(0.25)
|
||||
|
||||
def is_moving(self):
|
||||
if self.check_motors:
|
||||
return any(m.is_moving() for m in self.motors)
|
||||
|
||||
else:
|
||||
return (self.calculated_trans != self.current_trans)
|
||||
|
||||
|
6
exp_temp/mono.py
Executable file
6
exp_temp/mono.py
Executable file
@ -0,0 +1,6 @@
|
||||
from slic.devices.general.motor import Motor
|
||||
|
||||
|
||||
Mono_rotation = Motor("SARES30-MOBI2:MOT_RY") # large rotation stage
|
||||
|
||||
|
6
experiments/DilSC/TwoTheta_scan.ipynb
Normal file → Executable file
6
experiments/DilSC/TwoTheta_scan.ipynb
Normal file → Executable file
@ -193,9 +193,9 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python [conda env:conda-slic]",
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "conda-env-conda-slic-py"
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
@ -207,7 +207,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.9.18"
|
||||
"version": "3.9.20"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
12
experiments/PMS/PMS.py
Normal file → Executable file
12
experiments/PMS/PMS.py
Normal file → Executable file
@ -32,3 +32,15 @@ class PP_Shutter:
|
||||
def __repr__(self):
|
||||
tn = typename(self)
|
||||
return f'{tn} "{self.name}" is {self.status}'
|
||||
|
||||
|
||||
|
||||
def get_Cernox_temperature():
|
||||
""" Very improvised """
|
||||
import csv
|
||||
|
||||
fname = '/gfa/.mounts/sf_cristallina/applications/devices/CryovacTIC/temperatures_009.csv'
|
||||
with open(fname) as f:
|
||||
reader = csv.reader(f)
|
||||
rows = [row for row in reader]
|
||||
return float(rows[-1][3])
|
0
devices/attocube.py → gp_exp/attocube.py
Normal file → Executable file
0
devices/attocube.py → gp_exp/attocube.py
Normal file → Executable file
2
devices/attocube_device_def.py → gp_exp/attocube_device_def.py
Normal file → Executable file
2
devices/attocube_device_def.py → gp_exp/attocube_device_def.py
Normal file → Executable file
@ -1,4 +1,4 @@
|
||||
from devices.attocube import AttocubeStage
|
||||
from .attocube import AttocubeStage
|
||||
|
||||
attocube = AttocubeStage(
|
||||
"SARES30-ATTOCUBE",
|
8
gp_exp/components.py
Executable file
8
gp_exp/components.py
Executable file
@ -0,0 +1,8 @@
|
||||
from slic.devices.general.motor import Motor
|
||||
from gp_exp.jj_device_def import SlitUnitCenterWidthJJ
|
||||
|
||||
OWIS = Motor("SARES30-MOBI1:MOT_6") # small OWIS linear stage
|
||||
|
||||
Newport_large = Motor("SARES30-MOBI1:MOT_5")
|
||||
|
||||
slitsjj = SlitUnitCenterWidthJJ("SARES30-MOBI2", motor_naming="MOT")
|
0
devices/jj_device_def.py → gp_exp/jj_device_def.py
Normal file → Executable file
0
devices/jj_device_def.py → gp_exp/jj_device_def.py
Normal file → Executable file
0
devices/newport.py → gp_exp/newport.py
Normal file → Executable file
0
devices/newport.py → gp_exp/newport.py
Normal file → Executable file
0
devices/smaract.py → gp_exp/smaract.py
Normal file → Executable file
0
devices/smaract.py → gp_exp/smaract.py
Normal file → Executable file
2
devices/smaract_device_def.py → gp_exp/smaract_device_def.py
Normal file → Executable file
2
devices/smaract_device_def.py → gp_exp/smaract_device_def.py
Normal file → Executable file
@ -1,5 +1,5 @@
|
||||
# from slic.devices.general.smaract import SmarActStage
|
||||
from devices.smaract import SmarActStage
|
||||
from gp_exp.smaract import SmarActStage
|
||||
from slic.core.device.simpledevice import SimpleDevice
|
||||
from slic.devices.general.motor import Motor
|
||||
|
0
devices/standa.py → gp_exp/standa.py
Normal file → Executable file
0
devices/standa.py → gp_exp/standa.py
Normal file → Executable file
912
log/cristallina.log
Normal file → Executable file
912
log/cristallina.log
Normal file → Executable file
@ -1,855 +1,57 @@
|
||||
2023-09-13 at 17:47:59 | INFO | Connected to stand server
|
||||
2023-09-13 at 17:48:00 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-13 at 17:48:00 | INFO | Running at cristallina with pgroup p19150.
|
||||
2023-09-13 at 17:48:00 | INFO | Loading finished.
|
||||
2023-09-13 at 17:59:12 | INFO | Connected to stand server
|
||||
2023-09-13 at 17:59:13 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-13 at 17:59:13 | INFO | Running at cristallina with pgroup p19150.
|
||||
2023-09-13 at 17:59:13 | INFO | Loading finished.
|
||||
2023-09-13 at 23:23:54 | INFO | Connected to stand server
|
||||
2023-09-13 at 23:23:54 | WARNING | No transmission value reported from {attenuator.ID}
|
||||
2023-09-13 at 23:23:55 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-13 at 23:23:56 | INFO | Running at cristallina with pgroup p19150.
|
||||
2023-09-13 at 23:23:56 | INFO | Loading finished.
|
||||
2023-09-23 at 18:20:47 | WARNING | Cannot connect to stand server on saresc-vcons-02.psi.ch. Caught HTTPConnectionPool(host='saresc-vcons-02.psi.ch', port=9090): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f52e5816430>: Failed to establish a new connection: [Errno 111] Connection refused')).
|
||||
2023-09-23 at 18:20:47 | WARNING | No transmission value reported from {attenuator.ID}
|
||||
2023-09-23 at 18:20:48 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-23 at 18:20:51 | INFO | Running at cristallina with pgroup p19150.
|
||||
2023-09-23 at 18:20:51 | INFO | Loading finished.
|
||||
2023-09-23 at 18:33:46 | WARNING | Cannot connect to stand server on saresc-vcons-02.psi.ch. Caught HTTPConnectionPool(host='saresc-vcons-02.psi.ch', port=9090): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f86f9a083d0>: Failed to establish a new connection: [Errno 111] Connection refused')).
|
||||
2023-09-23 at 18:33:47 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-23 at 18:33:47 | INFO | Running at cristallina with pgroup p19150.
|
||||
2023-09-23 at 18:33:47 | INFO | Loading finished.
|
||||
2023-09-25 at 12:57:37 | WARNING | Cannot connect to stand server on saresc-vcons-02.psi.ch. Caught HTTPConnectionPool(host='saresc-vcons-02.psi.ch', port=9090): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fcdb41d4370>: Failed to establish a new connection: [Errno 111] Connection refused')).
|
||||
2023-09-25 at 12:57:37 | WARNING | No transmission value reported from {attenuator.ID}
|
||||
2023-09-25 at 12:57:38 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-25 at 12:57:38 | INFO | Running at cristallina with pgroup p19150.
|
||||
2023-09-25 at 12:57:38 | INFO | Loading finished.
|
||||
2023-09-25 at 13:25:29 | WARNING | Cannot connect to stand server on saresc-vcons-02.psi.ch. Caught HTTPConnectionPool(host='saresc-vcons-02.psi.ch', port=9090): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7feb9ca24d90>: Failed to establish a new connection: [Errno 111] Connection refused')).
|
||||
2023-09-25 at 13:25:29 | WARNING | No transmission value reported from {attenuator.ID}
|
||||
2023-09-25 at 13:25:31 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-25 at 13:25:31 | INFO | Running at cristallina with pgroup p19150.
|
||||
2023-09-25 at 13:25:31 | INFO | Loading finished.
|
||||
2023-09-25 at 17:16:41 | WARNING | Cannot connect to stand server on saresc-vcons-02.psi.ch. Caught HTTPConnectionPool(host='saresc-vcons-02.psi.ch', port=9090): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f51e5efcdf0>: Failed to establish a new connection: [Errno 111] Connection refused')).
|
||||
2023-09-25 at 17:16:41 | WARNING | No transmission value reported from {attenuator.ID}
|
||||
2023-09-25 at 17:16:43 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-25 at 17:16:43 | INFO | Running at cristallina with pgroup p19150.
|
||||
2023-09-25 at 17:16:43 | INFO | Loading finished.
|
||||
2023-09-25 at 21:12:24 | WARNING | Cannot connect to stand server on saresc-vcons-02.psi.ch. Caught HTTPConnectionPool(host='saresc-vcons-02.psi.ch', port=9090): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f90c6285490>: Failed to establish a new connection: [Errno 111] Connection refused')).
|
||||
2023-09-25 at 21:12:24 | WARNING | No transmission value reported from {attenuator.ID}
|
||||
2023-09-25 at 21:12:25 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-25 at 21:12:26 | INFO | Running at cristallina with pgroup p21516.
|
||||
2023-09-25 at 21:12:26 | INFO | Loading finished.
|
||||
2023-09-25 at 21:14:20 | WARNING | Cannot connect to stand server on saresc-vcons-02.psi.ch. Caught HTTPConnectionPool(host='saresc-vcons-02.psi.ch', port=9090): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f90c458ab80>: Failed to establish a new connection: [Errno 111] Connection refused')).
|
||||
2023-09-25 at 21:14:21 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-25 at 21:14:21 | INFO | Running at cristallina with pgroup p21516.
|
||||
2023-09-25 at 21:14:21 | INFO | Loading finished.
|
||||
2023-09-25 at 21:14:48 | WARNING | Cannot connect to stand server on saresc-vcons-02.psi.ch. Caught HTTPConnectionPool(host='saresc-vcons-02.psi.ch', port=9090): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f90c44e5a30>: Failed to establish a new connection: [Errno 111] Connection refused')).
|
||||
2023-09-25 at 21:14:49 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-25 at 21:14:49 | INFO | Running at cristallina with pgroup p21516.
|
||||
2023-09-25 at 21:14:49 | INFO | Loading finished.
|
||||
2023-09-25 at 21:14:57 | WARNING | Cannot connect to stand server on saresc-vcons-02.psi.ch. Caught HTTPConnectionPool(host='saresc-vcons-02.psi.ch', port=9090): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f90c4464e80>: Failed to establish a new connection: [Errno 111] Connection refused')).
|
||||
2023-09-25 at 21:14:58 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-25 at 21:14:58 | INFO | Running at cristallina with pgroup p21516.
|
||||
2023-09-25 at 21:14:58 | INFO | Loading finished.
|
||||
2023-09-25 at 21:21:52 | WARNING | Cannot connect to stand server on saresc-vcons-02.psi.ch. Caught HTTPConnectionPool(host='saresc-vcons-02.psi.ch', port=9090): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f90c4476df0>: Failed to establish a new connection: [Errno 111] Connection refused')).
|
||||
2023-09-25 at 21:21:53 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-25 at 21:21:53 | INFO | Running at cristallina with pgroup p21516.
|
||||
2023-09-25 at 21:21:53 | INFO | Loading finished.
|
||||
2023-09-25 at 21:23:35 | INFO | Connected to stand server
|
||||
2023-09-25 at 21:23:36 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-25 at 21:23:36 | INFO | Running at cristallina with pgroup p21516.
|
||||
2023-09-25 at 21:23:36 | INFO | Loading finished.
|
||||
2023-09-25 at 21:28:02 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 21:28:05 | DEBUG | Simple acquisition complete: {'run_number': 1, 'time': 'Mon Sep 25 21:28:03 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': '', 'parameters': ''}
|
||||
2023-09-25 at 22:06:08 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 22:06:09 | DEBUG | Simple acquisition complete: {'run_number': 2, 'time': 'Mon Sep 25 22:06:09 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': '', 'parameters': ''}
|
||||
2023-09-25 at 22:59:49 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 22:59:50 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 22:59:50 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:6.990000'}
|
||||
2023-09-25 at 22:59:52 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 22:59:52 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 22:59:52 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:5.000000'}
|
||||
2023-09-25 at 22:59:53 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 22:59:54 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 22:59:53 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:5.100000'}
|
||||
2023-09-25 at 22:59:54 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 22:59:55 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 22:59:54 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:5.200000'}
|
||||
2023-09-25 at 22:59:55 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 22:59:56 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 22:59:55 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:5.300000'}
|
||||
2023-09-25 at 22:59:56 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 22:59:57 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 22:59:56 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:5.400000'}
|
||||
2023-09-25 at 22:59:57 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 22:59:58 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 22:59:57 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:5.500000'}
|
||||
2023-09-25 at 22:59:58 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 22:59:58 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 22:59:58 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:5.600000'}
|
||||
2023-09-25 at 22:59:59 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 22:59:59 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 22:59:59 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:5.700000'}
|
||||
2023-09-25 at 23:00:00 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 23:00:00 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 23:00:00 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:5.800000'}
|
||||
2023-09-25 at 23:00:01 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 23:00:01 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 23:00:01 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:5.900000'}
|
||||
2023-09-25 at 23:00:02 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 23:00:02 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 23:00:02 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:6.000000'}
|
||||
2023-09-25 at 23:00:03 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 23:00:03 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 23:00:03 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:6.100000'}
|
||||
2023-09-25 at 23:00:04 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 23:00:05 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 23:00:04 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:6.200000'}
|
||||
2023-09-25 at 23:00:05 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 23:00:06 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 23:00:05 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:6.300000'}
|
||||
2023-09-25 at 23:00:06 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 23:00:06 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 23:00:06 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:6.400000'}
|
||||
2023-09-25 at 23:00:07 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 23:00:07 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 23:00:07 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:6.500000'}
|
||||
2023-09-25 at 23:00:08 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 23:00:08 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 23:00:08 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:6.600000'}
|
||||
2023-09-25 at 23:00:09 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 23:00:09 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 23:00:09 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:6.700000'}
|
||||
2023-09-25 at 23:00:10 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 23:00:10 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 23:00:10 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:6.800000'}
|
||||
2023-09-25 at 23:00:11 | INFO | Simple acquisition started.
|
||||
2023-09-25 at 23:00:11 | DEBUG | Simple acquisition complete: {'run_number': 3, 'time': 'Mon Sep 25 23:00:11 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'Smaract movement test', 'parameters': 'x:6.900000'}
|
||||
2023-09-26 at 10:58:09 | INFO | Simple acquisition started.
|
||||
2023-09-26 at 10:58:10 | DEBUG | Simple acquisition complete: {'run_number': 4, 'time': 'Tue Sep 26 10:58:09 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'testing the CTA acquisition', 'parameters': ''}
|
||||
2023-09-26 at 11:02:35 | INFO | Retrieve images starting from pid 19120266900.
|
||||
2023-09-26 at 11:02:35 | DEBUG | {'run_number': 4, 'acq_number': 2, 'total_acq_number': 25, 'filenames': ['/sf/cristallina/data/p21516/raw/run0004/data/acq0002.PVDATA.h5', '/sf/cristallina/data/p21516/raw/run0004/data/acq0002.BSDATA.h5', '/sf/cristallina/data/p21516/raw/run0004/data/acq0002.JF16T03V01.h5']}
|
||||
2023-09-26 at 11:42:56 | INFO | Connected to stand server
|
||||
2023-09-26 at 11:42:57 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-26 at 11:42:57 | INFO | Running at cristallina with pgroup p21516.
|
||||
2023-09-26 at 11:42:57 | INFO | Loading finished.
|
||||
2023-09-26 at 11:43:22 | INFO | Simple acquisition started.
|
||||
2023-09-26 at 11:43:23 | DEBUG | Simple acquisition complete: {'run_number': 5, 'time': 'Tue Sep 26 11:43:22 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'testing the CTA acquisition', 'parameters': ''}
|
||||
2023-09-26 at 11:44:29 | INFO | Retrieve images starting from pid 19120518800.
|
||||
2023-09-26 at 11:44:29 | DEBUG | {'run_number': 5, 'acq_number': 2, 'total_acq_number': 27, 'filenames': ['/sf/cristallina/data/p21516/raw/run0005/data/acq0002.PVDATA.h5', '/sf/cristallina/data/p21516/raw/run0005/data/acq0002.BSDATA.h5', '/sf/cristallina/data/p21516/raw/run0005/data/acq0002.JF16T03V01.h5']}
|
||||
2023-09-26 at 11:47:45 | INFO | Connected to stand server
|
||||
2023-09-26 at 11:47:46 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-26 at 11:47:46 | INFO | Running at cristallina with pgroup p21516.
|
||||
2023-09-26 at 11:47:46 | INFO | Loading finished.
|
||||
2023-09-26 at 11:49:08 | INFO | Simple acquisition started.
|
||||
2023-09-26 at 11:49:08 | DEBUG | Simple acquisition complete: {'run_number': 6, 'time': 'Tue Sep 26 11:49:08 2023', 'topic': 'Beamline commissioning', 'sample': '--', 'comment': 'testing the CTA acquisition, only one module', 'parameters': ''}
|
||||
2023-09-26 at 11:50:18 | INFO | Retrieve images starting from pid 19120553700.
|
||||
2023-09-26 at 11:50:18 | DEBUG | {'run_number': 6, 'acq_number': 2, 'total_acq_number': 29, 'filenames': ['/sf/cristallina/data/p21516/raw/run0006/data/acq0002.PVDATA.h5', '/sf/cristallina/data/p21516/raw/run0006/data/acq0002.BSDATA.h5', '/sf/cristallina/data/p21516/raw/run0006/data/acq0002.JF16T03V01.h5']}
|
||||
2023-09-26 at 13:49:08 | INFO | Connected to stand server
|
||||
2023-09-26 at 13:49:09 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-26 at 13:49:09 | INFO | Running at cristallina with pgroup p21516.
|
||||
2023-09-26 at 13:49:09 | INFO | Loading finished.
|
||||
2023-09-26 at 13:59:23 | INFO | Connected to stand server
|
||||
2023-09-26 at 13:59:24 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-26 at 13:59:24 | INFO | Running at cristallina with pgroup p21516.
|
||||
2023-09-26 at 13:59:24 | INFO | Loading finished.
|
||||
2023-09-26 at 13:59:46 | INFO | Connected to stand server
|
||||
2023-09-26 at 13:59:47 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-26 at 13:59:47 | INFO | Running at cristallina with pgroup p21516.
|
||||
2023-09-26 at 13:59:47 | INFO | Loading finished.
|
||||
2023-09-26 at 14:00:49 | INFO | Connected to stand server
|
||||
2023-09-26 at 14:00:49 | WARNING | No transmission value reported from {attenuator.ID}
|
||||
2023-09-26 at 14:00:50 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-26 at 14:00:50 | INFO | Running at cristallina with pgroup p21516.
|
||||
2023-09-26 at 14:00:50 | INFO | Loading finished.
|
||||
2023-09-26 at 14:01:34 | INFO | Connected to stand server
|
||||
2023-09-26 at 14:01:34 | WARNING | No transmission value reported from {attenuator.ID}
|
||||
2023-09-26 at 14:01:35 | INFO | Using undulator (Aramis) offset to PSSS energy of 0 eV.
|
||||
2023-09-26 at 14:01:35 | INFO | Running at cristallina with pgroup p21516.
|
||||
2023-09-26 at 14:01:35 | INFO | Loading finished.
|
||||
|