code: def bounds(self):
          
          bounds = [np.inf,-np.inf, np.inf,-np.inf, np.inf,-np.inf]
  
          def update_bounds(ax, nb, bounds):
              """internal helper to update bounds while keeping track"""
              if nb[2*ax] < bounds[2*ax]:
                  bounds[2*ax] = nb[2*ax]
              if nb[2*ax+1] > bounds[2*ax+1]:
                  bounds[2*ax+1] = nb[2*ax+1]
              return bounds
  
          # get bounds for each block and update
          for i in range(self.n_blocks):
              try:
                  bnds = self[i].GetBounds()
                  for a in range(3):
                      bounds = update_bounds(a, bnds, bounds)
              except AttributeError:
                  # Data object doesn't have bounds or is None
                  pass
  
          return bounds
docs: Finds min/max for bounds across blocks
  
          Returns:
              tuple(float):
                  length 6 tuple of floats containing min/max along each axis