Пример #1
0
    def dropEvent(self, event):

        # Get filename(s)
        filenames = []
        for url in event.mimeData().urls():
            filenames.append(str(url.toLocalFile()))

        # Send message(s) with filenames.
        for filename in sorted(filenames):
            [file_type, error_text] = params.fileType(filename)
            if (file_type == "parameters"):
                self.xml_directory = os.path.dirname(filename)
                self.guiMessage.emit(
                    halMessage.HalMessage(m_type="new parameters file",
                                          data={"filename": filename}))
            elif (file_type == "shutters"):
                self.xml_directory = os.path.dirname(filename)
                self.guiMessage.emit(
                    halMessage.HalMessage(m_type="new shutters file",
                                          data={"filename": filename}))
            else:
                if error_text:
                    halMessageBox.halMessageBoxInfo("XML file parsing error " +
                                                    error_text + ".")
                else:
                    halMessageBox.halMessageBoxInfo(
                        "File type not recognized.")
Пример #2
0
 def getHalMessage(self):
     if self.filming:
         return halMessage.HalMessage(source = self,
                                      m_type = "stop film request")
     else:
         return halMessage.HalMessage(source = self,
                                      m_type = "start film request",
                                      data = {"request" : filmRequest.FilmRequest()})
Пример #3
0
 def handleToggleFilm(self):
     if not self.waiting_for_film:
         if self.filming:
             self.sendMessage(halMessage.HalMessage(m_type = "stop film request"))
         else:
             self.sendMessage(halMessage.HalMessage(m_type = "start film request",
                                                    data = {"request" : filmRequest.FilmRequest()}))
         self.waiting_for_film = True
Пример #4
0
 def setLockout(self, state, acquisition_parameters = None):
     self.locked_out = state
     if acquisition_parameters is not None:
         self.sendMessage(halMessage.HalMessage(m_type = "film lockout",
                                                data = {"locked out" : self.locked_out,
                                                        "acquisition parameters" : acquisition_parameters}))
     else:
         self.sendMessage(halMessage.HalMessage(m_type = "film lockout",
                                                data = {"locked out" : self.locked_out}))
Пример #5
0
    def processMessage(self, message):

        if message.isType("configure1"):

            # Initial UI configuration.
            self.view.setObjectiveText(getObjectiveName(self.parameters))

            # Add view to HAL UI display.
            self.sendMessage(halMessage.HalMessage(m_type = "add to ui",
                                                   data = self.configure_dict))

            # Broadcast initial parameters.
            self.sendMessage(halMessage.HalMessage(m_type = "initial parameters",
                                                   data = {"parameters" : self.parameters}))

            # Broadcast initial pixel size.
            self.sendPixelSize(getObjectivePixelSize(self.parameters))

        elif message.isType("new parameters"):
            message.addResponse(halMessage.HalMessageResponse(source = self.module_name,
                                                              data = {"old parameters" : self.parameters.copy()}))

            # Update parameters.
            p = message.getData()["parameters"].get(self.module_name)
            if (self.parameters.get("objective") != p.get("objective")):
                objective = p.get("objective")
                self.parameters.setv("objective", objective)
                self.view.setObjectiveText(getObjectiveName(self.parameters))
                
                self.sendPixelSize(getObjectivePixelSize(self.parameters))

            message.addResponse(halMessage.HalMessageResponse(source = self.module_name,
                                                              data = {"new parameters" : self.parameters}))

        elif message.isType("stop film"):
            message.addResponse(halMessage.HalMessageResponse(source = self.module_name,
                                                              data = {"parameters" : self.parameters}))

        elif message.isType("tcp message"):
            tcp_message = message.getData()["tcp message"]
            if tcp_message.isType("Get Mosaic Settings"):
                if not tcp_message.isTest():
                    i = 1
                    pname = "obj" + str(i)
                    while self.parameters.has(pname):
                        tcp_message.addResponse(pname, self.parameters.get(pname))
                        i += 1
                        pname = "obj" + str(i)
                message.addResponse(halMessage.HalMessageResponse(source = self.module_name,
                                                                  data = {"handled" : True}))
                
            elif tcp_message.isType("Get Objective"):
                if not tcp_message.isTest():
                    obj_data = self.parameters.get(self.parameters.get("objective"))
                    tcp_message.addResponse("objective", obj_data.split(",")[0])
                message.addResponse(halMessage.HalMessageResponse(source = self.module_name,
                                                                  data = {"handled" : True}))
