From d1a5badbcf0e99ff5475263d5994392d37c78f37 2019-12-06 17:38:10 From: Alexis Jeandet Date: 2019-12-06 17:38:10 Subject: [PATCH] Spectrograms works again, needs more polish... Signed-off-by: Alexis Jeandet --- diff --git a/app/PySide2-bindings/PyDataProvider.h b/app/PySide2-bindings/PyDataProvider.h index 3286db4..9609175 100644 --- a/app/PySide2-bindings/PyDataProvider.h +++ b/app/PySide2-bindings/PyDataProvider.h @@ -7,6 +7,7 @@ #include #include +#include #include // must be included last because of Python/Qt definition of slots #include "numpy_wrappers.h" @@ -51,14 +52,14 @@ MultiComponentTimeSerie* make_multi_comp(T& t, T& y) } template -SpectrogramTimeSerie* make_spectro(T& t, T& y) +SpectrogramTimeSerie* make_spectro(T& t, T& y, T& z) { - auto y_size = y.flat_size(); + auto z_size = z.flat_size(); auto t_size = t.flat_size(); - if (t_size && (y_size % t_size) == 0) + if (t_size && (z_size % t_size) == 0) { - return new SpectrogramTimeSerie { std::move(t.data), std::move(y.data), - { t_size, y_size / t_size } }; + return new SpectrogramTimeSerie { std::move(t.data), std::move(y.data), std::move(z.data), + { t_size, z_size / t_size }, std::nan("1"), std::nan("1") }; } return nullptr; } @@ -75,7 +76,7 @@ public: virtual ~PyDataProvider() {} - virtual QPair, DataSeriesType> get_data( + virtual QPair,NpArray>, DataSeriesType> get_data( const QMap& key, double start_time, double stop_time) { (void)key, (void)start_time, (void)stop_time; @@ -94,20 +95,21 @@ public: auto [data, type] = get_data(metadata, parameters.m_Range.m_TStart, parameters.m_Range.m_TEnd); - auto& [t, y] = data; + auto& [axes, values] = data; + auto& [x, y] = axes; switch (type) { case DataSeriesType::SCALAR: - ts = make_scalar(t, y); + ts = make_scalar(x, values); break; case DataSeriesType::VECTOR: - ts = make_vector(t, y); + ts = make_vector(x, values); break; case DataSeriesType::MULTICOMPONENT: - ts = make_multi_comp(t, y); + ts = make_multi_comp(x, values); break; case DataSeriesType::SPECTROGRAM: - ts = make_spectro(t, y); + ts = make_spectro(x, y, values); break; default: break; diff --git a/app/PySide2-bindings/plugins/SPWC-Amda.py b/app/PySide2-bindings/plugins/SPWC-Amda.py index d084c60..1c3fe3d 100644 --- a/app/PySide2-bindings/plugins/SPWC-Amda.py +++ b/app/PySide2-bindings/plugins/SPWC-Amda.py @@ -9,48 +9,45 @@ from spwc.amda import AMDA amda = AMDA() + def amda_make_scalar(var=None): if var is None: - return ((np.array(), np.array()), DataSeriesType.SCALAR) + return (((np.array([]), np.array([])), np.array([])), DataSeriesType.SCALAR) else: - return ((var.time,var.data), DataSeriesType.SCALAR) + return (((var.time, np.array([])), var.data), DataSeriesType.SCALAR) + def amda_make_vector(var=None): if var is None: - return ((np.array(), np.array()), DataSeriesType.VECTOR) + return (((np.array([]), np.array([])), np.array([])), DataSeriesType.VECTOR) else: - return ((var.time,var.data), DataSeriesType.VECTOR) + return (((var.time, np.array([])), var.data), DataSeriesType.VECTOR) + def amda_make_multi_comp(var=None): if var is None: - return ((np.array(), np.array()), DataSeriesType.MULTICOMPONENT) + return (((np.array([]), np.array([])), np.array([])), DataSeriesType.MULTICOMPONENT) else: - return ((var.time,var.data), DataSeriesType.MULTICOMPONENT) + return (((var.time, np.array([])), var.data), DataSeriesType.MULTICOMPONENT) + def amda_make_spectro(var=None): if var is None: - return ((np.array(), np.array()), DataSeriesType.SPECTROGRAM) + return (((np.array([]), 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,var.data), DataSeriesType.SPECTROGRAM) + min_sampling = float(var.meta.get("DATASET_MIN_SAMPLING", "nan")) + max_sampling = float(var.meta.get("DATASET_MAX_SAMPLING", "nan")) + if var.y is None and len(var.data): + var.y = np.logspace(1, 3, var.data.shape[1])[::-1] + return (((var.time, var.y), var.data), DataSeriesType.SPECTROGRAM) #return pysciqlopcore.SpectrogramTimeSerie(var.time,y,var.data,min_sampling,max_sampling,True) -def amda_get_sample(metadata,start,stop): + +def amda_get_sample(metadata, start, stop): ts_type = amda_make_scalar try: param_id = None - for key,value in metadata: + for key, value in metadata: if key == 'xml:id': param_id = value elif key == 'type': @@ -60,48 +57,48 @@ def amda_get_sample(metadata,start,stop): 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) + 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)) + print("Error in amda.py ", str(e)) return ts_type() class AmdaProvider(PyDataProvider): def __init__(self): - super(AmdaProvider,self).__init__() + 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(): + 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(): + 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) + 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" + 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)) + 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): + def get_data(self, metadata, start, stop): ts_type = amda_make_scalar try: param_id = metadata['xml:id'] @@ -112,13 +109,13 @@ class AmdaProvider(PyDataProvider): 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) + 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)) + print("Error in amda.py ", str(e)) return ts_type() _amda = AmdaProvider() diff --git a/app/PySide2-bindings/plugins/TestPlugin.py b/app/PySide2-bindings/plugins/TestPlugin.py index 96c1071..2f77d8b 100644 --- a/app/PySide2-bindings/plugins/TestPlugin.py +++ b/app/PySide2-bindings/plugins/TestPlugin.py @@ -82,11 +82,11 @@ class MyProvider(PyDataProvider): var = _cache.get_data(cache_product, DateTimeRange(datetime.fromtimestamp(start, tz=timezone.utc), datetime.fromtimestamp(stop, tz=timezone.utc)), partial(_get_data, p_type), fragment_hours=24) else: var = _get_data(p_type, start, stop) - return ((var.time,var.data), ts_type) + return (((var.time, np.array([])),var.data), ts_type) except Exception as e: print(traceback.format_exc()) print("Error in test.py ",str(e)) - return ((np.array(), np.array()), ts_type) + return (((np.array([]), np.array([])), np.array([])), ts_type) t=MyProvider() diff --git a/core b/core index 9f4e10a..3bce297 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 9f4e10a342eece28498d9b732bf59f8d1908b716 +Subproject commit 3bce297cb13e8337d71adceae6737c104c66ad52