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.
- geospacelab/__init__.py +1 -1
- geospacelab/config/__init__.py +3 -2
- geospacelab/config/__mpl__.py +98 -0
- geospacelab/config/_preferences.py +3 -0
- geospacelab/datahub/__variable_base__.py +2 -2
- geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/__init__.py +11 -2
- geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/downloader.py +2 -2
- geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/loader.py +84 -83
- geospacelab/datahub/sources/cdaweb/omni/loader.py +2 -0
- geospacelab/datahub/sources/madrigal/downloader.py +15 -5
- geospacelab/datahub/sources/madrigal/gnss/tecmap/loader.py +1 -0
- geospacelab/datahub/sources/madrigal/gnss/tecmap/variable_config.py +3 -2
- geospacelab/datahub/sources/madrigal/isr/eiscat/__init__.py +6 -5
- geospacelab/datahub/sources/madrigal/isr/pfisr/fitted/__init__.py +48 -10
- geospacelab/datahub/sources/madrigal/isr/pfisr/fitted/loader.py +22 -3
- geospacelab/observatory/orbit/utilities.py +14 -3
- geospacelab/visualization/mpl/__base__.py +25 -113
- geospacelab/visualization/mpl/colormaps.py +10 -0
- geospacelab/visualization/mpl/geomap/geopanels.py +22 -2
- {geospacelab-0.10.3.dist-info → geospacelab-0.11.0.dist-info}/METADATA +1 -1
- {geospacelab-0.10.3.dist-info → geospacelab-0.11.0.dist-info}/RECORD +24 -23
- {geospacelab-0.10.3.dist-info → geospacelab-0.11.0.dist-info}/WHEEL +1 -1
- {geospacelab-0.10.3.dist-info → geospacelab-0.11.0.dist-info}/licenses/LICENSE +0 -0
- {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.
|
|
9
|
+
__version__ = "0.11.0"
|
|
10
10
|
__maintainer__ = "Lei Cai"
|
|
11
11
|
__email__ = "lei.cai@oulu.fi"
|
|
12
12
|
__status__ = "Developing"
|
geospacelab/config/__init__.py
CHANGED
|
@@ -9,9 +9,8 @@ __email__ = "lei.cai@oulu.fi"
|
|
|
9
9
|
__docformat__ = "reStructureText"
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
from geospacelab.config._preferences import
|
|
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)
|
|
@@ -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
|
-
|
|
115
|
-
|
|
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
|
|
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
|
+
|
|
@@ -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
|
|
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
|
|
|
@@ -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 = '
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
583
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
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,7 @@
|
|
|
1
|
-
geospacelab/__init__.py,sha256=
|
|
2
|
-
geospacelab/config/__init__.py,sha256
|
|
3
|
-
geospacelab/config/
|
|
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=
|
|
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=
|
|
29
|
-
geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/downloader.py,sha256=
|
|
30
|
-
geospacelab/datahub/sources/cdaweb/dmsp/ssusi/edr_aur/loader.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
155
|
-
geospacelab/datahub/sources/madrigal/gnss/tecmap/variable_config.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
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.
|
|
395
|
-
geospacelab-0.
|
|
396
|
-
geospacelab-0.
|
|
397
|
-
geospacelab-0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|