diff --git a/bdaq53/system/scan_base.py b/bdaq53/system/scan_base.py index 2bd1fb6fbd669bf1efcdd93289bf6e5f707a6db2..e49a38a55f9066b34917374d687b18a1f13654ca 100755 --- a/bdaq53/system/scan_base.py +++ b/bdaq53/system/scan_base.py @@ -260,20 +260,21 @@ class ScanBase(object): raise e def configure(self): + ret_values = [None] * self.n_chips() try: if not self.initialized: raise RuntimeError('Cannot call configure() before init() is called!') # Deactivate receiver to prevent recording useless data for _ in self.iterate_chips(): self._set_receiver_enabled(receiver=self.chip.receiver, enabled=False) - for _ in self.iterate_chips(): + for i, _ in enumerate(self.iterate_chips()): with self._logging_through_handler(self.log_fh): self.log.info('Configuring chip {0}...'.format(self.chip.get_sn())) # Load masks from config self._set_receiver_enabled(receiver=self.chip.receiver, enabled=True) self._configure_masks() # Scan dependent configuration step before actual scan can be started (set enable masks etc.) - self._configure(**self.scan_config) + ret_values[i] = self._configure(**self.scan_config) self.periphery.get_module_power(module=self.module_settings['name'], log=True) self._set_receiver_enabled(receiver=self.chip.receiver, enabled=False) @@ -282,6 +283,8 @@ class ScanBase(object): # Make sure monitor filter is blocking for all receivers before starting scan self.bdaq.set_monitor_filter(mode='block') + + return ret_values except Exception as e: self._on_exception() raise e @@ -294,6 +297,7 @@ class ScanBase(object): if self.chip_settings['use_ptot']: self.chip.enable_ptot() + ret_values = [None] * self.n_chips() try: if not self.initialized: raise RuntimeError('Cannot call scan() before init() is called!') @@ -311,11 +315,11 @@ class ScanBase(object): for _ in self.iterate_chips(): self._set_receiver_enabled(receiver=self.chip.receiver, enabled=False) else: - for _ in self.iterate_chips(): + for i, _ in enumerate(self.iterate_chips()): with self._logging_through_handler(self.log_fh): self.periphery.get_module_power(module=self.module_settings['name'], log=True) self._set_receiver_enabled(receiver=self.chip.receiver, enabled=True) - self._scan(**self.scan_config) + ret_values[i] = self._scan(**self.scan_config) self._set_receiver_enabled(receiver=self.chip.receiver, enabled=False) # Finalize scan # Disable tlu module in case it was enabled. @@ -334,6 +338,8 @@ class ScanBase(object): self._write_config_h5(self.h5_file, node) self._store_scan_par_values(self.h5_file) # store scan params in out node, since it is defined during scan step self.h5_file.close() + + return ret_values except Exception as e: self._on_exception() raise e @@ -343,16 +349,16 @@ class ScanBase(object): Loop over all chips in testbench and for each perform the analysis routine of the scan: - Analyze raw data, plotting ''' - + ret_values = [None] * self.n_chips() try: if self.configuration['bench']['analysis'].get('skip', False): return - for _ in self.iterate_chips(): + for i, _ in enumerate(self.iterate_chips()): with self._logging_through_handler(self.log_fh): # Perform actual analysis self.log.info('Starting analysis for ' + self.name + ' (' + self.chip_settings['chip_sn'] + ')') if self.configuration['bench']['analysis'].get('blocking', True): - self._analyze() + ret_values[i] = self._analyze() else: def analyze_and_close_file(): @@ -366,6 +372,7 @@ class ScanBase(object): self.ana_proc.start() if self.configuration['bench']['analysis'].get('module_plotting', True): self._run_module_plotting() + return ret_values except Exception as e: self._on_exception() raise e @@ -461,6 +468,9 @@ class ScanBase(object): self.set_chip_handles(c) yield c + def n_chips(self): + return len(self.chips) + def set_chip_handles(self, chip): ''' Add the chip properties that are kept in the chip container to this class. diff --git a/bdaq53/tests/test_software/base/test_scan_base.py b/bdaq53/tests/test_software/base/test_scan_base.py index 851da829203d7ab459047bf0b84a517bad5a3f2b..8daace2021ec5b0843f6ac924b697d9a7d0e312a 100644 --- a/bdaq53/tests/test_software/base/test_scan_base.py +++ b/bdaq53/tests/test_software/base/test_scan_base.py @@ -79,6 +79,9 @@ class TestScanBase(unittest.TestCase): # Use hardware mocks to be able to test without hardware cls.bhm = bdaq_mock.BdaqMock(n_chips=4) + # Speed up testing time drastically, by not calling mask shifting + cls.bhm.patch_function('bdaq53.chips.rd53a.RD53AMaskObject.update') + cls.bhm.patch_function('bdaq53.chips.ITkPixV1.ITkPixV1MaskObject.update') cls.bhm.start() cls.TestScan = create_test_scan(parallel=False) @@ -363,7 +366,7 @@ class TestScanBase(unittest.TestCase): def test_chip_registers_config_from_bench(self): ''' Check that chip register settings are overwritten by test bench definitions ''' - print(self.bench_config) + bench_config = copy.deepcopy(self.bench_config) # Add additional chip to module 0 bench_config['modules']['module_0']['chip_1'] = copy.deepcopy(bench_config['modules']['module_0']['chip_0']) @@ -543,6 +546,40 @@ class TestScanBase(unittest.TestCase): db_mock.assert_called() finally: self.bhm.reset() # reset special mock + self.bhm.patch_function('bdaq53.chips.rd53a.RD53AMaskObject.update') + self.bhm.patch_function('bdaq53.chips.ITkPixV1.ITkPixV1MaskObject.update') + + def test_return_values(self): + ''' Test that return values in scan steps: configure, scan, analyze are set ''' + bench_config = copy.deepcopy(self.bench_config) + # Add additional chip to module 0 + bench_config['modules']['module_0']['chip_1'] = copy.deepcopy(bench_config['modules']['module_0']['chip_0']) + bench_config['modules']['module_0']['chip_1']['chip_sn'] = '0x0002' + bench_config['modules']['module_0']['chip_1']['receiver'] = "rx1" + bench_config['modules']['module_0']['chip_1']['send_data'] = "tcp://127.0.0.1:5501" + + # Create test scan that returns values for all scan steps + from bdaq53.system.scan_base import ScanBase + + class TestReturnValuesScan(ScanBase): + scan_id = 'test_return_values_scan' + + def _configure(self, **_): + return self.chip_settings['chip_type'], self.chip_settings['chip_sn'] + + def _scan(self, **_): + return self.chip_settings['chip_type'], self.chip_settings['chip_sn'] + + def _analyze(self): + return self.chip_settings['chip_type'], self.chip_settings['chip_sn'] + + with TestReturnValuesScan(bench_config=bench_config) as scan: + values = scan.configure() + self.assertListEqual([('rd53a', '0x0001'), ('rd53a', '0x0002')], values) + values = scan.scan() + self.assertListEqual([('rd53a', '0x0001'), ('rd53a', '0x0002')], values) + values = scan.analyze() + self.assertListEqual([('rd53a', '0x0001'), ('rd53a', '0x0002')], values) if __name__ == '__main__':