
     i>                         d Z ddlZddlZddlZddlZddlZddlmZ ddl	m
Z
  G d de
j                  Z G d	 d
e
j                  ZdS )ab  
PDBQT structure files in MDAnalysis --- :mod:`MDAnalysis.coordinates.PDBQT`
===========================================================================

MDAnalysis reads coordinates from PDBQT_ files and additional optional
data such as B-factors, partial charge and AutoDock_ atom types.  It
is also possible to substitute a PDBQT file for a PSF file in order to
define the list of atoms (but no connectivity information will be
available in this case).

.. _PDBQT:
   https://autodock.scripps.edu/wp-content/uploads/sites/56/2021/10/AutoDock4.2.6_UserGuide.pdf
.. _AutoDock:
   http://autodock.scripps.edu/
    N   )util   )basec                   ,    e Zd ZdZdZdddZd Zd ZdS )PDBQTReadera  PDBQTReader that reads a PDBQT-formatted file, no frills.

    Records read:
     - CRYST1 for unitcell A,B,C, alpha,beta,gamm
     - ATOM. HETATM for x,y,z

    Original `PDB format documentation`_ with `AutoDOCK extensions`_


    .. _PDB format documentation:
       http://www.wwpdb.org/documentation/file-format-content/format32/v3.2.html
    .. _AutoDOCK extensions:
       http://autodock.scripps.edu/faqs-help/faq/what-is-the-format-of-a-pdbqt-file

    =============  ============  ===========  =============================================
    COLUMNS        DATA  TYPE    FIELD        DEFINITION
    =============  ============  ===========  =============================================
    1 -  6         Record name   "CRYST1"
    7 - 15         Real(9.3)     a              a (Angstroms).
    16 - 24        Real(9.3)     b              b (Angstroms).
    25 - 33        Real(9.3)     c              c (Angstroms).
    34 - 40        Real(7.2)     alpha          alpha (degrees).
    41 - 47        Real(7.2)     beta           beta (degrees).
    48 - 54        Real(7.2)     gamma          gamma (degrees).

    1 -  6         Record name   "ATOM  "
    7 - 11         Integer       serial       Atom  serial number.
    13 - 16        Atom          name         Atom name.
    17             Character     altLoc       Alternate location indicator. IGNORED
    18 - 21        Residue name  resName      Residue name.
    22             Character     chainID      Chain identifier.
    23 - 26        Integer       resSeq       Residue sequence number.
    27             AChar         iCode        Code for insertion of residues. IGNORED
    31 - 38        Real(8.3)     x            Orthogonal coordinates for X in Angstroms.
    39 - 46        Real(8.3)     y            Orthogonal coordinates for Y in Angstroms.
    47 - 54        Real(8.3)     z            Orthogonal coordinates for Z in Angstroms.
    55 - 60        Real(6.2)     occupancy    Occupancy.
    61 - 66        Real(6.2)     tempFactor   Temperature  factor.
    67 - 70        LString(4)    footnote     Usually blank. IGNORED.
    71 - 76        Real(6.4)     partialChrg  Gasteiger PEOE partial charge *q*.
    79 - 80        LString(2)    atomType     AutoDOCK atom type *t*.
    =============  ============  ===========  =============================================

    We ignore torsion notation and just pull the partial charge and atom type columns::

         COMPND    NSC7810
         REMARK  3 active torsions:
         REMARK  status: ('A' for Active; 'I' for Inactive)
         REMARK    1  A    between atoms: A7_7  and  C22_23
         REMARK    2  A    between atoms: A9_9  and  A11_11
         REMARK    3  A    between atoms: A17_17  and  C21_21
         ROOT
         123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789. (column reference)
         ATOM      1  A1  INH I           1.054   3.021   1.101  0.00  0.00     0.002 A
         ATOM      2  A2  INH I           1.150   1.704   0.764  0.00  0.00     0.012 A
         ATOM      3  A3  INH I          -0.006   0.975   0.431  0.00  0.00    -0.024 A
         ATOM      4  A4  INH I           0.070  -0.385   0.081  0.00  0.00     0.012 A
         ATOM      5  A5  INH I          -1.062  -1.073  -0.238  0.00  0.00     0.002 A
         ATOM      6  A6  INH I          -2.306  -0.456  -0.226  0.00  0.00     0.019 A
         ATOM      7  A7  INH I          -2.426   0.885   0.114  0.00  0.00     0.052 A
         ATOM      8  A8  INH I          -1.265   1.621   0.449  0.00  0.00     0.002 A
         ATOM      9  A9  INH I          -1.339   2.986   0.801  0.00  0.00    -0.013 A
         ATOM     10  A10 INH I          -0.176   3.667   1.128  0.00  0.00     0.013 A
         ENDROOT
         BRANCH   9  11
         ATOM     11  A11 INH I          -2.644   3.682   0.827  0.00  0.00    -0.013 A
         ATOM     12  A16 INH I          -3.007   4.557  -0.220  0.00  0.00     0.002 A
         ATOM     13  A12 INH I          -3.522   3.485   1.882  0.00  0.00     0.013 A
         ATOM     14  A15 INH I          -4.262   5.209  -0.177  0.00  0.00    -0.024 A
         ATOM     15  A17 INH I          -2.144   4.784  -1.319  0.00  0.00     0.052 A
         ATOM     16  A14 INH I          -5.122   4.981   0.910  0.00  0.00     0.012 A
         ATOM     17  A20 INH I          -4.627   6.077  -1.222  0.00  0.00     0.012 A
         ATOM     18  A13 INH I          -4.749   4.135   1.912  0.00  0.00     0.002 A
         ATOM     19  A19 INH I          -3.777   6.285  -2.267  0.00  0.00     0.002 A
         ATOM     20  A18 INH I          -2.543   5.650  -2.328  0.00  0.00     0.019 A
         BRANCH  15  21
         ATOM     21  C21 INH I          -0.834   4.113  -1.388  0.00  0.00     0.210 C
         ATOM     22  O1  INH I          -0.774   2.915  -1.581  0.00  0.00    -0.644 OA
         ATOM     23  O3  INH I           0.298   4.828  -1.237  0.00  0.00    -0.644 OA
         ENDBRANCH  15  21
         ENDBRANCH   9  11
         BRANCH   7  24
         ATOM     24  C22 INH I          -3.749   1.535   0.125  0.00  0.00     0.210 C
         ATOM     25  O2  INH I          -4.019   2.378  -0.708  0.00  0.00    -0.644 OA
         ATOM     26  O4  INH I          -4.659   1.196   1.059  0.00  0.00    -0.644 OA
         ENDBRANCH   7  24
         TORSDOF 3
         123456789.123456789.123456789.123456789.123456789.123456789.123456789.123456789. (column reference)

    .. versionchanged:: 0.11.0
       Frames now 0-based instead of 1-based
    PDBQTNAngstromtimelengthc           	         g }t          j        dt           j                  }t          j        | j                  5 }|D ]}|                    d          r n|                    d          rst          j        |dd         |dd         |dd         f          \  }}}t          j        |dd         |dd	         |d	d
         f          \  }}	}
