o
    Rŀg!C                     @   sb   d Z ddl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
 ddlmZ G dd	 d	ZdS )
zParser for PDB files.    N)	as_handle)_parse_pdb_header_list)PDBConstructionException)PDBConstructionWarning)StructureBuilderc                   @   s\   e Zd ZdZ					dddZdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dd ZdS )	PDBParserz/Parse a PDB file and return a Structure object.TFNc                 C   sL   |dur|| _ nt | _ d| _d| _d| _t|| _t|| _t|| _dS )a  Create a PDBParser object.

        The PDB parser call a number of standard methods in an aggregated
        StructureBuilder object. Normally this object is instantiated by the
        PDBParser object itself, but if the user provides his/her own
        StructureBuilder object, the latter is used instead.

        Arguments:
         - PERMISSIVE - Evaluated as a Boolean. If false, exceptions in
           constructing the SMCRA data structure are fatal. If true (DEFAULT),
           the exceptions are caught, but some residues or atoms will be missing.
           THESE EXCEPTIONS ARE DUE TO PROBLEMS IN THE PDB FILE!.
         - get_header - unused argument kept for historical compatibility.
         - structure_builder - an optional user implemented StructureBuilder class.
         - QUIET - Evaluated as a Boolean. If true, warnings issued in constructing
           the SMCRA data will be suppressed. If false (DEFAULT), they will be shown.
           These warnings might be indicative of problems in the PDB file!
         - is_pqr - Evaluated as a Boolean. Specifies the type of file to be parsed.
           If false (DEFAULT) a .pdb file format is assumed. Set it to true if you
           want to parse a .pqr file instead.

        Nr   )	structure_builderr   headertrailerline_counterbool
PERMISSIVEQUIETis_pqr)selfr   
get_headerr   r   r    r   E/var/www/html/myenv/lib/python3.10/site-packages/Bio/PDB/PDBParser.py__init__   s   

zPDBParser.__init__c              	   C   s   t  N | jrt jdtd d| _d| _| j| t	|}|
 }|s*td| | W d   n1 s9w   Y  | j| j | j }W d   |S 1 sUw   Y  |S )zReturn the structure.

        Arguments:
         - id - string, the id that will be used for the structure
         - file - name of the PDB file OR an open filehandle

        ignore)categoryNzEmpty file.)warningscatch_warningsr   filterwarningsr   r	   r
   r   init_structurer   	readlines
ValueError_parse
set_headerget_structure)r   idfilehandlelines	structurer   r   r   r   D   s$   


zPDBParser.get_structurec                 C      | j S )zReturn the header.)r	   r   r   r   r   r   a      zPDBParser.get_headerc                 C   r%   )zReturn the trailer.)r
   r&   r   r   r   get_trailere   r'   zPDBParser.get_trailerc                 C   s    |  |\| _}| || _dS )zParse the PDB file (PRIVATE).N)_get_headerr	   _parse_coordinatesr
   )r   header_coords_trailercoords_trailerr   r   r   r   k   s   zPDBParser._parsec           	      C   sx   | j }d}tt|D ]}||d  || }|dd }|dv r$ nq|d| }|| _||d }t|}||fS )z:Get the header of the PDB file, return the rest (PRIVATE).r         )ATOM  HETATMMODEL N)r   rangelenset_line_counterr   r   )	r   r+   r   ilinerecord_typer	   r,   header_dictr   r   r   r)   r   s   zPDBParser._get_headerc           ,      C   s  h d}d}| j }d}d}d}d}d}	d}
tt|D ]f}|| d}|dd }| j| d }|| | s<q|dksE|dkrn|sR|| |d7 }d}|d	d
 }| }t|dkre|}n|d }|d
 }|dd  }|d }z
t	|dd }W n t
y   d}Y nw t	|dd  d }|d }|dkr|dks|dkrd}nd}nd}|||f}zt|dd }t|dd }t|dd }W n t
y   td| dw t|||fd}| js8z
t|dd }W n t
y
   | d| d}Y nw |dur|dk rtdt z
