Skip to content

Master channels also have to be displayed

Channels from the "master" key also have to be displayed. Spotted by @papillon.

Here is an example of the scan info. "pcoedge:image" is part of the master channels, not part of the "slave" channel. This PR merge both lists, do not change the order of the previous one, and avoid dups.

It is maybe relative to #925 (closed). Then maybe there is a better way to fix the issue.

SCANS[-1].scan_info["acquisition_chain"]

{
    "pcoedge": {
        "master": {
            "scalars": [],
            "scalars_units": {"pcoedge:image": None},
            "spectra": [],
            "images": ["pcoedge:image"],
            "display_names": {"pcoedge:image": "image"},
        },
        "scalars": [
            "pcoedge:roi_counters:pcoroi1:avg",
            "pcoedge:roi_counters:pcoroi1:max",
            "pcoedge:roi_counters:pcoroi1:min",
            "pcoedge:roi_counters:pcoroi1:std",
            "pcoedge:roi_counters:pcoroi1:sum",
            "pcoedge:roi_counters:pcoroi2:avg",
            "pcoedge:roi_counters:pcoroi2:max",
            "pcoedge:roi_counters:pcoroi2:min",
            "pcoedge:roi_counters:pcoroi2:std",
            "pcoedge:roi_counters:pcoroi2:sum",
        ],
        "scalars_units": {
            "pcoedge:roi_counters:pcoroi1:avg": None,
            "pcoedge:roi_counters:pcoroi1:max": None,
            "pcoedge:roi_counters:pcoroi1:min": None,
            "pcoedge:roi_counters:pcoroi1:std": None,
            "pcoedge:roi_counters:pcoroi1:sum": None,
            "pcoedge:roi_counters:pcoroi2:avg": None,
            "pcoedge:roi_counters:pcoroi2:max": None,
            "pcoedge:roi_counters:pcoroi2:min": None,
            "pcoedge:roi_counters:pcoroi2:std": None,
            "pcoedge:roi_counters:pcoroi2:sum": None,
        },
        "spectra": [],
        "images": [],
        "display_names": {
            "pcoedge:roi_counters:pcoroi1:avg": "pcoroi1:avg",
            "pcoedge:roi_counters:pcoroi1:max": "pcoroi1:max",
            "pcoedge:roi_counters:pcoroi1:min": "pcoroi1:min",
            "pcoedge:roi_counters:pcoroi1:std": "pcoroi1:std",
            "pcoedge:roi_counters:pcoroi1:sum": "pcoroi1:sum",
            "pcoedge:roi_counters:pcoroi2:avg": "pcoroi2:avg",
            "pcoedge:roi_counters:pcoroi2:max": "pcoroi2:max",
            "pcoedge:roi_counters:pcoroi2:min": "pcoroi2:min",
            "pcoedge:roi_counters:pcoroi2:std": "pcoroi2:std",
            "pcoedge:roi_counters:pcoroi2:sum": "pcoroi2:sum",
        },
    },
    "pilatus": {
        "master": {
            "scalars": [],
            "scalars_units": {"pilatus:image": None},
            "spectra": [],
            "images": ["pilatus:image"],
            "display_names": {"pilatus:image": "image"},
        },
        "scalars": [
            "pilatus:roi_counters:roi1:avg",
            "pilatus:roi_counters:roi1:max",
            "pilatus:roi_counters:roi1:min",
            "pilatus:roi_counters:roi1:std",
            "pilatus:roi_counters:roi1:sum",
        ],
        "scalars_units": {
            "pilatus:roi_counters:roi1:avg": None,
            "pilatus:roi_counters:roi1:max": None,
            "pilatus:roi_counters:roi1:min": None,
            "pilatus:roi_counters:roi1:std": None,
            "pilatus:roi_counters:roi1:sum": None,
        },
        "spectra": [],
        "images": [],
        "display_names": {
            "pilatus:roi_counters:roi1:avg": "roi1:avg",
            "pilatus:roi_counters:roi1:max": "roi1:max",
            "pilatus:roi_counters:roi1:min": "roi1:min",
            "pilatus:roi_counters:roi1:std": "roi1:std",
            "pilatus:roi_counters:roi1:sum": "roi1:sum",
        },
    },
}

Here is an example to create a custom acquisition chain to reproduce the problem.

TEST_SESSION [1]: SCAN_DISPLAY.auto=True
TEST_SESSION [2]: from bliss.scanning.chain import (
             ...:     AcquisitionMaster,
             ...:     AcquisitionDevice,
             ...:     AcquisitionChannel,
             ...: )
TEST_SESSION [3]: class DummyDevice(AcquisitionDevice):
             ...:     def __init__(self, *args, **kwargs):
             ...:         self.sleep_time = kwargs.pop("sleep_time", 0)
             ...:         AcquisitionDevice.__init__(self, *args, **kwargs)
             ...:         self.channels.append(AcquisitionChannel(f"{self.name}:pi", float, ()))
             ...:         self.channels.append(AcquisitionChannel(f"{self.name}:nb", float, ()))
             ...:         self.nb_trigger = 0
             ...:         self.prepared_flag = False
             ...:         self.started_flag = False
             ...:
             ...:     def prepare(self):
             ...:         gevent.sleep(self.sleep_time)
             ...:         self.prepared_flag = True
             ...:
             ...:     def start(self):
             ...:         gevent.sleep(self.sleep_time)
             ...:         self.started_flag = True
             ...:
             ...:     def trigger(self):
             ...:         self.channels.update_from_iterable((3.14, self.nb_trigger))
             ...:         self.nb_trigger += 1
             ...:
             ...:     def stop(self):
             ...:         pass
TEST_SESSION [4]: def mytest():
             ...:     from bliss.scanning.scan import Scan
             ...:     from bliss.scanning.chain import AcquisitionChain, AcquisitionChannel, AcquisitionMaster
             ...:     from bliss.scanning.acquisition import timer
             ...:     from bliss.scanning.acquisition.lima import LimaAcquisitionMaster
             ...:     from bliss.scanning.acquisition.motor import LinearStepTriggerMaster, MotorMaster
             ...:     from bliss.scanning.acquisition.counter import SamplingCounterAcquisitionDevice
             ...:     chain = AcquisitionChain()
             ...:     lima_sim = config.get("lima_simulator")
             ...:     lima_master = LimaAcquisitionMaster(lima_sim, acq_nb_frames=10, acq_expo_time=0.1)
             ...:     lima_master.add_counter(lima_sim.image)
             ...:
             ...:     device = DummyDevice(None, "device", npoints=1)
             ...:     chain.add(lima_master, device)
             ...:
             ...:     scan = Scan(chain, "test")
             ...:     scan.run()
TEST_SESSION [5]: mytest()
QXcbConnection: XCB error: 145 (Unknown), sequence: 171, resource id: 0, major code: 139 (Unknown), minor code: 20
/mntdirect/_bliss/users/valls/workspace/bliss.git/bliss/data/lima.py:123: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
  data = numpy.fromstring(raw_data[HEADER_SIZE:], dtype=mode)
/mntdirect/_bliss/users/valls/workspace/bliss.git/bliss/data/lima.py:123: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
  data = numpy.fromstring(raw_data[HEADER_SIZE:], dtype=mode)

Without the patch, the image is not displayed.

Edited by Valentin Valls

Merge request reports