<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def survey_basis(self, keys=None, alias=None, step=None):
 """ 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. """

        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