
    Ri                     T    d Z ddlZddlmZ ddlmZ ddlmZ ddlmZ  G d d      Z	y)	z=Fast atom neighbor lookup using a KD tree (implemented in C).    N)PDBException)entity_levels)unfold_entities)	uniqueifyc                   .    e Zd ZdZddZd ZddZddZy)	NeighborSearcha  Class for neighbor searching.

    This class can be used for two related purposes:

     1. To find all atoms/residues/chains/models/structures within radius
        of a given query position.
     2. To find all atoms/residues/chains/models/structures that are within
        a fixed radius of each other.

    NeighborSearch makes use of the KDTree class implemented in C for speed.
    c                    ddl m} || _        |D cg c]  }|j                          }}t	        j
                  |d      | _        |dkD  sJ | j                  j                  d   dk(  sJ  || j                  |      | _        yc c}w )a4  Create the object.

        Arguments:
         - atom_list - list of atoms. This list is used in the queries.
           It can contain atoms from different structures.
         - bucket_size - bucket size of KD tree. You can play around
           with this to optimize speed if you feel like it.

        r   )KDTreed)dtype      N)	Bio.PDB.kdtreesr
   	atom_list	get_coordnparraycoordsshapekdt)selfr   bucket_sizer
   a
coord_lists         N/home/agent/.friday_env/lib/python3.12/site-packages/Bio/PDB/NeighborSearch.py__init__zNeighborSearch.__init__    sy     	+"-67akkm7
7hhz5Q{{  #q((($++{3 8s   Bc                     g }|D ]W  \  }}|j                         }|j                         }||k(  r,||k  r|j                  ||f       E|j                  ||f       Y t        |      S )N)
get_parentappendr   )r   	pair_listparent_pair_liste1e2p1p2s          r   _get_unique_parent_pairsz'NeighborSearch._get_unique_parent_pairs7   sv      	2FBBBRxb ''R1 ''R1	2 )**    c                 F   |t         vrt        | d      t        j                  |dd      }|j                  dk7  rt        d      | j                  j                  ||      }|D cg c]  }| j                  |j                      }}|dk(  r|S t        ||      S c c}w )a  Neighbor search.

        Return all atoms/residues/chains/models/structures
        that have at least one atom within radius of center.
        What entity level is returned (e.g. atoms or residues)
        is determined by level (A=atoms, R=residues, C=chains,
        M=models, S=structures).

        Arguments:
         - center - NumPy array
         - radius - float
         - level - char (A, R, C, M, S)

        : Unknown levelr   C)r   requirements)r   z$Expected a 3-dimensional NumPy arrayA)r   r   r   requirer   	Exceptionr   searchr   indexr   )r   centerradiuslevelpointspointr   s          r   r/   zNeighborSearch.searchK   s     %%899F#C@<<4BCC0>DEUT^^EKK0E	EC<"9e44	 Fs   ) Bc                 N   |t         vrt        | d      | j                  j                  |      }| j                  }g }|D ]7  }|j
                  }|j                  }||   }	||   }
|j                  |	|
f       9 |dk(  r|S |}dD ]  }| j                  |      }||k(  s|c S  y)zAll neighbor search.

        Search all entities that have atoms pairs within
        radius.

        Arguments:
         - radius - float
         - level - char (A, R, C, M, S)

        r)   r,   )Rr*   MSN)	r   r   r   neighbor_searchr   index1index2r   r&   )r   r2   r3   	neighborsr   atom_pair_listneighbori1i2a1a2next_level_pair_list
next_levels                r   
search_allzNeighborSearch.search_allf   s     %%899HH,,V4	NN	! 	,HBB2B2B!!2r(+	, C<!!-. 	,J#'#@#@AU#V 
"++	,r'   N)
   )r,   )__name__
__module____qualname____doc__r   r&   r/   rF    r'   r   r   r      s    
4.+(56,r'   r   )
rK   numpyr   Bio.PDB.PDBExceptionsr   Bio.PDB.Selectionr   r   r   r   rL   r'   r   <module>rP      s&    D  . + - 'p, p,r'   