
:>"^
  ã               @   s²   d  Z  d d l m 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 r® d d l m Z e ƒ  d S)z"Selection of atoms, residues, etc.é    )Úprint_functionN)Ú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   ú6/tmp/pip-build-ww9dw3qa/biopython/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  |  ] } | j  ƒ  ’ q Sr   )Ú
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  St |  t t f ƒ rJ |  g }  |  d j ƒ  ‰  t ‡  f d d †  |  Dƒ ƒ s… t d ƒ ‚ t  j | ƒ } t  j ˆ  ƒ } | | k r³ |  S| | k rî xY t | | ƒ D] } t	 j
 j |  ƒ }  qÏ Wn- x* t | | ƒ D] } d d „  |  Dƒ }  qþ Wt |  ƒ 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!   |  ] } | j  ƒ  ˆ  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  |  ] } | j  ƒ  ’ q Sr   )r   )r   r   r   r   r   r   N   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__Ú
__future__r   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   .