Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
python
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Tom Rink
python
Commits
3cb5e650
Commit
3cb5e650
authored
1 year ago
by
tomrink
Browse files
Options
Downloads
Patches
Plain Diff
snapshot...
parent
1e771095
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
modules/util/util.py
+0
-698
0 additions, 698 deletions
modules/util/util.py
with
0 additions
and
698 deletions
modules/util/util.py
+
0
−
698
View file @
3cb5e650
...
...
@@ -15,7 +15,6 @@ from scipy.interpolate import RectBivariateSpline, interp2d
from
scipy.ndimage
import
gaussian_filter
from
scipy.signal
import
medfilt2d
from
cartopy.crs
import
Geostationary
,
Globe
import
geos_nav
LatLonTuple
=
namedtuple
(
'
LatLonTuple
'
,
[
'
lat
'
,
'
lon
'
])
...
...
@@ -667,19 +666,6 @@ def add_noise(data, noise_scale=0.01, seed=None, copy=True):
return
data
# Keep for reference. These pkl files are incompatible with latest version of Cartopy
# f = open(ancillary_path+'geos_crs_goes16_FD.pkl', 'rb')
# geos_goes16_fd = pickle.load(f)
# f.close()
#
# f = open(ancillary_path+'geos_crs_goes16_CONUS.pkl', 'rb')
# geos_goes16_conus = pickle.load(f)
# f.close()
#
# f = open(ancillary_path+'geos_crs_H08_FD.pkl', 'rb')
# geos_h08_fd = pickle.load(f)
# f.close()
crs_goes16_fd
=
Geostationary
(
central_longitude
=-
75.0
,
satellite_height
=
35786023.0
,
sweep_axis
=
'
x
'
,
globe
=
Globe
(
ellipse
=
None
,
semimajor_axis
=
6378137.0
,
semiminor_axis
=
6356752.31414
,
inverse_flattening
=
298.2572221
))
...
...
@@ -692,9 +678,6 @@ crs_h08_fd = Geostationary(central_longitude=140.7, satellite_height=35785.863,
globe
=
Globe
(
ellipse
=
None
,
semimajor_axis
=
6378.137
,
semiminor_axis
=
6356.7523
,
inverse_flattening
=
298.25702
))
geos_goes16_fd
=
geos_nav
.
GEOSNavigation
()
geos_goes16_conus
=
geos_nav
.
GEOSNavigation
(
CFAC
=
5.6E-05
,
LFAC
=-
5.6E-05
,
COFF
=-
0.101332
,
LOFF
=
0.128212
,
num_elems
=
2500
,
num_lines
=
1500
)
def
get_cartopy_crs
(
satellite
,
domain
):
if
satellite
==
'
GOES16
'
:
...
...
@@ -816,285 +799,6 @@ exmp_file_conus = '/Users/tomrink/data/OR_ABI-L1b-RadC-M6C14_G16_s20193140811215
# Full Disk
exmp_file_fd
=
'
/Users/tomrink/data/OR_ABI-L1b-RadF-M6C16_G16_s20212521800223_e20212521809542_c20212521809596.nc
'
# keep for reference
# if domain == 'CONUS':
# exmpl_ds = xr.open_dataset(exmp_file_conus)
# elif domain == 'FD':
# exmpl_ds = xr.open_dataset(exmp_file_fd)
# mdat = exmpl_ds.metpy.parse_cf('Rad')
# geos = mdat.metpy.cartopy_crs
# xlen = mdat.x.values.size
# ylen = mdat.y.values.size
# exmpl_ds.close()
# Taiwan domain:
# lon, lat = 120.955098, 23.834310
# elem, line = (1789, 1505)
# # UR from Taiwan
# lon, lat = 135.0, 35.0
# elem_ur, line_ur = (2499, 995)
taiwan_i0
=
1079
taiwan_j0
=
995
taiwan_lenx
=
1420
taiwan_leny
=
1020
# geos.transform_point(135.0, 35.0, ccrs.PlateCarree(), False)
# geos.transform_point(106.61, 13.97, ccrs.PlateCarree(), False)
taiwain_extent
=
[
-
3342
,
-
502
,
1470
,
3510
]
# GEOS coordinates, not line, elem
# ------------ This code will not be needed when we implement a Fully Convolutional CNN -----------------------------------
# Generate and return tiles of name_list parameters
def
make_for_full_domain_predict
(
h5f
,
name_list
=
None
,
satellite
=
'
GOES16
'
,
domain
=
'
FD
'
,
res_fac
=
1
,
data_extent
=
None
):
w_x
=
16
w_y
=
16
i_0
=
0
j_0
=
0
s_x
=
int
(
w_x
/
res_fac
)
s_y
=
int
(
w_y
/
res_fac
)
geos
,
xlen
,
xmin
,
xmax
,
ylen
,
ymin
,
ymax
=
get_cartopy_crs
(
satellite
,
domain
)
if
satellite
==
'
GOES16
'
:
if
data_extent
is
not
None
:
ll_pt_a
=
data_extent
[
0
]
ll_pt_b
=
data_extent
[
1
]
if
satellite
==
'
H08
'
:
xlen
=
taiwan_lenx
ylen
=
taiwan_leny
i_0
=
taiwan_i0
j_0
=
taiwan_j0
elif
satellite
==
'
H09
'
:
xlen
=
taiwan_lenx
ylen
=
taiwan_leny
i_0
=
taiwan_i0
j_0
=
taiwan_j0
grd_dct
=
{
name
:
None
for
name
in
name_list
}
cnt_a
=
0
for
ds_name
in
name_list
:
fill_value
,
fill_value_name
=
get_fill_attrs
(
ds_name
)
gvals
=
get_grid_values
(
h5f
,
ds_name
,
j_0
,
i_0
,
None
,
num_j
=
ylen
,
num_i
=
xlen
,
fill_value_name
=
fill_value_name
,
fill_value
=
fill_value
)
if
gvals
is
not
None
:
grd_dct
[
ds_name
]
=
gvals
cnt_a
+=
1
if
cnt_a
>
0
and
cnt_a
!=
len
(
name_list
):
raise
GenericException
(
'
weirdness
'
)
grd_dct_n
=
{
name
:
[]
for
name
in
name_list
}
n_x
=
int
(
xlen
/
s_x
)
-
1
n_y
=
int
(
ylen
/
s_y
)
-
1
r_x
=
xlen
-
(
n_x
*
s_x
)
x_d
=
0
if
r_x
>=
w_x
else
int
((
w_x
-
r_x
)
/
s_x
)
n_x
-=
x_d
r_y
=
ylen
-
(
n_y
*
s_y
)
y_d
=
0
if
r_y
>=
w_y
else
int
((
w_y
-
r_y
)
/
s_y
)
n_y
-=
y_d
ll
=
[
j_0
+
j
*
s_y
for
j
in
range
(
n_y
)]
cc
=
[
i_0
+
i
*
s_x
for
i
in
range
(
n_x
)]
for
ds_name
in
name_list
:
for
j
in
range
(
n_y
):
j_ul
=
j
*
s_y
j_ul_b
=
j_ul
+
w_y
for
i
in
range
(
n_x
):
i_ul
=
i
*
s_x
i_ul_b
=
i_ul
+
w_x
grd_dct_n
[
ds_name
].
append
(
grd_dct
[
ds_name
][
j_ul
:
j_ul_b
,
i_ul
:
i_ul_b
])
grd_dct
=
{
name
:
None
for
name
in
name_list
}
for
ds_name
in
name_list
:
grd_dct
[
ds_name
]
=
np
.
stack
(
grd_dct_n
[
ds_name
])
return
grd_dct
,
ll
,
cc
def
make_for_full_domain_predict_viirs_clavrx
(
h5f
,
name_list
=
None
,
res_fac
=
1
,
day_night
=
'
DAY
'
,
use_dnb
=
False
):
w_x
=
16
w_y
=
16
i_0
=
0
j_0
=
0
s_x
=
int
(
w_x
/
res_fac
)
s_y
=
int
(
w_y
/
res_fac
)
ylen
=
h5f
[
'
scan_lines_along_track_direction
'
].
shape
[
0
]
xlen
=
h5f
[
'
pixel_elements_along_scan_direction
'
].
shape
[
0
]
use_nl_comp
=
False
if
(
day_night
==
'
NIGHT
'
or
day_night
==
'
AUTO
'
)
and
use_dnb
:
use_nl_comp
=
True
grd_dct
=
{
name
:
None
for
name
in
name_list
}
cnt_a
=
0
for
ds_name
in
name_list
:
name
=
ds_name
if
use_nl_comp
:
if
ds_name
==
'
cld_reff_dcomp
'
:
name
=
'
cld_reff_nlcomp
'
elif
ds_name
==
'
cld_opd_dcomp
'
:
name
=
'
cld_opd_nlcomp
'
fill_value
,
fill_value_name
=
get_fill_attrs
(
name
)
gvals
=
get_grid_values
(
h5f
,
name
,
j_0
,
i_0
,
None
,
num_j
=
ylen
,
num_i
=
xlen
,
fill_value_name
=
fill_value_name
,
fill_value
=
fill_value
)
if
gvals
is
not
None
:
grd_dct
[
ds_name
]
=
gvals
cnt_a
+=
1
if
cnt_a
>
0
and
cnt_a
!=
len
(
name_list
):
raise
GenericException
(
'
weirdness
'
)
# TODO: need to investigate discrepencies with compute_lwc_iwc
# if use_nl_comp:
# cld_phase = get_grid_values(h5f, 'cloud_phase', j_0, i_0, None, num_j=ylen, num_i=xlen)
# cld_dz = get_grid_values(h5f, 'cld_geo_thick', j_0, i_0, None, num_j=ylen, num_i=xlen)
# reff = grd_dct['cld_reff_dcomp']
# opd = grd_dct['cld_opd_dcomp']
#
# lwc_nlcomp, iwc_nlcomp = compute_lwc_iwc(cld_phase, reff, opd, cld_dz)
# grd_dct['iwc_dcomp'] = iwc_nlcomp
# grd_dct['lwc_dcomp'] = lwc_nlcomp
grd_dct_n
=
{
name
:
[]
for
name
in
name_list
}
n_x
=
int
(
xlen
/
s_x
)
-
1
n_y
=
int
(
ylen
/
s_y
)
-
1
r_x
=
xlen
-
(
n_x
*
s_x
)
x_d
=
0
if
r_x
>=
w_x
else
int
((
w_x
-
r_x
)
/
s_x
)
n_x
-=
x_d
r_y
=
ylen
-
(
n_y
*
s_y
)
y_d
=
0
if
r_y
>=
w_y
else
int
((
w_y
-
r_y
)
/
s_y
)
n_y
-=
y_d
ll
=
[
j_0
+
j
*
s_y
for
j
in
range
(
n_y
)]
cc
=
[
i_0
+
i
*
s_x
for
i
in
range
(
n_x
)]
for
ds_name
in
name_list
:
for
j
in
range
(
n_y
):
j_ul
=
j
*
s_y
j_ul_b
=
j_ul
+
w_y
for
i
in
range
(
n_x
):
i_ul
=
i
*
s_x
i_ul_b
=
i_ul
+
w_x
grd_dct_n
[
ds_name
].
append
(
grd_dct
[
ds_name
][
j_ul
:
j_ul_b
,
i_ul
:
i_ul_b
])
grd_dct
=
{
name
:
None
for
name
in
name_list
}
for
ds_name
in
name_list
:
grd_dct
[
ds_name
]
=
np
.
stack
(
grd_dct_n
[
ds_name
])
lats
=
get_grid_values
(
h5f
,
'
latitude
'
,
j_0
,
i_0
,
None
,
num_j
=
ylen
,
num_i
=
xlen
)
lons
=
get_grid_values
(
h5f
,
'
longitude
'
,
j_0
,
i_0
,
None
,
num_j
=
ylen
,
num_i
=
xlen
)
ll_2d
,
cc_2d
=
np
.
meshgrid
(
ll
,
cc
,
indexing
=
'
ij
'
)
lats
=
lats
[
ll_2d
,
cc_2d
]
lons
=
lons
[
ll_2d
,
cc_2d
]
return
grd_dct
,
ll
,
cc
,
lats
,
lons
def
make_for_full_domain_predict2
(
h5f
,
satellite
=
'
GOES16
'
,
domain
=
'
FD
'
,
res_fac
=
1
):
w_x
=
16
w_y
=
16
i_0
=
0
j_0
=
0
s_x
=
int
(
w_x
/
res_fac
)
s_y
=
int
(
w_y
/
res_fac
)
geos
,
xlen
,
xmin
,
xmax
,
ylen
,
ymin
,
ymax
=
get_cartopy_crs
(
satellite
,
domain
)
if
satellite
==
'
H08
'
:
xlen
=
taiwan_lenx
ylen
=
taiwan_leny
i_0
=
taiwan_i0
j_0
=
taiwan_j0
n_x
=
int
(
xlen
/
s_x
)
n_y
=
int
(
ylen
/
s_y
)
solzen
=
get_grid_values
(
h5f
,
'
solar_zenith_angle
'
,
j_0
,
i_0
,
None
,
num_j
=
ylen
,
num_i
=
xlen
)
satzen
=
get_grid_values
(
h5f
,
'
sensor_zenith_angle
'
,
j_0
,
i_0
,
None
,
num_j
=
ylen
,
num_i
=
xlen
)
solzen
=
solzen
[
0
:(
n_y
-
1
)
*
s_y
:
s_y
,
0
:(
n_x
-
1
)
*
s_x
:
s_x
]
satzen
=
satzen
[
0
:(
n_y
-
1
)
*
s_y
:
s_y
,
0
:(
n_x
-
1
)
*
s_x
:
s_x
]
return
solzen
,
satzen
# -------------------------------------------------------------------------------------------
def
prepare_evaluate
(
h5f
,
name_list
,
satellite
=
'
GOES16
'
,
domain
=
'
FD
'
,
res_fac
=
1
,
offset
=
0
):
w_x
=
16
w_y
=
16
i_0
=
0
j_0
=
0
s_x
=
w_x
//
res_fac
s_y
=
w_y
//
res_fac
geos
,
xlen
,
xmin
,
xmax
,
ylen
,
ymin
,
ymax
=
get_cartopy_crs
(
satellite
,
domain
)
if
satellite
==
'
H08
'
:
xlen
=
taiwan_lenx
ylen
=
taiwan_leny
i_0
=
taiwan_i0
j_0
=
taiwan_j0
elif
satellite
==
'
H09
'
:
xlen
=
taiwan_lenx
ylen
=
taiwan_leny
i_0
=
taiwan_i0
j_0
=
taiwan_j0
n_x
=
(
xlen
//
s_x
)
n_y
=
(
ylen
//
s_y
)
# r_x = xlen - (n_x * s_x)
# x_d = 0 if r_x >= w_x else int((w_x - r_x)/s_x)
# n_x -= x_d
#
# r_y = ylen - (n_y * s_y)
# y_d = 0 if r_y >= w_y else int((w_y - r_y)/s_y)
# n_y -= y_d
ll
=
[(
offset
+
j_0
)
+
j
*
s_y
for
j
in
range
(
n_y
)]
cc
=
[(
offset
+
i_0
)
+
i
*
s_x
for
i
in
range
(
n_x
)]
grd_dct_n
=
{
name
:
[]
for
name
in
name_list
}
cnt_a
=
0
for
ds_name
in
name_list
:
fill_value
,
fill_value_name
=
get_fill_attrs
(
ds_name
)
gvals
=
get_grid_values
(
h5f
,
ds_name
,
j_0
,
i_0
,
None
,
num_j
=
ylen
,
num_i
=
xlen
,
fill_value_name
=
fill_value_name
,
fill_value
=
fill_value
)
gvals
=
np
.
expand_dims
(
gvals
,
axis
=
0
)
if
gvals
is
not
None
:
grd_dct_n
[
ds_name
]
=
gvals
cnt_a
+=
1
if
cnt_a
>
0
and
cnt_a
!=
len
(
name_list
):
raise
GenericException
(
'
weirdness
'
)
solzen
=
get_grid_values
(
h5f
,
'
solar_zenith_angle
'
,
j_0
,
i_0
,
None
,
num_j
=
ylen
,
num_i
=
xlen
)
satzen
=
get_grid_values
(
h5f
,
'
sensor_zenith_angle
'
,
j_0
,
i_0
,
None
,
num_j
=
ylen
,
num_i
=
xlen
)
solzen
=
solzen
[
0
:
n_y
*
s_y
:
s_y
,
0
:
n_x
*
s_x
:
s_x
]
satzen
=
satzen
[
0
:
n_y
*
s_y
:
s_y
,
0
:
n_x
*
s_x
:
s_x
]
return
grd_dct_n
,
solzen
,
satzen
,
ll
,
cc
flt_level_ranges_str
=
{
k
:
None
for
k
in
range
(
5
)}
flt_level_ranges_str
[
0
]
=
'
0_2000
'
flt_level_ranges_str
[
1
]
=
'
2000_4000
'
flt_level_ranges_str
[
2
]
=
'
4000_6000
'
flt_level_ranges_str
[
3
]
=
'
6000_8000
'
flt_level_ranges_str
[
4
]
=
'
8000_15000
'
# flt_level_ranges_str = {k: None for k in range(1)}
# flt_level_ranges_str[0] = 'column'
def
get_cf_nav_parameters
(
satellite
=
'
GOES16
'
,
domain
=
'
FD
'
):
param_dct
=
None
...
...
@@ -1152,371 +856,6 @@ def get_cf_nav_parameters(satellite='GOES16', domain='FD'):
return
param_dct
def
write_icing_file
(
clvrx_str_time
,
output_dir
,
preds_dct
,
probs_dct
,
x
,
y
,
lons
,
lats
,
elems
,
lines
):
outfile_name
=
output_dir
+
'
icing_prediction_
'
+
clvrx_str_time
+
'
.h5
'
h5f_out
=
h5py
.
File
(
outfile_name
,
'
w
'
)
dim_0_name
=
'
x
'
dim_1_name
=
'
y
'
prob_s
=
[]
pred_s
=
[]
flt_lvls
=
list
(
preds_dct
.
keys
())
for
flvl
in
flt_lvls
:
preds
=
preds_dct
[
flvl
]
pred_s
.
append
(
preds
)
icing_pred_ds
=
h5f_out
.
create_dataset
(
'
icing_prediction_level_
'
+
flt_level_ranges_str
[
flvl
],
data
=
preds
,
dtype
=
'
i2
'
)
icing_pred_ds
.
attrs
.
create
(
'
coordinates
'
,
data
=
'
y x
'
)
icing_pred_ds
.
attrs
.
create
(
'
grid_mapping
'
,
data
=
'
Projection
'
)
icing_pred_ds
.
attrs
.
create
(
'
missing
'
,
data
=-
1
)
icing_pred_ds
.
dims
[
0
].
label
=
dim_0_name
icing_pred_ds
.
dims
[
1
].
label
=
dim_1_name
for
flvl
in
flt_lvls
:
probs
=
probs_dct
[
flvl
]
prob_s
.
append
(
probs
)
icing_prob_ds
=
h5f_out
.
create_dataset
(
'
icing_probability_level_
'
+
flt_level_ranges_str
[
flvl
],
data
=
probs
,
dtype
=
'
f4
'
)
icing_prob_ds
.
attrs
.
create
(
'
coordinates
'
,
data
=
'
y x
'
)
icing_prob_ds
.
attrs
.
create
(
'
grid_mapping
'
,
data
=
'
Projection
'
)
icing_prob_ds
.
attrs
.
create
(
'
missing
'
,
data
=-
1.0
)
icing_prob_ds
.
dims
[
0
].
label
=
dim_0_name
icing_prob_ds
.
dims
[
1
].
label
=
dim_1_name
prob_s
=
np
.
stack
(
prob_s
,
axis
=-
1
)
max_prob
=
np
.
max
(
prob_s
,
axis
=
2
)
icing_prob_ds
=
h5f_out
.
create_dataset
(
'
max_icing_probability_column
'
,
data
=
max_prob
,
dtype
=
'
f4
'
)
icing_prob_ds
.
attrs
.
create
(
'
coordinates
'
,
data
=
'
y x
'
)
icing_prob_ds
.
attrs
.
create
(
'
grid_mapping
'
,
data
=
'
Projection
'
)
icing_prob_ds
.
attrs
.
create
(
'
missing
'
,
data
=-
1.0
)
icing_prob_ds
.
dims
[
0
].
label
=
dim_0_name
icing_prob_ds
.
dims
[
1
].
label
=
dim_1_name
max_lvl
=
np
.
argmax
(
prob_s
,
axis
=
2
)
icing_pred_ds
=
h5f_out
.
create_dataset
(
'
max_icing_probability_level
'
,
data
=
max_lvl
,
dtype
=
'
i2
'
)
icing_pred_ds
.
attrs
.
create
(
'
coordinates
'
,
data
=
'
y x
'
)
icing_pred_ds
.
attrs
.
create
(
'
grid_mapping
'
,
data
=
'
Projection
'
)
icing_pred_ds
.
attrs
.
create
(
'
missing
'
,
data
=-
1
)
icing_pred_ds
.
dims
[
0
].
label
=
dim_0_name
icing_pred_ds
.
dims
[
1
].
label
=
dim_1_name
lon_ds
=
h5f_out
.
create_dataset
(
'
longitude
'
,
data
=
lons
,
dtype
=
'
f4
'
)
lon_ds
.
attrs
.
create
(
'
units
'
,
data
=
'
degrees_east
'
)
lon_ds
.
attrs
.
create
(
'
long_name
'
,
data
=
'
icing prediction longitude
'
)
lon_ds
.
dims
[
0
].
label
=
dim_0_name
lon_ds
.
dims
[
1
].
label
=
dim_1_name
lat_ds
=
h5f_out
.
create_dataset
(
'
latitude
'
,
data
=
lats
,
dtype
=
'
f4
'
)
lat_ds
.
attrs
.
create
(
'
units
'
,
data
=
'
degrees_north
'
)
lat_ds
.
attrs
.
create
(
'
long_name
'
,
data
=
'
icing prediction latitude
'
)
lat_ds
.
dims
[
0
].
label
=
dim_0_name
lat_ds
.
dims
[
1
].
label
=
dim_1_name
proj_ds
=
h5f_out
.
create_dataset
(
'
Projection
'
,
data
=
0
,
dtype
=
'
b
'
)
proj_ds
.
attrs
.
create
(
'
long_name
'
,
data
=
'
Himawari Imagery Projection
'
)
proj_ds
.
attrs
.
create
(
'
grid_mapping_name
'
,
data
=
'
geostationary
'
)
proj_ds
.
attrs
.
create
(
'
sweep_angle_axis
'
,
data
=
'
y
'
)
proj_ds
.
attrs
.
create
(
'
units
'
,
data
=
'
rad
'
)
proj_ds
.
attrs
.
create
(
'
semi_major_axis
'
,
data
=
6378.137
)
proj_ds
.
attrs
.
create
(
'
semi_minor_axis
'
,
data
=
6356.7523
)
proj_ds
.
attrs
.
create
(
'
inverse_flattening
'
,
data
=
298.257
)
proj_ds
.
attrs
.
create
(
'
perspective_point_height
'
,
data
=
35785.863
)
proj_ds
.
attrs
.
create
(
'
latitude_of_projection_origin
'
,
data
=
0.0
)
proj_ds
.
attrs
.
create
(
'
longitude_of_projection_origin
'
,
data
=
140.7
)
proj_ds
.
attrs
.
create
(
'
CFAC
'
,
data
=
20466275
)
proj_ds
.
attrs
.
create
(
'
LFAC
'
,
data
=
20466275
)
proj_ds
.
attrs
.
create
(
'
COFF
'
,
data
=
2750.5
)
proj_ds
.
attrs
.
create
(
'
LOFF
'
,
data
=
2750.5
)
if
x
is
not
None
:
x_ds
=
h5f_out
.
create_dataset
(
'
x
'
,
data
=
x
,
dtype
=
'
f8
'
)
x_ds
.
dims
[
0
].
label
=
dim_0_name
x_ds
.
attrs
.
create
(
'
units
'
,
data
=
'
rad
'
)
x_ds
.
attrs
.
create
(
'
standard_name
'
,
data
=
'
projection_x_coordinate
'
)
x_ds
.
attrs
.
create
(
'
long_name
'
,
data
=
'
GOES PUG W-E fixed grid viewing angle
'
)
x_ds
.
attrs
.
create
(
'
scale_factor
'
,
data
=
5.58879902955962e-05
)
x_ds
.
attrs
.
create
(
'
add_offset
'
,
data
=-
0.153719917308037
)
x_ds
.
attrs
.
create
(
'
CFAC
'
,
data
=
20466275
)
x_ds
.
attrs
.
create
(
'
COFF
'
,
data
=
2750.5
)
y_ds
=
h5f_out
.
create_dataset
(
'
y
'
,
data
=
y
,
dtype
=
'
f8
'
)
y_ds
.
dims
[
0
].
label
=
dim_1_name
y_ds
.
attrs
.
create
(
'
units
'
,
data
=
'
rad
'
)
y_ds
.
attrs
.
create
(
'
standard_name
'
,
data
=
'
projection_y_coordinate
'
)
y_ds
.
attrs
.
create
(
'
long_name
'
,
data
=
'
GOES PUG S-N fixed grid viewing angle
'
)
y_ds
.
attrs
.
create
(
'
scale_factor
'
,
data
=-
5.58879902955962e-05
)
y_ds
.
attrs
.
create
(
'
add_offset
'
,
data
=
0.153719917308037
)
y_ds
.
attrs
.
create
(
'
LFAC
'
,
data
=
20466275
)
y_ds
.
attrs
.
create
(
'
LOFF
'
,
data
=
2750.5
)
if
elems
is
not
None
:
elem_ds
=
h5f_out
.
create_dataset
(
'
elems
'
,
data
=
elems
,
dtype
=
'
i2
'
)
elem_ds
.
dims
[
0
].
label
=
dim_0_name
line_ds
=
h5f_out
.
create_dataset
(
'
lines
'
,
data
=
lines
,
dtype
=
'
i2
'
)
line_ds
.
dims
[
0
].
label
=
dim_1_name
pass
h5f_out
.
close
()
def
write_icing_file_nc4
(
clvrx_str_time
,
output_dir
,
preds_dct
,
probs_dct
,
x
,
y
,
lons
,
lats
,
elems
,
lines
,
satellite
=
'
GOES16
'
,
domain
=
'
CONUS
'
,
has_time
=
False
,
use_nan
=
False
,
prob_thresh
=
0.5
,
bt_10_4
=
None
):
outfile_name
=
output_dir
+
'
icing_prediction_
'
+
clvrx_str_time
+
'
.nc
'
rootgrp
=
Dataset
(
outfile_name
,
'
w
'
,
format
=
'
NETCDF4
'
)
rootgrp
.
setncattr
(
'
Conventions
'
,
'
CF-1.7
'
)
dim_0_name
=
'
x
'
dim_1_name
=
'
y
'
time_dim_name
=
'
time
'
geo_coords
=
'
time y x
'
dim_0
=
rootgrp
.
createDimension
(
dim_0_name
,
size
=
x
.
shape
[
0
])
dim_1
=
rootgrp
.
createDimension
(
dim_1_name
,
size
=
y
.
shape
[
0
])
dim_time
=
rootgrp
.
createDimension
(
time_dim_name
,
size
=
1
)
tvar
=
rootgrp
.
createVariable
(
'
time
'
,
'
f8
'
,
time_dim_name
)
tvar
[
0
]
=
get_timestamp
(
clvrx_str_time
)
tvar
.
units
=
'
seconds since 1970-01-01 00:00:00
'
if
not
has_time
:
var_dim_list
=
[
dim_1_name
,
dim_0_name
]
else
:
var_dim_list
=
[
time_dim_name
,
dim_1_name
,
dim_0_name
]
prob_s
=
[]
flt_lvls
=
list
(
preds_dct
.
keys
())
for
flvl
in
flt_lvls
:
preds
=
preds_dct
[
flvl
]
icing_pred_ds
=
rootgrp
.
createVariable
(
'
icing_prediction_level_
'
+
flt_level_ranges_str
[
flvl
],
'
i2
'
,
var_dim_list
)
icing_pred_ds
.
setncattr
(
'
coordinates
'
,
geo_coords
)
icing_pred_ds
.
setncattr
(
'
grid_mapping
'
,
'
Projection
'
)
icing_pred_ds
.
setncattr
(
'
missing
'
,
-
1
)
if
has_time
:
preds
=
preds
.
reshape
((
1
,
y
.
shape
[
0
],
x
.
shape
[
0
]))
icing_pred_ds
[:,]
=
preds
for
flvl
in
flt_lvls
:
probs
=
probs_dct
[
flvl
]
prob_s
.
append
(
probs
)
icing_prob_ds
=
rootgrp
.
createVariable
(
'
icing_probability_level_
'
+
flt_level_ranges_str
[
flvl
],
'
f4
'
,
var_dim_list
)
icing_prob_ds
.
setncattr
(
'
coordinates
'
,
geo_coords
)
icing_prob_ds
.
setncattr
(
'
grid_mapping
'
,
'
Projection
'
)
if
not
use_nan
:
icing_prob_ds
.
setncattr
(
'
missing
'
,
-
1.0
)
else
:
icing_prob_ds
.
setncattr
(
'
missing
'
,
np
.
nan
)
if
has_time
:
probs
=
probs
.
reshape
((
1
,
y
.
shape
[
0
],
x
.
shape
[
0
]))
if
use_nan
:
probs
=
np
.
where
(
probs
<
prob_thresh
,
np
.
nan
,
probs
)
icing_prob_ds
[:,]
=
probs
prob_s
=
np
.
stack
(
prob_s
,
axis
=-
1
)
max_prob
=
np
.
max
(
prob_s
,
axis
=
2
)
if
use_nan
:
max_prob
=
np
.
where
(
max_prob
<
prob_thresh
,
np
.
nan
,
max_prob
)
if
has_time
:
max_prob
=
max_prob
.
reshape
(
1
,
y
.
shape
[
0
],
x
.
shape
[
0
])
icing_prob_ds
=
rootgrp
.
createVariable
(
'
max_icing_probability_column
'
,
'
f4
'
,
var_dim_list
)
icing_prob_ds
.
setncattr
(
'
coordinates
'
,
geo_coords
)
icing_prob_ds
.
setncattr
(
'
grid_mapping
'
,
'
Projection
'
)
if
not
use_nan
:
icing_prob_ds
.
setncattr
(
'
missing
'
,
-
1.0
)
else
:
icing_prob_ds
.
setncattr
(
'
missing
'
,
np
.
nan
)
icing_prob_ds
[:,]
=
max_prob
prob_s
=
np
.
where
(
prob_s
<
prob_thresh
,
-
1.0
,
prob_s
)
max_lvl
=
np
.
where
(
np
.
all
(
prob_s
==
-
1
,
axis
=
2
),
-
1
,
np
.
argmax
(
prob_s
,
axis
=
2
))
if
use_nan
:
max_lvl
=
np
.
where
(
max_lvl
==
-
1
,
np
.
nan
,
max_lvl
)
if
has_time
:
max_lvl
=
max_lvl
.
reshape
((
1
,
y
.
shape
[
0
],
x
.
shape
[
0
]))
icing_pred_ds
=
rootgrp
.
createVariable
(
'
max_icing_probability_level
'
,
'
i2
'
,
var_dim_list
)
icing_pred_ds
.
setncattr
(
'
coordinates
'
,
geo_coords
)
icing_pred_ds
.
setncattr
(
'
grid_mapping
'
,
'
Projection
'
)
icing_pred_ds
.
setncattr
(
'
missing
'
,
-
1
)
icing_pred_ds
[:,]
=
max_lvl
if
bt_10_4
is
not
None
:
bt_ds
=
rootgrp
.
createVariable
(
'
bt_10_4
'
,
'
f4
'
,
var_dim_list
)
bt_ds
.
setncattr
(
'
coordinates
'
,
geo_coords
)
bt_ds
.
setncattr
(
'
grid_mapping
'
,
'
Projection
'
)
bt_ds
[:,]
=
bt_10_4
lon_ds
=
rootgrp
.
createVariable
(
'
longitude
'
,
'
f4
'
,
[
dim_1_name
,
dim_0_name
])
lon_ds
.
units
=
'
degrees_east
'
lon_ds
[:,]
=
lons
lat_ds
=
rootgrp
.
createVariable
(
'
latitude
'
,
'
f4
'
,
[
dim_1_name
,
dim_0_name
])
lat_ds
.
units
=
'
degrees_north
'
lat_ds
[:,]
=
lats
cf_nav_dct
=
get_cf_nav_parameters
(
satellite
,
domain
)
if
satellite
==
'
H08
'
:
long_name
=
'
Himawari Imagery Projection
'
elif
satellite
==
'
H09
'
:
long_name
=
'
Himawari Imagery Projection
'
elif
satellite
==
'
GOES16
'
:
long_name
=
'
GOES-16/17 Imagery Projection
'
proj_ds
=
rootgrp
.
createVariable
(
'
Projection
'
,
'
b
'
)
proj_ds
.
setncattr
(
'
long_name
'
,
long_name
)
proj_ds
.
setncattr
(
'
grid_mapping_name
'
,
'
geostationary
'
)
proj_ds
.
setncattr
(
'
sweep_angle_axis
'
,
cf_nav_dct
[
'
sweep_angle_axis
'
])
proj_ds
.
setncattr
(
'
semi_major_axis
'
,
cf_nav_dct
[
'
semi_major_axis
'
])
proj_ds
.
setncattr
(
'
semi_minor_axis
'
,
cf_nav_dct
[
'
semi_minor_axis
'
])
proj_ds
.
setncattr
(
'
inverse_flattening
'
,
cf_nav_dct
[
'
inverse_flattening
'
])
proj_ds
.
setncattr
(
'
perspective_point_height
'
,
cf_nav_dct
[
'
perspective_point_height
'
])
proj_ds
.
setncattr
(
'
latitude_of_projection_origin
'
,
cf_nav_dct
[
'
latitude_of_projection_origin
'
])
proj_ds
.
setncattr
(
'
longitude_of_projection_origin
'
,
cf_nav_dct
[
'
longitude_of_projection_origin
'
])
if
x
is
not
None
:
x_ds
=
rootgrp
.
createVariable
(
dim_0_name
,
'
f8
'
,
[
dim_0_name
])
x_ds
.
units
=
'
rad
'
x_ds
.
setncattr
(
'
axis
'
,
'
X
'
)
x_ds
.
setncattr
(
'
standard_name
'
,
'
projection_x_coordinate
'
)
x_ds
.
setncattr
(
'
long_name
'
,
'
fixed grid viewing angle
'
)
x_ds
.
setncattr
(
'
scale_factor
'
,
cf_nav_dct
[
'
x_scale_factor
'
])
x_ds
.
setncattr
(
'
add_offset
'
,
cf_nav_dct
[
'
x_add_offset
'
])
x_ds
[:]
=
x
y_ds
=
rootgrp
.
createVariable
(
dim_1_name
,
'
f8
'
,
[
dim_1_name
])
y_ds
.
units
=
'
rad
'
y_ds
.
setncattr
(
'
axis
'
,
'
Y
'
)
y_ds
.
setncattr
(
'
standard_name
'
,
'
projection_y_coordinate
'
)
y_ds
.
setncattr
(
'
long_name
'
,
'
fixed grid viewing angle
'
)
y_ds
.
setncattr
(
'
scale_factor
'
,
cf_nav_dct
[
'
y_scale_factor
'
])
y_ds
.
setncattr
(
'
add_offset
'
,
cf_nav_dct
[
'
y_add_offset
'
])
y_ds
[:]
=
y
if
elems
is
not
None
:
elem_ds
=
rootgrp
.
createVariable
(
'
elems
'
,
'
i2
'
,
[
dim_0_name
])
elem_ds
[:]
=
elems
line_ds
=
rootgrp
.
createVariable
(
'
lines
'
,
'
i2
'
,
[
dim_1_name
])
line_ds
[:]
=
lines
pass
rootgrp
.
close
()
def
write_icing_file_nc4_viirs
(
clvrx_str_time
,
output_dir
,
preds_dct
,
probs_dct
,
lons
,
lats
,
has_time
=
False
,
use_nan
=
False
,
prob_thresh
=
0.5
,
bt_10_4
=
None
):
outfile_name
=
output_dir
+
'
icing_prediction_
'
+
clvrx_str_time
+
'
.nc
'
rootgrp
=
Dataset
(
outfile_name
,
'
w
'
,
format
=
'
NETCDF4
'
)
rootgrp
.
setncattr
(
'
Conventions
'
,
'
CF-1.7
'
)
dim_0_name
=
'
x
'
dim_1_name
=
'
y
'
time_dim_name
=
'
time
'
geo_coords
=
'
longitude latitude
'
dim_1_len
,
dim_0_len
=
lons
.
shape
dim_0
=
rootgrp
.
createDimension
(
dim_0_name
,
size
=
dim_0_len
)
dim_1
=
rootgrp
.
createDimension
(
dim_1_name
,
size
=
dim_1_len
)
dim_time
=
rootgrp
.
createDimension
(
time_dim_name
,
size
=
1
)
tvar
=
rootgrp
.
createVariable
(
'
time
'
,
'
f8
'
,
time_dim_name
)
tvar
[
0
]
=
get_timestamp
(
clvrx_str_time
)
tvar
.
units
=
'
seconds since 1970-01-01 00:00:00
'
if
not
has_time
:
var_dim_list
=
[
dim_1_name
,
dim_0_name
]
else
:
var_dim_list
=
[
time_dim_name
,
dim_1_name
,
dim_0_name
]
prob_s
=
[]
flt_lvls
=
list
(
preds_dct
.
keys
())
for
flvl
in
flt_lvls
:
preds
=
preds_dct
[
flvl
]
icing_pred_ds
=
rootgrp
.
createVariable
(
'
icing_prediction_level_
'
+
flt_level_ranges_str
[
flvl
],
'
i2
'
,
var_dim_list
)
icing_pred_ds
.
setncattr
(
'
coordinates
'
,
geo_coords
)
icing_pred_ds
.
setncattr
(
'
grid_mapping
'
,
'
Projection
'
)
icing_pred_ds
.
setncattr
(
'
missing
'
,
-
1
)
if
has_time
:
preds
=
preds
.
reshape
((
1
,
dim_1_len
,
dim_0_len
))
icing_pred_ds
[:,]
=
preds
for
flvl
in
flt_lvls
:
probs
=
probs_dct
[
flvl
]
prob_s
.
append
(
probs
)
icing_prob_ds
=
rootgrp
.
createVariable
(
'
icing_probability_level_
'
+
flt_level_ranges_str
[
flvl
],
'
f4
'
,
var_dim_list
)
icing_prob_ds
.
setncattr
(
'
coordinates
'
,
geo_coords
)
icing_prob_ds
.
setncattr
(
'
grid_mapping
'
,
'
Projection
'
)
if
not
use_nan
:
icing_prob_ds
.
setncattr
(
'
missing
'
,
-
1.0
)
else
:
icing_prob_ds
.
setncattr
(
'
missing
'
,
np
.
nan
)
if
has_time
:
probs
=
probs
.
reshape
((
1
,
dim_1_len
,
dim_0_len
))
if
use_nan
:
probs
=
np
.
where
(
probs
<
prob_thresh
,
np
.
nan
,
probs
)
icing_prob_ds
[:,]
=
probs
prob_s
=
np
.
stack
(
prob_s
,
axis
=-
1
)
max_prob
=
np
.
max
(
prob_s
,
axis
=
2
)
if
use_nan
:
max_prob
=
np
.
where
(
max_prob
<
prob_thresh
,
np
.
nan
,
max_prob
)
if
has_time
:
max_prob
=
max_prob
.
reshape
(
1
,
dim_1_len
,
dim_0_len
)
icing_prob_ds
=
rootgrp
.
createVariable
(
'
max_icing_probability_column
'
,
'
f4
'
,
var_dim_list
)
icing_prob_ds
.
setncattr
(
'
coordinates
'
,
geo_coords
)
icing_prob_ds
.
setncattr
(
'
grid_mapping
'
,
'
Projection
'
)
if
not
use_nan
:
icing_prob_ds
.
setncattr
(
'
missing
'
,
-
1.0
)
else
:
icing_prob_ds
.
setncattr
(
'
missing
'
,
np
.
nan
)
icing_prob_ds
[:,]
=
max_prob
prob_s
=
np
.
where
(
prob_s
<
prob_thresh
,
-
1.0
,
prob_s
)
max_lvl
=
np
.
where
(
np
.
all
(
prob_s
==
-
1
,
axis
=
2
),
-
1
,
np
.
argmax
(
prob_s
,
axis
=
2
))
if
use_nan
:
max_lvl
=
np
.
where
(
max_lvl
==
-
1
,
np
.
nan
,
max_lvl
)
if
has_time
:
max_lvl
=
max_lvl
.
reshape
((
1
,
dim_1_len
,
dim_0_len
))
icing_pred_ds
=
rootgrp
.
createVariable
(
'
max_icing_probability_level
'
,
'
i2
'
,
var_dim_list
)
icing_pred_ds
.
setncattr
(
'
coordinates
'
,
geo_coords
)
icing_pred_ds
.
setncattr
(
'
grid_mapping
'
,
'
Projection
'
)
icing_pred_ds
.
setncattr
(
'
missing
'
,
-
1
)
icing_pred_ds
[:,]
=
max_lvl
if
bt_10_4
is
not
None
:
bt_ds
=
rootgrp
.
createVariable
(
'
bt_10_4
'
,
'
f4
'
,
var_dim_list
)
bt_ds
.
setncattr
(
'
coordinates
'
,
geo_coords
)
bt_ds
.
setncattr
(
'
grid_mapping
'
,
'
Projection
'
)
bt_ds
[:,]
=
bt_10_4
lon_ds
=
rootgrp
.
createVariable
(
'
longitude
'
,
'
f4
'
,
[
dim_1_name
,
dim_0_name
])
lon_ds
.
units
=
'
degrees_east
'
lon_ds
[:,]
=
lons
lat_ds
=
rootgrp
.
createVariable
(
'
latitude
'
,
'
f4
'
,
[
dim_1_name
,
dim_0_name
])
lat_ds
.
units
=
'
degrees_north
'
lat_ds
[:,]
=
lats
proj_ds
=
rootgrp
.
createVariable
(
'
Projection
'
,
'
b
'
)
proj_ds
.
setncattr
(
'
grid_mapping_name
'
,
'
latitude_longitude
'
)
rootgrp
.
close
()
def
write_cld_prods_file_nc4
(
clvrx_str_time
,
outfile_name
,
cloud_fraction
,
cloud_frac_opd
,
x
,
y
,
elems
,
lines
,
satellite
=
'
GOES16
'
,
domain
=
'
CONUS
'
,
has_time
=
False
):
...
...
@@ -1680,40 +1019,3 @@ def median_filter_2d(z, kernel_size=3):
def
median_filter_2d_single
(
z
,
kernel_size
=
3
):
return
medfilt2d
(
z
,
kernel_size
=
kernel_size
)
def
get_training_parameters
(
day_night
=
'
DAY
'
,
l1b_andor_l2
=
'
both
'
,
satellite
=
'
GOES16
'
,
use_dnb
=
False
):
if
day_night
==
'
DAY
'
:
train_params_l2
=
[
'
cld_height_acha
'
,
'
cld_geo_thick
'
,
'
cld_temp_acha
'
,
'
cld_press_acha
'
,
'
supercooled_cloud_fraction
'
,
'
cld_emiss_acha
'
,
'
conv_cloud_fraction
'
,
'
cld_reff_dcomp
'
,
'
cld_opd_dcomp
'
,
'
iwc_dcomp
'
,
'
lwc_dcomp
'
]
if
satellite
==
'
GOES16
'
:
train_params_l1b
=
[
'
temp_10_4um_nom
'
,
'
temp_11_0um_nom
'
,
'
temp_12_0um_nom
'
,
'
temp_13_3um_nom
'
,
'
temp_3_75um_nom
'
,
'
temp_6_2um_nom
'
,
'
temp_6_7um_nom
'
,
'
temp_7_3um_nom
'
,
'
temp_8_5um_nom
'
,
'
temp_9_7um_nom
'
,
'
refl_0_47um_nom
'
,
'
refl_0_65um_nom
'
,
'
refl_0_86um_nom
'
,
'
refl_1_38um_nom
'
,
'
refl_1_60um_nom
'
]
# 'refl_2_10um_nom']
elif
satellite
==
'
H08
'
:
train_params_l1b
=
[
'
temp_10_4um_nom
'
,
'
temp_12_0um_nom
'
,
'
temp_8_5um_nom
'
,
'
temp_3_75um_nom
'
,
'
refl_2_10um_nom
'
,
'
refl_1_60um_nom
'
,
'
refl_0_86um_nom
'
,
'
refl_0_47um_nom
'
]
else
:
train_params_l2
=
[
'
cld_height_acha
'
,
'
cld_geo_thick
'
,
'
cld_temp_acha
'
,
'
cld_press_acha
'
,
'
supercooled_cloud_fraction
'
,
'
cld_emiss_acha
'
,
'
conv_cloud_fraction
'
,
'
cld_reff_acha
'
,
'
cld_opd_acha
'
]
if
use_dnb
is
True
:
train_params_l2
=
[
'
cld_height_acha
'
,
'
cld_geo_thick
'
,
'
cld_temp_acha
'
,
'
cld_press_acha
'
,
'
supercooled_cloud_fraction
'
,
'
cld_emiss_acha
'
,
'
conv_cloud_fraction
'
,
'
cld_reff_dcomp
'
,
'
cld_opd_dcomp
'
,
'
iwc_dcomp
'
,
'
lwc_dcomp
'
]
if
satellite
==
'
GOES16
'
:
train_params_l1b
=
[
'
temp_10_4um_nom
'
,
'
temp_11_0um_nom
'
,
'
temp_12_0um_nom
'
,
'
temp_13_3um_nom
'
,
'
temp_3_75um_nom
'
,
'
temp_6_2um_nom
'
,
'
temp_6_7um_nom
'
,
'
temp_7_3um_nom
'
,
'
temp_8_5um_nom
'
,
'
temp_9_7um_nom
'
]
elif
satellite
==
'
H08
'
:
train_params_l1b
=
[
'
temp_10_4um_nom
'
,
'
temp_12_0um_nom
'
,
'
temp_8_5um_nom
'
,
'
temp_3_75um_nom
'
]
if
l1b_andor_l2
==
'
both
'
:
train_params
=
train_params_l1b
+
train_params_l2
elif
l1b_andor_l2
==
'
l1b
'
:
train_params
=
train_params_l1b
elif
l1b_andor_l2
==
'
l2
'
:
train_params
=
train_params_l2
return
train_params
,
train_params_l1b
,
train_params_l2
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment