geospacelab 0.9.1__py3-none-any.whl → 0.9.3__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/downloader.py +90 -14
- geospacelab/datahub/sources/esa_eo/swarm/downloader.py +7 -4
- geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_acc/__init__.py +63 -7
- geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_acc/downloader.py +1 -1
- geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_acc/loader.py +2 -3
- geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_pod/__init__.py +59 -2
- geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_pod/downloader.py +2 -0
- geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_pod/loader.py +3 -0
- geospacelab/datahub/sources/jhuapl/dmsp/ssusi/edraur/variable_config.py +1 -1
- geospacelab/express/eiscat_dashboard.py +3 -2
- geospacelab/observatory/orbit/utilities.py +1 -0
- geospacelab/visualization/mpl/dashboards.py +1 -1
- {geospacelab-0.9.1.dist-info → geospacelab-0.9.3.dist-info}/METADATA +14 -6
- {geospacelab-0.9.1.dist-info → geospacelab-0.9.3.dist-info}/RECORD +18 -18
- {geospacelab-0.9.1.dist-info → geospacelab-0.9.3.dist-info}/WHEEL +1 -1
- {geospacelab-0.9.1.dist-info → geospacelab-0.9.3.dist-info}/licenses/LICENSE +0 -0
- {geospacelab-0.9.1.dist-info → geospacelab-0.9.3.dist-info}/top_level.txt +0 -0
geospacelab/__init__.py
CHANGED
|
@@ -6,7 +6,7 @@ __author__ = "Lei Cai"
|
|
|
6
6
|
__copyright__ = "Copyright 2021, GeospaceLAB"
|
|
7
7
|
__credits__ = ["Lei Cai"]
|
|
8
8
|
__license__ = "BSD-3-Clause License"
|
|
9
|
-
__version__ = "0.9.
|
|
9
|
+
__version__ = "0.9.3"
|
|
10
10
|
__maintainer__ = "Lei Cai"
|
|
11
11
|
__email__ = "lei.cai@oulu.fi"
|
|
12
12
|
__status__ = "Developing"
|
|
@@ -10,34 +10,56 @@ __docformat__ = "reStructureText"
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
import datetime
|
|
13
|
+
import pathlib
|
|
14
|
+
|
|
13
15
|
import requests
|
|
14
16
|
import bs4
|
|
15
17
|
import re
|
|
18
|
+
import tqdm
|
|
16
19
|
|
|
17
20
|
import geospacelab.toolbox.utilities.pydatetime as dttool
|
|
18
21
|
import geospacelab.toolbox.utilities.pylogging as mylog
|
|
22
|
+
from geospacelab.config import prf
|
|
19
23
|
|
|
20
24
|
|
|
21
25
|
class Downloader(object):
|
|
22
26
|
|
|
23
|
-
def __init__(
|
|
27
|
+
def __init__(
|
|
28
|
+
self,
|
|
29
|
+
dt_fr,
|
|
30
|
+
dt_to,
|
|
31
|
+
direct_download=True,
|
|
32
|
+
force_download=False,
|
|
33
|
+
data_file_root_dir=None,
|
|
34
|
+
dry_run=False,
|
|
35
|
+
from_ftp=False,
|
|
36
|
+
):
|
|
24
37
|
|
|
25
38
|
self.url_base = "https://cdaweb.gsfc.nasa.gov/pub/data/"
|
|
26
39
|
self.force_download = force_download
|
|
40
|
+
self.dry_run=dry_run
|
|
41
|
+
self.from_ftp=from_ftp
|
|
27
42
|
|
|
28
43
|
self.dt_fr = dt_fr
|
|
29
44
|
self.dt_to = dt_to
|
|
30
45
|
self.source_file_paths = []
|
|
31
46
|
|
|
47
|
+
if data_file_root_dir is None:
|
|
48
|
+
self.data_file_root_dir = prf.datahub_data_root_dir
|
|
49
|
+
else:
|
|
50
|
+
self.data_file_root_dir = data_file_root_dir
|
|
51
|
+
|
|
32
52
|
if direct_download:
|
|
33
53
|
self.download()
|
|
34
54
|
|
|
35
|
-
def download(self):
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
55
|
+
def download(self,):
|
|
56
|
+
if self.from_ftp:
|
|
57
|
+
raise NotImplementedError
|
|
58
|
+
else:
|
|
59
|
+
self.download_from_http()
|
|
60
|
+
|
|
61
|
+
def search_from_http(self, subdirs=None, file_name_patterns=None):
|
|
39
62
|
url = self.url_base + '/'.join(subdirs)
|
|
40
|
-
|
|
41
63
|
r = requests.get(url)
|
|
42
64
|
|
|
43
65
|
soup = bs4.BeautifulSoup(r.text, 'html.parser')
|
|
@@ -48,15 +70,69 @@ class Downloader(object):
|
|
|
48
70
|
fn_regex = re.compile(search_pattern)
|
|
49
71
|
hrefs = list(filter(fn_regex.match, hrefs))
|
|
50
72
|
|
|
51
|
-
|
|
52
|
-
if len(hrefs) == 0:
|
|
53
|
-
mylog.StreamLogger.warning("Cannot find any files matching the file patterns!")
|
|
54
|
-
elif len(hrefs) > 1:
|
|
55
|
-
mylog.StreamLogger.warning("Multiple files matching the file patterns are found!")
|
|
56
|
-
|
|
73
|
+
paths = []
|
|
57
74
|
for href in hrefs:
|
|
58
|
-
|
|
59
|
-
return
|
|
75
|
+
paths.append(url + '/' + href)
|
|
76
|
+
return paths
|
|
77
|
+
|
|
78
|
+
def download_from_http(self, ):
|
|
79
|
+
|
|
80
|
+
source_file_paths = self.search_from_http()
|
|
81
|
+
|
|
82
|
+
for url in source_file_paths:
|
|
83
|
+
if self.dry_run:
|
|
84
|
+
print(f"Dry run: {url}.")
|
|
85
|
+
else:
|
|
86
|
+
self.save_file_from_http(url=url)
|
|
87
|
+
|
|
88
|
+
def save_file_from_http(self, url, file_dir=None, file_name=None):
|
|
89
|
+
if file_name is None:
|
|
90
|
+
file_name = url.split('/')[-1]
|
|
91
|
+
file_path = file_dir / file_name
|
|
92
|
+
if file_path.is_file():
|
|
93
|
+
mylog.simpleinfo.info(
|
|
94
|
+
"The file {} exists in the directory {}.".format(file_path.name, file_path.parent.resolve()))
|
|
95
|
+
if not self.force_download:
|
|
96
|
+
self.done = True
|
|
97
|
+
return
|
|
98
|
+
|
|
99
|
+
file_path.parent.resolve().mkdir(parents=True, exist_ok=True)
|
|
100
|
+
mylog.simpleinfo.info(f'Downloading {file_name} ...')
|
|
101
|
+
res = self._download_by_requests_get(url, data_file_path=file_path)
|
|
102
|
+
if res:
|
|
103
|
+
mylog.simpleinfo.info(f'Saved in {file_dir}')
|
|
104
|
+
self.done = True
|
|
105
|
+
else:
|
|
106
|
+
mylog.StreamLogger.error(f"Error during downloading. Code: {res}.")
|
|
107
|
+
|
|
108
|
+
return
|
|
109
|
+
|
|
110
|
+
@staticmethod
|
|
111
|
+
def _download_by_requests_get(url, data_file_path=None, params=None, stream=True, allow_redirects=True, **kwargs):
|
|
112
|
+
r = requests.get(url, params=params, stream=stream, allow_redirects=allow_redirects, **kwargs)
|
|
113
|
+
if r.status_code != 200:
|
|
114
|
+
return -2
|
|
115
|
+
|
|
116
|
+
total_size_in_bytes = int(r.headers.get('content-length', 0))
|
|
117
|
+
block_size = 1024 # 1 Kibibyte
|
|
118
|
+
progress_bar = tqdm.tqdm(total=total_size_in_bytes, unit='iB', unit_scale=True)
|
|
119
|
+
|
|
120
|
+
with open(data_file_path, 'wb') as file:
|
|
121
|
+
for data in r.iter_content(block_size):
|
|
122
|
+
progress_bar.update(len(data))
|
|
123
|
+
file.write(data)
|
|
124
|
+
progress_bar.close()
|
|
125
|
+
if total_size_in_bytes != 0 and progress_bar.n != total_size_in_bytes:
|
|
126
|
+
mylog.StreamLogger.error("Something wrong during the download!")
|
|
127
|
+
data_file_path.unlink(missing_ok=True)
|
|
128
|
+
return -1
|
|
129
|
+
|
|
130
|
+
return 1
|
|
131
|
+
|
|
132
|
+
def search_from_ftp(self, ftp, file_name_patterns=None):
|
|
133
|
+
paths = []
|
|
134
|
+
|
|
135
|
+
return paths
|
|
60
136
|
|
|
61
137
|
def save_file(self, file_dir, file_name, r_source_file):
|
|
62
138
|
file_path = file_dir / file_name
|
|
@@ -71,14 +71,16 @@ class Downloader(DownloaderBase):
|
|
|
71
71
|
this_month = dttool.get_next_n_months(self.dt_fr, nm)
|
|
72
72
|
file_name_patterns = copy.deepcopy(default_file_name_patterns)
|
|
73
73
|
file_name_patterns.append(this_month.strftime("%Y%m"))
|
|
74
|
+
ftp = ftplib.FTP_TLS()
|
|
75
|
+
ftp.connect(self.ftp_host, self.ftp_port, 30)
|
|
74
76
|
try:
|
|
75
|
-
ftp = ftplib.FTP_TLS()
|
|
76
|
-
ftp.connect(self.ftp_host, self.ftp_port, 30) # 30 timeout
|
|
77
77
|
ftp.login(user=self.username, passwd=self.__password__)
|
|
78
78
|
ftp.cwd(self.ftp_data_dir)
|
|
79
79
|
file_list = ftp.nlst()
|
|
80
80
|
|
|
81
81
|
file_names, versions = self.search_files(file_list=file_list, file_name_patterns=file_name_patterns)
|
|
82
|
+
if file_names is None:
|
|
83
|
+
raise FileNotFoundError
|
|
82
84
|
file_dir_root = self.data_file_root_dir
|
|
83
85
|
for ind_f, file_name in enumerate(file_names):
|
|
84
86
|
dt_regex = re.compile(r'(\d{8}T\d{6})_(\d{8}T\d{6})_(\d{4})')
|
|
@@ -129,11 +131,11 @@ class Downloader(DownloaderBase):
|
|
|
129
131
|
mylog.simpleinfo.info("Done. The zip file has been removed.")
|
|
130
132
|
|
|
131
133
|
done = True
|
|
132
|
-
ftp.quit()
|
|
133
134
|
except Exception as e:
|
|
134
135
|
print('Error during download from FTP')
|
|
135
136
|
print(e)
|
|
136
137
|
done = False
|
|
138
|
+
ftp.quit()
|
|
137
139
|
return done
|
|
138
140
|
|
|
139
141
|
def search_files(self, file_list=None, file_name_patterns=None):
|
|
@@ -166,7 +168,8 @@ class Downloader(DownloaderBase):
|
|
|
166
168
|
|
|
167
169
|
ind_dt = np.where((self.dt_fr <= stop_dts) & (self.dt_to >= start_dts))[0]
|
|
168
170
|
if not list(ind_dt):
|
|
169
|
-
|
|
171
|
+
mylog.StreamLogger.info("No matching files found on the ftp")
|
|
172
|
+
return None, None
|
|
170
173
|
file_list = [file_list[ii] for ii in ind_dt]
|
|
171
174
|
versions = [versions[ii] for ii in ind_dt]
|
|
172
175
|
|
|
@@ -14,9 +14,9 @@ from geospacelab.config import prf
|
|
|
14
14
|
import geospacelab.toolbox.utilities.pybasic as basic
|
|
15
15
|
import geospacelab.toolbox.utilities.pylogging as mylog
|
|
16
16
|
import geospacelab.toolbox.utilities.pydatetime as dttool
|
|
17
|
-
from geospacelab.datahub.sources.esa_eo.swarm.l2daily.
|
|
18
|
-
from geospacelab.datahub.sources.esa_eo.swarm.l2daily.
|
|
19
|
-
import geospacelab.datahub.sources.esa_eo.swarm.l2daily.
|
|
17
|
+
from geospacelab.datahub.sources.esa_eo.swarm.l2daily.dns_acc.loader import Loader as default_Loader
|
|
18
|
+
from geospacelab.datahub.sources.esa_eo.swarm.l2daily.dns_acc.downloader import Downloader as default_Downloader
|
|
19
|
+
import geospacelab.datahub.sources.esa_eo.swarm.l2daily.dns_acc.variable_config as var_config
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
default_dataset_attrs = {
|
|
@@ -47,8 +47,6 @@ default_variable_names = [
|
|
|
47
47
|
'SC_GEO_ALT',
|
|
48
48
|
'SC_GEO_LST',
|
|
49
49
|
'rho_n',
|
|
50
|
-
'rho_n_ORBITMEAN',
|
|
51
|
-
'FLAG',
|
|
52
50
|
]
|
|
53
51
|
|
|
54
52
|
# default_data_search_recursive = True
|
|
@@ -78,7 +76,7 @@ class Dataset(datahub.DatasetSourced):
|
|
|
78
76
|
|
|
79
77
|
self.sat_id = kwargs.pop('sat_id', 'A')
|
|
80
78
|
|
|
81
|
-
self.metadata =
|
|
79
|
+
self.metadata = {}
|
|
82
80
|
|
|
83
81
|
allow_load = kwargs.pop('allow_load', False)
|
|
84
82
|
|
|
@@ -212,6 +210,63 @@ class Dataset(datahub.DatasetSourced):
|
|
|
212
210
|
self['SC_AACGM_LON'].value = cs_aacgm['lon'].reshape(self['SC_DATETIME'].value.shape)
|
|
213
211
|
self['SC_AACGM_MLT'].value = cs_aacgm['mlt'].reshape(self['SC_DATETIME'].value.shape)
|
|
214
212
|
|
|
213
|
+
def interp_evenly(self, time_res=None, data_time_res = 30, dt_fr=None, dt_to=None, masked=False):
|
|
214
|
+
from scipy.interpolate import interp1d
|
|
215
|
+
import geospacelab.toolbox.utilities.numpymath as nm
|
|
216
|
+
|
|
217
|
+
if time_res is None:
|
|
218
|
+
time_res = data_time_res
|
|
219
|
+
|
|
220
|
+
ds_new = datahub.DatasetUser(dt_fr=self.dt_fr, dt_to=self.dt_to, visual=self.visual)
|
|
221
|
+
ds_new.clone_variables(self)
|
|
222
|
+
dts = ds_new['SC_DATETIME'].value.flatten()
|
|
223
|
+
dt0 = dttool.get_start_of_the_day(dts[0])
|
|
224
|
+
x_0 = np.array([(dt - dt0).total_seconds() for dt in dts])
|
|
225
|
+
if dt_fr is None:
|
|
226
|
+
dt_fr = dts[0] - datetime.timedelta(
|
|
227
|
+
seconds=np.floor(((dts[0] - ds_new.dt_fr).total_seconds() / time_res)) * time_res
|
|
228
|
+
)
|
|
229
|
+
if dt_to is None:
|
|
230
|
+
dt_to = dts[-1] + datetime.timedelta(
|
|
231
|
+
seconds=np.floor(((ds_new.dt_to - dts[-1]).total_seconds() / time_res)) * time_res
|
|
232
|
+
)
|
|
233
|
+
sec_fr = (dt_fr - dt0).total_seconds()
|
|
234
|
+
sec_to = (dt_to - dt0).total_seconds()
|
|
235
|
+
x_1 = np.arange(sec_fr, sec_to + time_res / 2, time_res)
|
|
236
|
+
|
|
237
|
+
f = interp1d(x_0, x_0, kind='nearest', bounds_error=False, fill_value=(x_0[0], x_0[-1]))
|
|
238
|
+
pseudo_x = f(x_1)
|
|
239
|
+
mask = np.abs(pseudo_x - x_1) > data_time_res / 1.5
|
|
240
|
+
|
|
241
|
+
dts_new = np.array([dt0 + datetime.timedelta(seconds=sec) for sec in x_1])
|
|
242
|
+
ds_new['SC_DATETIME'].value = dts_new.reshape((dts_new.size, 1))
|
|
243
|
+
|
|
244
|
+
period_var_dict = {'SC_GEO_LON': 360.,
|
|
245
|
+
'SC_AACGM_LON': 360.,
|
|
246
|
+
'SC_APEX_LON': 360.,
|
|
247
|
+
'SC_GEO_LST': 24.,
|
|
248
|
+
'SC_AACGM_MLT': 24.,
|
|
249
|
+
'SC_APEX_MLT': 24}
|
|
250
|
+
|
|
251
|
+
for var_name in ds_new.keys():
|
|
252
|
+
if var_name in ['SC_DATETIME']:
|
|
253
|
+
continue
|
|
254
|
+
if var_name in period_var_dict.keys():
|
|
255
|
+
var = ds_new[var_name].value.flatten()
|
|
256
|
+
var_new = nm.interp_period_data(x_0, var, x_1, period=period_var_dict[var_name], method='linear',
|
|
257
|
+
bounds_error=False)
|
|
258
|
+
else:
|
|
259
|
+
method = 'linear' if 'FLAG' not in var_name else 'nearest'
|
|
260
|
+
var = ds_new[var_name].value.flatten()
|
|
261
|
+
f = interp1d(x_0, var, kind=method, bounds_error=False)
|
|
262
|
+
var_new = f(x_1)
|
|
263
|
+
if masked:
|
|
264
|
+
var_new = np.ma.array(var_new, mask=mask, fill_value=np.nan)
|
|
265
|
+
else:
|
|
266
|
+
var_new[mask] = np.nan
|
|
267
|
+
ds_new[var_name].value = var_new.reshape((dts_new.size, 1))
|
|
268
|
+
return ds_new
|
|
269
|
+
|
|
215
270
|
def time_filter_by_quality(self, quality_lim=None):
|
|
216
271
|
if quality_lim is None:
|
|
217
272
|
quality_lim = 0
|
|
@@ -253,7 +308,7 @@ class Dataset(datahub.DatasetSourced):
|
|
|
253
308
|
sat_id = self.sat_id
|
|
254
309
|
file_patterns = [
|
|
255
310
|
'DNS' + sat_id.upper(),
|
|
256
|
-
'
|
|
311
|
+
'ACC_2',
|
|
257
312
|
this_day.strftime('%Y%m%d') + 'T'
|
|
258
313
|
]
|
|
259
314
|
# remove empty str
|
|
@@ -276,6 +331,7 @@ class Dataset(datahub.DatasetSourced):
|
|
|
276
331
|
search_pattern=search_pattern,
|
|
277
332
|
allow_multiple_files=True
|
|
278
333
|
)
|
|
334
|
+
self.allow_download = False
|
|
279
335
|
|
|
280
336
|
return done
|
|
281
337
|
|
|
@@ -29,7 +29,7 @@ class Downloader(DownloaderModel):
|
|
|
29
29
|
|
|
30
30
|
if ftp_data_dir is None:
|
|
31
31
|
ftp_data_dir = f'Level2daily/Latest_baselines/DNS/ACC/Sat_{sat_id.upper()}'
|
|
32
|
-
|
|
32
|
+
# ftp_data_dir = f'Level2daily/Older_baselines/DNS/ACC/Sat_{sat_id.upper()}'
|
|
33
33
|
if data_file_root_dir is None:
|
|
34
34
|
data_file_root_dir = prf.datahub_data_root_dir / "ESA" / "SWARM" / "Level2daily" / "DNS_ACC"
|
|
35
35
|
file_name_patterns = list(self._default_file_name_patterns)
|
|
@@ -14,14 +14,12 @@ from geospacelab.datahub.sources.esa_eo.swarm.loader import LoaderModel
|
|
|
14
14
|
|
|
15
15
|
# define the default variable name dictionary
|
|
16
16
|
default_variable_name_dict = {
|
|
17
|
-
'CDF_EPOCH': '
|
|
17
|
+
'CDF_EPOCH': 'time',
|
|
18
18
|
'SC_GEO_LAT': 'latitude',
|
|
19
19
|
'SC_GEO_LON': 'longitude',
|
|
20
20
|
'SC_GEO_ALT': 'altitude',
|
|
21
21
|
'SC_GEO_LST': 'local_solar_time',
|
|
22
22
|
'rho_n': 'density',
|
|
23
|
-
'rho_n_ORBITMEAN': 'density_orbitmean',
|
|
24
|
-
'FLAG': 'validity_flag',
|
|
25
23
|
}
|
|
26
24
|
|
|
27
25
|
|
|
@@ -38,4 +36,5 @@ class Loader(LoaderModel):
|
|
|
38
36
|
|
|
39
37
|
def load_data(self, **kwargs):
|
|
40
38
|
super(Loader, self).load_data(**kwargs)
|
|
39
|
+
self.variables['rho_n'][self.variables['rho_n']>1] = np.nan
|
|
41
40
|
self.variables['SC_GEO_ALT'] = self.variables['SC_GEO_ALT'] * 1e-3
|
|
@@ -78,7 +78,7 @@ class Dataset(datahub.DatasetSourced):
|
|
|
78
78
|
|
|
79
79
|
self.sat_id = kwargs.pop('sat_id', 'A')
|
|
80
80
|
|
|
81
|
-
self.metadata =
|
|
81
|
+
self.metadata = {}
|
|
82
82
|
|
|
83
83
|
allow_load = kwargs.pop('allow_load', False)
|
|
84
84
|
|
|
@@ -167,7 +167,7 @@ class Dataset(datahub.DatasetSourced):
|
|
|
167
167
|
def add_GEO_LST(self):
|
|
168
168
|
lons = self['SC_GEO_LON'].flatten()
|
|
169
169
|
uts = self['SC_DATETIME'].flatten()
|
|
170
|
-
lsts = [ut + datetime.timedelta(hours=lon / 15.) for ut, lon in zip(uts, lons)]
|
|
170
|
+
lsts = [ut + datetime.timedelta(hours=int(lon / 15.)) for ut, lon in zip(uts, lons)]
|
|
171
171
|
lsts = [lst.hour + lst.minute / 60. + lst.second / 3600. for lst in lsts]
|
|
172
172
|
var = self.add_variable(var_name='SC_GEO_LST')
|
|
173
173
|
var.value = np.array(lsts)[:, np.newaxis]
|
|
@@ -212,6 +212,63 @@ class Dataset(datahub.DatasetSourced):
|
|
|
212
212
|
self['SC_AACGM_LON'].value = cs_aacgm['lon'].reshape(self['SC_DATETIME'].value.shape)
|
|
213
213
|
self['SC_AACGM_MLT'].value = cs_aacgm['mlt'].reshape(self['SC_DATETIME'].value.shape)
|
|
214
214
|
|
|
215
|
+
def interp_evenly(self, time_res=None, data_time_res = 30, dt_fr=None, dt_to=None, masked=False):
|
|
216
|
+
from scipy.interpolate import interp1d
|
|
217
|
+
import geospacelab.toolbox.utilities.numpymath as nm
|
|
218
|
+
|
|
219
|
+
if time_res is None:
|
|
220
|
+
time_res = data_time_res
|
|
221
|
+
|
|
222
|
+
ds_new = datahub.DatasetUser(dt_fr=self.dt_fr, dt_to=self.dt_to, visual=self.visual)
|
|
223
|
+
ds_new.clone_variables(self)
|
|
224
|
+
dts = ds_new['SC_DATETIME'].value.flatten()
|
|
225
|
+
dt0 = dttool.get_start_of_the_day(dts[0])
|
|
226
|
+
x_0 = np.array([(dt - dt0).total_seconds() for dt in dts])
|
|
227
|
+
if dt_fr is None:
|
|
228
|
+
dt_fr = dts[0] - datetime.timedelta(
|
|
229
|
+
seconds=np.floor(((dts[0] - ds_new.dt_fr).total_seconds() / time_res)) * time_res
|
|
230
|
+
)
|
|
231
|
+
if dt_to is None:
|
|
232
|
+
dt_to = dts[-1] + datetime.timedelta(
|
|
233
|
+
seconds=np.floor(((ds_new.dt_to - dts[-1]).total_seconds() / time_res)) * time_res
|
|
234
|
+
)
|
|
235
|
+
sec_fr = (dt_fr - dt0).total_seconds()
|
|
236
|
+
sec_to = (dt_to - dt0).total_seconds()
|
|
237
|
+
x_1 = np.arange(sec_fr, sec_to + time_res / 2, time_res)
|
|
238
|
+
|
|
239
|
+
f = interp1d(x_0, x_0, kind='nearest', bounds_error=False, fill_value=(x_0[0], x_0[-1]))
|
|
240
|
+
pseudo_x = f(x_1)
|
|
241
|
+
mask = np.abs(pseudo_x - x_1) > data_time_res / 1.5
|
|
242
|
+
|
|
243
|
+
dts_new = np.array([dt0 + datetime.timedelta(seconds=sec) for sec in x_1])
|
|
244
|
+
ds_new['SC_DATETIME'].value = dts_new.reshape((dts_new.size, 1))
|
|
245
|
+
|
|
246
|
+
period_var_dict = {'SC_GEO_LON': 360.,
|
|
247
|
+
'SC_AACGM_LON': 360.,
|
|
248
|
+
'SC_APEX_LON': 360.,
|
|
249
|
+
'SC_GEO_LST': 24.,
|
|
250
|
+
'SC_AACGM_MLT': 24.,
|
|
251
|
+
'SC_APEX_MLT': 24}
|
|
252
|
+
|
|
253
|
+
for var_name in ds_new.keys():
|
|
254
|
+
if var_name in ['SC_DATETIME']:
|
|
255
|
+
continue
|
|
256
|
+
if var_name in period_var_dict.keys():
|
|
257
|
+
var = ds_new[var_name].value.flatten()
|
|
258
|
+
var_new = nm.interp_period_data(x_0, var, x_1, period=period_var_dict[var_name], method='linear',
|
|
259
|
+
bounds_error=False)
|
|
260
|
+
else:
|
|
261
|
+
method = 'linear' if 'FLAG' not in var_name else 'nearest'
|
|
262
|
+
var = ds_new[var_name].value.flatten()
|
|
263
|
+
f = interp1d(x_0, var, kind=method, bounds_error=False)
|
|
264
|
+
var_new = f(x_1)
|
|
265
|
+
if masked:
|
|
266
|
+
var_new = np.ma.array(var_new, mask=mask, fill_value=np.nan)
|
|
267
|
+
else:
|
|
268
|
+
var_new[mask] = np.nan
|
|
269
|
+
ds_new[var_name].value = var_new.reshape((dts_new.size, 1))
|
|
270
|
+
return ds_new
|
|
271
|
+
|
|
215
272
|
def time_filter_by_quality(self, quality_lim=None):
|
|
216
273
|
if quality_lim is None:
|
|
217
274
|
quality_lim = 0
|
|
@@ -29,9 +29,11 @@ class Downloader(DownloaderModel):
|
|
|
29
29
|
|
|
30
30
|
if ftp_data_dir is None:
|
|
31
31
|
ftp_data_dir = f'Level2daily/Latest_baselines/DNS/POD/Sat_{sat_id.upper()}'
|
|
32
|
+
# ftp_data_dir = f'Level2daily/Older_baselines/DNS/POD/Sat_{sat_id.upper()}'
|
|
32
33
|
|
|
33
34
|
if data_file_root_dir is None:
|
|
34
35
|
data_file_root_dir = prf.datahub_data_root_dir / "ESA" / "SWARM" / "Level2daily" / "DNS_POD"
|
|
36
|
+
|
|
35
37
|
file_name_patterns = list(self._default_file_name_patterns)
|
|
36
38
|
|
|
37
39
|
file_name_patterns.extend(['DNS' + sat_id.upper()])
|
|
@@ -38,4 +38,7 @@ class Loader(LoaderModel):
|
|
|
38
38
|
|
|
39
39
|
def load_data(self, **kwargs):
|
|
40
40
|
super(Loader, self).load_data(**kwargs)
|
|
41
|
+
self.variables['rho_n'][self.variables['rho_n'] > 1] = np.nan
|
|
42
|
+
self.variables['rho_n'][self.variables['rho_n'] <= 0] = np.nan
|
|
43
|
+
self.variables['rho_n'][self.variables['FLAG'] > 0] = np.nan
|
|
41
44
|
self.variables['SC_GEO_ALT'] = self.variables['SC_GEO_ALT'] * 1e-3
|
|
@@ -108,7 +108,7 @@ class EISCATDashboard(TSDashboard):
|
|
|
108
108
|
|
|
109
109
|
def save_figure(self, file_name=None, file_dir=None, append_time=True, **kwargs):
|
|
110
110
|
if file_name is None:
|
|
111
|
-
file_name =
|
|
111
|
+
file_name = '_'.join([s.strip() for s in self.title.split(',')])
|
|
112
112
|
super().save_figure(file_name=file_name, file_dir=file_dir, append_time=append_time, **kwargs)
|
|
113
113
|
|
|
114
114
|
def add_title(self, x=0.5, y=1.06, title=None, append_time=True, **kwargs):
|
|
@@ -158,7 +158,8 @@ def example():
|
|
|
158
158
|
modulation = '60'
|
|
159
159
|
load_mode = 'AUTO'
|
|
160
160
|
dashboard = EISCATDashboard(
|
|
161
|
-
dt_fr, dt_to, site=site, antenna=antenna, modulation=modulation, load_mode='AUTO'
|
|
161
|
+
dt_fr, dt_to, site=site, antenna=antenna, modulation=modulation, load_mode='AUTO',
|
|
162
|
+
data_file_type="madrigal-hdf5"
|
|
162
163
|
)
|
|
163
164
|
dashboard.quicklook()
|
|
164
165
|
|
|
@@ -385,7 +385,7 @@ class TSDashboard(Dashboard):
|
|
|
385
385
|
|
|
386
386
|
return results
|
|
387
387
|
|
|
388
|
-
def add_shading(self, dt_fr, dt_to, panel_index
|
|
388
|
+
def add_shading(self, dt_fr, dt_to, panel_index=-1,
|
|
389
389
|
label=None, label_position=None, top_extend=0., bottom_extend=0., **kwargs):
|
|
390
390
|
|
|
391
391
|
if label_position is None:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: geospacelab
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.3
|
|
4
4
|
Summary: Collect, manage, and visualize geospace data.
|
|
5
5
|
Home-page: https://github.com/JouleCai/geospacelab
|
|
6
6
|
Author: Lei Cai
|
|
@@ -104,6 +104,7 @@ on [readthedocs.io](https://geospacelab.readthedocs.io/en/latest/).
|
|
|
104
104
|
| Data Source | Variables | File Format | Downloadable | Express | Status |
|
|
105
105
|
|------------------------------|------------------------------------|-----------------------|---------------|-------------------------------|--------|
|
|
106
106
|
| CDAWeb/OMNI | Solar wind and IMF |*cdf* | *True* | __OMNIDashboard__ | stable |
|
|
107
|
+
| CDAWeb/DMSP/SSUSI/EDR_AUR | DMSP SSUSI EDR_AUR emission lines | *netcdf* | *True* | __DMSPSSUSIDashboard__ | stable |
|
|
107
108
|
| Madrigal/EISCAT | Ionospheric Ne, Te, Ti, ... | *EISCAT-hdf5*, *Madrigal-hdf5* | *True* | __EISCATDashboard__ | stable |
|
|
108
109
|
| Madrigal/GNSS/TECMAP | Ionospheric GPS TEC map | *hdf5* | *True* | - | beta |
|
|
109
110
|
| Madrigal/DMSP/s1 | DMSP SSM, SSIES, etc | *hdf5* | *True* | __DMSPTSDashboard__ | stable |
|
|
@@ -111,7 +112,6 @@ on [readthedocs.io](https://geospacelab.readthedocs.io/en/latest/).
|
|
|
111
112
|
| Madrigal/DMSP/e | DMSP SSJ | *hdf5* | *True* | __DMSPTSDashboard__ | stable |
|
|
112
113
|
| Madrigal/Millstone Hill ISR+ | Millstone Hill ISR | *hdf5* | *True* | __MillstoneHillISRDashboard__ | stable |
|
|
113
114
|
| Madrigal/Poker Flat ISR | Poker Flat ISR | *hdf5* | *True* | __-_ | stable |
|
|
114
|
-
| JHUAPL/DMSP/SSUSI | DMSP SSUSI | *netcdf* | *True* | __DMSPSSUSIDashboard__ | stable |
|
|
115
115
|
| JHUAPL/AMPERE/fitted | AMPERE FAC | *netcdf* | *False* | __AMPEREDashboard__ | stable |
|
|
116
116
|
| SuperDARN/POTMAP | SuperDARN potential map | *ascii* | *False* | - | stable |
|
|
117
117
|
| WDC/Dst | Dst index | *IAGA2002-ASCII* | *True* | - | stable |
|
|
@@ -263,7 +263,7 @@ modulation = 'ant'
|
|
|
263
263
|
dh = DataHub(dt_fr, dt_to)
|
|
264
264
|
# dock the first dataset (dataset index starts from 0)
|
|
265
265
|
ds_isr = dh.dock(datasource_contents=[database_name, 'isr', facility_name],
|
|
266
|
-
site=site, antenna=antenna, modulation=modulation, data_file_type='
|
|
266
|
+
site=site, antenna=antenna, modulation=modulation, data_file_type='madrigal-hdf5')
|
|
267
267
|
# load data
|
|
268
268
|
ds_isr.load_data()
|
|
269
269
|
# assign a variable from its own dataset to the datahub
|
|
@@ -304,7 +304,8 @@ antenna = 'UHF'
|
|
|
304
304
|
modulation = '60'
|
|
305
305
|
load_mode = 'AUTO'
|
|
306
306
|
dashboard = eiscat.EISCATDashboard(
|
|
307
|
-
dt_fr, dt_to, site=site, antenna=antenna, modulation=modulation, load_mode='AUTO'
|
|
307
|
+
dt_fr, dt_to, site=site, antenna=antenna, modulation=modulation, load_mode='AUTO',
|
|
308
|
+
data_file_type="madrigal-hdf5"
|
|
308
309
|
)
|
|
309
310
|
dashboard.quicklook()
|
|
310
311
|
|
|
@@ -373,6 +374,9 @@ Output:
|
|
|
373
374
|
> 
|
|
374
375
|
|
|
375
376
|
### Example 4: Mapping geospatial data in the polar map.
|
|
377
|
+
> **_NOTE_**: JHUAPL stopped supporting DMSP SSUSI on 14 Feb 2025.
|
|
378
|
+
From then on, the data source has been switched from JHUAPL to CDAWeb.
|
|
379
|
+
|
|
376
380
|
```python
|
|
377
381
|
import datetime
|
|
378
382
|
import matplotlib.pyplot as plt
|
|
@@ -392,12 +396,16 @@ dashboard = geomap.GeoDashboard(dt_fr=dt_fr, dt_to=dt_to, figure_config={'figsiz
|
|
|
392
396
|
# If the orbit_id is specified, only one file will be downloaded. This option saves the downloading time.
|
|
393
397
|
# dashboard.dock(datasource_contents=['jhuapl', 'dmsp', 'ssusi', 'edraur'], pole='N', sat_id='f17', orbit_id='46863')
|
|
394
398
|
# If not specified, the data during the whole day will be downloaded.
|
|
395
|
-
dashboard.dock(
|
|
399
|
+
dashboard.dock(
|
|
400
|
+
datasource_contents=dashboard.dock(datasource_contents=['cdaweb', 'dmsp', 'ssusi', 'edr_aur'],
|
|
401
|
+
pole=pole, sat_id=sat_id, orbit_id=None
|
|
402
|
+
)
|
|
396
403
|
ds_s1 = dashboard.dock(
|
|
397
404
|
datasource_contents=['madrigal', 'satellites', 'dmsp', 's1'],
|
|
398
405
|
dt_fr=time1 - datetime.timedelta(minutes=45),
|
|
399
406
|
dt_to=time1 + datetime.timedelta(minutes=45),
|
|
400
|
-
sat_id=sat_id
|
|
407
|
+
sat_id=sat_id
|
|
408
|
+
)
|
|
401
409
|
|
|
402
410
|
dashboard.set_layout(1, 1)
|
|
403
411
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
geospacelab/__init__.py,sha256=
|
|
1
|
+
geospacelab/__init__.py,sha256=_v0CXNpUJgyKyK3En1-OGCKWUuJEaTyEb89yvb_F7qs,800
|
|
2
2
|
geospacelab/config/__init__.py,sha256=D5A0ORTubSaLEXGqPmg-mLH_KNqINicOeeNFqkGpXrk,641
|
|
3
3
|
geospacelab/config/_preferences.py,sha256=DakPjKJQ0VRe2Mgc8bakw585u4N8qVqYYvqnoLdyvH4,4726
|
|
4
4
|
geospacelab/coords/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -22,7 +22,7 @@ geospacelab/datahub/_variable_base.py,sha256=dUm15Y012FQ0hAdeA48ky0tKEc9il59FHvO
|
|
|
22
22
|
geospacelab/datahub/test.py,sha256=ZXtv9nhZd3RKr8BPsKqSB_boCpB2P4SYF6hFKdo8aAg,682
|
|
23
23
|
geospacelab/datahub/sources/__init__.py,sha256=VZtk8qV_O3LQtUQOOwvBwbqmcI_labsWdml-iqpH8u4,327
|
|
24
24
|
geospacelab/datahub/sources/cdaweb/__init__.py,sha256=fP1ziTZFxTOz-HF07az67F5AfvKJsXdJluEK-NZi6yU,680
|
|
25
|
-
geospacelab/datahub/sources/cdaweb/downloader.py,sha256=
|
|
25
|
+
geospacelab/datahub/sources/cdaweb/downloader.py,sha256=NRozp7qlunImJjVjdEX8ol-1l2bhCycrmecnkTGQKoU,5012
|
|
26
26
|
geospacelab/datahub/sources/cdaweb/dmsp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
27
27
|
geospacelab/datahub/sources/cdaweb/omni/__init__.py,sha256=Cx34OLYuX_zLIialhXlI6F0x4rXbCWLC7yCYBse6s2c,11529
|
|
28
28
|
geospacelab/datahub/sources/cdaweb/omni/downloader.py,sha256=Rle46rGxWmnM46BMO6hGpZR16vLF6DusYacpH_eMjw0,4129
|
|
@@ -30,7 +30,7 @@ geospacelab/datahub/sources/cdaweb/omni/loader.py,sha256=MVxzK9uMtxWK8OjnzHyJD-k
|
|
|
30
30
|
geospacelab/datahub/sources/cdaweb/omni/variable_config.py,sha256=WWVuuy28FSHV-DUAOx9hB80zCarTJJoObSgCbq7lgWM,12424
|
|
31
31
|
geospacelab/datahub/sources/esa_eo/__init__.py,sha256=Z-X5gUc21PNcCSCHoaP4ieQjTUBtMft8cK0hfJnezWo,521
|
|
32
32
|
geospacelab/datahub/sources/esa_eo/swarm/__init__.py,sha256=VCgXC15rp09kebnDY9GW0cy-BXH0RrEo6jscilobv_w,2386
|
|
33
|
-
geospacelab/datahub/sources/esa_eo/swarm/downloader.py,sha256=
|
|
33
|
+
geospacelab/datahub/sources/esa_eo/swarm/downloader.py,sha256=IsIA8Tr7k0tqrRbAmnwvIPRfUscwznztKc_kbAKwqyU,7984
|
|
34
34
|
geospacelab/datahub/sources/esa_eo/swarm/loader.py,sha256=fp6WWgkpAyK8j47Eb-jxZaBxgwzTb6VpStfoeigU65U,3684
|
|
35
35
|
geospacelab/datahub/sources/esa_eo/swarm/advanced/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
36
|
geospacelab/datahub/sources/esa_eo/swarm/advanced/efi_lp_fp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -58,13 +58,13 @@ geospacelab/datahub/sources/esa_eo/swarm/l2daily/aej_lpl/__init__.py,sha256=9Dxd
|
|
|
58
58
|
geospacelab/datahub/sources/esa_eo/swarm/l2daily/aej_lpl/downloader.py,sha256=tgjhDGv6CVbldVf2J_kLrwxEGWOLvlrUDFnfAuwY3VA,1897
|
|
59
59
|
geospacelab/datahub/sources/esa_eo/swarm/l2daily/aej_lpl/loader.py,sha256=MY9bXATgPEgU0dEvdWaLNobPFw2XsTx46FxrGHbfoOY,1594
|
|
60
60
|
geospacelab/datahub/sources/esa_eo/swarm/l2daily/aej_lpl/variable_config.py,sha256=oxowX2EK-PzCyFZN-b62LxsJGlxsA2IQO6dt122NKk0,5454
|
|
61
|
-
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_acc/__init__.py,sha256=
|
|
62
|
-
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_acc/downloader.py,sha256=
|
|
63
|
-
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_acc/loader.py,sha256=
|
|
61
|
+
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_acc/__init__.py,sha256=EbVqG438vAzylh2oSn6oKY1WI5XmmmEHraX6IHZiVa8,15539
|
|
62
|
+
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_acc/downloader.py,sha256=E9QNp5vRrDHX_aN0ltVeU9bNOCKZIfEry0IC_Dan1IE,1985
|
|
63
|
+
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_acc/loader.py,sha256=vgtoxMDW7cu6pkxuTJ-VPW4f8tg2jDQiSXAh8Fj6Rsw,1342
|
|
64
64
|
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_acc/variable_config.py,sha256=uD01UBjsswsJkf0fIlneK4hUQ4854E1zaSUJ23dlsy4,3335
|
|
65
|
-
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_pod/__init__.py,sha256=
|
|
66
|
-
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_pod/downloader.py,sha256=
|
|
67
|
-
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_pod/loader.py,sha256=
|
|
65
|
+
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_pod/__init__.py,sha256=k-nLHumMRMkoYl3-6TEzeVx_kaFuwtJhGcyEz4jM6DE,15535
|
|
66
|
+
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_pod/downloader.py,sha256=K2VXRpkWnqGdBSlXdSBmr3gK9V2oY37BLc-x8ymewic,1987
|
|
67
|
+
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_pod/loader.py,sha256=T0MPpYZTowe3tU24rTkJxaDvs6v6RkFR1ulidrWB8rU,1557
|
|
68
68
|
geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_pod/variable_config.py,sha256=uD01UBjsswsJkf0fIlneK4hUQ4854E1zaSUJ23dlsy4,3335
|
|
69
69
|
geospacelab/datahub/sources/esa_eo/swarm/l2daily/fac_tms/__init__.py,sha256=mcED0vgS7dzaNX5OnlYpE-43Z3G1HAQ94nTrnHbNP-8,12897
|
|
70
70
|
geospacelab/datahub/sources/esa_eo/swarm/l2daily/fac_tms/downloader.py,sha256=CKYGT4sAWWamt8bJ1-c5bjDRaDVVahCiElauGNfVFUo,2001
|
|
@@ -122,7 +122,7 @@ geospacelab/datahub/sources/jhuapl/dmsp/ssusi/__init__.py,sha256=47DEQpj8HBSa-_T
|
|
|
122
122
|
geospacelab/datahub/sources/jhuapl/dmsp/ssusi/downloader.py,sha256=YvEUr8XbjiqIwkWD8iUnXDozVsBCb0ravXATf7tIJnM,5784
|
|
123
123
|
geospacelab/datahub/sources/jhuapl/dmsp/ssusi/edraur/__init__.py,sha256=19iEEG8LojP9qrSFQy63FpP7vcyQCt0TP-Ll3RDvuUI,8451
|
|
124
124
|
geospacelab/datahub/sources/jhuapl/dmsp/ssusi/edraur/loader.py,sha256=ulahJeJCB45K0WPhxffBcpPSU2u_N7GQ-R7xjfqzRv8,5322
|
|
125
|
-
geospacelab/datahub/sources/jhuapl/dmsp/ssusi/edraur/variable_config.py,sha256=
|
|
125
|
+
geospacelab/datahub/sources/jhuapl/dmsp/ssusi/edraur/variable_config.py,sha256=MaDCaF-LCK7sR6VOaszo6ebmJTq18wDIZ809sFoAbh4,4346
|
|
126
126
|
geospacelab/datahub/sources/jhuapl/dmsp/ssusi/sdrdisk/__init__.py,sha256=-cMB37JFmLAT2XkCZW-ej8Y6qOvMv4-rzMR1lrGGg5E,12469
|
|
127
127
|
geospacelab/datahub/sources/jhuapl/dmsp/ssusi/sdrdisk/loader.py,sha256=Xvn_DtTcREIMxvNxY_0a0Ery8xRTkBUD9285Q56a_nc,9519
|
|
128
128
|
geospacelab/datahub/sources/jhuapl/dmsp/ssusi/sdrdisk/variable_config.py,sha256=iyhGq50CKQku6imnO8Psn_V5u03Ix1SCEr6ls1QDajo,4686
|
|
@@ -281,7 +281,7 @@ geospacelab/datahub/sources/wdc/dst/loader.py,sha256=VOTAayd6C0CdaW41RSc9EzUeB28
|
|
|
281
281
|
geospacelab/datahub/sources/wdc/dst/variable_config.py,sha256=iXgscw1UzfTO2y2De-eOxCYGmkY01bEGAdfayjkcLEg,1516
|
|
282
282
|
geospacelab/express/__init__.py,sha256=YcFkmOGWXNiOXWsMFxFPhn32UnbxmeSrluTp6OHVTpQ,328
|
|
283
283
|
geospacelab/express/dmsp_dashboard.py,sha256=DdKvcQu4cEbh16rP-dUgyyiEq7_ltCpCOFQaYG8EVG4,4152
|
|
284
|
-
geospacelab/express/eiscat_dashboard.py,sha256=
|
|
284
|
+
geospacelab/express/eiscat_dashboard.py,sha256=Anj44bGCTQwmtKD_Nl6UFfjeqanQ6rz58OjyoYWZHGM,8911
|
|
285
285
|
geospacelab/express/millstonehill_dashboard.py,sha256=cTAmBSHAVF-0mLXkSwjyrKiQ8hVpZYiGuYYHIFkdycg,8482
|
|
286
286
|
geospacelab/express/omni_dashboard.py,sha256=XTv9QVCNwUPyrsUB9EdEdoHRgr-DXPGTVXGCygOzsY8,3937
|
|
287
287
|
geospacelab/future/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -301,7 +301,7 @@ geospacelab/observatory/earth/geodesy.py,sha256=6ouOEgiqlTrDBHdPjhZ5p8BScfG8-NYr
|
|
|
301
301
|
geospacelab/observatory/earth/sun_position.py,sha256=gy-zPPoX_92r6Cz7BT7JQyiNO_tte3osCQFkNq9lWe0,1434
|
|
302
302
|
geospacelab/observatory/orbit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
303
303
|
geospacelab/observatory/orbit/sc_orbit.py,sha256=FgTAFnoL6HRNlP8C9o2IDE0TpfGwaAP_3_2_8x4Euxo,15588
|
|
304
|
-
geospacelab/observatory/orbit/utilities.py,sha256=
|
|
304
|
+
geospacelab/observatory/orbit/utilities.py,sha256=vIyI0oNQX7YsqvIv4eqCEObnc63W1tRyzP-R5pncIeE,33440
|
|
305
305
|
geospacelab/observatory/site/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
306
306
|
geospacelab/observatory/site/mixins.py,sha256=rhMJngBVgv0wR1m8e5cvnPxHZQnntbcJIgp4bEyTMFE,457
|
|
307
307
|
geospacelab/quantity/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -334,7 +334,7 @@ geospacelab/visualization/mpl/_helpers.py,sha256=L-Cf_NXhe7FZE0fUNwQOOIZorLR1qEh
|
|
|
334
334
|
geospacelab/visualization/mpl/axes.py,sha256=YcFkmOGWXNiOXWsMFxFPhn32UnbxmeSrluTp6OHVTpQ,328
|
|
335
335
|
geospacelab/visualization/mpl/axis_ticks.py,sha256=vkS7eqSop5MNsxZ8l3EqdJEW7obF7mRXQ1D9lCZCYOY,15135
|
|
336
336
|
geospacelab/visualization/mpl/colormaps.py,sha256=o4NfZPZK29Lefc4Jw-9OAN5VveqLuEEHKbP3JjUFSFI,17685
|
|
337
|
-
geospacelab/visualization/mpl/dashboards.py,sha256=
|
|
337
|
+
geospacelab/visualization/mpl/dashboards.py,sha256=jk8W_j1SzCfUUYeTm5e7uA3xjlXpUIINdJPmBc53t-E,17232
|
|
338
338
|
geospacelab/visualization/mpl/figure.py,sha256=stHgAG_qH-b87-rIXBfFnG9p3cyD2oDnx3MA6kDgX3A,3335
|
|
339
339
|
geospacelab/visualization/mpl/panels.py,sha256=FUbWvz8jSVTZa2mATV8Vj10-8bIbmDZ1zYgAPliZLTM,35127
|
|
340
340
|
geospacelab/visualization/mpl/ts_viewer.py,sha256=4sOwXeWkdn5Z0BA6c-zxj4dAYxHP9tbuFwsbuJz4_ag,67416
|
|
@@ -366,7 +366,7 @@ geospacelab/wrapper/geopack/geopack/t89.py,sha256=zDVNPrmtK1NnNHgohQEPqOOJDsm2Z-
|
|
|
366
366
|
geospacelab/wrapper/geopack/geopack/t96.py,sha256=ktcoo1R7Z3NtkWHENuseu48ub4-JfQGqFV0ZOtd0zH8,65292
|
|
367
367
|
geospacelab/wrapper/geopack/geopack/test_geopack1.md,sha256=dMUY0O1BgZsKpmJ6BLSQ80B6p6DZcB7OceFeyPOlFK0,15324
|
|
368
368
|
geospacelab/wrapper/geopack/geopack/test_geopack1.py,sha256=qjLz6O3BAk3H58IpmxXyftwZTkh3vPGp49C-al4hjf0,6669
|
|
369
|
-
geospacelab-0.9.
|
|
369
|
+
geospacelab-0.9.3.dist-info/licenses/LICENSE,sha256=2yRlwLt4o5Z6OZAGcyvBj-zfFX1Uw7E6CzqODg7khqs,1515
|
|
370
370
|
test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
371
371
|
test/test_ampere.py,sha256=0-HZURubpv1mBK3bJ_qTqx39L1jezgRoU5neXMPYgZQ,2968
|
|
372
372
|
test/test_dmsp_s1.py,sha256=5m_7mjdDGja8ovshNPV3LKW_6q6mIwT9XKqoyRiH79A,3588
|
|
@@ -376,7 +376,7 @@ test/test_omni.py,sha256=Zk1LZozPiY5V0aSRmK6GTQuB01hHn_j2j3Brm6Ea_po,1632
|
|
|
376
376
|
test/test_superdarn.py,sha256=uP55muvXryPzNGHinWkiGv2PxvRs4f9M9h1WIBEBW7k,2846
|
|
377
377
|
test/test_swarm.py,sha256=PDDE9nUshhQpXZbV_ZwcsjbMhI73fRaojTZv9rtRzZE,15568
|
|
378
378
|
test/test_swarm_new.py,sha256=mzhMAx-M9W3Ue5noTyfBx4c3Vtc3b_ZUEvGgL9v8UE4,853
|
|
379
|
-
geospacelab-0.9.
|
|
380
|
-
geospacelab-0.9.
|
|
381
|
-
geospacelab-0.9.
|
|
382
|
-
geospacelab-0.9.
|
|
379
|
+
geospacelab-0.9.3.dist-info/METADATA,sha256=Cr9Ua066wvbkh8s4Zcze7fpjqwnA3csrkTKtnHfCtZs,24336
|
|
380
|
+
geospacelab-0.9.3.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
|
|
381
|
+
geospacelab-0.9.3.dist-info/top_level.txt,sha256=98eDwrSNgyQFAtSA06QMP71gw9BzgIj0uvkTudpGly4,12
|
|
382
|
+
geospacelab-0.9.3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|