class SecondSystemDialog(wx.Dialog): def __init__(self, parent, id, flag=None): #flag es una variable que indica si el calculo es de caida de presion o de diametro self.prevReturnCode = None self.systemValues = {} wx.Dialog.__init__(self, parent, id, self.secondSystemDialogGeneralText()["c1"], size=(460, 350)) self.panel = wx.Panel(self, -1) vbox = wx.BoxSizer(wx.VERTICAL) firstList = self.secondSystemDialogGeneralText()["c2"] self.radioBox1 = wx.RadioBox(self.panel, -1, self.secondSystemDialogGeneralText()["c3"], (50, 10), (100, 70), firstList, 1, wx.RA_SPECIFY_COLS) secondList = self.secondSystemDialogGeneralText()["c4"] self.radioBox2 = wx.RadioBox(self.panel, -1, self.secondSystemDialogGeneralText()["c5"], (300, 10), (100, 70), secondList, 2, wx.RA_SPECIFY_COLS) ### flow label value and units self.flowLabel = wx.StaticText(self.panel, -1, self.secondSystemDialogGeneralText()["c6"], pos=(10, 94)) self.flowValue = NumCtrl(self.panel, -1, pos=(10, 110), integerWidth = 7, fractionWidth = 2) self.flowValue.SetMin(0.01) self.flowValue.SetValue(0.01) flowUnitList = self.secondSystemDialogGeneralText()["c7"] self.flowUnit = wx.Choice(self.panel, -1, (115, 110), choices=flowUnitList) ### temperature label value and units self.temperatureLabel = wx.StaticText(self.panel, -1, self.secondSystemDialogGeneralText()["c8"], pos=(10, 140)) self.temperatureValue = NumCtrl(self.panel, -1, pos=(10, 156), integerWidth = 7, fractionWidth = 2)#, SetMin=0.01, SetMax=373.94) self.temperatureValue.SetMin(0.01) self.temperatureValue.SetMax(373.94) self.temperatureValue.SetLimitOnFieldChange(True) self.temperatureValue.SetValue(0.01) temperatureUnitList = self.secondSystemDialogGeneralText()["c9"] self.temperatureUnit = wx.Choice(self.panel, -1, (115, 156), choices=temperatureUnitList) self.temperatureUnit.Bind(wx.EVT_CHOICE, self.onTemperatureUnitChange) ### density label value and units self.densityLabel = wx.StaticText(self.panel, -1, self.secondSystemDialogGeneralText()["c10"], pos=(10, 186)) self.densityValue = NumCtrl(self.panel, -1, pos=(10, 202), integerWidth = 4, fractionWidth = 2) self.densityValue.SetMin(0.01) self.densityValue.SetValue(0.01) densityUnitList = self.secondSystemDialogGeneralText()["c11"] self.densityUnit = wx.Choice(self.panel, -1, (115, 202), choices=densityUnitList) self.densityLabel.Enable(False) self.densityUnit.Enable(False) self.densityValue.Enable(False) ### viscosity label value and units self.viscosityLabel = wx.StaticText(self.panel, -1, self.secondSystemDialogGeneralText()["c12"], pos=(10, 228)) self.viscosityValue = NumCtrl(self.panel, -1, pos=(10, 244), integerWidth = 3, fractionWidth = 7) self.viscosityValue.SetMin(0.0000001) self.viscosityValue.SetValue(0.0000001) viscosityUnitList = self.secondSystemDialogGeneralText()["c13"] self.viscosityUnit = wx.Choice(self.panel, -1, (115, 244), choices=viscosityUnitList) self.viscosityLabel.Enable(False) self.viscosityUnit.Enable(False) self.viscosityValue.Enable(False) ### roughness label value and units self.roughnessLabel = wx.StaticText(self.panel, -1, self.secondSystemDialogGeneralText()["c14"], pos=(260, 94)) self.roughnessValue = NumCtrl(self.panel, -1, pos=(260, 110), integerWidth = 1, fractionWidth = 7) self.roughnessValue.SetMin(0.0000001) self.roughnessValue.SetValue(0.0000001) roughnessUnitList = self.secondSystemDialogGeneralText()["c15"] self.roughnessUnit = wx.Choice(self.panel, -1, (345, 110), choices=roughnessUnitList) self.roughnessLabel.Enable(False) self.roughnessUnit.Enable(False) self.roughnessValue.Enable(False) ### pressure drop label value and units self.pressureDropLabel = wx.StaticText(self.panel, -1, self.secondSystemDialogGeneralText()["c23"], pos=(260, 140)) self.pressureDropValue = NumCtrl(self.panel, -1, pos=(260, 156), integerWidth = 7, fractionWidth = 3) self.pressureDropValue.SetMin(0.01) self.pressureDropValue.SetValue(0.01) pressureDropUnitList = self.secondSystemDialogGeneralText()["c24"] self.pressureDropUnit = wx.Choice(self.panel, -1, (370, 156), choices=pressureDropUnitList) if flag: self.pressureDropLabel.Enable(True) self.pressureDropUnit.Enable(True) self.pressureDropValue.Enable(True) else: self.pressureDropLabel.Enable(False) self.pressureDropUnit.Enable(False) self.pressureDropValue.Enable(False) self.radioBox1.Bind(wx.EVT_RADIOBOX, self.onRadioBox1) self.radioBox2.Bind(wx.EVT_RADIOBOX, self.onRadioBox2) hbox = wx.BoxSizer(wx.HORIZONTAL) self.prevButton = wx.Button(self, -1, self.secondSystemDialogGeneralText()["c16"], size=(70, 30)) self.cancelButton = wx.Button(self, -1, self.secondSystemDialogGeneralText()["c17"], size=(70, 30)) self.nextButton = wx.Button(self, -1, self.secondSystemDialogGeneralText()["c18"], size=(70, 30)) self.prevButton.Bind(wx.EVT_BUTTON, self.onPrev) self.cancelButton.Bind(wx.EVT_BUTTON, self.onCancel) self.nextButton.Bind(wx.EVT_BUTTON, self.onNext) hbox.Add(self.prevButton, 1 ) hbox.Add(self.nextButton, 1, wx.LEFT, 5) hbox.Add(self.cancelButton, 1, wx.LEFT, 5) vbox.Add(self.panel) vbox.Add(hbox, 1, wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, 10) self.SetSizer(vbox) self.nextButton.SetDefault() #set the nextButton as default self.Bind(wx.EVT_CLOSE, self.onCancel) #bind the window close icon on the top right corner of the window def onTemperatureUnitChange(self, evt): unitSelected = self.temperatureUnit.GetStringSelection() if unitSelected == "F": self.temperatureValue.SetMin(32.02) self.temperatureValue.SetMax(705.1) self.temperatureValue.SetValue(32.02) elif unitSelected == "C": self.temperatureValue.SetMin(0.01) self.temperatureValue.SetMax(373.94) self.temperatureValue.SetValue(0.01) pass def onRadioBox1(self, evt): selected = self.radioBox1.GetSelection() if selected == 0: self.densityLabel.Enable(False) self.densityUnit.Enable(False) self.densityValue.Enable(False) self.viscosityLabel.Enable(False) self.viscosityUnit.Enable(False) self.viscosityValue.Enable(False) self.temperatureLabel.Enable() self.temperatureUnit.Enable() self.temperatureValue.Enable() elif selected == 1: self.temperatureLabel.Enable(False) self.temperatureUnit.Enable(False) self.temperatureValue.Enable(False) self.densityLabel.Enable() self.densityUnit.Enable() self.densityValue.Enable() self.viscosityLabel.Enable() self.viscosityUnit.Enable() self.viscosityValue.Enable() else: pass def onRadioBox2(self, evt): selected = self.radioBox2.GetSelection() if (selected == 0 or selected == 1 or selected == 2): self.roughnessLabel.Enable(False) self.roughnessUnit.Enable(False) self.roughnessValue.Enable(False) elif selected == 3: self.roughnessLabel.Enable() self.roughnessUnit.Enable() self.roughnessValue.Enable() else: pass def onCancel(self, evt): self.EndModal(wx.ID_CANCEL) def onPrev(self, evt): self.prevReturnCode = wx.NewId() self.EndModal(self.prevReturnCode) def onNext(self, evt): radioBox1Selection = self.radioBox1.GetSelection() radioBox2Selection = self.radioBox2.GetSelection() okToClose = [False, False, False] #begin segmento para la caida de presion if self.pressureDropValue.IsEnabled(): #si el calculo es para diametro minimo if self.pressureDropUnit.GetSelection() == -1: #si no se ha especificado valor en las unidades de caida de presion dialog = wx.MessageDialog(self.panel, self.secondSystemDialogGeneralText()["c25"], self.secondSystemDialogGeneralText()["c26"], style=wx.OK | wx.ICON_EXCLAMATION) dialog.ShowModal() dialog.Destroy() okToClose[2] = False else: self.systemValues["pressure_drop"] = self.pressureDropValue.GetValue() self.systemValues["pressure_drop_unit"] = self.pressureDropUnit.GetStringSelection() okToClose[2] = True #end segmento para la caida de presion if radioBox1Selection == 0: if (self.flowUnit.GetSelection() == -1 or self.temperatureUnit.GetSelection() == -1): dialog = wx.MessageDialog(self.panel, self.secondSystemDialogGeneralText()["c19"], self.secondSystemDialogGeneralText()["c20"], style=wx.OK | wx.ICON_EXCLAMATION) dialog.ShowModal() dialog.Destroy() okToClose[0] = False else: self.systemValues["water"] = "yes" self.systemValues["flow"] = self.flowValue.GetValue() self.systemValues["flow_unit"] = self.flowUnit.GetStringSelection() self.systemValues["temperature"] = self.temperatureValue.GetValue() self.systemValues["temperature_unit"] = self.temperatureUnit.GetStringSelection() okToClose[0] = True elif radioBox1Selection == 1: if (self.flowUnit.GetSelection() == -1 or self.viscosityUnit.GetSelection() == -1 or self.densityUnit.GetSelection() == -1): dialog = wx.MessageDialog(self.panel, self.secondSystemDialogGeneralText()["c21"], self.secondSystemDialogGeneralText()["c20"], style=wx.OK | wx.ICON_EXCLAMATION) dialog.ShowModal() dialog.Destroy() okToClose[0] = False else: self.systemValues["water"] = "None" self.systemValues["flow"] = self.flowValue.GetValue() self.systemValues["flow_unit"] = self.flowUnit.GetStringSelection() self.systemValues["viscosity"] = self.viscosityValue.GetValue() self.systemValues["viscosity_unit"] = self.viscosityUnit.GetStringSelection() self.systemValues["density"] = self.densityValue.GetValue() self.systemValues["density_unit"] = self.densityUnit.GetStringSelection() okToClose[0] = True if radioBox2Selection == 0: self.systemValues["pipe_type"] = "CSP" okToClose[1] = True elif radioBox2Selection == 1: self.systemValues["pipe_type"] = "SSP" okToClose[1] = True elif radioBox2Selection == 2: self.systemValues["pipe_type"] = "PVC" okToClose[1] = True elif radioBox2Selection == 3: self.systemValues["pipe_type"] = "None" if self.roughnessUnit.GetSelection() == -1: dialog = wx.MessageDialog(self.panel, self.secondSystemDialogGeneralText()["c22"], self.secondSystemDialogGeneralText()["c20"], style=wx.OK | wx.ICON_EXCLAMATION) dialog.ShowModal() dialog.Destroy() okToClose[1] = False else: self.systemValues["roughness"] = self.roughnessValue.GetValue() self.systemValues["roughness_unit"] = self.roughnessUnit.GetStringSelection() okToClose[1] = True if self.pressureDropValue.IsEnabled(): if okToClose[0] and okToClose[1] and okToClose[2]: # print self.systemValues self.EndModal(wx.ID_OK) else: if okToClose[0] and okToClose[1]: # print self.systemValues self.EndModal(wx.ID_OK) def secondSystemDialogGeneralText(self): text = Language() return text.secondSystemDialogGeneralText()
class PowerDependentGUI(wx.Frame): def __init__(self, parent=None, title="Power Dependent Imaging"): super(PowerDependentGUI, self).__init__(parent, title=title, size=(1000, 1000)) self._filedir = "" self._truefilename = "" self._filename = "" self._lcvr_init = False main_panel = wx.Panel(self) main_sizer = wx.BoxSizer(wx.VERTICAL) input_panel = wx.Panel(main_panel) input_sizer = wx.BoxSizer(wx.HORIZONTAL) common_panel = wx.Panel(input_panel) common_sizer = wx.FlexGridSizer(11, 2, 0, 0) lcvr_label = wx.StaticText(common_panel, -1, "LCVR COM Port: ", wx.DefaultPosition, wx.Size(125, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._lcvr_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(125, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._lcvr_val.SetAllowNegative(False) self._lcvr_val.SetBounds(1, 99) self._lcvr_val.SetFractionWidth(0) self._lcvr_val.SetIntegerWidth(2) self._lcvr_val.SetValue(6) self._lcvr_val.SetLimitOnFieldChange(True) self._lcvr_val.Bind(wx.lib.masked.EVT_NUM, self._lcvr_entry) lcvr_chan = wx.StaticText(common_panel, -1, "LCVR Channel: ", wx.DefaultPosition, wx.Size(125, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._lcvr_ch = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(125, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._lcvr_ch.SetAllowNegative(False) self._lcvr_ch.SetBounds(1, 4) self._lcvr_ch.SetFractionWidth(0) self._lcvr_ch.SetIntegerWidth(1) self._lcvr_ch.SetValue(1) self._lcvr_ch.SetLimitOnFieldChange(True) wavelength_label = wx.StaticText(common_panel, -1, "Laser Wavelength (nm):", wx.DefaultPosition, wx.Size(150, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._wavelength_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(150, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._wavelength_val.SetAllowNegative(False) self._wavelength_val.SetBounds(400, 1100) self._wavelength_val.SetFractionWidth(0) self._wavelength_val.SetIntegerWidth(4) self._wavelength_val.SetValue(780) self._wavelength_val.SetLimitOnFieldChange(True) pow_label = wx.StaticText(common_panel, -1, "Laser Power (mW):", wx.DefaultPosition, wx.Size(150, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._pow_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(150, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._pow_val.SetAllowNegative(False) self._pow_val.SetBounds(0, 1000) self._pow_val.SetFractionWidth(2) self._pow_val.SetIntegerWidth(4) self._pow_val.SetValue(0) self._pow_val.SetLimitOnFieldChange(True) od_label = wx.StaticText(common_panel, -1, "OD:", wx.DefaultPosition, wx.Size(150, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._od_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(150, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._od_val.SetAllowNegative(False) self._od_val.SetBounds(0, 100) self._od_val.SetFractionWidth(0) self._od_val.SetIntegerWidth(4) self._od_val.SetValue(0) self._od_val.SetLimitOnFieldChange(True) start_volt_label = wx.StaticText(common_panel, -1, "Start Voltage (V):", wx.DefaultPosition, wx.Size(150, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._start_volt_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(150, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._start_volt_val.SetAllowNegative(False) self._start_volt_val.SetBounds(0, 10) self._start_volt_val.SetFractionWidth(2) self._start_volt_val.SetIntegerWidth(2) self._start_volt_val.SetValue(0) self._start_volt_val.SetLimitOnFieldChange(True) end_volt_label = wx.StaticText(common_panel, -1, "End Voltage (V):", wx.DefaultPosition, wx.Size(150, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._end_volt_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(150, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._end_volt_val.SetAllowNegative(False) self._end_volt_val.SetBounds(0, 10) self._end_volt_val.SetFractionWidth(2) self._end_volt_val.SetIntegerWidth(2) self._end_volt_val.SetValue(10) self._end_volt_val.SetLimitOnFieldChange(True) step_volt_label = wx.StaticText(common_panel, -1, "Absolute Step Voltage (V):", wx.DefaultPosition, wx.Size(150, 20), wx.ALIGN_RIGHT, "StaticTextNameStr") self._step_volt_val = NumCtrl(common_panel, -1, 0, wx.DefaultPosition, wx.Size(150, 20), wx.TE_PROCESS_TAB | wx.TE_PROCESS_ENTER, wx.DefaultValidator, "masked.num") self._step_volt_val.SetAllowNegative(False) self._step_volt_val.SetBounds(0, 10) self._step_volt_val.SetFractionWidth(2) self._step_volt_val.SetIntegerWidth(2) self._step_volt_val.SetValue(0.1) self._step_volt_val.SetLimitOnFieldChange(True) self._dir_button = wx.Button(common_panel, -1, "Choose Save Location", wx.DefaultPosition, wx.Size(150, 20), 0, wx.DefaultValidator, "ButtonNameStr") self._file_button = wx.Button(common_panel, -1, "Choose Save Filename", wx.DefaultPosition, wx.Size(150, 20), 0, wx.DefaultValidator, "ButtonNameStr") self._go_button = wx.Button(common_panel, -1, "Start", wx.DefaultPosition, wx.Size(150, 20), 0, wx.DefaultValidator, "ButtonNameStr") self._stop_button = wx.Button(common_panel, -1, "Stop", wx.DefaultPosition, wx.Size(150, 20), 0, wx.DefaultValidator, "ButtonNameStr") self._resume_button = wx.Button(common_panel, -1, "Resume", wx.DefaultPosition, wx.Size(150, 20), 0, wx.DefaultValidator, "ButtonNameStr") self._pause_button = wx.Button(common_panel, -1, "Pause", wx.DefaultPosition, wx.Size(150, 20), 0, wx.DefaultValidator, "ButtonNameStr") self._dir_button.Bind(wx.EVT_BUTTON, self._dir_select) self._file_button.Bind(wx.EVT_BUTTON, self._file_select) self._go_button.Bind(wx.EVT_BUTTON, self._go) self._stop_button.Bind(wx.EVT_BUTTON, self._stop) self._resume_button.Bind(wx.EVT_BUTTON, self._resume) self._pause_button.Bind(wx.EVT_BUTTON, self._pause) common_sizer.AddMany([ lcvr_label, self._lcvr_val, lcvr_chan, self._lcvr_ch, wavelength_label, self._wavelength_val, pow_label, self._pow_val, od_label, self._od_val, start_volt_label, self._start_volt_val, end_volt_label, self._end_volt_val, step_volt_label, self._step_volt_val, self._dir_button, self._file_button, self._go_button, self._stop_button, self._resume_button, self._pause_button ]) common_panel.SetSizer(common_sizer) self._stop_button.Disable() self._pause_button.Disable() self._resume_button.Disable() input_sizer.Add(common_panel, 0, wx.ALL, 10) input_panel.SetSizer(input_sizer) self._ccd = CCDPanel("", "", title, main_panel) copyright_str = "\u00a9 2016 QuIN Lab" copyright_str += "Developed by Hayden Jones" copyright_text = wx.StaticText(main_panel, label=copyright_str) main_sizer.Add(input_panel, 0, wx.ALL, 0) main_sizer.Add(self._ccd, 0, wx.ALL, 0) main_sizer.Add(copyright_text, 0, wx.ALL, 0) main_panel.SetSizer(main_sizer) self.Bind(wx.EVT_CLOSE, self._on_close) self.SetWindowStyle(wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) self.Show() def _on_close(self, evt): if self._lcvr_init is True: self._lcvr.close() evt.Skip() def disable_ui(self): self._lcvr_val.Disable() self._lcvr_ch.Disable() self._wavelength_val.Disable() self._pow_val.Disable() self._od_val.Disable() self._start_volt_val.Disable() self._end_volt_val.Disable() self._step_volt_val.Disable() self._dir_button.Disable() self._file_button.Disable() self._go_button.Disable() self._stop_button.Enable() self._resume_button.Disable() self._pause_button.Enable() def enable_ui(self): self._lcvr_val.Enable() self._lcvr_ch.Enable() self._wavelength_val.Enable() self._pow_val.Enable() self._od_val.Enable() self._start_volt_val.Enable() self._end_volt_val.Enable() self._step_volt_val.Enable() self._dir_button.Enable() self._file_button.Enable() self._go_button.Enable() self._stop_button.Disable() self._resume_button.Disable() self._pause_button.Disable() def get_od(self): return self._od_val.GetValue() def get_wavelength(self): return self._wavelength_val.GetValue() def get_power(self): return self._pow_val.GetValue() def get_start_volt(self): return self._start_volt_val.GetValue() def get_end_volt(self): return self._end_volt_val.GetValue() def get_step_volt(self): return self._step_volt_val.GetValue() def get_lcvr_addr(self): return self._lcvr_ch.GetValue() def _invalid_lcvr_warn(self): warning_message = "Invalid LCVR Controller Address/Connection!" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.OK, wx.DefaultPosition) warning.ShowModal() warning.Destroy() def _lcvr_entry(self, evt): if self._lcvr_init is True or self.get_lcvr_addr() < 1: return try: com_port = self._lcvr_val.GetValue() self._lcvr = MeadowlarkD3050Controller(com_port) except: self._invalid_lcvr_warn() return self._lcvr_init = True def _set_filename(self): self._filename = self._truefilename self._filename += "_OD" + str(self.get_od()) self._filename += "_" + str(self.get_wavelength()) + "nm" self._filename += "_" + str(self.get_power()) + "mW" def _dir_select(self, evt): dir_dialog = wx.DirDialog(self, "Choose file save directory...", "", wx.DD_DEFAULT_STYLE | wx.DD_DIR_MUST_EXIST) if dir_dialog.ShowModal() == wx.ID_CANCEL: return self._filedir = dir_dialog.GetPath() + "\\" dir_dialog.Destroy() def _file_select(self, evt): file_dialog = wx.TextEntryDialog(self, "Enter the file name...", "File Name Selection Dialog", self._truefilename) if file_dialog.ShowModal() == wx.ID_CANCEL: return self._truefilename = file_dialog.GetValue() file_dialog.Destroy() def _go(self, evt): if self._lcvr_init is False: return self.disable_ui() self._ccd.open_xcap() self._kill_automation = False self._pause_automation = False _thread.start_new_thread(self._automation, (self.get_lcvr_addr(), )) def _stop(self, evt): self._kill_automation = True self._pause_automation = False self._ccd.close_xcap() self.enable_ui() def _resume(self, evt): self._od_val.Disable() self._resume_button.Disable() self._pause_button.Enable() self._pause_automation = False def _pause(self, evt): self._pause_automation = True self._od_val.Enable() self._resume_button.Enable() self._pause_button.Disable() def _automation(self, channel): start_volt = self.get_start_volt() end_volt = self.get_end_volt() if start_volt > end_volt: step = -self.get_step_volt() else: step = self.get_step_volt() overlap_holder = [] self._ccd.set_work_dir(self._filedir) for i in range(int(start_volt * 1000), int((end_volt + 0.01) * 1000), int(step * 1000)): v = float(i / 1000) if self._kill_automation is True: break if self._pause_automation is True: i = overlap_holder[0] while self._pause_automation is True: if self._kill_automation is True: break overlap_holder.append(i) self._lcvr.set_voltage(channel, v) if len(overlap_holder) > 5: overlap_holder.pop(0) self._set_filename() self._filename += "_" + str(v) + "V.jpg" self._ccd.set_filename(self._filename) self._ccd.grab_frame() sleep(5) wx.CallAfter(self._stop, wx.EVT_BUTTON)
class SpectroscopyGUI(wx.Frame): def __init__(self, parent=None, title="QuIN Lab Spectroscopy"): super(SpectroscopyGUI, self).__init__(parent, title=title, size=(1340, 690)) self._filedir = os.getcwd() + "\\" self._truefilename = "" self._filename = "" self._lcvr_init = False self._zaber_init = False self._lcvr_swp = True self._zaber_swp = True main_panel = wx.Panel(self) main_sizer = wx.BoxSizer(wx.VERTICAL) input_nb = wx.Notebook(main_panel) common_panel = wx.Panel(input_nb) common_sizer = wx.GridBagSizer() lcvr_swp_txt = wx.StaticText(common_panel, label="LCVR Mode:", size=(140, 20), style=wx.ALIGN_RIGHT) self._lcvr_swp_val = wx.Choice(common_panel, size=(-1, 20), choices=["Sweep", "Fixed"]) self._lcvr_swp_val.Bind(wx.EVT_CHOICE, self._lcvr_swp_sel) zaber_swp_txt = wx.StaticText(common_panel, label="Zaber Mode:", size=(130, 20), style=wx.ALIGN_RIGHT) self._zaber_swp_val = wx.Choice(common_panel, size=(-1, 20), choices=["Sweep", "Fixed"]) self._zaber_swp_val.Bind(wx.EVT_CHOICE, self._zaber_swp_sel) lcvr_label = wx.StaticText(common_panel, label="LCVR COM Port:", size=(140, 20), style=wx.ALIGN_RIGHT) self._lcvr_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._lcvr_val.SetAllowNegative(False) self._lcvr_val.SetBounds(1, 99) self._lcvr_val.SetFractionWidth(0) self._lcvr_val.SetIntegerWidth(2) self._lcvr_val.SetValue(6) self._lcvr_val.SetLimitOnFieldChange(True) self._lcvr_val.Bind(wx.EVT_KILL_FOCUS, self._lcvr_entry) lcvr_chan = wx.StaticText(common_panel, label="LCVR Channel:", size=(140, 20), style=wx.ALIGN_RIGHT) self._lcvr_ch = wx.Choice(common_panel, size=(-1, 20), choices=["1", "2", "3", "4"]) zaber_txt = wx.StaticText(common_panel, label="Zaber COM Port:", size=(140, 20), style=wx.ALIGN_RIGHT) self._zaber_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._zaber_val.SetAllowNegative(False) self._zaber_val.SetBounds(1, 99) self._zaber_val.SetFractionWidth(0) self._zaber_val.SetIntegerWidth(2) self._zaber_val.SetValue(9) self._zaber_val.SetLimitOnFieldChange(True) self._zaber_val.Bind(wx.EVT_KILL_FOCUS, self._zaber_entry) wavelength_label = wx.StaticText(common_panel, label="Laser Wavelength (nm):", size=(130, 20), style=wx.ALIGN_RIGHT) self._wavelength_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._wavelength_val.SetAllowNegative(False) self._wavelength_val.SetBounds(400, 1100) self._wavelength_val.SetFractionWidth(0) self._wavelength_val.SetIntegerWidth(4) self._wavelength_val.SetValue(780) self._wavelength_val.SetLimitOnFieldChange(True) pow_label = wx.StaticText(common_panel, label="Laser Power (mW):", size=(130, 20), style=wx.ALIGN_RIGHT) self._pow_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._pow_val.SetAllowNegative(False) self._pow_val.SetBounds(0, 1000) self._pow_val.SetFractionWidth(2) self._pow_val.SetIntegerWidth(4) self._pow_val.SetValue(0) self._pow_val.SetLimitOnFieldChange(True) od_label = wx.StaticText(common_panel, label="OD:", size=(130, 20), style=wx.ALIGN_RIGHT) self._od_val = wx.Choice(common_panel, size=(-1, 20), choices=[ "0", "0.5", "1", "1.5", "2", "2.5", "3", "3.5", "4", "4.5", "5" ]) self._start_volt_txt = wx.StaticText(common_panel, label="Start Voltage (V):", size=(140, 20), style=wx.ALIGN_RIGHT) self._start_volt_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._start_volt_val.SetAllowNegative(False) self._start_volt_val.SetBounds(0, 10) self._start_volt_val.SetFractionWidth(2) self._start_volt_val.SetIntegerWidth(2) self._start_volt_val.SetValue(10) self._start_volt_val.SetLimitOnFieldChange(True) end_volt_label = wx.StaticText(common_panel, label="End Voltage (V):", size=(140, 20), style=wx.ALIGN_RIGHT) self._end_volt_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._end_volt_val.SetAllowNegative(False) self._end_volt_val.SetBounds(0, 10) self._end_volt_val.SetFractionWidth(2) self._end_volt_val.SetIntegerWidth(2) self._end_volt_val.SetValue(0) self._end_volt_val.SetLimitOnFieldChange(True) step_volt_label = wx.StaticText(common_panel, label="Absolute Step Voltage (V):", size=(140, 20), style=wx.ALIGN_RIGHT) self._step_volt_val = NumCtrl(common_panel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._step_volt_val.SetAllowNegative(False) self._step_volt_val.SetBounds(0, 10) self._step_volt_val.SetFractionWidth(2) self._step_volt_val.SetIntegerWidth(2) self._step_volt_val.SetValue(0.1) self._step_volt_val.SetLimitOnFieldChange(True) self._dir_button = wx.Button(common_panel, label="Choose Save Location", size=(130, 20)) self._dir_button.Bind(wx.EVT_BUTTON, self._dir_select) self._file_button = wx.Button(common_panel, label="Choose Save Filename", size=(130, 20)) self._file_button.Bind(wx.EVT_BUTTON, self._file_select) self._go_button = wx.Button(common_panel, label="Start", size=(130, 20)) self._go_button.SetForegroundColour(wx.Colour("GREEN")) self._go_button.Bind(wx.EVT_BUTTON, self._go) self._stop_button = wx.Button(common_panel, label="Stop", size=(130, 20)) self._stop_button.Bind(wx.EVT_BUTTON, self._stop) self._stop_button.SetForegroundColour(wx.Colour("RED")) self._resume_button = wx.Button(common_panel, label="Resume", size=(130, 20)) self._resume_button.Bind(wx.EVT_BUTTON, self._resume) self._pause_button = wx.Button(common_panel, label="Pause", size=(130, 20)) self._pause_button.Bind(wx.EVT_BUTTON, self._pause) curr_dir_txt = wx.StaticText(common_panel, label="Current Directory:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._curr_dir_disp = wx.StaticText(common_panel, label=self._filedir, size=(-1, 20)) curr_file_txt = wx.StaticText(common_panel, label="Current Filename:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._curr_file_disp = wx.StaticText(common_panel, label=self._filename, size=(-1, 20)) common_sizer.Add(lcvr_label, (0, 0)) common_sizer.Add(self._lcvr_val, (0, 1)) common_sizer.Add(lcvr_chan, (1, 0)) common_sizer.Add(self._lcvr_ch, (1, 1)) common_sizer.Add(self._start_volt_txt, (2, 0)) common_sizer.Add(self._start_volt_val, (2, 1)) common_sizer.Add(end_volt_label, (3, 0)) common_sizer.Add(self._end_volt_val, (3, 1)) common_sizer.Add(step_volt_label, (4, 0)) common_sizer.Add(self._step_volt_val, (4, 1)) common_sizer.Add(zaber_txt, (5, 0)) common_sizer.Add(self._zaber_val, (5, 1)) common_sizer.Add(wavelength_label, (0, 2)) common_sizer.Add(self._wavelength_val, (0, 3)) common_sizer.Add(pow_label, (1, 2)) common_sizer.Add(self._pow_val, (1, 3)) common_sizer.Add(od_label, (2, 2)) common_sizer.Add(self._od_val, (2, 3)) common_sizer.Add(self._dir_button, (3, 2)) common_sizer.Add(self._file_button, (3, 3)) common_sizer.Add(self._go_button, (4, 2)) common_sizer.Add(self._stop_button, (4, 3)) common_sizer.Add(self._resume_button, (5, 2)) common_sizer.Add(self._pause_button, (5, 3)) common_sizer.Add(lcvr_swp_txt, (6, 0)) common_sizer.Add(self._lcvr_swp_val, (6, 1)) common_sizer.Add(zaber_swp_txt, (6, 2)) common_sizer.Add(self._zaber_swp_val, (6, 3)) common_sizer.Add(curr_dir_txt, (7, 0)) common_sizer.Add(self._curr_dir_disp, (7, 1), wx.GBSpan(1, 3)) common_sizer.Add(curr_file_txt, (8, 0)) common_sizer.Add(self._curr_file_disp, (8, 1), wx.GBSpan(1, 3)) common_panel.SetSizer(common_sizer) self._stop_button.Disable() self._pause_button.Disable() self._resume_button.Disable() self._zaber = ZaberLinearActuator() self._zaber_pnl = ZaberControlPanel(self._zaber, input_nb) self._zaber_pnl.disable_ui() self._lf = LightField("", True) self._lf.set_export(True) self._lfcontrol = LightFieldControlPanel(self._lf, input_nb) input_nb.InsertPage(0, common_panel, "Common Settings") input_nb.InsertPage(1, self._zaber_pnl, "Zaber Settings") input_nb.InsertPage(2, self._lfcontrol, "LightField Settings") copyright_str = "\u00a9 2016 QuIN Lab " copyright_str += "Developed by Hayden Jones" copyright_text = wx.StaticText(main_panel, label=copyright_str) self._img = wx.Image(1340, 400, True).ConvertToBitmap() self._display = wx.StaticBitmap(main_panel, -1, self._img, wx.DefaultPosition, wx.Size(1340, 400)) self._display.SetBitmap(self._img) self._set_filename() self.update_file_display() main_sizer.Add(input_nb, 0, wx.ALL, 0) main_sizer.Add(self._display, 0, wx.ALL, 0) main_sizer.Add(copyright_text, 0, wx.ALL, 0) main_panel.SetSizer(main_sizer) main_panel.Layout() self.Bind(wx.EVT_CLOSE, self._on_close) self.SetWindowStyle(wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) self.Show() def _on_close(self, evt): if self._lcvr_init is True: self._lcvr.close() self._lf.close_lightfield() self._lf.close_matlab() evt.Skip() def disable_ui(self): self._zaber_val.Disable() self._lcvr_val.Disable() self._lcvr_ch.Disable() self._wavelength_val.Disable() self._pow_val.Disable() self._od_val.Disable() self._start_volt_val.Disable() self._end_volt_val.Disable() self._step_volt_val.Disable() self._dir_button.Disable() self._file_button.Disable() self._go_button.Disable() self._stop_button.Enable() self._resume_button.Disable() self._pause_button.Enable() self._zaber_pnl.disable_ui() self._lfcontrol.disable_ui() def enable_ui(self): self._zaber_val.Enable() self._lcvr_val.Enable() self._lcvr_ch.Enable() self._wavelength_val.Enable() self._pow_val.Enable() self._od_val.Enable() self._start_volt_val.Enable() self._end_volt_val.Enable() self._step_volt_val.Enable() self._dir_button.Enable() self._file_button.Enable() self._go_button.Enable() self._stop_button.Disable() self._resume_button.Disable() self._pause_button.Disable() self._zaber_pnl.enable_ui() self._lfcontrol.enable_ui() def get_od(self): return float(self._od_val.GetCurrentSelection() / 2) def get_wavelength(self): return self._wavelength_val.GetValue() def get_power(self): return self._pow_val.GetValue() def get_start_volt(self): return self._start_volt_val.GetValue() def get_end_volt(self): return self._end_volt_val.GetValue() def get_step_volt(self): return self._step_volt_val.GetValue() def get_lcvr_ch(self): return self._lcvr_ch.GetCurrentSelection() + 1 def update_dir_display(self): self._curr_dir_disp.SetLabel(self._filedir) def update_file_display(self): self._curr_file_disp.SetLabel(self._filename) def _lcvr_swp_sel(self, evt): if self._lcvr_swp_val.GetCurrentSelection() == 0: self._lcvr_swp = True else: self._lcvr_swp = False def _zaber_swp_sel(self, evt): if self._zaber_swp_val.GetCurrentSelection() == 0: self._zaber_swp = True else: self._zaber_swp = False def _invalid_lcvr_warn(self): warning_message = "Invalid LCVR Controller Address/Connection!" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.OK, wx.DefaultPosition) warning.ShowModal() warning.Destroy() def _lcvr_entry(self, evt): if self._lcvr_init is True: return try: com_port = self._lcvr_val.GetValue() self._lcvr = MeadowlarkD3050Controller(com_port) except Exception: self._invalid_lcvr_warn() evt.Skip() return self._lcvr_init = True evt.Skip() def _invalid_zaber_warn(self): warning_message = "Invalid Zaber Address/Connection!" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.OK, wx.DefaultPosition) warning.ShowModal() warning.Destroy() def _zaber_entry(self, evt): if self._zaber_init is True: return try: com_port = self._zaber_val.GetValue() self._zaber.open(com_port) except Exception: self._invalid_zaber_warn() evt.Skip() return self._zaber_pnl.enable_ui() self._zaber_init = True evt.Skip() def _set_filename(self): self._filename = self._truefilename self._filename += "_OD" + str(self.get_od()) self._filename += "_" + str(self.get_wavelength()) + "nm" self._filename += "_" + str(self.get_power()) + "mW" def _dir_select(self, evt): dir_dialog = wx.DirDialog(self, "Choose file save directory...", "", wx.DD_DEFAULT_STYLE | wx.DD_DIR_MUST_EXIST) if dir_dialog.ShowModal() == wx.ID_CANCEL: return self._filedir = dir_dialog.GetPath() + "\\" self.update_dir_display() dir_dialog.Destroy() def _file_select(self, evt): file_dialog = wx.TextEntryDialog(self, "Enter the file name...", "File Name Selection Dialog", self._truefilename) if file_dialog.ShowModal() == wx.ID_CANCEL: return self._truefilename = file_dialog.GetValue() self._set_filename() self.update_file_display() file_dialog.Destroy() def _go(self, evt): self._lcvr_entry(wx.EVT_BUTTON) self._zaber_entry(wx.EVT_BUTTON) if self._lcvr_init is False: self._invalid_lcvr_warn() return if self._zaber_init is False: self._invalid_zaber_warn() return self.disable_ui() self._kill_automation = False self._pause_automation = False _thread.start_new_thread(self._automation, (self.get_lcvr_ch(), )) def _stop(self, evt): self._kill_automation = True self._pause_automation = False self.enable_ui() def _resume(self, evt): self._od_val.Disable() self._resume_button.Disable() self._pause_button.Enable() self._pause_automation = False def _pause(self, evt): self._pause_automation = True self._od_val.Enable() self._resume_button.Enable() self._pause_button.Disable() def _automation(self, channel): self._lf.set_directory(self._filedir.rstrip("\\")) start_volt = self.get_start_volt() if self._lcvr_swp is True: end_volt = self.get_end_volt() else: end_volt = start_volt if start_volt > end_volt: step_volt = -self.get_step_volt() else: step_volt = self.get_step_volt() self._zaber.goto_pos(0, 324000) start_zaber = self._zaber_pnl.get_start() if self._zaber_swp is True: end_zaber = self._zaber_pnl.get_end() self._zaber.goto_pos(0, start_zaber) else: end_zaber = start_zaber if start_zaber > end_zaber: step_zaber = -self._zaber_pnl.get_step() else: step_zaber = self._zaber_pnl.get_step() self._lcvr.set_voltage(channel, start_volt) overlap_holder = [] for i in range(int(start_volt * 1000), int((end_volt * 1000) + 1), int(step_volt * 1000)): if self._kill_automation is True: break if self._pause_automation is True: i = overlap_holder[0] while self._pause_automation is True: if self._kill_automation is True: break overlap_holder.append(i) if len(overlap_holder) > 5: overlap_holder.pop(0) v = float(i / 1000) self._set_filename() self._lcvr.set_voltage(channel, v) self._filename += "_" + str(v) + "V" self._lf.set_filename(self._filename) for j in range(start_zaber, end_zaber + 1, step_zaber): if self._kill_automation is True: break if self._pause_automation is True: while self._pause_automation is True: if self._kill_automation is True: break self._filename += "_" + str(j) + "zaber" self._zaber.goby_dist(0, step_zaber) self._lf.set_filename(self._filename) self._lf.acquire(60) self._lf.set_filename(self._filename) newest_spe = max(glob.iglob(self._filedir + '*.spe'), key=os.path.getctime) spe2pngraw.spe2pngraw(self._filedir, newest_spe) newest_png = newest_spe.rstrip('.spe') + '.png' self._img = wx.Image(newest_png, wx.BITMAP_TYPE_ANY).ConvertToBitmap() wx.CallAfter(self._display.SetBitmap, self._img) sleep(1) wx.CallAfter(self._stop, wx.EVT_BUTTON)
class ZaberControlPanel(wx.Panel): def __init__(self, zaber, *args): wx.Panel.__init__(self, *args) self._zaber = zaber self._home_button = wx.Button( self, label="Home Zaber", size=(100, 24)) self._home_button.Bind(wx.EVT_BUTTON, self._home) self._center_button = wx.Button( self, label="Center Zaber", size=(100, 24)) self._center_button.Bind(wx.EVT_BUTTON, self._center) self._start_txt = wx.StaticText( self, label="Start Position:", size=(100, 24), style=wx.ALIGN_RIGHT) self._start_val = NumCtrl( self, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._start_val.SetAllowNegative(False) self._start_val.SetBounds(0, 640000) self._start_val.SetFractionWidth(0) self._start_val.SetIntegerWidth(6) self._start_val.SetValue(294000) self._end_txt = wx.StaticText( self, label="End Position:", size=(100, 24), style=wx.ALIGN_RIGHT) self._end_val = NumCtrl( self, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._end_val.SetAllowNegative(False) self._end_val.SetBounds(0, 640000) self._end_val.SetFractionWidth(0) self._end_val.SetIntegerWidth(6) self._end_val.SetValue(354000) self._step_txt = wx.StaticText( self, label="Absolute Step Size:", size=(100, 24), style=wx.ALIGN_RIGHT) self._step_val = NumCtrl( self, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._step_val.SetAllowNegative(False) self._step_val.SetBounds(0, 640000) self._step_val.SetFractionWidth(0) self._step_val.SetIntegerWidth(6) self._step_val.SetValue(1500) self._go_abs_button = wx.Button( self, label="Go to Position \u2192", size=(100, 24)) self._go_abs_button.Bind(wx.EVT_BUTTON, self._go_abs) self._goto_val = NumCtrl( self, size=(100, 20), style=wx.TE_PROCESS_ENTER) self._goto_val.SetBounds(0, 640000) self._goto_val.SetAllowNegative(False) self._goto_val.SetFractionWidth(0) self._goto_val.SetIntegerWidth(6) self._goto_val.SetValue(0) self._goto_val.SetLimitOnFieldChange(True) self._go_rel_button = wx.Button( self, label="Go by Distance \u2192", size=(100,24)) self._go_rel_button.Bind(wx.EVT_BUTTON, self._go_rel) self._goby_val = NumCtrl( self, size=(100, 20), style=wx.TE_PROCESS_ENTER) self._goby_val.SetBounds(-640000, 640000) self._goby_val.SetAllowNegative(True) self._goby_val.SetFractionWidth(0) self._goby_val.SetIntegerWidth(6) self._goby_val.SetValue(0) self._goby_val.SetLimitOnFieldChange(True) self._pos_txt = wx.StaticText( self, label="Current Position:", size=(-1, 24), style=wx.ALIGN_RIGHT) self._pos_val = wx.StaticText(self, label="0", size=(-1, 24)) sizer = wx.GridBagSizer(5, 5) sizer.Add(self._home_button, (0, 2)) sizer.Add(self._center_button, (0, 3)) sizer.Add(self._start_txt, (0, 0)) sizer.Add(self._start_val, (0, 1)) sizer.Add(self._end_txt, (1, 0)) sizer.Add(self._end_val, (1, 1)) sizer.Add(self._step_txt, (2, 0)) sizer.Add(self._step_val, (2, 1)) sizer.Add(self._go_abs_button, (1, 2)) sizer.Add(self._goto_val, (1, 3)) sizer.Add(self._go_rel_button, (2, 2)) sizer.Add(self._goby_val, (2, 3)) sizer.Add(self._pos_txt, (3, 1)) sizer.Add(self._pos_val, (3, 2)) self.SetSizer(sizer) def disable_ui(self): self._home_button.Disable() self._center_button.Disable() self._start_val.Disable() self._end_val.Disable() self._step_val.Disable() self._go_abs_button.Disable() self._goto_val.Disable() self._go_rel_button.Disable() self._goby_val.Disable() def enable_ui(self): self._home_button.Enable() self._center_button.Enable() self._start_val.Enable() self._end_val.Enable() self._step_val.Enable() self._go_abs_button.Enable() self._goto_val.Enable() self._go_rel_button.Enable() self._goby_val.Enable() def get_start(self): return self._start_val.GetValue() def get_end(self): return self._end_val.GetValue() def get_step(self): return self._step_val.GetValue() def update_pos(self): self._pos_val.SetLabel(str(self._zaber.get_current_pos(0)[0][1])) def _home(self, evt): self._zaber.home(0) self.update_pos() def _center(self, evt): self._zaber.goto_pos(0, 324000) self.update_pos() def _go_abs(self, evt): self._zaber.goto_pos(0, self._goto_val.GetValue()) self.update_pos() def _go_rel(self, evt): curr_pos = int(self._pos_val.GetLabel()) if curr_pos + self._goby_val.GetValue() > 640000: return self._zaber.goby_dist(0, self._goby_val.GetValue()) self.update_pos()
class LightFieldControlPanel(wx.Panel): def __init__(self, lightfield, *args): wx.Panel.__init__(self, *args) self._lf = lightfield subpanel = wx.Panel(self) sp_sizer = wx.FlexGridSizer(6, 4, 0, 0) exp_txt = wx.StaticText( subpanel, label="Exposure Time (ms):", size=(115, 20), style=wx.ALIGN_RIGHT) self._exp_val = NumCtrl( subpanel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._exp_val.SetAllowNegative(False) self._exp_val.SetFractionWidth(0) self._exp_val.SetIntegerWidth(9) self._exp_val.SetValue(100) self._exp_val.Bind(wx.EVT_KILL_FOCUS, self._exp_entry) frames_txt = wx.StaticText( subpanel, label="Number of Frames:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._frames_val = NumCtrl( subpanel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._frames_val.SetAllowNegative(False) self._frames_val.SetFractionWidth(0) self._frames_val.SetIntegerWidth(9) self._frames_val.SetValue(1) self._frames_val.Bind(wx.EVT_KILL_FOCUS, self._frames_entry) adcqlty_txt = wx.StaticText( subpanel, label="ADC Quality:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._adcqlty_val = wx.Choice( subpanel, size=(-1, 20), style=wx.CB_SORT, choices=["High Capacity", "Low Noise"]) self._adcqlty_val.Bind(wx.EVT_CHOICE, self._adcqlty_entry) adcspeed_txt = wx.StaticText( subpanel, label="ADC Speed:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._adcspeed_val = wx.Choice( subpanel, size=(-1, 20), choices=["4 MHz", "2 MHz", "1 MHz", "500 kHz", "200 kHz", "100 kHz", "50 kHz"]) self._adcspeed_val.Bind(wx.EVT_CHOICE, self._adcspeed_entry) adcgain_txt = wx.StaticText( subpanel, label="ADC Analog Gain:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._adcgain_val = wx.Choice( subpanel, size=(-1, 20), choices=["High", "Medium", "Low"]) self._adcgain_val.Bind(wx.EVT_CHOICE, self._adcgain_entry) adcbits_txt = wx.StaticText( subpanel, label="ADC Bit Depth:", size=(-1, 20), style=wx.ALIGN_RIGHT) bitdepth = self._lf.get_adcbitdepth() adcbits_val = wx.StaticText( subpanel, label="{0} bits".format(bitdepth), size=(-1, 20), style=wx.ALIGN_LEFT) width_txt = wx.StaticText( subpanel, label="Sensor Bin Width:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._width_val = NumCtrl( subpanel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._width_val.SetAllowNegative(False) self._width_val.SetBounds(1, 1340) self._width_val.SetFractionWidth(0) self._width_val.SetIntegerWidth(4) self._width_val.SetValue(1) self._width_val.SetLimitOnFieldChange(True) self._width_val.Bind(wx.EVT_KILL_FOCUS, self._width_entry) height_txt = wx.StaticText( subpanel, label="Sensor Bin Height:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._height_val = NumCtrl( subpanel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._height_val.SetAllowNegative(False) self._height_val.SetBounds(1, 400) self._height_val.SetFractionWidth(0) self._height_val.SetIntegerWidth(4) self._height_val.SetValue(1) self._height_val.SetLimitOnFieldChange(True) self._height_val.Bind(wx.EVT_KILL_FOCUS, self._height_entry) roi_txt = wx.StaticText( subpanel, label="Sensor Mode:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._roi_val = wx.Choice( subpanel, size=(-1, 20), choices=["Full Sensor", "Line Sensor", "Binned Sensor"]) self._roi_val.Bind(wx.EVT_CHOICE, self._roi_entry) grating_txt = wx.StaticText( subpanel, label="Grating Density:", size=(-1, 20), style=wx.ALIGN_RIGHT) self._grating_val = wx.Choice( subpanel, size=(-1, 20), choices=["300 g/mm", "1200 g/mm", "1800 g/mm"]) self._grating_val.Bind(wx.EVT_CHOICE, self._grating_entry) lambda_txt = wx.StaticText( subpanel, label="Center Wavelength (nm):", size=(135, 20), style=wx.ALIGN_RIGHT) self._lambda_val = NumCtrl( subpanel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._lambda_val.SetAllowNegative(False) self._lambda_val.SetFractionWidth(3) self._lambda_val.SetIntegerWidth(4) self._lambda_val.SetValue(780) self._lambda_val.Bind(wx.EVT_KILL_FOCUS, self._lambda_entry) slit_txt = wx.StaticText( subpanel, label="Slit Width (\u03BCm):", size=(-1, 20), style=wx.ALIGN_RIGHT) self._slit_val = NumCtrl( subpanel, size=(-1, 20), style=wx.TE_PROCESS_ENTER) self._slit_val.SetAllowNegative(False) self._slit_val.SetBounds(10, 3000) self._slit_val.SetFractionWidth(0) self._slit_val.SetIntegerWidth(4) self._slit_val.SetValue(100) self._slit_val.SetLimitOnFieldChange(True) self._slit_val.Bind(wx.EVT_KILL_FOCUS, self._slit_entry) sp_sizer.AddMany( [exp_txt, self._exp_val, width_txt, self._width_val, frames_txt, self._frames_val, height_txt, self._height_val, adcqlty_txt, self._adcqlty_val, roi_txt, self._roi_val, adcspeed_txt, self._adcspeed_val, grating_txt, self._grating_val, adcgain_txt, self._adcgain_val, lambda_txt, self._lambda_val, adcbits_txt, adcbits_val, slit_txt, self._slit_val]) subpanel.SetSizer(sp_sizer) overall_sizer = wx.BoxSizer() overall_sizer.Add(subpanel, 0, wx.ALL, 10) self.SetSizer(overall_sizer) def disable_ui(self): self._exp_val.Disable() self._frames_val.Disable() self._adcqlty_val.Disable() self._adcspeed_val.Disable() self._adcgain_val.Disable() self._width_val.Disable() self._height_val.Disable() self._roi_val.Disable() self._grating_val.Disable() self._lambda_val.Disable() self._slit_val.Disable() def enable_ui(self): self._exp_val.Enable() self._frames_val.Enable() self._adcqlty_val.Enable() self._adcspeed_val.Enable() self._adcgain_val.Enable() self._width_val.Enable() self._height_val.Enable() self._roi_val.Enable() self._grating_val.Enable() self._lambda_val.Enable() self._slit_val.Enable() def _exp_entry(self, evt): if self._exp_val.GetValue() < 1: return self._lf.set_exposure(self._exp_val.GetValue()) evt.Skip() def _frames_entry(self, evt): if self._frames_val.GetValue() < 1: return self._lf.set_frames(self._frames_val.GetValue()) evt.Skip() def _adcqlty_entry(self, evt): if self._adcqlty_val.GetCurrentSelection() == 0: self._lf.set_adcquality(2) else: self._lf.set_adcquality(1) def _adcspeed_entry(self, evt): speeds = { 0: 4, 1: 2, 2: 1, 3: 0.5, 4: 0.2, 5: 0.1, 6: 0.05 } self._lf.set_adcspeed( speeds[self._adcspeed_val.GetCurrentSelection()]) def _adcgain_entry(self, evt): if self._adcgain_val.GetCurrentSelection() == 0: self._lf.set_adcanaloggain(3) elif self._adcgain_val.GetCurrentSelection() == 1: self._lf.set_adcanaloggain(2) else: self._lf.set_adcanaloggain(1) def _width_entry(self, evt): if self._width_val.GetValue() < 1: return self._lf.set_binwidth(self._width_val.GetValue()) evt.Skip() def _height_entry(self, evt): if self._height_val.GetValue() < 1: return self._lf.set_binheight(self._height_val.GetValue()) evt.Skip() def _roi_entry(self, evt): if self._roi_val.GetCurrentSelection() == 0: self._lf.set_roiselection(1) elif self._roi_val.GetCurrentSelection() == 1: self._lf.set_roiselection(3) else: self._lf.set_roiselection(2) def _grating_entry(self, evt): if self._grating_val.GetCurrentSelection() == 0: self._lf.set_grating(300) elif self._grating_val.GetCurrentSelection() == 1: self._lf.set_grating(1200) else: self._lf.set_grating(1800) def _lambda_entry(self, evt): if self._lambda_val.GetValue() < 1: return self._lf.set_centerwavelength(self._lambda_val.GetValue()) evt.Skip() def _slit_entry(self, evt): if self._slit_val.GetValue() < 1: return self._lf.set_slitwidth(self._slit_val.GetValue()) evt.Skip()
class LCVRCalibrationGUI(wx.Frame): def __init__(self, parent=None, title="LCVR Calibration"): super(LCVRCalibrationGUI, self).__init__( parent, title=title, size=(815, 520), style=wx.DEFAULT_FRAME_STYLE ^ wx.RESIZE_BORDER ^ wx.MAXIMIZE_BOX) self._max = "Not yet tested." self._min = "Not yet tested." self._pm_init = False self._lcvr_init = False self._data_set = [] self._filename = "LCVR Calibration.csv" self._kill_calibration = True self._saved_data = True # make panel for frame overall_panel = wx.Panel(self) overall_sizer = wx.GridBagSizer() # make panel for top top_panel = wx.Panel(overall_panel) top_sizer = wx.BoxSizer(wx.VERTICAL) # make panel for main stuff main_panel = wx.Panel(top_panel) main_sizer = wx.FlexGridSizer(11, 2, 0, 0) newport_label = wx.StaticText(main_panel, label="Newport GPIB Port: ", size=(140, 20), style=wx.ALIGN_RIGHT) self._newport_val = NumCtrl(main_panel, size=(140, 20), style=wx.TE_PROCESS_ENTER) self._newport_val.SetAllowNegative(False) self._newport_val.SetBounds(1, 99) self._newport_val.SetFractionWidth(0) self._newport_val.SetIntegerWidth(2) self._newport_val.SetValue(4) self._newport_val.SetLimitOnFieldChange(True) meadowlark_label = wx.StaticText(main_panel, label="Meadowlark COM Port: ", size=(140, 20), style=wx.ALIGN_RIGHT) self._meadowlark_val = NumCtrl(main_panel, size=(140, 20), style=wx.TE_PROCESS_ENTER) self._meadowlark_val.SetAllowNegative(False) self._meadowlark_val.SetBounds(1, 99) self._meadowlark_val.SetFractionWidth(0) self._meadowlark_val.SetIntegerWidth(2) self._meadowlark_val.SetValue(6) self._meadowlark_val.SetLimitOnFieldChange(True) meadowlark_chan = wx.StaticText(main_panel, label="Meadowlark Channel: ", size=(140, 20), style=wx.ALIGN_RIGHT) self._meadowlark_ch = wx.Choice(main_panel, size=(140, 20), choices=["1", "2", "3", "4"]) laser_label = wx.StaticText(main_panel, label="Laser Wavelength (nm): ", size=(140, 20), style=wx.ALIGN_RIGHT) self._laser_lambda = NumCtrl(main_panel, size=(140, 20), style=wx.TE_PROCESS_ENTER) self._laser_lambda.SetAllowNegative(False) self._laser_lambda.SetBounds(400, 1100) self._laser_lambda.SetFractionWidth(0) self._laser_lambda.SetIntegerWidth(4) self._laser_lambda.SetValue(780) self._laser_lambda.SetLimitOnFieldChange(True) start_volt_label = wx.StaticText(main_panel, label="Start Voltage (V):", size=(140, 20), style=wx.ALIGN_RIGHT) self._start_volt_val = NumCtrl(main_panel, size=(140, 20), style=wx.TE_PROCESS_ENTER) self._start_volt_val.SetAllowNegative(False) self._start_volt_val.SetBounds(0, 10) self._start_volt_val.SetFractionWidth(2) self._start_volt_val.SetIntegerWidth(2) self._start_volt_val.SetValue(10) self._start_volt_val.SetLimitOnFieldChange(True) end_volt_label = wx.StaticText(main_panel, label="End Voltage (V):", size=(140, 20), style=wx.ALIGN_RIGHT) self._end_volt_val = NumCtrl(main_panel, size=(150, 20), style=wx.TE_PROCESS_ENTER) self._end_volt_val.SetAllowNegative(False) self._end_volt_val.SetBounds(0, 10) self._end_volt_val.SetFractionWidth(2) self._end_volt_val.SetIntegerWidth(2) self._end_volt_val.SetValue(0) self._end_volt_val.SetLimitOnFieldChange(True) step_volt_label = wx.StaticText(main_panel, label="Absolute Step Voltage (V):", size=(140, 20), style=wx.ALIGN_RIGHT) self._step_volt_val = NumCtrl(main_panel, size=(140, 20), style=wx.TE_PROCESS_ENTER) self._step_volt_val.SetAllowNegative(False) self._step_volt_val.SetBounds(0, 10) self._step_volt_val.SetFractionWidth(2) self._step_volt_val.SetIntegerWidth(2) self._step_volt_val.SetValue(0.1) self._step_volt_val.SetLimitOnFieldChange(True) self._run_button = wx.Button(main_panel, label="Run Calibration", size=(140, 20)) self._run_button.SetForegroundColour(wx.Colour("GREEN")) self._stop_button = wx.Button(main_panel, label="Stop Calibration", size=(140, 20)) self._stop_button.SetForegroundColour(wx.Colour("RED")) self._stop_button.Disable() max_label = wx.StaticText(main_panel, label="Max Power Setting (V): ", size=(140, 20), style=wx.ALIGN_RIGHT) self._max_value = wx.StaticText(main_panel, label=self._max, size=(140, 20), style=wx.ALIGN_LEFT) min_label = wx.StaticText(main_panel, label="Min Power Setting (V): ", size=(140, 20), style=wx.ALIGN_RIGHT) self._min_value = wx.StaticText(main_panel, label=self._min, size=(140, 20), style=wx.ALIGN_LEFT) self._newport_val.Bind(wx.EVT_KILL_FOCUS, self._newport_entry) self._meadowlark_val.Bind(wx.EVT_KILL_FOCUS, self._meadowlark_entry) self._laser_lambda.Bind(wx.EVT_KILL_FOCUS, self._lambda_entry) self._save_button = wx.Button(main_panel, label="Save Values", size=(140, 20)) self._load_button = wx.Button(main_panel, label="Load Values", size=(140, 20)) self._save_button.Bind(wx.EVT_BUTTON, self._save_press) self._load_button.Bind(wx.EVT_BUTTON, self._load_press) self._run_button.Bind(wx.EVT_BUTTON, self._run_press) self._stop_button.Bind(wx.EVT_BUTTON, self._stop_press) main_sizer.AddMany([ newport_label, self._newport_val, meadowlark_label, self._meadowlark_val, meadowlark_chan, self._meadowlark_ch, laser_label, self._laser_lambda, start_volt_label, self._start_volt_val, end_volt_label, self._end_volt_val, step_volt_label, self._step_volt_val, self._run_button, self._stop_button, max_label, self._max_value, min_label, self._min_value, self._save_button, self._load_button ]) main_panel.SetSizer(main_sizer) self.Bind(wx.EVT_CLOSE, self._on_close) self._output_display = wx.TextCtrl(top_panel, size=(280, 180), style=wx.TE_MULTILINE | wx.TE_READONLY) top_sizer.Add(main_panel, 0, wx.ALL, 10) top_sizer.Add(self._output_display, 0, wx.ALL, 10) top_panel.SetSizer(top_sizer) plt_panel = wx.Panel(overall_panel, size=(500, 500)) plt_sizer = wx.BoxSizer() self._live_plt = Figure() self._live_plt.set_facecolor('w') axes_dim = [0.125, 0.125, 0.8, 0.8] self._live_plt_axes = self._live_plt.add_axes(axes_dim) self._live_plt_canvas = FigureCanvasWxAgg(plt_panel, -1, self._live_plt) plot_title = "Laser Power (mW) vs. LCVR Voltage (V)" self._live_plt_axes.set_title(plot_title) self._live_plt_axes.set_ylabel("Power (mW)") self._live_plt_axes.set_xlabel("Voltage (V)") self._live_plt_axes.grid(True) plt_sizer.Add(self._live_plt_canvas) plt_panel.SetSizer(plt_sizer) copyright_str = "\u00a9 2016 QuIN Lab " copyright_str += "Developed by Hayden Jones" copyright = wx.StaticText(overall_panel, label=copyright_str, style=wx.ALIGN_RIGHT) overall_sizer.Add(top_panel, (0, 0)) overall_sizer.Add(plt_panel, (0, 1), (2, 1)) overall_sizer.Add(copyright, (1, 0)) overall_panel.SetSizer(overall_sizer) overall_panel.Layout() self.Show() def _on_close(self, evt): if self._lcvr_init is True: self._lcvr.close() if self._pm_init is True: self._pm.close() if self._saved_data is False: if self._dataloss_warn() == wx.ID_NO: return evt.Skip() def disable_ui(self): self._newport_val.Disable() self._meadowlark_val.Disable() self._meadowlark_ch.Disable() self._laser_lambda.Disable() self._run_button.Disable() self._stop_button.Enable() self._save_button.Disable() self._load_button.Disable() def enable_ui(self): self._newport_val.Enable() self._meadowlark_val.Enable() self._meadowlark_ch.Enable() self._laser_lambda.Enable() self._run_button.Enable() self._stop_button.Disable() self._save_button.Enable() self._load_button.Enable() def get_pm_addr(self): return self._newport_val.GetValue() def get_lcvr_addr(self): return self._meadowlark_val.GetValue() def get_lcvr_ch(self): channels = {0: 1, 1: 2, 2: 3, 3: 4} return channels[self._meadowlark_ch.GetCurrentSelection()] def get_wavelength(self): return self._laser_lambda.GetValue() def get_start_volt(self): return self._start_volt_val.GetValue() def get_end_volt(self): return self._end_volt_val.GetValue() def get_step_volt(self): return self._step_volt_val.GetValue() def get_max(self): return self._max def get_min(self): return self._min def set_max(self): if self._max == self._min: return self._max_value.SetLabel(str(self._max)) def set_min(self): if self._min == self._max: return self._min_value.SetLabel(str(self._min)) def _invalid_pm_warn(self): warning_message = "Invalid Power Meter Address/Connection!" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.OK, wx.DefaultPosition) warning.ShowModal() warning.Destroy() def _invalid_lcvr_warn(self): warning_message = "Invalid LCVR Controller Address/Connection!" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.OK, wx.DefaultPosition) warning.ShowModal() warning.Destroy() def _overwrite_warn(self): warning_message = "Do you want to overwrite previous calibration?" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.YES_NO, wx.DefaultPosition) result = warning.ShowModal() warning.Destroy() return result def _dataloss_warn(self): warning_message = "Do you want to exit without saving data?" warning = wx.GenericMessageDialog(None, warning_message, "Warning!", wx.YES_NO, wx.DefaultPosition) result = warning.ShowModal() warning.Destroy() return result def _newport_entry(self, evt): # change line 308 to turn off attenuator if self._pm_init is True: return try: self._pm = Newport1830C(self.get_pm_addr()) except: self._invalid_pm_warn() return self._pm_init = True self._pm.attenuator_on() evt.Skip() def _meadowlark_entry(self, evt): if self._lcvr_init is True: return try: com_port = self._meadowlark_val.GetValue() self._lcvr = MeadowlarkD3050Controller(com_port) except: self._invalid_lcvr_warn() evt.Skip() return self._lcvr_init = True evt.Skip() def _lambda_entry(self, evt): if self._laser_lambda.IsInBounds() is False: return if self._pm_init is True: self._pm.set_wavelength(self.get_wavelength()) evt.Skip() def _run_press(self, evt): if self._data_set != []: if self._overwrite_warn() == wx.ID_NO: return self._meadowlark_entry(wx.EVT_BUTTON) self._newport_entry(wx.EVT_BUTTON) if self._pm_init is False: return if self._lcvr_init is False: return self.disable_ui() self._kill_calibration = False self._saved_data = False self._data_set = [] self._output_display.Clear() _thread.start_new_thread(self._calibration, (self.get_lcvr_ch(), )) def _stop_press(self, evt): self.enable_ui() self._kill_calibration = True def _save_press(self, evt): file_type = "Comma Separated Values file (*.csv)|*.csv" save_dialog = wx.FileDialog(self, "Save calibration data as...", "", self._filename, file_type, wx.FD_SAVE) if save_dialog.ShowModal() == wx.ID_CANCEL: return self._filename = save_dialog.GetPath() save_dialog.Destroy() with open(self._filename, 'w') as f: writer = csv.writer(f, lineterminator='\n') writer.writerow(["Date:", strftime("_%Y_%m_%d_%H-%M-%S")]) writer.writerow(["Wavelength:", self.get_wavelength()]) writer.writerows(self._data_set) self._saved_data = True def _load_press(self, evt): file_type = "Comma Separated Values file (*.csv)|*.csv" open_dialog = wx.FileDialog(self, "Open calibration data...", "", self._filename, file_type, wx.FD_OPEN) if open_dialog.ShowModal() == wx.ID_CANCEL: return self._filename = open_dialog.GetPath() open_dialog.Destroy() with open(self._filename, 'r') as f: reader = csv.reader(f) reader = list(reader) self._laser_lambda.SetValue(int(reader[1][1])) self._data_set = reader[2:] self._data_set = [[float(x[0]), float(x[1])] for x in self._data_set] self._start_volt_val.SetValue(self._data_set[0][0]) self._end_volt_val.SetValue(self._data_set[-1][0]) self._step_volt_val.SetValue( abs(self._data_set[1][0] - self._data_set[0][0])) for item in self._data_set: v = round(item[0], 3) p = round(item[1], 6) data_string = "Voltage (V):{0} Power (W):{1}\n".format(v, p) self._output_display.AppendText(data_string) self._analyze() self.set_max() self.set_min() self._update_plt(self._data_set) def _clear_plt(self): self._live_plt_axes.clear() plot_title = "Laser Power (mW) vs. LCVR Voltage (V)" self._live_plt_axes.set_title(plot_title) self._live_plt_axes.set_ylabel("Power (mW)") self._live_plt_axes.set_xlabel("Voltage (V)") self._live_plt_axes.grid(True) def _update_plt(self, data): self._clear_plt() x_data = np.array([]) y_data = np.array([]) for item in data: x_data = np.append(x_data, [item[0]]) y_data = np.append(y_data, [item[1] * 1000]) min_power = y_data.min() - y_data.min() / 20 max_power = y_data.max() + y_data.max() / 100 start_v = self.get_start_volt() end_v = self.get_end_volt() if start_v > end_v: temp = end_v end_v = start_v start_v = temp self._live_plt_axes.axis([start_v, end_v, min_power, max_power]) self._live_plt_axes.plot(x_data, y_data, 'rx') self._live_plt_canvas.draw() def _calibration(self, channel): start_v = self.get_start_volt() end_v = self.get_end_volt() if start_v > end_v: step = -self.get_step_volt() else: step = self.get_step_volt() for i in range(int(start_v * 1000), int((end_v + 0.01) * 1000), int(step * 1000)): if self._kill_calibration is True: break v = i / 1000 self._lcvr.set_voltage(channel, v) sleep(0.1) p = self._pm.get_power() self._data_set.append([v, p]) v = round(v, 3) p = round(p, 6) data_string = "Voltage (V):{0} Power (W):{1}\n".format(v, p) wx.CallAfter(self._output_display.AppendText, data_string) wx.CallAfter(self._update_plt, self._data_set) wx.CallAfter(self._stop_press, wx.EVT_BUTTON) wx.CallAfter(self._analyze) def _analyze(self): # Uses median absolute deviation (MAD) to remove outliers pow_arr = np.array([x[1] for x in self._data_set]) d = np.abs(pow_arr - np.median(pow_arr)) mdev = np.median(d) s = d / mdev if mdev else 0 pow_arr = list(pow_arr[s < 20]) min_index = pow_arr.index(min(pow_arr)) max_index = pow_arr.index(max(pow_arr)) self._min = self._data_set[min_index][0] self._max = self._data_set[max_index][0] self.set_max() self.set_min()