Determines if this plate is a sub-plate of another plate -
        i.e. has the same meta data but a restricted set of values

        :param other: The other plate
        :return: True if this plate is a sub-plate of the other plate

def is_sub_plate(self, other):
        """
        Determines if this plate is a sub-plate of another plate -
        i.e. has the same meta data but a restricted set of values

        :param other: The other plate
        :return: True if this plate is a sub-plate of the other plate
        """
        if all(v in set(other.values) for v in self.values):
            return True
        if all(any(all(spv in m for spv in v) for m in map(set, other.values)) for v in self.values):
            return True
        if other in self.ancestor_plates:  # added by MK, but still not sure whether all cases are covered
            return True
        return False