Skip to content

Commit

Permalink
Import cube.summary rework from SciTools#3688, but omitting ucube-spe…
Browse files Browse the repository at this point in the history
…cific parts.
  • Loading branch information
pp-mo committed Oct 26, 2020
1 parent 6bbf0f5 commit 6deba68
Showing 1 changed file with 54 additions and 70 deletions.
124 changes: 54 additions & 70 deletions lib/iris/cube.py
Original file line number Diff line number Diff line change
Expand Up @@ -2376,17 +2376,17 @@ def summary(self, shorten=False, name_padding=35):
)

#
# Generate textual summary of cube vector coordinates.
# Generate textual summary of cube vector coordinates, cell measures, ancillary variables and ugrid_mesh.
#
def vector_summary(
vector_coords,
vector_items,
dim_function,
cube_header,
max_line_offset,
cell_measures=None,
ancillary_variables=None,
add_extra_lines=False,
):
"""
Generates a list of suitably aligned strings containing coord
Generates a list of suitably aligned strings containing item
names and dimensions indicated by one or more 'x' symbols.
.. note::
Expand All @@ -2395,12 +2395,7 @@ def vector_summary(
returned with the list of strings.
"""
if cell_measures is None:
cell_measures = []
if ancillary_variables is None:
ancillary_variables = []
vector_summary = []
vectors = []

# Identify offsets for each dimension text marker.
alignment = np.array(
Expand All @@ -2411,19 +2406,17 @@ def vector_summary(
]
)

# Generate basic textual summary for each vector coordinate
# Generate basic textual summary for each vector item
# - WITHOUT dimension markers.
for dim_meta in (
vector_coords + cell_measures + ancillary_variables
):
for dim_meta in vector_items:
vector_summary.append(
"%*s%s"
% (indent, " ", iris.util.clip_string(dim_meta.name()))
)
min_alignment = min(alignment)

# Determine whether the cube header requires realignment
# due to one or more longer vector coordinate summaries.
# due to one or more longer vector item summaries.
if max_line_offset >= min_alignment:
delta = max_line_offset - min_alignment + 5
cube_header = "%-*s (%s)" % (
Expand All @@ -2433,59 +2426,38 @@ def vector_summary(
)
alignment += delta

if vector_coords:
# Generate full textual summary for each vector coordinate
# - WITH dimension markers.
for index, coord in enumerate(vector_coords):
dims = self.coord_dims(coord)

for dim in range(len(self.shape)):
width = alignment[dim] - len(vector_summary[index])
char = "x" if dim in dims else "-"
line = "{pad:{width}}{char}".format(
pad=" ", width=width, char=char
)
vector_summary[index] += line
vectors = vectors + vector_coords
if cell_measures:
# Generate full textual summary for each vector cell
# measure - WITH dimension markers.
for index, cell_measure in enumerate(cell_measures):
dims = self.cell_measure_dims(cell_measure)

for dim in range(len(self.shape)):
width = alignment[dim] - len(vector_summary[index])
char = "x" if dim in dims else "-"
line = "{pad:{width}}{char}".format(
pad=" ", width=width, char=char
)
vector_summary[index] += line
vectors = vectors + cell_measures
if ancillary_variables:
# Generate full textual summary for each vector ancillary
# variable - WITH dimension markers.
for index, av in enumerate(ancillary_variables):
dims = self.ancillary_variable_dims(av)

for dim in range(len(self.shape)):
width = alignment[dim] - len(vector_summary[index])
char = "x" if dim in dims else "-"
line = "{pad:{width}}{char}".format(
pad=" ", width=width, char=char
)
vector_summary[index] += line
vectors = vectors + ancillary_variables
# Interleave any extra lines that are needed to distinguish
# the coordinates.
vector_summary = self._summary_extra(
vectors, vector_summary, extra_indent
)
# Generate full textual summary for each vector item
# - WITH dimension markers.
for index, coord in enumerate(vector_items):
dims = dim_function(coord)

for dim in range(len(self.shape)):
width = alignment[dim] - len(vector_summary[index])
char = "x" if dim in dims else "-"
line = "{pad:{width}}{char}".format(
pad=" ", width=width, char=char
)
vector_summary[index] += line

if add_extra_lines:
# Interleave any extra lines that are needed to distinguish
# the coordinates.
# TODO: This should also be done for cell measures and
# ancillary variables.
vector_summary = self._summary_extra(
vector_items, vector_summary, extra_indent
)

return vector_summary, cube_header

# Calculate the maximum line offset.
max_line_offset = 0
for coord in all_coords:
dimension_metadata_to_check = (
list(all_coords)
+ vector_cell_measures
+ vector_ancillary_variables
)
for coord in dimension_metadata_to_check:
max_line_offset = max(
max_line_offset,
len(
Expand All @@ -2500,23 +2472,35 @@ def vector_summary(

if vector_dim_coords:
dim_coord_summary, cube_header = vector_summary(
vector_dim_coords, cube_header, max_line_offset
vector_dim_coords,
self.coord_dims,
cube_header,
max_line_offset,
add_extra_lines=True,
)
summary += "\n Dimension coordinates:\n" + "\n".join(
dim_coord_summary
)

if vector_aux_coords:
aux_coord_summary, cube_header = vector_summary(
vector_aux_coords, cube_header, max_line_offset
vector_aux_coords,
self.coord_dims,
cube_header,
max_line_offset,
add_extra_lines=True,
)
summary += "\n Auxiliary coordinates:\n" + "\n".join(
aux_coord_summary
)

if vector_derived_coords:
derived_coord_summary, cube_header = vector_summary(
vector_derived_coords, cube_header, max_line_offset
vector_derived_coords,
self.coord_dims,
cube_header,
max_line_offset,
add_extra_lines=True,
)
summary += "\n Derived coordinates:\n" + "\n".join(
derived_coord_summary
Expand All @@ -2527,10 +2511,10 @@ def vector_summary(
#
if vector_cell_measures:
cell_measure_summary, cube_header = vector_summary(
[],
vector_cell_measures,
self.cell_measure_dims,
cube_header,
max_line_offset,
cell_measures=vector_cell_measures,
)
summary += "\n Cell measures:\n"
summary += "\n".join(cell_measure_summary)
Expand All @@ -2540,10 +2524,10 @@ def vector_summary(
#
if vector_ancillary_variables:
ancillary_variable_summary, cube_header = vector_summary(
[],
vector_ancillary_variables,
self.ancillary_variable_dims,
cube_header,
max_line_offset,
ancillary_variables=vector_ancillary_variables,
)
summary += "\n Ancillary variables:\n"
summary += "\n".join(ancillary_variable_summary)
Expand Down

0 comments on commit 6deba68

Please sign in to comment.