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 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.1"
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__(self, dt_fr, dt_to, direct_download=True, force_download=True):
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
- raise NotImplementedError
37
-
38
- def search_file(self, subdirs, file_name_patterns, logging=True):
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
- if logging:
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
- self.source_file_paths.append(url + href)
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
- raise FileExistsError
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.dns_pod.loader import Loader as default_Loader
18
- from geospacelab.datahub.sources.esa_eo.swarm.l2daily.dns_pod.downloader import Downloader as default_Downloader
19
- import geospacelab.datahub.sources.esa_eo.swarm.l2daily.dns_pod.variable_config as var_config
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 = None
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
- 'POD_2',
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': 'Time',
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 = None
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
@@ -30,7 +30,7 @@ default_plot_config = {
30
30
  'pcolormesh': {
31
31
  'cmap': default_colormap,
32
32
  'c_scale': 'log',
33
- 'c_lim': [100, 6000],
33
+ 'c_lim': [10, 6000],
34
34
  'alpha': 0.9,
35
35
  }
36
36
  }
@@ -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 = kwargs.pop('file_name', self.title.replace(', ', '_'))
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
 
@@ -421,6 +421,7 @@ class LEOToolbox(DatasetUser):
421
421
 
422
422
  method = 'linear'
423
423
  for var_name in variable_names:
424
+ # print(var_name)
424
425
  vrb = self[var_name].value.flatten()[sector>0]
425
426
  if along_track_binning:
426
427
  sector_1 = sector[sector>0]
@@ -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=0,
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.1
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='eiscat-hdf5')
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
  > ![alt text](https://github.com/JouleCai/geospacelab/blob/master/examples/OMNI_1min_20160314-060000-20160320-060000.png?raw=true)
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(datasource_contents=['jhuapl', 'dmsp', 'ssusi', 'edraur'], pole=pole, sat_id=sat_id, orbit_id=None)
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=6u2t-R4k3roYJa3dgOOiyFT-2yogY9ml_eBtjtY6eOc,800
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=ZgXNbrdF9mrvDxY03_PymcK2pW09T90tl59ly69Ida4,2473
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=V22eWIrwz_ZyGrWUxNx3SPkZeYk11PX7XTlHBf1ReTQ,7857
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=eWDjRV4xypUACkakYesEG6DOVTZGEawW8ukNqokQwjc,12892
62
- geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_acc/downloader.py,sha256=9rKpWoeAZk08zD7PKkazWBiKXiqkxQb3SB9cXJRXsl8,1897
63
- geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_acc/loader.py,sha256=qmqHrJRT7orZeTCvKJyqqKaommcesfYfOuMaUUyO5U8,1347
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=e0aV-brIwxXec9FqekxZEYE2yWQrUL189alKCBW5Aac,12892
66
- geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_pod/downloader.py,sha256=Qg7zhuI2DciYN0-hNbx6dNmMpawg2afRpo9ULzkNj-8,1897
67
- geospacelab/datahub/sources/esa_eo/swarm/l2daily/dns_pod/loader.py,sha256=qmqHrJRT7orZeTCvKJyqqKaommcesfYfOuMaUUyO5U8,1347
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=DJMs1RqFBTvmgNfveZttE9VEdjuPwSojkQeomXHxiHc,4347
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=WkBc7EDzp9o9i97ssY2hpjZF1jCZy7TJnbdJVcf8tHU,8873
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=fO5GVghcQx4qAw5drTYJPqlssjsmHa0ie6rhfPPUtFg,33410
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=bQcPTQNZlfur02e1NHK4QY5VMIJPGch9sYs7P458DUs,17231
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.1.dist-info/licenses/LICENSE,sha256=2yRlwLt4o5Z6OZAGcyvBj-zfFX1Uw7E6CzqODg7khqs,1515
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.1.dist-info/METADATA,sha256=lQu6cwW2ndS7eFK_dFwJzePm8B0-0KvEru0gXMdXyX8,24108
380
- geospacelab-0.9.1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
381
- geospacelab-0.9.1.dist-info/top_level.txt,sha256=98eDwrSNgyQFAtSA06QMP71gw9BzgIj0uvkTudpGly4,12
382
- geospacelab-0.9.1.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (79.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5