code: def survey_basis(self, keys=None, alias=None, step=None):
          
          if keys is None:
              keys = [k for k, v in self.data.items() if isinstance(v, Curve)]
          else:
              keys = utils.flatten_list(keys)
  
          starts, stops, steps = [], [], []
          for k in keys:
              d = self.get_curve(k, alias=alias)
              if keys and (d is None):
                  continue
              try:
                  starts.append(d.basis[0])
                  stops.append(d.basis[-1])
                  steps.append(d.basis[1] - d.basis[0])
              except Exception as e:
                  pass
          if starts and stops and steps:
              step = step or min(steps)
              return np.arange(min(starts), max(stops)+1e-9, step)
          else:
              return None
docs: Look at the basis of all the curves in ``well.data`` and return a
          basis with the minimum start, maximum depth, and minimum step.
  
          Args:
              keys (list): List of strings: the keys of the data items to
                  survey, if not all of them.
              alias (dict): a dictionary mapping mnemonics to lists of mnemonics.
              step (float): a new step, if you want to change it.            
  
          Returns:
              ndarray. The most complete common basis.