From 17fc2b96273e5fa5d0340f164bf532dc584241d2 Mon Sep 17 00:00:00 2001
From: Laurent Mercadier <laurent.mercadier@xfel.eu>
Date: Tue, 6 Dec 2022 21:12:12 +0100
Subject: [PATCH] redefine TPI mnemonics and add function to read its state

---
 src/toolbox_scs/constants.py         |  4 ++--
 src/toolbox_scs/load.py              |  4 ++++
 src/toolbox_scs/misc/__init__.py     |  2 ++
 src/toolbox_scs/misc/train_picker.py | 20 ++++++++++++++++++++
 4 files changed, 28 insertions(+), 2 deletions(-)
 create mode 100644 src/toolbox_scs/misc/train_picker.py

diff --git a/src/toolbox_scs/constants.py b/src/toolbox_scs/constants.py
index 4cd78b8..1505f26 100644
--- a/src/toolbox_scs/constants.py
+++ b/src/toolbox_scs/constants.py
@@ -71,8 +71,8 @@ mnemonics = {
     "M2BEND": ({'source': 'SA3_XTD10_MIRR-2/MOTOR/BENDER',
                 'key': 'actualPosition.value',
                 'dim': None},),
-    "tpi": ({'source': 'SCS_XTD10_TPI/DCTRL/SHUTTER',
-                     'key': 'operationModePLC.value',
+    "TPI": ({'source': 'SCS_XTD10_TPI/DCTRL/SHUTTER',
+                     'key': 'hardwareStatusBitField.value',
                      'dim': None},),
     "VSLIT": ({'source': 'SA3_XTD10_VSLIT/MDL/BLADE',
                'key': 'actualGap.value',
diff --git a/src/toolbox_scs/load.py b/src/toolbox_scs/load.py
index c66dd38..9813e31 100644
--- a/src/toolbox_scs/load.py
+++ b/src/toolbox_scs/load.py
@@ -20,6 +20,7 @@ from .constants import mnemonics as _mnemonics
 from .mnemonics_machinery import mnemonics_for_run
 from .util.exceptions import ToolBoxValueError
 import toolbox_scs.detectors as tbdet
+from toolbox_scs.misc import get_tpi_state
 
 __all__ = [
     'concatenateRuns',
@@ -253,6 +254,9 @@ def load(proposalNB=None, runNB=None,
     if extract_bam and len(bam) > 0:
         data = tbdet.get_bam(run, mnemonics=bam, merge_with=data)
 
+    if 'TPI' in data:
+        data['TPI'] = get_tpi_state(data['TPI'])
+
     return run, data
 
 
diff --git a/src/toolbox_scs/misc/__init__.py b/src/toolbox_scs/misc/__init__.py
index 2d92125..aca146c 100644
--- a/src/toolbox_scs/misc/__init__.py
+++ b/src/toolbox_scs/misc/__init__.py
@@ -1,11 +1,13 @@
 from .bunch_pattern import *
 from .bunch_pattern_external import *
 from .laser_utils import *
+from .train_picker import *
 from .undulator import *
 
 __all__ = (
     bunch_pattern.__all__
     + bunch_pattern_external.__all__
     + laser_utils.__all__
+    + train_picker.__all__
     + undulator.__all__
 )
diff --git a/src/toolbox_scs/misc/train_picker.py b/src/toolbox_scs/misc/train_picker.py
new file mode 100644
index 0000000..e55078c
--- /dev/null
+++ b/src/toolbox_scs/misc/train_picker.py
@@ -0,0 +1,20 @@
+__all__ = [
+    'get_tpi_state'
+]
+
+
+def get_tpi_state(arr):
+    """ Extract the closed (True) or opened (False) state of the train picker
+        from the hardwareStatusBitField
+        
+        Parameters
+        ----------
+        arr: array
+            the array of hardwareStatusBitField values
+        
+        Returns
+        -------
+        tpi_state: boolean array
+            the tpi state
+    """
+    return arr & (1 << 9) > 0
-- 
GitLab