§
    Æ ´i8  ã                   óz   — d Z ddlZddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZmZmZ  G d„ de¦  «        ZdS )	a  
Neighbor Search wrapper for MDAnalysis --- :mod:`MDAnalysis.lib.NeighborSearch`
===============================================================================

This module contains classes that allow neighbor searches directly with
`AtomGroup` objects from `MDAnalysis`.
é    N)Úcapped_distance)Úunique_int_1d)Ú	AtomGroupÚSegmentGroupÚResidueGroup)ÚOptionalÚUnionÚListc                   ó¬   — e Zd ZdZ	 ddedeej                 ddfd„Z	 dded	e	d
e
deeeeef                  fd„Zdee         d
e
deeeef         fd„ZdS )ÚAtomNeighborSearchzåThis class can be used to find all atoms/residues/segments within the
    radius of a given query position.

    For the neighbor search, this class is a wrapper around
    :class:`~MDAnalysis.lib.distances.capped_distance`.
    NÚ
atom_groupÚboxÚreturnc                 ó:   — || _         |j        | _        || _        dS )a”  

        Parameters
        ----------
        atom_list : AtomGroup
          list of atoms
        box : array-like or ``None``, optional, default ``None``
          Simulation cell dimensions in the form of
          :attr:`MDAnalysis.trajectory.timestep.Timestep.dimensions` when
          periodic boundary conditions should be taken into account for
          the calculation of contacts.
        N)r   ÚuniverseÚ_uÚ_box)Úselfr   r   s      úg/srv/www/vhosts/g4struct/public_html/venv/lib/python3.11/site-packages/MDAnalysis/lib/NeighborSearch.pyÚ__init__zAtomNeighborSearch.__init__/   s    € ð %ˆŒØÔ%ˆŒØˆŒ	ˆ	ˆ	ó    ÚAÚatomsÚradiusÚlevelc                 ó<  — g }	 |j         }n# t          $ r
 |j        }Y nw xY wt          || j        j         || j        d¬¦  «        }|j        dk    r7t          t          j	        |dd…df         t          j
        ¬¦  «        ¦  «        }|                      ||¦  «        S )a2  
        Return all atoms/residues/segments that are within *radius* of the
        atoms in *atoms*.

        Parameters
        ----------
        atoms : AtomGroup, MDAnalysis.core.groups.AtomGroup
          AtomGroup object
        radius : float
          Radius for search in Angstrom.
        level : str
          char (A, R, S). Return atoms(A), residues(R) or segments(S) within
          *radius* of *atoms*.

        Returns
        -------
        AtomGroup : :class:`~MDAnalysis.core.groups.AtomGroup`
          When ``level='A'``, AtomGroup is being returned.
        ResidueGroup : :class:`~MDAnalysis.core.groups.ResidueGroup`
          When ``level='R'``, ResidueGroup is being returned.
        SegmentGroup : :class:`~MDAnalysis.core.groups.SegmentGroup`
          When ``level='S'``, SegmentGroup is being returned.


        .. versionchanged:: 2.0.0
           Now returns :class:`AtomGroup` (when empty this is now an empty
           :class:`AtomGroup` instead of an empty list), :class:`ResidueGroup`,
           or a :class:`SegmentGroup`
        F)r   Úreturn_distancesr   Né   )Údtype)Ú	positionsÚAttributeErrorÚpositionr   r   r   Úsizer   ÚnpÚasarrayÚintpÚ_index2level)r   r   r   r   Ú
unique_idxr"   Úpairss          r   ÚsearchzAtomNeighborSearch.searchB   s·   € ð@ ˆ
ð	&à”ˆHˆHøÝð 	&ð 	&ð 	&à”~ˆHˆHˆHð	&øøøõ  ØØŒOÔ%ØØ”	Ø"ð
ñ 
ô 
ˆð Œ:˜Š>ˆ>Ý&¥r¤z°%¸¸¸¸1¸´+ÅRÄWÐ'MÑ'MÔ'MÑNÔNˆJØ× Ò  ¨UÑ3Ô3Ð3s   „ Œ Ÿ Úindicesc                 ó¤   — | j         |         }|dk    r|S |dk    r|j        S |dk    r|j        S t          d                     |¦  «        ¦  «        ‚)aT  Convert list of atom_indices in a AtomGroup to either the
        Atoms or segments/residues containing these atoms.

        Parameters
        ----------
        indices
           list of atom indices
        level : str
          char (A, R, S). Return atoms(A), residues(R) or segments(S) within
          *radius* of *atoms*.
        r   ÚRÚSz{0}: level not implemented)r   ÚresiduesÚsegmentsÚNotImplementedErrorÚformat)r   r+   r   Ú	atomgroups       r   r'   zAtomNeighborSearch._index2levelu   sf   € ð ”O GÔ,ˆ	ØCŠ<ˆ<ØÐØcŠ\ˆ\ØÔ%Ð%ØcŠ\ˆ\ØÔ%Ð%å%Ø,×3Ò3°EÑ:Ô:ñô ð r   )N)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚnptÚ	ArrayLiker   ÚfloatÚstrr	   r   r   r*   r
   Úintr'   © r   r   r   r   '   sê   € € € € € ðð ð EIðð Ø#ðØ*2°3´=Ô*Aðà	ðð ð ð ð( =@ð14ð 14Øð14Ø(-ð14Ø69ð14à	%˜	 <°Ð=Ô>Ô	?ð14ð 14ð 14ð 14ðfØ˜C”yðØ),ðà	ˆy˜,¨Ð4Ô	5ðð ð ð ð ð r   r   )r7   Únumpyr$   ÚMDAnalysis.lib.distancesr   ÚMDAnalysis.lib.utilr   ÚMDAnalysis.core.groupsr   r   r   Únumpy.typingÚtypingr8   r   r	   r
   Úobjectr   r=   r   r   ú<module>rE      sÍ   ðð0ð ð Ð Ð Ð Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø -Ð -Ð -Ð -Ð -Ð -Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (ðfð fð fð fð f˜ñ fô fð fð fð fr   