<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def split_points(self, point_cloud):
 """Split a point cloud into two along this plane. Parameters point_cloud : :obj:`PointCloud` The PointCloud to divide in two. Returns ------- :obj:`tuple` of :obj:`PointCloud` Two new PointCloud objects. The first contains points above the plane, and the second contains points below the plane. Raises ------ ValueError If the input is not a PointCloud. """

        if not isinstance(point_cloud, PointCloud):
            raise ValueError('Can only split point clouds')
        # compute indices above and below
        above_plane = point_cloud._data - np.tile(self._x0.data, [1, point_cloud.num_points]).T.dot(self._n) > 0
        above_plane = point_cloud.z_coords > 0 & above_plane
        below_plane = point_cloud._data - np.tile(self._x0.data, [1, point_cloud.num_points]).T.dot(self._n) <= 0
        below_plane = point_cloud.z_coords > 0 & below_plane

        # split data
        above_data = point_cloud.data[:, above_plane]
        below_data = point_cloud.data[:, below_plane]
        return PointCloud(above_data, point_cloud.frame), PointCloud(below_data, point_cloud.frame)