diff --git a/AWAControl/badger/environments/awa/__init__.py b/AWAControl/badger/environments/awa/__init__.py index bc17a689d5291ac678e5d234fa4f5053db52d2be..2baaa6459d021820d1819f5107e2edad4b706154 100644 --- a/AWAControl/badger/environments/awa/__init__.py +++ b/AWAControl/badger/environments/awa/__init__.py @@ -24,10 +24,12 @@ class Environment(environment.Environment): "Sy", "Cx", "Cy", + "correlation", "total_size", "bb_penalty", "log10_total_intensity", - "K1_phase_readback" + "K1_phase_readback", + "ICT1" ] screen_name: str = None image_diagnostic: Any = None @@ -50,6 +52,8 @@ class Environment(environment.Environment): results = {} if "K1_phase_readback" in observable_names: results["K1_phase_readback"] = caget("AWALLRF:K1:Phase") + if "ICT1" in observable_names: + results["ICT1"] = caget("AWAVXI11ICT:Ch1") metadata = self.setpoints or {} metadata = metadata | results diff --git a/AWAControl/configs/awa_camera_config.yml b/AWAControl/configs/awa_camera_config.yml index 55da523598ed277a209eb7f6ca3cae79cd707e4b..3144ff2f9f2c93f24f3a6ea2e5f0a10147aa26b5 100644 --- a/AWAControl/configs/awa_camera_config.yml +++ b/AWAControl/configs/awa_camera_config.yml @@ -36,12 +36,12 @@ DYG5: radius: 206.9578032921999 video_number: 5 DYG7: - type: blackfly + type: radhard center: - - 605 - - 548 - radius: 350 - ip_address: 192.168.2.106 + - 618 + - 558 + radius: 500 + serial_number: "138" gain: 1.0 DYG14: type: blackfly @@ -90,10 +90,10 @@ EYG3: DYG6: type: frame_grabber center: - - 348.9857434881227 - - 237.18732942820998 + - 398.9857434881227 + - 337.18732942820998 radius: 196.96246822924843 - video_number: 36 + video_number: 6 Slit_YAG: type: frame_grabber center: diff --git a/AWAControl/diagnostics/screen.py b/AWAControl/diagnostics/screen.py index 88e5f313d28fd40dea6b9ffcbbb8141c2e80fb5f..56c5490e29c039fc0e3411f3adc12424d5279e84 100644 --- a/AWAControl/diagnostics/screen.py +++ b/AWAControl/diagnostics/screen.py @@ -2,6 +2,7 @@ import json import os.path import sys import time +import scipy as sp from copy import copy from pprint import pprint from time import sleep @@ -51,6 +52,15 @@ def load_screen(camera_name: str): roi=roi, gain=camera_config["gain"], # 1.0 for 5 nC 5.0 for 1 nC, ) + elif camera_type == "radhard": + image_diagnostic = AWARadHardDiagnostic( + screen_name=camera_name, + serial_number=camera_config["serial_number"], + alias=camera_name, + resolution_suffix=None, + roi=roi, + gain=camera_config["gain"], # 1.0 for 5 nC 5.0 for 1 nC, + ) else: raise RuntimeError(f"cannot load camera type {type}") @@ -173,6 +183,7 @@ class AWAImageDiagnostic(BaseModel): if result["Sx"] is not None: result["Sx"] = result["Sx"] * self.resolution result["Sy"] = result["Sy"] * self.resolution + result["correlation"] = result["correlation"] * self.resolution**2 else: result = {} @@ -344,6 +355,7 @@ class AWAImageDiagnostic(BaseModel): "Cy": np.NaN, "Sx": np.NaN, "Sy": np.NaN, + "correlation": np.NaN, "bb_penalty": np.NaN, "total_intensity": 10**log10_total_intensity, "log10_total_intensity": log10_total_intensity, @@ -355,6 +367,7 @@ class AWAImageDiagnostic(BaseModel): fits = self.fit_image(img) centroid = fits["centroid"] sizes = fits["rms_sizes"] + correlation = fits["correlation"] # do analysis if fits return all good values if np.all(~np.isnan(np.stack((centroid, sizes)))): @@ -407,6 +420,7 @@ class AWAImageDiagnostic(BaseModel): "Cy": centroid[1], "Sx": sizes[0], "Sy": sizes[1], + "correlation": correlation, "bb_penalty": bb_penalty, "total_intensity": fits["total_intensity"], "log10_total_intensity": log10_total_intensity, @@ -424,6 +438,7 @@ class AWAImageDiagnostic(BaseModel): "Cy": np.NaN, "Sx": np.NaN, "Sy": np.NaN, + "correlation": np.NaN, "bb_penalty": np.NaN, "total_intensity": fits["total_intensity"], "log10_total_intensity": log10_total_intensity, @@ -435,23 +450,52 @@ class AWAImageDiagnostic(BaseModel): return result def fit_image(self, img): - x_projection = np.sum(img, axis=0) - y_projection = np.sum(img, axis=1) - + x_projection = np.sum(img, axis=0) + y_projection = np.sum(img, axis=1) + + # subtract min value from projections - x_projection = x_projection - x_projection[:10].min() - y_projection = y_projection - y_projection[:10].min() - + x_projection = x_projection - x_projection[:10].min() + y_projection = y_projection - y_projection[:10].min() + + para_x = fit_gaussian_linear_background( x_projection, visualize=self.visualize, n_restarts=self.n_fitting_restarts ) - para_y = fit_gaussian_linear_background( + para_y = fit_gaussian_linear_background( y_projection, visualize=self.visualize, n_restarts=self.n_fitting_restarts ) + + dim1,dim2=np.shape(img) + img45=sp.ndimage.interpolation.rotate(img,45,reshape=False,order=1) + if dim1==dim2: + img45_cropped=img45[int(dim1*(2-np.sqrt(2))/4):int(dim1*(2+np.sqrt(2))/4),int(dim2*(2-np.sqrt(2))/4):int(dim2*(2+np.sqrt(2))/4)] + elif dim1<dim2: + img45_cropped=img45[int(dim1*(2-np.sqrt(2))/4):int(dim1*(2+np.sqrt(2))/4),int(dim1*(2-np.sqrt(2))/4):int(dim1*(2+np.sqrt(2))/4)] + else: + img45_cropped=img45[int(dim2*(2-np.sqrt(2))/4):int(dim2*(2+np.sqrt(2))/4),int(dim2*(2-np.sqrt(2))/4):int(dim2*(2+np.sqrt(2))/4)] + + + + + x_projection45 = np.sum(img45_cropped, axis=0) + y_projection45 = np.sum(img45_cropped, axis=1) + x_projection45 = x_projection45 - x_projection45[:10].min() + y_projection45 = y_projection45 - y_projection45[:10].min() + + para_x45 = fit_gaussian_linear_background( + x_projection45, visualize=self.visualize, n_restarts=self.n_fitting_restarts + ) + para_y45 = fit_gaussian_linear_background( + y_projection45, visualize=self.visualize, n_restarts=self.n_fitting_restarts + ) + + para_xy=(para_x45[2]**2-para_y45[2]**2)/2 return { "centroid": np.array((para_x[1], para_y[1])), "rms_sizes": np.array((para_x[2], para_y[2])), + "correlation": para_xy, "total_intensity": img.sum(), "log10_total_intensity": np.log10(img.sum()), } @@ -538,6 +582,60 @@ class AWABlackflyDiagnostic(AWAImageDiagnostic): img = img.reshape(ny, nx) return img, extra_data + +class AWARadHardDiagnostic(AWAImageDiagnostic): + serial_number: str + gain: PositiveFloat = 1.0 + + @property + def pv_names(self) -> list: + suffixes = [ + self.array_data_suffix, + self.array_n_cols_suffix, + self.array_n_rows_suffix, + ] + if self.resolution_suffix is not None: + suffixes += [self.resolution_suffix] + + return [f"SI-138:{ele}" for ele in suffixes] + + def set_camera(self): + print(f"setting camera {self.alias}") + caput("SI-138:cam1:Acquire", 0) + time.sleep(2) + + print(str(caget("SI-138:cam1:GC_SetCameraName"))) + current_ip = str(caget("SI-138:cam1:GC_SetCameraName")) + + print(f"starting acquisition") + caput("SI-138:cam1:Acquire", 1) + + def get_raw_data(self) -> (np.ndarray, dict): + if self.testing: + img = np.zeros((2000, 2000)) + img[800:-800, 900:-900] = 1 + self.resolution = 1.0 + extra_data = { + "ICT1": np.random.randn() * 0.1 + 1.0, + "ICT2": np.random.randn() * 0.1 + 1.0, + } + else: + # get pvs + results = caget_many(self.pv_names) + if results[0] is None: + raise RuntimeError( + "epics returned no image values, make sure blackfly phobeus is active" + ) + results[0] = np.uint16(results[0]) + + e_pvs = copy(self.extra_pvs) + if self.target_charge_pv is not None: + e_pvs += [self.target_charge_pv] + extra_data = dict(zip(e_pvs, caget_many(e_pvs))) + img, nx, ny = results[0], results[1], results[2] + img = img.reshape(ny, nx) + + return img, extra_data class AWAFrameGrabberDiagnostic(AWAImageDiagnostic):