diff --git a/app/PySide2-bindings/PyDataProvider.h b/app/PySide2-bindings/PyDataProvider.h index 87d610a..3286db4 100644 --- a/app/PySide2-bindings/PyDataProvider.h +++ b/app/PySide2-bindings/PyDataProvider.h @@ -116,6 +116,10 @@ public: return ts; } + inline void set_icon(const QString& path, const QString& name) + { + sqpApp->dataSources().setIcon(path, name); + } inline void register_products(const QVector& products) { diff --git a/app/PySide2-bindings/plugins/SPWC-Amda.py b/app/PySide2-bindings/plugins/SPWC-Amda.py new file mode 100644 index 0000000..3077b18 --- /dev/null +++ b/app/PySide2-bindings/plugins/SPWC-Amda.py @@ -0,0 +1,124 @@ +import traceback +import os +from datetime import datetime, timedelta, timezone +from SciQLopBindings import PyDataProvider, Product, VectorTimeSerie, ScalarTimeSerie, DataSeriesType +import numpy as np +import requests +import copy +from spwc.amda import AMDA + +amda = AMDA() + +def amda_make_scalar(var=None): + if var is None: + return ((np.array(), np.array()), DataSeriesType.SCALAR) + else: + return ((var.time.copy(),var.data.copy()), DataSeriesType.SCALAR) + +def amda_make_vector(var=None): + if var is None: + return ((np.array(), np.array()), DataSeriesType.VECTOR) + else: + return ((var.time.copy(),var.data.copy()), DataSeriesType.VECTOR) + +def amda_make_multi_comp(var=None): + if var is None: + return ((np.array(), np.array()), DataSeriesType.MULTICOMPONENT) + else: + return ((var.time.copy(),var.data.copy()), DataSeriesType.MULTICOMPONENT) + +def amda_make_spectro(var=None): + if var is None: + return ((np.array(), np.array()), DataSeriesType.SPECTROGRAM) + else: + min_sampling = float(var.meta.get("DATASET_MIN_SAMPLING","nan")) + max_sampling = float(var.meta.get("DATASET_MAX_SAMPLING","nan")) + if "PARAMETER_TABLE_MIN_VALUES[1]" in var.meta: + min_v = np.array([ float(v) for v in var.meta["PARAMETER_TABLE_MIN_VALUES[1]"].split(',') ]) + max_v = np.array([ float(v) for v in var.meta["PARAMETER_TABLE_MAX_VALUES[1]"].split(',') ]) + y = (max_v + min_v)/2. + elif "PARAMETER_TABLE_MIN_VALUES[0]" in var.meta: + min_v = np.array([ float(v) for v in var.meta["PARAMETER_TABLE_MIN_VALUES[0]"].split(',') ]) + max_v = np.array([ float(v) for v in var.meta["PARAMETER_TABLE_MAX_VALUES[0]"].split(',') ]) + y = (max_v + min_v)/2. + else: + y = np.logspace(1,3,var.data.shape[1])[::-1] + return ((var.time.copy(),var.data.copy()), DataSeriesType.SPECTROGRAM) + #return pysciqlopcore.SpectrogramTimeSerie(var.time,y,var.data,min_sampling,max_sampling,True) + +def amda_get_sample(metadata,start,stop): + ts_type = amda_make_scalar + try: + param_id = None + for key,value in metadata: + if key == 'xml:id': + param_id = value + elif key == 'type': + if value == 'vector': + ts_type = amda_make_vector + elif value == 'multicomponent': + ts_type = amda_make_multi_comp + elif value == 'spectrogram': + ts_type = amda_make_spectro + tstart=datetime.fromtimestamp(start, tz=timezone.utc) + tend=datetime.fromtimestamp(stop, tz=timezone.utc) + var = amda.get_parameter(start_time=tstart, stop_time=tend, parameter_id=param_id, method="REST") + return ts_type(var) + except Exception as e: + print(traceback.format_exc()) + print("Error in amda.py ",str(e)) + return ts_type() + + +class AmdaProvider(PyDataProvider): + def __init__(self): + super(AmdaProvider,self).__init__() + if len(amda.component) is 0: + amda.update_inventory() + parameters = copy.deepcopy(amda.parameter) + for name,component in amda.component.items(): + if 'components' in parameters[component['parameter']]: + parameters[component['parameter']]['components'].append(component) + else: + parameters[component['parameter']]['components']=[component] + + products = [] + for key,parameter in parameters.items(): + path = f"/AMDA/{parameter['mission']}/{parameter.get('observatory','')}/{parameter['instrument']}/{parameter['dataset']}/{parameter['name']}" + components = [component['name'] for component in parameter.get('components',[])] + metadata = { key:item for key,item in parameter.items() if key is not 'components' } + n_components = parameter.get('size',0) + if n_components == '3': + metadata["type"]="vector" + elif parameter.get('display_type','')=="spectrogram": + metadata["type"]="spectrogram" + elif n_components !=0: + metadata["type"]="multicomponent" + else: + metadata["type"]="scalar" + products.append( Product(path, components, metadata)) + self.register_products(products) + for mission in amda.mission: + self.set_icon(f'/AMDA/{mission}','satellite') + + def get_data(self,metadata,start,stop): + ts_type = amda_make_scalar + try: + param_id = metadata['xml:id'] + ts_type_str = metadata['type'] + if ts_type_str == 'vector': + ts_type = amda_make_vector + elif ts_type_str == 'multicomponent': + ts_type = amda_make_multi_comp + elif ts_type_str == 'spectrogram': + ts_type = amda_make_spectro + tstart=datetime.fromtimestamp(start, tz=timezone.utc) + tend=datetime.fromtimestamp(stop, tz=timezone.utc) + var = amda.get_parameter(start_time=tstart, stop_time=tend, parameter_id=param_id, method="REST") + return ts_type(var) + except Exception as e: + print(traceback.format_exc()) + print("Error in amda.py ",str(e)) + return ts_type() + +_amda = AmdaProvider() diff --git a/app/PySide2-bindings/plugins/meson.build b/app/PySide2-bindings/plugins/meson.build index 3b98041..e1c8dd6 100644 --- a/app/PySide2-bindings/plugins/meson.build +++ b/app/PySide2-bindings/plugins/meson.build @@ -1,2 +1,3 @@ configure_file(input:'TestPlugin.py', output:'TestPlugin.py', copy:true) +configure_file(input:'SPWC-Amda.py', output:'SPWC-Amda.py', copy:true) diff --git a/gui/resources/icones/satellite.svg b/gui/resources/icones/satellite.svg new file mode 100644 index 0000000..ed3e8c5 --- /dev/null +++ b/gui/resources/icones/satellite.svg @@ -0,0 +1,260 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gui/resources/sqpguiresources.qrc b/gui/resources/sqpguiresources.qrc index 6844376..31942a5 100644 --- a/gui/resources/sqpguiresources.qrc +++ b/gui/resources/sqpguiresources.qrc @@ -28,5 +28,6 @@ icones/save.png icones/discard.png icones/Simple_icon_time.svg + icones/satellite.svg diff --git a/gui/src/DataSource/DataSourceWidget.cpp b/gui/src/DataSource/DataSourceWidget.cpp index 4b0a9cb..65488d4 100644 --- a/gui/src/DataSource/DataSourceWidget.cpp +++ b/gui/src/DataSource/DataSourceWidget.cpp @@ -32,7 +32,7 @@ DataSourceWidget::DataSourceWidget(QWidget* parent) // Connection to filter tree connect(ui->filterLineEdit, &QLineEdit::textChanged, &m_model_proxy, static_cast( &QSortFilterProxyModel::setFilterRegExp)); - + sqpApp->dataSources().addIcon("satellite",QVariant(QIcon(":/icones/satellite.svg"))); } DataSourceWidget::~DataSourceWidget() noexcept