Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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()
Esempio n. 4
0
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
Esempio n. 5
0
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()
Esempio n. 6
0
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()
Esempio n. 7
0
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