diff --git a/virtaccl/PyORBIT_Model/pyorbit_va_nodes.py b/virtaccl/PyORBIT_Model/pyorbit_va_nodes.py index b5051a9..8f33b87 100644 --- a/virtaccl/PyORBIT_Model/pyorbit_va_nodes.py +++ b/virtaccl/PyORBIT_Model/pyorbit_va_nodes.py @@ -146,11 +146,11 @@ def getYAvg(self): # Class for wire scanners. This class simply returns histograms of the vertical and horizontal positions. class WSclass(BaseLinacNode): node_type = "WireScanner" - parameter_list = ['x_histogram', 'y_histogram', 'x_avg', 'y_avg'] + parameter_list = ['x_histogram', 'y_histogram', 'x_avg', 'y_avg', 'x_sigma', 'y_sigma'] def __init__(self, node_name: str, bin_number: int = 50): parameters = {'x_histogram': np.array([[-10, 0], [10, 0]]), 'y_histogram': np.array([[-10, 0], [10, 0]]), - 'x_avg': 0.0, 'y_avg': 0.0} + 'x_avg': 0.0, 'y_avg': 0.0, 'x_sigma': 0.0, 'y_sigma': 0.0} BaseLinacNode.__init__(self, node_name) for key, value in parameters.items(): self.addParam(key, value) @@ -193,16 +193,23 @@ def track(self, paramsDict): x_avg /= part_num y_avg /= part_num + x_sigma = np.std(x_array, ddof=0) + y_sigma = np.std(y_array, ddof=0) + self.setParam('x_histogram', x_out) self.setParam('y_histogram', y_out) self.setParam('x_avg', x_avg) self.setParam('y_avg', y_avg) + self.setParam('x_sigma', x_sigma) + self.setParam('y_sigma', y_sigma) else: self.setParam('x_histogram', np.array([[-10, 0], [10, 0]])) self.setParam('y_histogram', np.array([[-10, 0], [10, 0]])) self.setParam('x_avg', 0) self.setParam('y_avg', 0) + self.setParam('x_sigma', 0) + self.setParam('y_sigma', 0) def getXHistogram(self): return self.getParam('x_histogram') diff --git a/virtaccl/site/SNS_Linac/virtual_devices.py b/virtaccl/site/SNS_Linac/virtual_devices.py index b10206b..ee9c307 100644 --- a/virtaccl/site/SNS_Linac/virtual_devices.py +++ b/virtaccl/site/SNS_Linac/virtual_devices.py @@ -297,12 +297,16 @@ class WireScanner(Device): speed_pv = 'Speed_Set' # [mm/s] x_avg_pv = 'Hor_Mean_gs' # [mm] y_avg_pv = 'Ver_Mean_gs' # [mm] + x_sigma_pv = 'Hor_Sigma_gs' + y_sigma_pv = 'Ver_Sigma_gs' # PyORBIT parameter keys x_hist_key = 'x_histogram' # [arb. units] y_hist_key = 'y_histogram' # [arb. units] x_avg_key = 'x_avg' # [m] y_avg_key = 'y_avg' # [m] + x_sigma_key = 'x_sigma' + y_sigma_key = 'y_sigma' # Device keys position_key = 'wire_position' # [m] @@ -344,6 +348,8 @@ def __init__(self, name: str, model_name: str = None, initial_dict: Dict[str, An self.register_measurement(WireScanner.y_charge_pv, noise=xy_noise) self.register_measurement(WireScanner.x_avg_pv, noise=xy_noise, transform=self.milli_units) self.register_measurement(WireScanner.y_avg_pv, noise=xy_noise, transform=self.milli_units) + self.register_measurement(WireScanner.x_sigma_pv, transform=self.milli_units) + self.register_measurement(WireScanner.y_sigma_pv, transform=self.milli_units) self.register_setting(WireScanner.speed_pv, default=initial_speed, transform=self.milli_units) self.register_setting(WireScanner.position_pv, default=initial_position, transform=self.milli_units) @@ -401,6 +407,8 @@ def update_measurements(self, new_params: Dict[str, Dict[str, Any]] = None): self.update_measurement(WireScanner.x_avg_pv, ws_params[WireScanner.x_avg_key]) self.update_measurement(WireScanner.y_avg_pv, ws_params[WireScanner.y_avg_key]) + self.update_measurement(WireScanner.x_sigma_pv, ws_params[WireScanner.x_sigma_key]) + self.update_measurement(WireScanner.y_sigma_pv, ws_params[WireScanner.y_sigma_key]) class Screen(Device):