def processed_data(cls, tid, shape, *, gen='random', dtype=config['SOURCE_PROC_IMAGE_DTYPE'], roi_histogram=False, histogram=False, correlation=False, binning=False, **kwargs): processed = ProcessedData(tid) imgs = cls._gen_images(gen, shape, dtype) processed.image = ImageData.from_array(imgs, **kwargs) if roi_histogram: pass if histogram: hist = processed.hist hist.hist = np.arange(10) hist.bin_centers = np.arange(10) / 100. hist.mean, hist.median, hist.std = 1., 0, 0.1 if correlation: pass if binning: pass return processed
def testGeneral(self): # --------------------- # pulse-resolved data # --------------------- data = ProcessedData(1234) self.assertEqual(1234, data.tid) self.assertEqual(0, data.n_pulses) data.image = ImageData.from_array(np.zeros((1, 2, 2))) self.assertEqual(1, data.n_pulses) data = ProcessedData(1235) data.image = ImageData.from_array(np.zeros((3, 2, 2))) self.assertEqual(3, data.n_pulses) # --------------------- # train-resolved data # --------------------- data = ProcessedData(1236) data.image = ImageData.from_array(np.zeros((2, 2))) self.assertEqual(1236, data.tid) self.assertEqual(1, data.n_pulses)
def testBin1dHist(self): from extra_foam.gui.windows.binning_w import Bin1dHist widget = Bin1dHist() widget._data = ProcessedData(1) widget.refresh()
def testBulletinView(self): processed = ProcessedData(1357) processed.image = ImageData.from_array(np.ones((10, 4, 4), np.float32)) processed.image.dark_count = 99 processed.image.n_dark_pulses = 10 processed.pidx.mask([1, 3, 5, 6]) self.gui._queue.append(processed) self.image_tool.updateWidgetsF() view = self.image_tool._bulletin_view self.assertEqual(1357, int(view._latest_tid.intValue())) self.assertEqual(10, int(view._n_total_pulses.intValue())) self.assertEqual(6, int(view._n_kept_pulses.intValue())) self.assertEqual(99, int(view._dark_train_counter.intValue())) self.assertEqual(10, int(view._n_dark_pulses.intValue()))
def testGeneral(self): from extra_foam.gui.windows.correlation_w import CorrelationPlot for i in range(2): widget = CorrelationPlot(0) widget._data = ProcessedData(1) widget.refresh()
def processed_data(cls, tid, shape, *, gen='random', dtype=config['SOURCE_PROC_IMAGE_DTYPE'], roi_histogram=False, histogram=False, correlation=False, binning=False, **kwargs): processed = ProcessedData(tid) imgs = cls._gen_images(gen, shape, dtype) processed.image = ImageData.from_array(imgs, **kwargs) if roi_histogram: pass if histogram: hist = processed.hist hist.hist = np.arange(10) hist.bin_centers = np.arange(10) / 100. hist.mean, hist.median, hist.std = 1., 0, 0.1 if correlation: corr_resolution = 2 for i in range(2): corr = processed.corr[i] if i == 0: data = SimplePairSequence() else: data = OneWayAccuPairSequence(corr_resolution) for j in range(5): data.append((j, 5 * j)) corr.x, corr.y = data.data() corr.source = f"abc - {i}" corr.resolution = 0 if i == 0 else corr_resolution if binning: pass return processed
def testHeatmap1D(self): from extra_foam.gui.windows.binning_w import Bin1dHeatmap widget = Bin1dHeatmap() widget._data = ProcessedData(1) # test "Auto level" reset widget._auto_level = True widget.refresh() self.assertFalse(widget._auto_level)
def testHeatmap2D(self): from extra_foam.gui.windows.binning_w import Bin2dHeatmap for is_count in [False, True]: widget = Bin2dHeatmap(count=is_count) widget._data = ProcessedData(1) # test "Auto level" reset widget._auto_level = True widget.refresh() self.assertFalse(widget._auto_level)
def testBulletinView(self): processed = ProcessedData(1357) processed.image = ImageData.from_array(np.ones((10, 4, 4), np.float32)) processed.image.dark_count = 99 processed.image.n_dark_pulses = 10 processed.pidx.mask([1, 3, 5, 6]) self.gui._queue.append(processed) self.image_tool.updateWidgetsF() view = self.image_tool._bulletin_view self.assertEqual(1357, int(view._displayed_tid.intValue())) self.assertEqual(10, int(view._n_total_pulses.intValue())) self.assertEqual(6, int(view._n_kept_pulses.intValue())) self.assertEqual(99, int(view._dark_train_counter.intValue())) self.assertEqual(10, int(view._n_dark_pulses.intValue())) with patch.object(view._mon, "reset_process_count") as reset: view._reset_process_count_btn.clicked.emit() reset.assert_called_once()
def testFomHist(self): from extra_foam.gui.windows.histogram_w import FomHist widget = FomHist() # empty data widget._data = ProcessedData(1) widget.refresh() # non-empty data widget._data = self.processed_data(1001, (4, 2, 2), histogram=True) widget.refresh()
def testPoiRoiHist(self): from extra_foam.gui.windows.pulse_of_interest_w import PoiRoiHist widget = PoiRoiHist(0) # empty data data = ProcessedData(1) widget.updateF(data) # non-empty data data = self.processed_data(1001, (4, 2, 2), histogram=True) widget.updateF(data)
def _get_data(self, pulse_resolved=True): processed = ProcessedData(1001) if pulse_resolved: processed.pulse.roi.roi1.fom = [ 10, 20, 30, 40, 20, 30, 20, 10, 40, 10 ] else: processed.roi.roi1.fom = 10 data = {'tid': 1001, 'processed': processed, 'raw': dict()} return data, processed
def testCorrectedView(self): from extra_foam.gui.image_tool.corrected_view import CorrectedView # pulse-resolved view = CorrectedView(pulse_resolved=True, parent=self.gui) # empty data data = ProcessedData(1) view._corrected.updateF(data) view._roi_hist.updateF(data) # non-empty data data = self.processed_data(1001, (2, 2), roi_histogram=True) view._roi_hist.updateF(data) # train-resolved view = CorrectedView(pulse_resolved=False, parent=self.gui) # empty data data = ProcessedData(1) view._roi_hist.updateF(data) # non-empty data data = self.processed_data(1001, (2, 2), roi_histogram=True) view._roi_hist.updateF(data)
def testCorrectedView(self): # pulse-resolved view = CorrectedView(pulse_resolved=True, parent=self.gui) # empty data data = ProcessedData(1) view.updateF(data, True) # non-empty data data = self.processed_data(1001, (2, 2), roi_histogram=True) view.updateF(data, True) # train-resolved view = CorrectedView(pulse_resolved=False, parent=self.gui) # empty data data = ProcessedData(1) view.updateF(data, True) # non-empty data data = self.processed_data(1001, (2, 2), roi_histogram=True) view.updateF(data, True)
def testAzimuthalIntegrationView(self): # pulse-resolved view = AzimuthalInteg1dView(pulse_resolved=True, parent=self.gui) # empty data data = ProcessedData(1) view.updateF(data, True) # non-empty data data = self.processed_data(1001, (2, 2)) data.ai.x = np.arange(10) data.ai.y = np.arange(10) view.updateF(data, True) data.ai.peaks = np.arange(10) with patch.object(view._azimuthal_integ_1d_curve, "setAnnotationList") as mocked: view._azimuthal_integ_1d_curve.updateF(data) mocked.assert_called_once()
def testRoiImageView(self): widget = RoiImageView(1) widget.setImage = MagicMock() processed = ProcessedData(1) processed.image.masked_mean = np.ones((3, 3)) # invalid ROI rect self.assertListEqual(RectRoiGeom.INVALID, list(processed.roi.geom1.geometry)) widget.updateF(processed) widget.setImage.assert_not_called() # invalid ROI rect processed.roi.geom1.geometry = [0, 0, -1, 0] widget.updateF(processed) widget.setImage.assert_not_called() # valid ROI rect processed.roi.geom1.geometry = [0, 0, 2, 2] widget.updateF(processed) widget.setImage.assert_called_once()
def testPoiImageView(self): from extra_foam.gui.windows.pulse_of_interest_w import PoiImageView widget = PoiImageView(0) data = ProcessedData(1) widget.updateF(data)
def data_with_assembled(cls, tid, shape, *, src_type=DataSource.BRIDGE, dtype=config['SOURCE_PROC_IMAGE_DTYPE'], gen='random', slicer=None, with_xgm=False, with_digitizer=False, **kwargs): imgs = cls._gen_images(gen, shape, dtype) processed = ProcessedData(tid) processed.image = ImageData.from_array(imgs, **kwargs) if imgs.ndim == 2: slicer = None else: slicer = slice(None, None) if slicer is None else slicer src_list = [('Foo', 'oof'), ('Bar', 'rab'), ('karaboFAI', 'extra_foam')] src_name, key_name = random.choice(src_list) catalog = SourceCatalog() ctg = 'ABCD' src = f'{src_name} {key_name}' catalog.add_item(SourceItem(ctg, src_name, [], key_name, slicer, None)) catalog._main_detector = src n_pulses = processed.n_pulses if with_xgm: # generate XGM data processed.pulse.xgm.intensity = np.random.rand(n_pulses) processed.xgm.intensity = random.random() processed.xgm.x = random.random() processed.xgm.y = random.random() if with_digitizer: # generate digitizer data digitizer = processed.pulse.digitizer digitizer.ch_normalizer = 'B' for ch in digitizer: digitizer[ch].pulse_integral = np.random.rand(n_pulses) data = { 'processed': processed, 'catalog': catalog, 'meta': { src: { 'timestamp.tid': tid, 'source_type': src_type, } }, 'raw': { src: dict() }, 'assembled': { 'data': imgs, } } if imgs.ndim == 2: data['assembled']['sliced'] = imgs else: data['assembled']['sliced'] = imgs[slicer] return data, processed
def testPumpProbeImageView(self): from extra_foam.gui.windows.pump_probe_w import PumpProbeImageView widget = PumpProbeImageView() data = ProcessedData(1) widget.updateF(data)
def testPumpProbeVFomPlot(self): from extra_foam.gui.windows.pump_probe_w import PumpProbeVFomPlot widget = PumpProbeVFomPlot() data = ProcessedData(1) widget.updateF(data)
def testInTrainFomPlot(self): from extra_foam.gui.windows.histogram_w import InTrainFomPlot widget = InTrainFomPlot() data = ProcessedData(1) widget.updateF(data)
def testPumpProbeFomPlot(self): from extra_foam.gui.windows.pump_probe_w import PumpProbeFomPlot widget = PumpProbeFomPlot() widget._data = ProcessedData(1) widget.refresh()