diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8dc2303883c44a3a4ad40e059a734378c6887e6f..e4fab6713dc1dddfdfdda89d18899c0841fda204 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -15,6 +15,7 @@ stages:
   - linting
   - static-analysis
   - unit-tests
+  - integration-tests
 linting:
   stage: linting
   script:
@@ -34,3 +35,25 @@ unit_test:
   script:
     - cd devices
     - tox -e py37
+integration_test:
+  stage: integration-tests
+  allow_failure: true
+  services:
+    - name: docker:20.10.8-dind
+  variables:
+    DOCKER_TLS_CERTDIR: "/certs"
+# Everything below does not work currently, we need a privileged container
+# that can run the dind service
+  before_script:
+    - sudo apt update
+    - sudo apt install -y docker.io
+    - export USER=$(id | awk -F'=' '{print $2}' | awk -F'(' '{print $2}' | awk -F')' '{print $1}')
+    - echo $USER
+#    - sudo usermod -aG docker $USER
+    - sudo docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
+  script:
+    - touch /home/$USER/.Xauthority
+    - source bootstrap/etc/lofar20rc.sh
+    - export HOSTNAME=$(cat /run/systemd/netif/leases/2 | grep ^ADDRESS= | awk -F'=' '{print $2}')
+    - echo $HOSTNAME
+    - sudo $CI_PROJECT_DIR/sbin/run_integration_test.sh
diff --git a/CDB/LOFAR_ConfigDb.json b/CDB/LOFAR_ConfigDb.json
index f4032fb611d54f261676041658af859a69f37559..197686104afa47aeb018b0c5caade4d286a4fe9b 100644
--- a/CDB/LOFAR_ConfigDb.json
+++ b/CDB/LOFAR_ConfigDb.json
@@ -479,6 +479,8 @@
                                 "1000",
                                 "rnd20",
                                 "1000",
+                                "rnd21",
+                                "1000",
                                 "state",
                                 "1000",
                                 "status",
@@ -682,6 +684,24 @@
                             "OPC_Time_Out": [
                                 "5.0"
                             ],
+                            "FPGA_sdp_info_station_id_RW_default": [
+                                "901",
+                                "901",
+                                "901",
+                                "901",
+                                "901",
+                                "901",
+                                "901",
+                                "901",
+                                "901",
+                                "901",
+                                "901",
+                                "901",
+                                "901",
+                                "901",
+                                "901",
+                                "901"
+                            ],
                             "polled_attr": [
                                 "fpga_temp_r",
                                 "1000",
@@ -733,6 +753,60 @@
                             ],
                             "OPC_Time_Out": [
                                 "5.0"
+                            ],
+                            "FPGA_sst_offload_hdr_eth_destination_mac_RW_default": [
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de",
+                                "6c:2b:59:97:cb:de"
+                            ],
+                            "FPGA_sst_offload_hdr_ip_destination_address_RW_default": [
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250",
+                                "10.99.250.250"
+                            ],
+                            "FPGA_sst_offload_hdr_udp_destination_port_RW_default": [
+                                "5001",
+                                "5001",
+                                "5001",
+                                "5001",
+                                "5001",
+                                "5001",
+                                "5001",
+                                "5001",
+                                "5001",
+                                "5001",
+                                "5001",
+                                "5001",
+                                "5001",
+                                "5001",
+                                "5001",
+                                "5001"
                             ]
                         }
                     }