Пример #6
0
    def processMessage(self, message):

        if message.isType("configuration"):
            if message.sourceIs("focuslock"):
                qpd_fn_name = message.getData(
                )["properties"]["qpd functionality name"]
                self.sendMessage(
                    halMessage.HalMessage(m_type="get functionality",
                                          data={
                                              "name": qpd_fn_name,
                                              "extra data": "qpd_fn"
                                          }))

            elif message.sourceIs("stage"):
                stage_fn_name = message.getData(
                )["properties"]["stage functionality name"]
                self.sendMessage(
                    halMessage.HalMessage(m_type="get functionality",
                                          data={
                                              "name": stage_fn_name,
                                              "extra data": "stage_fn"
                                          }))

        elif message.isType("configure1"):
            self.sendMessage(
                halMessage.HalMessage(m_type="get functionality",
                                      data={
                                          "name": "display",
                                          "extra data":
                                          "camera_frame_viewer_fn"
                                      }))

            self.sendMessage(
                halMessage.HalMessage(
                    m_type="initial parameters",
                    data={"parameters": self.bt_control.getParameters()}))

        elif message.isType("film lockout"):
            if message.getData()["locked out"]:
                self.bt_control.startFilm()
            else:
                self.bt_control.stopFilm()

        elif message.isType("new parameters"):
            p = message.getData()["parameters"]
            message.addResponse(
                halMessage.HalMessageResponse(
                    source=self.module_name,
                    data={
                        "old parameters":
                        self.bt_control.getParameters().copy()
                    }))
            self.bt_control.newParameters(p.get(self.module_name))
            message.addResponse(
                halMessage.HalMessageResponse(
                    source=self.module_name,
                    data={"new parameters": self.bt_control.getParameters()}))
Пример #7
0
    def processMessage(self, message):

        if message.isType("change directory"):
            self.view.setDirectory(message.getData()["directory"])

        elif message.isType("configure1"):
            self.sendMessage(
                halMessage.HalMessage(m_type="add to menu",
                                      data={
                                          "item name": "Stage",
                                          "item data": "stage"
                                      }))

            self.sendMessage(
                halMessage.HalMessage(m_type="get functionality",
                                      data={"name": self.stage_fn_name}))

            self.sendMessage(
                halMessage.HalMessage(
                    m_type="initial parameters",
                    data={"parameters": self.view.getParameters()}))

            self.sendMessage(
                halMessage.HalMessage(m_type="configuration",
                                      data={
                                          "properties": {
                                              "stage functionality name":
                                              self.stage_fn_name
                                          }
                                      }))

        elif message.isType("new parameters"):
            p = message.getData()["parameters"]
            message.addResponse(
                halMessage.HalMessageResponse(
                    source=self.module_name,
                    data={"old parameters": self.view.getParameters().copy()}))
            self.view.newParameters(p.get(self.module_name))
            message.addResponse(
                halMessage.HalMessageResponse(
                    source=self.module_name,
                    data={"new parameters": self.view.getParameters()}))

        elif message.isType("show"):
            if (message.getData()["show"] == "stage"):
                self.view.show()

        elif message.isType("start"):
            if message.getData()["show_gui"]:
                self.view.showIfVisible()

        elif message.isType("stop film"):
            message.addResponse(
                halMessage.HalMessageResponse(
                    source=self.module_name,
                    data={"parameters": self.view.getParameters()}))
Пример #8
0
    def handleResponse(self, message, response):
        if message.isType("get functionality"):
            self.timing_functionality.connectCameraFunctionality(response.getData()["functionality"])

            # Broadcast timing information for the film.
            props = {"functionality" : self.timing_functionality}
            self.sendMessage(halMessage.HalMessage(m_type = "configuration",
                                                   data = {"properties" : props}))
            
            # Tell film.film that this module is ready to film.
            self.sendMessage(halMessage.HalMessage(m_type = "ready to film"))
Пример #9
0
    def stopCameras(self):
        
        # Stop master cameras first.
        self.sendMessage(halMessage.HalMessage(m_type = "stop camera",
                                               data = {"master" : True}))

        # Force sync.
        self.sendMessage(halMessage.SyncMessage(self))

        # Stop slave cameras last.
        self.sendMessage(halMessage.HalMessage(m_type = "stop camera",
                                               data = {"master" : False},
                                               finalizer = self.handleStopCamera))
