diff --git a/jupyter-notebooks/archiving_demo.ipynb b/jupyter-notebooks/archiving_demo.ipynb index 931f599ae7d24bab233ff924be921d80e7b587d4..ae6e656b319177a31f5bc052d80dbb0e60ba306d 100644 --- a/jupyter-notebooks/archiving_demo.ipynb +++ b/jupyter-notebooks/archiving_demo.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "d56e59b7", "metadata": {}, "outputs": [], @@ -18,7 +18,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "fd619562", "metadata": {}, "outputs": [], @@ -29,35 +29,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "c1eedafb", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Attribute stat/sdp/1/fpga_temp_r already in archiving list!\n", - "Attribute stat/sdp/1/tr_fpga_mask_r already in archiving list!\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'global_variables': {'development_polling_time': '10000', 'development_archive_time': '60000'}, 'devices': {'STAT/RECV/1': {'environment': 'development', 'include': [], 'exclude': ['CLK_Enable_PWR_R', 'CLK_I2C_STATUS_R', 'CLK_PLL_error_R', 'CLK_PLL_locked_R', 'CLK_translator_busy_R']}, 'STAT/SDP/1': {'environment': 'development', 'include': ['FPGA_temp_R', 'TR_fpga_mask_R'], 'exclude': ['FPGA_scrap_R', 'FPGA_scrap_RW']}, 'STAT/SST/1': {'environment': 'development', 'include': [], 'exclude': []}, 'STAT/XST/1': {'environment': 'development', 'include': [], 'exclude': []}, 'STAT/UNB2/1': {'environment': 'development', 'include': [], 'exclude': []}}}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Device STAT/SST/1 not found\n", - "Device STAT/XST/1 not found\n", - "Device STAT/UNB2/1 not found\n" - ] - } - ], + "outputs": [], "source": [ "# Apply the chosen JSON configuration file in directory toolkit/archiver_config/\n", "config_dict = archiver.get_configuration()\n", @@ -67,18 +42,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "948e95f0", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "STAT/RECV/1 : ON\n" - ] - } - ], + "outputs": [], "source": [ "# RECV device\n", "device_name = 'STAT/RECV/1'\n", @@ -90,20 +57,15 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "225a5e06", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Device STAT/RECV/1 is now in ON state\n" - ] - } - ], + "outputs": [], "source": [ "# Start RECV device\n", + "if state == 'FAULT':\n", + " d.off()\n", + " time.sleep(3)\n", "if state == \"OFF\":\n", " time.sleep(1)\n", " d.initialise()\n", @@ -119,18 +81,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "0e27ac40", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "STAT/SDP/1 : OFF\n" - ] - } - ], + "outputs": [], "source": [ "# SDP device\n", "device_name = 'STAT/SDP/1'\n", @@ -142,20 +96,15 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "348a9d44", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Device STAT/SDP/1 is now in ON state\n" - ] - } - ], + "outputs": [], "source": [ "# Start SDP device\n", + "if state == 'FAULT':\n", + " d2.off()\n", + " time.sleep(3)\n", "if state == \"OFF\":\n", " time.sleep(1)\n", " d2.initialise()\n", @@ -171,7 +120,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "6fad043c", "metadata": {}, "outputs": [], @@ -182,30 +131,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "c33fa7ee", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Attribute stat/recv/1/RECVTR_translator_busy_R already in archiving list!\n", - "Attribute stat/recv/1/rcu_mask_rw already in archiving list!\n", - "Attribute stat/sdp/1/TR_tod_pps_delta_R already in archiving list!\n", - "Attribute stat/sdp/1/fpga_temp_r already in archiving list!\n", - "Attribute stat/sdp/1/FPGA_beamlet_output_hdr_udp_destination_port_R already in archiving list!\n", - "Attribute stat/sdp/1/FPGA_bsn_monitor_input_nof_err_R already in archiving list!\n", - "Attribute stat/sdp/1/TR_sdp_config_first_fpga_nr_R already in archiving list!\n", - "Attribute stat/recv/1/RCU_LED_colour_R already in archiving list!\n", - "Attribute stat/recv/1/RECVTR_monitor_rate_RW already in archiving list!\n", - "Attribute stat/recv/1/RCU_PCB_ID_R already in archiving list!\n", - "Attribute stat/recv/1/status already in archiving list!\n", - "Attribute stat/recv/1/opcua_missing_attributes_R already in archiving list!\n", - "Attribute stat/recv/1/state already in archiving list!\n" - ] - } - ], + "outputs": [], "source": [ "# Add boolean scalar attribute\n", "archiver.add_attribute_to_archiver('stat/recv/1/RECVTR_translator_busy_R', polling_period=1000, event_period=5000)\n", @@ -244,21 +173,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "ec7878b2", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{}" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Print the errors for each attribute\n", "# If the device is in OFF state, all its attributes should be in error (normal behaviour)\n", @@ -268,34 +186,10 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "3d2ce2da", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['tango://databaseds:10000/stat/recv/1/status',\n", - " 'tango://databaseds:10000/stat/recv/1/state',\n", - " 'tango://databaseds:10000/stat/recv/1/recvtr_translator_busy_r',\n", - " 'tango://databaseds:10000/stat/recv/1/rcu_mask_rw',\n", - " 'tango://databaseds:10000/stat/sdp/1/tr_tod_pps_delta_r',\n", - " 'tango://databaseds:10000/stat/sdp/1/fpga_temp_r',\n", - " 'tango://databaseds:10000/stat/sdp/1/fpga_beamlet_output_hdr_udp_destination_port_r',\n", - " 'tango://databaseds:10000/stat/sdp/1/fpga_bsn_monitor_input_nof_err_r',\n", - " 'tango://databaseds:10000/stat/sdp/1/tr_sdp_config_first_fpga_nr_r',\n", - " 'tango://databaseds:10000/stat/recv/1/rcu_led_colour_r',\n", - " 'tango://databaseds:10000/stat/recv/1/recvtr_monitor_rate_rw',\n", - " 'tango://databaseds:10000/stat/recv/1/rcu_pcb_id_r',\n", - " 'tango://databaseds:10000/stat/recv/1/opcua_missing_attributes_r',\n", - " 'tango://databaseds:10000/stat/sdp/1/tr_fpga_mask_r']" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Print the attributes currently managed by the event subscriber\n", "attrs = archiver.get_subscriber_attributes()\n", @@ -304,41 +198,10 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "id": "0ec2abd3", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[<Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:55:28.225248+00:00',value_r='21.475996475',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:55:39.233392+00:00',value_r='21.475076675',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:55:49.234332+00:00',value_r='21.475180775',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:55:59.224803+00:00',value_r='21.475021575',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:56:09.234002+00:00',value_r='21.475289175',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:56:19.227675+00:00',value_r='21.475744575',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:56:29.226353+00:00',value_r='21.475331875',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:56:39.224962+00:00',value_r='21.475764575',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:56:49.224105+00:00',value_r='21.475591075',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:56:59.225051+00:00',value_r='21.475893675',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:57:09.232141+00:00',value_r='21.475835275',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:57:19.224068+00:00',value_r='21.475500775',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:57:29.230708+00:00',value_r='21.475418075',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:57:40.230619+00:00',value_r='21.475114275',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:57:50.226534+00:00',value_r='21.475703275',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:58:00.226028+00:00',value_r='21.475547875',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:58:10.234388+00:00',value_r='21.475125675',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:58:20.225343+00:00',value_r='21.475631075',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:58:30.230999+00:00',value_r='21.475126675',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:58:40.225220+00:00',value_r='21.475385175',value_w='None',quality='0',att_error_desc_id='None',details='None')>,\n", - " <Scalar_Double(att_conf_id='5',data_time='2022-02-10 17:58:50.224087+00:00',value_r='21.475278375',value_w='None',quality='0',att_error_desc_id='None',details='None')>]" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "retriever = RetrieverTimescale()\n", "attr_name = 'stat/sdp/1/tr_tod_pps_delta_r'\n", @@ -348,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "id": "81b60192", "metadata": {}, "outputs": [], @@ -359,64 +222,20 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "id": "3dcab007", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[21.475996475,\n", - " 21.475076675,\n", - " 21.475180775,\n", - " 21.475021575,\n", - " 21.475289175,\n", - " 21.475744575,\n", - " 21.475331875,\n", - " 21.475764575,\n", - " 21.475591075,\n", - " 21.475893675,\n", - " 21.475835275,\n", - " 21.475500775,\n", - " 21.475418075,\n", - " 21.475114275,\n", - " 21.475703275,\n", - " 21.475547875,\n", - " 21.475125675,\n", - " 21.475631075,\n", - " 21.475126675,\n", - " 21.475385175,\n", - " 21.475278375]" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "values" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "id": "26b4aab8", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "<Figure size 360x240 with 1 Axes>" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plt.plot(timestamps,values)\n", "plt.title('Archived data for '+ attr_name)\n", @@ -433,7 +252,21 @@ "id": "18aeb91f", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "views_records = retriever.get_lofar_attribute('stat/sdp/1/tr_tod_pps_delta_r')\n", + "views_records" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "eb24ed8f", + "metadata": {}, + "outputs": [], + "source": [ + "views_records = retriever.get_lofar_attribute('stat/sdp/1/fpga_temp_r')\n", + "views_records" + ] } ], "metadata": { diff --git a/tangostationcontrol/tangostationcontrol/toolkit/archiver_base_ts.py b/tangostationcontrol/tangostationcontrol/toolkit/archiver_base_ts.py index 4629e83dd749c11b04e641816396da38f9cca41e..71ffc52d4f51bbd8a5f5ac211b4ab561cfa1281b 100644 --- a/tangostationcontrol/tangostationcontrol/toolkit/archiver_base_ts.py +++ b/tangostationcontrol/tangostationcontrol/toolkit/archiver_base_ts.py @@ -9,9 +9,127 @@ from sqlalchemy import Column, Integer, String from typing import List import numpy -#Declarative system used to define classes mapped to relational DB tables +# Declarative system used to define classes mapped to relational DB tables Base = declarative_base() +# ----------------- LOFAR VIEWS ----------------- # + +class Lofar_Scalar_Attribute(Base): + """ + Abstract Class that represents a Lofar customized Tango Attribute view + """ + __abstract__ = True + __table_args__ = {'extend_existing': True} + + data_time = Column(TIMESTAMP, primary_key=True) + device = Column(String, primary_key=True) + name = Column(String, primary_key=True) + value = Column(FLOAT) + + def __repr__(self): + return f"<Attribute(device='{self.device}', name='{self.name}', data_time='{self.data_time}',value='{self.value}'>" + +class Lofar_Scalar_Boolean(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_boolean' + +class Lofar_Scalar_Double(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_double' + +class Lofar_Scalar_Encoded(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_encoded' + +class Lofar_Scalar_Enum(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_enum' + +class Lofar_Scalar_Float(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_float' + +class Lofar_Scalar_Long(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_long' + +class Lofar_Scalar_Long64(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_long64' + +class Lofar_Scalar_Short(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_short' + +class Lofar_Scalar_State(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_state' + +class Lofar_Scalar_String(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_string' + +class Lofar_Scalar_Uchar(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_uchar' + +class Lofar_Scalar_Ulong(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_ulong' + +class Lofar_Scalar_Ulong64(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_ulong64' + +class Lofar_Scalar_Ushort(Lofar_Scalar_Attribute): + __tablename__ = 'lofar_scalar_ushort' + +class Lofar_Array_Attribute(Base): + """ + Abstract Class that represents a Lofar customized Tango Attribute view + """ + __abstract__ = True + __table_args__ = {'extend_existing': True} + + data_time = Column(TIMESTAMP, primary_key=True) + device = Column(String, primary_key=True) + name = Column(String, primary_key=True) + x = Column(INTEGER, primary_key=True) + value = Column(FLOAT) + + def __repr__(self): + return f"<Attribute(device='{self.device}', name='{self.name}', data_time='{self.data_time}',index='{self.x}',value='{self.value}'>" + +class Lofar_Array_Boolean(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_boolean' + +class Lofar_Array_Double(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_double' + +class Lofar_Array_Encoded(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_encoded' + +class Lofar_Array_Enum(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_enum' + +class Lofar_Array_Float(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_float' + +class Lofar_Array_Long(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_long' + +class Lofar_Array_Long64(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_long64' + +class Lofar_Array_Short(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_short' + +class Lofar_Array_State(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_state' + +class Lofar_Array_String(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_string' + +class Lofar_Array_Uchar(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_uchar' + +class Lofar_Array_Ulong(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_ulong' + +class Lofar_Array_Ulong64(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_ulong64' + +class Lofar_Array_Ushort(Lofar_Array_Attribute): + __tablename__ = 'lofar_array_ushort' +# ----------------- ----------------- ----------------- # + class Attribute(Base): """ Class that represents a Tango Attribute mapped to table 'att_conf' @@ -444,6 +562,23 @@ def get_class_by_tablename(tablename: str): return c return None +def get_viewclass_by_tablename(tablename: str): + """ + Returns class reference mapped to a datatype. + """ + format = tablename.split('_')[1].lower() + datatype = tablename.split('_')[2][3:].lower() # Remove 'dev' prefix + for mapper in Base.registry.mappers: + c = mapper.class_ + classname = c.__name__ + if not classname.startswith('_'): + if hasattr(c, '__tablename__'): + if format=='scalar' and c.__tablename__ == f"lofar_scalar_{datatype}": + return c + elif format=='array' and c.__tablename__ == f"lofar_array_{datatype}": + return c + return None + def build_array_from_record(rows: List[Array], dim_x: int): """ Converts Array database items in Python lists diff --git a/tangostationcontrol/tangostationcontrol/toolkit/retriever.py b/tangostationcontrol/tangostationcontrol/toolkit/retriever.py index 0e723a82e7232f7caee2bcac8362a5c503661120..bedd970d117c52a3986c400d2ff68fb35f0c66b6 100644 --- a/tangostationcontrol/tangostationcontrol/toolkit/retriever.py +++ b/tangostationcontrol/tangostationcontrol/toolkit/retriever.py @@ -302,3 +302,19 @@ class RetrieverTimescale(Retriever): tablename = self.get_attribute_tablename(attribute_fqname) return super().get_attribute_value_by_interval(attribute_fqname,start_time,stop_time,tablename) + def get_lofar_attribute(self,attribute_fqname: str): + """ + Takes as input the attribute fully-qualified name and queries the customized lofar attribute views + Returns a list of rows containing device name, attribute name, timestamp and value + """ + # Retrieves the attribute tablename + tablename = self.get_attribute_tablename(attribute_fqname) + # Retrieves the class that maps the DB table given the tablename + base_class = self.ab.get_viewclass_by_tablename(tablename) + domain,family,member,name = split_tango_name(attribute_fqname,'attribute') + try: + result = self.session.query(base_class).\ + filter(base_class.name == name).all() + except (AttributeError, TypeError, NoResultFound) as e: + raise ValueError(f"Attribute {attribute_fqname} not found!") from e + return result