class ExperimentalcRED_FEI(LabelFrame): """Simple panel to assist cRED data collection (mainly rotation control) on a FEI microscope.""" def __init__(self, parent): LabelFrame.__init__(self, parent, text='cRED_FEI') self.parent = parent sbwidth = 10 self.init_vars() frame = Frame(self) Label(frame, text='Exposure time (s):').grid(row=4, column=0, sticky='W') self.e_exposure_time = Spinbox(frame, textvariable=self.var_exposure_time, width=sbwidth, from_=0.1, to=9999, increment=0.1) self.e_exposure_time.grid(row=4, column=1, sticky='W', padx=10) Label(frame, text='Target angle (deg):').grid(row=5, column=0, sticky='W') self.e_endangle = Spinbox(frame, textvariable=self.var_endangle, width=sbwidth, from_=0.1, to=9999, increment=0.5) self.e_endangle.grid(row=5, column=1, sticky='W', padx=10) Label(frame, text='Rotation speed (0 - 1):').grid(row=6, column=0, sticky='W') self.e_rotspeed = Spinbox(frame, textvariable=self.var_rotspeed, width=sbwidth, from_=-10.0, to=10.0, increment=0.2) self.e_rotspeed.grid(row=6, column=1, sticky='W', padx=10) frame.pack(side='top', fill='x', padx=10, pady=10) frame = Frame(self) Label(frame, text='Output formats:').grid(row=5, columnspan=2, sticky='EW') Checkbutton(frame, text='PETS (.tiff)', variable=self.var_save_tiff, state=DISABLED).grid(row=5, column=2, sticky='EW') Checkbutton(frame, text='REDp (.mrc)', variable=self.var_save_red, state=DISABLED).grid(row=5, column=3, sticky='EW') frame.grid_columnconfigure(0, weight=1) frame.grid_columnconfigure(1, weight=1) frame.grid_columnconfigure(2, weight=1) frame.grid_columnconfigure(3, weight=1) frame.pack(side='top', fill='x', padx=10, pady=10) frame = Frame(self) self.StartButton = Button(frame, text='Start Rotation', command=self.start_collection) self.StartButton.grid(row=1, column=0, sticky='EW') self.FinalizeButton = Button(frame, text='Stop Rotation', command=self.stop_collection, state=DISABLED) self.FinalizeButton.grid(row=1, column=2, sticky='EW') frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) frame.columnconfigure(2, weight=1) frame.pack(side='bottom', fill='x', padx=10, pady=10) def init_vars(self): self.var_exposure_time = DoubleVar(value=0.5) self.var_endangle = DoubleVar(value=60.0) self.var_rotspeed = DoubleVar(value=1.0) self.var_save_tiff = BooleanVar(value=True) self.var_save_red = BooleanVar(value=True) def set_trigger(self, trigger=None, q=None): self.triggerEvent = trigger self.q = q def start_collection(self): self.StartButton.config(state=DISABLED) self.FinalizeButton.config(state=NORMAL) self.e_exposure_time.config(state=DISABLED) self.e_rotspeed.config(state=DISABLED) self.q.put(('credfei', { 'task': 'stage.set_with_speed', 'a': self.var_endangle.get(), 'speed': self.var_rotspeed.get() })) self.triggerEvent.set() def stop_collection(self): self.StartButton.config(state=NORMAL) self.FinalizeButton.config(state=DISABLED) self.e_exposure_time.config(state=NORMAL) self.e_rotspeed.config(state=NORMAL) params = self.get_params(task='None') self.q.put(('credfei', params)) self.triggerEvent.set() def get_params(self, task=None): params = { 'exposure_time': self.var_exposure_time.get(), 'endangle': self.var_endangle.get(), 'rotspeed': self.var_rotspeed.get(), 'task': task } return params
class ExperimentalcRED_FEI(LabelFrame): """docstring for ExperimentalcRED on FEI""" def __init__(self, parent): LabelFrame.__init__(self, parent, text="cRED_FEI") self.parent = parent sbwidth = 10 self.init_vars() frame = Frame(self) Label(frame, text="Exposure time (s):").grid(row=4, column=0, sticky="W") self.e_exposure_time = Spinbox(frame, textvariable=self.var_exposure_time, width=sbwidth, from_=0.1, to=9999, increment=0.1) self.e_exposure_time.grid(row=4, column=1, sticky="W", padx=10) Label(frame, text="Target angle (deg):").grid(row=5, column=0, sticky="W") self.e_endangle = Spinbox(frame, textvariable=self.var_endangle, width=sbwidth, from_=0.1, to=9999, increment=0.5) self.e_endangle.grid(row=5, column=1, sticky="W", padx=10) Label(frame, text="Rotation speed (0 - 1):").grid(row=6, column=0, sticky="W") self.e_rotspeed = Spinbox(frame, textvariable=self.var_rotspeed, width=sbwidth, from_=-10.0, to=10.0, increment=0.2) self.e_rotspeed.grid(row=6, column=1, sticky="W", padx=10) frame.pack(side="top", fill="x", padx=10, pady=10) frame = Frame(self) Label(frame, text="Output formats:").grid(row=5, columnspan=2, sticky="EW") Checkbutton(frame, text="PETS (.tiff)", variable=self.var_save_tiff, state=DISABLED).grid(row=5, column=2, sticky="EW") Checkbutton(frame, text="REDp (.mrc)", variable=self.var_save_red, state=DISABLED).grid(row=5, column=3, sticky="EW") frame.grid_columnconfigure(0, weight=1) frame.grid_columnconfigure(1, weight=1) frame.grid_columnconfigure(2, weight=1) frame.grid_columnconfigure(3, weight=1) frame.pack(side="top", fill="x", padx=10, pady=10) frame = Frame(self) self.StartButton = Button(frame, text="Start Rotation", command=self.start_collection) self.StartButton.grid(row=1, column=0, sticky="EW") self.FinalizeButton = Button(frame, text="Stop Rotation", command=self.stop_collection, state=DISABLED) self.FinalizeButton.grid(row=1, column=2, sticky="EW") frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) frame.columnconfigure(2, weight=1) frame.pack(side="bottom", fill="x", padx=10, pady=10) def init_vars(self): self.var_exposure_time = DoubleVar(value=0.5) self.var_endangle = DoubleVar(value=60.0) self.var_rotspeed = DoubleVar(value=1.0) self.var_save_tiff = BooleanVar(value=True) self.var_save_red = BooleanVar(value=True) def set_trigger(self, trigger=None, q=None): self.triggerEvent = trigger self.q = q def start_collection(self): self.StartButton.config(state=DISABLED) self.FinalizeButton.config(state=NORMAL) self.e_exposure_time.config(state=DISABLED) self.e_rotspeed.config(state=DISABLED) self.q.put(("credfei", { "task": "stageposition.set_with_speed", "a": self.var_endangle.get(), "speed": self.var_rotspeed.get() })) self.triggerEvent.set() def stop_collection(self): self.StartButton.config(state=NORMAL) self.FinalizeButton.config(state=DISABLED) self.e_exposure_time.config(state=NORMAL) self.e_rotspeed.config(state=NORMAL) params = self.get_params(task="None") self.q.put(("credfei", params)) self.triggerEvent.set() def get_params(self, task=None): params = { "exposure_time": self.var_exposure_time.get(), "endangle": self.var_endangle.get(), "rotspeed": self.var_rotspeed.get(), "task": task } return params
class ExperimentalcRED(LabelFrame): """docstring for ExperimentalSED""" def __init__(self, parent): LabelFrame.__init__(self, parent, text="Continuous rotation electron diffraction") self.parent = parent sbwidth = 10 self.init_vars() frame = Frame(self) Label(frame, text="Exposure time (s):").grid(row=1, column=0, sticky="W") exposure_time = Spinbox(frame, textvariable=self.var_exposure_time, width=sbwidth, from_=0.0, to=100.0, increment=0.01) exposure_time.grid(row=1, column=1, sticky="W", padx=10) Checkbutton(frame, text="Beam unblanker", variable=self.var_unblank_beam).grid(row=1, column=2, sticky="W") Separator(frame, orient=HORIZONTAL).grid(row=4, columnspan=3, sticky="ew", pady=10) Checkbutton(frame, text="Enable image interval", variable=self.var_enable_image_interval, command=self.toggle_interval_buttons).grid(row=5, column=2, sticky="W") self.c_toggle_defocus = Checkbutton( frame, text="Toggle defocus", variable=self.var_toggle_diff_defocus, command=self.toggle_diff_defocus, state=DISABLED) self.c_toggle_defocus.grid(row=6, column=2, sticky="W") Label(frame, text="Image interval:").grid(row=5, column=0, sticky="W") self.e_image_interval = Spinbox(frame, textvariable=self.var_image_interval, width=sbwidth, from_=1, to=9999, increment=1, state=DISABLED) self.e_image_interval.grid(row=5, column=1, sticky="W", padx=10) Label(frame, text="Diff defocus:").grid(row=6, column=0, sticky="W") self.e_diff_defocus = Spinbox(frame, textvariable=self.var_diff_defocus, width=sbwidth, from_=-10000, to=10000, increment=100, state=DISABLED) self.e_diff_defocus.grid(row=6, column=1, sticky="W", padx=10) Label(frame, text="Image exposure (s):").grid(row=7, column=0, sticky="W") self.e_image_exposure = Spinbox( frame, textvariable=self.var_exposure_time_image, width=sbwidth, from_=0.0, to=100.0, increment=0.01, state=DISABLED) self.e_image_exposure.grid(row=7, column=1, sticky="W", padx=10) self.RelaxButton = Button(frame, text="Relax beam", command=self.relax_beam, state=DISABLED) self.RelaxButton.grid(row=7, column=2, sticky="EW") if ENABLE_FOOTFREE_OPTION: Separator(frame, orient=HORIZONTAL).grid(row=8, columnspan=3, sticky="ew", pady=10) Label(frame, text="Rotate to:").grid(row=9, column=0, sticky="W") self.e_max_rotation = Spinbox( frame, textvariable=self.var_footfree_rotate_to, width=sbwidth, from_=0.0, to=70.0, increment=1.0, state=DISABLED) self.e_max_rotation.grid(row=9, column=1, sticky="W", padx=10) Checkbutton(frame, text="Footfree mode", variable=self.var_toggle_footfree, command=self.toggle_footfree).grid(row=9, column=2, sticky="W") self.lb_coll0 = Label(frame, text="") self.lb_coll1 = Label(frame, text="") self.lb_coll2 = Label(frame, text="") self.lb_coll0.grid(row=10, column=0, columnspan=3, sticky="EW") self.lb_coll1.grid(row=11, column=0, columnspan=3, sticky="EW") self.lb_coll2.grid(row=12, column=0, columnspan=3, sticky="EW") frame.grid_columnconfigure(1, weight=1) frame.pack(side="top", fill="x", expand=False, padx=10, pady=10) frame = Frame(self) Label(frame, text="Select output formats:").grid(row=5, columnspan=2, sticky="EW") Checkbutton(frame, text=".tiff", variable=self.var_save_tiff).grid(row=5, column=2, sticky="EW") Checkbutton(frame, text="XDS (.smv)", variable=self.var_save_xds).grid(row=5, column=3, sticky="EW") Checkbutton(frame, text="DIALS (.smv)", variable=self.var_save_dials).grid(row=6, column=2, sticky="EW") Checkbutton(frame, text="REDp (.mrc)", variable=self.var_save_red).grid(row=6, column=3, sticky="EW") frame.grid_columnconfigure(0, weight=1) frame.grid_columnconfigure(1, weight=1) frame.grid_columnconfigure(2, weight=1) frame.grid_columnconfigure(3, weight=1) frame.pack(side="top", fill="x", padx=10, pady=10) frame = Frame(self) self.CollectionButton = Button(frame, text="Start Collection", command=self.start_collection) self.CollectionButton.grid(row=1, column=0, sticky="EW") self.CollectionStopButton = Button(frame, text="Stop Collection", command=self.stop_collection, state=DISABLED) self.CollectionStopButton.grid(row=1, column=1, sticky="EW") frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) frame.pack(side="bottom", fill="x", padx=10, pady=10) self.stopEvent = threading.Event() def init_vars(self): self.var_exposure_time = DoubleVar(value=0.5) self.var_unblank_beam = BooleanVar(value=False) self.var_image_interval = IntVar(value=10) self.var_diff_defocus = IntVar(value=1500) self.var_enable_image_interval = BooleanVar(value=False) self.var_toggle_diff_defocus = BooleanVar(value=False) self.var_exposure_time_image = DoubleVar(value=0.01) self.var_footfree_rotate_to = DoubleVar(value=65.0) self.var_toggle_footfree = BooleanVar(value=False) self.mode = "regular" self.var_save_tiff = BooleanVar(value=True) self.var_save_xds = BooleanVar(value=True) self.var_save_dials = BooleanVar(value=True) self.var_save_red = BooleanVar(value=True) def set_trigger(self, trigger=None, q=None): self.triggerEvent = trigger self.q = q def start_collection(self): # TODO: make a pop up window with the STOP button? if self.var_toggle_diff_defocus.get(): self.var_toggle_diff_defocus.set(False) self.toggle_diff_defocus() self.CollectionStopButton.config(state=NORMAL) self.CollectionButton.config(state=DISABLED) if self.mode == "footfree": self.lb_coll1.config(text="Data collection has started.") self.lb_coll2.config( text="Click STOP COLLECTION to end the experiment.") else: self.lb_coll1.config( text="Now you can start to rotate the goniometer at any time.") self.lb_coll2.config( text= "Click STOP COLLECTION BEFORE removing your foot from the pedal!" ) self.parent.bind_all("<space>", self.stop_collection) params = self.get_params() self.q.put(("cred", params)) self.triggerEvent.set() def stop_collection(self, event=None): self.stopEvent.set() self.parent.unbind_all("<space>") self.CollectionStopButton.config(state=DISABLED) self.CollectionButton.config(state=NORMAL) self.lb_coll1.config(text="") self.lb_coll2.config(text="") def get_params(self): params = { "exposure_time": self.var_exposure_time.get(), "exposure_time_image": self.var_exposure_time_image.get(), "unblank_beam": self.var_unblank_beam.get(), "enable_image_interval": self.var_enable_image_interval.get(), "image_interval": self.var_image_interval.get(), "diff_defocus": self.var_diff_defocus.get(), "mode": self.mode, "footfree_rotate_to": self.var_footfree_rotate_to.get(), "write_tiff": self.var_save_tiff.get(), "write_xds": self.var_save_xds.get(), "write_dials": self.var_save_dials.get(), "write_red": self.var_save_red.get(), "stop_event": self.stopEvent } return params def toggle_interval_buttons(self): enable = self.var_enable_image_interval.get() if enable: self.e_image_interval.config(state=NORMAL) self.e_image_exposure.config(state=NORMAL) self.e_diff_defocus.config(state=NORMAL) self.c_toggle_defocus.config(state=NORMAL) self.RelaxButton.config(state=NORMAL) else: self.e_image_interval.config(state=DISABLED) self.e_image_exposure.config(state=DISABLED) self.e_diff_defocus.config(state=DISABLED) self.c_toggle_defocus.config(state=DISABLED) self.RelaxButton.config(state=DISABLED) def relax_beam(self): difffocus = self.var_diff_defocus.get() self.q.put(("relax_beam", {"value": difffocus})) self.triggerEvent.set() def toggle_footfree(self): enable = self.var_toggle_footfree.get() if enable: self.mode = "footfree" self.e_max_rotation.config(state=NORMAL) else: self.mode == "regular" self.e_max_rotation.config(state=DISABLED) def toggle_diff_defocus(self): toggle = self.var_toggle_diff_defocus.get() difffocus = self.var_diff_defocus.get() self.q.put(("toggle_difffocus", { "value": difffocus, "toggle": toggle })) self.triggerEvent.set()
class ExperimentalRED(LabelFrame): """GUI panel to perform a simple RED experiment using discrete rotation steps.""" def __init__(self, parent): LabelFrame.__init__(self, parent, text='Rotation electron diffraction') self.parent = parent sbwidth = 10 self.init_vars() frame = Frame(self) Label(frame, text='Exposure time (s):').grid(row=4, column=0, sticky='W') self.e_exposure_time = Spinbox(frame, textvariable=self.var_exposure_time, width=sbwidth, from_=0.1, to=9999, increment=0.1) self.e_exposure_time.grid(row=4, column=1, sticky='W', padx=10) Label(frame, text='Tilt range (deg):').grid(row=5, column=0, sticky='W') self.e_tilt_range = Spinbox(frame, textvariable=self.var_tilt_range, width=sbwidth, from_=0.1, to=9999, increment=0.5) self.e_tilt_range.grid(row=5, column=1, sticky='W', padx=10) Label(frame, text='Step size (deg):').grid(row=6, column=0, sticky='W') self.e_stepsize = Spinbox(frame, textvariable=self.var_stepsize, width=sbwidth, from_=-10.0, to=10.0, increment=0.2) self.e_stepsize.grid(row=6, column=1, sticky='W', padx=10) frame.pack(side='top', fill='x', padx=10, pady=10) frame = Frame(self) Label(frame, text='Output formats:').grid(row=5, columnspan=2, sticky='EW') Checkbutton(frame, text='PETS (.tiff)', variable=self.var_save_tiff, state=DISABLED).grid(row=5, column=2, sticky='EW') Checkbutton(frame, text='REDp (.mrc)', variable=self.var_save_red, state=DISABLED).grid(row=5, column=3, sticky='EW') frame.grid_columnconfigure(0, weight=1) frame.grid_columnconfigure(1, weight=1) frame.grid_columnconfigure(2, weight=1) frame.grid_columnconfigure(3, weight=1) frame.pack(side='top', fill='x', padx=10, pady=10) frame = Frame(self) self.StartButton = Button(frame, text='Start Collection', command=self.start_collection) self.StartButton.grid(row=1, column=0, sticky='EW') self.ContinueButton = Button(frame, text='Continue', command=self.continue_collection, state=DISABLED) self.ContinueButton.grid(row=1, column=1, sticky='EW') self.FinalizeButton = Button(frame, text='Finalize', command=self.stop_collection, state=DISABLED) self.FinalizeButton.grid(row=1, column=2, sticky='EW') frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) frame.columnconfigure(2, weight=1) frame.pack(side='bottom', fill='x', padx=10, pady=10) def init_vars(self): self.var_exposure_time = DoubleVar(value=0.5) self.var_tilt_range = DoubleVar(value=5.0) self.var_stepsize = DoubleVar(value=1.0) self.var_save_tiff = BooleanVar(value=True) self.var_save_red = BooleanVar(value=True) def set_trigger(self, trigger=None, q=None): self.triggerEvent = trigger self.q = q def start_collection(self): self.StartButton.config(state=DISABLED) self.ContinueButton.config(state=NORMAL) self.FinalizeButton.config(state=NORMAL) self.e_exposure_time.config(state=DISABLED) self.e_stepsize.config(state=DISABLED) params = self.get_params(task='start') self.q.put(('red', params)) self.triggerEvent.set() def continue_collection(self): params = self.get_params(task='continue') self.q.put(('red', params)) self.triggerEvent.set() def stop_collection(self): self.StartButton.config(state=NORMAL) self.ContinueButton.config(state=DISABLED) self.FinalizeButton.config(state=DISABLED) self.e_exposure_time.config(state=NORMAL) self.e_stepsize.config(state=NORMAL) params = self.get_params(task='stop') self.q.put(('red', params)) self.triggerEvent.set() def get_params(self, task=None): params = { 'exposure_time': self.var_exposure_time.get(), 'tilt_range': self.var_tilt_range.get(), 'stepsize': self.var_stepsize.get(), 'task': task } return params
class ExperimentalTVIPS(LabelFrame): """docstring for ExperimentalRED""" def __init__(self, parent): LabelFrame.__init__(self, parent, text="Continuous rotation electron diffraction (TVIPS)") self.parent = parent sbwidth = 10 self.init_vars() frame = Frame(self) Label(frame, text="Target angle (degrees):").grid(row=4, column=0, sticky="W") self.e_target_angle = Spinbox(frame, textvariable=self.var_target_angle, width=sbwidth, from_=-80.0, to=80.0, increment=5.0, state=NORMAL) self.e_target_angle.grid(row=4, column=1, sticky="W", padx=10) self.InvertAngleButton = Button(frame, text="Invert", command=self.invert_angle) self.InvertAngleButton.grid(row=4, column=2, sticky="EW") self.c_toggle_manual_control = Checkbutton(frame, text="Manual rotation control", variable=self.var_toggle_manual_control, command=self.toggle_manual_control) self.c_toggle_manual_control.grid(row=4, column=3, sticky="W") # defocus button Label(frame, text="Diff defocus:").grid(row=6, column=0, sticky="W") self.e_diff_defocus = Spinbox(frame, textvariable=self.var_diff_defocus, width=sbwidth, from_=-10000, to=10000, increment=100) self.e_diff_defocus.grid(row=6, column=1, sticky="W", padx=10) Label(frame, text="Exposure (ms):").grid(row=7, column=0, sticky="W") self.e_exposure = Spinbox(frame, textvariable=self.var_exposure, width=sbwidth, from_=0, to=10000, increment=100) self.e_exposure.grid(row=7, column=1, sticky="W", padx=10) Label(frame, text="Mode:").grid(row=8, column=0, sticky="W") self.o_mode = OptionMenu(frame, self.var_mode, 'diff', 'diff', 'mag1', 'mag2', 'lowmag', 'samag') self.o_mode.grid(row=8, column=1, sticky="W", padx=10) self.c_toggle_defocus = Checkbutton(frame, text="Toggle defocus", variable=self.var_toggle_diff_defocus, command=self.toggle_diff_defocus) self.c_toggle_defocus.grid(row=6, column=3, sticky="W") self.b_reset_defocus = Button(frame, text="Reset", command=self.reset_diff_defocus, state=DISABLED) self.b_reset_defocus.grid(row=6, column=2, sticky="EW") self.c_toggle_diffraction = Checkbutton(frame, text="Toggle DIFF", variable=self.var_toggle_diff_mode, command=self.toggle_diff_mode) self.c_toggle_diffraction.grid(row=7, column=3, sticky="W") self.c_toggle_screen = Checkbutton(frame, text="Toggle screen", variable=self.var_toggle_screen, command=self.toggle_screen) self.c_toggle_screen.grid(row=8, column=3, sticky="W") self.b_start_liveview = Button(frame, text="Start live view", command=self.start_liveview) self.b_start_liveview.grid(row=7, column=2, sticky="EW") self.b_stop_liveview = Button(frame, text="Stop live view", command=self.stop_liveview) self.b_stop_liveview.grid(row=8, column=2, sticky="EW") self.c_toggle_beamblank = Checkbutton(frame, text="Toggle beamblank", variable=self.var_toggle_beamblank, command=self.toggle_beamblank) self.c_toggle_beamblank.grid(row=10, column=3, sticky="W") frame.pack(side="top", fill="x", padx=10, pady=10) frame = Frame(self) self.e_instructions = Entry(frame, width=50, textvariable=self.var_instruction_file) self.e_instructions.grid(row=4, column=1, sticky="EW") self.BrowseTrackButton = Button(frame, text="Browse..", command=self.browse_instructions) self.BrowseTrackButton.grid(row=4, column=2, sticky="EW") Label(frame, text="Instruction file:").grid(row=4, column=0, sticky="W") frame.pack(side="top", fill="x", padx=10, pady=10) frame = Frame(self) self.SearchButton = Button(frame, text="Search", command=self.search) self.SearchButton.grid(row=1, column=0, sticky="EW") self.FocusButton = Button(frame, text="Focus", command=self.focus) self.FocusButton.grid(row=1, column=1, sticky="EW") self.GetImageButton = Button(frame, text="Get image", command=self.get_image) self.GetImageButton.grid(row=1, column=2, sticky="EW") frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) frame.columnconfigure(2, weight=1) frame.pack(fill="x", padx=10, pady=10) frame = Frame(self) self.SerialButton = Button(frame, text="Start serial acquisition", width=25, command=self.serial_collection) self.SerialButton.grid(row=1, column=0, sticky="EW") frame.pack(fill="x", padx=10, pady=10) frame = Frame(self) self.GetReadyButton = Button(frame, text="Get Ready", command=self.prime_collection) self.GetReadyButton.grid(row=1, column=0, sticky="EW") self.AcquireButton = Button(frame, text="Acquire", command=self.start_collection, state=DISABLED) self.AcquireButton.grid(row=1, column=1, sticky="EW") self.FinalizeButton = Button(frame, text="Finalize", command=self.stop_collection, state=DISABLED) self.FinalizeButton.grid(row=1, column=2, sticky="EW") frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) frame.columnconfigure(2, weight=1) frame.pack(side="bottom", fill="x", padx=10, pady=10) from instamatic import TEMController self.ctrl = TEMController.get_instance() def init_vars(self): self.var_target_angle = DoubleVar(value=40.0) self.var_exposure = IntVar(value=400) self.var_save_tiff = BooleanVar(value=True) self.var_save_red = BooleanVar(value=True) self.var_diff_defocus = IntVar(value=1500) self.var_toggle_diff_defocus = BooleanVar(value=False) self.var_toggle_beamblank = BooleanVar(value=False) self.var_toggle_diff_mode = BooleanVar(value=False) self.var_toggle_screen = BooleanVar(value=False) self.var_toggle_manual_control = BooleanVar(value=False) self.var_instruction_file = StringVar(value="") self.var_mode = StringVar(value="diff") def set_trigger(self, trigger=None, q=None): self.triggerEvent = trigger self.q = q def invert_angle(self): angle = self.var_target_angle.get() self.var_target_angle.set(-angle) def disable_ui(self): self.InvertAngleButton.config(state=DISABLED) self.GetReadyButton.config(state=DISABLED) self.AcquireButton.config(state=NORMAL) self.FinalizeButton.config(state=NORMAL) self.SerialButton.config(state=DISABLED) self.e_target_angle.config(state=DISABLED) self.SearchButton.config(state=DISABLED) self.FocusButton.config(state=DISABLED) self.GetImageButton.config(state=DISABLED) self.b_start_liveview.config(state=DISABLED) self.b_stop_liveview.config(state=DISABLED) def enable_ui(self): self.InvertAngleButton.config(state=NORMAL) self.GetReadyButton.config(state=NORMAL) self.AcquireButton.config(state=DISABLED) self.FinalizeButton.config(state=DISABLED) self.SerialButton.config(state=NORMAL) if not self.var_toggle_manual_control.get(): self.e_target_angle.config(state=NORMAL) self.SearchButton.config(state=NORMAL) self.FocusButton.config(state=NORMAL) self.GetImageButton.config(state=NORMAL) self.b_start_liveview.config(state=NORMAL) self.b_stop_liveview.config(state=NORMAL) def prime_collection(self): self.disable_ui() # self.e_target_angle.config(state=DISABLED) params = self.get_params(task="get_ready") self.q.put(("cred_tvips", params)) self.triggerEvent.set() def start_collection(self): self.AcquireButton.config(state=DISABLED) params = self.get_params(task="acquire") self.q.put(("cred_tvips", params)) self.triggerEvent.set() def stop_collection(self): self.enable_ui() params = self.get_params(task="stop") self.q.put(("cred_tvips", params)) self.triggerEvent.set() def serial_collection(self): self.disable_ui() params = self.get_params(task="serial") self.q.put(("cred_tvips", params)) self.triggerEvent.set() def browse_instructions(self): fn = filedialog.askopenfilename(parent=self.parent, initialdir=None, title="Select instruction file") if not fn: return fn = Path(fn).absolute() self.var_instruction_file.set(fn) return fn def get_params(self, task=None): params = { "target_angle": self.var_target_angle.get(), "instruction_file": self.var_instruction_file.get(), "exposure": self.var_exposure.get(), "mode": self.var_mode.get(), "manual_control": self.var_toggle_manual_control.get(), "task": task } return params def toggle_manual_control(self): toggle = self.var_toggle_manual_control.get() if toggle: self.e_target_angle.config(state=DISABLED) else: self.e_target_angle.config(state=NORMAL) def toggle_diff_mode(self): toggle = self.var_toggle_diff_mode.get() if toggle: self.ctrl.mode_diffraction() else: self.ctrl.mode_mag1() def toggle_beamblank(self): toggle = self.var_toggle_beamblank.get() if toggle: self.ctrl.beamblank_on() else: self.ctrl.beamblank_off() def toggle_screen(self): toggle = self.var_toggle_screen.get() if toggle: self.ctrl.screen_up() else: self.ctrl.screen_down() def start_liveview(self): self.ctrl.cam.start_liveview() def stop_liveview(self): self.ctrl.cam.stop_liveview() def toggle_diff_defocus(self): toggle = self.var_toggle_diff_defocus.get() if toggle: offset = self.var_diff_defocus.get() self.ctrl.difffocus.defocus(offset=offset) self.b_reset_defocus.config(state=NORMAL) else: self.ctrl.difffocus.refocus() self.var_toggle_diff_defocus.set(False) def reset_diff_defocus(self): self.ctrl.difffocus.refocus() self.var_toggle_diff_defocus.set(False) def search(self): self.ctrl.run_script("search_mode.py") def focus(self): self.ctrl.run_script("focus_mode.py") def get_image(self): self.ctrl.cam.acquireImage()
class ExperimentalcRED(LabelFrame): """GUI panel for doing cRED experiments on a Timepix camera.""" def __init__(self, parent): LabelFrame.__init__(self, parent, text='Continuous rotation electron diffraction') self.parent = parent sbwidth = 10 self.init_vars() frame = Frame(self) Label(frame, text='Exposure time (s):').grid(row=1, column=0, sticky='W') exposure_time = Spinbox(frame, textvariable=self.var_exposure_time, width=sbwidth, from_=0.0, to=100.0, increment=0.01) exposure_time.grid(row=1, column=1, sticky='W', padx=10) Checkbutton(frame, text='Beam unblanker', variable=self.var_unblank_beam).grid(row=1, column=2, sticky='W') Separator(frame, orient=HORIZONTAL).grid(row=4, columnspan=3, sticky='ew', pady=10) Checkbutton(frame, text='Enable image interval', variable=self.var_enable_image_interval, command=self.toggle_interval_buttons).grid(row=5, column=2, sticky='W') self.c_toggle_defocus = Checkbutton( frame, text='Toggle defocus', variable=self.var_toggle_diff_defocus, command=self.toggle_diff_defocus, state=DISABLED) self.c_toggle_defocus.grid(row=6, column=2, sticky='W') Label(frame, text='Image interval:').grid(row=5, column=0, sticky='W') self.e_image_interval = Spinbox(frame, textvariable=self.var_image_interval, width=sbwidth, from_=1, to=9999, increment=1, state=DISABLED) self.e_image_interval.grid(row=5, column=1, sticky='W', padx=10) Label(frame, text='Diff defocus:').grid(row=6, column=0, sticky='W') self.e_diff_defocus = Spinbox(frame, textvariable=self.var_diff_defocus, width=sbwidth, from_=-10000, to=10000, increment=100, state=DISABLED) self.e_diff_defocus.grid(row=6, column=1, sticky='W', padx=10) Label(frame, text='Image exposure (s):').grid(row=7, column=0, sticky='W') self.e_image_exposure = Spinbox( frame, textvariable=self.var_exposure_time_image, width=sbwidth, from_=0.0, to=100.0, increment=0.01, state=DISABLED) self.e_image_exposure.grid(row=7, column=1, sticky='W', padx=10) self.RelaxButton = Button(frame, text='Relax beam', command=self.relax_beam, state=DISABLED) self.RelaxButton.grid(row=7, column=2, sticky='EW') if ENABLE_FOOTFREE_OPTION: Separator(frame, orient=HORIZONTAL).grid(row=8, columnspan=3, sticky='ew', pady=10) Label(frame, text='Rotate to:').grid(row=9, column=0, sticky='W') self.e_max_rotation = Spinbox( frame, textvariable=self.var_footfree_rotate_to, width=sbwidth, from_=0.0, to=70.0, increment=1.0, state=DISABLED) self.e_max_rotation.grid(row=9, column=1, sticky='W', padx=10) Checkbutton(frame, text='Footfree mode', variable=self.var_toggle_footfree, command=self.toggle_footfree).grid(row=9, column=2, sticky='W') self.lb_coll0 = Label(frame, text='') self.lb_coll1 = Label(frame, text='') self.lb_coll2 = Label(frame, text='') self.lb_coll0.grid(row=10, column=0, columnspan=3, sticky='EW') self.lb_coll1.grid(row=11, column=0, columnspan=3, sticky='EW') self.lb_coll2.grid(row=12, column=0, columnspan=3, sticky='EW') frame.grid_columnconfigure(1, weight=1) frame.pack(side='top', fill='x', expand=False, padx=10, pady=10) frame = Frame(self) Label(frame, text='Select output formats:').grid(row=5, columnspan=2, sticky='EW') Checkbutton(frame, text='.tiff', variable=self.var_save_tiff).grid(row=5, column=2, sticky='EW') Checkbutton(frame, text='XDS (.smv)', variable=self.var_save_xds).grid(row=5, column=3, sticky='EW') Checkbutton(frame, text='DIALS (.smv)', variable=self.var_save_dials).grid(row=6, column=2, sticky='EW') Checkbutton(frame, text='REDp (.mrc)', variable=self.var_save_red).grid(row=6, column=3, sticky='EW') frame.grid_columnconfigure(0, weight=1) frame.grid_columnconfigure(1, weight=1) frame.grid_columnconfigure(2, weight=1) frame.grid_columnconfigure(3, weight=1) frame.pack(side='top', fill='x', padx=10, pady=10) frame = Frame(self) self.CollectionButton = Button(frame, text='Start Collection', command=self.start_collection) self.CollectionButton.grid(row=1, column=0, sticky='EW') self.CollectionStopButton = Button(frame, text='Stop Collection', command=self.stop_collection, state=DISABLED) self.CollectionStopButton.grid(row=1, column=1, sticky='EW') frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) frame.pack(side='bottom', fill='x', padx=10, pady=10) self.stopEvent = threading.Event() def init_vars(self): self.var_exposure_time = DoubleVar(value=0.5) self.var_unblank_beam = BooleanVar(value=False) self.var_image_interval = IntVar(value=10) self.var_diff_defocus = IntVar(value=1500) self.var_enable_image_interval = BooleanVar(value=False) self.var_toggle_diff_defocus = BooleanVar(value=False) self.var_exposure_time_image = DoubleVar(value=0.01) self.var_footfree_rotate_to = DoubleVar(value=65.0) self.var_toggle_footfree = BooleanVar(value=False) self.mode = 'regular' self.var_save_tiff = BooleanVar(value=True) self.var_save_xds = BooleanVar(value=True) self.var_save_dials = BooleanVar(value=True) self.var_save_red = BooleanVar(value=True) def set_trigger(self, trigger=None, q=None): self.triggerEvent = trigger self.q = q def start_collection(self): # TODO: make a pop up window with the STOP button? if self.var_toggle_diff_defocus.get(): self.var_toggle_diff_defocus.set(False) self.toggle_diff_defocus() self.CollectionStopButton.config(state=NORMAL) self.CollectionButton.config(state=DISABLED) if self.mode == 'footfree': self.lb_coll1.config(text='Data collection has started.') self.lb_coll2.config( text='Click STOP COLLECTION to end the experiment.') else: self.lb_coll1.config( text='Now you can start to rotate the goniometer at any time.') self.lb_coll2.config( text= 'Click STOP COLLECTION BEFORE removing your foot from the pedal!' ) self.parent.bind_all('<space>', self.stop_collection) params = self.get_params() self.q.put(('cred', params)) self.triggerEvent.set() def stop_collection(self, event=None): self.stopEvent.set() self.parent.unbind_all('<space>') self.CollectionStopButton.config(state=DISABLED) self.CollectionButton.config(state=NORMAL) self.lb_coll1.config(text='') self.lb_coll2.config(text='') def get_params(self): params = { 'exposure_time': self.var_exposure_time.get(), 'exposure_time_image': self.var_exposure_time_image.get(), 'unblank_beam': self.var_unblank_beam.get(), 'enable_image_interval': self.var_enable_image_interval.get(), 'image_interval': self.var_image_interval.get(), 'diff_defocus': self.var_diff_defocus.get(), 'mode': self.mode, 'footfree_rotate_to': self.var_footfree_rotate_to.get(), 'write_tiff': self.var_save_tiff.get(), 'write_xds': self.var_save_xds.get(), 'write_dials': self.var_save_dials.get(), 'write_red': self.var_save_red.get(), 'stop_event': self.stopEvent } return params def toggle_interval_buttons(self): enable = self.var_enable_image_interval.get() if enable: self.e_image_interval.config(state=NORMAL) self.e_image_exposure.config(state=NORMAL) self.e_diff_defocus.config(state=NORMAL) self.c_toggle_defocus.config(state=NORMAL) self.RelaxButton.config(state=NORMAL) else: self.e_image_interval.config(state=DISABLED) self.e_image_exposure.config(state=DISABLED) self.e_diff_defocus.config(state=DISABLED) self.c_toggle_defocus.config(state=DISABLED) self.RelaxButton.config(state=DISABLED) def relax_beam(self): difffocus = self.var_diff_defocus.get() self.q.put(('relax_beam', {'value': difffocus})) self.triggerEvent.set() def toggle_footfree(self): enable = self.var_toggle_footfree.get() if enable: self.mode = 'footfree' self.e_max_rotation.config(state=NORMAL) else: self.mode == 'regular' self.e_max_rotation.config(state=DISABLED) def toggle_diff_defocus(self): toggle = self.var_toggle_diff_defocus.get() difffocus = self.var_diff_defocus.get() self.q.put(('toggle_difffocus', { 'value': difffocus, 'toggle': toggle })) self.triggerEvent.set()
class ExperimentalRED(LabelFrame): """docstring for ExperimentalRED""" def __init__(self, parent): LabelFrame.__init__(self, parent, text="Rotation electron diffraction") self.parent = parent sbwidth = 10 self.init_vars() frame = Frame(self) Label(frame, text="Exposure time (s):").grid(row=4, column=0, sticky="W") self.e_exposure_time = Spinbox(frame, textvariable=self.var_exposure_time, width=sbwidth, from_=0.1, to=9999, increment=0.1) self.e_exposure_time.grid(row=4, column=1, sticky="W", padx=10) Label(frame, text="Tilt range (deg):").grid(row=5, column=0, sticky="W") self.e_tilt_range = Spinbox(frame, textvariable=self.var_tilt_range, width=sbwidth, from_=0.1, to=9999, increment=0.5) self.e_tilt_range.grid(row=5, column=1, sticky="W", padx=10) Label(frame, text="Step size (deg):").grid(row=6, column=0, sticky="W") self.e_stepsize = Spinbox(frame, textvariable=self.var_stepsize, width=sbwidth, from_=-10.0, to=10.0, increment=0.2) self.e_stepsize.grid(row=6, column=1, sticky="W", padx=10) frame.pack(side="top", fill="x", padx=10, pady=10) frame = Frame(self) Label(frame, text="Output formats:").grid(row=5, columnspan=2, sticky="EW") Checkbutton(frame, text="PETS (.tiff)", variable=self.var_save_tiff, state=DISABLED).grid(row=5, column=2, sticky="EW") Checkbutton(frame, text="REDp (.mrc)", variable=self.var_save_red, state=DISABLED).grid(row=5, column=3, sticky="EW") frame.grid_columnconfigure(0, weight=1) frame.grid_columnconfigure(1, weight=1) frame.grid_columnconfigure(2, weight=1) frame.grid_columnconfigure(3, weight=1) frame.pack(side="top", fill="x", padx=10, pady=10) frame = Frame(self) self.StartButton = Button(frame, text="Start Collection", command=self.start_collection) self.StartButton.grid(row=1, column=0, sticky="EW") self.ContinueButton = Button(frame, text="Continue", command=self.continue_collection, state=DISABLED) self.ContinueButton.grid(row=1, column=1, sticky="EW") self.FinalizeButton = Button(frame, text="Finalize", command=self.stop_collection, state=DISABLED) self.FinalizeButton.grid(row=1, column=2, sticky="EW") frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) frame.columnconfigure(2, weight=1) frame.pack(side="bottom", fill="x", padx=10, pady=10) def init_vars(self): self.var_exposure_time = DoubleVar(value=0.5) self.var_tilt_range = DoubleVar(value=5.0) self.var_stepsize = DoubleVar(value=1.0) self.var_save_tiff = BooleanVar(value=True) self.var_save_red = BooleanVar(value=True) def set_trigger(self, trigger=None, q=None): self.triggerEvent = trigger self.q = q def start_collection(self): self.StartButton.config(state=DISABLED) self.ContinueButton.config(state=NORMAL) self.FinalizeButton.config(state=NORMAL) self.e_exposure_time.config(state=DISABLED) self.e_stepsize.config(state=DISABLED) params = self.get_params(task="start") self.q.put(("red", params)) self.triggerEvent.set() def continue_collection(self): params = self.get_params(task="continue") self.q.put(("red", params)) self.triggerEvent.set() def stop_collection(self): self.StartButton.config(state=NORMAL) self.ContinueButton.config(state=DISABLED) self.FinalizeButton.config(state=DISABLED) self.e_exposure_time.config(state=NORMAL) self.e_stepsize.config(state=NORMAL) params = self.get_params(task="stop") self.q.put(("red", params)) self.triggerEvent.set() def get_params(self, task=None): params = { "exposure_time": self.var_exposure_time.get(), "tilt_range": self.var_tilt_range.get(), "stepsize": self.var_stepsize.get(), "task": task } return params