code: def data_axis_order(self):
          
          if not self.header:
              return (0, 1, 2)
          try:
              mapc = self.header['mapc']['value']
              mapr = self.header['mapr']['value']
              maps = self.header['maps']['value']
          except KeyError:
              return (0, 1, 2)
          else:
              axis_order = tuple(int(m) - 1 for m in [mapc, mapr, maps])
              if (sorted(axis_order) != [0, 1, 2]):
                  # Ignore invalid entries in the header, e.g. 0, 0, 0.
                  # Some MRC files out there are like that.
                  warnings.warn('invalid axis mapping {}, using (0, 1, 2)'
                                ''.format(tuple(m + 1 for m in axis_order)),
                                RuntimeWarning)
                  axis_order = (0, 1, 2)
              return axis_order
docs: Permutation of ``(0, 1, 2)``.
  
          The value is determined from the ``'mapc', 'mapr', 'maps'``
          header entries and determines the order of the axes of a
          dataset (`data_shape`) when stored in a file
          (`data_storage_shape`)::
  
              data_shape[i] == data_storage_shape[data_axis_order[i]]
  
          For example, if ``data_axis_order == (2, 0, 1)`` then the
          data axis 2 comes first in storage, axis 0 comes second and
          axis 1 comes last.
  
          If no header is available, (i.e., before it has been initialized),
          or one of the header entries ``'mapc', 'mapr', 'maps'`` is missing,
          the identity permutation ``(0, 1, 2)`` is returned.
  
          See Also
          --------
          data_shape
          data_storage_shape