B
    âêõb4R  ã               @   sÌ   d Z ddlmZmZmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZ G dd„ deƒZejejejejejejejej ej!ej"ej#ej$ej%ej&ej'ej(ej)dœe_*d	S )
zn
This module contains the following classes:

   TinkerAnalout - Reads the output from the "analyze" command

é    )Úprint_functionÚabsolute_importÚdivision)Úrange)ÚTinkerError)ÚAtomListÚBondListÚ	AngleListÚStretchBendListÚUreyBradleyListÚOutOfPlaneBendListÚOutOfPlaneDistListÚTorsionAngleListÚPiTorsionListÚTorsionTorsionListÚAtomicMultipoleListÚDipolePolarizabilityListÚTorsionTorsionGridc               @   sö   e Zd ZdZdddddddd	d
dddddddddddddddœZdGd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/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Zd?d@„ ZdAdB„ ZdCdD„ ZdEdF„ ZdS )HÚTinkerAnaloutz> Reads the output of "analyze" to determine system parameters ÚnatomÚnorbitÚnbondÚnbpiÚnangleÚnstrbndÚnureyÚnangangÚnopbendÚnopdistÚnipropÚnitorsÚntorsÚnpitorsÚnstrtorÚntortorÚnionÚndipoleÚnpoleÚpair12Úpair13Úpair14Úpair15)zAtoms in SystemzPisystem AtomszBond StretcheszConjugated Pi-BondszAngle BendszStretch-BendszUrey-BradleyzAngle-AngleszOut-of-Plane BendszOut-of-Plane DistanceszImproper DihedralszImproper TorsionszTorsional AngleszPi-Orbital TorsionszStretch-TorsionszTorsion-TorsionszAtomic Partial ChargeszBond Dipole MomentszPolarizable MultipoleszNumber of 1-2 PairszNumber of 1-3 PairszNumber of 1-4 PairszNumber of 1-5 PairsNc             C   s   |d k	r|   |¡ d S )N)Úread)ÚselfÚfname© r/   ú3lib/python3.7/site-packages/parmed/tinker/system.pyÚ__init__-   s    zTinkerAnalout.__init__c             C   s:  t dddddddddddddddddddddddd| _|| _t| jdƒ}zÞ| ¡ }x,|shtd| ƒ‚| ¡  d¡rxP | ¡ }qXW x&| ¡  d¡sª|s tdƒ‚| ¡ }q†W | ¡  | ¡ }xº| ¡ rvyt	j
|dd	…  ¡  }W n" tk
r   td
| ƒ‚Y nX yt|d	d…  ¡ ƒ| j|< W nF tk
rN   td|| ¡ f ƒ‚Y n tk
rj   tdƒ‚Y nX | ¡ }q¾W d}x| jD ]}|| j| 7 }q„W |dkr®tdƒ‚x*| ¡ dkrØ|sÌtdƒ‚| ¡ }q°W t	 | |¡ x@| ¡ }y| j| ¡  | |ƒ W n tk
r    P Y nX qèW W d| ¡  X dS )z Reads the analout file r   )r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   Úrz)Could not find the TINKER watermark in %sz###            TINKERz'Total Numbers of Atoms and Interactionsz!Could not find the atom/ixn countNé   zUnrecognized pointer keyword %sz(Could not convert pointer %s to int [%s]z$Should not be here -- internal errorzAll pointers are 0z!Atom Type Definition Parameters :z0Unexpected EOF when looking for atom definitions)ÚdictÚpointersr.   ÚopenÚreadliner   ÚlstripÚ
startswithÚstripr   Úatom_inter_flagsÚKeyErrorÚintÚ
ValueErrorÚrstripÚ	ExceptionÚ_read_atom_definitionsÚ_functionmapÚclose)r-   r.   ÚfÚlineÚkeyÚsr/   r/   r0   r,   1   sh    

