def create_node(self, stream_name, channel, plates):
        """
        Create a node in the graph. Note: assumes that the streams already exist

        :param stream_name: The name of the stream
        :param channel: The channel where this stream lives
        :param plates: The plates. The stream meta-data will be auto-generated from these
        :return: The streams associated with this node
        """
        streams = {}

        plate_values = Plate.get_overlapping_values(plates)

        if plates:
            if not plate_values:
                raise NodeDefinitionError("No overlapping plate values found")
            for pv in plate_values:
                # Construct stream id
                stream_id = StreamId(name=stream_name, meta_data=pv)

                # Now try to locate the stream and add it (raises StreamNotFoundError if not found)
                streams[pv] = channel.get_or_create_stream(stream_id=stream_id)

        else:
            streams[None] = channel.get_or_create_stream(stream_id=StreamId(name=stream_name))

        if not streams:
            raise NodeDefinitionError("No streams created for node with id {}".format(stream_name))

        node = Node(channel, stream_name, streams, plates)
        self._add_node(node)
        return node
Create a node in the graph. Note: assumes that the streams already exist

        :param stream_name: The name of the stream
        :param channel: The channel where this stream lives
        :param plates: The plates. The stream meta-data will be auto-generated from these
        :return: The streams associated with this node