Esempio n. 1
0
    def setUpClass(cls):

        try:
            test.start_backend(SPARC2_FOCUS_CONFIG)
        except LookupError:
            logging.info("A running backend is already found, skipping tests")
            cls.backend_was_running = True
            return
        except IOError as exp:
            logging.error(str(exp))
            raise

        # find components by their role
        cls.ccd = model.getComponent(role="ccd")
        cls.spccd = model.getComponent(role="sp-ccd")
        cls.focus = model.getComponent(role="focus")
        cls.spgr = model.getComponent(role="spectrograph")
        cls.spgr_ded = model.getComponent(role="spectrograph-dedicated")
        cls.bl = model.getComponent(role="brightlight")
        cls.microscope = model.getMicroscope()
        cls.optmngr = path.OpticalPathManager(cls.microscope)
        cls.specline_ccd = stream.BrightfieldStream("Spectrograph_line_ccd", cls.ccd, cls.ccd.data, cls.bl)
        cls.specline_spccd = stream.BrightfieldStream ("Spectrograph line_spccd", cls.spccd, cls.spccd.data, cls.bl)

        # The good focus position is the start up position
        cls._good_focus = cls.focus.position.value["z"]
Esempio n. 2
0
    def setUpClass(cls):

        try:
            test.start_backend(SECOM_CONFIG)
        except LookupError:
            logging.info("A running backend is already found, skipping tests")
            cls.backend_was_running = True
            return
        except IOError as exp:
            logging.error(str(exp))
            raise

        # create some streams connected to the backend
        cls.microscope = model.getMicroscope()
        cls.ccd = model.getComponent(role="ccd")
        cls.ebeam = model.getComponent(role="e-beam")
        cls.sed = model.getComponent(role="se-detector")
        cls.light = model.getComponent(role="light")
        cls.light_filter = model.getComponent(role="filter")

        s1 = stream.FluoStream("fluo1", cls.ccd, cls.ccd.data, cls.light,
                               cls.light_filter)
        s1.excitation.value = sorted(s1.excitation.choices)[0]
        s2 = stream.FluoStream("fluo2", cls.ccd, cls.ccd.data, cls.light,
                               cls.light_filter)
        s2.excitation.value = sorted(s2.excitation.choices)[-1]
        s3 = stream.BrightfieldStream("bf", cls.ccd, cls.ccd.data, cls.light)
        cls.streams = [s1, s2, s3]
Esempio n. 3
0
    def test_metadata(self):
        """
        Check if extra metadata are saved
        """
        settings_obs = SettingsObserver(model.getComponents())
        self.ccd.binning.value = (
            1, 1)  # make sure we don't save the right metadata by accident
        detvas = {'exposureTime', 'binning', 'gain'}
        s1 = stream.FluoStream("fluo2",
                               self.ccd,
                               self.ccd.data,
                               self.light,
                               self.light_filter,
                               detvas=detvas)
        s2 = stream.BrightfieldStream("bf",
                                      self.ccd,
                                      self.ccd.data,
                                      self.light,
                                      detvas=detvas)

        # Set different binning values for each stream
        s1.detBinning.value = (2, 2)
        s2.detBinning.value = (4, 4)
        st = stream.StreamTree(streams=[s1, s2])
        f = acqmng.acquire(st.getProjections(), settings_obs=settings_obs)
        data, e = f.result()
        for s in data:
            self.assertTrue(model.MD_EXTRA_SETTINGS in s.metadata,
                            "Stream %s didn't save extra metadata." % s)
        self.assertEqual(
            data[0].metadata[model.MD_EXTRA_SETTINGS][self.ccd.name]
            ['binning'], [(2, 2), 'px'])
        self.assertEqual(
            data[1].metadata[model.MD_EXTRA_SETTINGS][self.ccd.name]
            ['binning'], [(4, 4), 'px'])
Esempio n. 4
0
 def addBrightfield(self, **kwargs):
     """
     Creates a new brightfield stream and panel in the stream bar
     returns (StreamPanel): the stream panel created
     """
     s = acqstream.BrightfieldStream("Bright-field",
                                     self._main_data_model.ccd,
                                     self._main_data_model.ccd.data,
                                     self._main_data_model.light)
     return self._addStream(s, **kwargs)
