o
    Rŀg'                  
   @   s4  d Z ddlZddlmZ ddlmZ ddlZzddlZW n e	y.   ddl
mZ eddw ddlm  mZ ddlmZ ddlmZ ed	ed
ededededededdZdd Zdd Zdd Zdd Zdd Zdd Zdd Zeeeeeeed Zd!d" ZG d#d$ d$ZdS )%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                 C   s\   | d d d }|d dksJ t |d  }t| d d || d d< | d d   d S )Ndataencodingkind	ByteArraytype)_dtypesnp
frombufferpop)columnr   dtype r   F/var/www/html/myenv/lib/python3.10/site-packages/Bio/PDB/binary_cif.py_byte_array_decoder(   s
   r   c                 C   s   | 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 d   d S )	Nr   r   r   r   
FixedPointsrcTypefactorr   )r   r   r   r   int32uint32divider   )r   r   r   r"   r   decoded_datar   r   r   _fixed_point_decoder1   s   r(   c           	      C   s   | d d d }|d dksJ |d }|d }|d }|||d	   }| d d }t |d
  }tj|tj|||d|d}|| d d< | d d   d S )Nr   r   r   r   IntervalQuantizationminmax	num_stepsr	   r!   r#   )r   r   addmultiplyr   )	r   r   min_valmax_valr,   deltar   r   r'   r   r   r   _interval_quantization_decoder?   s   r2   c                 C   s   | d d d }|d dksJ | d d }t |d  }t|d d d ||dd d }t||d	 ks9J || d d< | d d   d S )
Nr   r   r   r   	RunLengthr!   r
   r	   srcSize)r   r   repeatastypelenr   )r   r   r   r   r'   r   r   r   _run_length_decoderO   s   &r8   c                 C   s   | d d d }|d dksJ t |d  }| d d }|j|dd}|d	  |d
 7  < |j|d || d d< | d d   d S )Nr   r   r   r   Deltar!   F)copyr   origin)out)r   r6   cumsumr   )r   r   r   r   r'   r   r   r   _delta_decoder\   s   r>   c                 C   s   | d d d }|d dksJ |d }|d }|d }|r$t d	}nt d
}| d d }||jjks7J t |jt j|ksCJ t |f|}t|| || d d< | d d   d S )Nr   r   r   r   IntegerPacking	byteCountr4   
isUnsignedr   r   )	r   r   itemsize
issubdtypeunsignedintegerempty_bcif_helperinteger_unpackr   )r   r   
byte_countsrc_sizeis_unsignedr   r   r'   r   r   r   _integer_packing_decoderj   s   
rK   c           
      C   s   | 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 ftd}tt|D ]}||| ||d   }|||< qBt |}	||	 | d d< | d d   d S )Nr   r   r   r   StringArrayoffsetsoffsetEncoding)r   r   dataEncoding
stringDatar	   r#   )_decoder   rE   r7   objectranger   )
r   r   offsets_columnlookup_columnstring_datarM   unique_stringsindexunique_stringlookupsr   r   r   _string_array_decoder   s*   

r[   )r   r    r)   r3   r9   r?   rL   c                 C   sH   t | d d }|| d d< |r|d }t|d  |  |s| d d S )Nr   r   r   r   )r   	_decoders)r   	encodingsr   r   r   r   rQ      s   rQ   c                   @   sX   e Zd ZdZdd ZdededefddZd	d
 Zdd Zde	e dede
fddZdS )BinaryCIFParserzrA parser for BinaryCIF files.

    See the `BinaryCIF specification <https://github.com/molstar/BinaryCIF>`_.
    c                 C   s   t  | _dS )zInitialize a BinaryCIF parser.N)r   _structure_builderselfr   r   r   __init__   s   zBinaryCIFParser.__init__
atom_groupcomponent_idreturnc                 C   s(   |dkr|dv rd}|S d}|S d}|S )NHETATM)HOHWATWH r   )ra   rc   rd   hetero_fieldr   r   r   _get_hetero_field   s   z!BinaryCIFParser._get_hetero_fieldc                    sb   t |d }t |d } fddt||D }dd t |d D }t |d }tt|||S )Nz_atom_site.group_PDB_atom_site.label_comp_idc                    s   g | ]
\}}  ||qS r   )rm   ).0rc   rd   r`   r   r   
<listcomp>   s    
z4BinaryCIFParser._get_residue_ids.<locals>.<listcomp>c                 S   s   g | ]}|pd qS rk   r   )ro   coder   r   r   rp      s    z_atom_site.pdbx_PDB_ins_codez_atom_site.auth_seq_id)rQ   ziplist)ra   columnsatom_groupscomponent_idshetero_fieldsinsertion_codessequence_idsr   r`   r   _get_residue_ids   s   

z BinaryCIFParser._get_residue_idsc                    s   t |d t |d }t |d }t |d }tj|||fddt |d t |d d	d
 t |d D  t |d t |d  fdd
ttD S )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.occupancyc                 S   s   g | ]}t |pd qS rq   )str)ro   alt_idr   r   r   rp      s    z.BinaryCIFParser._get_atoms.<locals>.<listcomp>z_atom_site.label_alt_idz_atom_site.idz_atom_site.type_symbolc                    sB   g | ]}| | | |  | | | | d qS ))namecoordb_factor	occupancyaltlocfullnameserial_numberelementr   )ro   rX   alt_ids	b_factorscoordinates_listnamesoccupanciesserial_numberstype_symbolsr   r   rp      s    )rQ   r   stackrS   r7   )ra   ru   x_listy_listz_listr   r   r   
_get_atoms   s   

zBinaryCIFParser._get_atomsidsourcec                 C   s  t |dr
|d |drtj|ddnt|dd}tj|dd}W d   n1 s.w   Y  d	d
 |d D }t|d }t|d }| |}t|d }	| 	|}
t|d d }| j
|pf| d}d}d}d}d}tt|D ]V}|| }|| }|| }|	| }||kr| j
|| |d7 }|}d}d}||kr| j
| |}d}||ks||kr| j
j|g|R   |}|}| j
jdi |
|  qx| j
 S )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_listNc                 S   s@   i | ]}|d  D ]}|d D ]}|d  d|d  |qqqS )
categoriesru   r   .r   )ro   
data_blockcategoryr   r   r   r   
<dictcomp>  s    
z1BinaryCIFParser.get_structure.<locals>.<dictcomp>
dataBlocksz_atom_site.pdbx_PDB_model_numz_atom_site.label_asym_idrn   z	_entry.idr	   r   )hasattrr   endswithgzipopenmsgpackunpackrQ   r{   r   r_   init_structurerS   r7   
init_model
init_chaininit_residue	init_atomget_structure)ra   r   r   fileresultru   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_idrX   model_numberchain_id
residue_idrd   r   r   r   r      sZ   





zBinaryCIFParser.get_structureN)__name__
__module____qualname____doc__rb   r}   rm   r{   r   r   r   r   r   r   r   r   r^      s    r^   )r   r   collectionsr   typingr   numpyr   r   ImportErrorBior   Bio.PDB._bcif_helperPDBrF   Bio.PDB.Structurer   Bio.PDB.StructureBuilderr   r   r   r   r(   r2   r8   r>   rK   r[   r\   rQ   r^   r   r   r   r   <module>   sX    	