Пример #10
0
    def configure1(self):
        """
        Send messages with the UI elements to HAL.
        """
        self.guiMessage.emit(halMessage.HalMessage(source = self,
                                                   m_type = "add to ui",
                                                   data = {"ui_parent" : "hal.cameraFrame",
                                                           "ui_widget" : self.frame_viewer}))

        self.guiMessage.emit(halMessage.HalMessage(source = self,
                                                   m_type = "add to ui",
                                                   data = {"ui_order" : 2,
                                                           "ui_parent" : "hal.containerWidget",
                                                           "ui_widget" : self.params_viewer}))
Пример #11
0
    def processMessage(self, message):

        if message.isType("configuration"):
            if message.sourceIs("feeds"):
                cur_time_base = self.parameters.get("time_base")
                self.parameters.getp("time_base").setAllowed(message.getData()["properties"]["feed names"])
                self.parameters.setv("time_base", cur_time_base)

        elif message.isType("configure1"):

            # Broadcast initial parameters.
            self.sendMessage(halMessage.HalMessage(m_type = "initial parameters",
                                                   data = {"parameters" : self.parameters}))

            # Let film.film know that it needs to wait for us
            # to get ready before starting the cameras.
            self.sendMessage(halMessage.HalMessage(m_type = "wait for",
                                                   data = {"module names" : ["film"]}))

        elif message.isType("new parameters"):
            #
            # FIXME: The problem is that we won't know the allowed set of feed names until
            #        feeds.feeds sends the 'configuration' message. Using the old allowed
            #        might cause a problem as the new time base might not exist in the
            #        old allowed. For now we are just setting allowed to be whatever the
            #        time_base parameter value is. Then at 'feed names' we check that
            #        that the parameter is valid. If it is not valid this will break HAL
            #        at an unexpected point, the error should have been detected in
            #        'new parameters'. Also the editor won't work because the version of the
            #        parameter that it has only allows one value. Somehow we need to know
            #        the valid feed names at the new parameter stage..
            #
            message.addResponse(halMessage.HalMessageResponse(source = self.module_name,
                                                              data = {"old parameters" : self.parameters.copy()}))
            p = message.getData()["parameters"].get(self.module_name)
            self.setAllowed([p.get("time_base")])
            self.parameters.setv("time_base", p.get("time_base"))
            message.addResponse(halMessage.HalMessageResponse(source = self.module_name,
                                                              data = {"new parameters" : self.parameters}))

        elif message.isType("start film"):
            self.timing_functionality = TimingFunctionality(time_base = self.parameters.get("time_base"))
            self.sendMessage(halMessage.HalMessage(m_type = "get functionality",
                                                   data = {"name" : self.timing_functionality.getTimeBase()}))

        elif message.isType("stop film"):
            self.timing_functionality.disconnectCameraFunctionality()
            self.timing_functionality = None
            message.addResponse(halMessage.HalMessageResponse(source = self.module_name,
                                                              data = {"parameters" : self.parameters.copy()}))
Пример #12
0
 def handleControlMessage(self, message):
     """
     These are messages from the Bluetooth Control class.
     """
     if (message[0] == "lock jump"):
         if halMessage.isValidMessageName("lock jump"):
             self.sendMessage(halMessage.HalMessage(m_type = "lock jump",
                                                    data = {"delta" : message[1]}))
             
     elif (message[0] == "start film"):
         self.sendMessage(halMessage.HalMessage(m_type = "start film request",
                                                data = {"request" : filmRequest.FilmRequest()}))
         
     elif (message[0] == "stop film"):
         self.sendMessage(halMessage.HalMessage(m_type = "stop film request"))
Пример #13
0
 def handleLiveModeChange(self, state):
     if state:
         self.startCameras()
     else:
         self.stopCameras()
     self.sendMessage(halMessage.HalMessage(m_type = "live mode",
                                            data = {"live mode" : state}))
Пример #14
0
 def handleFeedChange(self, feed_name):
     self.guiMessage.emit(
         halMessage.HalMessage(m_type="get functionality",
                               data={
                                   "name": feed_name,
                                   "extra data": self.module_name
                               }))