t|dd }W nd t
y7   | d | d!}Y nSw | jrz
t|dd" } W n t
yX   | d#| d} Y nw z
t|d"d$ }!W n t
yu   | d%| d}!Y nw |!dur|!dk rd&}"| |"| d}!|d'd( }#|d(d)   }$||#kr|#}|| ||kr|}|| |}	|}
z
||||| W nK ty }" z| |"| W Y d}"~"n7d}"~"ww |	|ks|
|kr|}	|}
z
||||| W n ty }" z| |"| W Y d}"~"nd}"~"ww | js:z|||||||||$ W n^ ty9 }" z| |"| W Y d}"~"nId}"~"ww | jrlz|||| |!||||$| |!| j W n, tyk }" z| |"| W Y d}"~"nd}"~"ww n|d*krd+d, |d-d. |d.d/ |d0d1 |d1d2 |d2d3 |d3d$ fD }%t|%dd4 d}&||& n|d5krz
t	|d6d7 }'W n t
y   | d8| d}'Y nw |||' |d7 }d}d}d}	n|d9ks|d:kr|  j|7  _||d   S |d;krd}d}d}	n}|d<kr<d=d, |d-d. |d.d/ |d/d1 |d1d2 |d2d3 |d3d$ fD }(t|(dd4 d})||) nB|d>krmd?d, |dd |dd |dd |dd |dd fD }*t|*d}+||+ n||vr~td@| dA| t |d7 }q| j| | _g S )Bz0Parse the atomic data in the PDB file (PRIVATE).>	   TER   ANISOUENDMDLr0   MASTERSIGATMSIGUIJr/   r1   r   N
r.   r-   r/   r0                           HOHWATWH    &   .   6   z,Invalid or missing coordinate(s) at line %i.f<   zInvalid or missing occupancyz'Negative occupancy in one or more atomsB   zInvalid or missing B factorg        >   zInvalid or missing chargeF   zInvalid or missing radiuszNegative atom radiusH   L   N   r:   c                 S      g | ]}t |qS r   float.0xr   r   r   
<listcomp>>      z0PDBParser._parse_coordinates.<locals>.<listcomp>   #   *   +   1   8   ?   g     @r1   
      z&Invalid or missing model serial numberzEND   CONECTr;   r>   c                 S   rY   r   rZ   r\   r   r   r   r_   c  r`   r=   c                 S   rY   r   rZ   r\   r   r   r   r_   s  r`   zIgnoring unrecognized record 'z
' at line )r   r2   r3   rstripr   r4   strip
init_modelsplitint	Exceptionr[   r   nparrayr   _handle_PDB_exceptionr   warnr   upperinit_seg
init_chaininit_residue	init_atomastype
set_anisou
set_siguij
set_sigatm),r   r,   allowed_recordslocal_line_counterr   current_model_id
model_opencurrent_chain_idcurrent_segidcurrent_residue_idcurrent_resnamer5   r6   r7   global_line_counterfullname
split_listnamealtlocresnamechainidserial_numberresseqicodehetero_flag
residue_idr^   yzcoord	occupancybfactor
pqr_chargeradiusmessagesegidelementanisouanisou_array
serial_numsiguijsiguij_arraysigatmsigatm_arrayr   r   r   r*      s  


































zPDBParser._parse_coordinatesc                 C   s0   d||f }| j rtd| t dS t|d)zHandle exception (PRIVATE).

        This method catches an exception that occurs in the StructureBuilder
        object (if PERMISSIVE), or raises it again, this time adding the
        PDB line number to the error message.
        z%s at line %i.zlPDBConstructionException: %s
Exception ignored.
Some atoms or residues may be missing in the data structure.N)r   r   rt   r   r   )r   r   r   r   r   r   rs     s   
	zPDBParser._handle_PDB_exception)TFNFF)__name__
__module____qualname____doc__r   r   r   r(   r   r)   r*   rs   r   r   r   r   r      s"    
,  r   )r   r   numpyrq   Bio.Filer   Bio.PDB.parse_pdb_headerr   Bio.PDB.PDBExceptionsr   r   Bio.PDB.StructureBuilderr   r   r   r   r   r   <module>   s   