Setup Profile Collection

I will introduce how to set up the profile collection for the IPython session in this section. The profile collection is a folder of *.py files. These files will be executed in order when bsui is called. The xrun and other helper functions are added into the namespace by one of the *.py file. Its usual name is 999-load.py or 94-load.py.

This file has a big change at the version 1.1.0. Thus, there is a if clause to determine how to create the python objects differently.

"""XpdAcq Initializatoion

Initialize the XpdAcq objects for xpdacq >= 1.1.0.
This file will do the following changes to the name space:

    (1) create objects of `xrun`, `glbl` etc. using the UserInterface class in XpdAcq.
    (2) import helper functions for users from XpdAcq
    (3) change the home directory to `glbl['home']` or `glbl['base']`
    (4) disable the logging of pyFAI
"""
import xpdacq

xpdacq_version = tuple(map(int, xpdacq.__version__.split(".")))

if xpdacq_version < (1, 1, 0):
    import os
    from xpdacq.xpdacq_conf import (glbl_dict, configure_device,
                                _reload_glbl, _set_glbl,
                                _load_beamline_config)

    # configure experiment device being used in current version
    if glbl_dict['is_simulation']:
        from xpdacq.simulation import (xpd_pe1c, db, cs700, shctl1,
                                    ring_current, fb)
        pe1c = xpd_pe1c # alias

    configure_device(area_det=pe1c, shutter=fs,
                    temp_controller=eurotherm, #changed from None to eurotherm on 3/22/19 - DPO
                    db=db,
                    filter_bank=fb,
                    ring_current=ring_current)

    # cache previous glbl state
    reload_glbl_dict = _reload_glbl()
    from xpdacq.glbl import glbl

    # reload beamtime
    from xpdacq.beamtimeSetup import (start_xpdacq, _start_beamtime,
                                    _end_beamtime)

    bt = start_xpdacq()
    if bt is not None:
        print("INFO: Reload beamtime objects:\n{}\n".format(bt))
    if reload_glbl_dict is not None:
        _set_glbl(glbl, reload_glbl_dict)

    # import necessary modules
    from xpdacq.xpdacq import *
    from xpdacq.beamtime import *
    from xpdacq.utils import import_sample_info

    # instantiate xrun without beamtime, like bluesky setup
    xrun = CustomizedRunEngine(None)
    xrun.md['beamline_id'] = glbl['beamline_id']
    xrun.md['group'] = glbl['group']
    xrun.md['facility'] = glbl['facility']
    beamline_config = _load_beamline_config(glbl['blconfig_path'])
    xrun.md['beamline_config'] = beamline_config

    # insert header to db, either simulated or real
    xrun.subscribe(db.insert, 'all')

    if bt:
        xrun.beamtime = bt

    HOME_DIR = glbl['home']
    BASE_DIR = glbl['base']

    print('INFO: Initializing the XPD data acquisition environment\n')
    if os.path.isdir(HOME_DIR):
        os.chdir(HOME_DIR)
    else:
        os.chdir(BASE_DIR)

    # See https://github.com/silx-kit/pyFAI/issues/1399#issuecomment-694185304
    import logging
    logging.getLogger().addHandler(logging.NullHandler())

    from xpdacq.calib import *

    # analysis functions, only at beamline
    #from xpdan.data_reduction import *

    print('OK, ready to go.  To continue, follow the steps in the xpdAcq')
    print('documentation at http://xpdacq.github.io/xpdacq\n')

else:
    import os

    # Disable interactive logging of pyFAI
    # See https://github.com/silx-kit/pyFAI/issues/1399#issuecomment-694185304
    os.environ["PYFAI_NO_LOGGING"] = "1"

    from xpdacq.utils import import_userScriptsEtc, import_sample_info
    from xpdacq.beamtimeSetup import _start_beamtime, _end_beamtime
    from xpdacq.beamtime import ScanPlan, Sample, ct, Tramp, Tlist, tseries
    from xpdacq.ipysetup import UserInterface

    # Do all setup in the constructor of UserInterface
    # HOME directory will be changed to the one in glbl
    ui = UserInterface(
        area_dets=[pe1c],
        det_zs=[None],
        shutter=fs,
        temp_controller=eurotherm,
        filter_bank=fb,
        ring_current=ring_current,
        db=db
    )
    xrun = ui.xrun
    glbl = ui.glbl
    xpd_configuration = ui.xpd_configuration
    run_calibration = ui.run_calibration
    bt = ui.bt

    # Remove the variables that won't be used
    del UserInterface, ui

# remove the uselss names
del xpdacq_version

In the latest version, all python objects are created by the UserInterface class.