diff --git a/CDB/integration_ConfigDb.json b/CDB/integration_ConfigDb.json
new file mode 100644
index 0000000000000000000000000000000000000000..b2f9cca6dc8db917942f35bb8be25e4cb88bdb93
--- /dev/null
+++ b/CDB/integration_ConfigDb.json
@@ -0,0 +1,64 @@
+{
+    "servers": {
+        "PCC": {
+            "LTS": {
+                "PCC": {
+                    "LTS/PCC/1": {
+                        "properties": {
+                            "OPC_Server_Name": [
+                                "pypcc-sim"
+                            ],
+                            "OPC_Server_Port": [
+                                "4842"
+                            ],
+                            "OPC_Time_Out": [
+                                "5.0"
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "SDP": {
+            "LTS": {
+                "SDP": {
+                    "LTS/SDP/1": {
+                        "properties": {
+                            "OPC_Server_Name": [
+                                "sdptr-sim"
+                            ],
+                            "OPC_Server_Port": [
+                                "4840"
+                            ],
+                            "OPC_Time_Out": [
+                                "5.0"
+                            ]
+                        }
+                    }
+                }
+            }
+        },
+        "SST": {
+            "LTS": {
+                "SST": {
+                    "LTS/SST/1": {
+                        "properties": {
+                            "SST_Client_Port": [
+                                "5001"
+                            ],
+                            "OPC_Server_Name": [
+                                "sdptr-sim"
+                            ],
+                            "OPC_Server_Port": [
+                                "4840"
+                            ],
+                            "OPC_Time_Out": [
+                                "5.0"
+                            ]
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/devices/.stestr.conf b/devices/.stestr.conf
index ddc59860d5117ed8bdc44faeea1d893760b5520e..07147c8697683f270e9388da8b914c20cb8e4c45 100644
--- a/devices/.stestr.conf
+++ b/devices/.stestr.conf
@@ -1,3 +1,3 @@
 [DEFAULT]
-test_path=./test
+test_path=${TESTS_DIR:-./test}
 top_dir=./
diff --git a/devices/clients/attribute_wrapper.py b/devices/clients/attribute_wrapper.py
index 99312919c0631f85c64cd3aec097a00b316f12f4..12e5c83516e2c68c2216aca5ba9b39a1fa6f4f8c 100644
--- a/devices/clients/attribute_wrapper.py
+++ b/devices/clients/attribute_wrapper.py
@@ -1,6 +1,5 @@
 from tango.server import attribute
 from tango import AttrWriteType
-
 import numpy
 
 from devices.device_decorators import only_when_on, fault_on_error
@@ -27,23 +26,24 @@ class attribute_wrapper(attribute):
         """
 
         # ensure the type is a numpy array.
-        # see also https://pytango.readthedocs.io/en/stable/server_api/server.html?highlight=devlong#module-tango.server for 
+        # see also https://pytango.readthedocs.io/en/stable/server_api/server.html?highlight=devlong#module-tango.server for
         # more details about type conversion Python/numpy -> PyTango
         if "numpy" not in str(datatype) and datatype != str:
             raise TypeError("Attribute needs to be a Tango-supported numpy or str type, but has type \"%s\"" % (datatype,))
 
         self.comms_id = comms_id # store data that can be used to identify the comms interface to use. not used by the wrapper itself
         self.comms_annotation = comms_annotation  # store data that can be used by the comms interface. not used by the wrapper itself
-        self.numpy_type = datatype  # tango changes our attribute to their representation (E.g numpy.int64 becomes "DevLong64")
 
         self.init_value = init_value
         is_scalar = dims == (1,)
 
         # tango doesn't recognise numpy.str_, for consistencies sake we convert it here and hide this from the top level
         # NOTE: discuss, idk if this is an important detail somewhere else
-        if datatype is numpy.str_:
+        if datatype is numpy.str_ or datatype is numpy.str:
             datatype = str
 
+        self.numpy_type = datatype  # tango changes our attribute to their representation (E.g numpy.int64 becomes "DevLong64")
+
         # check if not scalar
         if is_scalar:
             # scalar, just set the single dimension.
@@ -131,7 +131,15 @@ class attribute_wrapper(attribute):
         else:
             numpy_dims = dims
 
-        value = numpy.zeros(numpy_dims, dtype=self.numpy_type)
+        if self.dim_x == 1:
+
+            if self.numpy_type == str:
+                value = ''
+            else:
+                value = self.numpy_type(0)
+        else:
+            value = numpy.zeros(numpy_dims, dtype=self.numpy_type)
+
         return value
 
     def set_comm_client(self, client):
diff --git a/devices/clients/opcua_client.py b/devices/clients/opcua_client.py
index e1aa0a87c59c738bc8d41c817cc8121aa7f93ad0..247c157d2dddf1901d92bf4adc560f73789ea174 100644
--- a/devices/clients/opcua_client.py
+++ b/devices/clients/opcua_client.py
@@ -22,8 +22,6 @@ numpy_to_OPCua_dict = {
     numpy.float32: opcua.ua.VariantType.Float,
     numpy.double: opcua.ua.VariantType.Double,
     numpy.float64: opcua.ua.VariantType.Double,
-    numpy.str_: opcua.ua.VariantType.String,
-    numpy.str: opcua.ua.VariantType.String,
     str: opcua.ua.VariantType.String
 }
 
@@ -91,7 +89,7 @@ class OPCUAConnection(CommClient):
             print(i.get_browse_name())
             for j in i.get_children():
                 try:
-                    print(j.get_browse_name(), j.get_data_type_as_variant_type())
+                    print(j.get_browse_name(), j.get_data_type_as_variant_type(), j.get_value())
                 except:
                     print(j.get_browse_name())
                 finally:
@@ -193,16 +191,16 @@ class ProtocolAttribute:
         """
         Read_R function
         """
-        value = numpy.array(self.node.get_value())
+        value = self.node.get_value()
 
         if self.dim_y + self.dim_x == 1:
             # scalar
             return value
         elif self.dim_y != 0:
-            value = numpy.array(numpy.split(value, indices_or_sections=self.dim_y))
-        elif self.dim_y + self.dim_x == 1:
-            value = [numpy.array(value)]
+            # 2D array
+            value = numpy.array(numpy.split(numpy.array(value), indices_or_sections=self.dim_y))
         else:
+            # 1D array
             value = numpy.array(value)
 
         return value
diff --git a/devices/clients/udp_receiver.py b/devices/clients/udp_receiver.py
index 13f68f509ede31ac69c6fa0ab9b9d023cbda349b..c8bc44eb1965b0fa769528b381dbaee5b2fcd5d0 100644
--- a/devices/clients/udp_receiver.py
+++ b/devices/clients/udp_receiver.py
@@ -40,6 +40,9 @@ class UDPReceiver(Thread):
         # This is stock socket usage.
         self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 
+        # Increase buffers to prevent data loss when our class isn't listening.
+        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16*1024*1024)
+
         # specify what host and port to listen on
         self.sock.bind((self.host, self.port))
 
diff --git a/devices/common/lofar_environment.py b/devices/common/lofar_environment.py
new file mode 100644
index 0000000000000000000000000000000000000000..7c191e12b42c4ceb3f400c0d57e305826057eee2
--- /dev/null
+++ b/devices/common/lofar_environment.py
@@ -0,0 +1,6 @@
+#
+#   Change manually the method to switch between modes
+#
+
+def isProduction():
+    return False
diff --git a/devices/devices/hardware_device.py b/devices/devices/hardware_device.py
index a4da09297a6696c4fb5a31e2359b63958cb4eb4d..c0e7df614d95e40f9816f9332f2832c8f3d4166c 100644
--- a/devices/devices/hardware_device.py
+++ b/devices/devices/hardware_device.py
@@ -14,18 +14,19 @@
 from abc import ABCMeta, abstractmethod
 
 # PyTango imports
-from tango.server import Device, command, DeviceMeta
-from tango import DevState, DebugIt
+from tango.server import Device, command, DeviceMeta, attribute
+from tango import DevState, DebugIt, Attribute, DeviceProxy
 # Additional import
 
 from clients.attribute_wrapper import attribute_wrapper
 from common.lofar_logging import log_exceptions
+import logging
+
 
 __all__ = ["hardware_device"]
 
 from devices.device_decorators import only_in_states, fault_on_error
 
-import logging
 logger = logging.getLogger()
 
 class AbstractDeviceMetas(DeviceMeta, ABCMeta):
@@ -160,7 +161,6 @@ class hardware_device(Device, metaclass=AbstractDeviceMetas):
         self.configure_for_fault()
         self.set_state(DevState.FAULT)
 
-
     # functions that can or must be overloaded
     def configure_for_fault(self):
         pass
@@ -191,3 +191,36 @@ class hardware_device(Device, metaclass=AbstractDeviceMetas):
 
         self.Off()
         self.debug_stream("Shut down.  Good bye.")
+
+    @command()
+    @only_in_states([DevState.STANDBY, DevState.ON])
+    @DebugIt()
+    @log_exceptions()
+    def set_defaults(self):
+        """ Set hardware points to their default value.
+
+            A hardware point XXX is set to the value of the object member named XXX_default, if it exists.
+            XXX_default can be f.e. a constant, or a device_property.
+        """
+
+        # we cannot write directly to our attribute, as that would not
+        # trigger a write_{name} call. See https://www.tango-controls.org/community/forum/c/development/c/accessing-own-deviceproxy-class/?page=1#post-2021
+
+        # obtain a proxy to myself, to write values
+        proxy = DeviceProxy(self.get_name())
+
+        # for all my members
+        for name in dir(self):
+            attr = getattr(self, name)
+            # check if it's an attribute, and there is a default value available
+            if isinstance(attr, Attribute) and hasattr(self, f"{name}_default"):
+                try:
+                    default_value = getattr(self, f"{name}_default")
+
+                    # set the attribute to the configured default
+                    self.debug_stream(f"Setting attribute {name} to {default_value}")
+                    proxy.write_attribute(name, default_value)
+                except Exception as e:
+                    # log which attribute we're addressing
+                    raise Exception(f"Cannot assign default to attribute {name}") from e
+
diff --git a/devices/devices/pcc.py b/devices/devices/pcc.py
index 0db21b41e7c609c934345e0b0dafdea9e9e08efb..73b105abc21f9cc8c7c15a564a67c9e0758e77cd 100644
--- a/devices/devices/pcc.py
+++ b/devices/devices/pcc.py
@@ -147,8 +147,7 @@ class PCC(hardware_device):
         self.function_mapping["CLK_off"] = {}
 
         # set up the OPC ua client
-        self.OPCua_client = OPCUAConnection("opc.tcp://{}:{}/".format(self.OPC_Server_Name, self.OPC_Server_Port), "http://lofar.eu",
-                                            self.OPC_Time_Out, self.Fault, self)
+        self.OPCua_client = OPCUAConnection("opc.tcp://{}:{}/".format(self.OPC_Server_Name, self.OPC_Server_Port), "http://lofar.eu", self.OPC_Time_Out, self.Fault, self)
 
         # map an access helper class
         for i in self.attr_list():
diff --git a/devices/devices/sdp/sdp.py b/devices/devices/sdp/sdp.py
index c78c1d042fae448adac4b9e24901a053f1683fe1..c1730ab621f0da57bc486240ec662c84f6cde1ed 100644
--- a/devices/devices/sdp/sdp.py
+++ b/devices/devices/sdp/sdp.py
@@ -69,6 +69,23 @@ class SDP(hardware_device):
         mandatory=True
     )
 
+    FPGA_processing_enable_RW_default = device_property(
+        dtype='DevVarBooleanArray',
+        mandatory=False,
+        default_value=[True] * 16
+    )
+
+    FPGA_wg_enable_RW_default = device_property(
+        dtype='DevVarBooleanArray',
+        mandatory=False,
+        default_value=[[False] * 12] * 16
+    )
+    
+    FPGA_sdp_info_station_id_RW_default = device_property(
+        dtype='DevVarULongArray',
+        mandatory=True
+    )
+
     # ----------
     # Attributes
     # ----------
@@ -78,8 +95,6 @@ class SDP(hardware_device):
     # SDP will switch from FPGA_mask_RW to TR_FPGA_mask_RW, offer both for now as its a critical flag
     FPGA_firmware_version_R = attribute_wrapper(comms_annotation=["2:FPGA_firmware_version_R"], datatype=numpy.str_, dims=(16,))
     FPGA_hardware_version_R = attribute_wrapper(comms_annotation=["2:FPGA_hardware_version_R"], datatype=numpy.str_, dims=(16,))
-    FPGA_mask_R = attribute_wrapper(comms_annotation=["2:FPGA_mask_R"], datatype=numpy.bool_, dims=(16,))
-    FPGA_mask_RW = attribute_wrapper(comms_annotation=["2:FPGA_mask_RW"], datatype=numpy.bool_, dims=(16,), access=AttrWriteType.READ_WRITE)
     FPGA_processing_enable_R = attribute_wrapper(comms_annotation=["2:FPGA_processing_enable_R"], datatype=numpy.bool_, dims=(16,))
     FPGA_processing_enable_RW = attribute_wrapper(comms_annotation=["2:FPGA_processing_enable_RW"], datatype=numpy.bool_, dims=(16,), access=AttrWriteType.READ_WRITE)
     FPGA_scrap_R = attribute_wrapper(comms_annotation=["2:FPGA_scrap_R"], datatype=numpy.int32, dims=(8192,))
@@ -94,24 +109,25 @@ class SDP(hardware_device):
     FPGA_sdp_info_observation_id_RW = attribute_wrapper(comms_annotation=["2:FPGA_sdp_info_observation_id_RW"], datatype=numpy.uint32, dims=(16,), access=AttrWriteType.READ_WRITE)
     FPGA_sdp_info_station_id_R = attribute_wrapper(comms_annotation=["2:FPGA_sdp_info_station_id_R"], datatype=numpy.uint32, dims=(16,))
     FPGA_sdp_info_station_id_RW = attribute_wrapper(comms_annotation=["2:FPGA_sdp_info_station_id_RW"], datatype=numpy.uint32, dims=(16,), access=AttrWriteType.READ_WRITE)
-    FPGA_status_R = attribute_wrapper(comms_annotation=["2:FPGA_status_R"], datatype=numpy.bool_, dims=(16,))
     FPGA_temp_R = attribute_wrapper(comms_annotation=["2:FPGA_temp_R"], datatype=numpy.float_, dims=(16,))
     FPGA_version_R = attribute_wrapper(comms_annotation=["2:FPGA_version_R"], datatype=numpy.str_, dims=(16,))
-    FPGA_weights_R = attribute_wrapper(comms_annotation=["2:FPGA_weights_R"], datatype=numpy.int16, dims=(16, 12 * 488 * 2))
-    FPGA_weights_RW = attribute_wrapper(comms_annotation=["2:FPGA_weights_RW"], datatype=numpy.int16, dims=(16, 12 * 488 * 2), access=AttrWriteType.READ_WRITE)
-    FPGA_wg_amplitude_R = attribute_wrapper(comms_annotation=["2:FPGA_wg_amplitude_R"], datatype=numpy.float_, dims=(16, 12))
-    FPGA_wg_amplitude_RW = attribute_wrapper(comms_annotation=["2:FPGA_wg_amplitude_RW"], datatype=numpy.float_, dims=(16, 12), access=AttrWriteType.READ_WRITE)
-    FPGA_wg_enable_R = attribute_wrapper(comms_annotation=["2:FPGA_wg_enable_R"], datatype=numpy.bool_, dims=(16, 12))
-    FPGA_wg_enable_RW = attribute_wrapper(comms_annotation=["2:FPGA_wg_enable_RW"], datatype=numpy.bool_, dims=(16, 12), access=AttrWriteType.READ_WRITE)
-    FPGA_wg_frequency_R = attribute_wrapper(comms_annotation=["2:FPGA_wg_frequency_R"], datatype=numpy.float_, dims=(16, 12))
-    FPGA_wg_frequency_RW = attribute_wrapper(comms_annotation=["2:FPGA_wg_frequency_RW"], datatype=numpy.float_, dims=(16, 12), access=AttrWriteType.READ_WRITE)
-    FPGA_wg_phase_R = attribute_wrapper(comms_annotation=["2:FPGA_wg_phase_R"], datatype=numpy.float_, dims=(16, 12))
-    FPGA_wg_phase_RW = attribute_wrapper(comms_annotation=["2:FPGA_wg_phase_R"], datatype=numpy.float_, dims=(16, 12), access=AttrWriteType.READ_WRITE)
-    TR_busy_R = attribute_wrapper(comms_annotation=["2:TR_busy_R"], datatype=numpy.bool_)
-    TR_reload_RW = attribute_wrapper(comms_annotation=["2:TR_reload_RW"], datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+    FPGA_weights_R = attribute_wrapper(comms_annotation=["2:FPGA_weights_R"], datatype=numpy.int16, dims=(12 * 488 * 2, 16))
+    FPGA_weights_RW = attribute_wrapper(comms_annotation=["2:FPGA_weights_RW"], datatype=numpy.int16, dims=(12 * 488 * 2, 16), access=AttrWriteType.READ_WRITE)
+    FPGA_wg_amplitude_R = attribute_wrapper(comms_annotation=["2:FPGA_wg_amplitude_R"], datatype=numpy.float_, dims=(12, 16))
+    FPGA_wg_amplitude_RW = attribute_wrapper(comms_annotation=["2:FPGA_wg_amplitude_RW"], datatype=numpy.float_, dims=(12, 16), access=AttrWriteType.READ_WRITE)
+    FPGA_wg_enable_R = attribute_wrapper(comms_annotation=["2:FPGA_wg_enable_R"], datatype=numpy.bool_, dims=(12, 16))
+    FPGA_wg_enable_RW = attribute_wrapper(comms_annotation=["2:FPGA_wg_enable_RW"], datatype=numpy.bool_, dims=(12, 16), access=AttrWriteType.READ_WRITE)
+    FPGA_wg_frequency_R = attribute_wrapper(comms_annotation=["2:FPGA_wg_frequency_R"], datatype=numpy.float_, dims=(12, 16))
+    FPGA_wg_frequency_RW = attribute_wrapper(comms_annotation=["2:FPGA_wg_frequency_RW"], datatype=numpy.float_, dims=(12, 16), access=AttrWriteType.READ_WRITE)
+    FPGA_wg_phase_R = attribute_wrapper(comms_annotation=["2:FPGA_wg_phase_R"], datatype=numpy.float_, dims=(12, 16))
+    FPGA_wg_phase_RW = attribute_wrapper(comms_annotation=["2:FPGA_wg_phase_RW"], datatype=numpy.float_, dims=(12, 16), access=AttrWriteType.READ_WRITE)
+    TR_fpga_mask_R = attribute_wrapper(comms_annotation=["2:TR_fpga_mask_R"], datatype=numpy.bool_, dims=(16,))
+    TR_fpga_mask_RW = attribute_wrapper(comms_annotation=["2:TR_fpga_mask_RW"], datatype=numpy.bool_, dims=(16,), access=AttrWriteType.READ_WRITE)
+    TR_fpga_communication_error_R = attribute_wrapper(comms_annotation=["2:TR_fpga_communication_error_R"], datatype=numpy.bool_, dims=(16,))
     TR_software_version_R = attribute_wrapper(comms_annotation=["2:TR_software_version_R"], datatype=numpy.str_)
+    TR_start_time_R = attribute_wrapper(comms_annotation=["2:TR_start_time_R"], datatype=numpy.int32)
     TR_tod_R = attribute_wrapper(comms_annotation=["2:TR_tod_R"], datatype=numpy.uint64)
-    TR_uptime_R = attribute_wrapper(comms_annotation=["2:TR_uptime_R"], datatype=numpy.uint64)
+    TR_tod_pps_delta_R = attribute_wrapper(comms_annotation=["2:TR_tod_pps_delta_R"], datatype=numpy.float_)
 
     def always_executed_hook(self):
         """Method always executed before any TANGO command is executed."""
diff --git a/devices/devices/sdp/sst.py b/devices/devices/sdp/sst.py
index 2dc32c64a6fae3688d4ce78970490dafe0c618fd..792162fd50adcefdb420fd621e853261d83da17b 100644
--- a/devices/devices/sdp/sst.py
+++ b/devices/devices/sdp/sst.py
@@ -26,7 +26,7 @@ from tango import AttrWriteType
 
 from clients.attribute_wrapper import attribute_wrapper
 from clients.opcua_client import OPCUAConnection
-from clients.StatisticsClient import StatisticsClient
+from clients.statistics_client import StatisticsClient
 
 from devices.hardware_device import hardware_device
 
@@ -48,6 +48,21 @@ class SST(Statistics):
     # Device Properties
     # -----------------
 
+    FPGA_sst_offload_hdr_eth_destination_mac_RW_default = device_property(
+        dtype='DevVarStringArray',
+        mandatory=True
+    )
+
+    FPGA_sst_offload_hdr_ip_destination_address_RW_default = device_property(
+        dtype='DevVarStringArray',
+        mandatory=True
+    )
+
+    FPGA_sst_offload_hdr_udp_destination_port_RW_default = device_property(
+        dtype='DevVarUShortArray',
+        mandatory=True
+    )
+
     # ----------
     # Attributes
     # ----------
diff --git a/devices/devices/sdp/statistics.py b/devices/devices/sdp/statistics.py
index 2a9ddb9ec91e8f3bd55ef2d2d2fed50e1b637c9f..5d10aae8b866acc0b30598856cb63b1ecc6d233a 100644
--- a/devices/devices/sdp/statistics.py
+++ b/devices/devices/sdp/statistics.py
@@ -120,7 +120,7 @@ class Statistics(hardware_device, metaclass=ABCMeta):
         """ user code here. is called when the sate is set to INIT """
         """Initialises the attributes and properties of the statistics device."""
 
-        self.statistics_client = StasticsClient(self.STATISTICS_COLLECTOR_CLASS, "0.0.0.0", self.Statistics_Client_Port, self.Fault, self)
+        self.statistics_client = StatisticsClient(self.STATISTICS_COLLECTOR_CLASS, "0.0.0.0", self.Statistics_Client_Port, self.Fault, self)
 
         self.OPCUA_client = OPCUAConnection("opc.tcp://{}:{}/".format(self.OPC_Server_Name, self.OPC_Server_Port), "http://lofar.eu", self.OPC_Time_Out, self.Fault, self)
 
diff --git a/devices/devices/sdp/statistics_collector.py b/devices/devices/sdp/statistics_collector.py
index f7d01d2cb0615f157b2b6cc161cb199495d94a45..f3aac3c1982b03b169eaddedce52b50c939ddc45 100644
--- a/devices/devices/sdp/statistics_collector.py
+++ b/devices/devices/sdp/statistics_collector.py
@@ -23,7 +23,13 @@ class StatisticsCollector(Thread):
         self.queue = queue
         self.last_packet = None
 
-        self.parameters = {
+        self.parameters = self._default_parameters()
+
+        super().__init__()
+        self.start()
+
+    def _default_parameters(self):
+        return {
             "nof_packets":           numpy.uint64(0),
 
             # Packet count for packets that could not be parsed
@@ -33,9 +39,6 @@ class StatisticsCollector(Thread):
             "last_invalid_packet":   numpy.zeros((9000,), dtype=numpy.uint8),
         }
 
-        super().__init__()
-        self.start()
-
     def run(self):
         logger.info("Starting statistics thread")
 
@@ -54,7 +57,7 @@ class StatisticsCollector(Thread):
             except Exception as e:
                 logger.exception("Could not parse statistics UDP packet")
 
-                self.parameters["last_invalid_packet"] = numpy.frombuffer(packet, dtype=numpy.uint8)
+                self.parameters["last_invalid_packet"] = numpy.frombuffer(self.last_packet, dtype=numpy.uint8)
                 self.parameters["nof_invalid_packets"] += numpy.uint64(1)
 
         logger.info("Stopped statistics thread")
@@ -92,10 +95,10 @@ class SSTCollector(StatisticsCollector):
     # Maximum number of subbands we support (used to determine array sizes)
     MAX_SUBBANDS = 512
 
-    def __init__(self, queue):
-        super().__init__(queue)
+    def _default_parameters(self):
+        defaults = super()._default_parameters()
 
-        self.parameters.extend({
+        defaults.update({
             # Number of packets received so far that we could parse correctly and do not have a payload error
             "nof_valid_payloads":    numpy.zeros((self.MAX_INPUTS,), dtype=numpy.uint64),
 
@@ -108,6 +111,8 @@ class SSTCollector(StatisticsCollector):
             "integration_intervals": numpy.zeros((self.MAX_INPUTS,), dtype=numpy.float32),
         })
 
+        return defaults
+
     def process_packet(self, packet):
         fields = SSTPacket(packet)
 
diff --git a/devices/examples/snmp/snmp_client.py b/devices/examples/snmp/snmp_client.py
index 2c162abef0f924c3d67d9d248253c2a9df533a3f..635450172387148734e5e3b42ed0f82f067a0048 100644
--- a/devices/examples/snmp/snmp_client.py
+++ b/devices/examples/snmp/snmp_client.py
@@ -1,3 +1,4 @@
+
 from clients.comms_client import CommClient
 
 import snmp
diff --git a/devices/integration_test/README.md b/devices/integration_test/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..3292bfa0049b5c2312f8e0536e00cc581433ed61
--- /dev/null
+++ b/devices/integration_test/README.md
@@ -0,0 +1,26 @@
+# Integration Tests
+
+## Approach
+
+A special docker container is build to perform the integration tests. This
+container will be build by the makefiles but should only be started by the
+dedicated integration test script. This script will ensure that other containers
+are running and are in the required state.
+
+* Launch pypcc-sim and sdptr-sim simulators.
+* Reconfigure dsconfig to use these simulators.
+* Create and start the integration-test container.
+
+## Running
+
+**Warning running these tests will make changes to your CDB database config!**
+
+```shell
+source bootstrap/etc/lofar20rc.sh
+$LOFAR20_DIR/sbin/run_integration_test.sh
+```
+
+## Limitations
+
+Our makefile will always launch the new container upon creation, resulting in
+the integration tests actually being run twice.
\ No newline at end of file
diff --git a/devices/util/__init__.py b/devices/integration_test/__init__.py
similarity index 100%
rename from devices/util/__init__.py
rename to devices/integration_test/__init__.py
diff --git a/devices/integration_test/base.py b/devices/integration_test/base.py
new file mode 100644
index 0000000000000000000000000000000000000000..92601ec2d440753ae7f7be22fcbfad0c5028875c
--- /dev/null
+++ b/devices/integration_test/base.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of the LOFAR 2.0 Station Software
+#
+#
+#
+# Distributed under the terms of the APACHE license.
+# See LICENSE.txt for more info.
+
+import unittest
+import testscenarios
+
+
+class BaseIntegrationTestCase(testscenarios.WithScenarios, unittest.TestCase):
+    """Integration test base class."""
+
+    def setUp(self):
+        super().setUp()
+
+
+class IntegrationTestCase(BaseIntegrationTestCase):
+    """Integration test case base class for all unit tests."""
+
+    def setUp(self):
+        super().setUp()
diff --git a/devices/integration_test/client/__init__.py b/devices/integration_test/client/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/devices/integration_test/client/test_apsct_sim.py b/devices/integration_test/client/test_apsct_sim.py
new file mode 100644
index 0000000000000000000000000000000000000000..775c34cd207699f7febb435000314c65db97b66a
--- /dev/null
+++ b/devices/integration_test/client/test_apsct_sim.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of the LOFAR 2.0 Station Software
+#
+#
+#
+# Distributed under the terms of the APACHE license.
+# See LICENSE.txt for more info.
+
+from opcua import Client
+
+from integration_test import base
+
+
+class TestAPSCTSim(base.IntegrationTestCase):
+
+    def setUp(self):
+        super(TestAPSCTSim, self).setUp()
+
+    def test_opcua_connection(self):
+        """Check if we can connect to apsct-sim"""
+
+        #TODO(Corne): Replace to APSCT name once simulator name has changed
+        client = Client("opc.tcp://pypcc-sim:4842")
+        root_node = None
+
+        try:
+            client.connect()
+            root_node = client.get_root_node()
+        finally:
+            client.disconnect()
+
+        self.assertNotEqual(None, root_node)
diff --git a/devices/integration_test/client/test_sdptr_sim.py b/devices/integration_test/client/test_sdptr_sim.py
new file mode 100644
index 0000000000000000000000000000000000000000..3ba48e7d761c7ef366c8690e2d114c773de7311d
--- /dev/null
+++ b/devices/integration_test/client/test_sdptr_sim.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of the LOFAR 2.0 Station Software
+#
+#
+#
+# Distributed under the terms of the APACHE license.
+# See LICENSE.txt for more info.
+
+from opcua import Client
+
+from integration_test import base
+
+
+class TestSDPTRSim(base.IntegrationTestCase):
+
+    def setUp(self):
+        super(TestSDPTRSim, self).setUp()
+
+    def test_opcua_connection(self):
+        """Check if we can connect to sdptr-sim"""
+
+        client = Client("opc.tcp://sdptr-sim:4840")
+        root_node = None
+
+        try:
+            client.connect()
+            root_node = client.get_root_node()
+        finally:
+            client.disconnect()
+
+        self.assertNotEqual(None, root_node)
diff --git a/devices/integration_test/devices/__init__.py b/devices/integration_test/devices/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/devices/integration_test/devices/test_device_pcc.py b/devices/integration_test/devices/test_device_pcc.py
new file mode 100644
index 0000000000000000000000000000000000000000..b3b7a4672dbb18790d19144aeb35bcacd68e4bfb
--- /dev/null
+++ b/devices/integration_test/devices/test_device_pcc.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of the LOFAR 2.0 Station Software
+#
+#
+#
+# Distributed under the terms of the APACHE license.
+# See LICENSE.txt for more info.
+
+import time
+
+from tango import DeviceProxy
+from tango._tango import DevState
+
+from integration_test import base
+
+
+class TestDevicePCC(base.IntegrationTestCase):
+
+    def setUp(self):
+        super(TestDevicePCC, self).setUp()
+
+    def tearDown(self):
+        """Turn device Off in teardown to prevent blocking tests"""
+        d = DeviceProxy("LTS/PCC/1")
+
+        try:
+            d.Off()
+        except Exception as e:
+            """Failing to turn Off devices should not raise errors here"""
+            print(f"Failed to turn device off in teardown {e}")
+
+    def test_device_proxy_pcc(self):
+        """Test if we can successfully create a DeviceProxy and fetch state"""
+
+        d = DeviceProxy("LTS/PCC/1")
+
+        self.assertEqual(DevState.OFF, d.state())
+
+    def test_device_pcc_initialize(self):
+        """Test if we can transition to standby"""
+
+        d = DeviceProxy("LTS/PCC/1")
+
+        d.initialise()
+
+        self.assertEqual(DevState.STANDBY, d.state())
+
+    def test_device_pcc_on(self):
+        """Test if we can transition to on"""
+
+        d = DeviceProxy("LTS/PCC/1")
+
+        d.initialise()
+
+        d.on()
+
+        self.assertEqual(DevState.ON, d.state())
diff --git a/devices/integration_test/devices/test_device_sdp.py b/devices/integration_test/devices/test_device_sdp.py
new file mode 100644
index 0000000000000000000000000000000000000000..cfd656748054cb21e0e3bb2110ce60072d9fb28a
--- /dev/null
+++ b/devices/integration_test/devices/test_device_sdp.py
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+#
+# This file is part of the LOFAR 2.0 Station Software
+#
+#
+#
+# Distributed under the terms of the APACHE license.
+# See LICENSE.txt for more info.
+
+import time
+
+from tango import DeviceProxy
+from tango._tango import DevState
+
+from integration_test import base
+
+
+class TestDeviceSDP(base.IntegrationTestCase):
+
+    def setUp(self):
+        """Intentionally recreate the device object in each test"""
+        super(TestDeviceSDP, self).setUp()
+
+    def tearDown(self):
+        """Turn device Off in teardown to prevent blocking tests"""
+        d = DeviceProxy("LTS/SDP/1")
+
+        try:
+            d.Off()
+        except Exception as e:
+            """Failing to turn Off devices should not raise errors here"""
+            print(f"Failed to turn device off in teardown {e}")
+
+    def test_device_proxy_sdp(self):
+        """Test if we can successfully create a DeviceProxy and fetch state"""
+
+        d = DeviceProxy("LTS/SDP/1")
+
+        self.assertEqual(DevState.OFF, d.state())
+
+    def test_device_sdp_initialize(self):
+        """Test if we can transition to standby"""
+
+        d = DeviceProxy("LTS/SDP/1")
+
+        d.initialise()
+
+        self.assertEqual(DevState.STANDBY, d.state())
+
+    def test_device_sdp_on(self):
+        """Test if we can transition to on"""
+
+        d = DeviceProxy("LTS/SDP/1")
+
+        d.initialise()
+
+        d.on()
+
+        self.assertEqual(DevState.ON, d.state())
diff --git a/devices/test/clients/test_attr_wrapper.py b/devices/test/clients/test_attr_wrapper.py
new file mode 100644
index 0000000000000000000000000000000000000000..a293923acbf21774e9f221b650353f3410104a88
--- /dev/null
+++ b/devices/test/clients/test_attr_wrapper.py
@@ -0,0 +1,599 @@
+# -*- coding: utf-8 -*-
+
+# Distributed under the terms of the APACHE license.
+# See LICENSE.txt for more info.
+
+""" test Device Server
+"""
+
+# External imports
+from tango import DevState
+
+# Internal imports
+from test.clients.test_client import test_client
+from clients.attribute_wrapper import *
+from devices.hardware_device import *
+
+# Test imports
+from tango.test_context import DeviceTestContext
+from test import base
+
+scalar_dims = (1,)
+spectrum_dims = (4,)
+image_dims = (3,2)
+
+str_scalar_val = '1'
+str_spectrum_val = ['1','1', '1','1']
+str_image_val = [['1','1'],['1','1'],['1','1']]
+
+
+def dev_init(device):
+    device.set_state(DevState.INIT)
+    device.test_client = test_client(device.Fault, device)
+    for i in device.attr_list():
+        i.set_comm_client(device.test_client)
+    device.test_client.start()
+
+
+class TestAttributeTypes(base.TestCase):
+
+    class str_scalar_device(hardware_device):
+        scalar_R = attribute_wrapper(comms_annotation="str_scalar_R", datatype=str)
+        scalar_RW = attribute_wrapper(comms_annotation="str_scalar_RW", datatype=str, access=AttrWriteType.READ_WRITE)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class bool_scalar_device(hardware_device):
+        scalar_R = attribute_wrapper(comms_annotation="bool_scalar_R", datatype=numpy.bool_)
+        scalar_RW = attribute_wrapper(comms_annotation="bool_scalar_RW", datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class float32_scalar_device(hardware_device):
+        scalar_R = attribute_wrapper(comms_annotation="float32_scalar_R", datatype=numpy.float32)
+        scalar_RW = attribute_wrapper(comms_annotation="float32_scalar_RW", datatype=numpy.float32, access=AttrWriteType.READ_WRITE)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class float64_scalar_device(hardware_device):
+        scalar_R = attribute_wrapper(comms_annotation="float64_scalar_R", datatype=numpy.float64)
+        scalar_RW = attribute_wrapper(comms_annotation="float64_scalar_RW", datatype=numpy.float64, access=AttrWriteType.READ_WRITE)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class double_scalar_device(hardware_device):
+        scalar_R = attribute_wrapper(comms_annotation="double_scalar_R", datatype=numpy.double)
+        scalar_RW = attribute_wrapper(comms_annotation="double_scalar_RW", datatype=numpy.double, access=AttrWriteType.READ_WRITE)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class uint8_scalar_device(hardware_device):
+        scalar_R = attribute_wrapper(comms_annotation="uint8_scalar_R", datatype=numpy.uint8)
+        scalar_RW = attribute_wrapper(comms_annotation="uint8_scalar_RW", datatype=numpy.uint8, access=AttrWriteType.READ_WRITE)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class uint16_scalar_device(hardware_device):
+        scalar_R = attribute_wrapper(comms_annotation="uint16_scalar_R", datatype=numpy.uint16)
+        scalar_RW = attribute_wrapper(comms_annotation="uint16_scalar_RW", datatype=numpy.uint16, access=AttrWriteType.READ_WRITE)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class uint32_scalar_device(hardware_device):
+        scalar_R = attribute_wrapper(comms_annotation="uint32_scalar_R", datatype=numpy.uint32)
+        scalar_RW = attribute_wrapper(comms_annotation="uint32_scalar_RW", datatype=numpy.uint32, access=AttrWriteType.READ_WRITE)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class uint64_scalar_device(hardware_device):
+        scalar_R = attribute_wrapper(comms_annotation="uint64_scalar_R", datatype=numpy.uint64)
+        scalar_RW = attribute_wrapper(comms_annotation="uint64_scalar_RW", datatype=numpy.uint64, access=AttrWriteType.READ_WRITE)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class int16_scalar_device(hardware_device):
+        scalar_R = attribute_wrapper(comms_annotation="int16_scalar_R", datatype=numpy.int16)
+        scalar_RW = attribute_wrapper(comms_annotation="int16_scalar_RW", datatype=numpy.int16, access=AttrWriteType.READ_WRITE)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class int32_scalar_device(hardware_device):
+        scalar_R = attribute_wrapper(comms_annotation="int32_scalar_R", datatype=numpy.int32)
+        scalar_RW = attribute_wrapper(comms_annotation="int32_scalar_RW", datatype=numpy.int32, access=AttrWriteType.READ_WRITE)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class int64_scalar_device(hardware_device):
+        scalar_R = attribute_wrapper(comms_annotation="int64_scalar_R", datatype=numpy.int64)
+        scalar_RW = attribute_wrapper(comms_annotation="int64_scalar_RW", datatype=numpy.int64, access=AttrWriteType.READ_WRITE)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class str_spectrum_device(hardware_device):
+        spectrum_R = attribute_wrapper(comms_annotation="str_spectrum_R", datatype=str, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="str_spectrum_RW", datatype=str, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class bool_spectrum_device(hardware_device):
+        spectrum_R = attribute_wrapper(comms_annotation="bool_spectrum_R", datatype=numpy.bool_, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="bool_spectrum_RW", datatype=numpy.bool_, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class float32_spectrum_device(hardware_device):
+        spectrum_R = attribute_wrapper(comms_annotation="float32_spectrum_R", datatype=numpy.float32, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="float32_spectrum_RW", datatype=numpy.float32, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class float64_spectrum_device(hardware_device):
+        spectrum_R = attribute_wrapper(comms_annotation="float64_spectrum_R", datatype=numpy.float64, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="float64_spectrum_RW", datatype=numpy.float64, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class double_spectrum_device(hardware_device):
+        spectrum_R = attribute_wrapper(comms_annotation="double_spectrum_R", datatype=numpy.double, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="double_spectrum_RW", datatype=numpy.double, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class uint8_spectrum_device(hardware_device):
+        spectrum_R = attribute_wrapper(comms_annotation="uint8_spectrum_R", datatype=numpy.uint8, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="uint8_spectrum_RW", datatype=numpy.uint8, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class uint16_spectrum_device(hardware_device):
+        spectrum_R = attribute_wrapper(comms_annotation="uint16_spectrum_R", datatype=numpy.uint16, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="uint16_spectrum_RW", datatype=numpy.uint16, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class uint32_spectrum_device(hardware_device):
+        spectrum_R = attribute_wrapper(comms_annotation="uint32_spectrum_R", datatype=numpy.uint32, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="uint32_spectrum_RW", datatype=numpy.uint32, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class uint64_spectrum_device(hardware_device):
+        spectrum_R = attribute_wrapper(comms_annotation="uint64_spectrum_R", datatype=numpy.uint64, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="uint64_spectrum_RW", datatype=numpy.uint64, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class int16_spectrum_device(hardware_device):
+        spectrum_R = attribute_wrapper(comms_annotation="int16_spectrum_R", datatype=numpy.int16, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="int16_spectrum_RW", datatype=numpy.int16, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class int32_spectrum_device(hardware_device):
+        spectrum_R = attribute_wrapper(comms_annotation="int32_spectrum_R", datatype=numpy.int32, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="int32_spectrum_RW", datatype=numpy.int32, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class int64_spectrum_device(hardware_device):
+        spectrum_R = attribute_wrapper(comms_annotation="int64_spectrum_R", datatype=numpy.int64, dims=spectrum_dims)
+        spectrum_RW = attribute_wrapper(comms_annotation="int64_spectrum_RW", datatype=numpy.int64, access=AttrWriteType.READ_WRITE, dims=spectrum_dims)
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class str_image_device(hardware_device):
+        image_R = attribute_wrapper(comms_annotation="str_image_R", datatype=str, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="str_image_RW", datatype=str, access=AttrWriteType.READ_WRITE, dims=(2,3))
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class bool_image_device(hardware_device):
+        image_R = attribute_wrapper(comms_annotation="bool_image_R", datatype=numpy.bool_, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="bool_image_RW", datatype=numpy.bool_, access=AttrWriteType.READ_WRITE, dims=(2,3))
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class float32_image_device(hardware_device):
+        image_R = attribute_wrapper(comms_annotation="float32_image_R", datatype=numpy.float32, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="float32_image_RW", datatype=numpy.float32, access=AttrWriteType.READ_WRITE, dims=(2,3))
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class float64_image_device(hardware_device):
+        image_R = attribute_wrapper(comms_annotation="float64_image_R", datatype=numpy.float64, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="float64_image_RW", datatype=numpy.float64, access=AttrWriteType.READ_WRITE, dims=(2,3))
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class double_image_device(hardware_device):
+        image_R = attribute_wrapper(comms_annotation="double_image_R", datatype=numpy.double, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="double_image_RW", datatype=numpy.double, access=AttrWriteType.READ_WRITE, dims=(2,3))
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class uint8_image_device(hardware_device):
+        image_R = attribute_wrapper(comms_annotation="uint8_image_R", datatype=numpy.uint8, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="uint8_image_RW", datatype=numpy.uint8, access=AttrWriteType.READ_WRITE, dims=(2,3))
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class uint16_image_device(hardware_device):
+        image_R = attribute_wrapper(comms_annotation="uint16_image_R", datatype=numpy.uint16, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="uint16_image_RW", datatype=numpy.uint16, access=AttrWriteType.READ_WRITE, dims=(2,3))
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class uint32_image_device(hardware_device):
+        image_R = attribute_wrapper(comms_annotation="uint32_image_R", datatype=numpy.uint32, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="uint32_image_RW", datatype=numpy.uint32, access=AttrWriteType.READ_WRITE, dims=(2,3))
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class uint64_image_device(hardware_device):
+        image_R = attribute_wrapper(comms_annotation="uint64_image_R", datatype=numpy.uint64, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="uint64_image_RW", datatype=numpy.uint64, access=AttrWriteType.READ_WRITE, dims=(2,3))
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class int16_image_device(hardware_device):
+        image_R = attribute_wrapper(comms_annotation="int16_image_R", datatype=numpy.int16, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="int16_image_RW", datatype=numpy.int16, access=AttrWriteType.READ_WRITE, dims=(2,3))
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class int32_image_device(hardware_device):
+        image_R = attribute_wrapper(comms_annotation="int32_image_R", datatype=numpy.int32, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="int32_image_RW", datatype=numpy.int32, access=AttrWriteType.READ_WRITE, dims=(2,3))
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    class int64_image_device(hardware_device):
+        image_R = attribute_wrapper(comms_annotation="int64_image_R", datatype=numpy.int64, dims=(2,3))
+        image_RW = attribute_wrapper(comms_annotation="int64_image_RW", datatype=numpy.int64, access=AttrWriteType.READ_WRITE, dims=(2,3))
+
+        def configure_for_initialise(self):
+            dev_init(self)
+
+    def read_R_test(self, dev, dtype, test_type):
+        '''Test device'''
+        with DeviceTestContext(dev, process=True) as proxy:
+
+            #initialise
+            proxy.initialise()
+            proxy.on()
+
+            if test_type == "scalar":
+                expected = numpy.zeros((1,), dtype=dtype)
+                val = proxy.scalar_RW
+            elif test_type == "spectrum":
+                expected = numpy.zeros(spectrum_dims, dtype=dtype)
+                val = proxy.spectrum_R
+            elif test_type == "image":
+                expected = numpy.zeros(image_dims, dtype=dtype)
+                val = numpy.array(proxy.image_R) #is needed for STR since they act differently
+
+                # cant use all() for 2d arrays so instead compare the dimensions and then flatten to 2d
+                self.assertEqual(val.shape, expected.shape, " image R array dimensions got mangled. Expected {}, got  {}".format(expected.shape, val.shape))
+                val.reshape(-1)
+            else:
+                self.assertEqual(1,2, " {} is not a valid test_type. please use either scalar, spectrum or image".format(test_type))
+
+            if test_type == "scalar":
+                comparison = expected == val
+                self.assertTrue(comparison, " Value could not be read or was not what was expected. Expected: {}, got {}".format(expected, val))
+            else:
+                comparison = expected == val
+                equal_arrays = comparison.all()
+                self.assertTrue(equal_arrays, " Value could not be read or was not what was expected. Expected: {}, got {}".format(expected, val))
+
+            print(" Test passed! Managed to read R attribute value. got: {}".format(val))
+
+    def write_RW_test(self, dev, dtype, test_type):
+        '''Test device'''
+        with DeviceTestContext(dev, process=True) as proxy:
+
+            #initialise
+            proxy.initialise()
+            proxy.on()
+
+            if test_type == "scalar":
+
+                if dtype is str or dtype is numpy.str_:
+                    val = str_scalar_val
+                else:
+                    val = dtype(1)
+                proxy.scalar_RW = val
+            elif test_type == "spectrum":
+                if dtype is str or dtype is numpy.str_:
+                    val = str_spectrum_val
+                else:
+                    val = numpy.full(spectrum_dims, dtype=dtype, fill_value=1)
+                print(val)
+                proxy.spectrum_RW = val
+            elif test_type == "image":
+                if dtype is str or dtype is numpy.str_:
+                    val = str_image_val
+                else:
+                    val = numpy.full(image_dims, dtype=dtype, fill_value=1)
+                proxy.image_RW = val
+            else:
+                self.assertEqual(1,2, " {} is not a valid test_type. please use either scalar, spectrum or image".format(test_type))
+
+            # can't really test anything here except that the writing didnt cause an error.
+            # reading back happens in readback_test
+
+            print(" Test passed! Managed to write: ".format(val))
+
+    def read_RW_test(self, dev, dtype, test_type):
+        '''Test device'''
+        try:
+            with DeviceTestContext(dev, process=True) as proxy:
+
+                #initialise
+                proxy.initialise()
+                proxy.on()
+
+                if test_type == "scalar":
+                    expected = numpy.zeros((1,), dtype=dtype)
+                    val = proxy.scalar_RW
+                elif test_type == "spectrum":
+                    expected = numpy.zeros(spectrum_dims, dtype=dtype)
+                    val = proxy.spectrum_RW
+                elif test_type == "image":
+                    expected = numpy.zeros(image_dims, dtype=dtype)
+                    val = numpy.array(proxy.image_RW) #is needed for STR since they act differently
+
+                    # cant use all() for 2d arrays so instead compare the dimensions and then flatten to 2d
+                    self.assertEqual(val.shape, expected.shape, " image R array dimensions got mangled. Expected {}, got  {}".format(expected.shape, val.shape))
+                    val.reshape(-1)
+                else:
+                    self.assertEqual(1,2, " {} is not a valid test_type. please use either scalar, spectrum or image".format(test_type))
+
+                if test_type != "scalar":
+                    # spectrums and the now flattened images can be compared with .all()
+                    comparison = expected == val
+                    equal_arrays = comparison.all()
+                    self.assertTrue(equal_arrays, " Value could not be handled by the atrribute_wrappers internal RW storer")
+                else:
+                    comparison = expected == val
+                    self.assertTrue(comparison, " Value could not be handled by the atrribute_wrappers internal RW storer")
+
+                print(" Test passed! Managed to read internal RW value. got: {}".format(val))
+        except Exception as e:
+            info = "Test failure in {} {} read RW test. Expected: {}, got {}".format(test_type, dtype, expected, val)
+            raise Exception(info) from e
+
+    def readback_test(self, dev, dtype, test_type):
+        '''Test device'''
+        try:
+            with DeviceTestContext(dev, process=True) as proxy:
+
+                #initialise
+                proxy.initialise()
+                proxy.on()
+
+                if test_type == "scalar":
+                    if dtype is str or dtype is numpy.str_:
+                        val = str_scalar_val
+                    else:
+                        val = dtype(1)
+                    proxy.scalar_RW = val
+                    result_R = proxy.scalar_R
+                    result_RW = proxy.scalar_RW
+                elif test_type == "spectrum":
+                    if dtype is str or dtype is numpy.str_:
+                        val = str_spectrum_val
+                    else:
+                        val = numpy.full(spectrum_dims, dtype=dtype, fill_value=1)
+                    proxy.spectrum_RW = val
+                    result_R = proxy.spectrum_R
+                    result_RW = proxy.spectrum_RW
+                elif test_type == "image":
+                    if dtype is str or dtype is numpy.str_:
+                        val = str_image_val
+                    else:
+                        val = numpy.full(image_dims, dtype=dtype, fill_value=1)
+
+                    # info += " write value: {}".format(val)
+                    proxy.image_RW = val
+                    result_R = proxy.image_R
+                    result_RW = proxy.image_RW
+
+                    if dtype != str:
+                        self.assertEqual(result_R.shape, image_dims, "not the correct dimensions")
+
+                        result_R = result_R.reshape(-1)
+                        result_RW = result_RW.reshape(-1)
+                        val = val.reshape(-1)
+
+                else:
+                    # if the test isn't scalar/spectrum or image its wrong
+                    self.assertEqual(1,2, " {} is not a valid test_type. please use either scalar, spectrum or image".format(test_type))
+
+                if test_type == "scalar":
+                    comparison = result_RW == val
+                    self.assertTrue(comparison, " Value could not be handled by the atrribute_wrappers internal RW storer. attempted to write: {}".format(val))
+                    comparison = result_R == val
+                    self.assertTrue(comparison, " value in the clients R attribute not equal to what was written. read: {}, wrote {}".format(result_R, val))
+                elif dtype != str:
+                    comparison = result_RW == val
+                    equal_arrays = comparison.all()
+                    self.assertTrue(equal_arrays, " Value could not be handled by the atrribute_wrappers internal RW storer. attempted to write: {}".format(val))
+                    comparison = result_R == val
+                    equal_arrays = comparison.all()
+                    self.assertTrue(equal_arrays, " value in the clients R attribute not equal to what was written. read: {}, wrote {}".format(result_R, val))
+                else:
+                    if test_type == "image":
+                        self.assertEqual(len(result_RW)*len(result_RW[0]), 6, "array dimensions do not match the expected dimensions. expected {}, got: {}".format(val, len(result_RW) * len(result_RW[0])))
+                        self.assertEqual(len(result_RW) * len(result_RW[0]), 6,"array dimensions do not match the expected dimensions. expected {}, got: {}".format(val, len(result_R) * len([0])))
+                    else:
+                        self.assertEqual(len(result_RW), 4,"array dimensions do not match the expected dimensions. expected {}, got: {}".format(4, len(result_RW)))
+                        self.assertEqual(len(result_R), 4, "array dimensions do not match the expected dimensions. expected {}, got: {}".format(4, len(result_R)))
+
+                print(" Test passed! Managed write and read back a value: {}".format(val))
+
+        except Exception as e:
+            info = "Test failure in {} {} readback test  \n\tW: {} \n\tRW: {} \n\tR: {}".format(test_type, dtype, val, result_RW, result_R)
+            raise Exception(info) from e
+
+
+    """
+    List of different types to be used with attributes testing, using any other
+    might have unexpected results. Each type is bound to a device scalar,
+    spectrum and image class
+    """
+    attribute_type_tests = [
+        {
+            'type': str, 'scalar': str_scalar_device,
+            'spectrum': str_spectrum_device, "image": str_image_device
+        },
+        {
+            'type': numpy.bool_, 'scalar': bool_scalar_device,
+            'spectrum': bool_spectrum_device, "image":  bool_image_device
+        },
+        {
+            'type': numpy.float32, 'scalar': float32_scalar_device,
+            'spectrum': float32_spectrum_device, "image": float32_image_device
+        },
+        {
+            'type': numpy.float64, 'scalar': float64_scalar_device,
+            'spectrum': float64_spectrum_device, "image": float64_image_device
+        },
+        {
+            'type': numpy.double, 'scalar': double_scalar_device,
+            'spectrum': double_spectrum_device, "image": double_image_device
+        },
+        {
+            'type': numpy.uint8, 'scalar': uint8_scalar_device,
+            'spectrum': uint8_spectrum_device, "image": uint8_image_device
+        },
+        {
+            'type': numpy.uint16, 'scalar': uint16_scalar_device,
+            'spectrum': uint16_spectrum_device, "image": uint16_image_device
+        },
+        {
+            'type': numpy.uint32, 'scalar': uint32_scalar_device,
+            'spectrum': uint32_spectrum_device, "image": uint32_image_device
+        },
+        {
+            'type': numpy.uint64, 'scalar': uint64_scalar_device,
+            'spectrum': uint64_spectrum_device, "image": uint64_image_device
+        },
+        {
+            'type': numpy.int16, 'scalar': int16_scalar_device,
+            'spectrum': int16_spectrum_device, "image": int16_image_device
+        },
+        {
+            'type': numpy.int32, 'scalar': int32_scalar_device,
+            'spectrum': int32_spectrum_device, "image": int32_image_device
+        },
+        {
+            'type': numpy.int64, 'scalar': int64_scalar_device,
+            'spectrum': int64_spectrum_device, "image": int64_image_device
+        }
+    ]
+
+    def test_scalar_R(self):
+        for attribute_type_test in self.attribute_type_tests:
+            self.read_R_test(
+                attribute_type_test['scalar'], attribute_type_test['type'],
+                'scalar')
+
+    def test_scalar_RW(self):
+        for attribute_type_test in self.attribute_type_tests:
+            self.read_RW_test(
+                attribute_type_test['scalar'], attribute_type_test['type'],
+                'scalar')
+
+    def test_scalar_W(self):
+        for attribute_type_test in self.attribute_type_tests:
+            self.write_RW_test(
+                attribute_type_test['scalar'], attribute_type_test['type'],
+                'scalar')
+
+    def test_scalar_readback(self):
+        for attribute_type_test in self.attribute_type_tests:
+            self.readback_test(
+                attribute_type_test['scalar'], attribute_type_test['type'],
+                'scalar')
+
+    def test_spectrum_R(self):
+        for attribute_type_test in self.attribute_type_tests:
+            self.read_R_test(
+                attribute_type_test['spectrum'], attribute_type_test['type'],
+                'spectrum')
+
+    def test_spectrum_RW(self):
+        for attribute_type_test in self.attribute_type_tests:
+            self.read_RW_test(
+                attribute_type_test['spectrum'], attribute_type_test['type'],
+                'spectrum')
+
+    def test_spectrum_W(self):
+        for attribute_type_test in self.attribute_type_tests:
+            self.write_RW_test(
+                attribute_type_test['spectrum'], attribute_type_test['type'],
+                'spectrum')
+
+    def test_spectrum_readback(self):
+        for attribute_type_test in self.attribute_type_tests:
+            self.readback_test(
+                attribute_type_test['spectrum'], attribute_type_test['type'],
+                'spectrum')
+
+    def test_image_R(self):
+        for attribute_type_test in self.attribute_type_tests:
+            self.read_R_test(
+                attribute_type_test['image'], attribute_type_test['type'],
+                'image')
+
+    def test_image_RW(self):
+        for attribute_type_test in self.attribute_type_tests:
+            self.read_RW_test(
+                attribute_type_test['image'], attribute_type_test['type'],
+                'image')
+
+    def test_image_W(self):
+        for attribute_type_test in self.attribute_type_tests:
+            self.write_RW_test(attribute_type_test['image'], attribute_type_test['type'], 'image')
+
+    def test_image_readback(self):
+        for attribute_type_test in self.attribute_type_tests:
+            self.readback_test(
+                attribute_type_test['image'], attribute_type_test['type'],
+                'image')
diff --git a/devices/test/clients/test_client.py b/devices/test/clients/test_client.py
index c8e564ca71434f6445bc496a982a398fdc50fba7..eab2ffae2d116fa8ec806beb48e5061a7118279a 100644
--- a/devices/test/clients/test_client.py
+++ b/devices/test/clients/test_client.py
@@ -1,9 +1,10 @@
-from clients.comms_client import CommClient
+# External imports
 import numpy
 
-import os
 
-# <class 'numpy.bool_'>
+# Test imports
+from clients.comms_client import CommClient
+
 
 class test_client(CommClient):
     """
@@ -71,15 +72,16 @@ class test_client(CommClient):
         takes all gathered data to configure and return the correct read and write functions
         """
 
-        value = numpy.zeros(dims, dtype)
+        self.value = numpy.zeros(dims, dtype)
 
         def read_function():
             self.streams.debug_stream("from read_function, reading {} array of type {}".format(dims, dtype))
-            return value
+            return self.value
 
         def write_function(write_value):
             self.streams.debug_stream("from write_function, writing {} array of type {}".format(dims, dtype))
-            value = write_value
+            self.value = write_value
+            return
 
         self.streams.debug_stream("created and bound example_client read/write functions to attribute_wrapper object")
         return read_function, write_function
diff --git a/devices/test/devices/random_data.py b/devices/test/devices/random_data.py
index 02c11e532d7a2ad69e4ffce1e51188e42c6cf3f7..43e1a037624a516f88d05d644fd86e23fab6baa8 100644
--- a/devices/test/devices/random_data.py
+++ b/devices/test/devices/random_data.py
@@ -25,8 +25,14 @@ class Random_Data(Device):
     """
     Random data monitor point device
     """
+
+    dim_array = 1024 # x-axis dimension of a random values array
+
     def read(self):
         return random.random()
+    
+    def read_array(self):
+        return random.rand(self.dim_array).astype(double)
 
     # Attributes
     rnd1 = attribute(
@@ -388,6 +394,26 @@ class Random_Data(Device):
         min_warning = 0.98,
         fget = read,
     )
+
+    rnd21 = attribute(
+        dtype = ('DevDouble',),
+        max_dim_x =  dim_array,
+        max_dim_y = 1,
+        polling_period = 1000,
+        period = 1000,
+        rel_change = 0.1,
+        abs_change = 0.1,
+        archive_period = 1000,
+        archive_rel_change = 0.1,
+        archive_abs_change = 0.1,
+        max_value = 1.0,
+        min_value = 0.0,
+        max_alarm = 1.0,
+        min_alarm = 0.99,
+        max_warning = 0.99,
+        min_warning = 0.98,
+        fget = read_array,
+    )
     
     # General methods
     def init_device(self):
@@ -457,6 +483,9 @@ class Random_Data(Device):
         self.rnd20.set_data_ready_event(True)
         self.set_change_event("rnd20", True, True)
         self.set_archive_event("rnd20", True, True)
+        self.rnd21.set_data_ready_event(True)
+        self.set_change_event("rnd21", True, True)
+        self.set_archive_event("rnd21", True, True)
         self.set_state(DevState.ON)
 
     def delete_device(self):
diff --git a/devices/test/devices/test_device.py b/devices/test/devices/test_device.py
deleted file mode 100644
index f9a72ec88d006450403b6cfc6a0396b842bb36a1..0000000000000000000000000000000000000000
--- a/devices/test/devices/test_device.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# This file is part of the PCC project
-#
-#
-#
-# Distributed under the terms of the APACHE license.
-# See LICENSE.txt for more info.
-
-""" test Device Server
-"""
-
-# TODO(Corne): Remove sys.path.append hack once packaging is in place!
-import os, sys
-currentdir = os.path.dirname(os.path.realpath(__file__))
-parentdir = os.path.dirname(currentdir)
-parentdir = os.path.dirname(parentdir)
-sys.path.append(parentdir)
-
-# PyTango imports
-from tango.server import run
-from tango.server import device_property
-from tango import DevState
-# Additional import
-
-from test.clients.test_client import test_client
-from clients.attribute_wrapper import *
-from devices.hardware_device import *
-
-__all__ = ["test_device", "main"]
-
-
-class test_device(hardware_device):
-    # -----------------
-    # Device Properties
-    # -----------------
-
-    OPC_Server_Name = device_property(
-        dtype='DevString',
-    )
-
-    OPC_Server_Port = device_property(
-        dtype='DevULong',
-    )
-
-    OPC_Time_Out = device_property(
-        dtype='DevDouble',
-    )
-
-    # ----------
-    # Attributes
-    # ----------
-    bool_scalar_R = attribute_wrapper(comms_annotation="numpy.bool_ type read scalar", datatype=numpy.bool_)
-    bool_scalar_RW = attribute_wrapper(comms_annotation="numpy.bool_ type read/write scalar", datatype=numpy.bool_, access=AttrWriteType.READ_WRITE)
-
-    int32_spectrum_R = attribute_wrapper(comms_annotation="numpy.int32 type read spectrum (len = 8)", datatype=numpy.int32, dims=(8,))
-    int32_spectrum_RW = attribute_wrapper(comms_annotation="numpy.int32 type read spectrum (len = 8)", datatype=numpy.int32, dims=(8,),
-                                          access=AttrWriteType.READ_WRITE)
-
-    double_image_R = attribute_wrapper(comms_annotation="numpy.double type read image (dims = 2x8)", datatype=numpy.double, dims=(2, 8))
-    double_image_RW = attribute_wrapper(comms_annotation="numpy.double type read/write image (dims = 8x2)", datatype=numpy.double, dims=(8, 2),
-                                        access=AttrWriteType.READ_WRITE)
-
-    int32_scalar_R = attribute_wrapper(comms_annotation="numpy.int32 type read scalar", datatype=numpy.int32)
-    uint16_spectrum_RW = attribute_wrapper(comms_annotation="numpy.uint16 type read/write spectrum (len = 8)", datatype=numpy.uint16, dims=(8,),
-                                           access=AttrWriteType.READ_WRITE)
-    float32_image_R = attribute_wrapper(comms_annotation="numpy.float32 type read image (dims = 8x2)", datatype=numpy.float32, dims=(8, 2))
-    uint8_image_RW = attribute_wrapper(comms_annotation="numpy.uint8 type read/write image (dims = 2x8)", datatype=numpy.uint8, dims=(2, 8),
-                                       access=AttrWriteType.READ_WRITE)
-
-    # --------
-    # overloaded functions
-    # --------
-    def configure_for_initialise(self):
-        """ user code here. is called when the sate is set to INIT """
-        """Initialises the attributes and properties of the PCC."""
-
-        self.set_state(DevState.INIT)
-
-        # set up the test client
-        self.test_client = test_client(self.Fault, self)
-
-        # map an access helper class
-        for i in self.attr_list():
-            i.set_comm_client(self.test_client)
-
-        self.test_client.start()
-
-
-# ----------
-# Run server
-# ----------
-def main(args=None, **kwargs):
-    """Main function of the example module."""
-    return run((test_device,), args=args, **kwargs)
-
-
-if __name__ == '__main__':
-    main()
diff --git a/devices/toolkit/startup.py b/devices/toolkit/startup.py
index 0f4bcbe702b1bd1edb873234763d56455b6009b4..e1cc092b01b3714d80f0b8ca827856bde451c78b 100644
--- a/devices/toolkit/startup.py
+++ b/devices/toolkit/startup.py
@@ -1,36 +1,49 @@
 #! /usr/bin/env python3
+import tango
+import logging
 
+logger = logging.getLogger()
 
-def startup(device: str, force_restart: bool):
+def startup(device: str, force_restart: bool) -> tango.DeviceProxy:
     '''
     Start a LOFAR Tango device:
     pcc = startup(device = 'LTS/PCC/1', force_restart = False)
     '''
-    import tango
     proxy = tango.DeviceProxy(device)
     state = proxy.state()
 
+    # go to OFF, but only if force_restart is True
     if force_restart is True:
-        print("Forcing device {} restart.".format(device))
+        logger.warning(f"Forcing device {device} restart.")
         proxy.off()
         state = proxy.state()
         if state is not tango._tango.DevState.OFF:
-            print("Device {} cannot perform off although restart has been enforced, state = {}.  Please investigate.".format(device, state))
+            logger.error(f"Device {device} cannot perform off although restart has been enforced, state = {state}.  Please investigate.")
             return proxy
+
     if state is not tango._tango.DevState.OFF:
-        print("Device {} is not in OFF state, cannot start it.  state = {}".format(device, state))
+        logger.error(f"Device {device} is not in OFF state, cannot start it.  state = {state}")
         return proxy
-    print("Device {} is in OFF, performing initialisation.".format(device))
+
+    # Initialise device
+    logger.info(f"Device {device} is in OFF, performing initialisation.")
     proxy.initialise()
     state = proxy.state()
     if state is not tango._tango.DevState.STANDBY:
-        print("Device {} cannot perform initialise, state = {}.  Please investigate.".format(device, state))
+        logger.error(f"Device {device} cannot perform initialise, state = {state}.  Please investigate.")
         return proxy
-    print("Device {} is in STANDBY, performing on.".format(device))
+
+    # Set default values
+    logger.info(f"Device {device} is in STANDBY, setting default values.")
+    proxy.set_defaults()
+
+    # Turn on device
+    logger.info(f"Device {device} is in STANDBY, performing on.")
     proxy.on()
     state = proxy.state()
     if state is not tango._tango.DevState.ON:
-        print("Device {} cannot perform on, state = {}.  Please investigate.".format(device, state))
+        logger.error(f"Device {device} cannot perform on, state = {state}.  Please investigate.")
     else:
-        print("Device {} has successfully reached ON state.".format(device))
+        logger.info(f"Device {device} has successfully reached ON state.")
+
     return proxy
diff --git a/devices/tox.ini b/devices/tox.ini
index 18c6cda38751d7bc447e8fb23d92e63b64288ddb..94d33c3e392272ac7341e039791f567cf2a7b9b4 100644
--- a/devices/tox.ini
+++ b/devices/tox.ini
@@ -17,6 +17,14 @@ deps = -r{toxinidir}/test-requirements.txt
     -r{toxinidir}/../docker-compose/lofar-device-base/lofar-requirements.txt
 commands = stestr run {posargs}
 
+[testenv:integration]
+; Warning running integration tests will make changes to your docker system!
+; These tests should only be run by the integration-test docker container.
+passenv = TANGO_HOST
+setenv = TESTS_DIR=./integration_test
+commands =
+    stestr run --serial
+
 ; TODO(Corne): Integrate Hacking to customize pep8 rules
 [testenv:pep8]
 commands =
diff --git a/docker-compose/archiver.yml b/docker-compose/archiver.yml
index 41d5df160e011ca1aad79828bf2fd3c941958620..8006ece3b86f0013a5eedc1e066dc4c2f07b73af 100644
--- a/docker-compose/archiver.yml
+++ b/docker-compose/archiver.yml
@@ -15,7 +15,7 @@ services:
       - MYSQL_USER=tango
       - MYSQL_PASSWORD=tango
       - TANGO_HOST=${TANGO_HOST}
-    restart: on-failure
+    restart: unless-stopped
 
   hdbpp-es:
       image: ${LOCAL_DOCKER_REGISTRY_HOST}/${LOCAL_DOCKER_REGISTRY_USER}/tango-archiver:2021-05-28
@@ -34,6 +34,7 @@ services:
           wait-for-it.sh archiver-maria-db:3306 --timeout=30 --strict --
           wait-for-it.sh ${TANGO_HOST} --timeout=30 --strict --
                hdbppes-srv 01"
+      restart: unless-stopped
 
   hdbpp-cm:
       image: ${LOCAL_DOCKER_REGISTRY_HOST}/${LOCAL_DOCKER_REGISTRY_USER}/tango-archiver:${TANGO_ARCHIVER_VERSION}
diff --git a/docker-compose/elk.yml b/docker-compose/elk.yml
index cce66839b499caa0b8948eaeb0c5cc65176be2c9..bf6e22e3de6ea82571acba0ac8e7c69f3eeb2941 100644
--- a/docker-compose/elk.yml
+++ b/docker-compose/elk.yml
@@ -38,3 +38,4 @@ services:
       - "5959:5959" # logstash tcp json input
     depends_on:
       - elk-configure-host
+    restart: unless-stopped
diff --git a/docker-compose/integration-test.yml b/docker-compose/integration-test.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e6a0e54939179ba0c4f5b043da3191dd9e11945d
--- /dev/null
+++ b/docker-compose/integration-test.yml
@@ -0,0 +1,29 @@
+#
+# Docker compose file that launches integration tests
+#
+# Defines:
+#   - integration: Integration testing
+#
+version: '2'
+
+services:
+  integration-test:
+    build:
+        context: itango
+        args:
+            SOURCE_IMAGE: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}-tango-itango:${TANGO_ITANGO_VERSION}
+    container_name: ${CONTAINER_NAME_PREFIX}integration-test
+    networks:
+      - control
+    volumes:
+        - ${TANGO_LOFAR_CONTAINER_MOUNT}
+    environment:
+      - TANGO_HOST=${TANGO_HOST}
+    working_dir: ${TANGO_LOFAR_CONTAINER_DIR}/devices
+    entrypoint:
+      - /usr/local/bin/wait-for-it.sh
+      - ${TANGO_HOST}
+      - --timeout=30
+      - --strict
+      - --
+      - tox -e integration
diff --git a/docker-compose/itango.yml b/docker-compose/itango.yml
index 941974e8770823c6a680de9ffcf95f301163663d..34161eb43f752716f28d44170898d94c4b6d76cd 100644
--- a/docker-compose/itango.yml
+++ b/docker-compose/itango.yml
@@ -37,4 +37,4 @@ services:
       - --strict
       - --
       - /venv/bin/itango3
-    restart: on-failure
+    restart: unless-stopped
diff --git a/docker-compose/jupyter.yml b/docker-compose/jupyter.yml
index 36cc0acbcd32631a9cf8e6bb1f10ecfb77362cf0..989601cf8d858f493ba47ed607a9e4cd5a6d2770 100644
--- a/docker-compose/jupyter.yml
+++ b/docker-compose/jupyter.yml
@@ -38,4 +38,4 @@ services:
       - --strict
       - --
       - /usr/bin/tini -- /usr/local/bin/jupyter-notebook --port=8888 --no-browser --ip=0.0.0.0 --allow-root --NotebookApp.token= --NotebookApp.password=
-    restart: on-failure
+    restart: unless-stopped
diff --git a/docker-compose/jupyter/Dockerfile b/docker-compose/jupyter/Dockerfile
index 2382319bc1a26e4e9f75b4ee8bdb45c893d23528..29f736cdca2fc843750612c6780ea7ad2dfa516e 100644
--- a/docker-compose/jupyter/Dockerfile
+++ b/docker-compose/jupyter/Dockerfile
@@ -5,12 +5,31 @@ FROM ${SOURCE_IMAGE}
 # that are needed for temporary storage the proper owner and access rights.
 ARG CONTAINER_EXECUTION_UID=1000
 
+# Create homedir
+ENV HOME=/home/user
+RUN sudo mkdir -p ${HOME}
+RUN sudo chown ${CONTAINER_EXECUTION_UID} -R ${HOME}
+USER ${CONTAINER_EXECUTION_UID}
+
 RUN sudo pip3 install jupyter
 RUN sudo pip3 install ipykernel
 RUN sudo pip3 install jupyter_bokeh
 # Install matplotlib, jupyterplot
 RUN sudo pip3 install matplotlib jupyterplot
 
+# Allow Download as -> PDF via html
+RUN sudo pip3 install nbconvert
+RUN sudo pip3 install notebook-as-pdf
+# pyppeteer-install installs in the homedir, so run it as the user that will execute the notebook
+RUN pyppeteer-install
+
+# see https://github.com/jupyter/nbconvert/issues/1434
+RUN sudo bash -c "echo DEFAULT_ARGS += [\\\"--no-sandbox\\\"] >> /usr/local/lib/python3.7/dist-packages/pyppeteer/launcher.py"
+RUN sudo apt-get install -y gconf-service libasound2 libatk1.0-0 libatk-bridge2.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget libcairo-gobject2 libxinerama1 libgtk2.0-0 libpangoft2-1.0-0 libthai0 libpixman-1-0 libxcb-render0 libharfbuzz0b libdatrie1 libgraphite2-3 libgbm1
+
+# Allow Download as -> PDF via LaTeX
+RUN sudo apt-get install -y texlive-xetex texlive-fonts-recommended texlive-latex-recommended
+
 # Configure jupyter_bokeh
 RUN sudo mkdir -p /usr/share/jupyter /usr/etc
 RUN sudo chmod a+rwx /usr/share/jupyter /usr/etc
@@ -19,6 +38,7 @@ RUN sudo jupyter nbextension enable jupyter_bokeh --py --sys-prefix
 
 # Install profiles for ipython & jupyter
 COPY ipython-profiles /opt/ipython-profiles/
+RUN sudo chown ${CONTAINER_EXECUTION_UID} -R /opt/ipython-profiles
 COPY jupyter-kernels /usr/local/share/jupyter/kernels/
 
 # Install patched jupyter executable
@@ -34,8 +54,3 @@ ENV JUPYTER_RUNTIME_DIR=/tmp
 ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /usr/bin/tini
 RUN sudo chmod +x /usr/bin/tini
 
-# Make sure Jupyter can write to the home directory
-ENV HOME=/home/user
-RUN sudo mkdir -p ${HOME}
-RUN sudo chown ${CONTAINER_EXECUTION_UID} -R ${HOME}
-RUN sudo chown ${CONTAINER_EXECUTION_UID} -R /opt/ipython-profiles
diff --git a/docker-compose/tango.yml b/docker-compose/tango.yml
index b3a860d7b55ea71c5e2bc23895b7b57040e3f216..9fa0f5cde06f91b7cdc078f5c6481b013442e5ae 100644
--- a/docker-compose/tango.yml
+++ b/docker-compose/tango.yml
@@ -28,7 +28,7 @@ services:
       - tangodb:/var/lib/mysql
     ports:
       - "3306:3306"
-    restart: on-failure
+    restart: unless-stopped
 
   databaseds:
     image: ${DOCKER_REGISTRY_HOST}/${DOCKER_REGISTRY_USER}-tango-cpp:${TANGO_CPP_VERSION}
@@ -55,4 +55,4 @@ services:
       - "2"
       - -ORBendPoint
       - giop:tcp::10000
-    restart: on-failure
+    restart: unless-stopped
diff --git a/jupyter-notebooks/SDP_notebook.ipynb b/jupyter-notebooks/SDP_notebook.ipynb
index 69ae185b050d935bdd5e49bb429a533da1510927..49114ce9d7a72f13b1c70d0b75f1a590e6e6ac04 100644
--- a/jupyter-notebooks/SDP_notebook.ipynb
+++ b/jupyter-notebooks/SDP_notebook.ipynb
@@ -2,7 +2,7 @@
  "cells": [
   {
    "cell_type": "code",
-   "execution_count": 6,
+   "execution_count": 1,
    "id": "waiting-chance",
    "metadata": {},
    "outputs": [],
@@ -12,7 +12,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 2,
    "id": "moving-alexandria",
    "metadata": {},
    "outputs": [],
@@ -22,22 +22,32 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 5,
    "id": "ranking-aluminum",
-   "metadata": {},
+   "metadata": {
+    "scrolled": false
+   },
    "outputs": [
     {
-     "name": "stdout",
-     "output_type": "stream",
-     "text": [
-      "warning, expected device to be in on state, is:  FAULT\n"
+     "ename": "ConnectionFailed",
+     "evalue": "DevFailed[\nDevError[\n    desc = TRANSIENT CORBA system exception: TRANSIENT_NoUsableProfile\n  origin = Connection::connect\n  reason = API_CorbaException\nseverity = ERR]\n\nDevError[\n    desc = Failed to connect to device lts/sdp/1\n  origin = Connection::connect\n  reason = API_CantConnectToDevice\nseverity = ERR]\n]",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mConnectionFailed\u001b[0m                          Traceback (most recent call last)",
+      "\u001b[0;32m/tmp/ipykernel_21/3603531217.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mstate\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mstate\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"OFF\"\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mstate\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"FAULT\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m     \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minitialise\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/green.py\u001b[0m in \u001b[0;36mgreener\u001b[0;34m(obj, *args, **kwargs)\u001b[0m\n\u001b[1;32m    193\u001b[0m             \u001b[0mgreen_mode\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maccess\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'green_mode'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    194\u001b[0m             \u001b[0mexecutor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_object_executor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgreen_mode\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 195\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mexecutor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    196\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    197\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mgreener\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/green.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fn, args, kwargs, wait, timeout)\u001b[0m\n\u001b[1;32m    107\u001b[0m         \u001b[0;31m# Sychronous (no delegation)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    108\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masynchronous\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0min_executor_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    110\u001b[0m         \u001b[0;31m# Asynchronous delegation\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    111\u001b[0m         \u001b[0maccessor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelegate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/device_proxy.py\u001b[0m in \u001b[0;36m__DeviceProxy__state\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1558\u001b[0m                 \u001b[0;32mif\u001b[0m \u001b[0mdev_st\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mDevState\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mON\u001b[0m \u001b[0;34m:\u001b[0m \u001b[0;34m...\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1559\u001b[0m     \"\"\"\n\u001b[0;32m-> 1560\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_state\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1561\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1562\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mConnectionFailed\u001b[0m: DevFailed[\nDevError[\n    desc = TRANSIENT CORBA system exception: TRANSIENT_NoUsableProfile\n  origin = Connection::connect\n  reason = API_CorbaException\nseverity = ERR]\n\nDevError[\n    desc = Failed to connect to device lts/sdp/1\n  origin = Connection::connect\n  reason = API_CantConnectToDevice\nseverity = ERR]\n]"
      ]
     }
    ],
    "source": [
     "state = str(d.state())\n",
     "\n",
-    "if state == \"OFF\":\n",
+    "\n",
+    "if state == \"OFF\" or state == \"FAULT\":\n",
     "    d.initialise()\n",
     "    time.sleep(1)\n",
     "state = str(d.state())\n",
@@ -52,10 +62,28 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 7,
    "id": "transsexual-battle",
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "ename": "DevFailed",
+     "evalue": "DevFailed[\nDevError[\n    desc = Read value for attribute FPGA_mask_RW has not been updated\n  origin = Device_3Impl::read_attributes_no_except\n  reason = API_AttrValueNotSet\nseverity = ERR]\n\nDevError[\n    desc = Failed to read_attribute on device lts/sdp/1, attribute FPGA_mask_RW\n  origin = DeviceProxy::read_attribute()\n  reason = API_AttributeFailed\nseverity = ERR]\n]",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mDevFailed\u001b[0m                                 Traceback (most recent call last)",
+      "\u001b[0;32m/tmp/ipykernel_22/2885399456.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m values = [\n\u001b[0;32m----> 2\u001b[0;31m     \u001b[0;34m[\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mFPGA_mask_RW\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"FPGA_mask_RW\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      3\u001b[0m     \u001b[0;34m[\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mFPGA_scrap_R\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"FPGA_scrap_R\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m     \u001b[0;34m[\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mFPGA_scrap_RW\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"FPGA_scrap_RW\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m     \u001b[0;34m[\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mFPGA_status_R\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"FPGA_status_R\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/device_proxy.py\u001b[0m in \u001b[0;36m__DeviceProxy__getattr\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m    319\u001b[0m     \u001b[0mattr_info\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_attr_cache\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname_l\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    320\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mattr_info\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 321\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0m__get_attribute_value\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattr_info\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    322\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    323\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mname_l\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_pipe_cache\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/device_proxy.py\u001b[0m in \u001b[0;36m__get_attribute_value\u001b[0;34m(self, attr_info, name)\u001b[0m\n\u001b[1;32m    281\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__get_attribute_value\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattr_info\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    282\u001b[0m     \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menum_class\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mattr_info\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 283\u001b[0;31m     \u001b[0mattr_value\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_attribute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    284\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0menum_class\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    285\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0menum_class\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mattr_value\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/green.py\u001b[0m in \u001b[0;36mgreener\u001b[0;34m(obj, *args, **kwargs)\u001b[0m\n\u001b[1;32m    193\u001b[0m             \u001b[0mgreen_mode\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maccess\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'green_mode'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    194\u001b[0m             \u001b[0mexecutor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_object_executor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgreen_mode\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 195\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mexecutor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    196\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    197\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mgreener\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/green.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fn, args, kwargs, wait, timeout)\u001b[0m\n\u001b[1;32m    107\u001b[0m         \u001b[0;31m# Sychronous (no delegation)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    108\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masynchronous\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0min_executor_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    110\u001b[0m         \u001b[0;31m# Asynchronous delegation\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    111\u001b[0m         \u001b[0maccessor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelegate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/device_proxy.py\u001b[0m in \u001b[0;36m__DeviceProxy__read_attribute\u001b[0;34m(self, value, extract_as)\u001b[0m\n\u001b[1;32m    439\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    440\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__DeviceProxy__read_attribute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextract_as\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mExtractAs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mNumpy\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 441\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0m__check_read_attribute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_read_attribute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextract_as\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    442\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    443\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/device_proxy.py\u001b[0m in \u001b[0;36m__check_read_attribute\u001b[0;34m(dev_attr)\u001b[0m\n\u001b[1;32m    155\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__check_read_attribute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdev_attr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    156\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mdev_attr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhas_failed\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 157\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mDevFailed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mdev_attr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_err_stack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    158\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mdev_attr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    159\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;31mDevFailed\u001b[0m: DevFailed[\nDevError[\n    desc = Read value for attribute FPGA_mask_RW has not been updated\n  origin = Device_3Impl::read_attributes_no_except\n  reason = API_AttrValueNotSet\nseverity = ERR]\n\nDevError[\n    desc = Failed to read_attribute on device lts/sdp/1, attribute FPGA_mask_RW\n  origin = DeviceProxy::read_attribute()\n  reason = API_AttributeFailed\nseverity = ERR]\n]"
+     ]
+    }
+   ],
    "source": [
     "values = [\n",
     "    [d.FPGA_mask_RW, \"FPGA_mask_RW\"],\n",
@@ -78,34 +106,202 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 5,
-   "id": "eligible-times",
+   "execution_count": 9,
+   "id": "7accae6a",
    "metadata": {},
-   "outputs": [
-    {
-     "ename": "DevFailed",
-     "evalue": "DevFailed[\nDevError[\n    desc = TypeError: Expecting a numeric type, but it is not. If you use a numpy type instead of python core types, then it must exactly match (ex: numpy.int32 for PyTango.DevLong)\n           \n  origin = Traceback (most recent call last):\n  File \"/usr/local/lib/python3.7/dist-packages/tango/server.py\", line 138, in read_attr\n    set_complex_value(attr, ret)\n  File \"/usr/local/lib/python3.7/dist-packages/tango/server.py\", line 115, in set_complex_value\n    attr.set_value(value)\nTypeError: Expecting a numeric type, but it is not. If you use a numpy type instead of python core types, then it must exactly match (ex: numpy.int32 for PyTango.DevLong)\n\n  reason = PyDs_PythonError\nseverity = ERR]\n\nDevError[\n    desc = Failed to read_attribute on device lts/sdp/1, attribute TR_tod_R\n  origin = DeviceProxy::read_attribute()\n  reason = API_AttributeFailed\nseverity = ERR]\n]",
-     "output_type": "error",
-     "traceback": [
-      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
-      "\u001b[0;31mDevFailed\u001b[0m                                 Traceback (most recent call last)",
-      "\u001b[0;32m<ipython-input-5-e44d5c52394a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTR_tod_R\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
-      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/device_proxy.py\u001b[0m in \u001b[0;36m__DeviceProxy__getattr\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m    319\u001b[0m     \u001b[0mattr_info\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_attr_cache\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname_l\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    320\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mattr_info\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 321\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0m__get_attribute_value\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattr_info\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    322\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    323\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mname_l\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_pipe_cache\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/device_proxy.py\u001b[0m in \u001b[0;36m__get_attribute_value\u001b[0;34m(self, attr_info, name)\u001b[0m\n\u001b[1;32m    281\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__get_attribute_value\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mattr_info\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    282\u001b[0m     \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menum_class\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mattr_info\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 283\u001b[0;31m     \u001b[0mattr_value\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_attribute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    284\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0menum_class\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    285\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0menum_class\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mattr_value\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/green.py\u001b[0m in \u001b[0;36mgreener\u001b[0;34m(obj, *args, **kwargs)\u001b[0m\n\u001b[1;32m    193\u001b[0m             \u001b[0mgreen_mode\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maccess\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'green_mode'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    194\u001b[0m             \u001b[0mexecutor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_object_executor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgreen_mode\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 195\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mexecutor\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwait\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    196\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    197\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mgreener\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/green.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fn, args, kwargs, wait, timeout)\u001b[0m\n\u001b[1;32m    107\u001b[0m         \u001b[0;31m# Sychronous (no delegation)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    108\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masynchronous\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0min_executor_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 109\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    110\u001b[0m         \u001b[0;31m# Asynchronous delegation\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    111\u001b[0m         \u001b[0maccessor\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdelegate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/device_proxy.py\u001b[0m in \u001b[0;36m__DeviceProxy__read_attribute\u001b[0;34m(self, value, extract_as)\u001b[0m\n\u001b[1;32m    439\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    440\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__DeviceProxy__read_attribute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextract_as\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mExtractAs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mNumpy\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 441\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0m__check_read_attribute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_read_attribute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextract_as\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    442\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    443\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/device_proxy.py\u001b[0m in \u001b[0;36m__check_read_attribute\u001b[0;34m(dev_attr)\u001b[0m\n\u001b[1;32m    155\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__check_read_attribute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdev_attr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    156\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mdev_attr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhas_failed\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 157\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mDevFailed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mdev_attr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_err_stack\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    158\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mdev_attr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    159\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
-      "\u001b[0;31mDevFailed\u001b[0m: DevFailed[\nDevError[\n    desc = TypeError: Expecting a numeric type, but it is not. If you use a numpy type instead of python core types, then it must exactly match (ex: numpy.int32 for PyTango.DevLong)\n           \n  origin = Traceback (most recent call last):\n  File \"/usr/local/lib/python3.7/dist-packages/tango/server.py\", line 138, in read_attr\n    set_complex_value(attr, ret)\n  File \"/usr/local/lib/python3.7/dist-packages/tango/server.py\", line 115, in set_complex_value\n    attr.set_value(value)\nTypeError: Expecting a numeric type, but it is not. If you use a numpy type instead of python core types, then it must exactly match (ex: numpy.int32 for PyTango.DevLong)\n\n  reason = PyDs_PythonError\nseverity = ERR]\n\nDevError[\n    desc = Failed to read_attribute on device lts/sdp/1, attribute TR_tod_R\n  origin = DeviceProxy::read_attribute()\n  reason = API_AttributeFailed\nseverity = ERR]\n]"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "attr_names = d.get_attribute_list()\n",
     "\n",
+    "\n",
     "for i in attr_names:\n",
     "    exec(\"value = print(i, d.{})\".format(i))\n"
    ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "id": "b88868c5",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],\n",
+       "       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],\n",
+       "       [1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
+       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
+       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
+       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
+       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
+       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
+       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
+       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
+       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
+       "       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]],\n",
+       "      dtype=float32)"
+      ]
+     },
+     "execution_count": 19,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "wgswitches = d.FPGA_wg_enable_R\n",
+    "print(\"Old values:\\n\",  wgswitches)\n",
+    "wgswitches[9][0] = True\n",
+    "wgswitches[10][0] = True\n",
+    "print(\"Values to be set:\\n\", wgswitches)\n",
+    "d.FPGA_wg_enable_RW =wgswitches\n",
+    "time.sleep(7)\n",
+    "print(\"Values read back after setting:\\n\",d.FPGA_wg_enable_R)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "id": "8f3db8c7",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([[119.99817, 119.99817, 119.99817, 119.99817, 119.99817, 119.99817,\n",
+       "        119.99817, 119.99817, 119.99817, 119.99817, 119.99817, 119.99817,\n",
+       "        119.99817, 119.99817, 119.99817, 119.99817],\n",
+       "       [119.99817, 119.99817, 119.99817, 119.99817, 119.99817, 119.99817,\n",
+       "        119.99817, 119.99817, 119.99817, 119.99817, 119.99817, 119.99817,\n",
+       "        119.99817, 119.99817, 119.99817, 119.99817],\n",
+       "       [119.99817, 119.99817, 119.99817, 119.99817,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ],\n",
+       "       [  0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ],\n",
+       "       [  0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ],\n",
+       "       [  0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ],\n",
+       "       [  0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ],\n",
+       "       [  0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ],\n",
+       "       [  0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ],\n",
+       "       [  0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ],\n",
+       "       [  0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ],\n",
+       "       [  0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ,   0.     ,   0.     ,\n",
+       "          0.     ,   0.     ,   0.     ,   0.     ]], dtype=float32)"
+      ]
+     },
+     "execution_count": 18,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "phases = d.FPGA_wg_phase_R\n",
+    "print(\"Old values:\\n\",  phases)\n",
+    "phases[9][0] = 1.0334\n",
+    "phases[9][1] = 20.15\n",
+    "phases[10][0] = 130\n",
+    "print(\"Values to be set:\\n\", phases)\n",
+    "d.FPGA_wg_phase_RW = phases\n",
+    "time.sleep(7)\n",
+    "print(\"Values read back after setting:\\n\", d.FPGA_wg_phase_R)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "id": "e45b4874",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([[29921878., 29921878., 29921878., 29921878., 29921878., 29921878.,\n",
+       "        29921878., 29921878., 29921878., 29921878., 29921878., 29921878.,\n",
+       "        29921878., 29921878., 29921878., 29921878.],\n",
+       "       [29921878., 29921878., 29921878., 29921878., 29921878., 29921878.,\n",
+       "        29921878., 29921878., 29921878., 29921878., 29921878., 29921878.,\n",
+       "        29921878., 29921878., 29921878., 29921878.],\n",
+       "       [29921878., 29921878., 29921878., 29921878.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.],\n",
+       "       [       0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.],\n",
+       "       [       0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.],\n",
+       "       [       0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.],\n",
+       "       [       0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.],\n",
+       "       [       0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.],\n",
+       "       [       0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.],\n",
+       "       [       0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.],\n",
+       "       [       0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.],\n",
+       "       [       0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.,        0.,        0.,\n",
+       "               0.,        0.,        0.,        0.]], dtype=float32)"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "amplitudes = d.FPGA_wg_amplitude_R\n",
+    "print(\"Old values:\\n\",  amplitudes)\n",
+    "amplitudes[9][0] = 1.0\n",
+    "amplitudes[9][1] = 1.99\n",
+    "amplitudes[10][0] = 0.5\n",
+    "print(\"Values to be set:\\n\", amplitudes)\n",
+    "d.FPGA_wg_amplitude_RW = amplitudes\n",
+    "time.sleep(7)\n",
+    "print(\"Values read back after setting:\\n\", d.FPGA_wg_amplitude_R)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "9b1bbd3e",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "frequencies = d.FPGA_wg_frequency_R\n",
+    "print(\"Old values:\\n\",  frequencies)\n",
+    "frequencies[9][0] = 19000000\n",
+    "frequencies[9][1] = 20000000\n",
+    "frequencies[10][0] = 22000000\n",
+    "print(\"Values to be set:\\n\", frequencies)\n",
+    "d.FPGA_wg_frequency_RW = frequencies\n",
+    "print(\"Values read back after setting:\\n\", d.FPGA_wg_frequency_R)"
+   ]
   }
  ],
  "metadata": {
diff --git a/jupyter-notebooks/WG_test.ipynb b/jupyter-notebooks/WG_test.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..fece6f9439e16869c958d6b68b77cf87c1cdad7c
--- /dev/null
+++ b/jupyter-notebooks/WG_test.ipynb
@@ -0,0 +1,1623 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "id": "2f0106f1",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(tango._tango.DevState.ON, tango._tango.DevState.ON)"
+      ]
+     },
+     "execution_count": 27,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "#d=DeviceProxy(\"LTS/SST/1\")\n",
+    "#s=DeviceProxy(\"LTS/SDP/1\")\n",
+    "#d.off(),d.initialise(), d.on()\n",
+    "s.initialise(), s.on()\n",
+    "(d.state(), s.state())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "id": "5aa9bf0a",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[('10.99.250.250', ''),\n",
+       " ('10.99.250.250', ''),\n",
+       " ('10.99.250.250', ''),\n",
+       " ('10.99.250.250', ''),\n",
+       " ('10.99.250.250', ''),\n",
+       " ('10.99.250.250', ''),\n",
+       " ('10.99.250.250', ''),\n",
+       " ('10.99.250.250', ''),\n",
+       " ('10.99.250.250', '10.99.250.250'),\n",
+       " ('10.99.250.250', '10.99.250.250'),\n",
+       " ('10.99.250.250', '10.99.250.250'),\n",
+       " ('10.99.250.250', '10.99.250.250'),\n",
+       " ('10.99.250.250', ''),\n",
+       " ('10.99.250.250', ''),\n",
+       " ('10.99.250.250', ''),\n",
+       " ('10.99.250.250', '')]"
+      ]
+     },
+     "execution_count": 28,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "d.FPGA_sst_offload_enable_RW = [False]*16\n",
+    "d.FPGA_sst_offload_hdr_ip_destination_address_RW=[\"10.99.250.250\"]*16\n",
+    "list(zip(d.FPGA_sst_offload_hdr_ip_destination_address_RW,d.FPGA_sst_offload_hdr_ip_destination_address_R))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "id": "c7605d97",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[('6c:2b:59:97:be:dd', ''),\n",
+       " ('6c:2b:59:97:be:dd', ''),\n",
+       " ('6c:2b:59:97:be:dd', ''),\n",
+       " ('6c:2b:59:97:be:dd', ''),\n",
+       " ('6c:2b:59:97:be:dd', ''),\n",
+       " ('6c:2b:59:97:be:dd', ''),\n",
+       " ('6c:2b:59:97:be:dd', ''),\n",
+       " ('6c:2b:59:97:be:dd', ''),\n",
+       " ('6c:2b:59:97:be:dd', '6c:2b:59:97:be:dd'),\n",
+       " ('6c:2b:59:97:be:dd', '6c:2b:59:97:be:dd'),\n",
+       " ('6c:2b:59:97:be:dd', '6c:2b:59:97:be:dd'),\n",
+       " ('6c:2b:59:97:be:dd', '6c:2b:59:97:be:dd'),\n",
+       " ('6c:2b:59:97:be:dd', ''),\n",
+       " ('6c:2b:59:97:be:dd', ''),\n",
+       " ('6c:2b:59:97:be:dd', ''),\n",
+       " ('6c:2b:59:97:be:dd', '')]"
+      ]
+     },
+     "execution_count": 29,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "d.FPGA_sst_offload_hdr_eth_destination_mac_RW=[\"6c:2b:59:97:be:dd\"]*16\n",
+    "list(zip(d.FPGA_sst_offload_hdr_eth_destination_mac_RW,d.FPGA_sst_offload_hdr_eth_destination_mac_R))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "id": "305b548a",
+   "metadata": {},
+   "outputs": [
+    {
+     "ename": "AttributeError",
+     "evalue": "set_defaults",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[0;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
+      "\u001b[0;32m/tmp/ipykernel_21/1160776047.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_defaults\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/tango/device_proxy.py\u001b[0m in \u001b[0;36m__DeviceProxy__getattr\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m    353\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_pipe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    354\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 355\u001b[0;31m     \u001b[0msix\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mraise_from\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mAttributeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    356\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    357\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+      "\u001b[0;32m/usr/local/lib/python3.7/dist-packages/six.py\u001b[0m in \u001b[0;36mraise_from\u001b[0;34m(value, from_value)\u001b[0m\n",
+      "\u001b[0;31mAttributeError\u001b[0m: set_defaults"
+     ]
+    }
+   ],
+   "source": [
+    "d.set_defaults()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 638,
+   "id": "09e9b5e6",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "s.set_defaults()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "a24c8a66",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "s.FPGA_"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "id": "9ed6b96d",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([[False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False],\n",
+       "       [False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False],\n",
+       "       [False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False],\n",
+       "       [False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False],\n",
+       "       [False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False],\n",
+       "       [False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False],\n",
+       "       [False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False],\n",
+       "       [False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False],\n",
+       "       [ True,  True,  True,  True,  True,  True,  True,  True,  True,\n",
+       "         True,  True,  True],\n",
+       "       [ True,  True,  True,  True,  True,  True,  True,  True,  True,\n",
+       "         True,  True,  True],\n",
+       "       [ True,  True,  True,  True,  True,  True,  True,  True,  True,\n",
+       "         True,  True,  True],\n",
+       "       [ True,  True,  True,  True,  True,  True,  True,  True,  True,\n",
+       "         True,  True,  True],\n",
+       "       [False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False],\n",
+       "       [False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False],\n",
+       "       [False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False],\n",
+       "       [False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False]])"
+      ]
+     },
+     "execution_count": 9,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "s.FPGA_wg_enable_RW=[[True]*12]*16\n",
+    "s.FPGA_wg_enable_R"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "id": "766f818f",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "('',\n",
+       " '',\n",
+       " '',\n",
+       " '',\n",
+       " '',\n",
+       " '',\n",
+       " '',\n",
+       " '',\n",
+       " '10.1.1.1',\n",
+       " '10.1.1.1',\n",
+       " '10.1.1.1',\n",
+       " '10.1.1.1',\n",
+       " '',\n",
+       " '',\n",
+       " '',\n",
+       " '')"
+      ]
+     },
+     "execution_count": 10,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "d.FPGA_sst_offload_hdr_ip_destination_address_R"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "id": "c0d78129",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "('', '', '', '', '', '', '', '', '20-21-08T10.51.20_808728114_lofar2_unb2b_sdp_station_xsub_one', '20-21-08T10.51.20_808728114_lofar2_unb2b_sdp_station_xsub_one', '20-21-08T10.51.20_808728114_lofar2_unb2b_sdp_station_xsub_one', '20-21-08T10.51.20_808728114_lofar2_unb2b_sdp_station_xsub_one', '', '', '', '')\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(s.FPGA_firmware_version_R)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "id": "82fe3420",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[False False False False False False False False  True False  True  True\n",
+      " False False False False]\n"
+     ]
+    }
+   ],
+   "source": [
+    "d.FPGA_processing_enable_RW=[True]*16\n",
+    "print(s.FPGA_processing_enable_R)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "id": "c482f116",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([ True,  True,  True,  True,  True,  True,  True,  True, False,\n",
+       "       False, False, False,  True,  True,  True,  True])"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "s.TR_fpga_communication_error_R"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 40,
+   "id": "1ff83508",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(array([False, False, False, False, False, False, False, False,  True,\n",
+       "         True,  True,  True, False, False, False, False]),\n",
+       " array([False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False,  True,  True,  True,\n",
+       "         True,  True,  True,  True,  True,  True,  True,  True,  True,\n",
+       "         True,  True,  True,  True,  True,  True,  True,  True,  True,\n",
+       "         True,  True,  True,  True,  True,  True,  True,  True,  True,\n",
+       "         True,  True,  True,  True,  True,  True,  True,  True,  True,\n",
+       "         True,  True,  True,  True,  True,  True,  True,  True,  True,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False, False, False, False, False, False, False,\n",
+       "        False, False, False]))"
+      ]
+     },
+     "execution_count": 40,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "#s.FPGA_wg_enable_RW=[[False]*16]*12\n",
+    "s.TR_fpga_mask_R, s.FPGA_wg_enable_R.flatten()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 160,
+   "id": "13783e0f",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Old values:\n",
+      " [[False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]]\n",
+      "Values to be set:\n",
+      " [[False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]]\n",
+      "Values read back after setting:\n",
+      " [[False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]]\n"
+     ]
+    }
+   ],
+   "source": [
+    "wgswitches = s.FPGA_wg_enable_R\n",
+    "print(\"Old values:\\n\",  wgswitches)\n",
+    "wgswitches[8] = True\n",
+    "#wgswitches[9][0] = True\n",
+    "#wgswitches[10][0] = True\n",
+    "print(\"Values to be set:\\n\", wgswitches)\n",
+    "s.FPGA_wg_enable_RW =wgswitches\n",
+    "print(\"Values read back after setting:\\n\",s.FPGA_wg_enable_R)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 167,
+   "id": "4f0c3783",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Values read back after resetting:\n",
+      " [[False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [ True  True  True  True  True  True  True  True  True  True  True  True]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]\n",
+      " [False False False False False False False False False False False False]]\n"
+     ]
+    }
+   ],
+   "source": [
+    "#Reset WG: needed after frequence changes\n",
+    "wgswitches = s.FPGA_wg_enable_R\n",
+    "wgswitches[8] = False\n",
+    "s.FPGA_wg_enable_RW =wgswitches\n",
+    "wgswitches[8] = True\n",
+    "s.FPGA_wg_enable_RW =wgswitches\n",
+    "print(\"Values read back after resetting:\\n\",s.FPGA_wg_enable_R)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 140,
+   "id": "e2bf77e4",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Old values:\n",
+      " [[0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.09999084 0.09999084 0.09999084 0.09999084 0.09999084 0.09999084\n",
+      "  0.09999084 0.09999084 0.09999084 0.09999084 0.09999084 0.09999084]\n",
+      " [1.         1.         1.         1.         1.         1.\n",
+      "  1.         1.         1.         1.         1.         1.        ]\n",
+      " [1.         1.         1.         1.         1.         1.\n",
+      "  1.         1.         1.         1.         1.         1.        ]\n",
+      " [1.         1.         1.         1.         1.         1.\n",
+      "  1.         1.         1.         1.         1.         1.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]]\n",
+      "Values to be set:\n",
+      " [[0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]\n",
+      " [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]\n",
+      " [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]\n",
+      " [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]\n",
+      " [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]\n",
+      " [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]\n",
+      " [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]\n",
+      " [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]\n",
+      " [0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]\n",
+      " [1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.  ]\n",
+      " [1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.  ]\n",
+      " [1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.  ]\n",
+      " [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]\n",
+      " [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]\n",
+      " [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]\n",
+      " [0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  ]]\n",
+      "Values read back after setting:\n",
+      " [[0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.00999451 0.00999451 0.00999451 0.00999451 0.00999451 0.00999451\n",
+      "  0.00999451 0.00999451 0.00999451 0.00999451 0.00999451 0.00999451]\n",
+      " [1.         1.         1.         1.         1.         1.\n",
+      "  1.         1.         1.         1.         1.         1.        ]\n",
+      " [1.         1.         1.         1.         1.         1.\n",
+      "  1.         1.         1.         1.         1.         1.        ]\n",
+      " [1.         1.         1.         1.         1.         1.\n",
+      "  1.         1.         1.         1.         1.         1.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]\n",
+      " [0.         0.         0.         0.         0.         0.\n",
+      "  0.         0.         0.         0.         0.         0.        ]]\n"
+     ]
+    }
+   ],
+   "source": [
+    "amplitudes = s.FPGA_wg_amplitude_R\n",
+    "print(\"Old values:\\n\",  amplitudes)\n",
+    "#amplitudes[8] = 1\n",
+    "#amplitudes[10] = 1.0\n",
+    "#amplitudes[11] = 1.0\n",
+    "amplitudes[8] = 0.01\n",
+    "#amplitudes[8][1] = 0.5\n",
+    "print(\"Values to be set:\\n\", amplitudes)\n",
+    "s.FPGA_wg_amplitude_RW = amplitudes\n",
+    "print(\"Values read back after setting:\\n\", s.FPGA_wg_amplitude_R)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 166,
+   "id": "d499a2f6",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Old values:\n",
+      " [[       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [19999999.92549419 19999999.92549419 19999999.92549419 19999999.92549419\n",
+      "  19999999.92549419 19999999.92549419 19999999.92549419 19999999.92549419\n",
+      "  19999999.92549419 19999999.92549419 19999999.92549419 19999999.92549419]\n",
+      " [18999999.94784594 19999999.92549419        0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [21999999.97392297        0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]]\n",
+      "Values to be set:\n",
+      " [[       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [30000000.         30000000.         30000000.         30000000.\n",
+      "  30000000.         30000000.         30000000.         30000000.\n",
+      "  30000000.         30000000.         30000000.         30000000.        ]\n",
+      " [18999999.94784594 19999999.92549419        0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [21999999.97392297        0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]]\n",
+      "Values read back after setting:\n",
+      " [[       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [29999999.98137355 29999999.98137355 29999999.98137355 29999999.98137355\n",
+      "  29999999.98137355 29999999.98137355 29999999.98137355 29999999.98137355\n",
+      "  29999999.98137355 29999999.98137355 29999999.98137355 29999999.98137355]\n",
+      " [18999999.94784594 19999999.92549419        0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [21999999.97392297        0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]\n",
+      " [       0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.\n",
+      "         0.                0.                0.                0.        ]]\n"
+     ]
+    }
+   ],
+   "source": [
+    "frequencies = s.FPGA_wg_frequency_R\n",
+    "print(\"Old values:\\n\",  frequencies)\n",
+    "#frequencies[8][0] = 10000000\n",
+    "frequencies[8] = 30000000\n",
+    "#frequencies[8][2] = 15000000\n",
+    "#frequencies[8][3] = 22000000\n",
+    "#frequencies[10][0] = 22000000\n",
+    "print(\"Values to be set:\\n\", frequencies)\n",
+    "s.FPGA_wg_frequency_RW = frequencies\n",
+    "print(\"Values read back after setting:\\n\", s.FPGA_wg_frequency_R)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 132,
+   "id": "cac5c354",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Old values:\n",
+      " [[  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.          29.99816895  59.99633789  90.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  1.03271484  20.14892578   0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [129.99572754   0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]]\n",
+      "Values to be set:\n",
+      " [[  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  1.03271484  20.14892578   0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [129.99572754   0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]]\n",
+      "Values read back after setting:\n",
+      " [[  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  1.03271484  20.14892578   0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [129.99572754   0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]\n",
+      " [  0.           0.           0.           0.           0.\n",
+      "    0.           0.           0.           0.           0.\n",
+      "    0.           0.        ]]\n"
+     ]
+    }
+   ],
+   "source": [
+    "phases = s.FPGA_wg_phase_R\n",
+    "print(\"Old values:\\n\",  phases)\n",
+    "phases[8] = 0\n",
+    "#phases[8][1] = 30\n",
+    "#phases[8][2] = 60\n",
+    "#phases[8][3] = 90\n",
+    "#phases[10][0] = 130\n",
+    "print(\"Values to be set:\\n\", phases)\n",
+    "s.FPGA_wg_phase_RW = phases\n",
+    "print(\"Values read back after setting:\\n\", s.FPGA_wg_phase_R)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "id": "aff7476f",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[False False False False False False False False  True False False False\n",
+      " False False False False]\n"
+     ]
+    }
+   ],
+   "source": [
+    "Enable=[False]*16\n",
+    "Enable[8]=True\n",
+    "d.FPGA_sst_offload_enable_RW=Enable\n",
+    "\n",
+    "print(d.FPGA_sst_offload_enable_R)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "id": "97c2d815",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "('', '', '', '', '', '', '', '', '6c:2b:59:97:be:dd', '6c:2b:59:97:be:dd', '6c:2b:59:97:be:dd', '6c:2b:59:97:be:dd', '', '', '', '')\n",
+      "('', '', '', '', '', '', '', '', '10.99.250.250', '10.99.250.250', '10.99.250.250', '10.99.250.250', '', '', '', '')\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(d.FPGA_sst_offload_hdr_eth_destination_mac_R)\n",
+    "print(d.FPGA_sst_offload_hdr_ip_destination_address_R)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "id": "bc3e0ebf",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "[   0    0    0    0    0    0    0    0 5001 5001 5001 5001    0    0\n",
+      "    0    0]\n"
+     ]
+    }
+   ],
+   "source": [
+    "prt=d.FPGA_sst_offload_hdr_udp_destination_port_R\n",
+    "print(prt)\n",
+    "#prt[0]=5001\n",
+    "#d.FPGA_sst_offload_hdr_udp_destination_port_RW=prt"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "id": "25f7d1fa",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(456, '2021-08-30 08:13:14')"
+      ]
+     },
+     "execution_count": 33,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "import datetime\n",
+    "(d.nof_packets_received_R, datetime.datetime.fromtimestamp(d.last_packet_timestamp_r).isoformat(' '))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "id": "b95d0f28",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "0"
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "d.nof_invalid_packets_R"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "id": "f2db262d",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "0"
+      ]
+     },
+     "execution_count": 35,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "d.nof_packets_dropped_R"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 36,
+   "id": "c81ad8d5",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
+       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=uint64)"
+      ]
+     },
+     "execution_count": 36,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "d.nof_payload_errors_R"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 69,
+   "id": "19cfc04a",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array([    0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0, 14985, 14985, 14984,\n",
+       "       14985, 14985, 14986, 14982, 14986, 14985, 14987, 14983, 14987,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0,     0,     0,     0,     0,     0,     0,\n",
+       "           0,     0,     0], dtype=uint64)"
+      ]
+     },
+     "execution_count": 69,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "d.nof_valid_payloads_R"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 131,
+   "id": "b3f77e0b",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Antennas for which we got SSTs: [96, 97, 98, 99, 100]\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(\"Antennas for which we got SSTs:\",[i for i,x in enumerate(d.sst_r) if x[0] != 0])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 112,
+   "id": "c483f89c",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Antennas values [     0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0   2854      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0 224841      0      0      0\n",
+      "  20247      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      "      0      0      0      0      0      0      0      0      0      0\n",
+      " 190973      0]\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(\"Antennas values\", d.sst_r[97])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 168,
+   "id": "aabeb1b7",
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "\n",
+       "    <div class=\"bk-root\">\n",
+       "        <a href=\"https://bokeh.org\" target=\"_blank\" class=\"bk-logo bk-logo-small bk-logo-notebook\"></a>\n",
+       "        <span id=\"31090\">Loading BokehJS ...</span>\n",
+       "    </div>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/javascript": [
+       "\n",
+       "(function(root) {\n",
+       "  function now() {\n",
+       "    return new Date();\n",
+       "  }\n",
+       "\n",
+       "  var force = true;\n",
+       "\n",
+       "  if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n",
+       "    root._bokeh_onload_callbacks = [];\n",
+       "    root._bokeh_is_loading = undefined;\n",
+       "  }\n",
+       "\n",
+       "  var JS_MIME_TYPE = 'application/javascript';\n",
+       "  var HTML_MIME_TYPE = 'text/html';\n",
+       "  var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n",
+       "  var CLASS_NAME = 'output_bokeh rendered_html';\n",
+       "\n",
+       "  /**\n",
+       "   * Render data to the DOM node\n",
+       "   */\n",
+       "  function render(props, node) {\n",
+       "    var script = document.createElement(\"script\");\n",
+       "    node.appendChild(script);\n",
+       "  }\n",
+       "\n",
+       "  /**\n",
+       "   * Handle when an output is cleared or removed\n",
+       "   */\n",
+       "  function handleClearOutput(event, handle) {\n",
+       "    var cell = handle.cell;\n",
+       "\n",
+       "    var id = cell.output_area._bokeh_element_id;\n",
+       "    var server_id = cell.output_area._bokeh_server_id;\n",
+       "    // Clean up Bokeh references\n",
+       "    if (id != null && id in Bokeh.index) {\n",
+       "      Bokeh.index[id].model.document.clear();\n",
+       "      delete Bokeh.index[id];\n",
+       "    }\n",
+       "\n",
+       "    if (server_id !== undefined) {\n",
+       "      // Clean up Bokeh references\n",
+       "      var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n",
+       "      cell.notebook.kernel.execute(cmd, {\n",
+       "        iopub: {\n",
+       "          output: function(msg) {\n",
+       "            var id = msg.content.text.trim();\n",
+       "            if (id in Bokeh.index) {\n",
+       "              Bokeh.index[id].model.document.clear();\n",
+       "              delete Bokeh.index[id];\n",
+       "            }\n",
+       "          }\n",
+       "        }\n",
+       "      });\n",
+       "      // Destroy server and session\n",
+       "      var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n",
+       "      cell.notebook.kernel.execute(cmd);\n",
+       "    }\n",
+       "  }\n",
+       "\n",
+       "  /**\n",
+       "   * Handle when a new output is added\n",
+       "   */\n",
+       "  function handleAddOutput(event, handle) {\n",
+       "    var output_area = handle.output_area;\n",
+       "    var output = handle.output;\n",
+       "\n",
+       "    // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n",
+       "    if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n",
+       "      return\n",
+       "    }\n",
+       "\n",
+       "    var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
+       "\n",
+       "    if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n",
+       "      toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n",
+       "      // store reference to embed id on output_area\n",
+       "      output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
+       "    }\n",
+       "    if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n",
+       "      var bk_div = document.createElement(\"div\");\n",
+       "      bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n",
+       "      var script_attrs = bk_div.children[0].attributes;\n",
+       "      for (var i = 0; i < script_attrs.length; i++) {\n",
+       "        toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n",
+       "        toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n",
+       "      }\n",
+       "      // store reference to server id on output_area\n",
+       "      output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n",
+       "    }\n",
+       "  }\n",
+       "\n",
+       "  function register_renderer(events, OutputArea) {\n",
+       "\n",
+       "    function append_mime(data, metadata, element) {\n",
+       "      // create a DOM node to render to\n",
+       "      var toinsert = this.create_output_subarea(\n",
+       "        metadata,\n",
+       "        CLASS_NAME,\n",
+       "        EXEC_MIME_TYPE\n",
+       "      );\n",
+       "      this.keyboard_manager.register_events(toinsert);\n",
+       "      // Render to node\n",
+       "      var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n",
+       "      render(props, toinsert[toinsert.length - 1]);\n",
+       "      element.append(toinsert);\n",
+       "      return toinsert\n",
+       "    }\n",
+       "\n",
+       "    /* Handle when an output is cleared or removed */\n",
+       "    events.on('clear_output.CodeCell', handleClearOutput);\n",
+       "    events.on('delete.Cell', handleClearOutput);\n",
+       "\n",
+       "    /* Handle when a new output is added */\n",
+       "    events.on('output_added.OutputArea', handleAddOutput);\n",
+       "\n",
+       "    /**\n",
+       "     * Register the mime type and append_mime function with output_area\n",
+       "     */\n",
+       "    OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
+       "      /* Is output safe? */\n",
+       "      safe: true,\n",
+       "      /* Index of renderer in `output_area.display_order` */\n",
+       "      index: 0\n",
+       "    });\n",
+       "  }\n",
+       "\n",
+       "  // register the mime type if in Jupyter Notebook environment and previously unregistered\n",
+       "  if (root.Jupyter !== undefined) {\n",
+       "    var events = require('base/js/events');\n",
+       "    var OutputArea = require('notebook/js/outputarea').OutputArea;\n",
+       "\n",
+       "    if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
+       "      register_renderer(events, OutputArea);\n",
+       "    }\n",
+       "  }\n",
+       "\n",
+       "  \n",
+       "  if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n",
+       "    root._bokeh_timeout = Date.now() + 5000;\n",
+       "    root._bokeh_failed_load = false;\n",
+       "  }\n",
+       "\n",
+       "  var NB_LOAD_WARNING = {'data': {'text/html':\n",
+       "     \"<div style='background-color: #fdd'>\\n\"+\n",
+       "     \"<p>\\n\"+\n",
+       "     \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
+       "     \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
+       "     \"</p>\\n\"+\n",
+       "     \"<ul>\\n\"+\n",
+       "     \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
+       "     \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
+       "     \"</ul>\\n\"+\n",
+       "     \"<code>\\n\"+\n",
+       "     \"from bokeh.resources import INLINE\\n\"+\n",
+       "     \"output_notebook(resources=INLINE)\\n\"+\n",
+       "     \"</code>\\n\"+\n",
+       "     \"</div>\"}};\n",
+       "\n",
+       "  function display_loaded() {\n",
+       "    var el = document.getElementById(\"31090\");\n",
+       "    if (el != null) {\n",
+       "      el.textContent = \"BokehJS is loading...\";\n",
+       "    }\n",
+       "    if (root.Bokeh !== undefined) {\n",
+       "      if (el != null) {\n",
+       "        el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n",
+       "      }\n",
+       "    } else if (Date.now() < root._bokeh_timeout) {\n",
+       "      setTimeout(display_loaded, 100)\n",
+       "    }\n",
+       "  }\n",
+       "\n",
+       "\n",
+       "  function run_callbacks() {\n",
+       "    try {\n",
+       "      root._bokeh_onload_callbacks.forEach(function(callback) {\n",
+       "        if (callback != null)\n",
+       "          callback();\n",
+       "      });\n",
+       "    } finally {\n",
+       "      delete root._bokeh_onload_callbacks\n",
+       "    }\n",
+       "    console.debug(\"Bokeh: all callbacks have finished\");\n",
+       "  }\n",
+       "\n",
+       "  function load_libs(css_urls, js_urls, callback) {\n",
+       "    if (css_urls == null) css_urls = [];\n",
+       "    if (js_urls == null) js_urls = [];\n",
+       "\n",
+       "    root._bokeh_onload_callbacks.push(callback);\n",
+       "    if (root._bokeh_is_loading > 0) {\n",
+       "      console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
+       "      return null;\n",
+       "    }\n",
+       "    if (js_urls == null || js_urls.length === 0) {\n",
+       "      run_callbacks();\n",
+       "      return null;\n",
+       "    }\n",
+       "    console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
+       "    root._bokeh_is_loading = css_urls.length + js_urls.length;\n",
+       "\n",
+       "    function on_load() {\n",
+       "      root._bokeh_is_loading--;\n",
+       "      if (root._bokeh_is_loading === 0) {\n",
+       "        console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n",
+       "        run_callbacks()\n",
+       "      }\n",
+       "    }\n",
+       "\n",
+       "    function on_error(url) {\n",
+       "      console.error(\"failed to load \" + url);\n",
+       "    }\n",
+       "\n",
+       "    for (let i = 0; i < css_urls.length; i++) {\n",
+       "      const url = css_urls[i];\n",
+       "      const element = document.createElement(\"link\");\n",
+       "      element.onload = on_load;\n",
+       "      element.onerror = on_error.bind(null, url);\n",
+       "      element.rel = \"stylesheet\";\n",
+       "      element.type = \"text/css\";\n",
+       "      element.href = url;\n",
+       "      console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n",
+       "      document.body.appendChild(element);\n",
+       "    }\n",
+       "\n",
+       "    const hashes = {\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.3.min.js\": \"dM3QQsP+wXdHg42wTqW85BjZQdLNNIXqlPw/BgKoExPmTG7ZLML4EGqLMfqHT6ON\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.3.min.js\": \"8x57I4YuIfu8XyZfFo0XVr2WAT8EK4rh/uDe3wF7YuW2FNUSNEpJbsPaB1nJ2fz2\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.3.min.js\": \"3QTqdz9LyAm2i0sG5XTePsHec3UHWwVsrOL68SYRoAXsafvfAyqtQ+h440+qIBhS\"};\n",
+       "\n",
+       "    for (let i = 0; i < js_urls.length; i++) {\n",
+       "      const url = js_urls[i];\n",
+       "      const element = document.createElement('script');\n",
+       "      element.onload = on_load;\n",
+       "      element.onerror = on_error.bind(null, url);\n",
+       "      element.async = false;\n",
+       "      element.src = url;\n",
+       "      if (url in hashes) {\n",
+       "        element.crossOrigin = \"anonymous\";\n",
+       "        element.integrity = \"sha384-\" + hashes[url];\n",
+       "      }\n",
+       "      console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
+       "      document.head.appendChild(element);\n",
+       "    }\n",
+       "  };\n",
+       "\n",
+       "  function inject_raw_css(css) {\n",
+       "    const element = document.createElement(\"style\");\n",
+       "    element.appendChild(document.createTextNode(css));\n",
+       "    document.body.appendChild(element);\n",
+       "  }\n",
+       "\n",
+       "  \n",
+       "  var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.3.min.js\"];\n",
+       "  var css_urls = [];\n",
+       "  \n",
+       "\n",
+       "  var inline_js = [\n",
+       "    function(Bokeh) {\n",
+       "      Bokeh.set_log_level(\"info\");\n",
+       "    },\n",
+       "    function(Bokeh) {\n",
+       "    \n",
+       "    \n",
+       "    }\n",
+       "  ];\n",
+       "\n",
+       "  function run_inline_js() {\n",
+       "    \n",
+       "    if (root.Bokeh !== undefined || force === true) {\n",
+       "      \n",
+       "    for (var i = 0; i < inline_js.length; i++) {\n",
+       "      inline_js[i].call(root, root.Bokeh);\n",
+       "    }\n",
+       "    if (force === true) {\n",
+       "        display_loaded();\n",
+       "      }} else if (Date.now() < root._bokeh_timeout) {\n",
+       "      setTimeout(run_inline_js, 100);\n",
+       "    } else if (!root._bokeh_failed_load) {\n",
+       "      console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
+       "      root._bokeh_failed_load = true;\n",
+       "    } else if (force !== true) {\n",
+       "      var cell = $(document.getElementById(\"31090\")).parents('.cell').data().cell;\n",
+       "      cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
+       "    }\n",
+       "\n",
+       "  }\n",
+       "\n",
+       "  if (root._bokeh_is_loading === 0) {\n",
+       "    console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
+       "    run_inline_js();\n",
+       "  } else {\n",
+       "    load_libs(css_urls, js_urls, function() {\n",
+       "      console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n",
+       "      run_inline_js();\n",
+       "    });\n",
+       "  }\n",
+       "}(window));"
+      ],
+      "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n  function now() {\n    return new Date();\n  }\n\n  var force = true;\n\n  if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n    root._bokeh_onload_callbacks = [];\n    root._bokeh_is_loading = undefined;\n  }\n\n  \n\n  \n  if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n    root._bokeh_timeout = Date.now() + 5000;\n    root._bokeh_failed_load = false;\n  }\n\n  var NB_LOAD_WARNING = {'data': {'text/html':\n     \"<div style='background-color: #fdd'>\\n\"+\n     \"<p>\\n\"+\n     \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n     \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n     \"</p>\\n\"+\n     \"<ul>\\n\"+\n     \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n     \"<li>use INLINE resources instead, as so:</li>\\n\"+\n     \"</ul>\\n\"+\n     \"<code>\\n\"+\n     \"from bokeh.resources import INLINE\\n\"+\n     \"output_notebook(resources=INLINE)\\n\"+\n     \"</code>\\n\"+\n     \"</div>\"}};\n\n  function display_loaded() {\n    var el = document.getElementById(\"31090\");\n    if (el != null) {\n      el.textContent = \"BokehJS is loading...\";\n    }\n    if (root.Bokeh !== undefined) {\n      if (el != null) {\n        el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n      }\n    } else if (Date.now() < root._bokeh_timeout) {\n      setTimeout(display_loaded, 100)\n    }\n  }\n\n\n  function run_callbacks() {\n    try {\n      root._bokeh_onload_callbacks.forEach(function(callback) {\n        if (callback != null)\n          callback();\n      });\n    } finally {\n      delete root._bokeh_onload_callbacks\n    }\n    console.debug(\"Bokeh: all callbacks have finished\");\n  }\n\n  function load_libs(css_urls, js_urls, callback) {\n    if (css_urls == null) css_urls = [];\n    if (js_urls == null) js_urls = [];\n\n    root._bokeh_onload_callbacks.push(callback);\n    if (root._bokeh_is_loading > 0) {\n      console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n      return null;\n    }\n    if (js_urls == null || js_urls.length === 0) {\n      run_callbacks();\n      return null;\n    }\n    console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n    root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n    function on_load() {\n      root._bokeh_is_loading--;\n      if (root._bokeh_is_loading === 0) {\n        console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n        run_callbacks()\n      }\n    }\n\n    function on_error(url) {\n      console.error(\"failed to load \" + url);\n    }\n\n    for (let i = 0; i < css_urls.length; i++) {\n      const url = css_urls[i];\n      const element = document.createElement(\"link\");\n      element.onload = on_load;\n      element.onerror = on_error.bind(null, url);\n      element.rel = \"stylesheet\";\n      element.type = \"text/css\";\n      element.href = url;\n      console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n      document.body.appendChild(element);\n    }\n\n    const hashes = {\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.3.min.js\": \"dM3QQsP+wXdHg42wTqW85BjZQdLNNIXqlPw/BgKoExPmTG7ZLML4EGqLMfqHT6ON\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.3.min.js\": \"8x57I4YuIfu8XyZfFo0XVr2WAT8EK4rh/uDe3wF7YuW2FNUSNEpJbsPaB1nJ2fz2\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.3.min.js\": \"3QTqdz9LyAm2i0sG5XTePsHec3UHWwVsrOL68SYRoAXsafvfAyqtQ+h440+qIBhS\"};\n\n    for (let i = 0; i < js_urls.length; i++) {\n      const url = js_urls[i];\n      const element = document.createElement('script');\n      element.onload = on_load;\n      element.onerror = on_error.bind(null, url);\n      element.async = false;\n      element.src = url;\n      if (url in hashes) {\n        element.crossOrigin = \"anonymous\";\n        element.integrity = \"sha384-\" + hashes[url];\n      }\n      console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n      document.head.appendChild(element);\n    }\n  };\n\n  function inject_raw_css(css) {\n    const element = document.createElement(\"style\");\n    element.appendChild(document.createTextNode(css));\n    document.body.appendChild(element);\n  }\n\n  \n  var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.3.min.js\"];\n  var css_urls = [];\n  \n\n  var inline_js = [\n    function(Bokeh) {\n      Bokeh.set_log_level(\"info\");\n    },\n    function(Bokeh) {\n    \n    \n    }\n  ];\n\n  function run_inline_js() {\n    \n    if (root.Bokeh !== undefined || force === true) {\n      \n    for (var i = 0; i < inline_js.length; i++) {\n      inline_js[i].call(root, root.Bokeh);\n    }\n    if (force === true) {\n        display_loaded();\n      }} else if (Date.now() < root._bokeh_timeout) {\n      setTimeout(run_inline_js, 100);\n    } else if (!root._bokeh_failed_load) {\n      console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n      root._bokeh_failed_load = true;\n    } else if (force !== true) {\n      var cell = $(document.getElementById(\"31090\")).parents('.cell').data().cell;\n      cell.output_area.append_execute_result(NB_LOAD_WARNING)\n    }\n\n  }\n\n  if (root._bokeh_is_loading === 0) {\n    console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n    run_inline_js();\n  } else {\n    load_libs(css_urls, js_urls, function() {\n      console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n      run_inline_js();\n    });\n  }\n}(window));"
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "text/html": [
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "\n",
+       "  <div class=\"bk-root\" id=\"732e77fe-65b7-4633-9104-3bae40cc4886\" data-root-id=\"30897\"></div>\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/javascript": [
+       "(function(root) {\n",
+       "  function embed_document(root) {\n",
+       "    \n",
+       "  var docs_json = {\"665d586c-411a-47fc-8844-15f332d3038a\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"30906\"}],\"center\":[{\"id\":\"30909\"},{\"id\":\"30913\"},{\"id\":\"30944\"}],\"height\":500,\"left\":[{\"id\":\"30910\"}],\"renderers\":[{\"id\":\"30931\"},{\"id\":\"30949\"},{\"id\":\"30968\"},{\"id\":\"30989\"},{\"id\":\"31012\"},{\"id\":\"31037\"},{\"id\":\"31064\"}],\"title\":{\"id\":\"30933\"},\"toolbar\":{\"id\":\"30921\"},\"width\":1000,\"x_range\":{\"id\":\"30898\"},\"x_scale\":{\"id\":\"30902\"},\"y_range\":{\"id\":\"30900\"},\"y_scale\":{\"id\":\"30904\"}},\"id\":\"30897\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"30904\",\"type\":\"LogScale\"},{\"attributes\":{\"axis_label\":\"MHz\",\"formatter\":{\"id\":\"30940\"},\"major_label_policy\":{\"id\":\"30939\"},\"ticker\":{\"id\":\"30907\"}},\"id\":\"30906\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"30907\",\"type\":\"BasicTicker\"},{\"attributes\":{\"axis\":{\"id\":\"30906\"},\"ticker\":null},\"id\":\"30909\",\"type\":\"Grid\"},{\"attributes\":{\"axis_label\":\"power\",\"formatter\":{\"id\":\"30937\"},\"major_label_policy\":{\"id\":\"30936\"},\"ticker\":{\"id\":\"30911\"}},\"id\":\"30910\",\"type\":\"LogAxis\"},{\"attributes\":{\"num_minor_ticks\":10},\"id\":\"30911\",\"type\":\"LogTicker\"},{\"attributes\":{\"axis\":{\"id\":\"30910\"},\"dimension\":1,\"ticker\":null},\"id\":\"30913\",\"type\":\"Grid\"},{\"attributes\":{\"data_source\":{\"id\":\"30928\"},\"glyph\":{\"id\":\"30929\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"30930\"},\"view\":{\"id\":\"30932\"}},\"id\":\"30931\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"30928\"}},\"id\":\"30932\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"30914\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"30915\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"overlay\":{\"id\":\"30920\"}},\"id\":\"30916\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"30917\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"30918\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"30919\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"30961\",\"type\":\"Selection\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"brown\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"30930\",\"type\":\"Line\"},{\"attributes\":{\"active_multi\":null,\"tools\":[{\"id\":\"30914\"},{\"id\":\"30915\"},{\"id\":\"30916\"},{\"id\":\"30917\"},{\"id\":\"30918\"},{\"id\":\"30919\"}]},\"id\":\"30921\",\"type\":\"Toolbar\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"30920\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"30933\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"30936\",\"type\":\"AllLabels\"},{\"attributes\":{\"ticker\":null},\"id\":\"30937\",\"type\":\"LogTickFormatter\"},{\"attributes\":{},\"id\":\"30939\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"30940\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"data\":{\"x\":[0.0,0.1953125,0.390625,0.5859375,0.78125,0.9765625,1.171875,1.3671875,1.5625,1.7578125,1.953125,2.1484375,2.34375,2.5390625,2.734375,2.9296875,3.125,3.3203125,3.515625,3.7109375,3.90625,4.1015625,4.296875,4.4921875,4.6875,4.8828125,5.078125,5.2734375,5.46875,5.6640625,5.859375,6.0546875,6.25,6.4453125,6.640625,6.8359375,7.03125,7.2265625,7.421875,7.6171875,7.8125,8.0078125,8.203125,8.3984375,8.59375,8.7890625,8.984375,9.1796875,9.375,9.5703125,9.765625,9.9609375,10.15625,10.3515625,10.546875,10.7421875,10.9375,11.1328125,11.328125,11.5234375,11.71875,11.9140625,12.109375,12.3046875,12.5,12.6953125,12.890625,13.0859375,13.28125,13.4765625,13.671875,13.8671875,14.0625,14.2578125,14.453125,14.6484375,14.84375,15.0390625,15.234375,15.4296875,15.625,15.8203125,16.015625,16.2109375,16.40625,16.6015625,16.796875,16.9921875,17.1875,17.3828125,17.578125,17.7734375,17.96875,18.1640625,18.359375,18.5546875,18.75,18.9453125,19.140625,19.3359375,19.53125,19.7265625,19.921875,20.1171875,20.3125,20.5078125,20.703125,20.8984375,21.09375,21.2890625,21.484375,21.6796875,21.875,22.0703125,22.265625,22.4609375,22.65625,22.8515625,23.046875,23.2421875,23.4375,23.6328125,23.828125,24.0234375,24.21875,24.4140625,24.609375,24.8046875,25.0,25.1953125,25.390625,25.5859375,25.78125,25.9765625,26.171875,26.3671875,26.5625,26.7578125,26.953125,27.1484375,27.34375,27.5390625,27.734375,27.9296875,28.125,28.3203125,28.515625,28.7109375,28.90625,29.1015625,29.296875,29.4921875,29.6875,29.8828125,30.078125,30.2734375,30.46875,30.6640625,30.859375,31.0546875,31.25,31.4453125,31.640625,31.8359375,32.03125,32.2265625,32.421875,32.6171875,32.8125,33.0078125,33.203125,33.3984375,33.59375,33.7890625,33.984375,34.1796875,34.375,34.5703125,34.765625,34.9609375,35.15625,35.3515625,35.546875,35.7421875,35.9375,36.1328125,36.328125,36.5234375,36.71875,36.9140625,37.109375,37.3046875,37.5,37.6953125,37.890625,38.0859375,38.28125,38.4765625,38.671875,38.8671875,39.0625,39.2578125,39.453125,39.6484375,39.84375,40.0390625,40.234375,40.4296875,40.625,40.8203125,41.015625,41.2109375,41.40625,41.6015625,41.796875,41.9921875,42.1875,42.3828125,42.578125,42.7734375,42.96875,43.1640625,43.359375,43.5546875,43.75,43.9453125,44.140625,44.3359375,44.53125,44.7265625,44.921875,45.1171875,45.3125,45.5078125,45.703125,45.8984375,46.09375,46.2890625,46.484375,46.6796875,46.875,47.0703125,47.265625,47.4609375,47.65625,47.8515625,48.046875,48.2421875,48.4375,48.6328125,48.828125,49.0234375,49.21875,49.4140625,49.609375,49.8046875,50.0,50.1953125,50.390625,50.5859375,50.78125,50.9765625,51.171875,51.3671875,51.5625,51.7578125,51.953125,52.1484375,52.34375,52.5390625,52.734375,52.9296875,53.125,53.3203125,53.515625,53.7109375,53.90625,54.1015625,54.296875,54.4921875,54.6875,54.8828125,55.078125,55.2734375,55.46875,55.6640625,55.859375,56.0546875,56.25,56.4453125,56.640625,56.8359375,57.03125,57.2265625,57.421875,57.6171875,57.8125,58.0078125,58.203125,58.3984375,58.59375,58.7890625,58.984375,59.1796875,59.375,59.5703125,59.765625,59.9609375,60.15625,60.3515625,60.546875,60.7421875,60.9375,61.1328125,61.328125,61.5234375,61.71875,61.9140625,62.109375,62.3046875,62.5,62.6953125,62.890625,63.0859375,63.28125,63.4765625,63.671875,63.8671875,64.0625,64.2578125,64.453125,64.6484375,64.84375,65.0390625,65.234375,65.4296875,65.625,65.8203125,66.015625,66.2109375,66.40625,66.6015625,66.796875,66.9921875,67.1875,67.3828125,67.578125,67.7734375,67.96875,68.1640625,68.359375,68.5546875,68.75,68.9453125,69.140625,69.3359375,69.53125,69.7265625,69.921875,70.1171875,70.3125,70.5078125,70.703125,70.8984375,71.09375,71.2890625,71.484375,71.6796875,71.875,72.0703125,72.265625,72.4609375,72.65625,72.8515625,73.046875,73.2421875,73.4375,73.6328125,73.828125,74.0234375,74.21875,74.4140625,74.609375,74.8046875,75.0,75.1953125,75.390625,75.5859375,75.78125,75.9765625,76.171875,76.3671875,76.5625,76.7578125,76.953125,77.1484375,77.34375,77.5390625,77.734375,77.9296875,78.125,78.3203125,78.515625,78.7109375,78.90625,79.1015625,79.296875,79.4921875,79.6875,79.8828125,80.078125,80.2734375,80.46875,80.6640625,80.859375,81.0546875,81.25,81.4453125,81.640625,81.8359375,82.03125,82.2265625,82.421875,82.6171875,82.8125,83.0078125,83.203125,83.3984375,83.59375,83.7890625,83.984375,84.1796875,84.375,84.5703125,84.765625,84.9609375,85.15625,85.3515625,85.546875,85.7421875,85.9375,86.1328125,86.328125,86.5234375,86.71875,86.9140625,87.109375,87.3046875,87.5,87.6953125,87.890625,88.0859375,88.28125,88.4765625,88.671875,88.8671875,89.0625,89.2578125,89.453125,89.6484375,89.84375,90.0390625,90.234375,90.4296875,90.625,90.8203125,91.015625,91.2109375,91.40625,91.6015625,91.796875,91.9921875,92.1875,92.3828125,92.578125,92.7734375,92.96875,93.1640625,93.359375,93.5546875,93.75,93.9453125,94.140625,94.3359375,94.53125,94.7265625,94.921875,95.1171875,95.3125,95.5078125,95.703125,95.8984375,96.09375,96.2890625,96.484375,96.6796875,96.875,97.0703125,97.265625,97.4609375,97.65625,97.8515625,98.046875,98.2421875,98.4375,98.6328125,98.828125,99.0234375,99.21875,99.4140625,99.609375,99.8046875],\"y\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,532157,25,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13313912,91696270071,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,806025,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,437811,61,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,29,585376,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]},\"selected\":{\"id\":\"30982\"},\"selection_policy\":{\"id\":\"30983\"}},\"id\":\"30965\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"30962\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"label\":{\"value\":\"input 97\"},\"renderers\":[{\"id\":\"30949\"}]},\"id\":\"30964\",\"type\":\"LegendItem\"},{\"attributes\":{\"data\":{\"x\":[0.0,0.1953125,0.390625,0.5859375,0.78125,0.9765625,1.171875,1.3671875,1.5625,1.7578125,1.953125,2.1484375,2.34375,2.5390625,2.734375,2.9296875,3.125,3.3203125,3.515625,3.7109375,3.90625,4.1015625,4.296875,4.4921875,4.6875,4.8828125,5.078125,5.2734375,5.46875,5.6640625,5.859375,6.0546875,6.25,6.4453125,6.640625,6.8359375,7.03125,7.2265625,7.421875,7.6171875,7.8125,8.0078125,8.203125,8.3984375,8.59375,8.7890625,8.984375,9.1796875,9.375,9.5703125,9.765625,9.9609375,10.15625,10.3515625,10.546875,10.7421875,10.9375,11.1328125,11.328125,11.5234375,11.71875,11.9140625,12.109375,12.3046875,12.5,12.6953125,12.890625,13.0859375,13.28125,13.4765625,13.671875,13.8671875,14.0625,14.2578125,14.453125,14.6484375,14.84375,15.0390625,15.234375,15.4296875,15.625,15.8203125,16.015625,16.2109375,16.40625,16.6015625,16.796875,16.9921875,17.1875,17.3828125,17.578125,17.7734375,17.96875,18.1640625,18.359375,18.5546875,18.75,18.9453125,19.140625,19.3359375,19.53125,19.7265625,19.921875,20.1171875,20.3125,20.5078125,20.703125,20.8984375,21.09375,21.2890625,21.484375,21.6796875,21.875,22.0703125,22.265625,22.4609375,22.65625,22.8515625,23.046875,23.2421875,23.4375,23.6328125,23.828125,24.0234375,24.21875,24.4140625,24.609375,24.8046875,25.0,25.1953125,25.390625,25.5859375,25.78125,25.9765625,26.171875,26.3671875,26.5625,26.7578125,26.953125,27.1484375,27.34375,27.5390625,27.734375,27.9296875,28.125,28.3203125,28.515625,28.7109375,28.90625,29.1015625,29.296875,29.4921875,29.6875,29.8828125,30.078125,30.2734375,30.46875,30.6640625,30.859375,31.0546875,31.25,31.4453125,31.640625,31.8359375,32.03125,32.2265625,32.421875,32.6171875,32.8125,33.0078125,33.203125,33.3984375,33.59375,33.7890625,33.984375,34.1796875,34.375,34.5703125,34.765625,34.9609375,35.15625,35.3515625,35.546875,35.7421875,35.9375,36.1328125,36.328125,36.5234375,36.71875,36.9140625,37.109375,37.3046875,37.5,37.6953125,37.890625,38.0859375,38.28125,38.4765625,38.671875,38.8671875,39.0625,39.2578125,39.453125,39.6484375,39.84375,40.0390625,40.234375,40.4296875,40.625,40.8203125,41.015625,41.2109375,41.40625,41.6015625,41.796875,41.9921875,42.1875,42.3828125,42.578125,42.7734375,42.96875,43.1640625,43.359375,43.5546875,43.75,43.9453125,44.140625,44.3359375,44.53125,44.7265625,44.921875,45.1171875,45.3125,45.5078125,45.703125,45.8984375,46.09375,46.2890625,46.484375,46.6796875,46.875,47.0703125,47.265625,47.4609375,47.65625,47.8515625,48.046875,48.2421875,48.4375,48.6328125,48.828125,49.0234375,49.21875,49.4140625,49.609375,49.8046875,50.0,50.1953125,50.390625,50.5859375,50.78125,50.9765625,51.171875,51.3671875,51.5625,51.7578125,51.953125,52.1484375,52.34375,52.5390625,52.734375,52.9296875,53.125,53.3203125,53.515625,53.7109375,53.90625,54.1015625,54.296875,54.4921875,54.6875,54.8828125,55.078125,55.2734375,55.46875,55.6640625,55.859375,56.0546875,56.25,56.4453125,56.640625,56.8359375,57.03125,57.2265625,57.421875,57.6171875,57.8125,58.0078125,58.203125,58.3984375,58.59375,58.7890625,58.984375,59.1796875,59.375,59.5703125,59.765625,59.9609375,60.15625,60.3515625,60.546875,60.7421875,60.9375,61.1328125,61.328125,61.5234375,61.71875,61.9140625,62.109375,62.3046875,62.5,62.6953125,62.890625,63.0859375,63.28125,63.4765625,63.671875,63.8671875,64.0625,64.2578125,64.453125,64.6484375,64.84375,65.0390625,65.234375,65.4296875,65.625,65.8203125,66.015625,66.2109375,66.40625,66.6015625,66.796875,66.9921875,67.1875,67.3828125,67.578125,67.7734375,67.96875,68.1640625,68.359375,68.5546875,68.75,68.9453125,69.140625,69.3359375,69.53125,69.7265625,69.921875,70.1171875,70.3125,70.5078125,70.703125,70.8984375,71.09375,71.2890625,71.484375,71.6796875,71.875,72.0703125,72.265625,72.4609375,72.65625,72.8515625,73.046875,73.2421875,73.4375,73.6328125,73.828125,74.0234375,74.21875,74.4140625,74.609375,74.8046875,75.0,75.1953125,75.390625,75.5859375,75.78125,75.9765625,76.171875,76.3671875,76.5625,76.7578125,76.953125,77.1484375,77.34375,77.5390625,77.734375,77.9296875,78.125,78.3203125,78.515625,78.7109375,78.90625,79.1015625,79.296875,79.4921875,79.6875,79.8828125,80.078125,80.2734375,80.46875,80.6640625,80.859375,81.0546875,81.25,81.4453125,81.640625,81.8359375,82.03125,82.2265625,82.421875,82.6171875,82.8125,83.0078125,83.203125,83.3984375,83.59375,83.7890625,83.984375,84.1796875,84.375,84.5703125,84.765625,84.9609375,85.15625,85.3515625,85.546875,85.7421875,85.9375,86.1328125,86.328125,86.5234375,86.71875,86.9140625,87.109375,87.3046875,87.5,87.6953125,87.890625,88.0859375,88.28125,88.4765625,88.671875,88.8671875,89.0625,89.2578125,89.453125,89.6484375,89.84375,90.0390625,90.234375,90.4296875,90.625,90.8203125,91.015625,91.2109375,91.40625,91.6015625,91.796875,91.9921875,92.1875,92.3828125,92.578125,92.7734375,92.96875,93.1640625,93.359375,93.5546875,93.75,93.9453125,94.140625,94.3359375,94.53125,94.7265625,94.921875,95.1171875,95.3125,95.5078125,95.703125,95.8984375,96.09375,96.2890625,96.484375,96.6796875,96.875,97.0703125,97.265625,97.4609375,97.65625,97.8515625,98.046875,98.2421875,98.4375,98.6328125,98.828125,99.0234375,99.21875,99.4140625,99.609375,99.8046875],\"y\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,532971,35,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13323154,91712329570,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,806025,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,444268,61,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,29,596600,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]},\"selected\":{\"id\":\"30961\"},\"selection_policy\":{\"id\":\"30962\"}},\"id\":\"30946\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"data\":{\"x\":[0.0,0.1953125,0.390625,0.5859375,0.78125,0.9765625,1.171875,1.3671875,1.5625,1.7578125,1.953125,2.1484375,2.34375,2.5390625,2.734375,2.9296875,3.125,3.3203125,3.515625,3.7109375,3.90625,4.1015625,4.296875,4.4921875,4.6875,4.8828125,5.078125,5.2734375,5.46875,5.6640625,5.859375,6.0546875,6.25,6.4453125,6.640625,6.8359375,7.03125,7.2265625,7.421875,7.6171875,7.8125,8.0078125,8.203125,8.3984375,8.59375,8.7890625,8.984375,9.1796875,9.375,9.5703125,9.765625,9.9609375,10.15625,10.3515625,10.546875,10.7421875,10.9375,11.1328125,11.328125,11.5234375,11.71875,11.9140625,12.109375,12.3046875,12.5,12.6953125,12.890625,13.0859375,13.28125,13.4765625,13.671875,13.8671875,14.0625,14.2578125,14.453125,14.6484375,14.84375,15.0390625,15.234375,15.4296875,15.625,15.8203125,16.015625,16.2109375,16.40625,16.6015625,16.796875,16.9921875,17.1875,17.3828125,17.578125,17.7734375,17.96875,18.1640625,18.359375,18.5546875,18.75,18.9453125,19.140625,19.3359375,19.53125,19.7265625,19.921875,20.1171875,20.3125,20.5078125,20.703125,20.8984375,21.09375,21.2890625,21.484375,21.6796875,21.875,22.0703125,22.265625,22.4609375,22.65625,22.8515625,23.046875,23.2421875,23.4375,23.6328125,23.828125,24.0234375,24.21875,24.4140625,24.609375,24.8046875,25.0,25.1953125,25.390625,25.5859375,25.78125,25.9765625,26.171875,26.3671875,26.5625,26.7578125,26.953125,27.1484375,27.34375,27.5390625,27.734375,27.9296875,28.125,28.3203125,28.515625,28.7109375,28.90625,29.1015625,29.296875,29.4921875,29.6875,29.8828125,30.078125,30.2734375,30.46875,30.6640625,30.859375,31.0546875,31.25,31.4453125,31.640625,31.8359375,32.03125,32.2265625,32.421875,32.6171875,32.8125,33.0078125,33.203125,33.3984375,33.59375,33.7890625,33.984375,34.1796875,34.375,34.5703125,34.765625,34.9609375,35.15625,35.3515625,35.546875,35.7421875,35.9375,36.1328125,36.328125,36.5234375,36.71875,36.9140625,37.109375,37.3046875,37.5,37.6953125,37.890625,38.0859375,38.28125,38.4765625,38.671875,38.8671875,39.0625,39.2578125,39.453125,39.6484375,39.84375,40.0390625,40.234375,40.4296875,40.625,40.8203125,41.015625,41.2109375,41.40625,41.6015625,41.796875,41.9921875,42.1875,42.3828125,42.578125,42.7734375,42.96875,43.1640625,43.359375,43.5546875,43.75,43.9453125,44.140625,44.3359375,44.53125,44.7265625,44.921875,45.1171875,45.3125,45.5078125,45.703125,45.8984375,46.09375,46.2890625,46.484375,46.6796875,46.875,47.0703125,47.265625,47.4609375,47.65625,47.8515625,48.046875,48.2421875,48.4375,48.6328125,48.828125,49.0234375,49.21875,49.4140625,49.609375,49.8046875,50.0,50.1953125,50.390625,50.5859375,50.78125,50.9765625,51.171875,51.3671875,51.5625,51.7578125,51.953125,52.1484375,52.34375,52.5390625,52.734375,52.9296875,53.125,53.3203125,53.515625,53.7109375,53.90625,54.1015625,54.296875,54.4921875,54.6875,54.8828125,55.078125,55.2734375,55.46875,55.6640625,55.859375,56.0546875,56.25,56.4453125,56.640625,56.8359375,57.03125,57.2265625,57.421875,57.6171875,57.8125,58.0078125,58.203125,58.3984375,58.59375,58.7890625,58.984375,59.1796875,59.375,59.5703125,59.765625,59.9609375,60.15625,60.3515625,60.546875,60.7421875,60.9375,61.1328125,61.328125,61.5234375,61.71875,61.9140625,62.109375,62.3046875,62.5,62.6953125,62.890625,63.0859375,63.28125,63.4765625,63.671875,63.8671875,64.0625,64.2578125,64.453125,64.6484375,64.84375,65.0390625,65.234375,65.4296875,65.625,65.8203125,66.015625,66.2109375,66.40625,66.6015625,66.796875,66.9921875,67.1875,67.3828125,67.578125,67.7734375,67.96875,68.1640625,68.359375,68.5546875,68.75,68.9453125,69.140625,69.3359375,69.53125,69.7265625,69.921875,70.1171875,70.3125,70.5078125,70.703125,70.8984375,71.09375,71.2890625,71.484375,71.6796875,71.875,72.0703125,72.265625,72.4609375,72.65625,72.8515625,73.046875,73.2421875,73.4375,73.6328125,73.828125,74.0234375,74.21875,74.4140625,74.609375,74.8046875,75.0,75.1953125,75.390625,75.5859375,75.78125,75.9765625,76.171875,76.3671875,76.5625,76.7578125,76.953125,77.1484375,77.34375,77.5390625,77.734375,77.9296875,78.125,78.3203125,78.515625,78.7109375,78.90625,79.1015625,79.296875,79.4921875,79.6875,79.8828125,80.078125,80.2734375,80.46875,80.6640625,80.859375,81.0546875,81.25,81.4453125,81.640625,81.8359375,82.03125,82.2265625,82.421875,82.6171875,82.8125,83.0078125,83.203125,83.3984375,83.59375,83.7890625,83.984375,84.1796875,84.375,84.5703125,84.765625,84.9609375,85.15625,85.3515625,85.546875,85.7421875,85.9375,86.1328125,86.328125,86.5234375,86.71875,86.9140625,87.109375,87.3046875,87.5,87.6953125,87.890625,88.0859375,88.28125,88.4765625,88.671875,88.8671875,89.0625,89.2578125,89.453125,89.6484375,89.84375,90.0390625,90.234375,90.4296875,90.625,90.8203125,91.015625,91.2109375,91.40625,91.6015625,91.796875,91.9921875,92.1875,92.3828125,92.578125,92.7734375,92.96875,93.1640625,93.359375,93.5546875,93.75,93.9453125,94.140625,94.3359375,94.53125,94.7265625,94.921875,95.1171875,95.3125,95.5078125,95.703125,95.8984375,96.09375,96.2890625,96.484375,96.6796875,96.875,97.0703125,97.265625,97.4609375,97.65625,97.8515625,98.046875,98.2421875,98.4375,98.6328125,98.828125,99.0234375,99.21875,99.4140625,99.609375,99.8046875],\"y\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,532971,35,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13323154,91712329570,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,806025,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,444268,61,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,29,596600,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]},\"selected\":{\"id\":\"31005\"},\"selection_policy\":{\"id\":\"31006\"}},\"id\":\"30986\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"source\":{\"id\":\"30965\"}},\"id\":\"30969\",\"type\":\"CDSView\"},{\"attributes\":{\"data_source\":{\"id\":\"30965\"},\"glyph\":{\"id\":\"30966\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"30967\"},\"view\":{\"id\":\"30969\"}},\"id\":\"30968\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":0.1,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"30967\",\"type\":\"Line\"},{\"attributes\":{\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"30966\",\"type\":\"Line\"},{\"attributes\":{\"label\":{\"value\":\"input 96\"},\"renderers\":[{\"id\":\"30931\"}]},\"id\":\"30945\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"30982\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"30941\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"30942\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"30983\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"items\":[{\"id\":\"30945\"},{\"id\":\"30964\"},{\"id\":\"30985\"},{\"id\":\"31008\"},{\"id\":\"31033\"},{\"id\":\"31060\"},{\"id\":\"31089\"}]},\"id\":\"30944\",\"type\":\"Legend\"},{\"attributes\":{\"label\":{\"value\":\"input 98\"},\"renderers\":[{\"id\":\"30968\"}]},\"id\":\"30985\",\"type\":\"LegendItem\"},{\"attributes\":{\"data\":{\"x\":[0.0,0.1953125,0.390625,0.5859375,0.78125,0.9765625,1.171875,1.3671875,1.5625,1.7578125,1.953125,2.1484375,2.34375,2.5390625,2.734375,2.9296875,3.125,3.3203125,3.515625,3.7109375,3.90625,4.1015625,4.296875,4.4921875,4.6875,4.8828125,5.078125,5.2734375,5.46875,5.6640625,5.859375,6.0546875,6.25,6.4453125,6.640625,6.8359375,7.03125,7.2265625,7.421875,7.6171875,7.8125,8.0078125,8.203125,8.3984375,8.59375,8.7890625,8.984375,9.1796875,9.375,9.5703125,9.765625,9.9609375,10.15625,10.3515625,10.546875,10.7421875,10.9375,11.1328125,11.328125,11.5234375,11.71875,11.9140625,12.109375,12.3046875,12.5,12.6953125,12.890625,13.0859375,13.28125,13.4765625,13.671875,13.8671875,14.0625,14.2578125,14.453125,14.6484375,14.84375,15.0390625,15.234375,15.4296875,15.625,15.8203125,16.015625,16.2109375,16.40625,16.6015625,16.796875,16.9921875,17.1875,17.3828125,17.578125,17.7734375,17.96875,18.1640625,18.359375,18.5546875,18.75,18.9453125,19.140625,19.3359375,19.53125,19.7265625,19.921875,20.1171875,20.3125,20.5078125,20.703125,20.8984375,21.09375,21.2890625,21.484375,21.6796875,21.875,22.0703125,22.265625,22.4609375,22.65625,22.8515625,23.046875,23.2421875,23.4375,23.6328125,23.828125,24.0234375,24.21875,24.4140625,24.609375,24.8046875,25.0,25.1953125,25.390625,25.5859375,25.78125,25.9765625,26.171875,26.3671875,26.5625,26.7578125,26.953125,27.1484375,27.34375,27.5390625,27.734375,27.9296875,28.125,28.3203125,28.515625,28.7109375,28.90625,29.1015625,29.296875,29.4921875,29.6875,29.8828125,30.078125,30.2734375,30.46875,30.6640625,30.859375,31.0546875,31.25,31.4453125,31.640625,31.8359375,32.03125,32.2265625,32.421875,32.6171875,32.8125,33.0078125,33.203125,33.3984375,33.59375,33.7890625,33.984375,34.1796875,34.375,34.5703125,34.765625,34.9609375,35.15625,35.3515625,35.546875,35.7421875,35.9375,36.1328125,36.328125,36.5234375,36.71875,36.9140625,37.109375,37.3046875,37.5,37.6953125,37.890625,38.0859375,38.28125,38.4765625,38.671875,38.8671875,39.0625,39.2578125,39.453125,39.6484375,39.84375,40.0390625,40.234375,40.4296875,40.625,40.8203125,41.015625,41.2109375,41.40625,41.6015625,41.796875,41.9921875,42.1875,42.3828125,42.578125,42.7734375,42.96875,43.1640625,43.359375,43.5546875,43.75,43.9453125,44.140625,44.3359375,44.53125,44.7265625,44.921875,45.1171875,45.3125,45.5078125,45.703125,45.8984375,46.09375,46.2890625,46.484375,46.6796875,46.875,47.0703125,47.265625,47.4609375,47.65625,47.8515625,48.046875,48.2421875,48.4375,48.6328125,48.828125,49.0234375,49.21875,49.4140625,49.609375,49.8046875,50.0,50.1953125,50.390625,50.5859375,50.78125,50.9765625,51.171875,51.3671875,51.5625,51.7578125,51.953125,52.1484375,52.34375,52.5390625,52.734375,52.9296875,53.125,53.3203125,53.515625,53.7109375,53.90625,54.1015625,54.296875,54.4921875,54.6875,54.8828125,55.078125,55.2734375,55.46875,55.6640625,55.859375,56.0546875,56.25,56.4453125,56.640625,56.8359375,57.03125,57.2265625,57.421875,57.6171875,57.8125,58.0078125,58.203125,58.3984375,58.59375,58.7890625,58.984375,59.1796875,59.375,59.5703125,59.765625,59.9609375,60.15625,60.3515625,60.546875,60.7421875,60.9375,61.1328125,61.328125,61.5234375,61.71875,61.9140625,62.109375,62.3046875,62.5,62.6953125,62.890625,63.0859375,63.28125,63.4765625,63.671875,63.8671875,64.0625,64.2578125,64.453125,64.6484375,64.84375,65.0390625,65.234375,65.4296875,65.625,65.8203125,66.015625,66.2109375,66.40625,66.6015625,66.796875,66.9921875,67.1875,67.3828125,67.578125,67.7734375,67.96875,68.1640625,68.359375,68.5546875,68.75,68.9453125,69.140625,69.3359375,69.53125,69.7265625,69.921875,70.1171875,70.3125,70.5078125,70.703125,70.8984375,71.09375,71.2890625,71.484375,71.6796875,71.875,72.0703125,72.265625,72.4609375,72.65625,72.8515625,73.046875,73.2421875,73.4375,73.6328125,73.828125,74.0234375,74.21875,74.4140625,74.609375,74.8046875,75.0,75.1953125,75.390625,75.5859375,75.78125,75.9765625,76.171875,76.3671875,76.5625,76.7578125,76.953125,77.1484375,77.34375,77.5390625,77.734375,77.9296875,78.125,78.3203125,78.515625,78.7109375,78.90625,79.1015625,79.296875,79.4921875,79.6875,79.8828125,80.078125,80.2734375,80.46875,80.6640625,80.859375,81.0546875,81.25,81.4453125,81.640625,81.8359375,82.03125,82.2265625,82.421875,82.6171875,82.8125,83.0078125,83.203125,83.3984375,83.59375,83.7890625,83.984375,84.1796875,84.375,84.5703125,84.765625,84.9609375,85.15625,85.3515625,85.546875,85.7421875,85.9375,86.1328125,86.328125,86.5234375,86.71875,86.9140625,87.109375,87.3046875,87.5,87.6953125,87.890625,88.0859375,88.28125,88.4765625,88.671875,88.8671875,89.0625,89.2578125,89.453125,89.6484375,89.84375,90.0390625,90.234375,90.4296875,90.625,90.8203125,91.015625,91.2109375,91.40625,91.6015625,91.796875,91.9921875,92.1875,92.3828125,92.578125,92.7734375,92.96875,93.1640625,93.359375,93.5546875,93.75,93.9453125,94.140625,94.3359375,94.53125,94.7265625,94.921875,95.1171875,95.3125,95.5078125,95.703125,95.8984375,96.09375,96.2890625,96.484375,96.6796875,96.875,97.0703125,97.265625,97.4609375,97.65625,97.8515625,98.046875,98.2421875,98.4375,98.6328125,98.828125,99.0234375,99.21875,99.4140625,99.609375,99.8046875],\"y\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,532157,25,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13313912,91696270071,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,806025,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,437811,61,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,29,585376,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]},\"selected\":{\"id\":\"31030\"},\"selection_policy\":{\"id\":\"31031\"}},\"id\":\"31009\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"source\":{\"id\":\"30986\"}},\"id\":\"30990\",\"type\":\"CDSView\"},{\"attributes\":{\"data_source\":{\"id\":\"30986\"},\"glyph\":{\"id\":\"30987\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"30988\"},\"view\":{\"id\":\"30990\"}},\"id\":\"30989\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"pink\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"30988\",\"type\":\"Line\"},{\"attributes\":{\"line_color\":\"pink\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"30987\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"30900\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"31005\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"31006\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"source\":{\"id\":\"30946\"}},\"id\":\"30950\",\"type\":\"CDSView\"},{\"attributes\":{\"label\":{\"value\":\"input 99\"},\"renderers\":[{\"id\":\"30989\"}]},\"id\":\"31008\",\"type\":\"LegendItem\"},{\"attributes\":{\"data\":{\"x\":[0.0,0.1953125,0.390625,0.5859375,0.78125,0.9765625,1.171875,1.3671875,1.5625,1.7578125,1.953125,2.1484375,2.34375,2.5390625,2.734375,2.9296875,3.125,3.3203125,3.515625,3.7109375,3.90625,4.1015625,4.296875,4.4921875,4.6875,4.8828125,5.078125,5.2734375,5.46875,5.6640625,5.859375,6.0546875,6.25,6.4453125,6.640625,6.8359375,7.03125,7.2265625,7.421875,7.6171875,7.8125,8.0078125,8.203125,8.3984375,8.59375,8.7890625,8.984375,9.1796875,9.375,9.5703125,9.765625,9.9609375,10.15625,10.3515625,10.546875,10.7421875,10.9375,11.1328125,11.328125,11.5234375,11.71875,11.9140625,12.109375,12.3046875,12.5,12.6953125,12.890625,13.0859375,13.28125,13.4765625,13.671875,13.8671875,14.0625,14.2578125,14.453125,14.6484375,14.84375,15.0390625,15.234375,15.4296875,15.625,15.8203125,16.015625,16.2109375,16.40625,16.6015625,16.796875,16.9921875,17.1875,17.3828125,17.578125,17.7734375,17.96875,18.1640625,18.359375,18.5546875,18.75,18.9453125,19.140625,19.3359375,19.53125,19.7265625,19.921875,20.1171875,20.3125,20.5078125,20.703125,20.8984375,21.09375,21.2890625,21.484375,21.6796875,21.875,22.0703125,22.265625,22.4609375,22.65625,22.8515625,23.046875,23.2421875,23.4375,23.6328125,23.828125,24.0234375,24.21875,24.4140625,24.609375,24.8046875,25.0,25.1953125,25.390625,25.5859375,25.78125,25.9765625,26.171875,26.3671875,26.5625,26.7578125,26.953125,27.1484375,27.34375,27.5390625,27.734375,27.9296875,28.125,28.3203125,28.515625,28.7109375,28.90625,29.1015625,29.296875,29.4921875,29.6875,29.8828125,30.078125,30.2734375,30.46875,30.6640625,30.859375,31.0546875,31.25,31.4453125,31.640625,31.8359375,32.03125,32.2265625,32.421875,32.6171875,32.8125,33.0078125,33.203125,33.3984375,33.59375,33.7890625,33.984375,34.1796875,34.375,34.5703125,34.765625,34.9609375,35.15625,35.3515625,35.546875,35.7421875,35.9375,36.1328125,36.328125,36.5234375,36.71875,36.9140625,37.109375,37.3046875,37.5,37.6953125,37.890625,38.0859375,38.28125,38.4765625,38.671875,38.8671875,39.0625,39.2578125,39.453125,39.6484375,39.84375,40.0390625,40.234375,40.4296875,40.625,40.8203125,41.015625,41.2109375,41.40625,41.6015625,41.796875,41.9921875,42.1875,42.3828125,42.578125,42.7734375,42.96875,43.1640625,43.359375,43.5546875,43.75,43.9453125,44.140625,44.3359375,44.53125,44.7265625,44.921875,45.1171875,45.3125,45.5078125,45.703125,45.8984375,46.09375,46.2890625,46.484375,46.6796875,46.875,47.0703125,47.265625,47.4609375,47.65625,47.8515625,48.046875,48.2421875,48.4375,48.6328125,48.828125,49.0234375,49.21875,49.4140625,49.609375,49.8046875,50.0,50.1953125,50.390625,50.5859375,50.78125,50.9765625,51.171875,51.3671875,51.5625,51.7578125,51.953125,52.1484375,52.34375,52.5390625,52.734375,52.9296875,53.125,53.3203125,53.515625,53.7109375,53.90625,54.1015625,54.296875,54.4921875,54.6875,54.8828125,55.078125,55.2734375,55.46875,55.6640625,55.859375,56.0546875,56.25,56.4453125,56.640625,56.8359375,57.03125,57.2265625,57.421875,57.6171875,57.8125,58.0078125,58.203125,58.3984375,58.59375,58.7890625,58.984375,59.1796875,59.375,59.5703125,59.765625,59.9609375,60.15625,60.3515625,60.546875,60.7421875,60.9375,61.1328125,61.328125,61.5234375,61.71875,61.9140625,62.109375,62.3046875,62.5,62.6953125,62.890625,63.0859375,63.28125,63.4765625,63.671875,63.8671875,64.0625,64.2578125,64.453125,64.6484375,64.84375,65.0390625,65.234375,65.4296875,65.625,65.8203125,66.015625,66.2109375,66.40625,66.6015625,66.796875,66.9921875,67.1875,67.3828125,67.578125,67.7734375,67.96875,68.1640625,68.359375,68.5546875,68.75,68.9453125,69.140625,69.3359375,69.53125,69.7265625,69.921875,70.1171875,70.3125,70.5078125,70.703125,70.8984375,71.09375,71.2890625,71.484375,71.6796875,71.875,72.0703125,72.265625,72.4609375,72.65625,72.8515625,73.046875,73.2421875,73.4375,73.6328125,73.828125,74.0234375,74.21875,74.4140625,74.609375,74.8046875,75.0,75.1953125,75.390625,75.5859375,75.78125,75.9765625,76.171875,76.3671875,76.5625,76.7578125,76.953125,77.1484375,77.34375,77.5390625,77.734375,77.9296875,78.125,78.3203125,78.515625,78.7109375,78.90625,79.1015625,79.296875,79.4921875,79.6875,79.8828125,80.078125,80.2734375,80.46875,80.6640625,80.859375,81.0546875,81.25,81.4453125,81.640625,81.8359375,82.03125,82.2265625,82.421875,82.6171875,82.8125,83.0078125,83.203125,83.3984375,83.59375,83.7890625,83.984375,84.1796875,84.375,84.5703125,84.765625,84.9609375,85.15625,85.3515625,85.546875,85.7421875,85.9375,86.1328125,86.328125,86.5234375,86.71875,86.9140625,87.109375,87.3046875,87.5,87.6953125,87.890625,88.0859375,88.28125,88.4765625,88.671875,88.8671875,89.0625,89.2578125,89.453125,89.6484375,89.84375,90.0390625,90.234375,90.4296875,90.625,90.8203125,91.015625,91.2109375,91.40625,91.6015625,91.796875,91.9921875,92.1875,92.3828125,92.578125,92.7734375,92.96875,93.1640625,93.359375,93.5546875,93.75,93.9453125,94.140625,94.3359375,94.53125,94.7265625,94.921875,95.1171875,95.3125,95.5078125,95.703125,95.8984375,96.09375,96.2890625,96.484375,96.6796875,96.875,97.0703125,97.265625,97.4609375,97.65625,97.8515625,98.046875,98.2421875,98.4375,98.6328125,98.828125,99.0234375,99.21875,99.4140625,99.609375,99.8046875],\"y\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,532971,35,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13323154,91712329570,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,806025,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,444268,61,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,29,596600,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]},\"selected\":{\"id\":\"31057\"},\"selection_policy\":{\"id\":\"31058\"}},\"id\":\"31034\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"source\":{\"id\":\"31009\"}},\"id\":\"31013\",\"type\":\"CDSView\"},{\"attributes\":{\"data_source\":{\"id\":\"31009\"},\"glyph\":{\"id\":\"31010\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"31011\"},\"view\":{\"id\":\"31013\"}},\"id\":\"31012\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"darkblue\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"31011\",\"type\":\"Line\"},{\"attributes\":{\"line_color\":\"darkblue\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"31010\",\"type\":\"Line\"},{\"attributes\":{\"data_source\":{\"id\":\"30946\"},\"glyph\":{\"id\":\"30947\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"30948\"},\"view\":{\"id\":\"30950\"}},\"id\":\"30949\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"30898\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"31030\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"31031\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"label\":{\"value\":\"input 100\"},\"renderers\":[{\"id\":\"31012\"}]},\"id\":\"31033\",\"type\":\"LegendItem\"},{\"attributes\":{\"data\":{\"x\":[0.0,0.1953125,0.390625,0.5859375,0.78125,0.9765625,1.171875,1.3671875,1.5625,1.7578125,1.953125,2.1484375,2.34375,2.5390625,2.734375,2.9296875,3.125,3.3203125,3.515625,3.7109375,3.90625,4.1015625,4.296875,4.4921875,4.6875,4.8828125,5.078125,5.2734375,5.46875,5.6640625,5.859375,6.0546875,6.25,6.4453125,6.640625,6.8359375,7.03125,7.2265625,7.421875,7.6171875,7.8125,8.0078125,8.203125,8.3984375,8.59375,8.7890625,8.984375,9.1796875,9.375,9.5703125,9.765625,9.9609375,10.15625,10.3515625,10.546875,10.7421875,10.9375,11.1328125,11.328125,11.5234375,11.71875,11.9140625,12.109375,12.3046875,12.5,12.6953125,12.890625,13.0859375,13.28125,13.4765625,13.671875,13.8671875,14.0625,14.2578125,14.453125,14.6484375,14.84375,15.0390625,15.234375,15.4296875,15.625,15.8203125,16.015625,16.2109375,16.40625,16.6015625,16.796875,16.9921875,17.1875,17.3828125,17.578125,17.7734375,17.96875,18.1640625,18.359375,18.5546875,18.75,18.9453125,19.140625,19.3359375,19.53125,19.7265625,19.921875,20.1171875,20.3125,20.5078125,20.703125,20.8984375,21.09375,21.2890625,21.484375,21.6796875,21.875,22.0703125,22.265625,22.4609375,22.65625,22.8515625,23.046875,23.2421875,23.4375,23.6328125,23.828125,24.0234375,24.21875,24.4140625,24.609375,24.8046875,25.0,25.1953125,25.390625,25.5859375,25.78125,25.9765625,26.171875,26.3671875,26.5625,26.7578125,26.953125,27.1484375,27.34375,27.5390625,27.734375,27.9296875,28.125,28.3203125,28.515625,28.7109375,28.90625,29.1015625,29.296875,29.4921875,29.6875,29.8828125,30.078125,30.2734375,30.46875,30.6640625,30.859375,31.0546875,31.25,31.4453125,31.640625,31.8359375,32.03125,32.2265625,32.421875,32.6171875,32.8125,33.0078125,33.203125,33.3984375,33.59375,33.7890625,33.984375,34.1796875,34.375,34.5703125,34.765625,34.9609375,35.15625,35.3515625,35.546875,35.7421875,35.9375,36.1328125,36.328125,36.5234375,36.71875,36.9140625,37.109375,37.3046875,37.5,37.6953125,37.890625,38.0859375,38.28125,38.4765625,38.671875,38.8671875,39.0625,39.2578125,39.453125,39.6484375,39.84375,40.0390625,40.234375,40.4296875,40.625,40.8203125,41.015625,41.2109375,41.40625,41.6015625,41.796875,41.9921875,42.1875,42.3828125,42.578125,42.7734375,42.96875,43.1640625,43.359375,43.5546875,43.75,43.9453125,44.140625,44.3359375,44.53125,44.7265625,44.921875,45.1171875,45.3125,45.5078125,45.703125,45.8984375,46.09375,46.2890625,46.484375,46.6796875,46.875,47.0703125,47.265625,47.4609375,47.65625,47.8515625,48.046875,48.2421875,48.4375,48.6328125,48.828125,49.0234375,49.21875,49.4140625,49.609375,49.8046875,50.0,50.1953125,50.390625,50.5859375,50.78125,50.9765625,51.171875,51.3671875,51.5625,51.7578125,51.953125,52.1484375,52.34375,52.5390625,52.734375,52.9296875,53.125,53.3203125,53.515625,53.7109375,53.90625,54.1015625,54.296875,54.4921875,54.6875,54.8828125,55.078125,55.2734375,55.46875,55.6640625,55.859375,56.0546875,56.25,56.4453125,56.640625,56.8359375,57.03125,57.2265625,57.421875,57.6171875,57.8125,58.0078125,58.203125,58.3984375,58.59375,58.7890625,58.984375,59.1796875,59.375,59.5703125,59.765625,59.9609375,60.15625,60.3515625,60.546875,60.7421875,60.9375,61.1328125,61.328125,61.5234375,61.71875,61.9140625,62.109375,62.3046875,62.5,62.6953125,62.890625,63.0859375,63.28125,63.4765625,63.671875,63.8671875,64.0625,64.2578125,64.453125,64.6484375,64.84375,65.0390625,65.234375,65.4296875,65.625,65.8203125,66.015625,66.2109375,66.40625,66.6015625,66.796875,66.9921875,67.1875,67.3828125,67.578125,67.7734375,67.96875,68.1640625,68.359375,68.5546875,68.75,68.9453125,69.140625,69.3359375,69.53125,69.7265625,69.921875,70.1171875,70.3125,70.5078125,70.703125,70.8984375,71.09375,71.2890625,71.484375,71.6796875,71.875,72.0703125,72.265625,72.4609375,72.65625,72.8515625,73.046875,73.2421875,73.4375,73.6328125,73.828125,74.0234375,74.21875,74.4140625,74.609375,74.8046875,75.0,75.1953125,75.390625,75.5859375,75.78125,75.9765625,76.171875,76.3671875,76.5625,76.7578125,76.953125,77.1484375,77.34375,77.5390625,77.734375,77.9296875,78.125,78.3203125,78.515625,78.7109375,78.90625,79.1015625,79.296875,79.4921875,79.6875,79.8828125,80.078125,80.2734375,80.46875,80.6640625,80.859375,81.0546875,81.25,81.4453125,81.640625,81.8359375,82.03125,82.2265625,82.421875,82.6171875,82.8125,83.0078125,83.203125,83.3984375,83.59375,83.7890625,83.984375,84.1796875,84.375,84.5703125,84.765625,84.9609375,85.15625,85.3515625,85.546875,85.7421875,85.9375,86.1328125,86.328125,86.5234375,86.71875,86.9140625,87.109375,87.3046875,87.5,87.6953125,87.890625,88.0859375,88.28125,88.4765625,88.671875,88.8671875,89.0625,89.2578125,89.453125,89.6484375,89.84375,90.0390625,90.234375,90.4296875,90.625,90.8203125,91.015625,91.2109375,91.40625,91.6015625,91.796875,91.9921875,92.1875,92.3828125,92.578125,92.7734375,92.96875,93.1640625,93.359375,93.5546875,93.75,93.9453125,94.140625,94.3359375,94.53125,94.7265625,94.921875,95.1171875,95.3125,95.5078125,95.703125,95.8984375,96.09375,96.2890625,96.484375,96.6796875,96.875,97.0703125,97.265625,97.4609375,97.65625,97.8515625,98.046875,98.2421875,98.4375,98.6328125,98.828125,99.0234375,99.21875,99.4140625,99.609375,99.8046875],\"y\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,532157,25,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13313912,91696270071,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,806025,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,437811,61,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,29,585376,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]},\"selected\":{\"id\":\"31086\"},\"selection_policy\":{\"id\":\"31087\"}},\"id\":\"31061\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"source\":{\"id\":\"31034\"}},\"id\":\"31038\",\"type\":\"CDSView\"},{\"attributes\":{\"data_source\":{\"id\":\"31034\"},\"glyph\":{\"id\":\"31035\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"31036\"},\"view\":{\"id\":\"31038\"}},\"id\":\"31037\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"green\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"31036\",\"type\":\"Line\"},{\"attributes\":{\"line_color\":\"green\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"31035\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"31057\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"30902\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"31058\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"label\":{\"value\":\"input 101\"},\"renderers\":[{\"id\":\"31037\"}]},\"id\":\"31060\",\"type\":\"LegendItem\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"cyan\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"30948\",\"type\":\"Line\"},{\"attributes\":{\"line_color\":\"cyan\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"30947\",\"type\":\"Line\"},{\"attributes\":{\"source\":{\"id\":\"31061\"}},\"id\":\"31065\",\"type\":\"CDSView\"},{\"attributes\":{\"data_source\":{\"id\":\"31061\"},\"glyph\":{\"id\":\"31062\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"31063\"},\"view\":{\"id\":\"31065\"}},\"id\":\"31064\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"magenta\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"31063\",\"type\":\"Line\"},{\"attributes\":{\"line_color\":\"magenta\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"31062\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"31086\",\"type\":\"Selection\"},{\"attributes\":{\"line_color\":\"brown\",\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"30929\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"31087\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"label\":{\"value\":\"input 102\"},\"renderers\":[{\"id\":\"31064\"}]},\"id\":\"31089\",\"type\":\"LegendItem\"},{\"attributes\":{\"data\":{\"x\":[0.0,0.1953125,0.390625,0.5859375,0.78125,0.9765625,1.171875,1.3671875,1.5625,1.7578125,1.953125,2.1484375,2.34375,2.5390625,2.734375,2.9296875,3.125,3.3203125,3.515625,3.7109375,3.90625,4.1015625,4.296875,4.4921875,4.6875,4.8828125,5.078125,5.2734375,5.46875,5.6640625,5.859375,6.0546875,6.25,6.4453125,6.640625,6.8359375,7.03125,7.2265625,7.421875,7.6171875,7.8125,8.0078125,8.203125,8.3984375,8.59375,8.7890625,8.984375,9.1796875,9.375,9.5703125,9.765625,9.9609375,10.15625,10.3515625,10.546875,10.7421875,10.9375,11.1328125,11.328125,11.5234375,11.71875,11.9140625,12.109375,12.3046875,12.5,12.6953125,12.890625,13.0859375,13.28125,13.4765625,13.671875,13.8671875,14.0625,14.2578125,14.453125,14.6484375,14.84375,15.0390625,15.234375,15.4296875,15.625,15.8203125,16.015625,16.2109375,16.40625,16.6015625,16.796875,16.9921875,17.1875,17.3828125,17.578125,17.7734375,17.96875,18.1640625,18.359375,18.5546875,18.75,18.9453125,19.140625,19.3359375,19.53125,19.7265625,19.921875,20.1171875,20.3125,20.5078125,20.703125,20.8984375,21.09375,21.2890625,21.484375,21.6796875,21.875,22.0703125,22.265625,22.4609375,22.65625,22.8515625,23.046875,23.2421875,23.4375,23.6328125,23.828125,24.0234375,24.21875,24.4140625,24.609375,24.8046875,25.0,25.1953125,25.390625,25.5859375,25.78125,25.9765625,26.171875,26.3671875,26.5625,26.7578125,26.953125,27.1484375,27.34375,27.5390625,27.734375,27.9296875,28.125,28.3203125,28.515625,28.7109375,28.90625,29.1015625,29.296875,29.4921875,29.6875,29.8828125,30.078125,30.2734375,30.46875,30.6640625,30.859375,31.0546875,31.25,31.4453125,31.640625,31.8359375,32.03125,32.2265625,32.421875,32.6171875,32.8125,33.0078125,33.203125,33.3984375,33.59375,33.7890625,33.984375,34.1796875,34.375,34.5703125,34.765625,34.9609375,35.15625,35.3515625,35.546875,35.7421875,35.9375,36.1328125,36.328125,36.5234375,36.71875,36.9140625,37.109375,37.3046875,37.5,37.6953125,37.890625,38.0859375,38.28125,38.4765625,38.671875,38.8671875,39.0625,39.2578125,39.453125,39.6484375,39.84375,40.0390625,40.234375,40.4296875,40.625,40.8203125,41.015625,41.2109375,41.40625,41.6015625,41.796875,41.9921875,42.1875,42.3828125,42.578125,42.7734375,42.96875,43.1640625,43.359375,43.5546875,43.75,43.9453125,44.140625,44.3359375,44.53125,44.7265625,44.921875,45.1171875,45.3125,45.5078125,45.703125,45.8984375,46.09375,46.2890625,46.484375,46.6796875,46.875,47.0703125,47.265625,47.4609375,47.65625,47.8515625,48.046875,48.2421875,48.4375,48.6328125,48.828125,49.0234375,49.21875,49.4140625,49.609375,49.8046875,50.0,50.1953125,50.390625,50.5859375,50.78125,50.9765625,51.171875,51.3671875,51.5625,51.7578125,51.953125,52.1484375,52.34375,52.5390625,52.734375,52.9296875,53.125,53.3203125,53.515625,53.7109375,53.90625,54.1015625,54.296875,54.4921875,54.6875,54.8828125,55.078125,55.2734375,55.46875,55.6640625,55.859375,56.0546875,56.25,56.4453125,56.640625,56.8359375,57.03125,57.2265625,57.421875,57.6171875,57.8125,58.0078125,58.203125,58.3984375,58.59375,58.7890625,58.984375,59.1796875,59.375,59.5703125,59.765625,59.9609375,60.15625,60.3515625,60.546875,60.7421875,60.9375,61.1328125,61.328125,61.5234375,61.71875,61.9140625,62.109375,62.3046875,62.5,62.6953125,62.890625,63.0859375,63.28125,63.4765625,63.671875,63.8671875,64.0625,64.2578125,64.453125,64.6484375,64.84375,65.0390625,65.234375,65.4296875,65.625,65.8203125,66.015625,66.2109375,66.40625,66.6015625,66.796875,66.9921875,67.1875,67.3828125,67.578125,67.7734375,67.96875,68.1640625,68.359375,68.5546875,68.75,68.9453125,69.140625,69.3359375,69.53125,69.7265625,69.921875,70.1171875,70.3125,70.5078125,70.703125,70.8984375,71.09375,71.2890625,71.484375,71.6796875,71.875,72.0703125,72.265625,72.4609375,72.65625,72.8515625,73.046875,73.2421875,73.4375,73.6328125,73.828125,74.0234375,74.21875,74.4140625,74.609375,74.8046875,75.0,75.1953125,75.390625,75.5859375,75.78125,75.9765625,76.171875,76.3671875,76.5625,76.7578125,76.953125,77.1484375,77.34375,77.5390625,77.734375,77.9296875,78.125,78.3203125,78.515625,78.7109375,78.90625,79.1015625,79.296875,79.4921875,79.6875,79.8828125,80.078125,80.2734375,80.46875,80.6640625,80.859375,81.0546875,81.25,81.4453125,81.640625,81.8359375,82.03125,82.2265625,82.421875,82.6171875,82.8125,83.0078125,83.203125,83.3984375,83.59375,83.7890625,83.984375,84.1796875,84.375,84.5703125,84.765625,84.9609375,85.15625,85.3515625,85.546875,85.7421875,85.9375,86.1328125,86.328125,86.5234375,86.71875,86.9140625,87.109375,87.3046875,87.5,87.6953125,87.890625,88.0859375,88.28125,88.4765625,88.671875,88.8671875,89.0625,89.2578125,89.453125,89.6484375,89.84375,90.0390625,90.234375,90.4296875,90.625,90.8203125,91.015625,91.2109375,91.40625,91.6015625,91.796875,91.9921875,92.1875,92.3828125,92.578125,92.7734375,92.96875,93.1640625,93.359375,93.5546875,93.75,93.9453125,94.140625,94.3359375,94.53125,94.7265625,94.921875,95.1171875,95.3125,95.5078125,95.703125,95.8984375,96.09375,96.2890625,96.484375,96.6796875,96.875,97.0703125,97.265625,97.4609375,97.65625,97.8515625,98.046875,98.2421875,98.4375,98.6328125,98.828125,99.0234375,99.21875,99.4140625,99.609375,99.8046875],\"y\":[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,532971,35,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,13323154,91712329570,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,806025,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,444268,61,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,29,596600,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]},\"selected\":{\"id\":\"30941\"},\"selection_policy\":{\"id\":\"30942\"}},\"id\":\"30928\",\"type\":\"ColumnDataSource\"}],\"root_ids\":[\"30897\"]},\"title\":\"Bokeh Application\",\"version\":\"2.3.3\"}};\n",
+       "  var render_items = [{\"docid\":\"665d586c-411a-47fc-8844-15f332d3038a\",\"root_ids\":[\"30897\"],\"roots\":{\"30897\":\"732e77fe-65b7-4633-9104-3bae40cc4886\"}}];\n",
+       "  root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
+       "\n",
+       "  }\n",
+       "  if (root.Bokeh !== undefined) {\n",
+       "    embed_document(root);\n",
+       "  } else {\n",
+       "    var attempts = 0;\n",
+       "    var timer = setInterval(function(root) {\n",
+       "      if (root.Bokeh !== undefined) {\n",
+       "        clearInterval(timer);\n",
+       "        embed_document(root);\n",
+       "      } else {\n",
+       "        attempts++;\n",
+       "        if (attempts > 100) {\n",
+       "          clearInterval(timer);\n",
+       "          console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
+       "        }\n",
+       "      }\n",
+       "    }, 10, root)\n",
+       "  }\n",
+       "})(window);"
+      ],
+      "application/vnd.bokehjs_exec.v0+json": ""
+     },
+     "metadata": {
+      "application/vnd.bokehjs_exec.v0+json": {
+       "id": "30897"
+      }
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "from bokeh.plotting import figure \n",
+    "from bokeh.io import output_notebook, show\n",
+    "p = figure(width=1000, height=500, y_axis_type=\"log\", x_axis_label=\"MHz\", y_axis_label=\"power\")\n",
+    "x=[s/512*100 for s in range(d.sst_r.shape[1])]\n",
+    "colors=['darkblue','green','magenta','orange','blue','red','brown','cyan','black','pink']\n",
+    "for ant in range(96,103):\n",
+    "   p.line(x, d.sst_r[ant]+1,line_color=colors[ant % len(colors)],legend_label=\"input %s\" % ant)\n",
+    "output_notebook()\n",
+    "show(p)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "id": "71d8ef37",
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "StationControl",
+   "language": "python",
+   "name": "stationcontrol"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.7.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/sbin/run_integration_test.sh b/sbin/run_integration_test.sh
new file mode 100755
index 0000000000000000000000000000000000000000..d54163625541c13816bf0309c09a2713ce35add9
--- /dev/null
+++ b/sbin/run_integration_test.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+# Check if lofar20rc.sh is sourced and environment variables are set.
+if [ -z "$LOFAR20_DIR" ]; then
+  echo "\$LOFAR20_DIR is unset or blank, is lofar20rc.sh sourced correctly?"
+  exit 1
+fi
+
+# Start all required containers
+cd "$LOFAR20_DIR/docker-compose" || exit 1
+make start databaseds dsconfig device-sdp device-pcc jupyter elk sdptr-sim pypcc-sim
+
+# Update the dsconfig
+cd "$TANGO_LOFAR_LOCAL_DIR" || exit 1
+sbin/update_ConfigDb.sh CDB/integration_ConfigDb.json
+
+# Start the integration test
+cd "$LOFAR20_DIR/docker-compose" || exit 1
+make start integration-test
+
+# Run the integration test with the output displayed on stdout
+docker start -a integration-test
\ No newline at end of file