Пример #15
0
    def handleResponses(self, message):
        #
        # This handles the case that the requested parameters are already
        # the current parameters.
        #

        # Check that this is a response to the 'set parameters' message.
        if not message.isType("set parameters"):
            return False
        
        # Check if this a response to our action, or a response to some
        # other message from the tcpControl class.
        if (message != self.hal_message):
            return False
        
        # Check for singleton response.
        responses = message.getResponses()
        assert (len(responses) == 1)

        # Check that the requested parameters were found.
        found = responses[0].getData()["found"]
        if not found:
            self.tcp_message.setError(True, "Parameters '" + self.tcp_message.getData("parameters") + "' not found")
            self.was_handled = True
            return True

        # If these are the current parameters, send a 'start film request', if
        # they are not then 'settings.settings' will switch HAL to these parameters
        # and we'll monitor for the completion of the parameter change.
        if responses[0].getData()["current"]:
            msg = halMessage.HalMessage(m_type = "start film request",
                                        data = {"request" : self.film_request})
            self.actionMessage.emit(msg)

        return False
Пример #16
0
    def newParameters(self, parameters):
        """
        Calls channels newParameters method, then updates the size of 
        the dialog as appropriate to fit all of the channels.
        """
        current_position = self.pos()

        # A sanity check that settings.settings is not giving us bad parameters.
        for attr in parameters.getAttrs():
            assert (type(self.parameters.getp(attr)) == type(
                parameters.getp(attr)))

        self.parameters = parameters

        for channel in self.channels:
            channel.newParameters(self.parameters)

        #
        # If the number of buttons change, this can cause the dialog to jump
        # so we need to keep track of it's current position and reset to
        # that position.
        #
        self.adjustSize()
        self.setFixedSize(self.width(), self.height())

        self.move(current_position)

        # Update shutters file by sending a message so that film.film also updates.
        self.guiMessage.emit(
            halMessage.HalMessage(
                m_type="new shutters file",
                data={"filename": self.parameters.get("shutters")}))
Пример #17
0
    def startFilmingLevel2(self):
        """
        Then once all the cameras are stopped configure the imagewriters 
        for all of the feeds, and send the 'start film' message, followed 
        by the 'start camera' message.
        """
        self.film_state = "run"

        #
        # Check if we are going to overwrite existing files by checking
        # if we are going to overwrite the movies .xml file.
        #
        filename = self.film_settings.getBasename() + ".xml"
        if not self.film_settings.overwriteOk() and os.path.exists(filename):
            raise halExceptions.HALException("Movie files exist and overwrite Ok is false " + filename)

        # Create writers as needed for each feed.
        self.writers = []
        if self.film_settings.isSaved():
            for camera in self.camera_functionalities:
                if camera.getParameter("saved"):
                    self.writers.append(imagewriters.createFileWriter(camera, self.film_settings))
        if (len(self.writers) == 0):
            self.view.updateSize(0.0)
        
        # Start filming.
        self.waiting_on = copy.copy(self.wait_for)
        self.sendMessage(halMessage.HalMessage(sync = True,
                                               m_type = "start film",
                                               data = {"film settings" : self.film_settings}))
Пример #18
0
    def processMessage(self, message):
        #
        # This is the signal that the parameter change is
        # complete and we can start filming.
        #
        if message.isType("changing parameters"):
            if not message.getData()["changing"]:
                msg = halMessage.HalMessage(
                    m_type="start film request",
                    data={"request": self.film_request})
                self.actionMessage.emit(msg)

        #
        # The 'film lockout' message with data 'locked out' is the signal
        # that the film is complete.
        #
        elif message.isType("film lockout"):
            if not message.getData()["locked out"]:
                acq_p = message.getData()["acquisition parameters"]
                if acq_p.has("spot_counts"):
                    self.tcp_message.addResponse("found_spots",
                                                 acq_p.get("spot_counts"))
                return True

        return False
Пример #19
0
    def startCameras(self):
        
        # Start slave camera(s) first.
        self.sendMessage(halMessage.HalMessage(m_type = "start camera",
                                               data = {"master" : False}))

        # Force sync.
        #
        # We need to make sure that the slave cameras have started before
        # starting the master cameras or we'll have a race condition.
        #
        self.sendMessage(halMessage.SyncMessage(self))

        # Start master camera(s) last.
        self.sendMessage(halMessage.HalMessage(m_type = "start camera",
                                               data = {"master" : True}))