|||||	|
f|d d <   |                    d          r0|                    |dd         |dd         |dd
         g           d d d            n# 1 swxY w Y   t          |          | _	         | j
        j        |fi | j        | _        || j        _        d| j        _        | j        rT|                     | j        j                   | j        j        +|                     | j        j        d d                    d S d S d S )N   )dtypezEND
CRYST1      !   (   /   6   )ATOMHETATM   &   .   r      )npzerosfloat32r   openanyfilename
startswithappendlenn_atoms	_Timestepfrom_coordinates
_ts_kwargsts
dimensionsframeconvert_unitsconvert_pos_from_native_pos)selfcoordsunitcellpdbfilelinexyzABGs              f/srv/www/vhosts/g4struct/public_html/venv/lib/python3.11/site-packages/MDAnalysis/coordinates/PDBQT.py_read_first_framezPDBQTReader._read_first_frame   sV   8ARZ000\$-(( 	KG K K ??7++ E??8,, 	3 jadT"R%[$r"u+> GAq! !jbed2b5k42;? GAq! #$Q1a"2HQQQK??#566 KMM42;RUT"R%["IJJJ'	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K( 6{{1$.1&LLDOLL% 	E((666w!-,,TW-?-CDDDDD		E 	E .-s   C*D22D69D6c                     t          |fi |S )zReturns a permissive (simple) PDBQTWriter for *filename*.

        Parameters
        ----------
        filename : str
            filename of the output PDBQT file

        Returns
        -------
        :class:`PDBQTWriter`

        )PDBQTWriterr0   r"   kwargss      r;   WriterzPDBQTReader.Writer   s     8..v...    )__name__
__module____qualname____doc__formatunitsr<   rA    rB   r;   r   r   3   sW        [ [z FZ00EE E EB/ / / / /rB   r   c                   L    e Zd ZdZdddddZdZdd	d
ZdddZd Zd Z	ddZ
dS )r>   a  PDBQT writer that implements a subset of the PDB_ 3.2 standard and the PDBQT_ spec.

    .. _PDB: http://www.wwpdb.org/documentation/file-format-content/format32/v3.2.html
    .. _PDBQT: https://autodock.scripps.edu/wp-content/uploads/sites/56/2021/10/AutoDock4.2.6_UserGuide.pdf

    .. versionchanged:: 2.6.0
       Files are now written in `wt` mode, and keep extensions, allowing
       for files to be written under compressed formats
    zATOM  {serial:5d} {name:<4.4s} {resName:<4.4s}{chainID:1.1s}{resSeq:4d}{iCode:1.1s}   {pos[0]:8.3f}{pos[1]:8.3f}{pos[2]:8.3f}{occupancy:6.2f}{tempFactor:6.2f}    {charge:< 1.3f} {element:<2.2s}
zREMARK     {0}
zTITLE     {0}
zrCRYST1{box[0]:9.3f}{box[1]:9.3f}{box[2]:9.3f}{ang[0]:7.2f}{ang[1]:7.2f}{ang[2]:7.2f} {spacegroup:<11s}{zvalue:4d}
)r   REMARKTITLEr   r	   Nr
   r   g"?g-@)minmaxc                 |    t          j        |dd          | _        t          j        | j        d          | _        d S )NpdbqtT)extkeepwt)r   r"   anyopenpdbr?   s      r;   __init__zPDBQTWriter.__init__   s3    hG$GGG<t44rB   c                 8    | j                                          d S N)rU   close)r0   s    r;   rY   zPDBQTWriter.close   s    rB   c                 8   	 |j         }n # t          $ r d}t          |          dw xY w||j        |          n%	 |j        j        j        }n# t          $ r d}Y nw xY w|j        }|j        }i }g }dD ]V\  }	}
	 t          ||	          ||	<   # t          $ r0 t          j
        |
