o
    Rŀg25                     @   sx   d Z ddlZddlmZ ddlmZ 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d Zdd ZdS )zParse header of PDB files into a python dictionary.

Emerged from the Columba database project www.columba-db.de, original author
Kristian Rother.
    N)defaultdict)Filec                 C   s   t t}| D ]q}|drw|dd dkr| d }g }q|dd dks.|dd d	krD||dd  d
d dd q|dd dkrw|| }|dd dkrf|g kr`|d }|| n|dd rng }||dd   qt|S )Nz
REMARK 350      zBIOMOLECULE:)   zAPPLY THE FOLLOWING TO CHAINS:   zAND CHAINS:  ,      BIOMT   BIOMT1r   )	r   list
startswithsplitextendreplacestripappenddict)inlbiomoleculelinecurrentBiomoleculeapplyToChainsbiomt r   L/var/www/html/myenv/lib/python3.10/site-packages/Bio/PDB/parse_pdb_header.py_get_biomoltrans   s,   
"r!   c                 C   s@   d}| D ]}t d|r||dd  7 }qt dd|}|S )Nr
   z\AJRNLr   H   \s\s+r	   )researchlowersub)r   journalr   r   r   r    _get_journal>   s   r)   c                 C   s   g }d}| D ]/}t d|r5t d|r+|dkr*t dd|}|dkr(|| d}q||dd  7 }q|dkrJt dd|}|dkrJ|| |S )Nr
   z\AREMARK   1z\AREMARK   1 REFERENCEr#   r	   r   r"   )r$   r%   r'   r   r&   )r   
referencesactrefr   r   r   r    _get_referencesH   s$   

r,   c                 C   s   d}t | dd }|dk rd}nd}t|| d }g d}t|| d	d
 }t|dkr4d| }|| d | dd  }|S )z<Convert dates from DD-Mon-YY to YYYY-MM-DD format (PRIVATE).r
      N2   i  il  -)xxxJanFebMarAprMayJunJulAugSepOctNovDec         0   )intstrindexlen)pdb_datedateyearcentury
all_monthsmonthr   r   r    _format_date`   s   rL   c                 C      t dd| S )z@Chops lines ending with  '     1CSA  14' and the like (PRIVATE).z\s\s\s\s+[\w]{4}.\s+\d*\Zr
   r$   r'   r   r   r   r    _chop_end_codes      rP   c                 C   rM   )zGChops lines ending with  '     14-JUL-97  1CSA' and the like (PRIVATE).z+\s+\d\d-\w\w\w-\d\d\s+[1-9][0-9A-Z]{3}\s*\Zr
   rN   rO   r   r   r    _chop_end_misc   rQ   rR   c                 C   sv   |   }d}d}d}|t|k r9|| }|dkr%|dkr%|r%| }d}n|dv r+d}||7 }|d7 }|t|k s|S )z0Make A Lowercase String With Capitals (PRIVATE).r
   r   r?   azz .,;:	-_)r&   rE   upper)r   
line_lowersinextCapcr   r   r    
_nice_case   s   	r[   c                 C   s|   g }t | +}|D ]}|dd }|dv r n|| q
W d   t|S W d   t|S 1 s5w   Y  t|S )zReturn the header lines of a pdb file as a dictionary.

    Dictionary keys are: head, deposition_date, release_date, structure_method,
    resolution, structure_reference, journal_reference, author and
    compound.
    r   r>   )zATOM  HETATMzMODEL N)r   	as_handler   _parse_pdb_header_list)infileheaderfr   record_typer   r   r    parse_pdb_header   s   

