Must be overridden by deriving classes, must create the stream according to the tool and return its unique
        identifier stream_id

def create_stream(self, stream_id, sandbox=None):
        """
        Must be overridden by deriving classes, must create the stream according to the tool and return its unique
        identifier stream_id
        """
        if stream_id in self.streams:
            raise StreamAlreadyExistsError("Stream with id '{}' already exists".format(stream_id))

        if sandbox is not None:
            raise ValueError("Cannot use sandboxes with memory streams")

        stream = Stream(channel=self, stream_id=stream_id, calculated_intervals=None, sandbox=None)
        
        self.streams[stream_id] = stream
        self.data[stream_id] = StreamInstanceCollection()
        return stream