f          ||	<   |                    |	           Y Sw xY w	 |j        |d<   nX# t          $ rK 	 |j        |d<   n<# t          $ r/ t          j
        d          |d<   |                    d           Y nw xY wY nw xY w|r;t          j        d                    d                    |          	                     |                     | j        |          s|                                  	 t+          j        | j                   n-# t0          $ r }|j        t2          j        k    r	 Y d}~nd}~ww xY wt7          d
                    | j        d         | j        d                             dt9          |          z   dz   t9          |j        j                  z   }| j                            | j        d                             |                     |                      |j        j                  }| j                            | j        d                             |dd         |dd         dd                     tC          tE          ||d         |d         |d         |d         |d         |d         |d         |d         |d         
  
        d          D ]\  }\
  }}}}}}}}}}tG          j$        |d          }tG          j$        |d          }|dd         }tK          |          dk     rd |z   }|&                                d!d         }| j                            | j        d"                             |||||||||||#                     |                                  dS )$a5  Write selection at current trajectory frame to file.

        Parameters
        ----------
        selection : AtomGroup
            The selection to be written
        frame : int (optional)
            optionally move to frame index `frame` before writing; the default
            is to write the current trajectory frame

        Note
        ----
        The last letter of the
        :attr:`~MDAnalysis.core.groups.Atom.segid` is used as the PDB
        chainID.


        .. versionchanged:: 0.11.0
           Frames now 0-based instead of 1-based

        z-Input obj is neither an AtomGroup or UniverseNr   )	)altLocs )charges        )icodesr\   )namesX)occupanciesg      ?)residsr   )resnamesUNK)tempfactorsr^   )typesz  chainids)r\   zlSupplied AtomGroup was missing the following attributes: {miss}. These will be written with default values. z, )misszaPDB files must have coordinate values between {0:.3f} and {1:.3f} Angstroem: No file was written.rM   rN   zFRAME z FROM rL   r   r   zP 1r   )boxang
spacegroupzvaluer`   rd   rc   r_   rb   rf   r]   rg   )start      r\   r   )serialnameresNamechainIDresSeqiCodepos	occupancy
tempFactorchargeelement)'universeAttributeError	TypeError
trajectoryr*   r,   atoms	positionsgetattr	itertoolscycler$   rh   segidswarningswarnrG   joinhas_valid_coordinatespdb_coor_limitsrY   osremover"   OSErrorerrnoENOENT
ValueErrorstrrU   writefmtconvert_dimensions_to_unitcell	enumeratezipr   ltruncate_intr%   strip)r0   	selectionr,   uerrmsgr   coorattrsmissing_topologyattrdflterrr4   rj   rr   rx   rs   resnamechainidresidicodery   
tempfactorr{   r|   s                            r;   r   zPDBQTWriter.write   s   ,	."AA 	. 	. 	.DFF##-	. L-!    O 	
 

 	. 	.JD$.%eT22d! . . .'otg66d ''-----.	4 %E* 	4 	4 	44$)Lj!!! 4 4 4$-OF$;$;j! ''
333334	4  	M6tyy)9::6;;   ))$*>EE 	JJLLL	$-((((   9,, 6(/1Ee1L    #e**$x/#al6K2L2LLtx(//55666 11!,/BBHX%%GQRRU1 &  	
 	
 	
& gj!j!hhm$m$i g  
 
 
/	 /	 
F 
  '22F&ua00E8D4yy1}}Tzmmoobcc*GHNN ''!## ')!# (       	

sy   
 'A AA9B7CC
C 
D+!
C,+D+,6D%"D+$D%%D+*D+F5 5
G?GGrX   )rC   rD   rE   rF   r   rG   rH   r   rV   rY   r   rI   rB   r;   r>   r>      s         E
 %"- C FZ00E'	::O5 5 5  ^ ^ ^ ^ ^ ^rB   r>   )rF   r   r   r   numpyr   r   libr    r   SingleFrameReaderBaser   
WriterBaser>   rI   rB   r;   <module>r      s   2   
			                      O/ O/ O/ O/ O/$, O/ O/ O/dC C C C C$/ C C C C CrB   