def get_splitting_stream(self, input_plate_value):
        if not self.splitting_node:
            return None
        if len(self.splitting_node.plates) == 0:
            return self.splitting_node.streams[None]
        if len(self.splitting_node.plates) > 1:
            raise ValueError("Splitting node cannot live on multiple plates for factor {}"
                             .format(self.factor_id))
        if not self.input_plate and len(self.splitting_node.plates) > 0:
            raise ValueError("Splitting node cannot live on a plate if there is no input plate")
        splitting_plate = self.splitting_node.plates[0]
        if self.input_plate == splitting_plate:
            splitting_stream = self.splitting_node.streams[input_plate_value]
        else:
            if splitting_plate.is_child(self.input_plate):
                ppv = filter(lambda x: all(p in input_plate_value for p in x), self.input_plate.parent.values)
                if len(ppv) != 1:
                    raise ValueError("Parent plate value not found")
                splitting_stream = self.splitting_node.streams[ppv[0]]
            elif splitting_plate.is_descendant(self.input_plate):
                ppv = filter(lambda x: all(p in input_plate_value for p in x), self.input_plate.parent.values)
                if len(ppv) != 1:
                    raise ValueError("Parent plate value not found")
                splitting_stream = self.splitting_node.streams[ppv]
            else:
                raise IncompatiblePlatesError(
                    "Splitting node plate {} does not match input plate {} for factor {}"
                    .format(self.input_plate, self.splitting_node.plates[0], self.factor_id))
        return splitting_stream