rc   c                 C   s  | r| d dkr| d dvsJ dt dt j}|| }|du r$dS i }d|dv r?|d \}|d	< t||d
< nd|d
< |d|d	< |d|d< zt|d|d< W n  ty|   |dd |d< t|ddd |d< Y |S w d|d< |S )a  Parse missing residue remarks.

    Returns a dictionary describing the missing residue.
    The specification for REMARK 465 at
    http://www.wwpdb.org/documentation/file-format-content/format33/remarks2.html#REMARK%20465
    only gives templates, but does not say they have to be followed.
    So we assume that not all pdb-files with a REMARK 465 can be understood.

    Returns a dictionary with the following keys:
    "model", "res_name", "chain", "ssseq", "insertion"
    r   r	   r   z
 zline has to be strippeda  
        (\d+\s[\sA-Z][\sA-Z][A-Z] |   # Either model number + residue name
            [A-Z]{1,3})               # Or only residue name with 1 (RNA) to 3 letters
        \s ([A-Za-z0-9])              # A single character chain
        \s+(-?\d+[A-Za-z]?)$          # Residue number: A digit followed by an optional
                                      # insertion code (Hetero-flags make no sense in
                                      # context with missing res)
        Nr?   res_namemodelrA   chainr=   ssseq	insertion)r$   compileVERBOSEmatchgroupr   rB   
ValueError)r   patternrk   residuere   r   r   r    _parse_remark_465   s2    
rp   c                 C   s&  ddddddd ddddddiidddiidg g d}t | |d< t| |d	< t| |d
< d}d}d}| D ]B}tdd|}|d d  }|dd   }|dkrft| }	d|d |	g |d< q4|dkrt	d|}
|
d ur~t
t|
 |d< t	d|}
|
d ur|
d|d< t| }||d< q4|dkrtddt| }t	d|}|r| |d | d< tdd|}|d}t|dkr|d  }td!d|d }|d"krddi|d |< |}d}q4||d | |< |}q4|d | |  |d  d 7  < q4|d#kr_tddt| }|d}t|dkrN|d  }td!d|d }|d"krCddi|d$ |< |}d}q4||d$ | |< |}q4|d$ | |  |d  d 7  < q4|d%krt| }d&|v rz|d&  d| 7  < q4||d&< q4|d'krt|}td(d|}| |d)< q4|d*krq4|d+krt	d|}
|
d urt
t|
 |d,< q4|d-krd.|v r|d.  |7  < q4||d.< q4|d/krtt|}d0|v r|d0  |7  < q4||d0< q4|d1krvt	d2|r ttd2d|}td3d|}zt||d4< W q4 ty   d |d4< Y q4w |d5r<|r;d6|d7< t|}|r;|d8 | q4|d9ru|ru|d:dd;}t|trut|dkrud<|vrk|d  |d i|d<< q4|d |d< |d  < q4	 q4|d) dkr|d4 }|d ur|d=krd>|d)< |S )?Nr
   z
1909-01-08unknown1miscF)nameheadidcodedeposition_daterelease_datestructure_method
resolutionstructure_referencejournal_referenceauthorcompoundsourcehas_missing_residuesmissing_residuesbiomoltransr{   r|   r   z[\s\n\r]*\Zr>   
   TITLEr	   rt   HEADERz\d\d-\w\w\w-\d\drw   z\s+([1-9][0-9A-Z]{3})\s*\Zr?   rv   ru   COMPNDz\;\s*\Zz\d+\.\d+\.\d+\.\d+r~   	ec_numberz\((e\.c\.)*\d+\.\d+\.\d+\.\d+\):rA   r   z\A\s*mol_idSOURCEr   KEYWDSkeywordsEXPDTAz\s\s\s\s\s\s\s.*\Zry   CAVEATREVDATrx   JRNLr(   AUTHORr}   REMARKzREMARK   2 RESOLUTION.z\s+ANGSTROM.*rz   z
REMARK 465Tr   r   zREMARK  99 ASTRALzASTRAL z: astralg        zx-ray diffraction)r,   r)   r!   r$   r'   r   rP   r&   joinr%   rL   r[   rl   rR   r   rE   floatrm   r   rp   r   r   
isinstancer   )r`   	pdbh_dict
comp_molidlast_comp_keylast_src_keyhhhkeytailrt   rrru   ttrectokckeycvalkwdexpdauthrmissing_res_inforemark_99_keyvalresr   r   r    r^      s   





"


"















r^   )__doc__r$   collectionsr   Bior   r!   r)   r,   rL   rP   rR   r[   rc   rp   r^   r   r   r   r    <module>   s   
'
/