Esempio n. 5
0
    def __init__(self, microscope, main_app):
        """
        :param microscope: (Microscope or None) The main back-end component.
        :param main_app: (wx.App) The main GUI component.
        """
        super(CLAcqPlugin, self).__init__(microscope, main_app)

        # Can only be used with a microscope
        if not microscope:
            return
        else:
            # Check which stream the microscope supports
            self.main_data = self.main_app.main_data
            if not (self.main_data.ccd and self.main_data.ebeam):
                return

        self.exposureTime = self.main_data.ccd.exposureTime
        self.binning = self.main_data.ccd.binning
        # Trick to pass the component (ccd to binning_1d_from_2d())
        self.vaconf["binning"]["choices"] = (
            lambda cp, va, cf: cutil.binning_1d_from_2d(
                self.main_data.ccd, va, cf))

        self._survey_stream = None
        self._optical_stream = acqstream.BrightfieldStream(
            "Optical",
            self.main_data.ccd,
            self.main_data.ccd.data,
            emitter=None,
            focuser=self.main_data.focus)
        self._secom_cl_stream = SECOMCLSettingsStream("Secom-CL",
                                                      self.main_data.ccd,
                                                      self.main_data.ccd.data,
                                                      self.main_data.ebeam)
        self._sem_stream = acqstream.SEMStream(
            "Secondary electrons concurrent", self.main_data.sed,
            self.main_data.sed.data, self.main_data.ebeam)

        self._secom_sem_cl_stream = SECOMCLSEMMDStream(
            "SECOM SEM CL", [self._sem_stream, self._secom_cl_stream])

        self._driftCorrector = leech.AnchorDriftCorrector(
            self.main_data.ebeam, self.main_data.sed)

        self.conf = get_acqui_conf()
        self.expectedDuration = model.VigilantAttribute(1,
                                                        unit="s",
                                                        readonly=True)
        self.exposureTime.subscribe(self._update_exp_dur)

        self.filename = self._secom_sem_cl_stream.filename  # duplicate VA
        self.filename.subscribe(self._on_filename)

        self.addMenu("Acquisition/CL acquisition...", self.start)
Esempio n. 6
0
    def __init__(self, main_data, tab_data, overview_canvas, m_view):
        self._data_model = tab_data
        self.canvas = overview_canvas
        self.m_view = m_view
        self.main_data = main_data

        self.curr_s = None

        # Timer to detect when the stage ends moving
        self._timer_pos = wx.PyTimer(self.add_pos_to_history)

        m_view.merge_ratio.subscribe(self._on_merge_ratio_change)
        if tab_data.main.stage:
            tab_data.main.stage.position.subscribe(self.on_stage_pos_change, init=True)
            tab_data.main.chamberState.subscribe(self._on_chamber_state)
            tab_data.streams.subscribe(self._on_current_stream)

        # Global overview image (Delphi)
        if main_data.overview_ccd:
            # Overview camera can be RGB => in that case len(shape) == 4
            if len(main_data.overview_ccd.shape) == 4:
                overview_stream = acqstream.RGBCameraStream("Overview", main_data.overview_ccd,
                                                            main_data.overview_ccd.data, None,
                                                            acq_type=MD_AT_OVV_FULL)
            else:
                overview_stream = acqstream.BrightfieldStream("Overview", main_data.overview_ccd,
                                                              main_data.overview_ccd.data, None,
                                                              acq_type=MD_AT_OVV_FULL)
            self.m_view.addStream(overview_stream)
            # TODO: add it to self.tab_data_model.streams?
        else:
            # black image to display history overlay separately from built-up ovv image
            # controlled by merge slider
            da, _ = self._initialize_ovv_im(OVV_SHAPE)
            history_stream = acqstream.RGBUpdatableStream("History Stream", da, acq_type=MD_AT_HISTORY)
            self.m_view.addStream(history_stream)

        # Built-up overview image
        self.ovv_im, self.m_view.mpp.value = self._initialize_ovv_im(OVV_SHAPE)

        # Initialize individual ovv images for optical and sem stream
        self.im_opt = copy.deepcopy(self.ovv_im)
        self.im_sem = copy.deepcopy(self.ovv_im)

        # Add stream to view
        self.upd_stream = acqstream.RGBUpdatableStream("Overview Stream", self.ovv_im,
                                                       acq_type=MD_AT_OVV_TILES)
        self.m_view.addStream(self.upd_stream)
