
    Ri'              
          d Z ddlZddlmZ ddlmZ ddlZ	 ddlZddlmc mZ ddlmZ ddlmZ  ej&                  d	       ej&                  d
       ej&                  d       ej&                  d       ej&                  d       ej&                  d       ej&                  d       ej&                  d      dZd Zd Zd Zd Zd Zd Zd ZeeeeeeedZd Z G d d      Zy# e	$ r ddl
mZ  ed      dw xY w)z6
A module to interact with BinaryCIF-formatted files.
    N)deque)Optional)MissingPythonDependencyErrorzCInstall msgpack to use Bio.PDB.binaryCIF (e.g. pip install msgpack))	Structure)StructureBuilderz<i1z<i2<i4z<u1z<u2<u4z<f4z<f8)                      !   c                     | d   d   d   }|d   dk(  sJ t         |d      }t        j                  | d   d   |      | d   d<   | d   d   j                          y )Ndataencodingkind	ByteArraytype)_dtypesnp
frombufferpop)columnr   dtypes      J/home/agent/.friday_env/lib/python3.12/site-packages/Bio/PDB/binary_cif.py_byte_array_decoderr    (   sn    f~j)"-HF{***HV$%E]]6&>&+A5IF6N6
6N:""$    c                 <   | d   d   d   }|d   dk(  sJ t         |d      }|d   }| d   d   }|j                  j                  t        j                  t        j
                  fv sJ t        j                  |||      }|| d   d<   | d   d   j                          y )	Nr   r   r   r   
FixedPointsrcTypefactorr   )r   r   r   r   int32uint32divider   )r   r   r   r%   r   decoded_datas         r   _fixed_point_decoderr+   1   s    f~j)"-HF|+++HY'(EhF&>&!D::??rxx333399T67L)F6N6
6N:""$r!   c                 "   | d   d   d   }|d   dk(  sJ |d   }|d   }|d   }|||d	z
  z  z
  }| d   d   }t         |d
      }t        j                  |t        j                  |||      |      }|| d   d<   | d   d   j	                          y )Nr   r   r   r   IntervalQuantizationminmax	num_stepsr
   r$   r&   )r   r   addmultiplyr   )	r   r   min_valmax_valr0   deltar   r   r*   s	            r   _interval_quantization_decoderr6   ?   s    f~j)"-HF5555uoGuoG%IgQ//E&>&!DHY'(E66'2;;tU%#HPUVL)F6N6
6N:""$r!   c                    | d   d   d   }|d   dk(  sJ | d   d   }t         |d      }t        j                  |d d d   j                  |      |dd d         }t	        |      |d	   k(  sJ || d   d<   | d   d   j                          y )
Nr   r   r   r   	RunLengthr$   r   r
   srcSize)r   r   repeatastypelenr   )r   r   r   r   r*   s        r   _run_length_decoderr=   O   s    f~j)"-HF{***&>&!DHY'(E99T#A#Y--e4d14a4jAL| 3333)F6N6
6N:""$r!   c                     | d   d   d   }|d   dk(  sJ t         |d      }| d   d   }|j                  |d      }|d	xx   |d
   z  cc<   |j                  |       || d   d<   | d   d   j                          y )Nr   r   r   r   Deltar$   F)copyr   origin)out)r   r;   cumsumr   )r   r   r   r   r*   s        r   _delta_decoderrD   \   s    f~j)"-HFw&&&HY'(E&>&!D;;u5;1LOx))OL))F6N6
6N:""$r!   c                    | d   d   d   }|d   dk(  sJ |d   }|d   }|d   }|rt        j                  d	      }nt        j                  d
      }| d   d   }||j                  j                  k(  sJ t        j                  |j                  t         j                        |k(  sJ t        j
                  |f|      }t        j                  ||       || d   d<   | d   d   j                          y )Nr   r   r   r   IntegerPacking	byteCountr9   
isUnsignedr	   r   )	r   r   itemsize
issubdtypeunsignedintegerempty_bcif_helperinteger_unpackr   )r   r   
byte_countsrc_sizeis_unsignedr   r   r*   s           r   _integer_packing_decoderrR   j   s    f~j)"-HF////+&J	"H<(K&>&!D,,,,,==R%7%78KGGG88XK/Ll3)F6N6
6N:""$r!   c                    | d   d   d   }|d   dk(  sJ d|d   |d   di}d| d   d   |d	   di}|d
   }t        |      }t        j                  t        |      dz
  ft              }t        t        |            D ]  }|||   ||dz       }|||<    t        |      }	||	   | d   d<   | d   d   j                          y )Nr   r   r   r   StringArrayoffsetsoffsetEncoding)r   r   dataEncoding
stringDatar
   r&   )_decoder   rL   r<   objectranger   )
r   r   offsets_columnlookup_columnstring_datarU   unique_stringsindexunique_stringlookupss
             r   _string_array_decoderrc      s   f~j)"-HF},,, 	Y' !12
N 	6N6* 0
M <(Kn%GXXs7|a/1@Ns>*+ .#GENWUQY5GH -u. m$G+G4F6N6
6N:""$r!   )r   r#   r-   r8   r?   rF   rT   c                 z    t        | d   d         }|| d   d<   |r|d   }t        |d      |        |r| d   d   S )Nr   r   r   r   )r   	_decoders)r   	encodingsr   s      r   rY   rY      sW    fVnZ01I!*F6N:
R=(6"#F+  &>&!!r!   c                   P    e Zd ZdZd ZdededefdZd Zd Zd	ed
z  dede	fdZ
y
)BinaryCIFParserzrA parser for BinaryCIF files.

    See the `BinaryCIF specification <https://github.com/molstar/BinaryCIF>`_.
    c                 "    t               | _        y)zInitialize a BinaryCIF parser.N)r   _structure_builder)selfs    r   __init__zBinaryCIFParser.__init__   s    "2"4r!   
