B
    ‰°bà	  ã               @   st   d Z ddlZddlmZ ddlmZ ddlmZ dddd	d
gZdd„ Z	dd„ Z
dd„ ZedkrpddlmZ eƒ  dS )z"Selection of atoms, residues, etc.é    N)ÚAtom)ÚEntity)ÚPDBExceptionÚAÚRÚCÚMÚSc             C   s   t t| ƒƒS )zZReturn a list of the unique items in the given iterable.

    Order is NOT preserved.
    )ÚlistÚset)Úitems© r   ú0lib/python3.7/site-packages/Bio/PDB/Selection.pyÚ	uniqueify   s    r   c             C   s   dd„ | D ƒ}t |ƒS )zATranslate a list of entities to a list of their (unique) parents.c             S   s   h | ]}|  ¡ ’qS r   )Ú
get_parent)Ú.0Úentityr   r   r   ú	<setcomp>   s    z%get_unique_parents.<locals>.<setcomp>)r
   )Úentity_listZunique_parentsr   r   r   Úget_unique_parents   s    r   c                sÒ   |t krtd| ƒ‚| g kr g S t| ttfƒr4| g} | d  ¡ ‰ t‡ fdd„| D ƒƒs^tdƒ‚t  |¡}t  ˆ ¡}||kr~| S ||kr¨xBt||ƒD ]}t	j
 | ¡} q’W n"x t||ƒD ]}dd„ | D ƒ} q´W t| ƒS )aâ  Unfold entities list to a child level (e.g. residues in chain).

    Unfold a list of entities to a list of entities of another
    level.  E.g.:

    list of atoms -> list of residues
    list of modules -> list of atoms
    list of residues -> list of chains

    - entity_list - list of entities or a single entity
    - target_level - char (A, R, C, M, S)

    Note that if entity_list is an empty list, you get an empty list back:

    >>> unfold_entities([], "A")
    []

    z%s: Not an entity level.r   c             3   s   | ]}|  ¡ ˆ kV  qd S )N)Ú	get_level)r   r   )Úlevelr   r   ú	<genexpr>>   s    z"unfold_entities.<locals>.<genexpr>zEntity list is not homogeneous.c             S   s   h | ]}|  ¡ ’qS r   )r   )r   r   r   r   r   r   M   s    z"unfold_entities.<locals>.<setcomp>)Úentity_levelsr   Ú
isinstancer   r   r   ÚallÚindexÚrangeÚ	itertoolsÚchainÚfrom_iterabler
   )r   Ztarget_levelZtarget_indexZlevel_indexÚir   )r   r   Úunfold_entities#   s&    

r"   Ú__main__)Úrun_doctest)Ú__doc__r   ZBio.PDB.Atomr   ZBio.PDB.Entityr   ZBio.PDB.PDBExceptionsr   r   r   r   r"   Ú__name__Z
Bio._utilsr$   r   r   r   r   Ú<module>   s   .