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.
- geospacelab/__init__.py +1 -1
- geospacelab/datahub/sources/cdaweb/dmsp/ssusi/downloader.py +103 -0
- geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/__init__.py +17 -7
- geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/downloader.py +13 -62
- geospacelab/datahub/sources/cdaweb/dmsp/ssusi/sdr_disk/__init__.py +317 -0
- geospacelab/datahub/sources/cdaweb/dmsp/ssusi/sdr_disk/downloader.py +44 -0
- geospacelab/datahub/sources/cdaweb/dmsp/ssusi/sdr_disk/loader.py +198 -0
- geospacelab/datahub/sources/cdaweb/dmsp/ssusi/sdr_disk/variable_config.py +149 -0
- geospacelab/datahub/sources/cdaweb/downloader.py +396 -97
- geospacelab/datahub/sources/cdaweb/downloader_backup.py +93 -0
- geospacelab/datahub/sources/cdaweb/omni/__init__.py +26 -14
- geospacelab/datahub/sources/cdaweb/omni/downloader.py +97 -84
- geospacelab/datahub/sources/esa_eo/swarm/advanced/efi_tct02/__init__.py +1 -1
- geospacelab/datahub/sources/esa_eo/swarm/advanced/efi_tct02/downloader.py +1 -1
- geospacelab/datahub/sources/gfz/hpo/__init__.py +1 -1
- geospacelab/datahub/sources/gfz/hpo/variable_config.py +3 -1
- geospacelab/datahub/sources/madrigal/isr/pfisr/fitted/loader.py +1 -1
- geospacelab/datahub/sources/madrigal/satellites/dmsp/downloader.py +2 -1
- geospacelab/datahub/sources/tud/champ/dns_acc/__init__.py +24 -7
- geospacelab/datahub/sources/tud/champ/dns_acc/downloader.py +29 -36
- geospacelab/datahub/sources/tud/champ/dns_acc/loader.py +28 -2
- geospacelab/datahub/sources/tud/champ/wnd_acc/__init__.py +68 -10
- geospacelab/datahub/sources/tud/champ/wnd_acc/downloader.py +29 -36
- geospacelab/datahub/sources/tud/champ/wnd_acc/loader.py +36 -7
- geospacelab/datahub/sources/tud/champ/wnd_acc/variable_config.py +3 -3
- geospacelab/datahub/sources/tud/downloader.py +288 -113
- geospacelab/datahub/sources/tud/goce/dns_acc/__init__.py +354 -0
- geospacelab/datahub/sources/tud/goce/dns_acc/downloader.py +42 -0
- geospacelab/datahub/sources/tud/goce/dns_acc/loader.py +66 -0
- geospacelab/datahub/sources/tud/goce/dns_acc/variable_config.py +139 -0
- geospacelab/datahub/sources/tud/goce/dns_wnd_acc/__init__.py +3 -3
- geospacelab/datahub/sources/tud/goce/dns_wnd_acc_v01/__init__.py +339 -0
- geospacelab/datahub/sources/tud/goce/dns_wnd_acc_v01/downloader.py +42 -0
- geospacelab/datahub/sources/tud/goce/dns_wnd_acc_v01/loader.py +84 -0
- geospacelab/datahub/sources/tud/goce/dns_wnd_acc_v01/variable_config.py +212 -0
- geospacelab/datahub/sources/tud/goce/wnd_acc/__init__.py +339 -0
- geospacelab/datahub/sources/tud/goce/wnd_acc/downloader.py +42 -0
- geospacelab/datahub/sources/tud/goce/wnd_acc/loader.py +65 -0
- geospacelab/datahub/sources/tud/goce/wnd_acc/variable_config.py +188 -0
- geospacelab/datahub/sources/tud/grace/dns_acc/__init__.py +6 -3
- geospacelab/datahub/sources/tud/grace/dns_acc/downloader.py +29 -37
- geospacelab/datahub/sources/tud/grace/wnd_acc/__init__.py +21 -4
- geospacelab/datahub/sources/tud/grace/wnd_acc/downloader.py +29 -39
- geospacelab/datahub/sources/tud/grace/wnd_acc/loader.py +5 -1
- geospacelab/datahub/sources/tud/grace/wnd_acc/variable_config.py +74 -0
- geospacelab/datahub/sources/tud/grace_fo/dns_acc/__init__.py +6 -3
- geospacelab/datahub/sources/tud/grace_fo/dns_acc/downloader.py +35 -40
- geospacelab/datahub/sources/tud/grace_fo/wnd_acc/__init__.py +20 -4
- geospacelab/datahub/sources/tud/grace_fo/wnd_acc/downloader.py +29 -44
- geospacelab/datahub/sources/tud/grace_fo/wnd_acc/loader.py +4 -0
- geospacelab/datahub/sources/tud/grace_fo/wnd_acc/variable_config.py +73 -0
- geospacelab/datahub/sources/tud/swarm/dns_acc/__init__.py +27 -5
- geospacelab/datahub/sources/tud/swarm/dns_acc/downloader.py +29 -38
- geospacelab/datahub/sources/tud/swarm/dns_pod/__init__.py +24 -5
- geospacelab/datahub/sources/tud/swarm/dns_pod/downloader.py +29 -38
- geospacelab/datahub/sources/tud/swarm/dns_pod/loader.py +3 -0
- geospacelab/datahub/sources/wdc/asysym/downloader.py +2 -2
- geospacelab/visualization/mpl/panels.py +7 -3
- {geospacelab-0.11.4.dist-info → geospacelab-0.12.0.dist-info}/METADATA +1 -1
- {geospacelab-0.11.4.dist-info → geospacelab-0.12.0.dist-info}/RECORD +63 -45
- {geospacelab-0.11.4.dist-info → geospacelab-0.12.0.dist-info}/WHEEL +1 -1
- {geospacelab-0.11.4.dist-info → geospacelab-0.12.0.dist-info}/licenses/LICENSE +0 -0
- {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.
|
|
18
|
-
from geospacelab.datahub.sources.tud.goce.
|
|
19
|
-
import geospacelab.datahub.sources.tud.goce.
|
|
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 = {
|