def to_string_customize(self, data, annotation_placement='right', block_separator='', annotation_enclose_characters=('[', ']'), individual_annotation_enclose=False, individual_annotation_enclose_characters=('[', ']'), individual_annotation_separator=''):
    '\n\n        :rtype: str\n        :param data: a dictionary where the key is the index position of the amino acid residue and the value is a\n        iterable where containing the item needed to be included into the sequence.\n        :param annotation_placement: whether the information should be included on the right of the left of the residue\n        :param block_separator: separator between each block of annotation information to be included\n        :param annotation_enclose_characters: enclosure characters for each annotation cluster\n        :param individual_annotation_enclose: whether or not each individual annotation should be enclosed\n        :param individual_annotation_enclose_characters: enclosure characters for each individual annotation\n        :param individual_annotation_separator: separator for each individual annotation\n        :return:\n        '
    assert (annotation_placement in {'left', 'right'})
    seq = []
    for i in range(len(self.seq)):
        seq.append(self.seq[i].value)
        if (i in data):
            annotation = []
            if individual_annotation_enclose:
                for v in data[i]:
                    annotation.append('{}{}{}'.format(individual_annotation_enclose_characters[0], v, individual_annotation_enclose_characters[1]))
            else:
                annotation = data[i]
            if (type(annotation) == str):
                ann = annotation
            else:
                ann = individual_annotation_separator.join(annotation)
            if annotation_enclose_characters:
                seq.append('{}{}{}'.format(annotation_enclose_characters[0], ann, annotation_enclose_characters[1]))
            else:
                seq.append(individual_annotation_separator.join(ann))
    return block_separator.join(seq)
:rtype: str
:param data: a dictionary where the key is the index position of the amino acid residue and the value is a
iterable where containing the item needed to be included into the sequence.
:param annotation_placement: whether the information should be included on the right of the left of the residue
:param block_separator: separator between each block of annotation information to be included
:param annotation_enclose_characters: enclosure characters for each annotation cluster
:param individual_annotation_enclose: whether or not each individual annotation should be enclosed
:param individual_annotation_enclose_characters: enclosure characters for each individual annotation
:param individual_annotation_separator: separator for each individual annotation
:return:
def to_string_customize(self, data, annotation_placement='right', block_separator=, annotation_enclose_characters=('[', ']'), individual_annotation_enclose=False, individual_annotation_enclose_characters=('[', ']'), individual_annotation_separator=):
    '\n\n        :rtype: str\n        :param data: a dictionary where the key is the index position of the amino acid residue and the value is a\n        iterable where containing the item needed to be included into the sequence.\n        :param annotation_placement: whether the information should be included on the right of the left of the residue\n        :param block_separator: separator between each block of annotation information to be included\n        :param annotation_enclose_characters: enclosure characters for each annotation cluster\n        :param individual_annotation_enclose: whether or not each individual annotation should be enclosed\n        :param individual_annotation_enclose_characters: enclosure characters for each individual annotation\n        :param individual_annotation_separator: separator for each individual annotation\n        :return:\n        '
    assert (annotation_placement in {'left', 'right'})
    seq = []
    for i in range(len(self.seq)):
        seq.append(self.seq[i].value)
        if (i in data):
            annotation = []
            if individual_annotation_enclose:
                for v in data[i]:
                    annotation.append('{}{}{}'.format(individual_annotation_enclose_characters[0], v, individual_annotation_enclose_characters[1]))
            else:
                annotation = data[i]
            if (type(annotation) == str):
                ann = annotation
            else:
                ann = individual_annotation_separator.join(annotation)
            if annotation_enclose_characters:
                seq.append('{}{}{}'.format(annotation_enclose_characters[0], ann, annotation_enclose_characters[1]))
            else:
                seq.append(individual_annotation_separator.join(ann))
    return block_separator.join(seq)