returns a dict mapping ott_id to list of elements referring to leafs mapped
        to that ott_id. They keys will be ott_ids and None (for unmapped tips). The values
        are lists of tuples. Each tuple represents a different leaf and contains:
            (integer_for_of_is_examplar: -1 if the node is flagged by ^ot:isTaxonExemplar. 0 otherwise
            the leaf's node_id,
            the node object
            the otu object for the node
            )

def group_and_sort_leaves_by_ott_id(self):
        """returns a dict mapping ott_id to list of elements referring to leafs mapped
        to that ott_id. They keys will be ott_ids and None (for unmapped tips). The values
        are lists of tuples. Each tuple represents a different leaf and contains:
            (integer_for_of_is_examplar: -1 if the node is flagged by ^ot:isTaxonExemplar. 0 otherwise
            the leaf's node_id,
            the node object
            the otu object for the node
            )
        """
        ott_id_to_sortable_list = defaultdict(list)
        for node_id in self._edge_by_target.keys():
            node_obj = self._node_by_id[node_id]
            if node_id in self._edge_by_source:
                continue
            otu_id = node_obj['@otu']
            otu_obj = self.otus[otu_id]
            ott_id = otu_obj.get('^ot:ottId')
            is_exemplar = node_obj.get('^ot:isTaxonExemplar', False)
            int_is_exemplar = 0
            if is_exemplar:
                int_is_exemplar = -1  # to sort to the front of the list
            sortable_el = (int_is_exemplar, node_id, node_obj, otu_obj)
            ott_id_to_sortable_list[ott_id].append(sortable_el)
        for v in ott_id_to_sortable_list.values():
            v.sort()
        return ott_id_to_sortable_list