91 lines
2.5 KiB
Python
91 lines
2.5 KiB
Python
import json
|
|
from logging import getLogger
|
|
from cam_server.pipeline.data_processing import functions
|
|
from collections import deque
|
|
|
|
_logger = getLogger(__name__)
|
|
|
|
Nbg=10
|
|
bg = deque([],Nbg)
|
|
|
|
#pattern = [1, 1, 1, 1, 0]
|
|
pix_min = 750
|
|
pix_max = 1750
|
|
|
|
x_profile_BG = []
|
|
|
|
|
|
|
|
def _interpolate_row(y_known, x_known, x_interp):
|
|
y_interp = np.interp(x_interp, x_known, y_known)
|
|
return y_interp
|
|
|
|
|
|
|
|
def find_edge(data, step_length=100, edge_type="rising", refinement=1):
|
|
# refine data
|
|
data_length = data.shape[0]
|
|
refined_data = np.apply_along_axis(
|
|
_interpolate_row,
|
|
axis=0,
|
|
arr=data,
|
|
x_known=np.arange(data_length),
|
|
x_interp=np.arange(0, data_length - 1, refinement),
|
|
)
|
|
|
|
# prepare a step function and refine it
|
|
step_waveform = np.ones(shape=(step_length,))
|
|
if edge_type == "rising":
|
|
step_waveform[: int(step_length / 2)] = -1
|
|
elif edge_type == "falling":
|
|
step_waveform[int(step_length / 2) :] = -1
|
|
|
|
step_waveform = np.interp(
|
|
x=np.arange(0, step_length - 1, refinement), xp=np.arange(step_length), fp=step_waveform
|
|
)
|
|
|
|
# find edges
|
|
xcorr = np.apply_along_axis(np.correlate, 0, refined_data, v=step_waveform, mode="valid")
|
|
edge_position = np.argmax(xcorr, axis=0).astype(float) * refinement
|
|
xcorr_amplitude = np.amax(xcorr, axis=0)
|
|
|
|
# correct edge_position for step_length
|
|
edge_position += np.floor(step_length / 2)
|
|
|
|
return {"edge_pos": edge_position, "xcorr": xcorr, "xcorr_ampl": xcorr_amplitude, "signal":data}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def process_image(image, pulse_id, timestamp, x_axis, y_axis, parameters, bsdata=None):
|
|
# Add return values
|
|
return_value = dict()
|
|
prefix = parameters["camera_name"]+":"
|
|
#(min_value, max_value) = functions.get_min_max(image)
|
|
(x_profile, y_profile) = functions.get_x_y_profile(image)
|
|
# Could be also y_profile.sum() -> it should give the same result.
|
|
# Add return values
|
|
intensity = x_profile.sum()
|
|
|
|
|
|
|
|
sig = x_profile / x_profile_BG -1
|
|
edge_pos= find_edge(sig[ pix_min : pix_max ])["edge_pos"] + pix_min
|
|
xcorr= find_edge(sig[ pix_min : pix_max ])["xcorr"]
|
|
|
|
#return_value[prefix+"min_value"] = min_value
|
|
#return_value[prefix+"max_value"] = max_value
|
|
return_value[prefix+"x_profile"] = x_profile
|
|
return_value[prefix+"y_profile"] = y_profile
|
|
return_value[prefix+"intensity"] = intensity
|
|
return_value[prefix+"sig"] = sig
|
|
return_value[prefix+"edge_pos"] = edge_pos
|
|
return_value[prefix+"xcorr"] = xcorr
|
|
|
|
return return_value
|