From 6deba68be39788dc607edbbd35d261c7d8d26844 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 22 Oct 2020 19:02:15 +0100 Subject: [PATCH] Import cube.summary rework from #3688, but omitting ucube-specific parts. --- lib/iris/cube.py | 124 +++++++++++++++++++++-------------------------- 1 file changed, 54 insertions(+), 70 deletions(-) diff --git a/lib/iris/cube.py b/lib/iris/cube.py index 95adf24884..9589b6f69f 100644 --- a/lib/iris/cube.py +++ b/lib/iris/cube.py @@ -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:: @@ -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( @@ -2411,11 +2406,9 @@ 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())) @@ -2423,7 +2416,7 @@ def vector_summary( 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)" % ( @@ -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( @@ -2500,7 +2472,11 @@ 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 @@ -2508,7 +2484,11 @@ def vector_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 @@ -2516,7 +2496,11 @@ def vector_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 @@ -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) @@ -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)