=Before name change

This commit is contained in:
root
2021-09-30 15:29:48 +02:00
parent 3d4ffb4624
commit e4547b163c
15 changed files with 88 additions and 407 deletions
@@ -25,6 +25,6 @@
"Bernina"
],
"alias": [
"tt_spatial"
"samplecam_sideview (SARES20-CAMS142-M1)"
]
}
@@ -1,13 +1,13 @@
{
"camera_calibration": {
"reference_marker": [
1321,
974,
1355,
1113
1084,
962,
1116,
1027
],
"reference_marker_width": 44.8,
"reference_marker_height": 183.1,
"reference_marker_width": 76.8,
"reference_marker_height": 144.1,
"angle_horizontal": 0.0,
"angle_vertical": 0.0
},
@@ -1,13 +1,13 @@
{
"camera_calibration": {
"reference_marker": [
394,
135,
519,
304
227,
55,
485,
394
],
"reference_marker_width": 2000.0,
"reference_marker_height": 2000.0,
"reference_marker_width": 4000.0,
"reference_marker_height": 4000.0,
"angle_horizontal": 21.0,
"angle_vertical": 0.0
},
@@ -21,5 +21,10 @@
"connections": 2,
"buffer_size": 100,
"buffer_logs": false,
"protocol": "icp"
"protocol": "icp",
"group": [
"Photonics",
"Maloja"
],
"alias": []
}
+2 -1
View File
@@ -29,7 +29,8 @@
"expanding": false,
"instances": [
"SATES21-CAMS154-M1",
"SATES24-CAMS161-M1"
"SATES24-CAMS161-M1",
"SATES21-PATT-M1"
]
},
"http://sf-daqsync-05.psi.ch:8880": {
@@ -1,12 +1,12 @@
{
"image_background_enable": true,
"image_background": null,
"image_background_enable": "passive",
"image_background": "SARES11-SPEC125-M1_20210926_143300_102984",
"image_threshold": null,
"image_region_of_interest": null,
"image_good_region": null,
"image_slices": null,
"pipeline_type": "processing",
"function": "psen_min_processing",
"function": "maloja_spectrometers.py",
"camera_name": "SARES11-SPEC125-M1",
"name": "SARES11-SPEC125-M1_psen_db",
"mode": "PUSH",
@@ -25,5 +25,6 @@
"processing_threads": 6,
"thread_buffer_size": 30,
"abort_on_error": false,
"no_client_timeout": 0
"no_client_timeout": 0,
"reload": true
}
@@ -8,8 +8,8 @@
"SARFE10-CVME-PHO6212:Lnk9Ch14-DATA-SUM",
"SARFE10-CVME-PHO6212:Lnk9Ch15-DATA-SUM"
],
"mode": "PUSH",
"function": "SARFE10-PBPS053_proc.py",
"mode": "PUB",
"function": "pbps.py",
"reload": true,
"no_client_timeout": 0,
"port": "9004",
@@ -17,13 +17,13 @@
"down": "SARFE10-CVME-PHO6212:Lnk9Ch13-DATA-SUM",
"right": "SARFE10-CVME-PHO6212:Lnk9Ch14-DATA-SUM",
"left": "SARFE10-CVME-PHO6212:Lnk9Ch15-DATA-SUM",
"up_calib": 0.147,
"down_calib": 0.1369,
"left_calib": 0.3929,
"right_calib": 0.2598,
"horiz_calib": -4.2696,
"vert_calib": -7.722,
"uJ_calib": 605.4608924473305,
"up_calib": 0.12141717065655942,
"down_calib": 0.11333970757135983,
"left_calib": 0.32278186898577477,
"right_calib": 0.2083195172927878,
"horiz_calib": -4.333267670316629,
"vert_calib": -7.819575351015781,
"uJ_calib": 464.59651093235357,
"threshold": 0,
"queue_length": 1000,
"xpos_all_x_pvname": "SARFE10-PBPS053:XPOS-ALL-HIST-X",
@@ -1,53 +0,0 @@
{
"pipeline_type": "processing",
"image_background_enable": false,
"image_background": null,
"image_threshold": null,
"image_region_of_interest": null,
"image_good_region": null,
"image_slices": null,
"bsread_address": "",
"bsread_channels": [
"SAROP11-CVME-PBPS2:Lnk9Ch11-DATA-SUM",
"SAROP11-CVME-PBPS2:Lnk9Ch13-DATA-SUM",
"SAROP11-CVME-PBPS2:Lnk9Ch14-DATA-SUM",
"SAROP11-CVME-PBPS2:Lnk9Ch15-DATA-SUM"
],
"bsread_image_buf": 1000,
"bsread_data_buf": 1000,
"mode": "PUB",
"camera_name": "SAROP11-PPRM110",
"function": "SAROP11-CVME-PBPS2_proc",
"name": "SAROP11-CVME-PBPS2_proc",
"up": "SAROP11-CVME-PBPS2:Lnk9Ch11-DATA-SUM",
"down": "SAROP11-CVME-PBPS2:Lnk9Ch13-DATA-SUM",
"right": "SAROP11-CVME-PBPS2:Lnk9Ch14-DATA-SUM",
"left": "SAROP11-CVME-PBPS2:Lnk9Ch15-DATA-SUM",
"up_calib": 0.147,
"down_calib": 0.1369,
"left_calib": 0.3929,
"right_calib": 0.2598,
"horiz_calib": -4.2696,
"vert_calib": -7.722,
"uJ_calib": 1,
"threshold": 0.3,
"queue_length": 512,
"intensity_pvname": "SLAAR11-GEN:LAS-XRAY",
"proc_pv": "SLAAR11-GEN:LAS-EVR",
"fft_x_pos_all_X_pvname": "SLAAR21-LSCP1-FNS:WFM1-X",
"fft_x_pos_all_Y_pvname": "SLAAR21-LSCP1-FNS:WFM1-Y",
"fft_x_pos_odd_X_pvname": "SLAAR21-LSCP1-FNS:WFM2-X",
"fft_x_pos_odd_Y_pvname": "SLAAR21-LSCP1-FNS:WFM2-Y",
"fft_x_pos_even_X_pvname": "SLAAR21-LSCP1-FNS:WFM3-X",
"fft_x_pos_even_Y_pvname": "SLAAR21-LSCP1-FNS:WFM3-Y",
"fft_y_pos_all_X_pvname": "SLAAR21-LSCP1-FNS:WFM4-X",
"fft_y_pos_all_Y_pvname": "SLAAR21-LSCP1-FNS:WFM4-Y",
"fft_y_pos_odd_X_pvname": "SLAAR21-LSCP1-FNS:WFM5-X",
"fft_y_pos_odd_Y_pvname": "SLAAR21-LSCP1-FNS:WFM5-Y",
"fft_y_pos_even_X_pvname": "",
"fft_y_pos_even_Y_pvname": ""
}
@@ -1,28 +1,30 @@
{
"image_background_enable": false,
"image_background": null,
"image_background_enable": "passive",
"image_background": "SATES21-CAMS154-M1_20210930_111716_937207",
"image_threshold": null,
"image_region_of_interest": null,
"image_good_region": null,
"image_slices": null,
"pipeline_type": "processing",
"function": "maloja_spectrometers.py",
"function": "spectrometer.py",
"camera_name": "SATES21-CAMS154-M1",
"name": "SATES21-CAMS154-M1_psen_db",
"mode": "PUSH",
"roi_background": [
250,
1600,
420,
700
1000,
1001,
1000,
1001
],
"roi_signal": [
250,
1600,
420,
700
],
103,
997,
370,
1540
],
"processing_threads": 4,
"thread_buffer_size": 30,
"reload": true
}
"reload": true,
"project_axis": 0,
"threshold": 10
}
@@ -6,24 +6,25 @@
"image_good_region": null,
"image_slices": null,
"pipeline_type": "processing",
"function": "maloja_spectrometers.py",
"function": "spectrometer.py",
"camera_name": "SATES24-CAMS161-M1",
"name": "SATES24-CAMS161-M1_psen_db",
"mode": "PUSH",
"roi_background": [
250,
1600,
420,
700
1000,
1001,
1000,
1001
],
"roi_signal": [
250,
1600,
420,
700
103,
997,
370,
1540
],
"reload": true,
"processing_threads": 4,
"thread_buffer_size": 30,
"project_axis": 1
}
"project_axis": 0,
"threshold": 1
}
@@ -1,4 +1,6 @@
{
"#SAROP21-ATT01_proc": "SAROP21-ATT01_proc",
"#test_stream": "test_stream",
"SARES11-SPEC125-M1_psen_db": "SARES11-SPEC125-M1_psen_db1",
"SARES11-SPEC125-M1_psen_ib": "SARES11-SPEC125-M1_psen_ib1",
"SARES11-SPEC125-M2_psen_db": "SARES11-SPEC125-M2_psen_db1",
@@ -13,13 +15,18 @@
"SARES20-PROF142-M1_ib": "SARES20-PROF142-M1_ib1",
"SARES20-PROF142-M1_proc": "SARES20-PROF142-M1_proc1",
"SARES20-PROF146-M1_proc": "SARES20-PROF146-M_proc1",
"SARFE10-PBPS053_proc": "SARFE10-PBPS053_proc1",
"SARFE10-PBPS053_proc": "SARFE10-PBPS053_proc",
"SARFE10-PSSS059_psss": "SARFE10-PSSS059_psss1",
"SARFE10-PSSS059_store": "SARFE10-PSSS059_store1",
"SAROP21-ATT01_proc": "SAROP21-ATT01_proc",
"SAROP11-PBPS117_proc": "SAROP11-PBPS117_proc",
"SAROP11-PBPS122_proc": "SAROP11-PBPS122_proc",
"SAROP21-PBPS133_proc": "SAROP21-PBPS133_proc",
"SAROP21-PBPS138_proc": "SAROP21-PBPS138_proc",
"SAROP21-PPRM138_proc": "SAROP21-PPRM138_proc",
"SATES21-CAMS154-M1_psen_db": "SATES21-CAMS154-M1_psen_db1",
"SATES21-CAMS154-M1_psen_ib": "SATES21-CAMS154-M1_psen_ib1",
"SATES21-PATT-M1_psen_db": "SATES21-PATT-M1_psen_db",
"SATES21-PATT-M1_psen_ib": "SATES21-PATT-M1_psen_ib",
"SATES24-CAMS161-M1_psen_db": "SATES24-CAMS161-M1_psen_db1",
"SATES24-CAMS161-M1_psen_ib": "SATES24-CAMS161-M1_psen_ib1",
"jungfrau_proc": "jungfrau_proc",
+12 -3
View File
@@ -41,13 +41,19 @@
"testdb_ib:9005",
"simulation_2_sp",
"SARFE10-PBPS053_proc:9004",
"SAROP21-ATT01_proc:9003"
"SAROP21-ATT01_proc:9003",
"test_stream:9006",
"SAROP21-PBPS138_proc:9009",
"SAROP11-PBPS117_proc:9007",
"SAROP11-PBPS122_proc:9010",
"SAROP21-PBPS133_proc:9008"
]
},
"http://sf-daqsync-04.psi.ch:8881": {
"cameras": [
"SATES21-CAMS154-M1",
"SATES24-CAMS161-M1"
"SATES24-CAMS161-M1",
"SATES21-PATT-M1"
],
"expanding": false,
"instances": [
@@ -58,7 +64,10 @@
"SATES24-CAMS161-M1_sp",
"SATES24-CAMS161-M1_psen_ib:9010",
"SATES24-CAMS161-M1_psen_db:9011",
"SATES21-CAMS154-GIGE7_sp"
"SATES21-CAMS154-GIGE7_sp",
"SATES21-PATT-M1_psen_db:9003",
"SATES21-PATT-M1_psen_ib:9002",
"SATES21-PATT-M1_sp"
]
},
"http://sf-daqsync-05.psi.ch:8881": {
@@ -1,168 +0,0 @@
import time
from collections import defaultdict, deque
from functools import partial
from logging import getLogger
from threading import Thread
import epics
import numpy as np
from cam_server.utils import create_thread_pvs
_logger = getLogger(__name__)
initialized = False
dif_vals = {
"xpos_odd_m": np.nan,
"xpos_odd_w": np.nan,
"ypos_odd_m": np.nan,
"ypos_odd_w": np.nan,
"xpos_evn_m": np.nan,
"xpos_evn_w": np.nan,
"ypos_evn_m": np.nan,
"ypos_evn_w": np.nan,
}
# this is to avoid exceptions in the 'process' function upon appending to buffers if not all of
# them were created in the 'initialize' function
buffers = defaultdict(partial(deque, maxlen=1))
def initialize(params):
global device, initialized
epics.ca.clear_cache()
for label in ("xpos_all", "ypos_all", "xpos_odd", "ypos_odd", "xpos_evn", "ypos_evn"):
x_pvname = params[f"{label}_x_pvname"]
y_pvname = params[f"{label}_y_pvname"]
m_pvname = params[f"{label}_m_pvname"]
w_pvname = params[f"{label}_w_pvname"]
if x_pvname and y_pvname and m_pvname and w_pvname:
buffer = deque(maxlen=params["queue_length"])
buffers[label] = buffer
thread = Thread(target=update_PVs, args=(label, buffer, x_pvname, y_pvname, m_pvname, w_pvname))
thread.start()
# diff PVs
xpos_dif_m_pvname = params["xpos_dif_m_pvname"]
xpos_dif_w_pvname = params["xpos_dif_w_pvname"]
ypos_dif_m_pvname = params["ypos_dif_m_pvname"]
ypos_dif_w_pvname = params["ypos_dif_w_pvname"]
thread = Thread(target=update_dif_PVs, args=(xpos_dif_m_pvname, xpos_dif_w_pvname, ypos_dif_m_pvname, ypos_dif_w_pvname))
thread.start()
device, _ = params["up"].split(":", 1)
initialized = True
def update_PVs(label, buffer, x_pvname, y_pvname, m_pvname, w_pvname):
x_pv, y_pv, m_pv, w_pv = create_thread_pvs([x_pvname, y_pvname, m_pvname, w_pvname])
x_pv.wait_for_connection()
y_pv.wait_for_connection()
m_pv.wait_for_connection()
w_pv.wait_for_connection()
if not (x_pv.connected and y_pv.connected and m_pv.connected and w_pv.connected):
raise (f"Cannot connect to {label} PVs.")
x_pv.put(np.arange(buffer.maxlen))
y_pv.put(np.zeros(buffer.maxlen))
m_pv.put(0)
w_pv.put(0)
while True:
time.sleep(3)
if len(buffer) != buffer.maxlen:
continue
_buffer = np.array(buffer)
_buffer = _buffer[~np.isnan(_buffer)]
# histogram
y_hist, x_hist = np.histogram(_buffer, bins=50)
x_hist = (x_hist[1:] + x_hist[:-1]) / 2
x_pv.put(x_hist)
y_pv.put(y_hist)
# stats
mean_val = np.mean(_buffer)
std_val = np.std(_buffer)
m_pv.put(mean_val)
w_pv.put(std_val)
dif_vals[f"{label}_m"] = mean_val
dif_vals[f"{label}_w"] = std_val
def update_dif_PVs(xpos_dif_m_pvname, xpos_dif_w_pvname, ypos_dif_m_pvname, ypos_dif_w_pvname):
xpos_dif_m_pv, xpos_dif_w_pv, ypos_dif_m_pv, ypos_dif_w_pv = create_thread_pvs(
[xpos_dif_m_pvname, xpos_dif_w_pvname, ypos_dif_m_pvname, ypos_dif_w_pvname]
)
xpos_dif_m_pv.wait_for_connection()
xpos_dif_w_pv.wait_for_connection()
ypos_dif_m_pv.wait_for_connection()
ypos_dif_w_pvname.wait_for_connection()
if not (xpos_dif_m_pv.connected and xpos_dif_w_pv.connected and ypos_dif_m_pv.connected and ypos_dif_w_pvname.connected):
raise (f"Cannot connect to dif PVs.")
while True:
time.sleep(3)
xpos_dif_m_pv.put(dif_vals["xpos_odd_m"] - dif_vals["xpos_evn_m"])
xpos_dif_w_pv.put(dif_vals["xpos_odd_w"] - dif_vals["xpos_evn_w"])
ypos_dif_m_pv.put(dif_vals["ypos_odd_m"] - dif_vals["ypos_evn_m"])
ypos_dif_w_pv.put(dif_vals["ypos_odd_w"] - dif_vals["ypos_evn_w"])
def process(data, pulse_id, timestamp, params):
# Initialize on first run
if not initialized:
initialize(params)
# Read stream inputs
up = data[params["up"]] * params["up_calib"]
down = data[params["down"]] * params["down_calib"]
right = data[params["right"]] * params["right_calib"]
left = data[params["left"]] * params["left_calib"]
# Calculations
try:
intensity = down + up + left + right
intensity_uJ = intensity * params["uJ_calib"]
except:
intensity = np.nan
intensity_uJ = np.nan
if intensity > params["threshold"]:
xpos = ((right - left) / (right + left)) * params["horiz_calib"]
ypos = ((up - down) / (up + down)) * params["vert_calib"]
else:
xpos = np.nan
ypos = np.nan
# Update buffers
buffers["xpos_all"].append(xpos)
buffers["ypos_all"].append(ypos)
if pulse_id % 2:
buffers["xpos_odd"].append(xpos)
buffers["ypos_odd"].append(ypos)
else:
buffers["xpos_evn"].append(xpos)
buffers["ypos_evn"].append(ypos)
# Set bs outputs
output = {}
output[f"{device}:INTENSITY"] = intensity
output[f"{device}:INTENSITY_UJ"] = intensity_uJ
output[f"{device}:XPOS"] = xpos
output[f"{device}:YPOS"] = ypos
return output
@@ -1,127 +0,0 @@
import time
from collections import defaultdict, deque
from functools import partial
from logging import getLogger
from threading import RLock, Thread
from cam_server.pipeline.data_processing import functions, processor
import epics
import numpy as np
from cam_server.utils import create_thread_pvs
from scipy.fftpack import fft
_logger = getLogger(__name__)
intensity_pv = None
initialized = False
# this is to avoid exceptions in the 'process' function upon appending to buffers if not all of
# them were created in the 'initialize' function
buffers = defaultdict(partial(deque, maxlen=1))
def initialize(params):
global intensity_pv, device, initialized
epics.ca.clear_cache()
[intensity_pv] = create_thread_pvs([params["intensity_pvname"]])
intensity_pv.wait_for_connection()
# If raising this exception then the pipeline won't start
if not intensity_pv.connected:
raise ("Cannot connect to " + params["intensity_pvname"])
for label in ("x_pos_all", "y_pos_all", "x_pos_odd", "y_pos_odd", "x_pos_even", "y_pos_even"):
out_x_pvname = params[f"fft_{label}_X_pvname"]
out_y_pvname = params[f"fft_{label}_Y_pvname"]
if out_x_pvname and out_y_pvname:
buffer = deque(maxlen=params["queue_length"])
buffers[label] = buffer
thread = Thread(target=calculate_fft, args=(buffer, out_x_pvname, out_y_pvname))
thread.start()
device, _ = params["up"].split(":", 1)
initialized = True
# Processing the buffer every second and setting result to EPICS channel
def calculate_fft(buffer, out_x_pvname, out_y_pvname):
_logger.info("Start buffer processing thread")
try:
out_x_pv, out_y_pv = create_thread_pvs([out_x_pvname, out_y_pvname])
out_x_pv.wait_for_connection()
out_y_pv.wait_for_connection()
if not (out_x_pv.connected and out_y_pv.connected):
raise ("Cannot connect to fft PVs.")
out_x_pv.put(np.arange(buffer.maxlen))
out_y_pv.put(np.zeros(buffer.maxlen))
while True:
_buffer = buffer.copy()
if len(_buffer) == _buffer.maxlen:
out_y_pv.put(np.abs(fft(np.array(_buffer))))
time.sleep(1.0)
except Exception as e:
_logger.error("Error on buffer processing thread %s" % (str(e)))
finally:
_logger.info("Exit buffer processing thread")
def process_image(image, pulse_id, timestamp, x_axis, y_axis, params, data):
ret = processor.process_image(image, pulse_id, timestamp, x_axis, y_axis, params, data)
intensity = float(ret ["intensity"] )
# Initialize on first run
if not initialized:
initialize(params)
# Read stream inputs
up = data[params["up"]] * params["up_calib"]
down = data[params["down"]] * params["down_calib"]
right = data[params["right"]] * params["right_calib"]
left = data[params["left"]] * params["left_calib"]
# Calculations
try:
intensity = down + up + left + right
intensity_uJ = intensity * params["uJ_calib"]
except:
intensity = float("nan")
intensity_uJ = float("nan")
if intensity > params["threshold"]:
x_pos = ((right - left) / (right + left)) * params["horiz_calib"]
y_pos = ((up - down) / (up + down)) * params["vert_calib"]
else:
x_pos = float("nan")
y_pos = float("nan")
# Update buffers
buffers["x_pos_all"].append(x_pos)
buffers["y_pos_all"].append(y_pos)
if pulse_id % 2:
buffers["x_pos_odd"].append(x_pos)
buffers["y_pos_odd"].append(y_pos)
else:
buffers["x_pos_even"].append(x_pos)
buffers["y_pos_even"].append(y_pos)
# Update intensity EPICS channel
intensity_pv.put(intensity)
# Set bs outputs
output = {}
output[f"{device}:intensity"] = intensity
output[f"{device}:intensity_uJ"] = intensity_uJ
output[f"{device}:x_pos"] = x_pos
output[f"{device}:y_pos"] = y_pos
return output
@@ -13,7 +13,8 @@ def process_image(image, pulse_id, timestamp, x_axis, y_axis, parameters, image_
processing_parameters = {
"roi_signal": roi_signal,
"roi_background": roi_background,
"project_axis": project_axis
"project_axis": project_axis,
# "input_params": len(parameters.get("background_data", [123]))
}
processing_parameters = json.dumps(processing_parameters)
@@ -27,6 +28,8 @@ def process_image(image, pulse_id, timestamp, x_axis, y_axis, parameters, image_
projection_background = get_roi_projection(image, roi_background, project_axis)
res[camera_name + ".projection_background"] = projection_background
# res["TEST-SPEC"] = 123 #list(parameters)
return res