def parse_cctop_full(infile):
    """Parse a CCTOP XML results file and return a list of the consensus TM domains in the format::

            [(1, inside_outside_or_tm),
             (2, inside_outside_or_tm),
             ...]

    Where the first value of a tuple is the sequence residue number, and the second is the predicted location with the
    values 'I' (inside), 'O' (outside), or 'M' (membrane).

    Args:
        infile (str): Path to CCTOP XML file

    Returns:
        list: List of tuples in the format described above

    """
    parser = etree.XMLParser(ns_clean=True)
    with open(infile, 'r') as f:
        tree = etree.fromstring(f.read(), parser)

    all_info = []

    if tree.find('Topology') is not None:
        for r in tree.find('Topology').findall('Region'):
            region_start = int(r.attrib['from'])
            region_end = int(r.attrib['to'])
            region = r.attrib['loc']
            for i in range(region_start, region_end + 1):
                all_info.append((i, region))

    return all_info
Parse a CCTOP XML results file and return a list of the consensus TM domains in the format::

            [(1, inside_outside_or_tm),
             (2, inside_outside_or_tm),
             ...]

    Where the first value of a tuple is the sequence residue number, and the second is the predicted location with the
    values 'I' (inside), 'O' (outside), or 'M' (membrane).

    Args:
        infile (str): Path to CCTOP XML file

    Returns:
        list: List of tuples in the format described above