Пример #20
0
    def handleResponses(self, message):

        # Check if this a response to our action, or a response to some
        # other message from the tcpControl class.
        if (message != self.hal_message):
            return False

        # Check for singleton response.
        responses = message.getResponses()
        assert (len(responses) == 1)

        # Check that the requested parameters were found.
        found = responses[0].getData()["found"]
        if not found:
            self.tcp_message.setError(
                True, "Parameters '" + self.tcp_message.getData("parameters") +
                "' not found")
            self.was_handled = True
            return True

        self.parameters = responses[0].getData()["parameters"]

        # Check if the parameters are initialized.
        if not self.parameters.get("initialized", False):
            msg = halMessage.HalMessage(
                m_type="set parameters",
                data={"index or name": self.tcp_message.getData("parameters")})
            self.actionMessage.emit(msg)
            return False

        self.was_handled = True
        return True
Пример #21
0
    def handleNewParameters(self, parameters, is_edit):
        """
        Sends the 'new parameters' message. 

        The updated parameters could be a modified form of the current parameters or
        it could be a different set. We use the is_edit flag to record which of these
        two it is.
        """
        if self.locked_out:
            raise halExceptions.HalException(
                "parameter change attempted while locked out.")

        # Disable the UI so the user can't change the parameters again while we
        # are processing the current change.
        self.view.enableUI(False)

        self.setLockout(True)

        # is_edit means we are sending a modified version of the current parameters.
        self.sendMessage(
            halMessage.HalMessage(m_type="new parameters",
                                  data={
                                      "parameters": parameters.copy(),
                                      "is_edit": is_edit
                                  }))
Пример #22
0
    def newViewer(self, v_type, v_name):
        #
        # FIXME: If you create a viewer during a film it is not going to
        #        to be in filming mode, and you won't be able to change
        #        things like sync_max.
        #

        # First look for an existing viewer that is just hidden.
        found_existing_viewer = False
        for viewer in self.viewers:
            if isinstance(viewer, v_type) and not viewer.isVisible():
                viewer.show()
                found_existing_viewer = True

        # If none exists, create a viewer of the requested type.
        if not found_existing_viewer:
            viewer = v_type(
                module_name=self.getNextViewerName(),
                default_colortable=self.parameters.get("colortable"))
            viewer.halDialogInit(self.qt_settings,
                                 self.window_title + " " + v_name)
            viewer.guiMessage.connect(self.handleGuiMessage)
            if self.stage_functionality is not None:
                viewer.setStageFunctionality(self.stage_functionality)
            viewer.showViewer(self.show_gui)
            self.viewers.append(viewer)

            self.sendMessage(
                halMessage.HalMessage(
                    m_type="get feed names",
                    data={"extra data": viewer.getViewerName()}))
Пример #23
0
    def startFilm(self, message):
        self.run_shutters = message.getData()["film settings"].runShutters()

        # Sub-classes must provide a "ready to film" response when they
        # are ready to film otherwise film.film will hang.
        if not self.run_shutters:
            self.sendMessage(halMessage.HalMessage(m_type="ready to film"))
Пример #24
0
    def startFilm(self, film_settings):
        # Open file to save the lock status at each frame.
        if self.working:
            if film_settings.isSaved():

                # Only save images when in diagnostics mode and only for a QPDCameraFunctionality.
                if self.diagnostics_mode and (self.qpd_functionality.getType()
                                              == "camera"):
                    self.tiff_counter = 0
                    self.tiff_fp = tifffile.TiffWriter(
                        film_settings.getBasename() + "_qpd.tif", bigtiff=True)

                self.offset_fp = open(film_settings.getBasename() + ".off",
                                      "w")

                headers = [
                    "frame", "offset", "power", "stage-z", "good-offset"
                ]
                if self.tiff_fp is not None:
                    headers.append("tif-counter")

                self.offset_fp.write(" ".join(headers) + "\n")

            # Check for a waveform from a hardware timed lock mode that uses the DAQ.
            waveform = self.lock_mode.getWaveform()
            if waveform is not None:
                self.controlMessage.emit(
                    halMessage.HalMessage(m_type="daq waveforms",
                                          data={"waveforms": [waveform]}))

            self.lock_mode.startFilm()
