Skip to content

jungfraulib

JungfrauCtrl

Source code in /usr/src/app/checkouts/readthedocs.org/user_builds/european-xfel-offline-calibration/envs/latest/lib/python3.8/site-packages/cal_tools/jungfrau/jungfraulib.py
class JungfrauCtrl():
    def __init__(
        self,
        run_dc: extra_data.DataCollection,
        ctrl_src: str,
    ):
        """Read slow data from RUN source.
        :param run_dir: EXtra-data RunDirectory DataCollection object.
        :param ctrl_src: Control source name for accessing run slow data.
        """
        self.run_dc = run_dc
        self.ctrl_src = ctrl_src
        # run settings and mode are read as raw settings
        self.run_settings = self._get_settings()
        self.run_mode = self._get_mode()

    def _get_settings(self) -> str:
        """Get JUNGFRAU run settings and mode."""
        try:
            return self.run_dc.get_run_value(self.ctrl_src, "settings")
        except extra_data.PropertyNameError:
            print("\'settings.value\' key "
                  "is not available for this run. "
                  "`run_settings` is set to `dynamicgain`")
            return "dynamicgain"  # old data are set to `dynamicgain`.

    def _get_mode(self) -> str:
        """Get run mode from `gainMode` dataset."""
        try:
            return self.run_dc.get_run_value(self.ctrl_src, "gainMode")
        except extra_data.PropertyNameError:
            return self.run_settings

    def get_memory_cells(self) -> Tuple[int, int]:
        n_storage_cells = int(self.run_dc.get_run_value(
            self.ctrl_src, "storageCells.value")) + 1
        storage_cell_st = int(self.run_dc.get_run_value(
            self.ctrl_src, "storageCellStart.value"))
        return n_storage_cells, storage_cell_st

    def get_bias_voltage(self) -> int:
        """Get Bias voltage value from RUN source."""
        if "highVoltage" in self.run_dc[self.ctrl_src]:
            return int(
                self.run_dc.get_run_value(self.ctrl_src, "highVoltage")[0])
        else:  # Old dataset "vHighVoltage" before end of 2022.
            return int(
                self.run_dc.get_run_value(self.ctrl_src, "vHighVoltage")[0])

    def get_integration_time(self) -> float:
        return(float(self.run_dc.get_run_value(
            self.ctrl_src, "exposureTime.value")) * 1e6)

    def get_gain_setting(self) -> int:
        """Get run gain settings to identify if run is in
        High CDS or Low CDS.
        - `1` if run_settings = highgain0.
        - `0` if run_settings = gain0 or None.
        """
        # Check if `run_settings` is of an old settings value
        # to convert into new settings value.
        if self.run_settings in [s.value for s in JungfrauSettings]:
            settings = self.run_settings
        else:
            settings = _old_settings_to_new(self.run_settings, 0)

        if settings == JungfrauSettings.HIGH_GAIN_0.value:
            return 1
        else:  # JungfrauSettings.GAIN_0
            return 0

    def get_gain_mode_str(self):
        # Check if run_mode is of an old settings to convert
        # into new mode value.
        if self.run_mode in [m.value for m in JGM]:
            return self.run_mode
        else:
            return _old_settings_to_new(self.run_mode, 1)

    def get_gain_mode(self) -> int:
        """Get gain mode value. Fixed `1` or Adaptive `0`.
        Returns:
            (int): gain mode parameter condition
        """
        gm_enum = self.get_gain_mode_str()

        if gm_enum in [JGM.FIX_GAIN_1.value, JGM.FIX_GAIN_2.value]:
            return 1
        else:  # DYNAMIC, FORCE_SWITCH_G1, FORCE_SWITCH_G2 or None
            return 0

__init__(run_dc, ctrl_src)

Read slow data from RUN source. :param run_dir: EXtra-data RunDirectory DataCollection object. :param ctrl_src: Control source name for accessing run slow data.

Source code in /usr/src/app/checkouts/readthedocs.org/user_builds/european-xfel-offline-calibration/envs/latest/lib/python3.8/site-packages/cal_tools/jungfrau/jungfraulib.py
def __init__(
    self,
    run_dc: extra_data.DataCollection,
    ctrl_src: str,
):
    """Read slow data from RUN source.
    :param run_dir: EXtra-data RunDirectory DataCollection object.
    :param ctrl_src: Control source name for accessing run slow data.
    """
    self.run_dc = run_dc
    self.ctrl_src = ctrl_src
    # run settings and mode are read as raw settings
    self.run_settings = self._get_settings()
    self.run_mode = self._get_mode()

get_bias_voltage()

Get Bias voltage value from RUN source.

Source code in /usr/src/app/checkouts/readthedocs.org/user_builds/european-xfel-offline-calibration/envs/latest/lib/python3.8/site-packages/cal_tools/jungfrau/jungfraulib.py
def get_bias_voltage(self) -> int:
    """Get Bias voltage value from RUN source."""
    if "highVoltage" in self.run_dc[self.ctrl_src]:
        return int(
            self.run_dc.get_run_value(self.ctrl_src, "highVoltage")[0])
    else:  # Old dataset "vHighVoltage" before end of 2022.
        return int(
            self.run_dc.get_run_value(self.ctrl_src, "vHighVoltage")[0])