zTinkerAnalout.readc             C   sú   t ƒ | _| ¡  | ¡  | ¡  | ¡ }xÌt| jd ƒD ]º}yht|d d… ƒ}| j |dd… |dd… |dd… |dd… |dd… |dd	… |d
d …  ¡ ¡ W n$ tk
rÈ   t	d| 
¡  ƒ‚Y nX | ¡ }||d kr8t	d|d |f ƒ‚q8W d S )Nr   é   é   é   é   é   é"   é,   é1   é6   z%Error parsing atomic properties
	[%s]é   zAtom number mismatch [%d vs %d])r   Ú	atom_listr7   r   r5   r=   Úaddr:   r>   r   r?   )r-   rD   rE   ÚiÚatnumr/   r/   r0   rA   w   s$      (*z$TinkerAnalout._read_atom_definitionsc          
   C   sø   t | dƒstdƒ‚| ¡  | ¡  | ¡  | ¡ }xÀt| jd ƒD ]®}ydt|dd… ƒ t|dd… ƒ}| j|  |dd	… |d	d
… |dd… |dd… |dd… ¡ W n tk
rÆ   t	dƒ‚Y nX | ¡ }||d krBt	d|d |f ƒ‚qBW dS )z$ Reads the van der Waals parameters rR   z-Atom definitions must be loaded prior to vdW!r   r   rH   é	   é   é   é    é*   é+   é5   é?   é@   éJ   z Error parsing van der Waals termrQ   z&Atom number mismatch in vdW [%d vs %d]N)
ÚhasattrÚAttributeErrorr7   r   r5   r=   rR   Zadd_vdwr>   r   )r-   rD   rE   rT   rU   r/   r/   r0   Ú	_read_vdwŒ   s&    
  
zTinkerAnalout._read_vdwc          	   C   sÔ   t ƒ | _| ¡  | ¡  | ¡  | ¡ }x¦t| jd ƒD ]”}yjt|dd… ƒ t|dd… ƒd }t|dd… ƒd }| j | j| | j| |dd	… |d	d
… ¡ W n tk
rÂ   t	dƒ‚Y nX | ¡ }q8W dS )z! Reads the bond stretching terms r   r   rH   rV   rW   rQ   rK   é(   é2   é<   zError parsing bonded termN)
r   Z	bond_listr7   r   r5   r=   rS   rR   r>   r   )r-   rD   rE   rT   Úat1Úat2r/   r/   r0   Ú_read_bonds£   s      zTinkerAnalout._read_bondsc             C   s  t ƒ | _| ¡  | ¡  | ¡  | ¡ }xÖt| jd ƒD ]Ä}yšt|dd… ƒ t|dd… ƒd }t|dd… ƒd }t|dd… ƒd }| j | j| | j| | j| |d	d
… |d
d… |dd… |dd… ¡ W n tk
rò   t	dƒ‚Y nX | ¡ }q8W dS )z" Reads the angle stretching terms r   r   rH   rV   rW   rQ   rK   r3   rc   rd   re   éC   éE   NzError parsing angle term)
r	   Z
angle_listr7   r   r5   r=   rS   rR   r>   r   )r-   rD   rE   rT   rf   rg   Úat3r/   r/   r0   Ú
_read_angs´   s"      &zTinkerAnalout._read_angsc             C   s  t ƒ | _| ¡  | ¡  | ¡  | ¡ }xÖt| jd ƒD ]Ä}yšt|dd… ƒ t|dd… ƒd }t|dd… ƒd }t|dd… ƒd }| j | j| | j| | j| |dd	… |d	d
… |d
d… |dd… ¡ W n tk
rò   t	dƒ‚Y nX | ¡ }q8W dS )z Reads the stretch-bend terms r   r   rH   rV   rW   rQ   rK   r3   rc   rd   re   éF   zError parsing stretch-bend termN)
r
   Zstretchbend_listr7   r   r5   r=   rS   rR   r>   r   )r-   rD   rE   rT   rf   rg   rk   r/   r/   r0   Ú_read_strbndÇ   s$      zTinkerAnalout._read_strbndc          	   C   s  t ƒ | _| ¡  | ¡  | ¡  | ¡ }xØt| jd ƒD ]Æ}yœt|dd… ƒ t|dd… ƒd }t|dd… ƒd }yt|dd… ƒd }W n tk