Пример #25
0
    def filmTiming(self, message):
        """
        Get ready for waveform output when we get the film timing message, which
        includes the frames per second information that we need.
        """
        if self.run_shutters:

            # Get frames per second from the timing functionality. This is
            # a property of the camera that drives the timing functionality.
            fps = message.getData()["properties"]["functionality"].getFPS()

            # Calculate frequency. This is set slightly higher than the camere
            # frequency so that we are ready at the start of the next frame.
            frequency = 1.01 * fps * float(self.oversampling)

            # If oversampling is 1 then just trigger the ao_task
            # and do_task directly off the camera fire pin.
            if (self.oversampling == 1):
                wv_clock = self.timing.get("camera_fire_pin")
            else:
                wv_clock = self.timing.get("counter_out")

            # Setup the counter.
            self.setupCounter(frequency)

            # Setup analog waveforms.
            self.setupAnalog(frequency, wv_clock)

            # Setup digital waveforms.
            self.setupDigital(frequency, wv_clock)

            # Notify film.film that we are ready.
            self.sendMessage(halMessage.HalMessage(m_type="ready to film"))
Пример #26
0
    def processMessage(self, message):

        if message.isType("configuration"):
            if message.sourceIs("stage"):
                stage_fn_name = message.getData(
                )["properties"]["stage functionality name"]
                self.sendMessage(
                    halMessage.HalMessage(m_type="get functionality",
                                          data={
                                              "name": stage_fn_name,
                                              "extra data": "stage_fn"
                                          }))

        elif message.isType("configure1"):
            if halMessage.isValidMessageName("lock jump"):
                self.can_jump = True
            self.sendMessage(
                halMessage.HalMessage(
                    m_type="initial parameters",
                    data={"parameters": self.control.getParameters()}))

        elif message.isType("film lockout"):
            # This means that filming has started (True), or stopped (False).
            self.filming = message.getData()["locked out"]

            # HAL has responded so we can stop ignoring the film button.
            self.waiting_for_film = False

        elif message.isType("new parameters"):
            p = message.getData()["parameters"]
            message.addResponse(
                halMessage.HalMessageResponse(
                    source=self.module_name,
                    data={
                        "old parameters": self.control.getParameters().copy()
                    }))
            self.control.newParameters(p.get(self.module_name))
            message.addResponse(
                halMessage.HalMessageResponse(
                    source=self.module_name,
                    data={"new parameters": self.control.getParameters()}))

        elif message.isType("stop film"):
            message.addResponse(
                halMessage.HalMessageResponse(
                    source=self.module_name,
                    data={"parameters": self.control.getParameters()}))
Пример #27
0
 def handleSettings(self, boolean):
     parameters_filename = QtWidgets.QFileDialog.getOpenFileName(
         self, "New Settings", self.xml_directory, "*.xml")[0]
     if parameters_filename:
         self.xml_directory = os.path.dirname(parameters_filename)
         self.guiMessage.emit(
             halMessage.HalMessage(m_type="new parameters file",
                                   data={"filename": parameters_filename}))
Пример #28
0
    def handleEditParameters(self):
        """
        Send the 'current parameters' message.

        Once all the modules have responded with their current parameters
        we will start the editor.
        """
        self.sendMessage(halMessage.HalMessage(m_type="current parameters"))
Пример #29
0
    def processMessage(self, message):
        if message.isType("start"):
            self.sendMessage(halMessage.HalMessage(m_type="tss1"))
            self.sendMessage(halMessage.HalMessage(m_type="tss2"))
            self.sendMessage(halMessage.HalMessage(m_type="tss3"))

        elif message.isType("tss1"):
            halModule.runWorkerTask(self, message, self.handleTSS1)

        elif message.isType("tss2"):
            halModule.runWorkerTask(self, message, self.handleTSS2)

        elif message.isType("tss3"):
            assert not ("tss2" in self.processed_messages)
            print(">> Okay", self.processed_messages)
            self.newMessage.emit(
                halMessage.HalMessage(source=self, m_type="tests done"))
Пример #30
0
 def handleShutters(self, boolean):
     shutters_filename = QtWidgets.QFileDialog.getOpenFileName(
         self, "New Shutter Sequence", self.xml_directory, "*.xml")[0]
     if shutters_filename:
         self.xml_directory = os.path.dirname(shutters_filename)
         self.guiMessage.emit(
             halMessage.HalMessage(m_type="new shutters file",
                                   data={"filename": shutters_filename}))