def test_cancel(self): """ try a bit the cancelling possibility """ # create a little complex streamTree st = stream.StreamTree(streams=[ self.streams[2], stream.StreamTree(streams=self.streams[0:2]) ]) self.start = None self.end = None self.updates = 0 self.done = False f = acq.acquire(st.getProjections()) f.add_update_callback(self.on_progress_update) f.add_done_callback(self.on_done) time.sleep(0.5) # make sure it's started self.assertTrue(f.running()) f.cancel() self.assertRaises(CancelledError, f.result, 1) self.assertGreaterEqual(self.updates, 1) # at least one update at cancellation self.assertLessEqual(self.end, time.time()) self.assertTrue(self.done) self.assertTrue(f.cancelled())
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'])
def test_sync_sem_ccd(self): """ try acquisition with fairly complex SEM/CCD stream """ # Create the streams and streamTree semsur = stream.SEMStream("test sem", self.sed, self.sed.data, self.ebeam) sems = stream.SEMStream("test sem cl", self.sed, self.sed.data, self.ebeam) ars = stream.ARSettingsStream("test ar", self.ccd, self.ccd.data, self.ebeam) semars = stream.SEMARMDStream("test SEM/AR", [sems, ars]) st = stream.StreamTree(streams=[semsur, semars]) # SEM survey settings are via the current hardware settings self.ebeam.dwellTime.value = self.ebeam.dwellTime.range[0] # SEM/AR settings are via the AR stream ars.roi.value = (0.1, 0.1, 0.8, 0.8) mx_brng = self.ccd.binning.range[1] binning = tuple(min(4, mx) for mx in mx_brng) # try binning 4x4 self.ccd.binning.value = binning self.ccd.exposureTime.value = 1 # s ars.repetition.value = (2, 3) num_ar = numpy.prod(ars.repetition.value) est_time = acq.estimateTime(st.getProjections()) # prepare callbacks self.start = None self.end = None self.updates = 0 self.done = 0 # Run acquisition start = time.time() f = acq.acquire(st.getProjections()) f.add_update_callback(self.on_progress_update) f.add_done_callback(self.on_done) data, e = f.result() dur = time.time() - start self.assertGreaterEqual(dur, est_time / 2) # Estimated time shouldn't be too small self.assertIsInstance(data[0], model.DataArray) self.assertIsNone(e) self.assertEqual(len(data), num_ar + 2) thumb = acq.computeThumbnail(st, f) self.assertIsInstance(thumb, model.DataArray) self.assertGreaterEqual(self.updates, 1) # at least one update at end self.assertLessEqual(self.end, time.time()) self.assertTrue(not f.cancelled()) time.sleep(0.1) self.assertEqual(self.done, 1)
def test_progress(self): """ Check we get some progress updates """ # create a little complex streamTree st = stream.StreamTree(streams=[ self.streams[0], stream.StreamTree(streams=self.streams[1:3]) ]) self.past = None self.left = None self.updates = 0 f = acq.acquire(st.getStreams()) f.add_update_callback(self.on_progress_update) data = f.result() self.assertIsInstance(data[0], model.DataArray) self.assertGreaterEqual(self.updates, 3) # at least one update per stream
def test_simple(self): # create a simple streamTree st = stream.StreamTree(streams=[self.streams[0]]) f = acq.acquire(st.getStreams()) data = f.result() self.assertIsInstance(data[0], model.DataArray) thumb = acq.computeThumbnail(st, f) self.assertIsInstance(thumb, model.DataArray) # let's do it a second time, "just for fun" f = acq.acquire(st.getStreams()) data = f.result() self.assertIsInstance(data[0], model.DataArray) thumb = acq.computeThumbnail(st, f) self.assertIsInstance(thumb, model.DataArray)
def _export_to_file(self, acq_future): """ return (list of DataArray, filename): data exported and filename """ streams = list(self._tab_data_model.acquisitionStreams) st = stream.StreamTree(streams=streams) thumb = acqmng.computeThumbnail(st, acq_future) data, exp = acq_future.result() filename = self.filename.value if data: exporter = dataio.get_converter(self.conf.last_format) exporter.export(filename, data, thumb) logging.info(u"Acquisition saved as file '%s'.", filename) else: logging.debug("Not saving into file '%s' as there is no data", filename) return data, exp, filename
def test_leech(self): """ try acquisition with leech """ # Create the streams and streamTree semsur = stream.SEMStream("test sem", self.sed, self.sed.data, self.ebeam) sems = stream.SEMStream("test sem cl", self.sed, self.sed.data, self.ebeam) ars = stream.ARSettingsStream("test ar", self.ccd, self.ccd.data, self.ebeam) semars = stream.SEMARMDStream("test SEM/AR", [sems, ars]) st = stream.StreamTree(streams=[semsur, semars]) pcd = Fake0DDetector("test") pca = ProbeCurrentAcquirer(pcd) sems.leeches.append(pca) semsur.leeches.append(pca) # SEM survey settings are via the current hardware settings self.ebeam.dwellTime.value = self.ebeam.dwellTime.range[0] # SEM/AR settings are via the AR stream ars.roi.value = (0.1, 0.1, 0.8, 0.8) mx_brng = self.ccd.binning.range[1] binning = tuple(min(4, mx) for mx in mx_brng) # try binning 4x4 self.ccd.binning.value = binning self.ccd.exposureTime.value = 1 # s ars.repetition.value = (2, 3) num_ar = numpy.prod(ars.repetition.value) pca.period.value = 10 # Only at beginning and end est_time = acq.estimateTime(st.getProjections()) # prepare callbacks self.start = None self.end = None self.updates = 0 self.done = 0 # Run acquisition start = time.time() f = acq.acquire(st.getProjections()) f.add_update_callback(self.on_progress_update) f.add_done_callback(self.on_done) data, e = f.result() dur = time.time() - start self.assertGreaterEqual(dur, est_time / 2) # Estimated time shouldn't be too small self.assertIsInstance(data[0], model.DataArray) self.assertIsNone(e) self.assertEqual(len(data), num_ar + 2) thumb = acq.computeThumbnail(st, f) self.assertIsInstance(thumb, model.DataArray) self.assertGreaterEqual(self.updates, 1) # at least one update at end self.assertLessEqual(self.end, time.time()) self.assertTrue(not f.cancelled()) time.sleep(0.1) self.assertEqual(self.done, 1) for da in data: pcmd = da.metadata[model.MD_EBEAM_CURRENT_TIME] self.assertEqual(len(pcmd), 2)
def test_sync_path_guess(self): """ try synchronized acquisition using the Optical Path Manager """ # Create the streams and streamTree opmngr = path.OpticalPathManager(self.microscope) semsur = stream.SEMStream("test sem", self.sed, self.sed.data, self.ebeam) sems = stream.SEMStream("test sem cl", self.sed, self.sed.data, self.ebeam) ars = stream.ARSettingsStream("test ar", self.ccd, self.ccd.data, self.ebeam, opm=opmngr) semars = stream.SEMARMDStream("test SEM/AR", [sems, ars]) specs = stream.SpectrumSettingsStream("test spec", self.spec, self.spec.data, self.ebeam, opm=opmngr) sps = stream.SEMSpectrumMDStream("test sem-spec", [sems, specs]) st = stream.StreamTree(streams=[semsur, semars, sps]) # SEM survey settings are via the current hardware settings self.ebeam.dwellTime.value = self.ebeam.dwellTime.range[0] # SEM/AR/SPEC settings are via the AR stream ars.roi.value = (0.1, 0.1, 0.8, 0.8) specs.roi.value = (0.2, 0.2, 0.7, 0.7) mx_brng = self.ccd.binning.range[1] binning = tuple(min(4, mx) for mx in mx_brng) # try binning 4x4 self.ccd.binning.value = binning self.ccd.exposureTime.value = 1 # s ars.repetition.value = (2, 3) specs.repetition.value = (3, 2) num_ar = numpy.prod(ars.repetition.value) est_time = acq.estimateTime(st.getProjections()) # prepare callbacks self.start = None self.end = None self.updates = 0 self.done = 0 # Run acquisition start = time.time() f = acq.acquire(st.getProjections()) f.add_update_callback(self.on_progress_update) f.add_done_callback(self.on_done) data, e = f.result() dur = time.time() - start self.assertGreaterEqual(dur, est_time / 2) # Estimated time shouldn't be too small self.assertIsInstance(data[0], model.DataArray) self.assertIsNone(e) self.assertEqual(len(data), num_ar + 4) thumb = acq.computeThumbnail(st, f) self.assertIsInstance(thumb, model.DataArray) self.assertGreaterEqual(self.updates, 1) # at least one update at end self.assertLessEqual(self.end, time.time()) self.assertTrue(not f.cancelled()) # assert optical path configuration exp_pos = path.SPARC_MODES["spectral"][1] self.assertEqual(self.lenswitch.position.value, exp_pos["lens-switch"]) self.assertEqual(self.spec_det_sel.position.value, exp_pos["spec-det-selector"]) self.assertEqual(self.ar_spec_sel.position.value, exp_pos["ar-spec-selector"]) time.sleep(0.1) self.assertEqual(self.done, 1)