r¦   |}Y nX | j | j| | j| |d	d
… |d
d… ¡ W n tk
rô   t	dƒ‚Y nX | ¡ }q8W dS )z Reads the urey-bradley terms r   r   rH   rV   rW   rQ   rK   r3   rM   rd   re   zError parsing Urey-Bradley termN)
r   Zureybrad_listr7   r   r5   r=   r>   rS   rR   r   )r-   rD   rE   rT   rf   rg   rk   r/   r/   r0   Ú_read_ureybradÜ   s&      
zTinkerAnalout._read_ureybradc          
   C   s  t ƒ | _| ¡  | ¡  | ¡  | ¡ }xÔt| jd ƒD ]Â}y˜t|dd… ƒ t|dd… ƒd }t|dd… ƒd }t|dd… ƒd }t|dd	… ƒd }| j | j| | j| | j| | j| |d
d… ¡ W n tk
rð   t	dƒ‚Y nX | ¡ }q8W dS )z& Reads the out-of-plane bending terms r   r   rH   rV   rW   rQ   rK   r3   é!   rZ   é4   z'Error parsing out-of-plane bending termN)
r   Zoopbend_listr7   r   r5   r=   rS   rR   r>   r   )r-   rD   rE   rT   rf   rg   rk   Úat4r/   r/   r0   Ú_read_opbendõ   s$      zTinkerAnalout._read_opbendc          
   C   s  t ƒ | _| ¡  | ¡  | ¡  | ¡ }xÔt| jd ƒD ]Â}y˜t|dd… ƒ t|dd… ƒd }t|dd… ƒd }t|dd… ƒd }t|dd	… ƒd }| j | j| | j| | j| | j| |d