atom_groupcomponent_idreturnc                 ,    |dk(  r|dv rd}|S d}|S d}|S )NHETATM)HOHWATWH  )rk   rm   rn   hetero_fields       r   _get_hetero_fieldz!BinaryCIFParser._get_hetero_field   s<    !".."@3L 	 GJL  Lr!   c                 2   t        |d         }t        |d         }t        ||      D cg c]  \  }}| j                  ||       }}}t        |d         D cg c]  }|xs d
 }}t        |d         }	t        t        ||	|            S c c}}w c c}w )Nz_atom_site.group_PDB_atom_site.label_comp_idz_atom_site.pdbx_PDB_ins_coderv   z_atom_site.auth_seq_id)rY   zipry   list)
rk   columnsatom_groupscomponent_idsrm   rn   hetero_fieldscodeinsertion_codessequence_idss
             r   _get_residue_idsz BinaryCIFParser._get_residue_ids   s    g&<=>(B CD -0],K
(
L "":|<
 

 %,G4R,S$T
 DKCK
 
 w'?@AC|_EFF

s   BBc                     t        |d         }t        |d         }t        |d         }t        |d         }t        j                  |||fd      }t        |d         }t        |d         }t        |d	         D 	cg c]  }	t        |	xs d
       }
}	t        |d         }t        |d         }t	        t        |            D cg c]%  }||   ||   ||   ||   |
|   ||   ||   ||   d' c}S c c}	w c c}w )Nz_atom_site.label_atom_idz_atom_site.Cartn_xz_atom_site.Cartn_yz_atom_site.Cartn_zr
   )axisz_atom_site.B_iso_or_equivz_atom_site.occupancyz_atom_site.label_alt_idrv   z_atom_site.idz_atom_site.type_symbol)namecoordb_factor	occupancyaltlocfullnameserial_numberelement)rY   r   stackstrr[   r<   )rk   r~   namesx_listy_listz_listcoordinates_list	b_factorsoccupanciesalt_idalt_idsserial_numberstype_symbolsr`   s                 r   
_get_atomszBinaryCIFParser._get_atoms   s;    :;<!567!567!56788VVV$<1EG$?@A	g&<=>-4W=V5W-X
#)C#
 
 !!9:w'?@A s>23
  e)%0%e,(/!%.!%L!/!6'.	
 	


s   ?C6	*C;idNsourcec                 H   t        |d      r|j                  d       |j                  d      rt        j                  |d      nt	        |d      5 }t        j                  |d      }ddd       d	   D ci c]$  }|d
   D ]  }|d   D ]  }|d    d|d    |  & }}}}t        |d         }	t        |d         }
| j                  |      }t        |d         }| j                  |      }t        |d         d   }| j                  j                  |xs |       d}d}d}d}d}t        t        |	            D ]  }|	|   }|
|   }||   }||   }||k7  r'| j                  j                  ||       |dz  }|}d}d}||k7  r| j                  j                  |       |}d}||k7  s||k7  r! | j                  j                   |g|  |}|} | j                  j"                  di ||     | j                  j%                         S # 1 sw Y   xY wc c}}}w )a  Parse and return the PDB structure from a BinaryCIF file.

        :param str id: the PDB code for this structure
        :param str source: the path to the BinaryCIF file
        :return: the PDB structure
        :rtype: Bio.PDB.Structure.Structure
        seekr   z.gzrb)modeT)use_listN
dataBlocks
categoriesr~   r   .z_atom_site.pdbx_PDB_model_numz_atom_site.label_asym_idr{   z	_entry.idr
   rw   )hasattrr   endswithgzipopenmsgpackunpackrY   r   r   rj   init_structurer[   r<   
init_model
init_chaininit_residue	init_atomget_structure)rk   r   r   fileresult
data_blockcategoryr   r~   atom_model_numbersatom_chain_idsatom_residue_idsatom_component_idsatomsentry_idbuilder_model_countbuilder_model_numberbuilder_chain_idbuilder_residue_idbuilder_component_idr`   model_numberchain_id
residue_idrn   s                            r   r   zBinaryCIFParser.get_structure   s    66"KKN u% IIf4(f4(	9 ^^D48F	9 %\2
 
&|4
 "9-	
   &.!12F:
2
2
 
 %W-L%MN )C!DE009$W-G%HI(7;/03..r~X>#!#3123 	>E-e4L%e,H)%0J-e4L33''223FU#q(#'3$#' %)"++''228<#+ %)"//<CW3W4''44\OJO%/"'3$-D##--=e=+	>. &&4466g	9 	9
s   H<)HH)__name__
__module____qualname____doc__rl   r   ry   r   r   r   r   rw   r!   r   rh   rh      sO    
5C s s G
8?7d
 ?7C ?7I ?7r!   rh   )r   r   collectionsr   typingr   numpyr   r   ImportErrorBior   Bio.PDB._bcif_helperPDBrM   Bio.PDB.Structurer   Bio.PDB.StructureBuilderr   r   r   r    r+   r6   r=   rD   rR   rc   re   rY   rh   rw   r!   r   <module>r      s       , + ' 5 rxxrxxrxxrxxrxxrxx	%%% 
%%%.%> %&:$.(		"{7 {7S  0
&Ms   C) )C>