##// END OF EJS Templates
Improved AMDA tree, uses node names instead of xml:id which is more...
jeandet -
r1502:239919e8e177
parent child
Show More
@@ -1,15 +1,16
1 1 build/
2 _build/
2 3 CMakeLists.txt.user
3 4 /.project
4 5 core/src/Version.cpp
5 6 core/include/Version.h
6 7 3rdparty/
7 8 subprojects/*
8 9 documentation/*
9 10 **/.idea/*
10 11 **/__pycache__/*
11 12 *.srctrl*
12 13 *.kdev4
13 14 .vscode
14 15 *.pyc
15 16 *.swp
@@ -1,121 +1,128
1 1 import traceback
2 2 import os
3 3 from datetime import datetime, timedelta, timezone
4 4 from SciQLopBindings import PyDataProvider, Product, VectorTimeSerie, ScalarTimeSerie, DataSeriesType
5 5 import numpy as np
6 6 import requests
7 7 import copy
8 8 from spwc.amda import AMDA
9 9
10 10 amda = AMDA()
11 11
12 12
13 13 def amda_make_scalar(var=None):
14 14 if var is None:
15 15 return (((np.array([]), np.array([])), np.array([])), DataSeriesType.SCALAR)
16 16 else:
17 17 return (((var.time, np.array([])), var.data), DataSeriesType.SCALAR)
18 18
19 19
20 20 def amda_make_vector(var=None):
21 21 if var is None:
22 22 return (((np.array([]), np.array([])), np.array([])), DataSeriesType.VECTOR)
23 23 else:
24 24 return (((var.time, np.array([])), var.data), DataSeriesType.VECTOR)
25 25
26 26
27 27 def amda_make_multi_comp(var=None):
28 28 if var is None:
29 29 return (((np.array([]), np.array([])), np.array([])), DataSeriesType.MULTICOMPONENT)
30 30 else:
31 31 return (((var.time, np.array([])), var.data), DataSeriesType.MULTICOMPONENT)
32 32
33 33
34 34 def amda_make_spectro(var=None):
35 35 if var is None:
36 36 return (((np.array([]), np.array([])), np.array([])), DataSeriesType.SPECTROGRAM)
37 37 else:
38 38 min_sampling = float(var.meta.get("DATASET_MIN_SAMPLING", "nan"))
39 39 max_sampling = float(var.meta.get("DATASET_MAX_SAMPLING", "nan"))
40 40 if var.y is None and len(var.data):
41 41 var.y = np.logspace(1, 3, var.data.shape[1])[::-1]
42 42 return (((var.time, var.y), var.data), DataSeriesType.SPECTROGRAM)
43 43 #return pysciqlopcore.SpectrogramTimeSerie(var.time,y,var.data,min_sampling,max_sampling,True)
44 44
45 45
46 46 def amda_get_sample(metadata, start, stop):
47 47 ts_type = amda_make_scalar
48 48 try:
49 49 param_id = None
50 50 for key, value in metadata:
51 51 if key == 'xml:id':
52 52 param_id = value
53 53 elif key == 'type':
54 54 if value == 'vector':
55 55 ts_type = amda_make_vector
56 56 elif value == 'multicomponent':
57 57 ts_type = amda_make_multi_comp
58 58 elif value == 'spectrogram':
59 59 ts_type = amda_make_spectro
60 60 tstart = datetime.fromtimestamp(start, tz=timezone.utc)
61 61 tend = datetime.fromtimestamp(stop, tz=timezone.utc)
62 62 var = amda.get_parameter(start_time=tstart, stop_time=tend, parameter_id=param_id, method="REST")
63 63 return ts_type(var)
64 64 except Exception as e:
65 65 print(traceback.format_exc())
66 66 print("Error in amda.py ", str(e))
67 67 return ts_type()
68 68
69 69
70 70 class AmdaProvider(PyDataProvider):
71 71 def __init__(self):
72 72 super(AmdaProvider, self).__init__()
73 73 if len(amda.component) is 0:
74 74 amda.update_inventory()
75 75 parameters = copy.deepcopy(amda.parameter)
76 76 for name, component in amda.component.items():
77 77 if 'components' in parameters[component['parameter']]:
78 78 parameters[component['parameter']]['components'].append(component)
79 79 else:
80 80 parameters[component['parameter']]['components']=[component]
81 81
82 82 products = []
83 83 for key, parameter in parameters.items():
84 path = f"/AMDA/{parameter['mission']}/{parameter.get('observatory','')}/{parameter['instrument']}/{parameter['dataset']}/{parameter['name']}"
84 mission_name = amda.mission[parameter['mission']]['name']
85 observatory_name = parameter.get('observatory','')
86 if observatory_name != '':
87 observatory_name = amda.observatory[observatory_name]['name']
88 instrument_name = amda.instrument[parameter['instrument']]['name']
89 dataset_name = amda.dataset[parameter['dataset']]['name']
90 path = f"/AMDA/{mission_name}/{observatory_name}/{instrument_name}/{dataset_name}/{parameter['name']}"
85 91 components = [component['name'] for component in parameter.get('components',[])]
86 92 metadata = {key: item for key, item in parameter.items() if key is not 'components'}
87 93 n_components = parameter.get('size', 0)
88 94 if n_components == '3':
89 95 metadata["type"] = "vector"
90 96 elif parameter.get('display_type', '')=="spectrogram":
91 97 metadata["type"] = "spectrogram"
92 98 elif n_components != 0:
93 99 metadata["type"] = "multicomponent"
94 100 else:
95 101 metadata["type"] = "scalar"
96 102 products.append(Product(path, components, metadata))
97 103 self.register_products(products)
98 for mission in amda.mission:
99 self.set_icon(f'/AMDA/{mission}','satellite')
104 for _,mission in amda.mission.items():
105 if ('target' in mission) and (mission['xml:id'] != 'Ephemerides') and (mission['target'] != 'Earth'):
106 self.set_icon(f'/AMDA/{mission["name"]}','satellite')
100 107
101 108 def get_data(self, metadata, start, stop):
102 109 ts_type = amda_make_scalar
103 110 try:
104 111 param_id = metadata['xml:id']
105 112 ts_type_str = metadata['type']
106 113 if ts_type_str == 'vector':
107 114 ts_type = amda_make_vector
108 115 elif ts_type_str == 'multicomponent':
109 116 ts_type = amda_make_multi_comp
110 117 elif ts_type_str == 'spectrogram':
111 118 ts_type = amda_make_spectro
112 119 tstart = datetime.fromtimestamp(start, tz=timezone.utc)
113 120 tend = datetime.fromtimestamp(stop, tz=timezone.utc)
114 121 var = amda.get_parameter(start_time=tstart, stop_time=tend, parameter_id=param_id, method="REST")
115 122 return ts_type(var)
116 123 except Exception as e:
117 124 print(traceback.format_exc())
118 125 print("Error in amda.py ", str(e))
119 126 return ts_type()
120 127
121 128 _amda = AmdaProvider()
General Comments 0
You need to be logged in to leave comments. Login now