d… ¡ W n tk
rð   t	dƒ‚Y nX | ¡ }q8W dS )z+ Read the out-of-plane distance parameters r   r   rH   rV   rW   rQ   rK   r3   rp   rZ   rq   z(Error parsing out-of-plane distance termN)
r   Zoopdist_listr7   r   r5   r=   rS   rR   r>   r   )r-   rD   rE   rT   rf   rg   rk   rr   r/   r/   r0   Ú_read_opdist	  s$      zTinkerAnalout._read_opdistc       	   	   C   s  t ƒ | _| ¡  | ¡  | ¡  | ¡ }xæt| jd ƒD ]Ô}y¨t|dd… ƒ t|dd… ƒd }t|dd… ƒd }t|dd… ƒd }t|dd	… ƒd }|d	d
…  dd¡ ¡ }| j | j	| | j	| | j	| | j	| |¡ W n t
k
r   tdƒ‚Y nX | ¡ }q8W d
S )z# Read the torsion-angle parameters r!   r   rH   rV   rW   rQ   rK   r3   rp   Nú/ú z Error parsing torsion angle term)r   Ztorangle_listr7   r   r5   r=   ÚreplaceÚsplitrS   rR   r>   r   )	r-   rD   rE   rT   rf   rg   rk   rr   Ztermsr/   r/   r0   Ú_read_torang  s&      
zTinkerAnalout._read_torangc          	   C   sÊ   t ƒ | _| ¡  | ¡  | ¡  | ¡ }xœt| jd ƒD ]Š}y`t|dd… ƒ t|dd… ƒd }t|dd… ƒd }| j | j| | j| |dd	… ¡ W n tk
r¸   t	d
ƒ‚Y nX | ¡ }q8W dS )z( Read the Pi-Orbital Torsion parameters r"   r   rH   rV   rW   rQ   rK   rc   rd   zError parsing pi-torsion termN)
r   Zpitors_listr7   r   r5   r=   rS   rR   r>   r   )r-   rD   rE   rT   rf   rg   r/   r/   r0   Ú_read_pitors4  s      zTinkerAnalout._read_pitorsc          
   C   s   t ƒ | _| ¡  | ¡  | ¡  | ¡ }xpt| jd ƒD ]\}yÎt|dd… ƒ t|dd… ƒd }t|dd… ƒd }t|dd… ƒd }t|dd	… ƒd }t|d	d
… ƒd }t|dd… ƒ}	t|dd… ƒ}
| j | j| | j| | j| | j| | j| |	|
¡ W n tk
r,   t	dƒ‚Y nX | ¡ }t
| ¡ ƒdkr:g }x:t|	|
 ƒD ]*}| tdd„ | ¡ D ƒƒ¡ | ¡ }qXW t |¡| jd _q:W dS )z% Read the Torsion-Torsion parameters r$   r   rH   rV   rW   rQ   rK   r3   rp   é'   rO   é7   é=   z"Error parsing torsion-torsion termé   c             S   s   g | ]}t |ƒ‘qS r/   )Úfloat)Ú.0Úxr/   r/   r0   ú
<listcomp>a  s    z/TinkerAnalout._read_tortors.<locals>.<listcomp>éÿÿÿÿN)r   Ztortor_listr7   r   r5   r=   rS   rR   r>   r   Úlenrx   ÚappendÚtupler   ÚnewÚtype)r-   rD   rE   rT   rf   rg   rk   rr   Zat5Zdim1Zdim2ZgridvalsÚjr/   r/   r0   Ú_read_tortorsE  s6      zTinkerAnalout._read_tortorsc          	   C   sŽ  t ƒ | _| ¡  | ¡  | ¡  | ¡ }x^t| jd ƒD ]J}yt|dd… ƒ t|dd… ƒd }|dd… |dd	… |d	d
… g}|dd… }|dd… g}| ¡ }| |dd… |dd… |dd… g¡ | ¡ }| |dd… ¡ | ¡ }| |dd… |dd… g¡ | ¡ }| |dd… |dd… |dd… g¡ | j | j	| |||¡ W n t
k
r|   tdƒ‚Y nX | ¡ }q:W dS )z Read the atomic multipoles r'   r   rH   rV   rW   rQ   é   é   é   é%   rc   é0   rd   é;   éD   éM   zError parsing multipole termN)r   Zmultipole_listr7   r   r5   r=   Úextendr…   rS   rR   r>   r   )r-   rD   rE   rT   ÚatÚframeZtypestrZmomentsr/   r/   r0   Ú_read_multipolese  s2      "((zTinkerAnalout._read_multipolesc          	   C   s¼   t ƒ | _| ¡  | ¡  | ¡  | ¡ }xŽt| jd ƒD ]|}yRt|dd… ƒ t|dd… ƒd }| j | j| |dd… |d	d
…  ¡ ¡ W n t	k
rª   t
dƒ‚Y nX | ¡ }q8W d
S )z% Read atomic dipole polarizabilities r'   r   rH   rV   rW   rQ   é   é#   rc   Nz%Error parsing dipole polarizabilities)r   Zdipole_listr7   r   r5   r=   rS   rR   rx   r>   r   )r-   rD   rE   rT   r”   r/   r/   r0   Ú_read_dipoles‚  s      zTinkerAnalout._read_dipolesc             C   s„   |  ¡  |  ¡ }xn| ¡ r~ytj|dd…  }W n, tk
r\   td|dd…  ¡  ƒ‚Y nX t|dd… ƒ| j|< |  ¡ }qW dS )z8 Reads the number of interactions present in the system rQ   é   z,Unrecognized token in interaction count [%s]rK   N)r7   r:   r   r;   r<   r   r=   r5   )r-   rD   rE   rF   r/   r/   r0   Ú_read_interactions’  s    
z TinkerAnalout._read_interactionsc             C   s‚   t ƒ | _| ¡  | ¡ }xdt| jd ƒD ]R}t|dd… ƒd t|dd… ƒd  }}| j | j| | j| f¡ | ¡ }q(W d S )Nr(   r   é   rQ   r‹   )ÚsetZpair12_listr7   r   r5   r=   rS   rR   )r-   rD   rE   rT   rf   rg   r/   r/   r0   Ú_read_12pairs   s    *zTinkerAnalout._read_12pairsc             C   s‚   t ƒ | _| ¡  | ¡ }xdt| jd ƒD ]R}t|dd… ƒd t|dd… ƒd  }}| j | j| | j| f¡ | ¡ }q(W d S )Nr)   r   rœ   rQ   r‹   )r   Zpair13_listr7   r   r5   r=   rS   rR   )r-   rD   rE   rT   rf   rg   r/   r/   r0   Ú_read_13pairsª  s    *zTinkerAnalout._read_13pairsc             C   s‚   t ƒ | _| ¡  | ¡ }xdt| jd ƒD ]R}t|dd… ƒd t|dd… ƒd  }}| j | j| | j| f¡ | ¡ }q(W d S )Nr*   r   rœ   rQ   r‹   )r   Zpair14_listr7   r   r5   r=   rS   rR   )r-   rD   rE   rT   rf   rg   r/   r/   r0   Ú_read_14pairs´  s    *zTinkerAnalout._read_14pairsc             C   s‚   t ƒ | _| ¡  | ¡ }xdt| jd ƒD ]R}t|dd… ƒd t|dd… ƒd  }}| j | j| | j| f¡ | ¡ }q(W d S )Nr+   r   rœ   rQ   r‹   )r   Zpair15_listr7   r   r5   r=   rS   rR   )r-   rD   rE   rT   rf   rg   r/   r/   r0   Ú_read_15pairs¾  s    *zTinkerAnalout._read_15pairsc             C   s   | j S )N)r.   )r-   r/   r/   r0   Ú__str__Ê  s    zTinkerAnalout.__str__c             C   s   d| j d  S )Nz<TinkerAnalout; %d atoms>r   )r5   )r-   r/   r/   r0   Ú__repr__Í  s    zTinkerAnalout.__repr__)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r;   r1   r,   rA   rb   rh   rl   rn   ro   rs   rt   ry   rz   rŠ   r–   r™   r›   rž   rŸ   r    r¡   r¢   r£   r/   r/   r/   r0   r      s\   
F 


r   )zVan der Waals Parameters :zBond Stretching Parameters :zAngle Bending Parameters :zStretch-Bend Parameters :zUrey-Bradley Parameters :z!Out-of-Plane Bending Parameters :z"Out-of-Plane Distance Parameters :zTorsional Angle Parameters :zPi-Orbital Torsion Parameters :zTorsion-Torsion Parameters :zAtomic Multipole Parameters :z"Dipole Polarizability Parameters :z+List of 1-2 Connected Atomic Interactions :z+List of 1-3 Connected Atomic Interactions :z+List of 1-4 Connected Atomic Interactions :z+List of 1-5 Connected Atomic Interactions :z.Total Number of Pairwise Atomic Interactions :N)+r§   Z
__future__r   r   r   Zparmed.utils.six.movesr   Zparmed.exceptionsr   Zparmed.tinker.topologyobjectsr   r   r	   r
   r   r   r   r   r   r   r   r   r   Úobjectr   rb   rh   rl   rn   ro   rs   rt   ry   rz   rŠ   r–   r™   rž   rŸ   r    r¡   r›   rB   r/   r/   r/   r0   Ú<module>   s2   <   L