Esempio n. 7
0
    def setUpClass(cls):

        if driver.get_backend_status() == driver.BACKEND_RUNNING:
            logging.info("A running backend is already found, skipping tests")
            cls.backend_was_running = True
            return

        # run the backend as a daemon
        # we cannot run it normally as the child would also think he's in a unittest
        cmd = ODEMISD_CMD + ODEMISD_ARG + [SECOM_CONFIG]
        ret = subprocess.call(cmd)
        if ret != 0:
            logging.error("Failed starting backend with '%s'", cmd)
        time.sleep(1) # time to start

        # create some streams connected to the backend
        cls.microscope = model.getMicroscope()
        for comp in model.getComponents():
            if comp.role == "ccd":
                cls.ccd = comp
            elif comp.role == "spectrometer":
                cls.spec = comp
            elif comp.role == "e-beam":
                cls.ebeam = comp
            elif comp.role == "se-detector":
                cls.sed = comp
            elif comp.role == "light":
                cls.light = comp
            elif comp.role == "filter":
                cls.light_filter = comp

        s1 = stream.FluoStream("fluo1", cls.ccd, cls.ccd.data,
                               cls.light, cls.light_filter)
        s2 = stream.FluoStream("fluo2", cls.ccd, cls.ccd.data,
                               cls.light, cls.light_filter)
        s2.excitation.value = s2.excitation.range[1]
        s3 = stream.BrightfieldStream("bf", cls.ccd, cls.ccd.data, cls.light)
        cls.streams = [s1, s2, s3]
Esempio n. 8
0
    def __init__(self, main_data, tab, overview_canvas, m_view, stream_bar):
        self.main_data = main_data
        self._tab = tab
        self._data_model = tab.tab_data_model
        self.canvas = overview_canvas
        self.m_view = m_view
        self._stream_bar = stream_bar
        self.conf = get_acqui_conf()

        self.curr_s = None

        # Timer to detect when the stage ends moving
        self._timer_pos = wx.PyTimer(self.add_pos_to_history)

        if hasattr(m_view, "merge_ratio"):
            m_view.merge_ratio.subscribe(self._on_merge_ratio_change)

        # Global overview image (Delphi)
        if main_data.overview_ccd:
            # Overview camera can be RGB => in that case len(shape) == 4
            if len(main_data.overview_ccd.shape) == 4:
                overview_stream = acqstream.RGBCameraStream(
                    "Overview",
                    main_data.overview_ccd,
                    main_data.overview_ccd.data,
                    None,
                    acq_type=MD_AT_OVV_FULL)
            else:
                overview_stream = acqstream.BrightfieldStream(
                    "Overview",
                    main_data.overview_ccd,
                    main_data.overview_ccd.data,
                    None,
                    acq_type=MD_AT_OVV_FULL)
            self.m_view.addStream(overview_stream)
            # TODO: add it to self.tab_data_model.streams?
        else:
            # black image to display history overlay separately from built-up ovv image
            # controlled by merge slider
            da, _ = self._initialize_ovv_im(OVV_SHAPE)
            history_stream = acqstream.RGBUpdatableStream(
                "History Stream", da, acq_type=MD_AT_HISTORY)
            self.m_view.addStream(history_stream)

        # Built-up overview image
        self.ovv_im, self.m_view.mpp.value = self._initialize_ovv_im(OVV_SHAPE)
        logging.debug("Overview image FoV: %s", getBoundingBox(self.ovv_im))

        # Initialize individual ovv images for optical and sem stream
        self.im_opt = copy.deepcopy(self.ovv_im)
        self.im_sem = copy.deepcopy(self.ovv_im)
        # Extra images to be used for complete overviews, shown behind the build-up images
        self._bkg_opt = copy.deepcopy(self.ovv_im)
        self._bkg_sem = copy.deepcopy(self.ovv_im)

        # Add stream to view
        self.upd_stream = acqstream.RGBUpdatableStream(
            "Overview Stream", self.ovv_im, acq_type=MD_AT_OVV_TILES)
        self.m_view.addStream(self.upd_stream)

        self._data_model.focussedView.subscribe(self._on_focused_view)

        if main_data.stage:
            # Update the image when the stage move
            main_data.stage.position.subscribe(self.on_stage_pos_change,
                                               init=True)
            main_data.chamberState.subscribe(self._on_chamber_state)
            self._data_model.streams.subscribe(self._on_current_stream)

            # Add a "acquire overview" button.
            self._stream_bar.btn_add_overview.Bind(wx.EVT_BUTTON,
                                                   self._on_overview_acquire)
            self._acquisition_controller = acqcont.OverviewStreamAcquiController(
                self._data_model, tab)
            self._bkg_ovv_subs = {
            }  # Just used temporarily when background overview is projected