71 lines
2.8 KiB
Python
71 lines
2.8 KiB
Python
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
|
|
|
|
_logger = getLogger(__name__)
|
|
|
|
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
|
|
sent_pid = -1
|
|
|
|
initialized = False
|
|
def initialize(parameters):
|
|
global initialized
|
|
global mean_x_name, mean_y_name, sig_x_name, sig_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"
|
|
initialized = True
|
|
|
|
|
|
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
|
|
global mean_x_name, mean_y_name, sig_x_name, sig_y_name
|
|
|
|
if not initialized:
|
|
initialize(parameters)
|
|
initialized = True
|
|
|
|
ret = OrderedDict()
|
|
prefix = parameters["camera_name"]
|
|
(x_profile, y_profile) = functions.get_x_y_profile(image)
|
|
x_fit_gauss_function, x_fit_offset, x_fit_amplitude, x_fit_mean, x_fit_standard_deviation, x_center_of_mass, x_rms = functions.gauss_fit(x_profile, x_axis)
|
|
y_fit_gauss_function, y_fit_offset, y_fit_amplitude, y_fit_mean, y_fit_standard_deviation, y_center_of_mass, y_rms = functions.gauss_fit(y_profile, y_axis)
|
|
x_fwhm = functions.get_fw(x_axis,x_profile)
|
|
y_fwhm = functions.get_fw(y_axis,y_profile)
|
|
intensity = x_profile.sum()
|
|
ret[prefix+":intensity"] = intensity
|
|
ret[prefix+":x_fit_mean"] = x_fit_mean
|
|
ret[prefix+":y_fit_mean"] = y_fit_mean
|
|
ret[prefix+":x_fit_standard_deviation"] = x_fit_standard_deviation
|
|
ret[prefix+":y_fit_standard_deviation"] = y_fit_standard_deviation
|
|
ret[prefix+":x_center_of_mass"] = x_center_of_mass
|
|
ret[prefix+":y_center_of_mass"] = y_center_of_mass
|
|
ret[prefix+":x_rms"] = x_rms
|
|
ret[prefix+":y_rms"] = y_rms
|
|
ret[prefix+":x_fwhm"] = x_fwhm
|
|
ret[prefix+":y_fwhm"] = y_fwhm
|
|
|
|
mean_x_pv, mean_y_pv, sig_x_pv, sig_y_pv = create_thread_pvs([mean_x_name, mean_y_name, sig_x_name, sig_y_name])
|
|
|
|
if epics_lock.acquire(False):
|
|
try:
|
|
if pulse_id > sent_pid:
|
|
sent_pid = pulse_id
|
|
for (pv, value) in [ (mean_x_pv, x_fit_mean), \
|
|
(mean_y_pv, y_fit_mean), \
|
|
(sig_x_pv, x_fit_standard_deviation), \
|
|
(sig_y_pv, y_fit_standard_deviation) \
|
|
]:
|
|
|
|
if pv and pv.connected:
|
|
pv.put(value)
|
|
finally:
|
|
epics_lock.release()
|
|
|
|
return ret
|