Skip to content

Commit d008add

Browse files
committed
Convert string properties to char strings in masking
1 parent 5e7ea06 commit d008add

1 file changed

Lines changed: 58 additions & 63 deletions

File tree

  • conda_package/mpas_tools/mesh

conda_package/mpas_tools/mesh/mask.py

Lines changed: 58 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ def compute_mpas_region_masks(
100100

101101
# create shapely geometry for lon and lat
102102
points = [shapely.geometry.Point(x, y) for x, y in zip(lon, lat)]
103-
regionNames, masks, properties, nChar = _compute_region_masks(
103+
regionNames, masks, properties, nchar = _compute_region_masks(
104104
fcMask,
105105
points,
106106
logger,
@@ -128,22 +128,14 @@ def compute_mpas_region_masks(
128128
mask, dtype=numpy.int32
129129
)
130130

131-
if 'regionNames' not in dsMasks:
132-
# create a new data array for mask names
133-
dsMasks['regionNames'] = (
134-
('nRegions',),
135-
numpy.zeros((nRegions,), dtype=f'|S{nChar}'),
136-
)
137-
138-
for index in range(nRegions):
139-
dsMasks['regionNames'][index] = regionNames[index]
131+
properties['regionNames'] = regionNames
132+
_add_properties(
133+
ds=dsMasks,
134+
properties=properties,
135+
dim='nRegions',
136+
nchar=nchar,
137+
)
140138

141-
for propertyName in properties:
142-
if propertyName not in dsMasks:
143-
dsMasks[propertyName] = (
144-
('nRegions',),
145-
properties[propertyName],
146-
)
147139
if logger is not None:
148140
logger.info(' Done.')
149141

@@ -347,7 +339,7 @@ def compute_mpas_transect_masks(
347339
polygons, nPolygons, duplicatePolygons = _get_polygons(
348340
dsMesh, maskType
349341
)
350-
transectNames, masks, properties, nChar, shapes = (
342+
transectNames, masks, properties, nchar, shapes = (
351343
_compute_transect_masks(
352344
fcMask,
353345
polygons,
@@ -396,22 +388,14 @@ def compute_mpas_transect_masks(
396388
_compute_edge_sign(dsMesh, mask, shapes[index])
397389
)
398390

399-
if 'transectNames' not in dsMasks:
400-
# create a new data array for mask names
401-
dsMasks['transectNames'] = (
402-
('nTransects',),
403-
numpy.zeros((nTransects,), dtype=f'|S{nChar}'),
404-
)
405-
406-
for index in range(nTransects):
407-
dsMasks['transectNames'][index] = transectNames[index]
391+
properties['transectNames'] = transectNames
392+
_add_properties(
393+
ds=dsMasks,
394+
properties=properties,
395+
dim='nTransects',
396+
nchar=nchar,
397+
)
408398

409-
for propertyName in properties:
410-
if propertyName not in dsMasks:
411-
dsMasks[propertyName] = (
412-
('nTransects',),
413-
properties[propertyName],
414-
)
415399
if logger is not None:
416400
logger.info(' Done.')
417401

@@ -739,7 +723,7 @@ def compute_lon_lat_region_masks(
739723

740724
# create shapely geometry for lon and lat
741725
points = [shapely.geometry.Point(x, y) for x, y in zip(Lon, Lat)]
742-
regionNames, masks, properties, nChar = _compute_region_masks(
726+
regionNames, masks, properties, nchar = _compute_region_masks(
743727
fcMask,
744728
points,
745729
logger,
@@ -768,18 +752,14 @@ def compute_lon_lat_region_masks(
768752
mask.reshape(shape), dtype=numpy.int32
769753
)
770754

771-
# create a new data array for mask names
772-
dsMasks['regionNames'] = (
773-
('nRegions',),
774-
numpy.zeros((nRegions,), dtype=f'|S{nChar}'),
755+
properties['regionNames'] = regionNames
756+
_add_properties(
757+
ds=dsMasks,
758+
properties=properties,
759+
dim='nRegions',
760+
nchar=nchar,
775761
)
776762

777-
for index in range(nRegions):
778-
dsMasks['regionNames'][index] = regionNames[index]
779-
780-
for propertyName in properties:
781-
if propertyName not in dsMasks:
782-
dsMasks[propertyName] = (('nRegions',), properties[propertyName])
783763
if logger is not None:
784764
logger.info(' Done.')
785765

@@ -979,7 +959,7 @@ def compute_projection_grid_region_masks(
979959
points = [
980960
shapely.geometry.Point(x, y) for x, y in zip(lon.ravel(), lat.ravel())
981961
]
982-
regionNames, masks, properties, nChar = _compute_region_masks(
962+
regionNames, masks, properties, nchar = _compute_region_masks(
983963
fcMask,
984964
points,
985965
logger,
@@ -1005,18 +985,14 @@ def compute_projection_grid_region_masks(
1005985
mask.reshape((ny, nx)), dtype=numpy.int32
1006986
)
1007987

1008-
# create a new data array for mask names
1009-
dsMasks['regionNames'] = (
1010-
('nRegions',),
1011-
numpy.zeros((nRegions,), dtype=f'|S{nChar}'),
988+
properties['regionNames'] = regionNames
989+
_add_properties(
990+
ds=dsMasks,
991+
properties=properties,
992+
dim='nRegions',
993+
nchar=nchar,
1012994
)
1013995

1014-
for index in range(nRegions):
1015-
dsMasks['regionNames'][index] = regionNames[index]
1016-
1017-
for propertyName in properties:
1018-
if propertyName not in dsMasks:
1019-
dsMasks[propertyName] = (('nRegions',), properties[propertyName])
1020996
if logger is not None:
1021997
logger.info(' Done.')
1022998

@@ -1195,6 +1171,24 @@ def _compute_mask_from_shapes(
11951171
return mask
11961172

11971173

1174+
def _add_properties(ds, properties, dim, nchar):
1175+
"""
1176+
Add properties to the dataset from a dictionary of properties
1177+
"""
1178+
for name, prop_list in properties.items():
1179+
if name not in ds:
1180+
if isinstance(prop_list[0], str):
1181+
ds[name] = (
1182+
(dim,),
1183+
numpy.zeros((len(prop_list),), dtype=f'|S{nchar}'),
1184+
)
1185+
1186+
for index, value in enumerate(prop_list):
1187+
ds[name][index] = value
1188+
else:
1189+
ds[name] = ((dim,), properties[prop_list])
1190+
1191+
11981192
def _get_region_names_and_properties(fc):
11991193
regionNames = []
12001194
for feature in fc.features:
@@ -1214,16 +1208,19 @@ def _get_region_names_and_properties(fc):
12141208
propertyNames.add(propertyName)
12151209

12161210
properties = {}
1211+
nchar = 0
12171212
for propertyName in propertyNames:
12181213
properties[propertyName] = []
12191214
for feature in fc.features:
12201215
if propertyName in feature['properties']:
12211216
propertyVal = feature['properties'][propertyName]
12221217
properties[propertyName].append(propertyVal)
1218+
if isinstance(propertyVal, str):
1219+
nchar = max(nchar, len(propertyVal))
12231220
else:
12241221
properties[propertyName].append('')
12251222

1226-
return regionNames, properties
1223+
return regionNames, properties, nchar
12271224

12281225

12291226
def _compute_region_masks(
@@ -1234,11 +1231,10 @@ def _compute_region_masks(
12341231
a set of regions.
12351232
"""
12361233

1237-
regionNames, properties = _get_region_names_and_properties(fcMask)
1234+
regionNames, properties, nchar = _get_region_names_and_properties(fcMask)
12381235

12391236
masks = []
12401237

1241-
nChar = 0
12421238
for feature in fcMask.features:
12431239
name = feature['properties']['name']
12441240

@@ -1257,11 +1253,11 @@ def _compute_region_masks(
12571253
showProgress=showProgress,
12581254
)
12591255

1260-
nChar = max(nChar, len(name))
1256+
nchar = max(nchar, len(name))
12611257

12621258
masks.append(mask)
12631259

1264-
return regionNames, masks, properties, nChar
1260+
return regionNames, masks, properties, nchar
12651261

12661262

12671263
def _contains(shapes, points):
@@ -1359,12 +1355,11 @@ def _compute_transect_masks(
13591355
a set of transects.
13601356
"""
13611357

1362-
transectNames, properties = _get_region_names_and_properties(fcMask)
1358+
transectNames, properties, nchar = _get_region_names_and_properties(fcMask)
13631359

13641360
masks = []
13651361
shapes = []
13661362

1367-
nChar = 0
13681363
for feature in fcMask.features:
13691364
name = feature['properties']['name']
13701365

@@ -1410,12 +1405,12 @@ def _compute_transect_masks(
14101405
showProgress=showProgress,
14111406
)
14121407

1413-
nChar = max(nChar, len(name))
1408+
nchar = max(nchar, len(name))
14141409

14151410
masks.append(mask)
14161411
shapes.append(shape)
14171412

1418-
return transectNames, masks, properties, nChar, shapes
1413+
return transectNames, masks, properties, nchar, shapes
14191414

14201415

14211416
def _intersects(shape, polygons):

0 commit comments

Comments
 (0)