geospacelab 0.10.3__py3-none-any.whl → 0.11.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. geospacelab/__init__.py +1 -1
  2. geospacelab/config/__init__.py +3 -2
  3. geospacelab/config/__mpl__.py +98 -0
  4. geospacelab/config/_preferences.py +3 -0
  5. geospacelab/datahub/__variable_base__.py +2 -2
  6. geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/__init__.py +11 -2
  7. geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/downloader.py +2 -2
  8. geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/loader.py +84 -83
  9. geospacelab/datahub/sources/cdaweb/omni/loader.py +2 -0
  10. geospacelab/datahub/sources/madrigal/downloader.py +15 -5
  11. geospacelab/datahub/sources/madrigal/gnss/tecmap/loader.py +1 -0
  12. geospacelab/datahub/sources/madrigal/gnss/tecmap/variable_config.py +3 -2
  13. geospacelab/datahub/sources/madrigal/isr/eiscat/__init__.py +6 -5
  14. geospacelab/datahub/sources/madrigal/isr/pfisr/fitted/__init__.py +48 -10
  15. geospacelab/datahub/sources/madrigal/isr/pfisr/fitted/loader.py +22 -3
  16. geospacelab/observatory/orbit/utilities.py +14 -3
  17. geospacelab/visualization/mpl/__base__.py +25 -113
  18. geospacelab/visualization/mpl/colormaps.py +10 -0
  19. geospacelab/visualization/mpl/geomap/geopanels.py +22 -2
  20. {geospacelab-0.10.3.dist-info → geospacelab-0.11.0.dist-info}/METADATA +1 -1
  21. {geospacelab-0.10.3.dist-info → geospacelab-0.11.0.dist-info}/RECORD +24 -23
  22. {geospacelab-0.10.3.dist-info → geospacelab-0.11.0.dist-info}/WHEEL +1 -1
  23. {geospacelab-0.10.3.dist-info → geospacelab-0.11.0.dist-info}/licenses/LICENSE +0 -0
  24. {geospacelab-0.10.3.dist-info → geospacelab-0.11.0.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.10.3"
9
+ __version__ = "0.11.0"
10
10
  __maintainer__ = "Lei Cai"
11
11
  __email__ = "lei.cai@oulu.fi"
12
12
  __status__ = "Developing"
@@ -9,9 +9,8 @@ __email__ = "lei.cai@oulu.fi"
9
9
  __docformat__ = "reStructureText"
10
10
 
11
11
 
12
- from geospacelab.config._preferences import Preferences
12
+ from geospacelab.config._preferences import prf, pref
13
13
 
14
- prf = pref = Preferences()
15
14
 
16
15
  try:
17
16
  opt = pref.user_config['visualization']
@@ -20,3 +19,5 @@ except KeyError:
20
19
  uc['visualization'] = dict()
21
20
  uc['visualization']['mpl'] = dict()
22
21
  pref.set_user_config(user_config=uc, set_as_default=True)
22
+
23
+ from geospacelab.config.__mpl__ import mpl, plt
@@ -0,0 +1,98 @@
1
+ import matplotlib as mpl
2
+ import matplotlib.pyplot as plt
3
+
4
+ from geospacelab.config._preferences import pref
5
+
6
+
7
+ from cycler import cycler
8
+
9
+ try:
10
+ mpl_style = pref.user_config['visualization']['mpl']['style']
11
+ except KeyError:
12
+ uc = pref.user_config
13
+ uc['visualization']['mpl']['style'] = 'light'
14
+ pref.set_user_config(user_config=uc, set_as_default=True)
15
+
16
+
17
+ # plt.rcParams['font.serif'] = 'Ubuntu'
18
+ # plt.rcParams['font.monospace'] = 'Ubuntu Mono'
19
+ plt.rcParams['font.size'] = 10
20
+ plt.rcParams['axes.labelsize'] = 10
21
+ plt.rcParams['axes.labelweight'] = 'book'
22
+ plt.rcParams['axes.titlesize'] = 10
23
+ plt.rcParams['xtick.labelsize'] = 10
24
+ plt.rcParams['ytick.labelsize'] = 10
25
+ plt.rcParams['legend.fontsize'] = 10
26
+ plt.rcParams['figure.titlesize'] = 12
27
+
28
+ # plt.style.use('https://github.com/dhaitz/matplotlib-stylesheets/raw/master/pacoty.mplstyle')
29
+ mpl_style = pref.user_config['visualization']['mpl']['style']
30
+
31
+ if mpl_style == 'light':
32
+ plt.rcParams['axes.facecolor'] = '#FCFCFC'
33
+ plt.rcParams['text.color'] = 'k'
34
+ default_cycler = (cycler(color=['tab:blue', 'tab:red', 'tab:green', 'tab:purple', 'tab:orange', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan']))
35
+ default_cycler = (cycler(color=['#1f77b4DD', '#ff7f0eDD', '#2ca02cDD', '#d62728DD', '#9467bdDD', '#8c564bDD', '#e377c2DD', '#7f7f7fDD', '#bcbd22DD', '#17becfDD']))
36
+ # colors = [
37
+ # (0.8980392156862745, 0.5254901960784314, 0.023529411764705882),
38
+ # (0.36470588235294116, 0.4117647058823529, 0.6941176470588235),
39
+ # (0.3215686274509804, 0.7372549019607844, 0.6392156862745098),
40
+ # (0.6, 0.788235294117647, 0.27058823529411763),
41
+ # (0.8, 0.3803921568627451, 0.6901960784313725),
42
+ # (0.1411764705882353, 0.4745098039215686, 0.4235294117647059),
43
+ # (0.8549019607843137, 0.6470588235294118, 0.10588235294117647),
44
+ # (0.1843137254901961, 0.5411764705882353, 0.7686274509803922),
45
+ # (0.4627450980392157, 0.3058823529411765, 0.6235294117647059),
46
+ # (0.9294117647058824, 0.39215686274509803, 0.35294117647058826),
47
+ # ]
48
+ colors = [
49
+ (0.36470588235294116, 0.4117647058823529, 0.6941176470588235),
50
+ (0.9294117647058824, 0.39215686274509803, 0.35294117647058826),
51
+ (0.3215686274509804, 0.7372549019607844, 0.6392156862745098),
52
+ (0.8980392156862745, 0.5254901960784314, 0.023529411764705882),
53
+ (0.6, 0.788235294117647, 0.27058823529411763),
54
+ (0.8, 0.3803921568627451, 0.6901960784313725),
55
+ (0.1411764705882353, 0.4745098039215686, 0.4235294117647059),
56
+ (0.8549019607843137, 0.6470588235294118, 0.10588235294117647),
57
+ (0.1843137254901961, 0.5411764705882353, 0.7686274509803922),
58
+ (0.4627450980392157, 0.3058823529411765, 0.6235294117647059),
59
+
60
+ ]
61
+ default_cycler = (cycler(color=colors))
62
+ plt.rc('axes', prop_cycle=default_cycler)
63
+ elif mpl_style == 'dark':
64
+ plt.rcParams['figure.facecolor'] = '#0C1C23'
65
+ plt.rcParams['savefig.facecolor'] = '#0C1C23'
66
+
67
+ plt.rcParams['axes.facecolor'] = '#FFFFFF20'
68
+ plt.rcParams['axes.edgecolor'] = '#FFFFFF3D'
69
+ plt.rcParams['axes.labelcolor'] = '#FFFFFFD9'
70
+
71
+ plt.rcParams['xtick.color'] = '#FFFFFFD9'
72
+ plt.rcParams['ytick.color'] = '#FFFFFFD9'
73
+ plt.rcParams['text.color'] = 'white'
74
+
75
+ plt.rcParams['grid.color'] = '#FFFFFF'
76
+ plt.rcParams['legend.facecolor'] = plt.rcParams['axes.facecolor']
77
+ plt.rcParams['legend.edgecolor'] = '#FFFFFFD9'
78
+
79
+ # seaborn dark:['#001c7f', '#b1400d', '#12711c', '#8c0800', '#591e71', '#592f0d', '#a23582', '#3c3c3c', '#b8850a', '#006374']
80
+ # seaborn pastel '#a1c9f4', '#ffb482', '#8de5a1', '#ff9f9b', '#d0bbff', '#debb9b', '#fab0e4', '#cfcfcf', '#fffea3', '#b9f2f0'
81
+ default_cycler = (cycler(color=['#F5EE33', '#33FF99', 'r', '#9467bd', '#08C7FE', '#FE66BB', ]))
82
+ colors = [
83
+ (0.1843137254901961, 0.5411764705882353, 0.7686274509803922),
84
+ (0.9294117647058824, 0.39215686274509803, 0.35294117647058826),
85
+ (0.3215686274509804, 0.7372549019607844, 0.6392156862745098),
86
+ (0.8980392156862745, 0.5254901960784314, 0.023529411764705882),
87
+ (0.6, 0.788235294117647, 0.27058823529411763),
88
+ (0.8, 0.3803921568627451, 0.6901960784313725),
89
+ (0.1411764705882353, 0.4745098039215686, 0.4235294117647059),
90
+ (0.8549019607843137, 0.6470588235294118, 0.10588235294117647),
91
+ (0.36470588235294116, 0.4117647058823529, 0.6941176470588235),
92
+ (0.4627450980392157, 0.3058823529411765, 0.6235294117647059),
93
+ ]
94
+ default_cycler = (cycler(color=colors))
95
+ # default_cycler = (cycler(color=palettable.cartocolors.qualitative.Safe_10.mpl_colors))
96
+ plt.rc('axes', prop_cycle=default_cycler)
97
+ else:
98
+ plt.style.use(mpl_style)
@@ -126,3 +126,6 @@ data_root_dir = \"\"
126
126
  user_config_dict = toml.load(config_file_path)
127
127
  self.user_config = user_config_dict
128
128
  return user_config_dict
129
+
130
+
131
+ prf = pref = Preferences()
@@ -461,9 +461,9 @@ class VariableBase(object):
461
461
  :return:
462
462
  """
463
463
  if issubclass(var_new.__class__, VariableBase):
464
- v = var_new.value
464
+ v = copy.deepcopy(var_new.value)
465
465
  else:
466
- v = var_new
466
+ v = copy.deepcopy(var_new)
467
467
 
468
468
  if self.value is None:
469
469
  self.value = v
@@ -34,6 +34,7 @@ default_dataset_attrs = {
34
34
 
35
35
  default_variable_names = [
36
36
  'DATETIME', 'STARTING_TIME', 'STOPPING_TIME',
37
+ 'ORBIT_ID',
37
38
  'GRID_MLAT', 'GRID_MLON', 'GRID_MLT', 'GRID_UT',
38
39
  'GRID_AUR_1216', 'GRID_AUR_1304', 'GRID_AUR_1356', 'GRID_AUR_LBHS', 'GRID_AUR_LBHL',
39
40
  ]
@@ -93,6 +94,8 @@ class Dataset(datahub.DatasetSourced):
93
94
  default_variable_names,
94
95
  configured_variables=var_config.configured_variables
95
96
  )
97
+ if self.orbit_id is None:
98
+ self.orbit_id = []
96
99
  for file_path in self.data_file_paths:
97
100
  try:
98
101
  load_obj = self.loader(file_path, file_type=self.product.lower(), pole=self.pole)
@@ -105,16 +108,21 @@ class Dataset(datahub.DatasetSourced):
105
108
  continue
106
109
  if var_name in ['DATETIME', 'STARTING_TIME', 'STOPPING_TIME']:
107
110
  value = np.array([load_obj.variables[var_name]])[np.newaxis, :]
111
+ elif var_name == 'ORBIT_ID':
112
+ value = np.array([load_obj.metadata['ORBIT_ID']], dtype=str)
108
113
  else:
109
114
  value = np.empty((1, ), dtype=object)
110
115
  value[0] = load_obj.variables[var_name]
111
116
  # value = load_obj.variables[var_name][np.newaxis, ::]
112
117
  self._variables[var_name].join(value)
113
118
 
114
- self.orbit_id = load_obj.metadata['ORBIT_ID']
115
- # self.select_beams(field_aligned=True)
119
+ self.orbit_id = self['ORBIT_ID'].value
120
+ if len(self.orbit_id):
121
+ self.orbit_id = self.orbit_id[0]
116
122
  if self.time_clip:
117
123
  self.time_filter_by_range()
124
+
125
+ del load_obj
118
126
 
119
127
  def get_time_ind(self, ut, time_res=20*60, var_datetime_name='DATETIME', edge_cutoff=False, **kwargs):
120
128
  ind = super().get_time_ind(ut, time_res=time_res, var_datetime_name=var_datetime_name, edge_cutoff=edge_cutoff, **kwargs)
@@ -178,6 +186,7 @@ class Dataset(datahub.DatasetSourced):
178
186
  download_obj = self.downloader(
179
187
  dt_fr, dt_to,
180
188
  orbit_id=self.orbit_id, sat_id=self.sat_id,
189
+ data_file_root_dir=self.data_root_dir
181
190
  )
182
191
  return download_obj.done
183
192
 
@@ -22,7 +22,7 @@ class Downloader(DownloaderBase):
22
22
  ):
23
23
  product = 'EDR_AUR'
24
24
  if data_file_root_dir is None:
25
- data_file_root_dir = prf.datahub_data_root_dir / 'CDAWeb' / 'DMSP' / 'SSUSI' /product / sat_id.upper()
25
+ data_file_root_dir = prf.datahub_data_root_dir / 'CDAWeb' / 'DMSP' / 'SSUSI' / product
26
26
  self.sat_id = sat_id
27
27
  self.orbit_id = orbit_id
28
28
  self.source_subdirs = ['dmsp', 'dmsp'+self.sat_id.lower(), 'ssusi', 'data', 'edr-aurora']
@@ -78,7 +78,7 @@ class Downloader(DownloaderBase):
78
78
  year = int(sy)
79
79
  this_day = dttool.convert_doy_to_datetime(year, int(sdoy))
80
80
  if file_dir is None:
81
- file_dir = self.data_file_root_dir / sy / this_day.strftime("%Y%m%d")
81
+ file_dir = self.data_file_root_dir / self.sat_id.upper() / sy / this_day.strftime("%Y%m%d")
82
82
  super().save_file_from_http(url, file_dir=file_dir)
83
83
 
84
84
 
@@ -21,92 +21,93 @@ class Loader(object):
21
21
  self.load_data()
22
22
 
23
23
  def load_data(self):
24
- dataset = netCDF4.Dataset(self.file_path)
25
24
  variables = {}
26
25
  metadata = {}
26
+ with netCDF4.Dataset(self.file_path) as dataset:
27
+
28
+ if self.pole == 'N':
29
+ pole = self.pole
30
+ pole_str = 'NORTH'
31
+ elif self.pole == 'S':
32
+ pole = self.pole
33
+ pole_str = 'SOUTH'
34
+ else:
35
+ raise ValueError
36
+ # Time and Position
37
+ # sectime = int(np.array(dataset.variables['TIME']).flatten()[0])
38
+ # doy = int(np.array(dataset.variables['DOY']).flatten()[0])
39
+ # year = int(np.array(dataset.variables['YEAR']).flatten()[0])
40
+ # dt0 = dttool.convert_doy_to_datetime(year, doy)
41
+ starting_time = datetime.datetime.strptime(dataset.STARTING_TIME, "%Y%j%H%M%S")
42
+ variables['STARTING_TIME'] = starting_time
43
+ stopping_time = datetime.datetime.strptime(dataset.STOPPING_TIME, "%Y%j%H%M%S")
44
+ variables['STOPPING_TIME'] = stopping_time
45
+ dt0 = dttool.get_start_of_the_day(starting_time)
46
+
47
+ variables['SC_LAT'] = np.array(dataset.variables['LATITUDE'])
48
+ variables['SC_LON'] = np.array(dataset.variables['LONGITUDE'])
49
+ variables['SC_ALT'] = np.array(dataset.variables['ALTITUDE'])
50
+
51
+ variables['GRID_MLAT'] = np.array(dataset.variables['LATITUDE_GEOMAGNETIC_GRID_MAP'])
52
+ variables['GRID_MLON'] = np.array(
53
+ dataset.variables['LONGITUDE_GEOMAGNETIC_' + pole_str + '_GRID_MAP'])
54
+ variables['GRID_MLT'] = np.array(dataset.variables['MLT_GRID_MAP'])
55
+ if self.pole == 'S':
56
+ variables['GRID_MLAT'] = - variables['GRID_MLAT']
57
+ variables['GRID_UT'] = np.array(dataset.variables['UT_' + pole])
58
+ lat = np.array(variables['GRID_MLAT'])
59
+ ut = np.array(variables['GRID_UT'])
60
+ lat = np.where(ut == 0, np.nan, lat)
61
+ if self.pole == 'N':
62
+ ind_mid_t = np.where(lat == np.nanmax(lat.flatten()))
63
+ else:
64
+ ind_mid_t = np.where(lat == np.nanmin(lat.flatten()))
65
+ sectime0 = variables['GRID_UT'][ind_mid_t][0] * 3600
66
+
67
+ diff_days = dttool.get_diff_days(starting_time, stopping_time)
68
+ if diff_days > 0 and sectime0 < 0.5 * 86400.:
69
+ dt = dt0 + datetime.timedelta(seconds=int(sectime0 + 86400))
70
+ else:
71
+ dt = dt0 + datetime.timedelta(seconds=int(sectime0))
72
+ variables['DATETIME'] = dt
73
+
74
+ invalid_ut_inds = np.where(ut == 0)
75
+ # Auroral map, #colors: 0: '1216', 1: '1304', 2: '1356', 3: 'LBHS', 4: 'LBHL'.
76
+ variables['EMISSION_SPECTRA'] = ['1216', '1304', '1356', 'LBHS', 'LBHL']
77
+ disk_aur = np.array(dataset.variables['DISK_RADIANCEDATA_INTENSITY_' + pole_str])
78
+ # disk_aur[:, invalid_ut_inds] = np.nan
79
+ disk_aur[disk_aur <= 0] = 0.1
80
+ variables['GRID_AUR_1216'] = disk_aur[0, ::]
81
+ variables['GRID_AUR_1216'][invalid_ut_inds] = np.nan
82
+ variables['GRID_AUR_1304'] = disk_aur[1, ::]
83
+ variables['GRID_AUR_1304'][invalid_ut_inds] = np.nan
84
+ variables['GRID_AUR_1356'] = disk_aur[2, ::]
85
+ variables['GRID_AUR_1356'][invalid_ut_inds] = np.nan
86
+ variables['GRID_AUR_LBHS'] = disk_aur[3, ::]
87
+ variables['GRID_AUR_LBHS'][invalid_ut_inds] = np.nan
88
+ variables['GRID_AUR_LBHL'] = disk_aur[4, ::]
89
+ variables['GRID_AUR_LBHL'][invalid_ut_inds] = np.nan
90
+
91
+ # Auroral oval boundary
92
+ variables['AOB_EQ_MLAT'] = np.array(dataset.variables[pole_str + '_GEOMAGNETIC_LATITUDE'])
93
+ variables['AOB_EQ_MLON'] = np.array(dataset.variables[pole_str + '_GEOMAGNETIC_LONGITUDE'])
94
+ variables['AOB_EQ_MLT'] = np.array(dataset.variables[pole_str + '_MAGNETIC_LOCAL_TIME'])
95
+
96
+ variables['AOB_PL_MLAT'] = np.array(dataset.variables[pole_str + '_POLAR_GEOMAGNETIC_LATITUDE'])
97
+ variables['AOB_PL_MLON'] = np.array(dataset.variables[pole_str + '_POLAR_GEOMAGNETIC_LONGITUDE'])
98
+ variables['AOB_PL_MLT'] = np.array(dataset.variables[pole_str + '_POLAR_MAGNETIC_LOCAL_TIME'])
99
+
100
+ variables['MAOB_EQ_MLAT'] = np.array(dataset.variables['MODEL_' + pole_str + '_GEOMAGNETIC_LATITUDE'])
101
+ variables['MAOB_EQ_MLON'] = np.array(dataset.variables['MODEL_' + pole_str + '_GEOMAGNETIC_LONGITUDE'])
102
+ variables['MAOB_EQ_MLT'] = np.array(dataset.variables['MODEL_' + pole_str + '_MAGNETIC_LOCAL_TIME'])
103
+
104
+ variables['MAOB_PL_MLAT'] = np.array(dataset.variables['MODEL_' + pole_str + '_POLAR_GEOMAGNETIC_LATITUDE'])
105
+ variables['MAOB_PL_MLON'] = np.array(dataset.variables['MODEL_' + pole_str + '_POLAR_GEOMAGNETIC_LONGITUDE'])
106
+ variables['MAOB_PL_MLT'] = np.array(dataset.variables['MODEL_' + pole_str + '_POLAR_MAGNETIC_LOCAL_TIME'])
107
+
108
+ metadata.setdefault('ORBIT_ID', dataset.STARTING_ORBIT_NUMBER)
27
109
 
28
- if self.pole == 'N':
29
- pole = self.pole
30
- pole_str = 'NORTH'
31
- elif self.pole == 'S':
32
- pole = self.pole
33
- pole_str = 'SOUTH'
34
- else:
35
- raise ValueError
36
- # Time and Position
37
- # sectime = int(np.array(dataset.variables['TIME']).flatten()[0])
38
- # doy = int(np.array(dataset.variables['DOY']).flatten()[0])
39
- # year = int(np.array(dataset.variables['YEAR']).flatten()[0])
40
- # dt0 = dttool.convert_doy_to_datetime(year, doy)
41
- starting_time = datetime.datetime.strptime(dataset.STARTING_TIME, "%Y%j%H%M%S")
42
- variables['STARTING_TIME'] = starting_time
43
- stopping_time = datetime.datetime.strptime(dataset.STOPPING_TIME, "%Y%j%H%M%S")
44
- variables['STOPPING_TIME'] = stopping_time
45
- dt0 = dttool.get_start_of_the_day(starting_time)
46
-
47
- variables['SC_LAT'] = np.array(dataset.variables['LATITUDE'])
48
- variables['SC_LON'] = np.array(dataset.variables['LONGITUDE'])
49
- variables['SC_ALT'] = np.array(dataset.variables['ALTITUDE'])
50
-
51
- variables['GRID_MLAT'] = np.array(dataset.variables['LATITUDE_GEOMAGNETIC_GRID_MAP'])
52
- variables['GRID_MLON'] = np.array(
53
- dataset.variables['LONGITUDE_GEOMAGNETIC_' + pole_str + '_GRID_MAP'])
54
- variables['GRID_MLT'] = np.array(dataset.variables['MLT_GRID_MAP'])
55
- if self.pole == 'S':
56
- variables['GRID_MLAT'] = - variables['GRID_MLAT']
57
- variables['GRID_UT'] = np.array(dataset.variables['UT_' + pole])
58
- lat = np.array(variables['GRID_MLAT'])
59
- ut = np.array(variables['GRID_UT'])
60
- lat = np.where(ut == 0, np.nan, lat)
61
- if self.pole == 'N':
62
- ind_mid_t = np.where(lat == np.nanmax(lat.flatten()))
63
- else:
64
- ind_mid_t = np.where(lat == np.nanmin(lat.flatten()))
65
- sectime0 = variables['GRID_UT'][ind_mid_t][0] * 3600
66
-
67
- diff_days = dttool.get_diff_days(starting_time, stopping_time)
68
- if diff_days > 0 and sectime0 < 0.5 * 86400.:
69
- dt = dt0 + datetime.timedelta(seconds=int(sectime0 + 86400))
70
- else:
71
- dt = dt0 + datetime.timedelta(seconds=int(sectime0))
72
- variables['DATETIME'] = dt
73
-
74
- invalid_ut_inds = np.where(ut == 0)
75
- # Auroral map, #colors: 0: '1216', 1: '1304', 2: '1356', 3: 'LBHS', 4: 'LBHL'.
76
- variables['EMISSION_SPECTRA'] = ['1216', '1304', '1356', 'LBHS', 'LBHL']
77
- disk_aur = np.array(dataset.variables['DISK_RADIANCEDATA_INTENSITY_' + pole_str])
78
- # disk_aur[:, invalid_ut_inds] = np.nan
79
- disk_aur[disk_aur <= 0] = 0.1
80
- variables['GRID_AUR_1216'] = disk_aur[0, ::]
81
- variables['GRID_AUR_1216'][invalid_ut_inds] = np.nan
82
- variables['GRID_AUR_1304'] = disk_aur[1, ::]
83
- variables['GRID_AUR_1304'][invalid_ut_inds] = np.nan
84
- variables['GRID_AUR_1356'] = disk_aur[2, ::]
85
- variables['GRID_AUR_1356'][invalid_ut_inds] = np.nan
86
- variables['GRID_AUR_LBHS'] = disk_aur[3, ::]
87
- variables['GRID_AUR_LBHS'][invalid_ut_inds] = np.nan
88
- variables['GRID_AUR_LBHL'] = disk_aur[4, ::]
89
- variables['GRID_AUR_LBHL'][invalid_ut_inds] = np.nan
90
-
91
- # Auroral oval boundary
92
- variables['AOB_EQ_MLAT'] = np.array(dataset.variables[pole_str + '_GEOMAGNETIC_LATITUDE'])
93
- variables['AOB_EQ_MLON'] = np.array(dataset.variables[pole_str + '_GEOMAGNETIC_LONGITUDE'])
94
- variables['AOB_EQ_MLT'] = np.array(dataset.variables[pole_str + '_MAGNETIC_LOCAL_TIME'])
95
-
96
- variables['AOB_PL_MLAT'] = np.array(dataset.variables[pole_str + '_POLAR_GEOMAGNETIC_LATITUDE'])
97
- variables['AOB_PL_MLON'] = np.array(dataset.variables[pole_str + '_POLAR_GEOMAGNETIC_LONGITUDE'])
98
- variables['AOB_PL_MLT'] = np.array(dataset.variables[pole_str + '_POLAR_MAGNETIC_LOCAL_TIME'])
99
-
100
- variables['MAOB_EQ_MLAT'] = np.array(dataset.variables['MODEL_' + pole_str + '_GEOMAGNETIC_LATITUDE'])
101
- variables['MAOB_EQ_MLON'] = np.array(dataset.variables['MODEL_' + pole_str + '_GEOMAGNETIC_LONGITUDE'])
102
- variables['MAOB_EQ_MLT'] = np.array(dataset.variables['MODEL_' + pole_str + '_MAGNETIC_LOCAL_TIME'])
103
-
104
- variables['MAOB_PL_MLAT'] = np.array(dataset.variables['MODEL_' + pole_str + '_POLAR_GEOMAGNETIC_LATITUDE'])
105
- variables['MAOB_PL_MLON'] = np.array(dataset.variables['MODEL_' + pole_str + '_POLAR_GEOMAGNETIC_LONGITUDE'])
106
- variables['MAOB_PL_MLT'] = np.array(dataset.variables['MODEL_' + pole_str + '_POLAR_MAGNETIC_LOCAL_TIME'])
107
-
108
- metadata.setdefault('ORBIT_ID', dataset.STARTING_ORBIT_NUMBER)
109
- dataset.close()
110
110
 
111
111
  self.variables = variables
112
112
  self.metadata = metadata
113
+
@@ -52,6 +52,8 @@ class Loader:
52
52
 
53
53
  self.variables = variables
54
54
  self.metadata.update(f_cdf.globalattsget())
55
+
56
+ del f_cdf
55
57
  self.done = True
56
58
 
57
59
 
@@ -331,7 +331,7 @@ class Downloader(object):
331
331
  exclude_exp_name_patterns=None,
332
332
  include_exp_ids=None,
333
333
  exclude_exp_ids=None,
334
- icodes=None, madrigal_url=None, display=True,
334
+ icodes=None, madrigal_url=None, display=True, level=0,
335
335
  ):
336
336
 
337
337
  def try_to_get_database(max=3, interval=30):
@@ -383,8 +383,9 @@ class Downloader(object):
383
383
 
384
384
  exps_new = []
385
385
  another_madrigal_url = ''
386
+
386
387
  for exp in exps:
387
- if exp.id == -1:
388
+ if exp.id == -1 and level==0:
388
389
  if another_madrigal_url != exp.madrigalUrl:
389
390
  mylog.StreamLogger.warning(
390
391
  f'Another Madrigal site detected: {exp.madrigalUrl}!'
@@ -400,12 +401,21 @@ class Downloader(object):
400
401
 
401
402
  exps = np.array(exps_new, dtype=object)
402
403
 
403
- if not list(exps):
404
+ if not list(exps) and not str(another_madrigal_url):
404
405
  raise ValueError('Cannot find available experiments from the current database! Check the input values!')
405
- elif str(another_madrigal_url):
406
+ elif str(another_madrigal_url) and level==0:
406
407
  mylog.StreamLogger.warning(
407
- 'Some data are located in another Madrigal site and will not be processed!'
408
+ 'Some data are located in another Madrigal site: {}.'.format(another_madrigal_url)
408
409
  )
410
+
411
+ exps, database = Downloader.get_exp_list(
412
+ dt_fr=dt_fr, dt_to=dt_to,
413
+ include_exp_name_patterns=include_exp_name_patterns,
414
+ exclude_exp_name_patterns=exclude_exp_name_patterns,
415
+ include_exp_ids=include_exp_ids,
416
+ exclude_exp_ids=exclude_exp_ids,
417
+ icodes=icodes, madrigal_url=another_madrigal_url, display=display, level=level+1
418
+ )
409
419
  else:
410
420
  pass
411
421
 
@@ -60,6 +60,7 @@ class Loader:
60
60
  self.variables = variables
61
61
 
62
62
 
63
+
63
64
  if __name__ == "__main__":
64
65
  import pathlib
65
66
  fp = pathlib.Path("/Users/lcai/Downloads/gps200102g.002.hdf5")
@@ -45,7 +45,7 @@ var = Var(name=var_name, ndim=3, variable_type='scalar', visual=visual)
45
45
  var.fullname = 'GNSS TEC MAP'
46
46
  var.label = r'TEC'
47
47
  var.group = r'TEC'
48
- var.unit = 'TECu'
48
+ var.unit = 'TECU'
49
49
  var.depends = {0: depend_0, 1: depend_1}
50
50
  # set plot attrs
51
51
  plot_config = var.visual.plot_config
@@ -53,6 +53,7 @@ plot_config.config(**default_plot_config)
53
53
  plot_config.style = '2P'
54
54
  # set axis attrs
55
55
  axis = var.visual.axis
56
-
56
+ axis[2].label = '@v.label'
57
+ axis[2].unit = '@v.unit'
57
58
 
58
59
  configured_variables[var_name] = var
@@ -134,16 +134,17 @@ class Dataset(datahub.DatasetSourced):
134
134
  self.affiliation = load_obj.metadata['affiliation']
135
135
  self.metadata = load_obj.metadata
136
136
 
137
- inds_cmb = np.argsort(self['DATETIME'].flatten())
138
- if any(np.diff(np.array(inds_cmb))<0):
139
- for var_name in self.keys():
140
- self[var_name].value = self[var_name].value[inds_cmb, :]
141
-
142
137
  if self.add_AACGM or self.add_APEX:
143
138
  self.calc_lat_lon()
144
139
  # self.select_beams(field_aligned=True)
145
140
  if self.time_clip:
146
141
  self.time_filter_by_range()
142
+
143
+ inds_cmb = np.argsort(self['DATETIME'].flatten())
144
+ if any(np.diff(np.array(inds_cmb)) < 0):
145
+ for var_name in self.keys():
146
+ self[var_name].value = self[var_name].value[inds_cmb, :]
147
+
147
148
  if self.status_control:
148
149
  self.status_mask()
149
150
  if self.residual_control:
@@ -33,6 +33,7 @@ default_dataset_attrs = {
33
33
  'exp_check': False,
34
34
  'data_file_ext': ['h5', 'hdf5'],
35
35
  'data_root_dir': prf.datahub_data_root_dir / 'Madrigal' / 'PFISR',
36
+ 'force_download': False,
36
37
  'allow_download': True,
37
38
  'status_control': False,
38
39
  'residual_control': False,
@@ -76,6 +77,8 @@ class Dataset(datahub.DatasetSourced):
76
77
  self.affiliation = kwargs.pop('affiliation', '')
77
78
  self.pulse_code = kwargs.pop('pulse_code', 'alternating code')
78
79
  self.allow_download = kwargs.pop('allow_download', True)
80
+ self.force_download = kwargs.pop('force_download', False)
81
+ self.gate_num = kwargs.pop('gate_num', None)
79
82
  self.beam_id = kwargs.pop('beam_id', None)
80
83
  self.beam_az = kwargs.pop('beam_az', None)
81
84
  self.beam_el = kwargs.pop('beam_el', None)
@@ -124,15 +127,29 @@ class Dataset(datahub.DatasetSourced):
124
127
  def load_data(self, **kwargs):
125
128
  self.check_data_files(**kwargs)
126
129
 
130
+ load_objs = []
131
+ gate_nums = []
127
132
  for file_path in self.data_file_paths:
128
- load_obj = self.loader(file_path, beam_az=self.beam_az, beam_el=self.beam_el, beam_id=self.beam_id)
129
-
133
+ load_obj = self.loader(file_path, beam_az=self.beam_az, beam_el=self.beam_el, beam_id=self.beam_id, gate_num=self.gate_num)
134
+ load_objs.append(load_obj)
135
+ gate_nums.append(load_obj.gate_num)
136
+
137
+ if len(np.unique(gate_nums)) > 1:
138
+ mylog.StreamLogger.warning(
139
+ "Multiple types of experiments detected with different gate" +
140
+ "numbers (maximum: {})! Set 'gate_num' to this number!".format(np.max(gate_nums)))
141
+ self.gate_num = np.max(gate_nums)
142
+ load_objs = []
143
+ for file_path in self.data_file_paths:
144
+ load_obj = self.loader(file_path, beam_az=self.beam_az, beam_el=self.beam_el, beam_id=self.beam_id,
145
+ gate_num=self.gate_num)
146
+ load_objs.append(load_obj)
147
+
148
+ for load_obj in load_objs:
130
149
  for var_name in self._variables.keys():
131
150
  self._variables[var_name].join(load_obj.variables[var_name])
132
151
  self.metadata = load_obj.metadata
133
152
 
134
- if self.show_beams:
135
- load_obj.list_beams()
136
153
  self.beams = load_obj.beams
137
154
  self.beam_id = load_obj.beam_id
138
155
  self.beam_az = load_obj.beam_az
@@ -147,6 +164,23 @@ class Dataset(datahub.DatasetSourced):
147
164
  if self.time_clip:
148
165
  self.time_filter_by_range()
149
166
 
167
+ inds_cmb = np.argsort(self['DATETIME'].flatten())
168
+ if any(np.diff(np.array(inds_cmb))<0):
169
+ mylog.StreamLogger.warning("Multiple types of experiments detected! The times are re-sorted and data are combined!")
170
+ multi_experiments = True
171
+ for var_name in self.keys():
172
+ self[var_name].value = self[var_name].value[inds_cmb, :]
173
+ else:
174
+ multi_experiments = False
175
+
176
+
177
+ if self.show_beams:
178
+ if multi_experiments:
179
+ for load_obj in load_objs:
180
+ load_obj.list_beams()
181
+ else:
182
+ load_objs[0].list_beams()
183
+
150
184
  def calc_lat_lon(self):
151
185
  from geospacelab.cs import LENUSpherical
152
186
  az = self['AZ'].value
@@ -205,7 +239,7 @@ class Dataset(datahub.DatasetSourced):
205
239
  search_pattern=search_pattern, recursive=True, allow_multiple_files=True
206
240
  )
207
241
 
208
- if not done and self.allow_download:
242
+ if (not done and self.allow_download) or self.force_download:
209
243
  done = self.download_data()
210
244
  if done:
211
245
  done = super().search_data_files(
@@ -227,13 +261,16 @@ class Dataset(datahub.DatasetSourced):
227
261
 
228
262
  else:
229
263
  diff_years = dt_to.year - dt_fr.year
264
+ download_check = 0
230
265
  for ny in range(diff_years + 1):
231
266
  initial_file_dir = self.data_root_dir / str(dt_to.year + ny)
232
267
  search_pattern = "*EID-*/"
233
268
  exp_dirs = list(initial_file_dir.glob(search_pattern))
234
269
 
235
- if not list(exp_dirs) and self.allow_download:
236
- self.download_data()
270
+ if (not list(exp_dirs) and self.allow_download) or self.force_download:
271
+ self.download_data()
272
+ download_check = 1
273
+ exp_dirs = list(initial_file_dir.glob(search_pattern))
237
274
 
238
275
  def dir_parser(dirs):
239
276
  dirs_out = []
@@ -251,8 +288,8 @@ class Dataset(datahub.DatasetSourced):
251
288
  return dirs_out
252
289
  file_dirs = dir_parser(exp_dirs)
253
290
 
254
- if not list(file_dirs) and self.allow_download:
255
- self.download_data()
291
+ # if not list(file_dirs) and self.allow_download and download_check:
292
+ # self.download_data()
256
293
 
257
294
  for fd in file_dirs:
258
295
  if isinstance(self.exp_name_pattern, list):
@@ -281,7 +318,7 @@ class Dataset(datahub.DatasetSourced):
281
318
 
282
319
  # Validate file paths
283
320
 
284
- if not done and self.allow_download:
321
+ if not done and self.allow_download and download_check:
285
322
  done = self.download_data()
286
323
  if done:
287
324
  done = super().search_data_files(
@@ -349,6 +386,7 @@ class Dataset(datahub.DatasetSourced):
349
386
  download_obj = self.downloader(
350
387
  dt_fr=self.dt_fr, dt_to=self.dt_to,
351
388
  pulse_code=self.pulse_code,
389
+ force_download=self.force_download,
352
390
  dry_run=dry_run,
353
391
  data_file_root_dir=self.data_root_dir,
354
392
  include_exp_ids=self.experiment_ids,
@@ -51,7 +51,7 @@ class Loader:
51
51
  :param load_data: True, load without calling the method "load_data" separately.
52
52
  :type load_data: bool
53
53
  """
54
- def __init__(self, file_path, beam_id=None, beam_az=None, beam_el=None, direct_load=True):
54
+ def __init__(self, file_path, beam_id=None, beam_az=None, beam_el=None, direct_load=True, gate_num=None):
55
55
  self.file_path = file_path
56
56
  self.beam_id = beam_id
57
57
  self.beam_az = beam_az
@@ -59,6 +59,7 @@ class Loader:
59
59
  self.beams = None
60
60
  self.variables = {}
61
61
  self.metadata = {}
62
+ self.gate_num = gate_num
62
63
 
63
64
  self.done = False
64
65
  if direct_load:
@@ -184,9 +185,27 @@ class Loader:
184
185
  elif var_name == 'dnel':
185
186
  vars_fh5['dne'] = 10 ** np.array(fh5_vars_2d[var_name]).T
186
187
  else:
187
- vars_fh5[var_name] = np.array(fh5_vars_2d[var_name]).T
188
+ arr = np.array(fh5_vars_2d[var_name]).T
189
+
190
+ if self.gate_num is None:
191
+ vars_fh5[var_name] = arr
192
+
193
+ else:
194
+ arr_new = np.empty((arr.shape[0], self.gate_num))
195
+ arr_new[::] = np.nan
196
+ for ii in range(arr.shape[0]):
197
+ arr_new[ii, 0: arr.shape[1]] = arr[ii, :]
198
+ vars_fh5[var_name] = arr_new
199
+ self.gate_num = vars_fh5['ne'].shape[1]
200
+
188
201
  vars_fh5['range'] = np.array(data_fh5['Array Layout'][array_layout_str]['range'])[np.newaxis, :]
189
- if np.median(vars_fh5['range'].flatten()) > 1e5:
202
+ if vars_fh5['range'].shape[1] < self.gate_num:
203
+ arr = np.empty((1, self.gate_num))
204
+ arr[::] = np.nan
205
+ arr[0, 0:vars_fh5['range'].shape[1]] = vars_fh5['range'].flatten()
206
+ vars_fh5['range'] = arr
207
+
208
+ if np.nanmedian(vars_fh5['range'].flatten()) > 1e5:
190
209
  mylog.StreamLogger.warning(f"The variable range is detected in [m]. It is converted into [km].")
191
210
  vars_fh5['range'] = vars_fh5['range'] * 1e-3
192
211
  vars_fh5['timestamps'] = np.array(data_fh5['Array Layout'][array_layout_str]['timestamps'])[:, np.newaxis]
@@ -47,7 +47,9 @@ class LEOToolbox(DatasetUser):
47
47
  if list(inds_abnormal):
48
48
  iiii = np.array(inds_abnormal) + 1
49
49
  nodes['INDEX'] = np.delete(nodes['INDEX'], iiii)
50
+ nodes['GEO_LAT'] = np.delete(nodes['GEO_LAT'], iiii)
50
51
  nodes['GEO_LON'] = np.delete(nodes['GEO_LON'], iiii)
52
+ nodes['GEO_ALT'] = np.delete(nodes['GEO_ALT'], iiii)
51
53
  nodes['GEO_LST'] = np.delete(nodes['GEO_LST'], iiii)
52
54
  nodes['DATETIME'] = np.delete(nodes['DATETIME'], iiii)
53
55
 
@@ -55,6 +57,7 @@ class LEOToolbox(DatasetUser):
55
57
  glat = self['SC_GEO_LAT'].value.flatten()
56
58
  glat_ = glat[0::data_interval]
57
59
  glon = self['SC_GEO_LON'].value.flatten()
60
+ alt = self['SC_GEO_ALT'].flatten()
58
61
  lst = self['SC_GEO_LST'].value.flatten()
59
62
  dts = self['SC_DATETIME'].value.flatten()
60
63
  ind_1 = argrelextrema(np.abs(glat_), np.less, )[0]
@@ -74,26 +77,34 @@ class LEOToolbox(DatasetUser):
74
77
  ind_between = np.where(ind_1 > ind_N)[0]
75
78
  inds_asc.append(ind_1[ind_between[0]-1])
76
79
  inds_dsc.append(ind_1[ind_between[0]])
77
- self.ascending_nodes['INDEX'] = inds_asc
78
- self.ascending_nodes['GEO_LON'] = glon[inds_asc]
80
+ self.ascending_nodes['INDEX'] = np.array(inds_asc)
81
+ self.ascending_nodes['GEO_LON'] = glon[inds_asc]
82
+ self.ascending_nodes['GEO_LAT'] = glat[inds_asc]
83
+ self.ascending_nodes['GEO_ALT'] = alt[inds_asc]
79
84
  self.ascending_nodes['GEO_LST'] = lst[inds_asc]
80
85
  self.ascending_nodes['DATETIME'] = dts[inds_asc]
81
86
  check_nodes(self.ascending_nodes)
82
87
 
83
- self.descending_nodes['INDEX']= inds_dsc
88
+ self.descending_nodes['INDEX']= np.array(inds_dsc)
84
89
  self.descending_nodes['GEO_LON'] = glon[inds_dsc]
90
+ self.descending_nodes['GEO_LAT'] = glat[inds_dsc]
91
+ self.descending_nodes['GEO_ALT'] = alt[inds_dsc]
85
92
  self.descending_nodes['GEO_LST'] = lst[inds_dsc]
86
93
  self.descending_nodes['DATETIME'] = dts[inds_dsc]
87
94
  check_nodes(self.descending_nodes)
88
95
 
89
96
  self.northern_nodes['INDEX'] = ind_2
90
97
  self.northern_nodes['GEO_LON'] = glon[ind_2]
98
+ self.northern_nodes['GEO_LAT'] = glat[ind_2]
99
+ self.northern_nodes['GEO_ALT'] = alt[ind_2]
91
100
  self.northern_nodes['GEO_LST'] = lst[ind_2]
92
101
  self.northern_nodes['DATETIME'] = dts[ind_2]
93
102
  check_nodes(self.northern_nodes)
94
103
 
95
104
  self.southern_nodes['INDEX'] = ind_3
96
105
  self.southern_nodes['GEO_LON'] = glon[ind_3]
106
+ self.southern_nodes['GEO_LAT'] = glat[ind_3]
107
+ self.southern_nodes['GEO_ALT'] = alt[ind_3]
97
108
  self.southern_nodes['GEO_LST'] = lst[ind_3]
98
109
  self.southern_nodes['DATETIME'] = dts[ind_3]
99
110
  check_nodes(self.southern_nodes)
@@ -2,116 +2,22 @@ import copy
2
2
  import weakref
3
3
  import string
4
4
  import numpy as np
5
- import matplotlib.pyplot as plt
6
- import matplotlib as mpl
7
5
  import pathlib
8
6
  from matplotlib.axes import Axes
9
7
  from typing import Dict
8
+ import gc
10
9
  # import palettable
11
10
 
12
11
  from matplotlib.gridspec import GridSpec, SubplotSpec
13
12
  from matplotlib.figure import Figure
14
13
 
15
- from cycler import cycler
16
-
17
- from geospacelab.config import pref
14
+ from geospacelab.config import pref, mpl, plt
18
15
  from geospacelab.toolbox.utilities.pyclass import StrBase
19
16
  import geospacelab.toolbox.utilities.pybasic as pybasic
20
17
  from geospacelab.visualization.mpl._helpers import check_panel_ax
21
18
  import geospacelab.toolbox.utilities.pylogging as mylog
22
- # from geospacelab.visualization.mpl.dashboards import Dashboard
23
-
24
19
 
25
- try:
26
- mpl_style = pref.user_config['visualization']['mpl']['style']
27
- except KeyError:
28
- uc = pref.user_config
29
- uc['visualization']['mpl']['style'] = 'light'
30
- pref.set_user_config(user_config=uc, set_as_default=True)
31
-
32
-
33
- # plt.rcParams['font.serif'] = 'Ubuntu'
34
- # plt.rcParams['font.monospace'] = 'Ubuntu Mono'
35
- plt.rcParams['font.size'] = 10
36
- plt.rcParams['axes.labelsize'] = 10
37
- plt.rcParams['axes.labelweight'] = 'book'
38
- plt.rcParams['axes.titlesize'] = 10
39
- plt.rcParams['xtick.labelsize'] = 10
40
- plt.rcParams['ytick.labelsize'] = 10
41
- plt.rcParams['legend.fontsize'] = 10
42
- plt.rcParams['figure.titlesize'] = 12
43
-
44
- # plt.style.use('https://github.com/dhaitz/matplotlib-stylesheets/raw/master/pacoty.mplstyle')
45
- mpl_style = pref.user_config['visualization']['mpl']['style']
46
-
47
- if mpl_style == 'light':
48
- plt.rcParams['axes.facecolor'] = '#FCFCFC'
49
- plt.rcParams['text.color'] = 'k'
50
- default_cycler = (cycler(color=['tab:blue', 'tab:red', 'tab:green', 'tab:purple', 'tab:orange', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan']))
51
- default_cycler = (cycler(color=['#1f77b4DD', '#ff7f0eDD', '#2ca02cDD', '#d62728DD', '#9467bdDD', '#8c564bDD', '#e377c2DD', '#7f7f7fDD', '#bcbd22DD', '#17becfDD']))
52
- # colors = [
53
- # (0.8980392156862745, 0.5254901960784314, 0.023529411764705882),
54
- # (0.36470588235294116, 0.4117647058823529, 0.6941176470588235),
55
- # (0.3215686274509804, 0.7372549019607844, 0.6392156862745098),
56
- # (0.6, 0.788235294117647, 0.27058823529411763),
57
- # (0.8, 0.3803921568627451, 0.6901960784313725),
58
- # (0.1411764705882353, 0.4745098039215686, 0.4235294117647059),
59
- # (0.8549019607843137, 0.6470588235294118, 0.10588235294117647),
60
- # (0.1843137254901961, 0.5411764705882353, 0.7686274509803922),
61
- # (0.4627450980392157, 0.3058823529411765, 0.6235294117647059),
62
- # (0.9294117647058824, 0.39215686274509803, 0.35294117647058826),
63
- # ]
64
- colors = [
65
- (0.36470588235294116, 0.4117647058823529, 0.6941176470588235),
66
- (0.9294117647058824, 0.39215686274509803, 0.35294117647058826),
67
- (0.3215686274509804, 0.7372549019607844, 0.6392156862745098),
68
- (0.8980392156862745, 0.5254901960784314, 0.023529411764705882),
69
- (0.6, 0.788235294117647, 0.27058823529411763),
70
- (0.8, 0.3803921568627451, 0.6901960784313725),
71
- (0.1411764705882353, 0.4745098039215686, 0.4235294117647059),
72
- (0.8549019607843137, 0.6470588235294118, 0.10588235294117647),
73
- (0.1843137254901961, 0.5411764705882353, 0.7686274509803922),
74
- (0.4627450980392157, 0.3058823529411765, 0.6235294117647059),
75
-
76
- ]
77
- default_cycler = (cycler(color=colors))
78
- plt.rc('axes', prop_cycle=default_cycler)
79
- elif mpl_style == 'dark':
80
- plt.rcParams['figure.facecolor'] = '#0C1C23'
81
- plt.rcParams['savefig.facecolor'] = '#0C1C23'
82
-
83
- plt.rcParams['axes.facecolor'] = '#FFFFFF20'
84
- plt.rcParams['axes.edgecolor'] = '#FFFFFF3D'
85
- plt.rcParams['axes.labelcolor'] = '#FFFFFFD9'
86
-
87
- plt.rcParams['xtick.color'] = '#FFFFFFD9'
88
- plt.rcParams['ytick.color'] = '#FFFFFFD9'
89
- plt.rcParams['text.color'] = 'white'
90
-
91
- plt.rcParams['grid.color'] = '#FFFFFF'
92
- plt.rcParams['legend.facecolor'] = plt.rcParams['axes.facecolor']
93
- plt.rcParams['legend.edgecolor'] = '#FFFFFFD9'
94
-
95
- # seaborn dark:['#001c7f', '#b1400d', '#12711c', '#8c0800', '#591e71', '#592f0d', '#a23582', '#3c3c3c', '#b8850a', '#006374']
96
- # seaborn pastel '#a1c9f4', '#ffb482', '#8de5a1', '#ff9f9b', '#d0bbff', '#debb9b', '#fab0e4', '#cfcfcf', '#fffea3', '#b9f2f0'
97
- default_cycler = (cycler(color=['#F5EE33', '#33FF99', 'r', '#9467bd', '#08C7FE', '#FE66BB', ]))
98
- colors = [
99
- (0.1843137254901961, 0.5411764705882353, 0.7686274509803922),
100
- (0.9294117647058824, 0.39215686274509803, 0.35294117647058826),
101
- (0.3215686274509804, 0.7372549019607844, 0.6392156862745098),
102
- (0.8980392156862745, 0.5254901960784314, 0.023529411764705882),
103
- (0.6, 0.788235294117647, 0.27058823529411763),
104
- (0.8, 0.3803921568627451, 0.6901960784313725),
105
- (0.1411764705882353, 0.4745098039215686, 0.4235294117647059),
106
- (0.8549019607843137, 0.6470588235294118, 0.10588235294117647),
107
- (0.36470588235294116, 0.4117647058823529, 0.6941176470588235),
108
- (0.4627450980392157, 0.3058823529411765, 0.6235294117647059),
109
- ]
110
- default_cycler = (cycler(color=colors))
111
- # default_cycler = (cycler(color=palettable.cartocolors.qualitative.Safe_10.mpl_colors))
112
- plt.rc('axes', prop_cycle=default_cycler)
113
- else:
114
- plt.style.use(mpl_style)
20
+ # from geospacelab.visualization.mpl.dashboards import Dashboard
115
21
 
116
22
 
117
23
  class FigureBase(Figure):
@@ -264,9 +170,10 @@ class DashboardBase(object):
264
170
  for ind_p in keys:
265
171
  self.remove_panel(ind_p)
266
172
  for ax in self.extra_axes.values():
267
- ax.remove()
173
+ ax.clear()
268
174
  self.extra_axes = {}
269
-
175
+ gc.collect()
176
+
270
177
 
271
178
  def set_layout(self, num_rows=None, num_cols=None, **kwargs):
272
179
  """
@@ -546,7 +453,7 @@ class PanelBase(object):
546
453
  self.figure = figure
547
454
  self.axes = {}
548
455
  self.label = kwargs.pop('label', None)
549
- self._current_ax = None
456
+ # self._current_ax_ref = None
550
457
  # self.objectives = kwargs.pop('objectives', {})
551
458
  if from_subplot:
552
459
  ax = self.figure.add_subplot(*args, **kwargs)
@@ -559,7 +466,7 @@ class PanelBase(object):
559
466
  ax = self.figure.add_axes(*args, **kwargs)
560
467
  self.axes['major'] = ax
561
468
  self.axes_overview[ax] = copy.deepcopy(self._ax_attr_model)
562
- self._current_ax = ax
469
+ self.sca(ax)
563
470
 
564
471
  def __call__(self, ax=None) -> Axes:
565
472
  """
@@ -579,10 +486,15 @@ class PanelBase(object):
579
486
  raise AttributeError
580
487
 
581
488
  def clear(self):
582
- for ax in self.axes.values():
583
- ax.remove()
489
+ self._current_ax_ref = None
490
+ self.axes_overview.clear()
491
+ for key, ax in self.axes.items():
492
+ ax.clear()
493
+ del ax
494
+ self.axes[key] = None
584
495
 
585
- self.axes = {}
496
+ self.axes.clear()
497
+ gc.collect()
586
498
 
587
499
  def sca(self, ax):
588
500
  """
@@ -591,7 +503,7 @@ class PanelBase(object):
591
503
  :param ax: the ax instance belong to the attribute axes.
592
504
  """
593
505
  plt.sca(ax)
594
- self._current_ax = ax
506
+ self._current_ax_ref = weakref.ref(ax)
595
507
 
596
508
  def gca(self):
597
509
  """
@@ -599,7 +511,7 @@ class PanelBase(object):
599
511
 
600
512
  :return: Axes instance.
601
513
  """
602
- return self._current_ax
514
+ return self._current_ax_ref()
603
515
 
604
516
  def add_axes(self, *args, major=False, label=None, **kwargs):
605
517
  """
@@ -651,13 +563,13 @@ class PanelBase(object):
651
563
  self.sca(ax)
652
564
  plt.grid(visible=visible, which=which, axis=axis, **kwargs)
653
565
 
654
- @check_panel_ax
655
- def clear_axes(self, ax=None, collection_names=('lines', 'collections', 'images', 'patches')):
656
- for cn in collection_names:
657
- cs = getattr(ax, cn)
658
- ncs = len(cs)
659
- for i in range(ncs):
660
- cs.pop(ncs-1-i)
566
+ # @check_panel_ax
567
+ # def clear_axes(self, ax=None, collection_names=('lines', 'collections', 'images', 'patches', 'spines')):
568
+ # for cn in collection_names:
569
+ # cs = getattr(ax, cn)
570
+ # ncs = len(cs)
571
+ # for i in range(ncs):
572
+ # cs.pop(ncs-1-i)
661
573
 
662
574
  def add_text(self, x, y, text, ax=None, **kwargs):
663
575
 
@@ -54,6 +54,16 @@ def cmap_jhuapl_ssj_like():
54
54
  return mycmap
55
55
 
56
56
 
57
+ def cmap_jhuapl_ssusi_like():
58
+ c1 = ['#000000', "#330066",
59
+ '#0000CC', '#0080FF',
60
+ "#00CC00", '#80FF00',
61
+ '#FFFF00', '#FF8000',
62
+ '#FF0000', '#FF6666']
63
+ mycmap = colors.LinearSegmentedColormap.from_list("jhuapl_ssusi_like", c1, N=500)
64
+ return mycmap
65
+
66
+
57
67
  def cmap_aurora():
58
68
  c1 = ['#848F9E', '#6A4CA1', '#4035A3', '#395EA6', '#003300', '#006600', '#009900', '#00BB00', '#00DD00', '#00FF00', '#80FF80', '#B3FFB3']
59
69
  c1 = ['#AEAAB0', '#78519A', '#51227B', '#310073',
@@ -13,6 +13,7 @@ import datetime
13
13
  import cartopy.crs as ccrs
14
14
  import re
15
15
  import copy
16
+ import gc
16
17
  from cartopy.mpl.ticker import (
17
18
  LongitudeLocator, LatitudeLocator,
18
19
  LongitudeFormatter, LatitudeFormatter)
@@ -23,6 +24,8 @@ import matplotlib.colors as mcolors
23
24
  import matplotlib.cm as mcm
24
25
  from scipy.interpolate import interp1d, griddata
25
26
  import matplotlib.cm as cm
27
+ import cartopy.mpl.geoaxes as geoaxes
28
+ import weakref
26
29
  from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
27
30
 
28
31
  import geospacelab.visualization.mpl as mpl
@@ -159,6 +162,12 @@ class PolarMapPanel(GeoPanel):
159
162
  if self.depend_mlt:
160
163
  cs2.coords.lon = self._transform_mlt_to_lon(cs2.coords.mlt)
161
164
  return cs2
165
+ def clear(self):
166
+ self.projection = None
167
+ self._proj_class = None
168
+ geoaxes._PATH_TRANSFORM_CACHE.clear()
169
+ gc.collect()
170
+ super().clear()
162
171
 
163
172
  def overlay_coastlines(self, linestyle='-', linewidth=0.5, color='#797A7D', zorder=100, alpha=0.7,
164
173
  resolution='110m', **kwargs):
@@ -202,7 +211,8 @@ class PolarMapPanel(GeoPanel):
202
211
  **kwargs)
203
212
  # self.ax.scatter(x_new, y_new, transform=self.default_transform,
204
213
  # marker='.', edgecolors='none', color='#C0C0C0', s=1)
205
-
214
+ del x_new, y_new
215
+ coords = None
206
216
  return
207
217
 
208
218
  def overlay_gridlines(self,
@@ -333,7 +343,7 @@ class PolarMapPanel(GeoPanel):
333
343
 
334
344
  pybasic.dict_set_default(gridlines_config, color='#331900', linewidth=0.5, linestyle=':',
335
345
  draw_labels=False)
336
- gl = self().gridlines(crs=ccrs.PlateCarree(), **gridlines_config)
346
+ gl = self().gridlines(crs=ccrs.PlateCarree(), **gridlines_config,)
337
347
 
338
348
  gl.xlocator = xlocator
339
349
  gl.ylocator = ylocator
@@ -1068,10 +1078,20 @@ class PolarMapPanel(GeoPanel):
1068
1078
 
1069
1079
  def overlay_sites(self, site_ids=None, coords=None, cs=None, **kwargs):
1070
1080
  kwargs = pybasic.dict_set_default(kwargs, color='k', linestyle='', markersize=5, marker='.')
1081
+ show_site_names = kwargs.pop('show_site_names', False)
1082
+ site_names = kwargs.pop('site_names', [])
1083
+ site_name_config = kwargs.pop('site_name_config', {'fontsize': 'small', })
1084
+ site_name_config.update(color=kwargs['color'])
1071
1085
 
1072
1086
  cs_new = self.cs_transform(cs_fr=cs, coords=coords)
1073
1087
 
1074
1088
  isc = self().plot(cs_new['lon'], cs_new['lat'], transform=ccrs.PlateCarree(), **kwargs)
1089
+
1090
+ if show_site_names:
1091
+ if not list(site_names):
1092
+ site_names = site_ids
1093
+ for i, s in enumerate(site_names):
1094
+ self().text(cs_new['lon'][i], cs_new['lat'][i], s, transform=ccrs.PlateCarree(), **site_name_config)
1075
1095
  return isc
1076
1096
 
1077
1097
  def add_colorbar(self, im, ax=None, figure=None,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: geospacelab
3
- Version: 0.10.3
3
+ Version: 0.11.0
4
4
  Summary: Collect, manage, and visualize geospace data.
5
5
  Home-page: https://github.com/JouleCai/geospacelab
6
6
  Author: Lei Cai
@@ -1,6 +1,7 @@
1
- geospacelab/__init__.py,sha256=HwFTcXkPQs7SxhFStdiN9a-Zvicke-9ClFpDjOq5Y5w,801
2
- geospacelab/config/__init__.py,sha256=D5A0ORTubSaLEXGqPmg-mLH_KNqINicOeeNFqkGpXrk,641
3
- geospacelab/config/_preferences.py,sha256=DakPjKJQ0VRe2Mgc8bakw585u4N8qVqYYvqnoLdyvH4,4726
1
+ geospacelab/__init__.py,sha256=o9UGHuHohTJI5hQ6S62CZ35dSnAnkD-M5-ayloaqsLU,801
2
+ geospacelab/config/__init__.py,sha256=--F2bcKRCNIbPaFz4bySMkuxGg1ZxF1j1uyxMA0t3xA,660
3
+ geospacelab/config/__mpl__.py,sha256=bO10-mtYDF1EhnRFuXX4H8TUU3esxOZe-qfTrzRhBk0,4705
4
+ geospacelab/config/_preferences.py,sha256=VKXXWNvFzIMXGmvb7Udd900DoubMlqrcu-gLmzHmzMk,4754
4
5
  geospacelab/coords/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
6
  geospacelab/coords/geo_utilities.py,sha256=7_C98Cd29tzNl86kdWYmVC8UBS8E07oJIR6Ma4rOCH4,274
6
7
  geospacelab/cs/__init__.py,sha256=lzPhfypd0EfsOJnKsrrK2dQo3sxj8lpblYEhpz2i9xA,1282
@@ -15,7 +16,7 @@ geospacelab/datahub/__init_dataset.py,sha256=5k87VqEgYGr8F77gpKVeiHNPEsk9u2XmbQ-
15
16
  geospacelab/datahub/__init_metadata.py,sha256=sYBQFIbEZh-TWPvdbDBsTQYqlvwNw2iJloyXWYcVgE4,2996
16
17
  geospacelab/datahub/__init_variable.py,sha256=L11PK-eBOFbGv90sDgH70DGilOndnvQczG41ZNHy7Ks,25233
17
18
  geospacelab/datahub/__metadata_base__.py,sha256=AbMaV5iuonTekS9fLy9Eq2h3ixblPC3BpsaWEdZv7f0,2825
18
- geospacelab/datahub/__variable_base__.py,sha256=gvwB9CwF3VV_4uE5NDGDYzlPYTUGa3LDegl8Ke2Uwks,39090
19
+ geospacelab/datahub/__variable_base__.py,sha256=AkSbmsbjqXPjce7at_0BXpYkSCzZA3huh_04zUd6iBA,39120
19
20
  geospacelab/datahub/_dataset_base.py,sha256=Y0ntQ7FtRmnCND2AtEaehJ3DtgxVG_2pwS1B5Z9BOVw,11283
20
21
  geospacelab/datahub/_metadata_base.py,sha256=sYBQFIbEZh-TWPvdbDBsTQYqlvwNw2iJloyXWYcVgE4,2996
21
22
  geospacelab/datahub/_variable_base.py,sha256=dUm15Y012FQ0hAdeA48ky0tKEc9il59FHvOP7KncYWE,25050
@@ -25,13 +26,13 @@ geospacelab/datahub/sources/cdaweb/__init__.py,sha256=fP1ziTZFxTOz-HF07az67F5Afv
25
26
  geospacelab/datahub/sources/cdaweb/downloader.py,sha256=CIq6LjlfGM73ipxabFH7P22dV8ptKs1O18S5W1kKh94,5038
26
27
  geospacelab/datahub/sources/cdaweb/dmsp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
28
  geospacelab/datahub/sources/cdaweb/dmsp/ssusi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/__init__.py,sha256=uTajV8_7lreuSnoLkNvnNAmSMET-U2PJQ2UEd4AM7IA,8189
29
- geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/downloader.py,sha256=mKNQUfBPXaLo2OapjPiFV-EaZWrMMV8ZbELxe65smss,3184
30
- geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/loader.py,sha256=bQubqbZ54Qh6JzpU6yZmTCma8Qh5S1vTGaFAx3U849A,5322
29
+ geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/__init__.py,sha256=44dlkn7t2HMcGBAhh0oj4ne4NP3LXCEQkS34qgh0f4E,8490
30
+ geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/downloader.py,sha256=LCn0tupzAkir9Z_280tBulHEPlqoX6DWe8HKFk1h4IE,3191
31
+ geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/loader.py,sha256=U8ucK-rstKRSxf1gSTiduE5fZ6n9nfxheGpBJoI1D7Y,5603
31
32
  geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/variable_config.py,sha256=6-BMqRDSAxuND1WtiXD4_70hr4RbmbflvUBT61Fn7s8,4346
32
33
  geospacelab/datahub/sources/cdaweb/omni/__init__.py,sha256=Cx34OLYuX_zLIialhXlI6F0x4rXbCWLC7yCYBse6s2c,11529
33
34
  geospacelab/datahub/sources/cdaweb/omni/downloader.py,sha256=Rle46rGxWmnM46BMO6hGpZR16vLF6DusYacpH_eMjw0,4129
34
- geospacelab/datahub/sources/cdaweb/omni/loader.py,sha256=MVxzK9uMtxWK8OjnzHyJD-k0M-Sq7Fk4YbN_CkreQok,3207
35
+ geospacelab/datahub/sources/cdaweb/omni/loader.py,sha256=5ISQ9V2mMhf2JXVL9jUQlsQdsETgRd_KIc-CgBApFis,3234
35
36
  geospacelab/datahub/sources/cdaweb/omni/variable_config.py,sha256=WWVuuy28FSHV-DUAOx9hB80zCarTJJoObSgCbq7lgWM,12424
36
37
  geospacelab/datahub/sources/esa_eo/__init__.py,sha256=Z-X5gUc21PNcCSCHoaP4ieQjTUBtMft8cK0hfJnezWo,521
37
38
  geospacelab/datahub/sources/esa_eo/swarm/__init__.py,sha256=VCgXC15rp09kebnDY9GW0cy-BXH0RrEo6jscilobv_w,2386
@@ -132,7 +133,7 @@ geospacelab/datahub/sources/jhuapl/dmsp/ssusi/sdrdisk/__init__.py,sha256=-cMB37J
132
133
  geospacelab/datahub/sources/jhuapl/dmsp/ssusi/sdrdisk/loader.py,sha256=Xvn_DtTcREIMxvNxY_0a0Ery8xRTkBUD9285Q56a_nc,9519
133
134
  geospacelab/datahub/sources/jhuapl/dmsp/ssusi/sdrdisk/variable_config.py,sha256=iyhGq50CKQku6imnO8Psn_V5u03Ix1SCEr6ls1QDajo,4686
134
135
  geospacelab/datahub/sources/madrigal/__init__.py,sha256=AJPm5VJfzLNXIZQqGfHAy5b04qHXUEY0fo7qwja2i-o,1992
135
- geospacelab/datahub/sources/madrigal/downloader.py,sha256=V0HPqnU4ZQL2ucHrNvvpcj2qQqBOMr_r4kt8oFB8xWs,23622
136
+ geospacelab/datahub/sources/madrigal/downloader.py,sha256=T_vjqjA6D6cRIViQk-Ri30WCx-hLDw9gETQDOz7FfKs,24188
136
137
  geospacelab/datahub/sources/madrigal/madrigal_utilities.py,sha256=TuwGpZ-CwNOlLje7bTKonHzdK2V2UNRJR4B7ttIebfM,4261
137
138
  geospacelab/datahub/sources/madrigal/utilities.py,sha256=RybXYu3KXGKNjzljFaOBKu09bcbiutA1LFOo1xlXsRk,4747
138
139
  geospacelab/datahub/sources/madrigal/dmsp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -151,10 +152,10 @@ geospacelab/datahub/sources/madrigal/eiscat/examples/eiscat_hdf5_info.py,sha256=
151
152
  geospacelab/datahub/sources/madrigal/gnss/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
152
153
  geospacelab/datahub/sources/madrigal/gnss/tecmap/__init__.py,sha256=oEoetqS16QE31AY-1TInDBk0FwjaigLiT9DXQmSArmg,5958
153
154
  geospacelab/datahub/sources/madrigal/gnss/tecmap/downloader.py,sha256=9Z4zZm-xNS0jYHaD--Nc-HVnCzcn65NLMb3eZzBHWJk,4286
154
- geospacelab/datahub/sources/madrigal/gnss/tecmap/loader.py,sha256=JytJZfzUp2ijn0w1ADoA5-aRP1c674T4wz0mRSFSvPg,2895
155
- geospacelab/datahub/sources/madrigal/gnss/tecmap/variable_config.py,sha256=d-1XeMMZOyYFQAOYjPwIS2USBY9B8YjRfIww1TowVqE,1517
155
+ geospacelab/datahub/sources/madrigal/gnss/tecmap/loader.py,sha256=uAXQFDSnSJIUokpiXPKT5TlAcSbbaPM5pJpEVLA23Y4,2896
156
+ geospacelab/datahub/sources/madrigal/gnss/tecmap/variable_config.py,sha256=lLeJkcTqO0qJErkYlBq1kt0sDBGxOcNeNHRykq5ajPQ,1568
156
157
  geospacelab/datahub/sources/madrigal/isr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
- geospacelab/datahub/sources/madrigal/isr/eiscat/__init__.py,sha256=sxHcvgMy_Kjnl9TppU-jVw7yPoPtUZwxsieuCOBr2aY,20413
158
+ geospacelab/datahub/sources/madrigal/isr/eiscat/__init__.py,sha256=ObrGv-fsYWbEmXMQ6YftoEnydu6slmOE4uKKbBFn4x4,20416
158
159
  geospacelab/datahub/sources/madrigal/isr/eiscat/downloader.py,sha256=d-oUtCh8NHbkmEKfbe1oGb0-DzZsQH0CQXAedncMfTU,26144
159
160
  geospacelab/datahub/sources/madrigal/isr/eiscat/loader.py,sha256=vxip8UcPqA0S4H3aFSVoT8BgMi6J9Q3noaMIjbIuNy4,17953
160
161
  geospacelab/datahub/sources/madrigal/isr/eiscat/utilities.py,sha256=TImaJSVDyqvXezSCTAzMgAQ7CmrgD5YjyUiRl-K_dWk,2514
@@ -174,9 +175,9 @@ geospacelab/datahub/sources/madrigal/isr/millstonehill/vi/loader.py,sha256=kgV5c
174
175
  geospacelab/datahub/sources/madrigal/isr/millstonehill/vi/variable_config.py,sha256=tz650AGv4XedOEnB-DoN6VgIk6SNkEjnBOweACuXbwc,8951
175
176
  geospacelab/datahub/sources/madrigal/isr/pfisr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
177
  geospacelab/datahub/sources/madrigal/isr/pfisr/downloader.py,sha256=uCrJR-MJ_LJ2JyQ971VkiN56_Kl2C9y8RhdvG9B0vX8,6521
177
- geospacelab/datahub/sources/madrigal/isr/pfisr/fitted/__init__.py,sha256=o9SLs6t6MNHYuk2Q1S1XZjUbYSbbXDwr7icz-hnAF04,16215
178
+ geospacelab/datahub/sources/madrigal/isr/pfisr/fitted/__init__.py,sha256=nEh2wPazHlbTj4zku_iqMkae72GUEuEJ-MIrjNUXe9o,18033
178
179
  geospacelab/datahub/sources/madrigal/isr/pfisr/fitted/downloader.py,sha256=-2y1BRdQOmNjnXoWHIHh1PCRbeuKZh0Bn3LIMYw0yV4,2763
179
- geospacelab/datahub/sources/madrigal/isr/pfisr/fitted/loader.py,sha256=DbooK9iUSUDvSxTFjaSGhvxMCttbuiEgKChVJ82l3tY,8464
180
+ geospacelab/datahub/sources/madrigal/isr/pfisr/fitted/loader.py,sha256=EiVCsWidWYTVUg7UL1CWpHFyM-D_qJCAIkJZ-BtKO4c,9240
180
181
  geospacelab/datahub/sources/madrigal/isr/pfisr/fitted/variable_config.py,sha256=D4xdYFk--ll0ATqNtjoX9pwrsCryVV3TuPSbGR92drI,8167
181
182
  geospacelab/datahub/sources/madrigal/isr/pfisr/vi/__init__.py,sha256=_EKUmdJj0_GXj7eklmj5vxcIm4HgM0cblm9w_SZUN_c,12727
182
183
  geospacelab/datahub/sources/madrigal/isr/pfisr/vi/downloader.py,sha256=az1OxIa6-F4pvTAJGTqjuc6rfza1e3qyAiRf6sEje7c,2413
@@ -316,7 +317,7 @@ geospacelab/observatory/earth/geodesy.py,sha256=6ouOEgiqlTrDBHdPjhZ5p8BScfG8-NYr
316
317
  geospacelab/observatory/earth/sun_position.py,sha256=gy-zPPoX_92r6Cz7BT7JQyiNO_tte3osCQFkNq9lWe0,1434
317
318
  geospacelab/observatory/orbit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
318
319
  geospacelab/observatory/orbit/sc_orbit.py,sha256=FgTAFnoL6HRNlP8C9o2IDE0TpfGwaAP_3_2_8x4Euxo,15588
319
- geospacelab/observatory/orbit/utilities.py,sha256=vIyI0oNQX7YsqvIv4eqCEObnc63W1tRyzP-R5pncIeE,33440
320
+ geospacelab/observatory/orbit/utilities.py,sha256=ludGybXzPaeVJOS_XfO7M0TEnf-7MiRf_b6CYgGlLLI,34083
320
321
  geospacelab/observatory/site/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
321
322
  geospacelab/observatory/site/mixins.py,sha256=rhMJngBVgv0wR1m8e5cvnPxHZQnntbcJIgp4bEyTMFE,457
322
323
  geospacelab/quantity/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -343,12 +344,12 @@ geospacelab/visualization/tsviewer.py,sha256=qkPVhLuQYVLQKSvmQJYtYKql8GkcFfDXVlg
343
344
  geospacelab/visualization/map_proj/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
344
345
  geospacelab/visualization/map_proj/geopanel.py,sha256=FLNDyRyyQ2aeGPFxEY3JkKyZcSv6nOeH0AmeUExR_V8,8961
345
346
  geospacelab/visualization/map_proj/geoviewer.py,sha256=tVd9g3bEyZLBTbVYg2lVv4JoEtc1IeeKcZ5k-l5aHl0,1436
346
- geospacelab/visualization/mpl/__base__.py,sha256=Weuk-z14HdybI3gBnqrWEHnOevJkwSBFWoCZfBZ5tZo,31696
347
+ geospacelab/visualization/mpl/__base__.py,sha256=olAVyAntfL_RADs4rJgMjbzF2HX71PaJWzfuhOEE_ig,27284
347
348
  geospacelab/visualization/mpl/__init__.py,sha256=eNng7abvdzotwUltTYwFtlIeqUtCpI3d5yA4pr9kPKg,825
348
349
  geospacelab/visualization/mpl/_helpers.py,sha256=L-Cf_NXhe7FZE0fUNwQOOIZorLR1qEhj7bRkP4_jSAE,747
349
350
  geospacelab/visualization/mpl/axes.py,sha256=YcFkmOGWXNiOXWsMFxFPhn32UnbxmeSrluTp6OHVTpQ,328
350
351
  geospacelab/visualization/mpl/axis_ticks.py,sha256=vkS7eqSop5MNsxZ8l3EqdJEW7obF7mRXQ1D9lCZCYOY,15135
351
- geospacelab/visualization/mpl/colormaps.py,sha256=o4NfZPZK29Lefc4Jw-9OAN5VveqLuEEHKbP3JjUFSFI,17685
352
+ geospacelab/visualization/mpl/colormaps.py,sha256=b1JLmxuidx8Ky0DcWh8yDMgY6HcLZYlb2iUXv7CrZIg,17981
352
353
  geospacelab/visualization/mpl/dashboards.py,sha256=jk8W_j1SzCfUUYeTm5e7uA3xjlXpUIINdJPmBc53t-E,17232
353
354
  geospacelab/visualization/mpl/figure.py,sha256=stHgAG_qH-b87-rIXBfFnG9p3cyD2oDnx3MA6kDgX3A,3335
354
355
  geospacelab/visualization/mpl/panels.py,sha256=AmOWtG1HmFvMLC26E5m_x3dq_fXJgEZBAuDY02a18A8,35939
@@ -356,7 +357,7 @@ geospacelab/visualization/mpl/ts_viewer.py,sha256=4sOwXeWkdn5Z0BA6c-zxj4dAYxHP9t
356
357
  geospacelab/visualization/mpl/geomap/__base__.py,sha256=v3lVV5NVQMi0csNxq1ioORyizULqGN92M0DrlGjjBRQ,2940
357
358
  geospacelab/visualization/mpl/geomap/__init__.py,sha256=lsCyNIg5d5ZiMyRvE1zIuCnIhL47x8aYbOKZUX5E8fE,327
358
359
  geospacelab/visualization/mpl/geomap/geodashboards.py,sha256=oCt18JDXor4pg5qotzThu3Myg-uc_Gz6D3TnFwC0Nqs,2847
359
- geospacelab/visualization/mpl/geomap/geopanels.py,sha256=rbNi_9bEceRjKWO4GTYMvb0UM8dRxymSCbGsPB9AQ-4,52181
360
+ geospacelab/visualization/mpl/geomap/geopanels.py,sha256=WGvhDAKCZUkMiZkPKHwTSQ06DdPr5bXCnY38SnSHK0o,52993
360
361
  geospacelab/visualization/mpl_toolbox/__init__.py,sha256=AXKQoIwd3UCOMnmdIBXin2BH5t4UcZhmQRf8Ptr5o14,132
361
362
  geospacelab/visualization/mpl_toolbox/axes.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
362
363
  geospacelab/visualization/mpl_toolbox/axis_ticks.py,sha256=WV7bR_lgaNFvs59WektWVUgVZlVAuvQny6i_LJ39t2Y,11772
@@ -381,7 +382,7 @@ geospacelab/wrapper/geopack/geopack/t89.py,sha256=zDVNPrmtK1NnNHgohQEPqOOJDsm2Z-
381
382
  geospacelab/wrapper/geopack/geopack/t96.py,sha256=ktcoo1R7Z3NtkWHENuseu48ub4-JfQGqFV0ZOtd0zH8,65292
382
383
  geospacelab/wrapper/geopack/geopack/test_geopack1.md,sha256=dMUY0O1BgZsKpmJ6BLSQ80B6p6DZcB7OceFeyPOlFK0,15324
383
384
  geospacelab/wrapper/geopack/geopack/test_geopack1.py,sha256=qjLz6O3BAk3H58IpmxXyftwZTkh3vPGp49C-al4hjf0,6669
384
- geospacelab-0.10.3.dist-info/licenses/LICENSE,sha256=2yRlwLt4o5Z6OZAGcyvBj-zfFX1Uw7E6CzqODg7khqs,1515
385
+ geospacelab-0.11.0.dist-info/licenses/LICENSE,sha256=2yRlwLt4o5Z6OZAGcyvBj-zfFX1Uw7E6CzqODg7khqs,1515
385
386
  test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
386
387
  test/test_ampere.py,sha256=0-HZURubpv1mBK3bJ_qTqx39L1jezgRoU5neXMPYgZQ,2968
387
388
  test/test_dmsp_s1.py,sha256=5m_7mjdDGja8ovshNPV3LKW_6q6mIwT9XKqoyRiH79A,3588
@@ -391,7 +392,7 @@ test/test_omni.py,sha256=Zk1LZozPiY5V0aSRmK6GTQuB01hHn_j2j3Brm6Ea_po,1632
391
392
  test/test_superdarn.py,sha256=uP55muvXryPzNGHinWkiGv2PxvRs4f9M9h1WIBEBW7k,2846
392
393
  test/test_swarm.py,sha256=PDDE9nUshhQpXZbV_ZwcsjbMhI73fRaojTZv9rtRzZE,15568
393
394
  test/test_swarm_new.py,sha256=mzhMAx-M9W3Ue5noTyfBx4c3Vtc3b_ZUEvGgL9v8UE4,853
394
- geospacelab-0.10.3.dist-info/METADATA,sha256=aH0tV7-gTEu0KPkWQhwW_szFJ2Lw43gEbkSw31P7xYI,24238
395
- geospacelab-0.10.3.dist-info/WHEEL,sha256=wXxTzcEDnjrTwFYjLPcsW_7_XihufBwmpiBeiXNBGEA,91
396
- geospacelab-0.10.3.dist-info/top_level.txt,sha256=98eDwrSNgyQFAtSA06QMP71gw9BzgIj0uvkTudpGly4,12
397
- geospacelab-0.10.3.dist-info/RECORD,,
395
+ geospacelab-0.11.0.dist-info/METADATA,sha256=IM_FXqyGJexx3lJm9sbC7H_HSJxbkRinuHpiAa6NxBg,24238
396
+ geospacelab-0.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
397
+ geospacelab-0.11.0.dist-info/top_level.txt,sha256=98eDwrSNgyQFAtSA06QMP71gw9BzgIj0uvkTudpGly4,12
398
+ geospacelab-0.11.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.1.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5