get_gain_mode()

Get gain mode value. Fixed 1 or Adaptive 0.

Returns:

Type Description
int

gain mode parameter condition

Source code in /usr/src/app/checkouts/readthedocs.org/user_builds/european-xfel-offline-calibration/envs/latest/lib/python3.8/site-packages/cal_tools/jungfrau/jungfraulib.py
def get_gain_mode(self) -> int:
    """Get gain mode value. Fixed `1` or Adaptive `0`.
    Returns:
        (int): gain mode parameter condition
    """
    gm_enum = self.get_gain_mode_str()

    if gm_enum in [JGM.FIX_GAIN_1.value, JGM.FIX_GAIN_2.value]:
        return 1
    else:  # DYNAMIC, FORCE_SWITCH_G1, FORCE_SWITCH_G2 or None
        return 0

get_gain_setting()

Get run gain settings to identify if run is in High CDS or Low CDS. - 1 if run_settings = highgain0. - 0 if run_settings = gain0 or None.

Source code in /usr/src/app/checkouts/readthedocs.org/user_builds/european-xfel-offline-calibration/envs/latest/lib/python3.8/site-packages/cal_tools/jungfrau/jungfraulib.py
def get_gain_setting(self) -> int:
    """Get run gain settings to identify if run is in
    High CDS or Low CDS.
    - `1` if run_settings = highgain0.
    - `0` if run_settings = gain0 or None.
    """
    # Check if `run_settings` is of an old settings value
    # to convert into new settings value.
    if self.run_settings in [s.value for s in JungfrauSettings]:
        settings = self.run_settings
    else:
        settings = _old_settings_to_new(self.run_settings, 0)

    if settings == JungfrauSettings.HIGH_GAIN_0.value:
        return 1
    else:  # JungfrauSettings.GAIN_0
        return 0

sort_runs_by_gain(raw_folder, runs, ctrl_src, modes_order=MODES_ORDER, expected_run_order=EXPECTED_RUN_ORDER)

Validate the 3 dark runs given for Jungfrau.

Parameters:

Name Type Description Default
raw_folder str

RAW folder for the validated dark runs.

required
runs list

[High run, Medium run, Low run].

required
ctrl_src str

Control source path for slow data.

required
modes_order dict

Gain modes order to sort the runs by.

MODES_ORDER
expected_run_order list

Expected dark runs order to process.

EXPECTED_RUN_ORDER

Raises:

Type Description
ValueError

Wrong given dark runs

Source code in /usr/src/app/checkouts/readthedocs.org/user_builds/european-xfel-offline-calibration/envs/latest/lib/python3.8/site-packages/cal_tools/jungfrau/jungfraulib.py
def sort_runs_by_gain(
    raw_folder,
    runs,
    ctrl_src,
    modes_order=MODES_ORDER,
    expected_run_order=EXPECTED_RUN_ORDER
):
    """Validate the 3 dark runs given for Jungfrau.

    Args:
        raw_folder (str): RAW folder for the validated dark runs.
        runs (list): [High run, Medium run, Low run].
        ctrl_src (str): Control source path for slow data.
        modes_order (dict): Gain modes order to sort the runs by.
        expected_run_order (list):Expected dark runs order to process.
    Raises:
        ValueError: Wrong given dark runs
    """
    assert len(runs) == 3, "Wrong number of runs. expected a list of 3 runs."

    run_gm_mapping = dict()
    for run in runs:
        ctrl_data = JungfrauCtrl(
            extra_data.RunDirectory(f"{raw_folder}/r{run:04d}/"),
            ctrl_src)
        gm = ctrl_data.get_gain_mode_str()
        run_gm_mapping[run] = gm

    # 1st legacy case before having run.settings in data.
    if all(value is None for value in run_gm_mapping.values()):
        warning("run.settings is not stored in the data "
                f"to read. Hence assuming gain_mode = {gm}"
                " for adaptive old data.")
        return runs

    run_gm_mapping = dict(sorted(
        run_gm_mapping.items(),
        key=lambda item: modes_order[item[1]]
        ))
    if list(run_gm_mapping.keys()) != runs:
        warning("Given dark runs are unsorted. "
                f"Runs will be sorted from {runs} of gain modes "
                f"{list(run_gm_mapping.values())} to "
                f"{list(run_gm_mapping.keys())}")

    runs = list(run_gm_mapping.keys())
    modes = list(run_gm_mapping.values())

    legacy_adaptive = [
        JGM.DYNAMIC.value,
        JGM.DYNAMIC.value,
        JGM.FORCE_SWITCH_HG1.value
    ]

    # 2nd legacy case with CTRL/MDL bug resulting in wrong run settings.
    if modes == legacy_adaptive:
        warning(f"run.settings for medium and low gain runs"
                f" are wrong {modes[1:]}. This is an expected "
                f"bug for old raw data. "
                "Assuming this is an adaptive gain runs.")
    elif not modes in expected_run_order:
        raise ValueError("Wrong dark runs are given. "
                         f"The given three runs are {runs} with "
                         f"wrong gain modes {modes}."
                         "Please verify the selected 3 dark runs to process.")

    return runs