131 lines
5.5 KiB
Python
131 lines
5.5 KiB
Python
import sys
|
|
import os
|
|
from cam_server.pipeline.data_processing import functions, processor
|
|
from collections import OrderedDict
|
|
from cam_server.pipeline.data_processing import functions
|
|
from cam_server.utils import create_thread_pvs, epics_lock
|
|
from logging import getLogger
|
|
import math
|
|
|
|
_logger = getLogger(__name__)
|
|
|
|
throw_epics_errors = True
|
|
|
|
mean_x_pv, mean_y_pv, sig_x_pv, sig_y_pv = None, None, None, None
|
|
mean_x_name, mean_y_name, sig_x_name, sig_y_name = None, None, None, None
|
|
ampl_x_pv, ampl_y_pv, integ_x_pv, integ_y_pv = None, None, None, None
|
|
ampl_x_name, ampl_y_name, integ_x_name, integ_y_name = None, None, None, None
|
|
sent_pid = -1
|
|
PSF = 3.4# 3.4um updated 11/11/25 at 11:16hrs
|
|
|
|
initialized = False
|
|
|
|
|
|
def initialize(parameters):
|
|
global initialized
|
|
global mean_x_name, mean_y_name, sig_x_name, sig_y_name, ampl_x_name, ampl_y_name, integ_x_name, integ_y_name
|
|
prefix = parameters["camera_name"]
|
|
mean_x_name = prefix + ":POS-X"
|
|
mean_y_name = prefix + ":POS-Y"
|
|
sig_x_name = prefix + ":SIG-X"
|
|
sig_y_name = prefix + ":SIG-Y"
|
|
ampl_x_name = prefix + ":AMPL-X"
|
|
ampl_y_name = prefix + ":AMPL-Y"
|
|
integ_x_name = prefix + ":INTEG-X"
|
|
integ_y_name = prefix + ":INTEG-Y"
|
|
initialized = True
|
|
|
|
def hypot_diff(a, b):
|
|
try:
|
|
return math.sqrt(a**2 - b**2)
|
|
except:
|
|
return 0.0
|
|
|
|
def process_image(image, pulse_id, timestamp, x_axis, y_axis, parameters, bsdata):
|
|
global initialized, sent_pid
|
|
global mean_x_pv, mean_y_pv, sig_x_pv, sig_y_pv, ampl_x_pv, ampl_y_pv, integ_x_pv, integ_y_pv
|
|
global mean_x_name, mean_y_name, sig_x_name, sig_y_name, ampl_x_name, ampl_y_name, integ_x_name, integ_y_name
|
|
prefix = parameters["camera_name"]
|
|
single_optics = parameters.get("single_optics", False)
|
|
if not initialized:
|
|
initialize(parameters)
|
|
initialized = True
|
|
r = processor.process_image(image, pulse_id, timestamp, x_axis, y_axis, parameters, bsdata)
|
|
ret = OrderedDict()
|
|
|
|
x_fit_integ = r["gr_x_fit_amplitude"] * r["gr_x_fit_standard_deviation"] * math.sqrt(2 * math.pi)
|
|
y_fit_integ = r["gr_y_fit_amplitude"] * r["gr_y_fit_standard_deviation"] * math.sqrt(2 * math.pi)
|
|
|
|
ret[prefix + ":intensity"] = r["intensity"]
|
|
ret[prefix + ":x_fit_mean"] = r["x_fit_mean"]
|
|
ret[prefix + ":y_fit_mean"] = r["y_fit_mean"]
|
|
|
|
if single_optics:
|
|
ret[prefix + ":x_fit_standard_deviation"] = hypot_diff(r["x_fit_standard_deviation"], PSF)
|
|
else:
|
|
ret[prefix + ":x_fit_standard_deviation"] = r["x_fit_standard_deviation"]
|
|
if single_optics:
|
|
ret[prefix + ":y_fit_standard_deviation"] = hypot_diff(r["y_fit_standard_deviation"], PSF)
|
|
else:
|
|
ret[prefix + ":y_fit_standard_deviation"] = r["y_fit_standard_deviation"]
|
|
|
|
ret[prefix + ":x_center_of_mass"] = r["x_center_of_mass"]
|
|
ret[prefix + ":y_center_of_mass"] = r["y_center_of_mass"]
|
|
ret[prefix + ":x_rms"] = r["x_rms"]
|
|
ret[prefix + ":y_rms"] = r["y_rms"]
|
|
ret[prefix + ":x_fwhm"] = r["x_fwhm"]
|
|
ret[prefix + ":y_fwhm"] = r["y_fwhm"]
|
|
ret[prefix + ":x_fit_amplitude"] = r["x_fit_amplitude"]
|
|
ret[prefix + ":y_fit_amplitude"] = r["y_fit_amplitude"]
|
|
ret[prefix + ":x_fit_integ"] = x_fit_integ
|
|
ret[prefix + ":y_fit_integ"] = y_fit_integ
|
|
ret[prefix + ":gr_x_fit_mean"] = r["gr_x_fit_mean"]
|
|
ret[prefix + ":gr_y_fit_mean"] = r["gr_y_fit_mean"]
|
|
if single_optics:
|
|
ret[prefix + ":gr_x_fit_standard_deviation"] = hypot_diff(r["gr_x_fit_standard_deviation"], PSF)
|
|
else:
|
|
ret[prefix + ":gr_x_fit_standard_deviation"] = r["gr_x_fit_standard_deviation"]
|
|
if single_optics:
|
|
ret[prefix + ":gr_y_fit_standard_deviation"] = hypot_diff(r["gr_y_fit_standard_deviation"], PSF)
|
|
else:
|
|
ret[prefix + ":gr_y_fit_standard_deviation"] = r["gr_y_fit_standard_deviation"]
|
|
|
|
mean_x_pv, mean_y_pv, sig_x_pv, sig_y_pv, ampl_x_pv, ampl_y_pv, integ_x_pv, integ_y_pv = create_thread_pvs(
|
|
[mean_x_name, mean_y_name, sig_x_name, sig_y_name, ampl_x_name, ampl_y_name, integ_x_name, integ_y_name])
|
|
epics_error = None
|
|
|
|
if pulse_id > sent_pid:
|
|
sent_pid = pulse_id
|
|
if epics_lock.acquire(False):
|
|
try:
|
|
for (pv, value) in [(mean_x_pv, r["gr_x_fit_mean"]), \
|
|
(mean_y_pv, r["gr_y_fit_mean"]), \
|
|
(sig_x_pv, ret[prefix + ":gr_x_fit_standard_deviation"]), \
|
|
(sig_y_pv, ret[prefix + ":gr_y_fit_standard_deviation"]), \
|
|
(ampl_x_pv, r["gr_x_fit_amplitude"]), \
|
|
(ampl_y_pv, r["gr_y_fit_amplitude"]), \
|
|
(integ_x_pv, x_fit_integ), \
|
|
(integ_y_pv, y_fit_integ) \
|
|
]:
|
|
if pv and pv.connected:
|
|
pv.put(value)
|
|
else:
|
|
_logger.warning("PV not connected: %s" % (str(pv),))
|
|
# epics_error = "PV not connected: %s" % (str(pv),)
|
|
except Exception as e:
|
|
epics_error = "Error writing PVs: %s" % (str(e),)
|
|
finally:
|
|
epics_lock.release()
|
|
else:
|
|
_logger.warning("Cannot aquire EPICS lock")
|
|
|
|
if epics_error:
|
|
_logger.warning(epics_error)
|
|
if throw_epics_errors:
|
|
raise Exception(epics_error)
|
|
|
|
return ret
|
|
else:
|
|
_logger.warning("Invalid PID: %s last:%s" % (str(pulse_id), str(sent_pid),))
|
|
sent_pid = 0 # It should be single threaded, assumes the camera instance restarted
|