From b914294808fbff284217ed1d1d4e48d2d6dd95a0 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Thu, 16 May 2024 12:19:50 -0400 Subject: [PATCH 01/46] Adding autocenter_lucid adding autocenter_lucid.py and hopefully showing the autocenter button on the gui --- autocenter_lucid.py | 241 ++++++++++++++++++++++++++++++++++++++++++++ gui/control_main.py | 10 +- 2 files changed, 249 insertions(+), 2 deletions(-) create mode 100644 autocenter_lucid.py diff --git a/autocenter_lucid.py b/autocenter_lucid.py new file mode 100644 index 00000000..d5528c3c --- /dev/null +++ b/autocenter_lucid.py @@ -0,0 +1,241 @@ +import sys + +sys.path.append('/nsls2/data/nyx/legacy/Rudra/wxImageViewer/lucid3/lucid3') + + +#from lucid_core import find_loop +import logging +import urllib.request +from io import BytesIO +from PIL import Image +import numpy +import subprocess +import time + + +class AutoCollect(): + def __init__(self, md2): + self.md2 = md2 + self.is_collected = False + self.image_url = 'http://10.67.147.26:3908/video_feed2' + self.delay = 1000 + self.image = self.getImageFromURL() + self.imageSize = (640,512) + #self.key = 'bzoom:RAW' + #self.redis_client = redis.Redis(host='10.67.146.131', port=6379, db=0) + self.lucid_subprocess_call = ['/nsls2/data/nyx/legacy/Rudra/wxImageViewer/lucid_environment/bin/lucid3', 'CurrentSample.jpg'] + self.raster_box_subprocess_call =['curl', '-X', 'POST', '-F', 'file=@./CurrentSample.jpg', 'http://127.0.0.1:8000/predict'] + self.immediate_comm_pv = PV(daq_utils.beamlineComm + "immediate_command_s") + + + + + + + #DEFINING FUNCTIONS FOR CORRECTED CLICK TO CENTER + def getMD2ImageXRatio(self): + md2_img_width = daq_utils.highMagPixX + lsdc_img_width = daq_utils.screenPixX + return float(md2_img_width) / float(lsdc_img_width) + + def getMD2ImageYRatio(self): + md2_img_height = daq_utils.highMagPixY + lsdc_img_height = daq_utils.screenPixY + return float(md2_img_height) / float(lsdc_img_height) + + + def getMD2BeamCenterX(self): + return self.md2.center_pixel_x.get() / self.getMD2ImageXRatio() + + + def getMD2BeamCenterY(self): + return self.md2.center_pixel_y.get() / self.getMD2ImageYRatio() + + def getImageFromURL(self): + image_file = BytesIO(urllib.request.urlopen(self.image_url, timeout=self.delay/1000).read()) + sample_image = Image.open(image_file) + numpy_image = numpy.asarray(sample_image) + return numpy_image + + + def find_center_point(self): + self.image=self.getImageFromURL() + Image.fromarray(self.image).save('CurrentSample.jpg') + result = subprocess.run(self.lucid_subprocess_call, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if result.stderr.decode() != '': + print("ERROR:\n{}".format(result.stderr.decode())) + return (0,0) + val = result.stdout.decode().split('(', 1)[1].split(')')[0].split(',') + coord_guess = (int(val[1]), int(val[2])) + return coord_guess + + + + def center_on_point(self, x_click, y_click): + #this is only for lowest magnification (ie zoom level 1) should probably set to zoom level 1 when running auto center anyway + + fov = {"x":0, "y":0} + fov["x"] = daq_utils.lowMagFOVx + fov["y"] = daq_utils.lowMagFOVy + current_viewangle = daq_utils.mag1ViewAngle + + #done initializing zoom1 variables + + + correctedC2C_x = self.getMD2BeamCenterX() + (x_click - self.getMD2BeamCenterX() - 20) + correctedC2C_y = self.getMD2BeamCenterY() + (y_click - self.getMD2BeamCenterY() - 40) + #still using old python string expressions should convert to ''.format() + comm_s = f'center_on_click({correctedC2C_x},{correctedC2C_y},{fov["x"]},{fov["y"]},source="screen",maglevel=0,viewangle={current_viewangle})' + self.immediate_comm_pv.put(comm_s) + + + + + + def start_md2_centering(self): + self.md2.exporter.cmd("startManualSampleCentring", "") + logger.info('starting three click centering') + + + def convert_predicted_points_to_three_click(self, x_click, y_click): + correctedC2C_x = x_click + 5 + ((daq_utils.screenPixX/2) - self.getMD2BeamCenterX()) + correctedC2C_y = y_click - 35 + ((daq_utils.screenPixY/2) - self.getMD2BeamCenterY()) + lsdc_x = daq_utils.screenPixX + lsdc_y = daq_utils.screenPixY + md2_x = self.md2.center_pixel_x.get() * 2 + md2_y = self.md2.center_pixel_y.get() * 2 + scale_x = md2_x / lsdc_x + scale_y = md2_y / lsdc_y + correctedC2C_x = correctedC2C_x * scale_x + correctedC2C_y = correctedC2C_y * scale_y + return correctedC2C_x, correctedC2C_y + + + def send_three_click_point(self, x_click, y_click): + final_x, final_y = self.convert_predicted_points_to_three_click(x_click, y_click) + self.md2.centring_click.put("{} {}".format(final_x, final_y)) + + + def sendLucidToMD2ThreeClick(self): + coords = self.find_center_point() + logger.info('sending point to 3 click center ({}, {})'.format(coords[0], coords[1])) + self.send_three_click_point(coords[0], coords[1]) + + def sendLucidToC2C(self): + coords = self.find_center_point() + self.center_on_point(coords[0], coords[1]) + + + + def auto3click_center(self): + #check md2 status to see if its ready for three click centering + if self.md2.is_ready() == False: + logger.warning('MD2 Is not ready') + return False + #send start md2 centering + self.start_md2_centering() + #sanity check to see if it started manual centering + value_checker = self.md2.task_info.value + if value_checker[0] != 'Manual Centring' and value_checker[3] != 'null': + logger.warning('already finished the manual centering?') + while self.md2.is_ready() == False: + state = self.md2.exporter.read('OmegaState') + if state != 'Ready': + logger.info('waiting for motor rotation') + #logger.warning('wait a little') + time.sleep(0.5) + else: + self.sendLucidToMD2ThreeClick() + return True + + def check_if_centered(self): + coords = self.find_center_point() + final_x, final_y = coords[0], coords[1] + #final_x, final_y = self.convert_predicted_points_to_three_click(x_click, y_click) + beam_y = self.getMD2BeamCenterY() + beam_x = self.getMD2BeamCenterX() + #logger.warning('beamx = {} |||| final_x = {}\n beamy = {} |||| final_y = {}'.format(beam_x,final_x,beam_y,final_y)) + x_checker = (beam_x + 30 > final_x) and (beam_x - 30 < final_x) + y_checker = (beam_y + 30 > final_y) and (beam_y - 30 < final_y) + logger.warning('xchecker : {}, \nychecker : {}'.format(x_checker,y_checker)) + if x_checker and y_checker: + return True + else: + return False + + + def getRasterBox(self): + self.image=self.getImageFromURL() + Image.fromarray(self.image).save('CurrentSample.jpg') + result = subprocess.run(self.raster_box_subprocess_call, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if 'Connection refused' in result.stderr.decode(): + logger.warning(result.stderr.decode()) + return None + result_dict = eval(result.stdout.decode()) + box = result_dict['pred_boxes'][0]['box'] + #returns box as x1,y1,x2,y2 + bottom_left = (box[0],box[1]) + top_right = (box[2], box[3]) + return bottom_left, top_right + + def center_until_centered(self): + is_centered = False + is_centered = self.check_if_centered() + sanity_check = 0 + while(is_centered != True): + self.auto3click_center() + is_centered = self.check_if_centered() + sanity_check = sanity_check + 1 + if sanity_check > 7: + is_centered = True + logger.warning('\n\n\n Could not Center (Function is centered is not returning true)\n\n') + logger.info('took {} times to auto center'.format(sanity_check)) + + + + + + + + + + + + + +#THE check to see if it works +#md2 = MD2Device("XF:19IDC-ES{MD2}:", name="md2") +#auto_collecter = AutoCollect(md2) +#print(auto_collecter.find_center_point()) +#daq_utils.init_environment() + +''' + +def make(): + md2 = MD2Device("XF:19IDC-ES{MD2}:", name="md2") + auto_collector = AutoCollect(md2) + return auto_collector + + +def center_until_centered(auto_center_device): + is_centered = False + is_centered = auto_center_device.check_if_centered() + sanity_check = 0 + while(is_centered != True): + auto_center_device.auto3click_center() + is_centered = auto_center_device.check_if_centered() + sanity_check = sanity_check + 1 + if sanity_check > 7: + is_centered = True + logger.warning('\n\n\n Could not Center (Function is centered is not returning true)\n\n') + logger.info('took {} times to auto center'.format(sanity_check)) + + + +if __name__ == '__main__': + md2 = MD2Device("XF:19IDC-ES{MD2}:", name="md2") + ac = AutoCollect(md2) + center_until_centered(ac) + print(ac.getRasterBox()) + +''' \ No newline at end of file diff --git a/gui/control_main.py b/gui/control_main.py index c08dab53..788de104 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -21,6 +21,8 @@ from qtpy.QtGui import QIntValidator from qtpy.QtWidgets import QCheckBox, QFrame, QGraphicsPixmapItem, QApplication from devices import GonioDevice, CameraDevice, MD2Device, LightDevice, MD2ApertureDevice +from autocenter_lucid import AutoCollect + import albulaUtils import daq_utils @@ -243,6 +245,8 @@ def __init__(self): self.controlMasterCheckBox.setChecked(True) self.XRFInfoDict = self.parseXRFTable() # I don't like this + self.AutoCenterObject = AutoCollect(self.md2) + def setGuiValues(self, values): for item, value in values.items(): logger.info("resetting %s to %s" % (item, value)) @@ -1503,7 +1507,8 @@ def createSampleTab(self): self.dimpleCheckBox.setVisible(False) self.centeringComboBox.setVisible(False) annealButton.setVisible(False) - centerLoopButton.setVisible(False) + #unhiding center loop button + #centerLoopButton.setVisible(False) clearGraphicsButton.setVisible(False) saveCenteringButton.setVisible(False) selectAllCenteringButton.setVisible(False) @@ -3023,7 +3028,8 @@ def omegaTweakCB(self, tv): def autoCenterLoopCB(self): logger.info("auto center loop") - self.send_to_server("loop_center_xrec()") + self.AutoCenterObject.center_until_centered() + #self.send_to_server("loop_center_xrec()") def autoRasterLoopCB(self): self.selectedSampleID = self.selectedSampleRequest["sample"] From 5e9abbfe91dc136129424da270bfa804033b88b3 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Thu, 16 May 2024 13:05:18 -0400 Subject: [PATCH 02/46] Update autocenter_lucid.py --- autocenter_lucid.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/autocenter_lucid.py b/autocenter_lucid.py index d5528c3c..dc954ea7 100644 --- a/autocenter_lucid.py +++ b/autocenter_lucid.py @@ -5,12 +5,14 @@ #from lucid_core import find_loop import logging +from devices import MD2Device import urllib.request from io import BytesIO from PIL import Image import numpy import subprocess import time +import daq_utils class AutoCollect(): @@ -25,7 +27,7 @@ def __init__(self, md2): #self.redis_client = redis.Redis(host='10.67.146.131', port=6379, db=0) self.lucid_subprocess_call = ['/nsls2/data/nyx/legacy/Rudra/wxImageViewer/lucid_environment/bin/lucid3', 'CurrentSample.jpg'] self.raster_box_subprocess_call =['curl', '-X', 'POST', '-F', 'file=@./CurrentSample.jpg', 'http://127.0.0.1:8000/predict'] - self.immediate_comm_pv = PV(daq_utils.beamlineComm + "immediate_command_s") + #self.immediate_comm_pv = PV(daq_utils.beamlineComm + "immediate_command_s") @@ -70,9 +72,10 @@ def find_center_point(self): return coord_guess - + #THIS FUNCTION DOES NOT WORK RIGHT NOW def center_on_point(self, x_click, y_click): #this is only for lowest magnification (ie zoom level 1) should probably set to zoom level 1 when running auto center anyway + #click to center currently does not work THIS FUNCTION DOES NOT WORK RIGHT NOW fov = {"x":0, "y":0} fov["x"] = daq_utils.lowMagFOVx @@ -86,7 +89,7 @@ def center_on_point(self, x_click, y_click): correctedC2C_y = self.getMD2BeamCenterY() + (y_click - self.getMD2BeamCenterY() - 40) #still using old python string expressions should convert to ''.format() comm_s = f'center_on_click({correctedC2C_x},{correctedC2C_y},{fov["x"]},{fov["y"]},source="screen",maglevel=0,viewangle={current_viewangle})' - self.immediate_comm_pv.put(comm_s) + #self.immediate_comm_pv.put(comm_s) From 48cd4f4b3bdb9c8a57f9f5014da94fa4c74ad2cc Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Thu, 16 May 2024 13:07:36 -0400 Subject: [PATCH 03/46] Update autocenter_lucid.py --- autocenter_lucid.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/autocenter_lucid.py b/autocenter_lucid.py index dc954ea7..18db0b98 100644 --- a/autocenter_lucid.py +++ b/autocenter_lucid.py @@ -15,6 +15,8 @@ import daq_utils +logger = logging.getLogger() + class AutoCollect(): def __init__(self, md2): self.md2 = md2 From acd5de021403380cf927c9d8fad037b26f25c7c0 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Mon, 20 May 2024 12:12:14 -0400 Subject: [PATCH 04/46] Update control_main.py --- gui/control_main.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index 788de104..afbfd0d3 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3028,7 +3028,18 @@ def omegaTweakCB(self, tv): def autoCenterLoopCB(self): logger.info("auto center loop") - self.AutoCenterObject.center_until_centered() + is_centered = False + is_centered = self.AutoCenterObject.check_if_centered() + sanity_check = 0 + while(is_centered != True): + self.AutoCenterObject.auto3click_center() + is_centered = self.AutoCenterObject.check_if_centered() + sanity_check = sanity_check + 1 + if sanity_check > 7: + is_centered = True + logger.warning('\n\n\n Could not Center (Function is centered is not returning true)\n\n') + logger.info('took {} times to auto center'.format(sanity_check)) + #self.AutoCenterObject.center_until_centered() #self.send_to_server("loop_center_xrec()") def autoRasterLoopCB(self): From 021321e7111b8489fb9b13db8ffc60276589fd8e Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Mon, 20 May 2024 13:45:58 -0400 Subject: [PATCH 05/46] Update control_main.py --- gui/control_main.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gui/control_main.py b/gui/control_main.py index afbfd0d3..1c28010d 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -21,7 +21,9 @@ from qtpy.QtGui import QIntValidator from qtpy.QtWidgets import QCheckBox, QFrame, QGraphicsPixmapItem, QApplication from devices import GonioDevice, CameraDevice, MD2Device, LightDevice, MD2ApertureDevice +#for the autocenter process from autocenter_lucid import AutoCollect +import subprocess import albulaUtils @@ -3028,6 +3030,7 @@ def omegaTweakCB(self, tv): def autoCenterLoopCB(self): logger.info("auto center loop") + ''' is_centered = False is_centered = self.AutoCenterObject.check_if_centered() sanity_check = 0 @@ -3041,6 +3044,11 @@ def autoCenterLoopCB(self): logger.info('took {} times to auto center'.format(sanity_check)) #self.AutoCenterObject.center_until_centered() #self.send_to_server("loop_center_xrec()") + ''' + autocenter_call = ['./nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center'] + result = subprocess.run(autocenter_call, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + logger.info("auto center done") + logger.info(result) def autoRasterLoopCB(self): self.selectedSampleID = self.selectedSampleRequest["sample"] From 1006f231abc6cd5de6c515f35f68e03cf92c25ad Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Mon, 20 May 2024 14:38:59 -0400 Subject: [PATCH 06/46] Update control_main.py --- gui/control_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index 1c28010d..e1f3cb11 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3045,7 +3045,7 @@ def autoCenterLoopCB(self): #self.AutoCenterObject.center_until_centered() #self.send_to_server("loop_center_xrec()") ''' - autocenter_call = ['./nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center'] + autocenter_call = ['/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center'] result = subprocess.run(autocenter_call, stdout=subprocess.PIPE, stderr=subprocess.PIPE) logger.info("auto center done") logger.info(result) From 73f91ee2639668ae84e2f2dc6604a97f28b1ab12 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Mon, 20 May 2024 15:35:55 -0400 Subject: [PATCH 07/46] Update control_main.py --- gui/control_main.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gui/control_main.py b/gui/control_main.py index e1f3cb11..c643f6ab 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3046,6 +3046,9 @@ def autoCenterLoopCB(self): #self.send_to_server("loop_center_xrec()") ''' autocenter_call = ['/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center'] + self.popupServerMessage( + "Starting Auto Center. Please wait until completed" + ) result = subprocess.run(autocenter_call, stdout=subprocess.PIPE, stderr=subprocess.PIPE) logger.info("auto center done") logger.info(result) From 2061501d0e10ac4aaf72df51750904df9c8b1114 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Mon, 20 May 2024 16:59:47 -0400 Subject: [PATCH 08/46] Update control_main.py --- gui/control_main.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index c643f6ab..4ce6f7c5 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3049,8 +3049,11 @@ def autoCenterLoopCB(self): self.popupServerMessage( "Starting Auto Center. Please wait until completed" ) - result = subprocess.run(autocenter_call, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + auto_center_result = subprocess.run(autocenter_call, stdout=subprocess.PIPE, stderr=subprocess.PIPE) logger.info("auto center done") + self.popupServerMessage( + "Auto center done, RESULTS:\n {}".format(auto_center_result) + ) logger.info(result) def autoRasterLoopCB(self): From 86b89a39ff241a1bc97c848e7339b156e1625da8 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 12:56:17 -0400 Subject: [PATCH 09/46] Update control_main.py --- gui/control_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index 4ce6f7c5..1d0d3c50 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3054,7 +3054,7 @@ def autoCenterLoopCB(self): self.popupServerMessage( "Auto center done, RESULTS:\n {}".format(auto_center_result) ) - logger.info(result) + logger.info(auto_center_result) def autoRasterLoopCB(self): self.selectedSampleID = self.selectedSampleRequest["sample"] From c1ee51ee349372b5478cbb9a688556f5bad7a7a3 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 13:15:29 -0400 Subject: [PATCH 10/46] Update control_main.py --- gui/control_main.py | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/gui/control_main.py b/gui/control_main.py index 1d0d3c50..a6c2d47a 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -19,7 +19,7 @@ from qtpy import QtCore, QtGui, QtWidgets from qtpy.QtCore import QModelIndex, QRectF, Qt, QTimer from qtpy.QtGui import QIntValidator -from qtpy.QtWidgets import QCheckBox, QFrame, QGraphicsPixmapItem, QApplication +from qtpy.QtWidgets import QCheckBox, QFrame, QGraphicsPixmapItem, QApplication, QMessageBox from devices import GonioDevice, CameraDevice, MD2Device, LightDevice, MD2ApertureDevice #for the autocenter process from autocenter_lucid import AutoCollect @@ -3046,15 +3046,30 @@ def autoCenterLoopCB(self): #self.send_to_server("loop_center_xrec()") ''' autocenter_call = ['/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center'] - self.popupServerMessage( - "Starting Auto Center. Please wait until completed" - ) - auto_center_result = subprocess.run(autocenter_call, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - logger.info("auto center done") - self.popupServerMessage( - "Auto center done, RESULTS:\n {}".format(auto_center_result) - ) - logger.info(auto_center_result) + popup_info = QMessageBox() + popup_info.setWindowTitle('AutoCenter Info') + popup_info.setText("Waiting for auto center, view detailed text for more info") + popup_info.setIcon(QMessageBox.Information) + x = popup_info.exec_() + with subprocess.Popen(autocenter_call, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) as p: + for line in p.stdout: + popup_info.setText(line, end="") + + if p.returncode != 0: + raise subprocess.CalledProcessError(p.returncode, p.args) + + + + # self.popupServerMessage( + # "Starting Auto Center. Please wait until completed" + # ) + # auto_center_result = subprocess.run(autocenter_call, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # logger.info("auto center done") + # self.popupServerMessage( + # "Auto center done, RESULTS:\n {}".format(auto_center_result) + # ) + # logger.info(auto_center_result) + def autoRasterLoopCB(self): self.selectedSampleID = self.selectedSampleRequest["sample"] From 385bbd3c67bcd15361b67eb4f38362b094f72881 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 15:01:01 -0400 Subject: [PATCH 11/46] Update control_main.py --- gui/control_main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/control_main.py b/gui/control_main.py index a6c2d47a..1032b19a 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3046,11 +3046,11 @@ def autoCenterLoopCB(self): #self.send_to_server("loop_center_xrec()") ''' autocenter_call = ['/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center'] - popup_info = QMessageBox() + popup_info = QMessageBox(Parent= self) popup_info.setWindowTitle('AutoCenter Info') popup_info.setText("Waiting for auto center, view detailed text for more info") popup_info.setIcon(QMessageBox.Information) - x = popup_info.exec_() + x = popup_info.open() with subprocess.Popen(autocenter_call, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) as p: for line in p.stdout: popup_info.setText(line, end="") From 35e0a34c2477ad5de77133b601b5f3565cfed59a Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 15:02:22 -0400 Subject: [PATCH 12/46] Update control_main.py --- gui/control_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index 1032b19a..c08ef9ec 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3046,7 +3046,7 @@ def autoCenterLoopCB(self): #self.send_to_server("loop_center_xrec()") ''' autocenter_call = ['/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center'] - popup_info = QMessageBox(Parent= self) + popup_info = QMessageBox(parent=self) popup_info.setWindowTitle('AutoCenter Info') popup_info.setText("Waiting for auto center, view detailed text for more info") popup_info.setIcon(QMessageBox.Information) From 0420ea9bd5bf5b01209f38171d40e4acf0e66b01 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 15:04:53 -0400 Subject: [PATCH 13/46] Update control_main.py --- gui/control_main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index c08ef9ec..c9d0ad91 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3053,7 +3053,8 @@ def autoCenterLoopCB(self): x = popup_info.open() with subprocess.Popen(autocenter_call, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) as p: for line in p.stdout: - popup_info.setText(line, end="") + + popup_info.setText(line + "") if p.returncode != 0: raise subprocess.CalledProcessError(p.returncode, p.args) From 559ff976a95c1a54b316926c386f39e43184e8f5 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 15:05:50 -0400 Subject: [PATCH 14/46] Update control_main.py --- gui/control_main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gui/control_main.py b/gui/control_main.py index c9d0ad91..fd2ed407 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3051,6 +3051,7 @@ def autoCenterLoopCB(self): popup_info.setText("Waiting for auto center, view detailed text for more info") popup_info.setIcon(QMessageBox.Information) x = popup_info.open() + time.sleep(0.5) with subprocess.Popen(autocenter_call, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) as p: for line in p.stdout: From e346a16a89f98f7279d9bd581649cb4c78a6c994 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 15:07:07 -0400 Subject: [PATCH 15/46] Update control_main.py --- gui/control_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index fd2ed407..9c734808 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3046,7 +3046,7 @@ def autoCenterLoopCB(self): #self.send_to_server("loop_center_xrec()") ''' autocenter_call = ['/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center'] - popup_info = QMessageBox(parent=self) + popup_info = QMessageBox() popup_info.setWindowTitle('AutoCenter Info') popup_info.setText("Waiting for auto center, view detailed text for more info") popup_info.setIcon(QMessageBox.Information) From 9de52022293884321a860de8b72439b7f0399e9a Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 15:13:40 -0400 Subject: [PATCH 16/46] Update control_main.py --- gui/control_main.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gui/control_main.py b/gui/control_main.py index 9c734808..5cef837c 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3046,12 +3046,11 @@ def autoCenterLoopCB(self): #self.send_to_server("loop_center_xrec()") ''' autocenter_call = ['/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center'] - popup_info = QMessageBox() + popup_info = QMessageBox(self) popup_info.setWindowTitle('AutoCenter Info') popup_info.setText("Waiting for auto center, view detailed text for more info") popup_info.setIcon(QMessageBox.Information) x = popup_info.open() - time.sleep(0.5) with subprocess.Popen(autocenter_call, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) as p: for line in p.stdout: From aea4645ecf42d64bdc9400225de63fdede66ae72 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 15:30:21 -0400 Subject: [PATCH 17/46] trying QProcess async --- gui/control_main.py | 44 +++++++++++--------------------------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/gui/control_main.py b/gui/control_main.py index 5cef837c..b1b49030 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -17,7 +17,7 @@ from qt_epics.QtEpicsPVEntry import QtEpicsPVEntry from qt_epics.QtEpicsPVLabel import QtEpicsPVLabel from qtpy import QtCore, QtGui, QtWidgets -from qtpy.QtCore import QModelIndex, QRectF, Qt, QTimer +from qtpy.QtCore import QModelIndex, QRectF, Qt, QTimer, QProcess from qtpy.QtGui import QIntValidator from qtpy.QtWidgets import QCheckBox, QFrame, QGraphicsPixmapItem, QApplication, QMessageBox from devices import GonioDevice, CameraDevice, MD2Device, LightDevice, MD2ApertureDevice @@ -3030,47 +3030,25 @@ def omegaTweakCB(self, tv): def autoCenterLoopCB(self): logger.info("auto center loop") - ''' - is_centered = False - is_centered = self.AutoCenterObject.check_if_centered() - sanity_check = 0 - while(is_centered != True): - self.AutoCenterObject.auto3click_center() - is_centered = self.AutoCenterObject.check_if_centered() - sanity_check = sanity_check + 1 - if sanity_check > 7: - is_centered = True - logger.warning('\n\n\n Could not Center (Function is centered is not returning true)\n\n') - logger.info('took {} times to auto center'.format(sanity_check)) - #self.AutoCenterObject.center_until_centered() - #self.send_to_server("loop_center_xrec()") - ''' - autocenter_call = ['/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center'] + autocenter_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center' popup_info = QMessageBox(self) popup_info.setWindowTitle('AutoCenter Info') popup_info.setText("Waiting for auto center, view detailed text for more info") popup_info.setIcon(QMessageBox.Information) x = popup_info.open() - with subprocess.Popen(autocenter_call, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) as p: - for line in p.stdout: - - popup_info.setText(line + "") + self.autocenter_process = QProcess() + self.autocenter_process.readyReadStandardOutput.connect(popup_info.setText(bytes(self.autocenter_process.readAllStandardOutput()).decode("utf8"))) + self.autocenter_process.start(autocenter_call) - if p.returncode != 0: - raise subprocess.CalledProcessError(p.returncode, p.args) + # with subprocess.Popen(autocenter_call, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) as p: + # for line in p.stdout: + + # popup_info.setText(line + "") + # if p.returncode != 0: + # raise subprocess.CalledProcessError(p.returncode, p.args) - # self.popupServerMessage( - # "Starting Auto Center. Please wait until completed" - # ) - # auto_center_result = subprocess.run(autocenter_call, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - # logger.info("auto center done") - # self.popupServerMessage( - # "Auto center done, RESULTS:\n {}".format(auto_center_result) - # ) - # logger.info(auto_center_result) - def autoRasterLoopCB(self): self.selectedSampleID = self.selectedSampleRequest["sample"] From cbc9314404c75c835e8a0e7122bf1dbd41555bde Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 15:31:49 -0400 Subject: [PATCH 18/46] Update control_main.py --- gui/control_main.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gui/control_main.py b/gui/control_main.py index b1b49030..7549e6c6 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3031,13 +3031,13 @@ def omegaTweakCB(self, tv): def autoCenterLoopCB(self): logger.info("auto center loop") autocenter_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center' - popup_info = QMessageBox(self) + popup_info = QMessageBox(parent = self) popup_info.setWindowTitle('AutoCenter Info') popup_info.setText("Waiting for auto center, view detailed text for more info") popup_info.setIcon(QMessageBox.Information) x = popup_info.open() - self.autocenter_process = QProcess() - self.autocenter_process.readyReadStandardOutput.connect(popup_info.setText(bytes(self.autocenter_process.readAllStandardOutput()).decode("utf8"))) + self.autocenter_process = QProcess(parent=self) + #self.autocenter_process.readyReadStandardOutput.connect(popup_info.setText(bytes(self.autocenter_process.readAllStandardOutput()).decode("utf8"))) self.autocenter_process.start(autocenter_call) From 96db2d41cd6d0f1d548063829708e1a350442558 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 15:53:45 -0400 Subject: [PATCH 19/46] Making popup seperate value --- gui/control_main.py | 10 +++++----- gui/dialog/__init__.py | 1 + gui/dialog/process_monitor.py | 25 +++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 gui/dialog/process_monitor.py diff --git a/gui/control_main.py b/gui/control_main.py index 7549e6c6..9cfd26d6 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -54,7 +54,8 @@ SnapCommentDialog, StaffScreenDialog, UserScreenDialog, - CalculatorWindow + CalculatorWindow, + ProcessPopup ) from gui.raster import RasterCell, RasterGroup from QPeriodicTable import QPeriodicTable @@ -3031,13 +3032,12 @@ def omegaTweakCB(self, tv): def autoCenterLoopCB(self): logger.info("auto center loop") autocenter_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center' - popup_info = QMessageBox(parent = self) - popup_info.setWindowTitle('AutoCenter Info') - popup_info.setText("Waiting for auto center, view detailed text for more info") + popup_info = ProcessPopup(window_title='AutoCenter Info', main_text="Waiting for auto center, view detailed text for more info") + popup_info.setIcon(QMessageBox.Information) x = popup_info.open() self.autocenter_process = QProcess(parent=self) - #self.autocenter_process.readyReadStandardOutput.connect(popup_info.setText(bytes(self.autocenter_process.readAllStandardOutput()).decode("utf8"))) + self.autocenter_process.readyReadStandardOutput.connect(lambda: (popup_info.setDetailedText(bytes(self.autocenter_process.readAllStandardOutput()).decode("utf8")))) self.autocenter_process.start(autocenter_call) diff --git a/gui/dialog/__init__.py b/gui/dialog/__init__.py index 653c2b05..3ccfa12c 100644 --- a/gui/dialog/__init__.py +++ b/gui/dialog/__init__.py @@ -7,3 +7,4 @@ from .screen_defaults import ScreenDefaultsDialog from .resolution_calculator import Calculator from .resolution_dialog import CalculatorWindow +from .process_monitor import ProcessPopup diff --git a/gui/dialog/process_monitor.py b/gui/dialog/process_monitor.py new file mode 100644 index 00000000..d6d5b43a --- /dev/null +++ b/gui/dialog/process_monitor.py @@ -0,0 +1,25 @@ +import logging +import typing + +from qtpy import QtCore, QtGui, QtWidgets +from qtpy.QtCore import Qt + +import daq_utils +import db_lib + +if typing.TYPE_CHECKING: + from lsdcGui import ControlMain + +logger = logging.getLogger() + +class ProcessPopup(QtWidgets.QMessageBox): + def __init__(self, parent: "ControlMain",window_title = 'Info', main_text = 'Waiting for somethign in GUI, open more details for more info', detailed_text = ''): + super(ProcessPopup, self).__init__(parent) + self.setWindowTitle(window_title) + self.setIcon(QtWidgets.QMessageBox.NoIcon) + self.setText(main_text) + self.setStandardButtons(None) + self.setDetailedText(detailed_text) + + + From 0cd3dde04893c9bae057336c404ab8c57b2bfd14 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 15:57:39 -0400 Subject: [PATCH 20/46] Update control_main.py --- gui/control_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index 9cfd26d6..b1a304ed 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3032,7 +3032,7 @@ def omegaTweakCB(self, tv): def autoCenterLoopCB(self): logger.info("auto center loop") autocenter_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center' - popup_info = ProcessPopup(window_title='AutoCenter Info', main_text="Waiting for auto center, view detailed text for more info") + popup_info = ProcessPopup(parent = self, window_title='AutoCenter Info', main_text="Waiting for auto center, view detailed text for more info") popup_info.setIcon(QMessageBox.Information) x = popup_info.open() From 410f709ef9e196b5b533e4774f0f7d71035a90cf Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 15:59:11 -0400 Subject: [PATCH 21/46] Update process_monitor.py --- gui/dialog/process_monitor.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gui/dialog/process_monitor.py b/gui/dialog/process_monitor.py index d6d5b43a..ed580367 100644 --- a/gui/dialog/process_monitor.py +++ b/gui/dialog/process_monitor.py @@ -18,7 +18,6 @@ def __init__(self, parent: "ControlMain",window_title = 'Info', main_text = 'Wa self.setWindowTitle(window_title) self.setIcon(QtWidgets.QMessageBox.NoIcon) self.setText(main_text) - self.setStandardButtons(None) self.setDetailedText(detailed_text) From 4dede3cd12b87ff20a821ce9fb8e47f9c5b14eda Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 16:33:51 -0400 Subject: [PATCH 22/46] Editing qpopupbox --- gui/control_main.py | 3 ++- gui/dialog/process_monitor.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/gui/control_main.py b/gui/control_main.py index b1a304ed..63e663e4 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3037,7 +3037,8 @@ def autoCenterLoopCB(self): popup_info.setIcon(QMessageBox.Information) x = popup_info.open() self.autocenter_process = QProcess(parent=self) - self.autocenter_process.readyReadStandardOutput.connect(lambda: (popup_info.setDetailedText(bytes(self.autocenter_process.readAllStandardOutput()).decode("utf8")))) + self.autocenter_process.readyReadStandardOutput.connect(lambda: popup_info.setDetailedText(bytes(self.autocenter_process.readAllStandardOutput()).decode("utf8"))) + self.autocenter_process.finished.connect(lambda: popup_info.setText("AUTO CENTERING FINISHED\nopen details for more information")) self.autocenter_process.start(autocenter_call) diff --git a/gui/dialog/process_monitor.py b/gui/dialog/process_monitor.py index ed580367..48551f11 100644 --- a/gui/dialog/process_monitor.py +++ b/gui/dialog/process_monitor.py @@ -13,10 +13,10 @@ logger = logging.getLogger() class ProcessPopup(QtWidgets.QMessageBox): - def __init__(self, parent: "ControlMain",window_title = 'Info', main_text = 'Waiting for somethign in GUI, open more details for more info', detailed_text = ''): + def __init__(self, parent: "ControlMain",window_title = 'Info', main_text = 'Waiting for somethign in GUI, open more details for more info', detailed_text = 'waiting'): super(ProcessPopup, self).__init__(parent) self.setWindowTitle(window_title) - self.setIcon(QtWidgets.QMessageBox.NoIcon) + self.setIcon(QtWidgets.QMessageBox.question) self.setText(main_text) self.setDetailedText(detailed_text) From e7f65a4eec12248740a94841f426f5687c46bc4d Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 16:36:06 -0400 Subject: [PATCH 23/46] Update process_monitor.py --- gui/dialog/process_monitor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/dialog/process_monitor.py b/gui/dialog/process_monitor.py index 48551f11..56c56916 100644 --- a/gui/dialog/process_monitor.py +++ b/gui/dialog/process_monitor.py @@ -16,7 +16,7 @@ class ProcessPopup(QtWidgets.QMessageBox): def __init__(self, parent: "ControlMain",window_title = 'Info', main_text = 'Waiting for somethign in GUI, open more details for more info', detailed_text = 'waiting'): super(ProcessPopup, self).__init__(parent) self.setWindowTitle(window_title) - self.setIcon(QtWidgets.QMessageBox.question) + self.setIcon(QtWidgets.QMessageBox.Question) self.setText(main_text) self.setDetailedText(detailed_text) From 5d2e9f22b60dfa4dc513a06565dbae75b1caf622 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 21 May 2024 16:41:33 -0400 Subject: [PATCH 24/46] Update control_main.py --- gui/control_main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index 63e663e4..068a0ca5 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3038,7 +3038,8 @@ def autoCenterLoopCB(self): x = popup_info.open() self.autocenter_process = QProcess(parent=self) self.autocenter_process.readyReadStandardOutput.connect(lambda: popup_info.setDetailedText(bytes(self.autocenter_process.readAllStandardOutput()).decode("utf8"))) - self.autocenter_process.finished.connect(lambda: popup_info.setText("AUTO CENTERING FINISHED\nopen details for more information")) + self.autocenter_process.finished.connect(lambda: popup_info.setText("AUTO CENTERING FINISHED\n\nopen details for more information")) + self.autocenter_process.finished.connect(lambda: popup_info.setWindowTitle("Done")) self.autocenter_process.start(autocenter_call) From 87a3bfd352b4ae39aa716baf7765d874a4fd9bb8 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Thu, 23 May 2024 14:37:20 -0400 Subject: [PATCH 25/46] fixing button removing autocenter_lucid --- autocenter_lucid.py | 246 -------------------------------------------- gui/control_main.py | 5 +- 2 files changed, 2 insertions(+), 249 deletions(-) delete mode 100644 autocenter_lucid.py diff --git a/autocenter_lucid.py b/autocenter_lucid.py deleted file mode 100644 index 18db0b98..00000000 --- a/autocenter_lucid.py +++ /dev/null @@ -1,246 +0,0 @@ -import sys - -sys.path.append('/nsls2/data/nyx/legacy/Rudra/wxImageViewer/lucid3/lucid3') - - -#from lucid_core import find_loop -import logging -from devices import MD2Device -import urllib.request -from io import BytesIO -from PIL import Image -import numpy -import subprocess -import time -import daq_utils - - -logger = logging.getLogger() - -class AutoCollect(): - def __init__(self, md2): - self.md2 = md2 - self.is_collected = False - self.image_url = 'http://10.67.147.26:3908/video_feed2' - self.delay = 1000 - self.image = self.getImageFromURL() - self.imageSize = (640,512) - #self.key = 'bzoom:RAW' - #self.redis_client = redis.Redis(host='10.67.146.131', port=6379, db=0) - self.lucid_subprocess_call = ['/nsls2/data/nyx/legacy/Rudra/wxImageViewer/lucid_environment/bin/lucid3', 'CurrentSample.jpg'] - self.raster_box_subprocess_call =['curl', '-X', 'POST', '-F', 'file=@./CurrentSample.jpg', 'http://127.0.0.1:8000/predict'] - #self.immediate_comm_pv = PV(daq_utils.beamlineComm + "immediate_command_s") - - - - - - - #DEFINING FUNCTIONS FOR CORRECTED CLICK TO CENTER - def getMD2ImageXRatio(self): - md2_img_width = daq_utils.highMagPixX - lsdc_img_width = daq_utils.screenPixX - return float(md2_img_width) / float(lsdc_img_width) - - def getMD2ImageYRatio(self): - md2_img_height = daq_utils.highMagPixY - lsdc_img_height = daq_utils.screenPixY - return float(md2_img_height) / float(lsdc_img_height) - - - def getMD2BeamCenterX(self): - return self.md2.center_pixel_x.get() / self.getMD2ImageXRatio() - - - def getMD2BeamCenterY(self): - return self.md2.center_pixel_y.get() / self.getMD2ImageYRatio() - - def getImageFromURL(self): - image_file = BytesIO(urllib.request.urlopen(self.image_url, timeout=self.delay/1000).read()) - sample_image = Image.open(image_file) - numpy_image = numpy.asarray(sample_image) - return numpy_image - - - def find_center_point(self): - self.image=self.getImageFromURL() - Image.fromarray(self.image).save('CurrentSample.jpg') - result = subprocess.run(self.lucid_subprocess_call, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - if result.stderr.decode() != '': - print("ERROR:\n{}".format(result.stderr.decode())) - return (0,0) - val = result.stdout.decode().split('(', 1)[1].split(')')[0].split(',') - coord_guess = (int(val[1]), int(val[2])) - return coord_guess - - - #THIS FUNCTION DOES NOT WORK RIGHT NOW - def center_on_point(self, x_click, y_click): - #this is only for lowest magnification (ie zoom level 1) should probably set to zoom level 1 when running auto center anyway - #click to center currently does not work THIS FUNCTION DOES NOT WORK RIGHT NOW - - fov = {"x":0, "y":0} - fov["x"] = daq_utils.lowMagFOVx - fov["y"] = daq_utils.lowMagFOVy - current_viewangle = daq_utils.mag1ViewAngle - - #done initializing zoom1 variables - - - correctedC2C_x = self.getMD2BeamCenterX() + (x_click - self.getMD2BeamCenterX() - 20) - correctedC2C_y = self.getMD2BeamCenterY() + (y_click - self.getMD2BeamCenterY() - 40) - #still using old python string expressions should convert to ''.format() - comm_s = f'center_on_click({correctedC2C_x},{correctedC2C_y},{fov["x"]},{fov["y"]},source="screen",maglevel=0,viewangle={current_viewangle})' - #self.immediate_comm_pv.put(comm_s) - - - - - - def start_md2_centering(self): - self.md2.exporter.cmd("startManualSampleCentring", "") - logger.info('starting three click centering') - - - def convert_predicted_points_to_three_click(self, x_click, y_click): - correctedC2C_x = x_click + 5 + ((daq_utils.screenPixX/2) - self.getMD2BeamCenterX()) - correctedC2C_y = y_click - 35 + ((daq_utils.screenPixY/2) - self.getMD2BeamCenterY()) - lsdc_x = daq_utils.screenPixX - lsdc_y = daq_utils.screenPixY - md2_x = self.md2.center_pixel_x.get() * 2 - md2_y = self.md2.center_pixel_y.get() * 2 - scale_x = md2_x / lsdc_x - scale_y = md2_y / lsdc_y - correctedC2C_x = correctedC2C_x * scale_x - correctedC2C_y = correctedC2C_y * scale_y - return correctedC2C_x, correctedC2C_y - - - def send_three_click_point(self, x_click, y_click): - final_x, final_y = self.convert_predicted_points_to_three_click(x_click, y_click) - self.md2.centring_click.put("{} {}".format(final_x, final_y)) - - - def sendLucidToMD2ThreeClick(self): - coords = self.find_center_point() - logger.info('sending point to 3 click center ({}, {})'.format(coords[0], coords[1])) - self.send_three_click_point(coords[0], coords[1]) - - def sendLucidToC2C(self): - coords = self.find_center_point() - self.center_on_point(coords[0], coords[1]) - - - - def auto3click_center(self): - #check md2 status to see if its ready for three click centering - if self.md2.is_ready() == False: - logger.warning('MD2 Is not ready') - return False - #send start md2 centering - self.start_md2_centering() - #sanity check to see if it started manual centering - value_checker = self.md2.task_info.value - if value_checker[0] != 'Manual Centring' and value_checker[3] != 'null': - logger.warning('already finished the manual centering?') - while self.md2.is_ready() == False: - state = self.md2.exporter.read('OmegaState') - if state != 'Ready': - logger.info('waiting for motor rotation') - #logger.warning('wait a little') - time.sleep(0.5) - else: - self.sendLucidToMD2ThreeClick() - return True - - def check_if_centered(self): - coords = self.find_center_point() - final_x, final_y = coords[0], coords[1] - #final_x, final_y = self.convert_predicted_points_to_three_click(x_click, y_click) - beam_y = self.getMD2BeamCenterY() - beam_x = self.getMD2BeamCenterX() - #logger.warning('beamx = {} |||| final_x = {}\n beamy = {} |||| final_y = {}'.format(beam_x,final_x,beam_y,final_y)) - x_checker = (beam_x + 30 > final_x) and (beam_x - 30 < final_x) - y_checker = (beam_y + 30 > final_y) and (beam_y - 30 < final_y) - logger.warning('xchecker : {}, \nychecker : {}'.format(x_checker,y_checker)) - if x_checker and y_checker: - return True - else: - return False - - - def getRasterBox(self): - self.image=self.getImageFromURL() - Image.fromarray(self.image).save('CurrentSample.jpg') - result = subprocess.run(self.raster_box_subprocess_call, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - if 'Connection refused' in result.stderr.decode(): - logger.warning(result.stderr.decode()) - return None - result_dict = eval(result.stdout.decode()) - box = result_dict['pred_boxes'][0]['box'] - #returns box as x1,y1,x2,y2 - bottom_left = (box[0],box[1]) - top_right = (box[2], box[3]) - return bottom_left, top_right - - def center_until_centered(self): - is_centered = False - is_centered = self.check_if_centered() - sanity_check = 0 - while(is_centered != True): - self.auto3click_center() - is_centered = self.check_if_centered() - sanity_check = sanity_check + 1 - if sanity_check > 7: - is_centered = True - logger.warning('\n\n\n Could not Center (Function is centered is not returning true)\n\n') - logger.info('took {} times to auto center'.format(sanity_check)) - - - - - - - - - - - - - -#THE check to see if it works -#md2 = MD2Device("XF:19IDC-ES{MD2}:", name="md2") -#auto_collecter = AutoCollect(md2) -#print(auto_collecter.find_center_point()) -#daq_utils.init_environment() - -''' - -def make(): - md2 = MD2Device("XF:19IDC-ES{MD2}:", name="md2") - auto_collector = AutoCollect(md2) - return auto_collector - - -def center_until_centered(auto_center_device): - is_centered = False - is_centered = auto_center_device.check_if_centered() - sanity_check = 0 - while(is_centered != True): - auto_center_device.auto3click_center() - is_centered = auto_center_device.check_if_centered() - sanity_check = sanity_check + 1 - if sanity_check > 7: - is_centered = True - logger.warning('\n\n\n Could not Center (Function is centered is not returning true)\n\n') - logger.info('took {} times to auto center'.format(sanity_check)) - - - -if __name__ == '__main__': - md2 = MD2Device("XF:19IDC-ES{MD2}:", name="md2") - ac = AutoCollect(md2) - center_until_centered(ac) - print(ac.getRasterBox()) - -''' \ No newline at end of file diff --git a/gui/control_main.py b/gui/control_main.py index 068a0ca5..98a89cad 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -21,9 +21,8 @@ from qtpy.QtGui import QIntValidator from qtpy.QtWidgets import QCheckBox, QFrame, QGraphicsPixmapItem, QApplication, QMessageBox from devices import GonioDevice, CameraDevice, MD2Device, LightDevice, MD2ApertureDevice -#for the autocenter process -from autocenter_lucid import AutoCollect -import subprocess + + import albulaUtils From 66dbeed69f18db7ec2d074b1b51c0738c7c87074 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Fri, 24 May 2024 09:10:29 -0400 Subject: [PATCH 26/46] Update control_main.py --- gui/control_main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index 98a89cad..ba80075b 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -247,7 +247,6 @@ def __init__(self): self.controlMasterCheckBox.setChecked(True) self.XRFInfoDict = self.parseXRFTable() # I don't like this - self.AutoCenterObject = AutoCollect(self.md2) def setGuiValues(self, values): for item, value in values.items(): From 8be5cc394c143b3c6bddde2a1c30b0eb9579d154 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Fri, 24 May 2024 11:14:01 -0400 Subject: [PATCH 27/46] adding function to get raster coordinates to test it will call from the auto center button beefore and after --- gui/control_main.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/gui/control_main.py b/gui/control_main.py index ba80075b..3a98e6d7 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -169,6 +169,7 @@ def __init__(self): self.centerMarkerCharSize = 20 self.centerMarkerCharOffsetX = 12 self.centerMarkerCharOffsetY = 18 + self.raster_output = None self.currentRasterCellList = [] self.redPen = QtGui.QPen(QtCore.Qt.red) self.bluePen = QtGui.QPen(QtCore.Qt.blue) @@ -1528,6 +1529,7 @@ def createSampleTab(self): #self.captureLowMag.set(cv2.CAP_PROP_BUFFERSIZE, 1) self.captureLowMag = daq_utils.lowMagCamURL self.capture = self.captureLowMag + #self.sampleCameraThread = VideoThread( # parent=self, delay=SAMPLE_TIMER_DELAY, camera_object=self.capture @@ -3028,6 +3030,12 @@ def omegaTweakCB(self, tv): self.popupServerMessage("You don't have control") def autoCenterLoopCB(self): + logger.info("getting raster coordinates") + raster_coords = self.get_raster_coords(self) + logger.info(raster_coords) + logger.info("Done getting raster coordinates\n\n") + + logger.info("auto center loop") autocenter_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center' popup_info = ProcessPopup(parent = self, window_title='AutoCenter Info', main_text="Waiting for auto center, view detailed text for more info") @@ -3038,9 +3046,17 @@ def autoCenterLoopCB(self): self.autocenter_process.readyReadStandardOutput.connect(lambda: popup_info.setDetailedText(bytes(self.autocenter_process.readAllStandardOutput()).decode("utf8"))) self.autocenter_process.finished.connect(lambda: popup_info.setText("AUTO CENTERING FINISHED\n\nopen details for more information")) self.autocenter_process.finished.connect(lambda: popup_info.setWindowTitle("Done")) + self.autocenter_process.finished.connect(self.autocenter_process.close()) self.autocenter_process.start(autocenter_call) + logger.info("getting raster coordinates") + raster_coords = self.get_raster_coords(self) + logger.info(raster_coords) + logger.info("Done getting raster coordinates\n\n") + + + # with subprocess.Popen(autocenter_call, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) as p: # for line in p.stdout: @@ -3050,6 +3066,34 @@ def autoCenterLoopCB(self): # raise subprocess.CalledProcessError(p.returncode, p.args) + + def handle_raster_output(self, data): + self.raster_output = data + + + + + + def get_raster_coords(self): + logger.info("getting raster coordinates") + raster_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/get_raster_box' + self.raster_output = None + self.raster_process = QProcess(parent=self) + #self.raster_process.started.connect(lambda: self.raster_process.waitForFinished()) + self.raster_process.finished.connect(lambda: self.handle_raster_output(self.raster_process.readAllStandardOutput().data().decode('utf-8'))) + #self.raster_process.finished.connect(lambda: self.raster_process.close()) + self.raster_process.start(raster_call) + return self.raster_output + + + + + + + + + + def autoRasterLoopCB(self): self.selectedSampleID = self.selectedSampleRequest["sample"] comm_s = "autoRasterLoop(" + str(self.selectedSampleID) + ")" From 52996f9aeb9e84f2a87be62a325c51f9107c1f74 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Fri, 24 May 2024 16:27:27 -0400 Subject: [PATCH 28/46] Update control_main.py --- gui/control_main.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/gui/control_main.py b/gui/control_main.py index 3a98e6d7..5e4550ca 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3030,10 +3030,7 @@ def omegaTweakCB(self, tv): self.popupServerMessage("You don't have control") def autoCenterLoopCB(self): - logger.info("getting raster coordinates") - raster_coords = self.get_raster_coords(self) - logger.info(raster_coords) - logger.info("Done getting raster coordinates\n\n") + logger.info("auto center loop") @@ -3050,10 +3047,10 @@ def autoCenterLoopCB(self): self.autocenter_process.start(autocenter_call) - logger.info("getting raster coordinates") - raster_coords = self.get_raster_coords(self) - logger.info(raster_coords) - logger.info("Done getting raster coordinates\n\n") + # logger.info("getting raster coordinates") + # raster_coords = self.get_raster_coords(self) + # logger.info(raster_coords) + # logger.info("Done getting raster coordinates\n\n") From 00c97f2274287e5ed613a0705c79bb7152e42b05 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Fri, 24 May 2024 16:34:00 -0400 Subject: [PATCH 29/46] fixing resolution dialog --- gui/dialog/resolution_calculator.py | 2 +- gui/dialog/resolution_dialog.py | 132 +++++++++++++++++----------- 2 files changed, 81 insertions(+), 53 deletions(-) diff --git a/gui/dialog/resolution_calculator.py b/gui/dialog/resolution_calculator.py index 394f9ab9..ca7417cd 100644 --- a/gui/dialog/resolution_calculator.py +++ b/gui/dialog/resolution_calculator.py @@ -11,7 +11,7 @@ def __init__(self): self.r = None self.d = None self.L = None - self.theta = None + self.theta = 0 self.wavelength = None def set_all_variables(self, variable_dict): diff --git a/gui/dialog/resolution_dialog.py b/gui/dialog/resolution_dialog.py index f1fab0af..4b6a2268 100644 --- a/gui/dialog/resolution_dialog.py +++ b/gui/dialog/resolution_dialog.py @@ -7,6 +7,7 @@ import sys from gui.dialog import Calculator import typing +import re if typing.TYPE_CHECKING: from lsdcGui import ControlMain @@ -23,42 +24,44 @@ def __init__(self, parent: "ControlMain"): #making radio buttons to choose formula self.buttonDictionary = {'L': {'picker' : QRadioButton('Caluclate crystal to detector distance')}, 'd': {'picker': QRadioButton("Calculate resolution")} , - 'theta': {'picker':QRadioButton("Calculate detector 2theta")}, - 'wavelength': {'picker':QRadioButton("Calculate wavelength")}, + # 'theta': {'picker':QRadioButton("Calculate detector 2theta")}, + 'wavelength': {'picker':QRadioButton("Calculate Energy")}, 'r':{'value':None}} #making lines to hold inputs # self.r_value_enter = QComboBox() - # self.r_value_enter.setToolTip("Detector Distance") - # self.r_value_enter = QLineEdit() - # self.r_value_enter.setPlaceholderText('Set r value (in mm)') + # self.r_value_enter.setToolTip("Choose your detector") + # detectorList = ['NYX-Beamline (200.0mm)?', 'Dectris EIGER2 X 9M (244.7mm)'] + # self.r_value_enter.addItems(detectorList) # self.buttonDictionary['r']['value'] = self.r_value_enter # self.r_value_enter.setCurrentIndex(1) + self.r_value_enter = QComboBox() + self.r_value_enter.addItems(['122.5mm (AMX & NYX)', '164mm (FMX)']) + self.r_value_enter.setPlaceholderText('Set detector radius') + self.buttonDictionary['r']['value'] = self.r_value_enter + #self.r_value_enter.setValidator(QDoubleValidator()) + - self.r_value_enter = QLineEdit() - self.r_value_enter.setPlaceholderText('Set r value') - self.buttonDictionary['r']['value'] = self.r_value_enter - self.r_value_enter.setValidator(QDoubleValidator()) #setting inputs to Double only self.L_value_enter = QLineEdit() - self.L_value_enter.setPlaceholderText('Set L value') + self.L_value_enter.setPlaceholderText('Set crystal to detector distance') self.buttonDictionary['L']['value'] = self.L_value_enter self.L_value_enter.setValidator(QDoubleValidator()) self.d_value_enter = QLineEdit() - self.d_value_enter.setPlaceholderText('Set d value') + self.d_value_enter.setPlaceholderText('Set resolution') self.buttonDictionary['d']['value'] = self.d_value_enter self.d_value_enter.setValidator(QDoubleValidator()) - self.theta_value_enter = QLineEdit() - self.theta_value_enter.setPlaceholderText('Set theta value') - self.buttonDictionary['theta']['value'] = self.theta_value_enter - self.theta_value_enter.setValidator(QDoubleValidator()) + #self.theta_value_enter = QLineEdit() + # self.theta_value_enter.setPlaceholderText('Set detector theta value') + # self.buttonDictionary['theta']['value'] = self.theta_value_enter + #self.theta_value_enter.setValidator(QDoubleValidator()) self.wave_value_enter = QLineEdit() - self.wave_value_enter.setPlaceholderText('Set wavelength value') + self.wave_value_enter.setPlaceholderText('Set energy value') self.buttonDictionary['wavelength']['value'] = self.wave_value_enter self.wave_value_enter.setValidator(QDoubleValidator()) @@ -111,46 +114,54 @@ def calculateValue(self): self.bottom_text.setText("No calculation specified (press one of the radio buttons)") return - #getting values from textboxes r_value text box - # r_value = self.r_value_enter.currentIndex() - # convertValues = [200,244.7] - # # print("r value = {}".format(r_value)) - # #checking if value is a number string or empty string - # r_value = convertValues[r_value] - # r_value = float(r_value) - - r_value = self.r_value_enter.displayText() + + r_value = self.r_value_enter.currentText() # checking if value is a number string or empty string if r_value == "" or r_value[0].isalpha() == True: self.bottom_text.setText("formula to calculate {} requires r value".format(checked_key)) return - elif float(r_value) < 140 or float(r_value) > 350: - self.bottom_text.setText("r value must be between 140 and 350") - return - r_value = float(r_value) + + r_value = convertDetectorRadius(r_value) + + + + #getting values from textboxes r_value text box +# r_value = self.r_value_enter.currentIndex() +# convertValues = [200,244.7] +# # print("r value = {}".format(r_value)) +# #checking if value is a number string or empty string +# r_value = convertValues[r_value] +# r_value = float(r_value) d_value = self.d_value_enter.displayText() #checking if value is string or none if not calculating that value (trying to use .isalpha but not when value is None) if ((d_value == "" or d_value[0].isalpha() == True) and checked_key != 'd') : - self.bottom_text.setText("formula to calculate {} requires d value".format(checked_key)) + self.bottom_text.setText("Formula to calculate {} requires d value".format(checked_key)) return l_value = self.L_value_enter.displayText() if ((l_value == "" or l_value[0].isalpha() == True) and checked_key != 'L'): - self.bottom_text.setText("formula to calculate {} requires L value".format(checked_key)) + self.bottom_text.setText("Formula to calculate {} requires L value.".format(checked_key)) return + elif l_value != '' and checked_key != 'L': + if float(l_value) < 140 or float(l_value) > 350: + self.bottom_text.setText("Detector to crystal distance must be between 140 and 350mm.") + return - theta_value = self.theta_value_enter.displayText() - if ((theta_value == "" or theta_value[0].isalpha() == True)and checked_key != 'theta'): - self.bottom_text.setText("formula to calculate {} requires theta value".format(checked_key)) - return + + + + # theta_value = self.theta_value_enter.displayText() + #if ((theta_value == "" or theta_value[0].isalpha() == True)and checked_key != 'theta'): + # self.bottom_text.setText("formula to calculate {} requires theta value".format(checked_key)) + # return wave_value = self.wave_value_enter.displayText() if ((wave_value == "" or wave_value[0].isalpha() == True) and checked_key != 'wavelength'): - self.bottom_text.setText("formula to calculate {} requires the wavelenght".format(checked_key)) + self.bottom_text.setText("Formula to calculate {} requires the wavelength.".format(checked_key)) return @@ -159,20 +170,23 @@ def calculateValue(self): if checked_key == 'd': l_value = float(self.L_value_enter.displayText()) - theta_value = float(self.theta_value_enter.displayText()) + # theta_value = float(self.theta_value_enter.displayText()) wave_value = float(self.wave_value_enter.displayText()) - variableDict = {'L':l_value, 'theta': theta_value, 'wavelength': wave_value, 'r': r_value} + variableDict = {'L':l_value, + #'theta': theta_value, + 'wavelength': wave_value, 'r': r_value} self.calculator.set_all_variables(variableDict) d_value = self.calculator.calcD() value_to_return = d_value self.d_value_enter.setText(str(d_value)) self.calculator.set_variables('d', d_value) + checked_key = 'Resolution' @@ -180,49 +194,56 @@ def calculateValue(self): elif checked_key == 'L': d_value = float(self.d_value_enter.displayText()) - theta_value = float(self.theta_value_enter.displayText()) + # theta_value = float(self.theta_value_enter.displayText()) wave_value = float(self.wave_value_enter.displayText()) - variableDict = {'d':d_value, 'theta': theta_value, 'wavelength': wave_value, 'r': r_value} + variableDict = {'d':d_value, + #'theta': theta_value, + 'wavelength': wave_value, 'r': r_value} self.calculator.set_all_variables(variableDict) L_value = self.calculator.calcL() value_to_return = L_value self.L_value_enter.setText(str(L_value)) self.calculator.set_variables('L', L_value) + #setting checked key name so that it will change the bottom text + checked_key = 'Detector distance (mm)' - elif checked_key == 'theta': + # elif checked_key == 'theta': - l_value = float(self.L_value_enter.displayText()) - d_value = float(self.d_value_enter.displayText()) - wave_value = float(self.wave_value_enter.displayText()) + # l_value = float(self.L_value_enter.displayText()) + # d_value = float(self.d_value_enter.displayText()) + # wave_value = float(self.wave_value_enter.displayText()) - variableDict = {'L':l_value, 'd': d_value, 'wavelength': wave_value, 'r': r_value} + # variableDict = {'L':l_value, 'd': d_value, 'wavelength': wave_value, 'r': r_value} - self.calculator.set_all_variables(variableDict) - theta_value = self.calculator.calcTheta() - value_to_return = theta_value - self.theta_value_enter.setText(str(theta_value)) - self.calculator.set_variables('theta', theta_value) + # self.calculator.set_all_variables(variableDict) + # # theta_value = self.calculator.calcTheta() + # value_to_return = theta_value + # # self.theta_value_enter.setText(str(theta_value)) + # # self.calculator.set_variables('theta', theta_value) elif checked_key == 'wavelength': l_value = float(self.L_value_enter.displayText()) - theta_value = float(self.theta_value_enter.displayText()) + # theta_value = float(self.theta_value_enter.displayText()) d_value = float(self.d_value_enter.displayText()) - variableDict = {'L':l_value, 'd': d_value, 'theta': theta_value, 'r': r_value} + variableDict = {'L':l_value, 'd': d_value, + #'theta': theta_value, + 'r': r_value} self.calculator.set_all_variables(variableDict) wave_value = self.calculator.calcWavelength() self.calculator.set_variables('wavelength', wave_value) value_to_return = wave_value self.wave_value_enter.setText(str(wave_value)) + checked_key = 'Energy' @@ -235,6 +256,13 @@ def calculateValue(self): return value_to_return +def convertDetectorRadius(inputText): + number = inputText[:inputText.find('mm')] + return float(number) + + + + From ae93a6740bb493a8dfa6f7b0884bc3476d1f504e Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 10:09:38 -0400 Subject: [PATCH 30/46] quick test --- gui/control_main.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/gui/control_main.py b/gui/control_main.py index 5e4550ca..3a98e6d7 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3030,7 +3030,10 @@ def omegaTweakCB(self, tv): self.popupServerMessage("You don't have control") def autoCenterLoopCB(self): - + logger.info("getting raster coordinates") + raster_coords = self.get_raster_coords(self) + logger.info(raster_coords) + logger.info("Done getting raster coordinates\n\n") logger.info("auto center loop") @@ -3047,10 +3050,10 @@ def autoCenterLoopCB(self): self.autocenter_process.start(autocenter_call) - # logger.info("getting raster coordinates") - # raster_coords = self.get_raster_coords(self) - # logger.info(raster_coords) - # logger.info("Done getting raster coordinates\n\n") + logger.info("getting raster coordinates") + raster_coords = self.get_raster_coords(self) + logger.info(raster_coords) + logger.info("Done getting raster coordinates\n\n") From e47395aea4f0821a0533278395617778d8397e23 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 10:23:24 -0400 Subject: [PATCH 31/46] fixing test function call --- gui/control_main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/control_main.py b/gui/control_main.py index 3a98e6d7..e570a750 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3031,7 +3031,7 @@ def omegaTweakCB(self, tv): def autoCenterLoopCB(self): logger.info("getting raster coordinates") - raster_coords = self.get_raster_coords(self) + raster_coords = self.get_raster_coords() logger.info(raster_coords) logger.info("Done getting raster coordinates\n\n") @@ -3051,7 +3051,7 @@ def autoCenterLoopCB(self): logger.info("getting raster coordinates") - raster_coords = self.get_raster_coords(self) + raster_coords = self.get_raster_coords() logger.info(raster_coords) logger.info("Done getting raster coordinates\n\n") From 73e187829a1eee4e74e5c65049ce94588c8d71ef Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 10:28:13 -0400 Subject: [PATCH 32/46] no response from raster so adding the waitforfinished call --- gui/control_main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/control_main.py b/gui/control_main.py index e570a750..db7a19a9 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3046,7 +3046,7 @@ def autoCenterLoopCB(self): self.autocenter_process.readyReadStandardOutput.connect(lambda: popup_info.setDetailedText(bytes(self.autocenter_process.readAllStandardOutput()).decode("utf8"))) self.autocenter_process.finished.connect(lambda: popup_info.setText("AUTO CENTERING FINISHED\n\nopen details for more information")) self.autocenter_process.finished.connect(lambda: popup_info.setWindowTitle("Done")) - self.autocenter_process.finished.connect(self.autocenter_process.close()) + self.autocenter_process.start(autocenter_call) @@ -3079,7 +3079,7 @@ def get_raster_coords(self): raster_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/get_raster_box' self.raster_output = None self.raster_process = QProcess(parent=self) - #self.raster_process.started.connect(lambda: self.raster_process.waitForFinished()) + self.raster_process.started.connect(lambda: self.raster_process.waitForFinished()) self.raster_process.finished.connect(lambda: self.handle_raster_output(self.raster_process.readAllStandardOutput().data().decode('utf-8'))) #self.raster_process.finished.connect(lambda: self.raster_process.close()) self.raster_process.start(raster_call) From 2e10da1ea3ee1e931b819affe692ef90c5865d69 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 10:32:07 -0400 Subject: [PATCH 33/46] Update control_main.py --- gui/control_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index db7a19a9..3c5a62c2 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3077,10 +3077,10 @@ def handle_raster_output(self, data): def get_raster_coords(self): logger.info("getting raster coordinates") raster_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/get_raster_box' - self.raster_output = None self.raster_process = QProcess(parent=self) self.raster_process.started.connect(lambda: self.raster_process.waitForFinished()) self.raster_process.finished.connect(lambda: self.handle_raster_output(self.raster_process.readAllStandardOutput().data().decode('utf-8'))) + self.raster_process.finished.connect(lambda: logger.info(self.raster_process.readAllStandardOutput().data().decode('utf-8'))) #self.raster_process.finished.connect(lambda: self.raster_process.close()) self.raster_process.start(raster_call) return self.raster_output From f016b5bc6ebf3eb64a2d0d292609a968919423cc Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 10:38:29 -0400 Subject: [PATCH 34/46] removed one connect from raster call --- gui/control_main.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gui/control_main.py b/gui/control_main.py index 3c5a62c2..34ae2fac 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3052,7 +3052,7 @@ def autoCenterLoopCB(self): logger.info("getting raster coordinates") raster_coords = self.get_raster_coords() - logger.info(raster_coords) + logger.info(self.raster_output) logger.info("Done getting raster coordinates\n\n") @@ -3080,7 +3080,6 @@ def get_raster_coords(self): self.raster_process = QProcess(parent=self) self.raster_process.started.connect(lambda: self.raster_process.waitForFinished()) self.raster_process.finished.connect(lambda: self.handle_raster_output(self.raster_process.readAllStandardOutput().data().decode('utf-8'))) - self.raster_process.finished.connect(lambda: logger.info(self.raster_process.readAllStandardOutput().data().decode('utf-8'))) #self.raster_process.finished.connect(lambda: self.raster_process.close()) self.raster_process.start(raster_call) return self.raster_output From 5dca6df9f9a1d42b336a543339e37c8899702c79 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 11:02:16 -0400 Subject: [PATCH 35/46] Update control_main.py --- gui/control_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index 34ae2fac..ba4fa5b0 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3078,7 +3078,7 @@ def get_raster_coords(self): logger.info("getting raster coordinates") raster_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/get_raster_box' self.raster_process = QProcess(parent=self) - self.raster_process.started.connect(lambda: self.raster_process.waitForFinished()) + self.raster_process.waitForFinished() self.raster_process.finished.connect(lambda: self.handle_raster_output(self.raster_process.readAllStandardOutput().data().decode('utf-8'))) #self.raster_process.finished.connect(lambda: self.raster_process.close()) self.raster_process.start(raster_call) From db93915c4bc298f6aea94bed3a7db64e651366cf Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 11:08:59 -0400 Subject: [PATCH 36/46] Update control_main.py --- gui/control_main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index ba4fa5b0..327d95b5 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3077,9 +3077,10 @@ def handle_raster_output(self, data): def get_raster_coords(self): logger.info("getting raster coordinates") raster_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/get_raster_box' + self.raster_output = None self.raster_process = QProcess(parent=self) self.raster_process.waitForFinished() - self.raster_process.finished.connect(lambda: self.handle_raster_output(self.raster_process.readAllStandardOutput().data().decode('utf-8'))) + self.raster_process.finished.connect(lambda: self.handle_raster_output(self.raster_process.readAllStandardOutput().decode('utf-8'))) #self.raster_process.finished.connect(lambda: self.raster_process.close()) self.raster_process.start(raster_call) return self.raster_output From 00d1fa2815c1eb7814fef6f19d7647fcaa39abb9 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 11:13:32 -0400 Subject: [PATCH 37/46] fixing wait for finish --- gui/control_main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index 327d95b5..a11fcb5f 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3079,10 +3079,11 @@ def get_raster_coords(self): raster_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/get_raster_box' self.raster_output = None self.raster_process = QProcess(parent=self) - self.raster_process.waitForFinished() + self.raster_process.finished.connect(lambda: self.handle_raster_output(self.raster_process.readAllStandardOutput().decode('utf-8'))) #self.raster_process.finished.connect(lambda: self.raster_process.close()) self.raster_process.start(raster_call) + self.raster_process.waitForFinished() return self.raster_output From 71d7fe7022c3bc8055fea64e0abe6f4bbf509822 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 11:14:55 -0400 Subject: [PATCH 38/46] Update control_main.py --- gui/control_main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index a11fcb5f..95b36967 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3048,6 +3048,7 @@ def autoCenterLoopCB(self): self.autocenter_process.finished.connect(lambda: popup_info.setWindowTitle("Done")) self.autocenter_process.start(autocenter_call) + self.autocenter_process.waitForFinished() logger.info("getting raster coordinates") @@ -3080,7 +3081,7 @@ def get_raster_coords(self): self.raster_output = None self.raster_process = QProcess(parent=self) - self.raster_process.finished.connect(lambda: self.handle_raster_output(self.raster_process.readAllStandardOutput().decode('utf-8'))) + self.raster_process.finished.connect(lambda: self.handle_raster_output(self.raster_process.readAllStandardOutput().data().decode('utf-8'))) #self.raster_process.finished.connect(lambda: self.raster_process.close()) self.raster_process.start(raster_call) self.raster_process.waitForFinished() From 49566a35f3828a7a72da7674b6aedde23294778f Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 11:17:10 -0400 Subject: [PATCH 39/46] removing wait for finished on autocenter waitfor finished on autocenter process will just hang the gui and stop everything (do not do) the waitforfinished on a Qprocess will presumably hang the gui if not done from a widget as the parent? --- gui/control_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index 95b36967..18482c3c 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3048,7 +3048,7 @@ def autoCenterLoopCB(self): self.autocenter_process.finished.connect(lambda: popup_info.setWindowTitle("Done")) self.autocenter_process.start(autocenter_call) - self.autocenter_process.waitForFinished() + logger.info("getting raster coordinates") From 36e5c20220762bf6457b7c34c958fedaeac55702 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 11:18:46 -0400 Subject: [PATCH 40/46] more testing this under the autocenter messes it up for some reason --- gui/control_main.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/gui/control_main.py b/gui/control_main.py index 18482c3c..ff471775 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3051,12 +3051,6 @@ def autoCenterLoopCB(self): - logger.info("getting raster coordinates") - raster_coords = self.get_raster_coords() - logger.info(self.raster_output) - logger.info("Done getting raster coordinates\n\n") - - # with subprocess.Popen(autocenter_call, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) as p: # for line in p.stdout: From 452014ddd76363ae4349888cd9776f3edc92cb7a Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 11:21:07 -0400 Subject: [PATCH 41/46] returning to normal --- gui/control_main.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/gui/control_main.py b/gui/control_main.py index ff471775..1a9ec21b 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -3030,11 +3030,6 @@ def omegaTweakCB(self, tv): self.popupServerMessage("You don't have control") def autoCenterLoopCB(self): - logger.info("getting raster coordinates") - raster_coords = self.get_raster_coords() - logger.info(raster_coords) - logger.info("Done getting raster coordinates\n\n") - logger.info("auto center loop") autocenter_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center' From f45c135aa3992c31bdcac95b3566c7552b01a21b Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 11:27:02 -0400 Subject: [PATCH 42/46] Update resolution_dialog.py --- gui/dialog/resolution_dialog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/dialog/resolution_dialog.py b/gui/dialog/resolution_dialog.py index 4b6a2268..7b504d05 100644 --- a/gui/dialog/resolution_dialog.py +++ b/gui/dialog/resolution_dialog.py @@ -37,7 +37,7 @@ def __init__(self, parent: "ControlMain"): # self.r_value_enter.setCurrentIndex(1) self.r_value_enter = QComboBox() self.r_value_enter.addItems(['122.5mm (AMX & NYX)', '164mm (FMX)']) - self.r_value_enter.setPlaceholderText('Set detector radius') + self.r_value_enter.setCurrentIndex(0) self.buttonDictionary['r']['value'] = self.r_value_enter #self.r_value_enter.setValidator(QDoubleValidator()) From 6ce03a90433811deada9d24d5dd4201f5a592689 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 11:30:16 -0400 Subject: [PATCH 43/46] Update resolution_dialog.py --- gui/dialog/resolution_dialog.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gui/dialog/resolution_dialog.py b/gui/dialog/resolution_dialog.py index 7b504d05..dc38681a 100644 --- a/gui/dialog/resolution_dialog.py +++ b/gui/dialog/resolution_dialog.py @@ -30,12 +30,13 @@ def __init__(self, parent: "ControlMain"): #making lines to hold inputs # self.r_value_enter = QComboBox() - # self.r_value_enter.setToolTip("Choose your detector") + # detectorList = ['NYX-Beamline (200.0mm)?', 'Dectris EIGER2 X 9M (244.7mm)'] # self.r_value_enter.addItems(detectorList) # self.buttonDictionary['r']['value'] = self.r_value_enter # self.r_value_enter.setCurrentIndex(1) self.r_value_enter = QComboBox() + self.r_value_enter.setToolTip("Choose your detector") self.r_value_enter.addItems(['122.5mm (AMX & NYX)', '164mm (FMX)']) self.r_value_enter.setCurrentIndex(0) self.buttonDictionary['r']['value'] = self.r_value_enter From fc59b786f338b16e5b3ece8a5d8e8fa9a4f41c8a Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 28 May 2024 11:39:50 -0400 Subject: [PATCH 44/46] restoring resolution diolog, will add later --- gui/dialog/resolution_calculator.py | 2 +- gui/dialog/resolution_dialog.py | 133 +++++++++++----------------- 2 files changed, 53 insertions(+), 82 deletions(-) diff --git a/gui/dialog/resolution_calculator.py b/gui/dialog/resolution_calculator.py index ca7417cd..394f9ab9 100644 --- a/gui/dialog/resolution_calculator.py +++ b/gui/dialog/resolution_calculator.py @@ -11,7 +11,7 @@ def __init__(self): self.r = None self.d = None self.L = None - self.theta = 0 + self.theta = None self.wavelength = None def set_all_variables(self, variable_dict): diff --git a/gui/dialog/resolution_dialog.py b/gui/dialog/resolution_dialog.py index dc38681a..f1fab0af 100644 --- a/gui/dialog/resolution_dialog.py +++ b/gui/dialog/resolution_dialog.py @@ -7,7 +7,6 @@ import sys from gui.dialog import Calculator import typing -import re if typing.TYPE_CHECKING: from lsdcGui import ControlMain @@ -24,45 +23,42 @@ def __init__(self, parent: "ControlMain"): #making radio buttons to choose formula self.buttonDictionary = {'L': {'picker' : QRadioButton('Caluclate crystal to detector distance')}, 'd': {'picker': QRadioButton("Calculate resolution")} , - # 'theta': {'picker':QRadioButton("Calculate detector 2theta")}, - 'wavelength': {'picker':QRadioButton("Calculate Energy")}, + 'theta': {'picker':QRadioButton("Calculate detector 2theta")}, + 'wavelength': {'picker':QRadioButton("Calculate wavelength")}, 'r':{'value':None}} #making lines to hold inputs # self.r_value_enter = QComboBox() - - # detectorList = ['NYX-Beamline (200.0mm)?', 'Dectris EIGER2 X 9M (244.7mm)'] - # self.r_value_enter.addItems(detectorList) + # self.r_value_enter.setToolTip("Detector Distance") + # self.r_value_enter = QLineEdit() + # self.r_value_enter.setPlaceholderText('Set r value (in mm)') # self.buttonDictionary['r']['value'] = self.r_value_enter # self.r_value_enter.setCurrentIndex(1) - self.r_value_enter = QComboBox() - self.r_value_enter.setToolTip("Choose your detector") - self.r_value_enter.addItems(['122.5mm (AMX & NYX)', '164mm (FMX)']) - self.r_value_enter.setCurrentIndex(0) - self.buttonDictionary['r']['value'] = self.r_value_enter - #self.r_value_enter.setValidator(QDoubleValidator()) - + self.r_value_enter = QLineEdit() + self.r_value_enter.setPlaceholderText('Set r value') + self.buttonDictionary['r']['value'] = self.r_value_enter + self.r_value_enter.setValidator(QDoubleValidator()) #setting inputs to Double only self.L_value_enter = QLineEdit() - self.L_value_enter.setPlaceholderText('Set crystal to detector distance') + self.L_value_enter.setPlaceholderText('Set L value') self.buttonDictionary['L']['value'] = self.L_value_enter self.L_value_enter.setValidator(QDoubleValidator()) self.d_value_enter = QLineEdit() - self.d_value_enter.setPlaceholderText('Set resolution') + self.d_value_enter.setPlaceholderText('Set d value') self.buttonDictionary['d']['value'] = self.d_value_enter self.d_value_enter.setValidator(QDoubleValidator()) - #self.theta_value_enter = QLineEdit() - # self.theta_value_enter.setPlaceholderText('Set detector theta value') - # self.buttonDictionary['theta']['value'] = self.theta_value_enter - #self.theta_value_enter.setValidator(QDoubleValidator()) + self.theta_value_enter = QLineEdit() + self.theta_value_enter.setPlaceholderText('Set theta value') + self.buttonDictionary['theta']['value'] = self.theta_value_enter + self.theta_value_enter.setValidator(QDoubleValidator()) self.wave_value_enter = QLineEdit() - self.wave_value_enter.setPlaceholderText('Set energy value') + self.wave_value_enter.setPlaceholderText('Set wavelength value') self.buttonDictionary['wavelength']['value'] = self.wave_value_enter self.wave_value_enter.setValidator(QDoubleValidator()) @@ -115,54 +111,46 @@ def calculateValue(self): self.bottom_text.setText("No calculation specified (press one of the radio buttons)") return - - r_value = self.r_value_enter.currentText() + #getting values from textboxes r_value text box + # r_value = self.r_value_enter.currentIndex() + # convertValues = [200,244.7] + # # print("r value = {}".format(r_value)) + # #checking if value is a number string or empty string + # r_value = convertValues[r_value] + # r_value = float(r_value) + + r_value = self.r_value_enter.displayText() # checking if value is a number string or empty string if r_value == "" or r_value[0].isalpha() == True: self.bottom_text.setText("formula to calculate {} requires r value".format(checked_key)) return + elif float(r_value) < 140 or float(r_value) > 350: + self.bottom_text.setText("r value must be between 140 and 350") + return - - r_value = convertDetectorRadius(r_value) - - - - #getting values from textboxes r_value text box -# r_value = self.r_value_enter.currentIndex() -# convertValues = [200,244.7] -# # print("r value = {}".format(r_value)) -# #checking if value is a number string or empty string -# r_value = convertValues[r_value] -# r_value = float(r_value) + r_value = float(r_value) d_value = self.d_value_enter.displayText() #checking if value is string or none if not calculating that value (trying to use .isalpha but not when value is None) if ((d_value == "" or d_value[0].isalpha() == True) and checked_key != 'd') : - self.bottom_text.setText("Formula to calculate {} requires d value".format(checked_key)) + self.bottom_text.setText("formula to calculate {} requires d value".format(checked_key)) return l_value = self.L_value_enter.displayText() if ((l_value == "" or l_value[0].isalpha() == True) and checked_key != 'L'): - self.bottom_text.setText("Formula to calculate {} requires L value.".format(checked_key)) + self.bottom_text.setText("formula to calculate {} requires L value".format(checked_key)) return - elif l_value != '' and checked_key != 'L': - if float(l_value) < 140 or float(l_value) > 350: - self.bottom_text.setText("Detector to crystal distance must be between 140 and 350mm.") - return - - - - # theta_value = self.theta_value_enter.displayText() - #if ((theta_value == "" or theta_value[0].isalpha() == True)and checked_key != 'theta'): - # self.bottom_text.setText("formula to calculate {} requires theta value".format(checked_key)) - # return + theta_value = self.theta_value_enter.displayText() + if ((theta_value == "" or theta_value[0].isalpha() == True)and checked_key != 'theta'): + self.bottom_text.setText("formula to calculate {} requires theta value".format(checked_key)) + return wave_value = self.wave_value_enter.displayText() if ((wave_value == "" or wave_value[0].isalpha() == True) and checked_key != 'wavelength'): - self.bottom_text.setText("Formula to calculate {} requires the wavelength.".format(checked_key)) + self.bottom_text.setText("formula to calculate {} requires the wavelenght".format(checked_key)) return @@ -171,23 +159,20 @@ def calculateValue(self): if checked_key == 'd': l_value = float(self.L_value_enter.displayText()) - # theta_value = float(self.theta_value_enter.displayText()) + theta_value = float(self.theta_value_enter.displayText()) wave_value = float(self.wave_value_enter.displayText()) - variableDict = {'L':l_value, - #'theta': theta_value, - 'wavelength': wave_value, 'r': r_value} + variableDict = {'L':l_value, 'theta': theta_value, 'wavelength': wave_value, 'r': r_value} self.calculator.set_all_variables(variableDict) d_value = self.calculator.calcD() value_to_return = d_value self.d_value_enter.setText(str(d_value)) self.calculator.set_variables('d', d_value) - checked_key = 'Resolution' @@ -195,56 +180,49 @@ def calculateValue(self): elif checked_key == 'L': d_value = float(self.d_value_enter.displayText()) - # theta_value = float(self.theta_value_enter.displayText()) + theta_value = float(self.theta_value_enter.displayText()) wave_value = float(self.wave_value_enter.displayText()) - variableDict = {'d':d_value, - #'theta': theta_value, - 'wavelength': wave_value, 'r': r_value} + variableDict = {'d':d_value, 'theta': theta_value, 'wavelength': wave_value, 'r': r_value} self.calculator.set_all_variables(variableDict) L_value = self.calculator.calcL() value_to_return = L_value self.L_value_enter.setText(str(L_value)) self.calculator.set_variables('L', L_value) - #setting checked key name so that it will change the bottom text - checked_key = 'Detector distance (mm)' - # elif checked_key == 'theta': + elif checked_key == 'theta': - # l_value = float(self.L_value_enter.displayText()) - # d_value = float(self.d_value_enter.displayText()) - # wave_value = float(self.wave_value_enter.displayText()) + l_value = float(self.L_value_enter.displayText()) + d_value = float(self.d_value_enter.displayText()) + wave_value = float(self.wave_value_enter.displayText()) - # variableDict = {'L':l_value, 'd': d_value, 'wavelength': wave_value, 'r': r_value} + variableDict = {'L':l_value, 'd': d_value, 'wavelength': wave_value, 'r': r_value} - # self.calculator.set_all_variables(variableDict) - # # theta_value = self.calculator.calcTheta() - # value_to_return = theta_value - # # self.theta_value_enter.setText(str(theta_value)) - # # self.calculator.set_variables('theta', theta_value) + self.calculator.set_all_variables(variableDict) + theta_value = self.calculator.calcTheta() + value_to_return = theta_value + self.theta_value_enter.setText(str(theta_value)) + self.calculator.set_variables('theta', theta_value) elif checked_key == 'wavelength': l_value = float(self.L_value_enter.displayText()) - # theta_value = float(self.theta_value_enter.displayText()) + theta_value = float(self.theta_value_enter.displayText()) d_value = float(self.d_value_enter.displayText()) - variableDict = {'L':l_value, 'd': d_value, - #'theta': theta_value, - 'r': r_value} + variableDict = {'L':l_value, 'd': d_value, 'theta': theta_value, 'r': r_value} self.calculator.set_all_variables(variableDict) wave_value = self.calculator.calcWavelength() self.calculator.set_variables('wavelength', wave_value) value_to_return = wave_value self.wave_value_enter.setText(str(wave_value)) - checked_key = 'Energy' @@ -257,13 +235,6 @@ def calculateValue(self): return value_to_return -def convertDetectorRadius(inputText): - number = inputText[:inputText.find('mm')] - return float(number) - - - - From c6612aeede93736445c025cf72d6ad07865cede3 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Wed, 5 Jun 2024 11:46:36 -0400 Subject: [PATCH 45/46] Update control_main.py --- gui/control_main.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index 1a9ec21b..736eaac4 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -1259,6 +1259,7 @@ def createSampleTab(self): hBoxSampleAlignLayout = QtWidgets.QHBoxLayout() centerLoopButton = QtWidgets.QPushButton("Center\nLoop") centerLoopButton.clicked.connect(self.autoCenterLoopCB) + self.auto_center_ongoing = False measureButton = QtWidgets.QPushButton("Measure") measureButton.clicked.connect(self.measurePolyCB) loopShapeButton = QtWidgets.QPushButton("Add Raster\nto Queue") @@ -3030,7 +3031,9 @@ def omegaTweakCB(self, tv): self.popupServerMessage("You don't have control") def autoCenterLoopCB(self): - + if self.auto_center_ongoing == True: + self.popupServerMessage("Auto center is already running") + return logger.info("auto center loop") autocenter_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/run_auto_center' popup_info = ProcessPopup(parent = self, window_title='AutoCenter Info', main_text="Waiting for auto center, view detailed text for more info") @@ -3041,8 +3044,10 @@ def autoCenterLoopCB(self): self.autocenter_process.readyReadStandardOutput.connect(lambda: popup_info.setDetailedText(bytes(self.autocenter_process.readAllStandardOutput()).decode("utf8"))) self.autocenter_process.finished.connect(lambda: popup_info.setText("AUTO CENTERING FINISHED\n\nopen details for more information")) self.autocenter_process.finished.connect(lambda: popup_info.setWindowTitle("Done")) + self.autocenter_process.finished.connect(self.close_autocenter) self.autocenter_process.start(autocenter_call) + self.auto_center_ongoing = True @@ -3056,6 +3061,10 @@ def autoCenterLoopCB(self): # raise subprocess.CalledProcessError(p.returncode, p.args) + def close_autocenter(self): + self.auto_center_ongoing = False + self.autocenter_process.close() + def handle_raster_output(self, data): self.raster_output = data From 4f4bcc7f80f44bc792041662b661d7bbcd5b55d9 Mon Sep 17 00:00:00 2001 From: NYSBC-Rudra <133771854+NYSBC-Rudra@users.noreply.github.com> Date: Tue, 11 Jun 2024 13:07:35 -0400 Subject: [PATCH 46/46] Update control_main.py --- gui/control_main.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/gui/control_main.py b/gui/control_main.py index 736eaac4..8f106db9 100644 --- a/gui/control_main.py +++ b/gui/control_main.py @@ -1259,7 +1259,7 @@ def createSampleTab(self): hBoxSampleAlignLayout = QtWidgets.QHBoxLayout() centerLoopButton = QtWidgets.QPushButton("Center\nLoop") centerLoopButton.clicked.connect(self.autoCenterLoopCB) - self.auto_center_ongoing = False + self.init_autocenter() measureButton = QtWidgets.QPushButton("Measure") measureButton.clicked.connect(self.measurePolyCB) loopShapeButton = QtWidgets.QPushButton("Add Raster\nto Queue") @@ -3060,6 +3060,13 @@ def autoCenterLoopCB(self): # if p.returncode != 0: # raise subprocess.CalledProcessError(p.returncode, p.args) + def init_autocenter(self): + self.autocenter_process = QProcess(parent=self) + pythondir = '/opt/conda_envs/lsdc-gui-2023-2-latest/bin/python3' + autocenter_call = '/nsls2/data/nyx/legacy/Rudra/lsdcSpoofer/autocenter_lucid.py' + self.autocenter_process.finished.connect(self.close_autocenter) + self.autocenter_process.start('{} {}'.format(pythondir, autocenter_call)) + self.auto_center_ongoing = True def close_autocenter(self): self.auto_center_ongoing = False