code: def head(self, display=True, html=None):
          
          # Generate the output
          if html:
              fmt = ""
              # HTML version
              fmt += "\n"
              fmt += "<table>\n"
              fmt += "<tr><th>{}</th><th>Information</th></tr>\n".format(type(self).__name__)
              row = "<tr><td>{}</td><td>{}</td></tr>\n"
              # now make a call on the object to get its attributes as a list of len 2 tuples
              for attr in self._get_attrs():
                  try:
                      fmt += row.format(attr[0], attr[2].format(*attr[1]))
                  except:
                      fmt += row.format(attr[0], attr[2].format(attr[1]))
              fmt += row.format('N Scalars', self.n_scalars)
              fmt += "</table>\n"
              fmt += "\n"
              if display:
                  from IPython.display import display, HTML
                  display(HTML(fmt))
                  return
              return fmt
          # Otherwise return a string that is Python console friendly
          fmt = "{} ({})\n".format(type(self).__name__, hex(id(self)))
          # now make a call on the object to get its attributes as a list of len 2 tuples
          row = "  {}:\t{}\n"
          for attr in self._get_attrs():
              try:
                  fmt += row.format(attr[0], attr[2].format(*attr[1]))
              except:
                  fmt += row.format(attr[0], attr[2].format(attr[1]))
          fmt += row.format('N Scalars', self.n_scalars)
          return fmt
docs: Return the header stats of this dataset. If in IPython, this will
          be formatted to HTML. Otherwise returns a console friendly string