geospacelab 0.11.4__py3-none-any.whl → 0.12.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. geospacelab/__init__.py +1 -1
  2. geospacelab/datahub/sources/cdaweb/dmsp/ssusi/downloader.py +103 -0
  3. geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/__init__.py +17 -7
  4. geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/downloader.py +13 -62
  5. geospacelab/datahub/sources/cdaweb/dmsp/ssusi/sdr_disk/__init__.py +317 -0
  6. geospacelab/datahub/sources/cdaweb/dmsp/ssusi/sdr_disk/downloader.py +44 -0
  7. geospacelab/datahub/sources/cdaweb/dmsp/ssusi/sdr_disk/loader.py +198 -0
  8. geospacelab/datahub/sources/cdaweb/dmsp/ssusi/sdr_disk/variable_config.py +149 -0
  9. geospacelab/datahub/sources/cdaweb/downloader.py +396 -97
  10. geospacelab/datahub/sources/cdaweb/downloader_backup.py +93 -0
  11. geospacelab/datahub/sources/cdaweb/omni/__init__.py +26 -14
  12. geospacelab/datahub/sources/cdaweb/omni/downloader.py +97 -84
  13. geospacelab/datahub/sources/esa_eo/swarm/advanced/efi_tct02/__init__.py +1 -1
  14. geospacelab/datahub/sources/esa_eo/swarm/advanced/efi_tct02/downloader.py +1 -1
  15. geospacelab/datahub/sources/gfz/hpo/__init__.py +1 -1
  16. geospacelab/datahub/sources/gfz/hpo/variable_config.py +3 -1
  17. geospacelab/datahub/sources/madrigal/isr/pfisr/fitted/loader.py +1 -1
  18. geospacelab/datahub/sources/madrigal/satellites/dmsp/downloader.py +2 -1
  19. geospacelab/datahub/sources/tud/champ/dns_acc/__init__.py +24 -7
  20. geospacelab/datahub/sources/tud/champ/dns_acc/downloader.py +29 -36
  21. geospacelab/datahub/sources/tud/champ/dns_acc/loader.py +28 -2
  22. geospacelab/datahub/sources/tud/champ/wnd_acc/__init__.py +68 -10
  23. geospacelab/datahub/sources/tud/champ/wnd_acc/downloader.py +29 -36
  24. geospacelab/datahub/sources/tud/champ/wnd_acc/loader.py +36 -7
  25. geospacelab/datahub/sources/tud/champ/wnd_acc/variable_config.py +3 -3
  26. geospacelab/datahub/sources/tud/downloader.py +288 -113
  27. geospacelab/datahub/sources/tud/goce/dns_acc/__init__.py +354 -0
  28. geospacelab/datahub/sources/tud/goce/dns_acc/downloader.py +42 -0
  29. geospacelab/datahub/sources/tud/goce/dns_acc/loader.py +66 -0
  30. geospacelab/datahub/sources/tud/goce/dns_acc/variable_config.py +139 -0
  31. geospacelab/datahub/sources/tud/goce/dns_wnd_acc/__init__.py +3 -3
  32. geospacelab/datahub/sources/tud/goce/dns_wnd_acc_v01/__init__.py +339 -0
  33. geospacelab/datahub/sources/tud/goce/dns_wnd_acc_v01/downloader.py +42 -0
  34. geospacelab/datahub/sources/tud/goce/dns_wnd_acc_v01/loader.py +84 -0
  35. geospacelab/datahub/sources/tud/goce/dns_wnd_acc_v01/variable_config.py +212 -0
  36. geospacelab/datahub/sources/tud/goce/wnd_acc/__init__.py +339 -0
  37. geospacelab/datahub/sources/tud/goce/wnd_acc/downloader.py +42 -0
  38. geospacelab/datahub/sources/tud/goce/wnd_acc/loader.py +65 -0
  39. geospacelab/datahub/sources/tud/goce/wnd_acc/variable_config.py +188 -0
  40. geospacelab/datahub/sources/tud/grace/dns_acc/__init__.py +6 -3
  41. geospacelab/datahub/sources/tud/grace/dns_acc/downloader.py +29 -37
  42. geospacelab/datahub/sources/tud/grace/wnd_acc/__init__.py +21 -4
  43. geospacelab/datahub/sources/tud/grace/wnd_acc/downloader.py +29 -39
  44. geospacelab/datahub/sources/tud/grace/wnd_acc/loader.py +5 -1
  45. geospacelab/datahub/sources/tud/grace/wnd_acc/variable_config.py +74 -0
  46. geospacelab/datahub/sources/tud/grace_fo/dns_acc/__init__.py +6 -3
  47. geospacelab/datahub/sources/tud/grace_fo/dns_acc/downloader.py +35 -40
  48. geospacelab/datahub/sources/tud/grace_fo/wnd_acc/__init__.py +20 -4
  49. geospacelab/datahub/sources/tud/grace_fo/wnd_acc/downloader.py +29 -44
  50. geospacelab/datahub/sources/tud/grace_fo/wnd_acc/loader.py +4 -0
  51. geospacelab/datahub/sources/tud/grace_fo/wnd_acc/variable_config.py +73 -0
  52. geospacelab/datahub/sources/tud/swarm/dns_acc/__init__.py +27 -5
  53. geospacelab/datahub/sources/tud/swarm/dns_acc/downloader.py +29 -38
  54. geospacelab/datahub/sources/tud/swarm/dns_pod/__init__.py +24 -5
  55. geospacelab/datahub/sources/tud/swarm/dns_pod/downloader.py +29 -38
  56. geospacelab/datahub/sources/tud/swarm/dns_pod/loader.py +3 -0
  57. geospacelab/datahub/sources/wdc/asysym/downloader.py +2 -2
  58. geospacelab/visualization/mpl/panels.py +7 -3
  59. {geospacelab-0.11.4.dist-info → geospacelab-0.12.0.dist-info}/METADATA +1 -1
  60. {geospacelab-0.11.4.dist-info → geospacelab-0.12.0.dist-info}/RECORD +63 -45
  61. {geospacelab-0.11.4.dist-info → geospacelab-0.12.0.dist-info}/WHEEL +1 -1
  62. {geospacelab-0.11.4.dist-info → geospacelab-0.12.0.dist-info}/licenses/LICENSE +0 -0
  63. {geospacelab-0.11.4.dist-info → geospacelab-0.12.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,354 @@
1
+ # Licensed under the BSD 3-Clause License
2
+ # Copyright (C) 2021 GeospaceLab (geospacelab)
3
+ # Author: Lei Cai, Space Physics and Astronomy, University of Oulu
4
+
5
+ import numpy as np
6
+ import datetime
7
+
8
+ import geospacelab.datahub as datahub
9
+ from geospacelab.datahub import DatabaseModel, FacilityModel, InstrumentModel, ProductModel
10
+ from geospacelab.datahub.sources.tud import tud_database
11
+ from geospacelab.datahub.sources.tud.grace import grace_facility
12
+ from geospacelab.config import prf
13
+ import geospacelab.toolbox.utilities.pybasic as basic
14
+ import geospacelab.toolbox.utilities.pylogging as mylog
15
+ import geospacelab.toolbox.utilities.pydatetime as dttool
16
+ from geospacelab.datahub.sources.tud.goce.dns_acc.loader import Loader as default_Loader
17
+ from geospacelab.datahub.sources.tud.goce.dns_acc.downloader import Downloader as default_Downloader
18
+ import geospacelab.datahub.sources.tud.goce.dns_acc.variable_config as var_config
19
+
20
+
21
+ default_dataset_attrs = {
22
+ 'database': tud_database,
23
+ 'facility': grace_facility,
24
+ 'instrument': 'ACC',
25
+ 'product': 'DNS-ACC',
26
+ 'data_file_ext': 'txt',
27
+ 'product_version': 'v02',
28
+ 'data_root_dir': prf.datahub_data_root_dir / 'TUD' / 'GOCE',
29
+ 'allow_load': True,
30
+ 'allow_download': True,
31
+ 'force_download': False,
32
+ 'data_search_recursive': False,
33
+ 'add_AACGM': False,
34
+ 'add_APEX': False,
35
+ 'label_fields': ['database', 'facility', 'instrument', 'product', 'product_version'],
36
+ 'load_mode': 'AUTO',
37
+ 'time_clip': True,
38
+ }
39
+
40
+ default_variable_names_v01 = []
41
+
42
+ default_variable_names_v02 = [
43
+ 'SC_DATETIME',
44
+ 'SC_GEO_LAT',
45
+ 'SC_GEO_LON',
46
+ 'SC_GEO_ALT',
47
+ 'SC_ARG_LAT',
48
+ 'SC_GEO_LST',
49
+ 'rho_n',
50
+ 'rho_n_MEAN',
51
+ 'FLAG',
52
+ 'FLAG_MEAN',
53
+ ]
54
+
55
+ # default_data_search_recursive = True
56
+
57
+ default_attrs_required = []
58
+
59
+
60
+ class Dataset(datahub.DatasetSourced):
61
+ def __init__(self, **kwargs):
62
+ kwargs = basic.dict_set_default(kwargs, **default_dataset_attrs)
63
+
64
+ super().__init__(**kwargs)
65
+
66
+ self.database = kwargs.pop('database', 'TUD')
67
+ self.facility = kwargs.pop('facility', 'GOCE')
68
+ self.instrument = kwargs.pop('instrument', 'ACC')
69
+ self.product = kwargs.pop('product', 'DNS-ACC')
70
+ self.product_version = kwargs.pop('product_version', 'v02')
71
+ self.local_latest_version = ''
72
+ self.allow_download = kwargs.pop('allow_download', False)
73
+ self.force_download = kwargs.pop('force_download', False)
74
+ self.download_dry_run = kwargs.pop('download_dry_run', False)
75
+
76
+ self.add_AACGM = kwargs.pop('add_AACGM', False)
77
+ self.add_APEX = kwargs.pop('add_APEX', False)
78
+ self._data_root_dir = self.data_root_dir # Record the initial root dir
79
+
80
+ self.sat_id = kwargs.pop('sat_id', '')
81
+
82
+ self.metadata = {}
83
+
84
+ allow_load = kwargs.pop('allow_load', False)
85
+
86
+ # self.config(**kwargs)
87
+
88
+ if self.loader is None:
89
+ self.loader = default_Loader
90
+
91
+ if self.downloader is None:
92
+ self.downloader = default_Downloader
93
+
94
+ self._validate_attrs()
95
+
96
+ if allow_load:
97
+ self.load_data()
98
+
99
+ def _validate_attrs(self):
100
+ for attr_name in default_attrs_required:
101
+ attr = getattr(self, attr_name)
102
+ if not attr:
103
+ mylog.StreamLogger.warning("The parameter {} is required before loading data!".format(attr_name))
104
+
105
+ self.data_root_dir = self.data_root_dir / self.product.upper() / self.product_version
106
+
107
+ def label(self, **kwargs):
108
+ label = super().label()
109
+ return label
110
+
111
+ def load_data(self, **kwargs):
112
+ self.check_data_files(**kwargs)
113
+ if self.product_version == 'v01':
114
+ default_variable_names = default_variable_names_v01
115
+ else:
116
+ default_variable_names = default_variable_names_v02
117
+ self._set_default_variables(
118
+ default_variable_names,
119
+ configured_variables=var_config.configured_variables
120
+ )
121
+
122
+ if self.product_version == 'v01':
123
+ raise NotImplementedError
124
+
125
+ for file_path in self.data_file_paths:
126
+ load_obj = self.loader(file_path, file_type='txt', version=self.product_version)
127
+
128
+ for var_name in self._variables.keys():
129
+ value = load_obj.variables[var_name]
130
+ self._variables[var_name].join(value)
131
+
132
+ # self.select_beams(field_aligned=True)
133
+ if self.time_clip:
134
+ self.time_filter_by_range(var_datetime_name='SC_DATETIME')
135
+
136
+ if self.add_AACGM:
137
+ self.convert_to_AACGM()
138
+
139
+ if self.add_APEX:
140
+ self.convert_to_APEX()
141
+
142
+ def add_GEO_LST(self):
143
+ lons = self['SC_GEO_LON'].flatten()
144
+ uts = self['SC_DATETIME'].flatten()
145
+ lsts = [ut + datetime.timedelta(seconds=int(lon/15.*3600)) for ut, lon in zip(uts, lons)]
146
+ lsts = [lst.hour + lst.minute/60. + lst.second/3600. for lst in lsts]
147
+ var = self.add_variable(var_name='SC_GEO_LST')
148
+ var.value = np.array(lsts)[:, np.newaxis]
149
+ var.label = 'LST'
150
+ var.unit = 'h'
151
+ var.depends = self['SC_GEO_LON'].depends
152
+ return var
153
+
154
+ def convert_to_APEX(self):
155
+ import geospacelab.cs as gsl_cs
156
+
157
+ coords_in = {
158
+ 'lat': self['SC_GEO_LAT'].value.flatten(),
159
+ 'lon': self['SC_GEO_LON'].value.flatten(),
160
+ 'height': self['SC_GEO_ALT'].value.flatten()
161
+ }
162
+ dts = self['SC_DATETIME'].value.flatten()
163
+ cs_sph = gsl_cs.GEOCSpherical(coords=coords_in, ut=dts)
164
+ cs_apex = cs_sph.to_APEX(append_mlt=True)
165
+ self.add_variable('SC_APEX_LAT')
166
+ self.add_variable('SC_APEX_LON')
167
+ self.add_variable('SC_APEX_MLT')
168
+ self['SC_APEX_LAT'].value = cs_apex['lat'].reshape(self['SC_DATETIME'].value.shape)
169
+ self['SC_APEX_LON'].value = cs_apex['lon'].reshape(self['SC_DATETIME'].value.shape)
170
+ self['SC_APEX_MLT'].value = cs_apex['mlt'].reshape(self['SC_DATETIME'].value.shape)
171
+
172
+ def convert_to_AACGM(self):
173
+ import geospacelab.cs as gsl_cs
174
+
175
+ coords_in = {
176
+ 'lat': self['SC_GEO_LAT'].value.flatten(),
177
+ 'lon': self['SC_GEO_LON'].value.flatten(),
178
+ 'height': self['SC_GEO_ALT'].value.flatten()
179
+ }
180
+ dts = self['SC_DATETIME'].value.flatten()
181
+ cs_sph = gsl_cs.GEOCSpherical(coords=coords_in, ut=dts)
182
+ cs_aacgm = cs_sph.to_AACGM(append_mlt=True)
183
+ self.add_variable('SC_AACGM_LAT')
184
+ self.add_variable('SC_AACGM_LON')
185
+ self.add_variable('SC_AACGM_MLT')
186
+ self['SC_AACGM_LAT'].value = cs_aacgm['lat'].reshape(self['SC_DATETIME'].value.shape)
187
+ self['SC_AACGM_LON'].value = cs_aacgm['lon'].reshape(self['SC_DATETIME'].value.shape)
188
+ self['SC_AACGM_MLT'].value = cs_aacgm['mlt'].reshape(self['SC_DATETIME'].value.shape)
189
+
190
+ def interp_evenly(self, time_res=None, time_res_o=10, dt_fr=None, dt_to=None, masked=False):
191
+ from scipy.interpolate import interp1d
192
+ import geospacelab.toolbox.utilities.numpymath as nm
193
+ if time_res is None:
194
+ time_res = time_res_o
195
+ ds_new = datahub.DatasetUser(dt_fr=self.dt_fr, dt_to=self.dt_to, visual=self.visual)
196
+ ds_new.clone_variables(self)
197
+ dts = ds_new['SC_DATETIME'].value.flatten()
198
+ dt0 = dttool.get_start_of_the_day(dts[0])
199
+ x_0 = np.array([(dt - dt0).total_seconds() for dt in dts])
200
+ if dt_fr is None:
201
+ dt_fr = dts[0] - datetime.timedelta(
202
+ seconds=np.floor(((dts[0] - ds_new.dt_fr).total_seconds() / time_res)) * time_res
203
+ )
204
+ if dt_to is None:
205
+ dt_to = dts[-1] + datetime.timedelta(
206
+ seconds=np.floor(((ds_new.dt_to - dts[-1]).total_seconds() / time_res)) * time_res
207
+ )
208
+ sec_fr = (dt_fr - dt0).total_seconds()
209
+ sec_to = (dt_to - dt0).total_seconds()
210
+ x_1 = np.arange(sec_fr, sec_to + time_res / 2, time_res)
211
+
212
+ f = interp1d(x_0, x_0, kind='nearest', bounds_error=False, fill_value=(x_0[0], x_0[-1]))
213
+ pseudo_x = f(x_1)
214
+ mask = np.abs(pseudo_x-x_1) > time_res_o/1.5
215
+
216
+ dts_new = np.array([dt0 + datetime.timedelta(seconds=sec) for sec in x_1])
217
+ ds_new['SC_DATETIME'].value = dts_new.reshape((dts_new.size, 1))
218
+
219
+ period_var_dict = {'SC_GEO_LON': 360.,
220
+ 'SC_AACGM_LON': 360.,
221
+ 'SC_APEX_LON': 360.,
222
+ 'SC_GEO_LST': 24.,
223
+ 'SC_AACGM_MLT': 24.,
224
+ 'SC_APEX_MLT': 24}
225
+
226
+ for var_name in ds_new.keys():
227
+ if var_name in ['SC_DATETIME']:
228
+ continue
229
+ if var_name in period_var_dict.keys():
230
+ var = ds_new[var_name].value.flatten()
231
+ var_new = nm.interp_period_data(x_0, var, x_1, period=period_var_dict[var_name], method='linear', bounds_error=False)
232
+ else:
233
+ method = 'linear' if 'FLAG' not in var_name else 'nearest'
234
+ var = ds_new[var_name].value.flatten()
235
+ f = interp1d(x_0, var, kind=method, bounds_error=False)
236
+ var_new = f(x_1)
237
+ if masked:
238
+ var_new = np.ma.array(var_new, mask=mask, fill_value=np.nan)
239
+ else:
240
+ var_new[mask] = np.nan
241
+ ds_new[var_name].value = var_new.reshape((dts_new.size, 1))
242
+ return ds_new
243
+
244
+ def search_data_files(self, **kwargs):
245
+
246
+ dt_fr = self.dt_fr
247
+ dt_to = self.dt_to
248
+
249
+ diff_months = dttool.get_diff_months(dt_fr, dt_to)
250
+
251
+ dt0 = dttool.get_first_day_of_month(self.dt_fr)
252
+
253
+ for i in range(diff_months + 1):
254
+ this_day = dttool.get_next_n_months(dt0, i)
255
+
256
+ initial_file_dir = kwargs.pop(
257
+ 'initial_file_dir', self.data_root_dir
258
+ )
259
+
260
+ file_patterns = [
261
+ 'GO',
262
+ self.product.upper().replace('-', '_'),
263
+ this_day.strftime('%Y_%m'),
264
+ ]
265
+ # remove empty str
266
+ file_patterns = [pattern for pattern in file_patterns if str(pattern)]
267
+ search_pattern = '*' + '*'.join(file_patterns) + '*'
268
+
269
+ done = super().search_data_files(
270
+ initial_file_dir=initial_file_dir,
271
+ search_pattern=search_pattern,
272
+ allow_multiple_files=False,
273
+ )
274
+ # Validate file paths
275
+
276
+ if (not done and self.allow_download) or self.force_download:
277
+ done = self.download_data()
278
+ if done:
279
+ initial_file_dir = self.data_root_dir
280
+ done = super().search_data_files(
281
+ initial_file_dir=initial_file_dir,
282
+ search_pattern=search_pattern,
283
+ allow_multiple_files=False
284
+ )
285
+ self.data_file_paths = np.unique(self.data_file_paths)
286
+ return done
287
+
288
+ def download_data(self, dt_fr=None, dt_to=None):
289
+ if dt_fr is None:
290
+ dt_fr = self.dt_fr
291
+ if dt_to is None:
292
+ dt_to = self.dt_to
293
+ download_obj = self.downloader(
294
+ dt_fr, dt_to,
295
+ sat_id=self.sat_id,
296
+ product=self.product,
297
+ version=self.product_version,
298
+ force_download=self.force_download,
299
+ dry_run=self.download_dry_run
300
+ )
301
+
302
+ return any(download_obj.done)
303
+
304
+ @property
305
+ def database(self):
306
+ return self._database
307
+
308
+ @database.setter
309
+ def database(self, value):
310
+ if isinstance(value, str):
311
+ self._database = DatabaseModel(value)
312
+ elif issubclass(value.__class__, DatabaseModel):
313
+ self._database = value
314
+ else:
315
+ raise TypeError
316
+
317
+ @property
318
+ def product(self):
319
+ return self._product
320
+
321
+ @product.setter
322
+ def product(self, value):
323
+ if isinstance(value, str):
324
+ self._product = ProductModel(value)
325
+ elif issubclass(value.__class__, ProductModel):
326
+ self._product = value
327
+ else:
328
+ raise TypeError
329
+
330
+ @property
331
+ def facility(self):
332
+ return self._facility
333
+
334
+ @facility.setter
335
+ def facility(self, value):
336
+ if isinstance(value, str):
337
+ self._facility = FacilityModel(value)
338
+ elif issubclass(value.__class__, FacilityModel):
339
+ self._facility = value
340
+ else:
341
+ raise TypeError
342
+
343
+ @property
344
+ def instrument(self):
345
+ return self._instrument
346
+
347
+ @instrument.setter
348
+ def instrument(self, value):
349
+ if isinstance(value, str):
350
+ self._instrument = InstrumentModel(value)
351
+ elif issubclass(value.__class__, InstrumentModel):
352
+ self._instrument = value
353
+ else:
354
+ raise TypeError
@@ -0,0 +1,42 @@
1
+ # Licensed under the BSD 3-Clause License
2
+ # Copyright (C) 2021 GeospaceLab (geospacelab)
3
+ # Author: Lei Cai, Space Physics and Astronomy, University of Oulu
4
+
5
+ __author__ = "Lei Cai"
6
+ __copyright__ = "Copyright 2021, GeospaceLab"
7
+ __license__ = "BSD-3-Clause License"
8
+ __email__ = "lei.cai@oulu.fi"
9
+ __docformat__ = "reStructureText"
10
+
11
+ import datetime
12
+ from geospacelab.config import prf
13
+
14
+ from geospacelab.datahub.sources.tud.downloader import TUDownloader as DownloaderBase
15
+
16
+
17
+ class Downloader(DownloaderBase):
18
+
19
+ def __init__(self,
20
+ dt_fr, dt_to,
21
+ mission='GOCE',
22
+ sat_id='',
23
+ version='v02',
24
+ product='DNS-ACC',
25
+ direct_download=True,
26
+ force_download=False,
27
+ dry_run=False,
28
+ ):
29
+ self.mission = mission
30
+ self.version = version
31
+
32
+ super().__init__(
33
+ dt_fr, dt_to,
34
+ mission=mission,
35
+ sat_id=sat_id,
36
+ version=version,
37
+ product=product,
38
+ direct_download=direct_download,
39
+ force_download=force_download,
40
+ dry_run=dry_run
41
+ )
42
+
@@ -0,0 +1,66 @@
1
+ # Licensed under the BSD 3-Clause License
2
+ # Copyright (C) 2021 GeospaceLab (geospacelab)
3
+ # Author: Lei Cai, Space Physics and Astronomy, University of Oulu
4
+
5
+ __author__ = "Lei Cai"
6
+ __copyright__ = "Copyright 2021, GeospaceLab"
7
+ __license__ = "BSD-3-Clause License"
8
+ __email__ = "lei.cai@oulu.fi"
9
+ __docformat__ = "reStructureText"
10
+
11
+ import re
12
+ import numpy as np
13
+ import datetime
14
+ import geospacelab.toolbox.utilities.pydatetime as dttool
15
+
16
+
17
+ class Loader(object):
18
+
19
+ def __init__(self, file_path, file_type='txt', version='v01', direct_load=True):
20
+ self.file_path = file_path
21
+ self.file_type = file_type
22
+ self.version = version
23
+ self.variables = {}
24
+ self.done = False
25
+ self.t_res = 10
26
+ if direct_load:
27
+ self.load()
28
+
29
+ def load(self):
30
+
31
+ if self.version == 'v01':
32
+ self.load_v01()
33
+ elif self.version == 'v02':
34
+ self.load_v02()
35
+ else:
36
+ raise NotImplementedError
37
+
38
+ def load_v01(self):
39
+ raise NotImplementedError("GOCE DNS-ACC v01 data loading is not implemented.")
40
+
41
+ def load_v02(self):
42
+ with open(self.file_path, 'r') as f:
43
+ text = f.read()
44
+ results = re.findall(
45
+ r"^(\d{4}-\d{2}-\d{2}\s*\d{2}\:\d{2}\:\d{2}\.\d{3})\s*(\w{3})\s*"
46
+ + r"([\-\d.]+)\s*([\-\d.]+)\s*([\-\d.]+)\s*([\-\d.]+)\s*([\-\d.]+)\s*([+\-\d.Ee]+)\s*([+\-\d.Ee]+)\s*([\-\d.]+)\s*([\-\d.]+)",
47
+ text,
48
+ re.M)
49
+ results = list(zip(*results))
50
+ dts = [datetime.datetime.strptime(dtstr + '000', "%Y-%m-%d %H:%M:%S.%f") for dtstr in results[0]]
51
+ num_rec = len(dts)
52
+ if results[1][0] == 'GPS':
53
+ self.variables['SC_GPSTIME'] = np.array(dts).reshape(num_rec, 1)
54
+ t_gps = [(dt - dttool._GPS_DATETIME_0).total_seconds() for dt in dts]
55
+ dts = dttool.convert_gps_time_to_datetime(t_gps, weeks=None)
56
+
57
+ self.variables['SC_DATETIME'] = np.array(dts).reshape(num_rec, 1)
58
+ self.variables['SC_GEO_ALT'] = np.array(results[2]).astype(np.float32).reshape(num_rec, 1) * 1e-3 # in km
59
+ self.variables['SC_GEO_LON'] = np.array(results[3]).astype(np.float32).reshape(num_rec, 1)
60
+ self.variables['SC_GEO_LAT'] = np.array(results[4]).astype(np.float32).reshape(num_rec, 1)
61
+ self.variables['SC_GEO_LST'] = np.array(results[5]).astype(np.float32).reshape(num_rec, 1)
62
+ self.variables['SC_ARG_LAT'] = np.array(results[6]).astype(np.float32).reshape(num_rec, 1)
63
+ self.variables['rho_n'] = np.array(results[7]).astype(np.float32).reshape(num_rec, 1)
64
+ self.variables['rho_n_MEAN'] = np.array(results[8]).astype(np.float32).reshape(num_rec, 1)
65
+ self.variables['FLAG'] = np.array(results[9]).astype(np.float32).reshape(num_rec, 1)
66
+ self.variables['FLAG_MEAN'] = np.array(results[10]).astype(np.float32).reshape(num_rec, 1)
@@ -0,0 +1,139 @@
1
+ # Licensed under the BSD 3-Clause License
2
+ # Copyright (C) 2021 GeospaceLab (geospacelab)
3
+ # Author: Lei Cai, Space Physics and Astronomy, University of Oulu
4
+
5
+ __author__ = "Lei Cai"
6
+ __copyright__ = "Copyright 2021, GeospaceLab"
7
+ __license__ = "BSD-3-Clause License"
8
+ __email__ = "lei.cai@oulu.fi"
9
+ __docformat__ = "reStructureText"
10
+
11
+ from geospacelab.datahub import VariableModel as Var
12
+ import geospacelab.visualization.mpl.colormaps as cm
13
+
14
+ import numpy as np
15
+
16
+ database = 'ESA/EarthOnline'
17
+
18
+ timestamps = {
19
+ 'SC_DATETIME': 'SC_DATETIME',
20
+ }
21
+
22
+
23
+ default_colormap = "gist_ncar"
24
+
25
+ default_plot_config = {
26
+ 'line': {
27
+ 'linestyle': '-',
28
+ 'linewidth': 1.5,
29
+ 'marker': '',
30
+ 'markersize': 3,
31
+ },
32
+ 'pcolormesh': {
33
+ 'cmap': default_colormap,
34
+ }
35
+ }
36
+
37
+ configured_variables = {}
38
+ visual = 'on'
39
+
40
+ depend_0 = {'UT': 'SC_DATETIME',
41
+ 'GEO_LAT': 'SC_GEO_LAT', 'GEO_LON': 'SC_GEO_LON',
42
+ 'AACGM_LAT': 'SC_AACGM_LAT', 'AACGM_LON': 'SC_AACGM_LON', 'AACGM_MLT': 'SC_AACGM_MLT'}
43
+ # depend_c = {'SPECTRA': 'EMISSION_SPECTRA'}
44
+
45
+ ####################################################################################################################
46
+ var_name = 'rho_n'
47
+ var = Var(name=var_name, ndim=1, variable_type='scalar', visual=visual)
48
+ # set variable attrs
49
+ var.fullname = 'Neutral mass density'
50
+ var.label = r'$\rho_n$'
51
+ var.unit = 'kg/m-3'
52
+ var.unit_label = r'kg$\cdot$m$^{-3}$'
53
+ var.group = r'$\rho$'
54
+ # var.error = var_name + '_err'
55
+ var.depends = {0: depend_0}
56
+ # set plot attrs
57
+ plot_config = var.visual.plot_config
58
+ plot_config.config(**default_plot_config)
59
+ plot_config.style = '1noE'
60
+ # set axis attrs
61
+ axis = var.visual.axis
62
+ axis[1].data = "@v.value"
63
+ # axis[1].lim = [np.nan, np.nan]
64
+ axis[2].label = '@v.label'
65
+ axis[1].unit = '@v.unit_label'
66
+
67
+ configured_variables[var_name] = var
68
+
69
+ ####################################################################################################################
70
+ var_name = 'rho_n_MEAN'
71
+ var = Var(name=var_name, ndim=1, variable_type='scalar', visual=visual)
72
+ # set variable attrs
73
+ var.fullname = 'Neutral mass density averaged per orbit'
74
+ var.label = r'$\bar{\rho}_n$'
75
+ var.unit = 'kg/m-3'
76
+ var.unit_label = r'kg$\cdot$m$^{-3}$'
77
+ var.group = r'$\rho$'
78
+ # var.error = var_name + '_err'
79
+ var.depends = {0: depend_0}
80
+ # set plot attrs
81
+ plot_config = var.visual.plot_config
82
+ plot_config.config(**default_plot_config)
83
+ plot_config.style = '1noE'
84
+ # set axis attrs
85
+ axis = var.visual.axis
86
+ axis[1].data = "@v.value"
87
+ # axis[1].lim = [np.nan, np.nan]
88
+ axis[2].label = '@v.label'
89
+ axis[1].unit = '@v.unit_label'
90
+
91
+ configured_variables[var_name] = var
92
+
93
+ ####################################################################################################################
94
+ var_name = 'SC_GEO_LAT'
95
+ var = Var(name=var_name, ndim=1, variable_type='scalar', visual=visual)
96
+ # set variable attrs
97
+ var.fullname = 'S/C geographic latitude'
98
+ var.label = r'GLAT'
99
+ var.unit = 'degree'
100
+ var.unit_label = r'$^\circ$'
101
+ var.group = r'GEO'
102
+ # var.error = var_name + '_err'
103
+ var.depends = {0: depend_0}
104
+ # set plot attrs
105
+ plot_config = var.visual.plot_config
106
+ plot_config.config(**default_plot_config)
107
+ plot_config.style = '1noE'
108
+ # set axis attrs
109
+ axis = var.visual.axis
110
+ axis[1].data = "@v.value"
111
+ # axis[1].lim = [-2000, 2000]
112
+ axis[1].label = '@v.label'
113
+ axis[1].unit = '@v.unit_label'
114
+
115
+ configured_variables[var_name] = var
116
+
117
+ ####################################################################################################################
118
+ var_name = 'SC_GEO_LON'
119
+ var = Var(name=var_name, ndim=1, variable_type='scalar', visual=visual)
120
+ # set variable attrs
121
+ var.fullname = 'S/C geographic latitude'
122
+ var.label = r'GLON'
123
+ var.unit = 'degree'
124
+ var.unit_label = r'$^\circ$'
125
+ var.group = r'GEO'
126
+ # var.error = var_name + '_err'
127
+ var.depends = {0: depend_0}
128
+ # set plot attrs
129
+ plot_config = var.visual.plot_config
130
+ plot_config.config(**default_plot_config)
131
+ plot_config.style = '1noE'
132
+ # set axis attrs
133
+ axis = var.visual.axis
134
+ axis[1].data = "@v.value"
135
+ # axis[1].lim = [-2000, 2000]
136
+ axis[1].label = '@v.label'
137
+ axis[1].unit = '@v.unit_label'
138
+
139
+ configured_variables[var_name] = var
@@ -14,9 +14,9 @@ import geospacelab.toolbox.utilities.pybasic as basic
14
14
  import geospacelab.toolbox.utilities.pylogging as mylog
15
15
  import geospacelab.toolbox.utilities.pydatetime as dttool
16
16
 
17
- from geospacelab.datahub.sources.tud.goce.dns_wnd_acc.loader import Loader as default_Loader
18
- from geospacelab.datahub.sources.tud.goce.dns_wnd_acc.downloader import Downloader as default_Downloader
19
- import geospacelab.datahub.sources.tud.goce.dns_wnd_acc.variable_config as var_config
17
+ from geospacelab.datahub.sources.tud.goce.wnd_acc.loader import Loader as default_Loader
18
+ from geospacelab.datahub.sources.tud.goce.wnd_acc.downloader import Downloader as default_Downloader
19
+ import geospacelab.datahub.sources.tud.goce.wnd_acc.variable_config as var_config
20
20
 
21
21
 
22
22
  default_dataset_attrs = {