B
    bC8                 @   s  d Z ddlmZ ddlmZmZ ddlmZ G dd deZ	G dd de
ZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZG d%d& d&eZG d'd( d(eZG d)d* d*eZG d+d, d,eZG d-d. d.eZG d/d0 d0eZG d1d2 d2eZ G d3d4 d4eZ!G d5d6 d6eZ"G d7d8 d8eZ#d9S ):z;
Contains all of the class objects for the Tinker topology
    )division)rangezip)OrderedDictc               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Atomz An atom in the system c             C   sR   t | | _t|| _t|| _t|| _t|| _t|| _	t | | _
d S )N)strstripsymbolinttypeclass_atomic_numberfloatmassvalencedesc)selfr	   type_r   r   r   r   r    r   <lib/python3.7/site-packages/parmed/tinker/topologyobjects.py__init__   s    




zAtom.__init__c             C   sr   t || _t || _t| s(d| _n
t || _t| sFd| _n
t || _t| sdd| _n
t || _dS )z& Adds van der Waals terms to the atom N)r   radiusepsilonr   r   radius14	epsilon14	reduction)r   r   r   r   r   r   r   r   r   add_vdw   s    



zAtom.add_vdwc             C   s   d| j | j| j| jf S )Nz <Atom %s [#%d]; Mass=%.2f; "%s">)r	   r   r   r   )r   r   r   r   __repr__'   s    zAtom.__repr__c             C   s   d| j | j| j| j| j| j| jf }t| drj|d| j| j	f 7 }| j
d k	sV| jd k	rj|d| j
| jf 7 }| jd k	r|d| j 7 }|S )Nz^Atom %s [#%s] %s
   Type:        %d
   Class:       %d
   Mass:        %.2f
   Valence:     %dr   z*
   vdW Rad:     %.2f
   vdW Eps:     %.2fz*
   vdW 1-4 Rad: %.2f
   vdW 1-4 Eps: %.2fz
   vdW Reduct:  %.2f)r	   r   r   r   r   r   r   hasattrr   r   r   r   r   )r   retstrr   r   r   __str__+   s    

zAtom.__str__N)__name__
__module____qualname____doc__r   r   r   r    r   r   r   r   r      s
   
r   c                   s@   e Zd ZdZdZ fddZdd Z fddZd	d
 Z  Z	S )_ParamTypeListz
    A list for all types of parameters. This should be subclassed for each
    parameter type that's necessary. It performs type checking as well as other
    tasks.
    Nc                s   t t|   d S )N)superr%   r   )r   )	__class__r   r   r   K   s    z_ParamTypeList.__init__c             O   s   |  | j|| d S )N)append	typeclass)r   argskwargsr   r   r   addN   s    z_ParamTypeList.addc                s:   t || js&td| jjt| jf tt| | d S )Nz"Can only append "%s" objects to %s)
isinstancer)   	TypeErrorr!   r   r&   r%   r(   )r   thing)r'   r   r   r(   Q   s    z_ParamTypeList.appendc             C   s   x|D ]}|  | qW d S )N)r(   )r   Zthingsr/   r   r   r   extendW   s    
z_ParamTypeList.extend)
r!   r"   r#   r$   r)   r   r,   r(   r0   __classcell__r   r   )r'   r   r%   B   s   r%   c               @   s   e Zd ZdZeZdS )AtomListz List for Atom instances N)r!   r"   r#   r$   r   r)   r   r   r   r   r2   [   s   r2   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	BondStretchz A bond-stretching term c             C   s$   || _ || _t|| _t|| _d S )N)atom1atom2r   kreq)r   r4   r5   r6   r7   r   r   r   r   a   s    
zBondStretch.__init__c             C   s$   dt | j| jj| jj| j| jf S )Nz<%s [%s-%s]; k=%.2f; Req=%.2f>)r   r!   r4   r	   r5   r6   r7   )r   r   r   r   r   g   s    
zBondStretch.__repr__c             C   s    dt | j| j| j| j| jf S )Nz(%s %r --- %r
     K = %.4f
   Req = %.4f)r   r!   r4   r5   r6   r7   )r   r   r   r   r    k   s    zBondStretch.__str__N)r!   r"   r#   r$   r   r   r    r   r   r   r   r3   _   s   r3   c               @   s   e Zd ZeZdS )BondListN)r!   r"   r#   r3   r)   r   r   r   r   r8   r   s   r8   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )		AngleBendz An angle-bending term c             C   sV   || _ || _|| _t|| _t|| _t| r>t|| _nd | _| pNd| _	d S )NZHarmonic)
r4   r5   atom3r   r6   theteqr   r   foldr   )r   r4   r5   r:   r6   r;   r<   r   r   r   r   r   w   s    

zAngleBend.__init__c             C   sH   d| j j| jj| jj| j| jf }| jd k	r:|d| j 7 }|d| j  S )Nz,<AngleBend [%s-%s-%s]; k=%.2f; Theta_eq=%.2fz; fold=%.1fz; %s>)r4   r	   r5   r:   r6   r;   r<   r   )r   r   r   r   r   r      s    
zAngleBend.__repr__c             C   sB   d| j | j| j| j| jf }| jd k	r4|d| j 7 }|d| j  S )Nz7AngleBend %r --- %r --- %r
     K = %.4f
 Theta = %.4f
z  Fold = %.1f
z  Type = %s)r4   r5   r:   r6   r;   r<   r   )r   r   r   r   r   r       s    
zAngleBend.__str__N)r!   r"   r#   r$   r   r   r    r   r   r   r   r9   u   s   	r9   c               @   s   e Zd ZeZdS )	AngleListN)r!   r"   r#   r9   r)   r   r   r   r   r=      s   r=   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	StretchBendz A stretch-bending term c             C   s>   || _ || _|| _t|| _t|| _t|| _t|| _d S )N)r4   r5   r:   r   r6   r;   r1eqr2eq)r   r4   r5   r:   r6   r;   r?   r@   r   r   r   r      s    


zStretchBend.__init__c             C   s*   d| j j| jj| jj| j| j| j| jf S )NzE<StretchBend [%s-%s-%s]; k=%.2f; Theta_eq=%.2f; R1eq=%.2f; R2eq=%.2f>)r4   r	   r5   r:   r6   r;   r?   r@   )r   r   r   r   r      s    zStretchBend.__repr__c             C   s$   d| j | j| j| j| j| j| jf S )NzTStretchBend %r --- %r --- %r
     K = %.4f
 Theta = %.4f
  R1eq = %.4f
  R2eq = %.4f)r4   r5   r:   r6   r;   r?   r@   )r   r   r   r   r       s    zStretchBend.__str__N)r!   r"   r#   r$   r   r   r    r   r   r   r   r>      s   	r>   c               @   s   e Zd ZeZdS )StretchBendListN)r!   r"   r#   r>   r)   r   r   r   r   rA      s   rA   c               @   s   e Zd ZdZdS )UreyBradleyzA A urey-bradley term -- functionally identical to a bond-stretch N)r!   r"   r#   r$   r   r   r   r   rB      s   rB   c               @   s   e Zd ZeZdS )UreyBradleyListN)r!   r"   r#   rB   r)   r   r   r   r   rC      s   rC   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	OutOfPlaneBendz An out-of-plane bending term c             C   s&   || _ || _|| _|| _t|| _d S )N)r4   r5   r:   atom4r   r6   )r   r4   r5   r:   rE   r6   r   r   r   r      s
    zOutOfPlaneBend.__init__c             C   s,   dt | j| jj| jj| jj| jj| jf S )Nz<%s [%s-%s-%s-%s]; k=%.2f>)r   r!   r4   r	   r5   r:   rE   r6   )r   r   r   r   r      s    zOutOfPlaneBend.__repr__c             C   s$   dt | j| j| j| j| j| jf S )Nz&%s %r --- %r --- %r --- %r
   K = %.2f)r   r!   r4   r5   r:   rE   r6   )r   r   r   r   r       s    zOutOfPlaneBend.__str__N)r!   r"   r#   r$   r   r   r    r   r   r   r   rD      s   rD   c               @   s   e Zd ZeZdS )OutOfPlaneBendListN)r!   r"   r#   rD   r)   r   r   r   r   rF      s   rF   c               @   s   e Zd ZdZdS )OutOfPlaneDistz? An out-of-plane distance (functionally equivalent to OOP Bend N)r!   r"   r#   r$   r   r   r   r   rG      s   rG   c               @   s   e Zd ZeZdS )OutOfPlaneDistListN)r!   r"   r#   rG   r)   r   r   r   r   rH      s   rH   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	TorsionAnglez Torsional Angle parameter c                s   || _ || _|| _|| _t d dkr0tdt d }t fddt|D | _t fddt|D | _	t fddt|D | _
t| jt| j	kst| jt| j
krtdd S )	N   r   zNTorsionAngle expects an equal number of Amplitudes, phases, and periodicities.c                s   g | ]}t  d |  qS )rJ   )r   ).0i)r*   r   r   
<listcomp>   s    z)TorsionAngle.__init__.<locals>.<listcomp>c                s    g | ]}t  d | d  qS )rJ      )r   )rK   rL   )r*   r   r   rM      s    c                s    g | ]}t  d | d  qS )rJ      )r
   )rK   rL   )r*   r   r   rM      s    z+BUGBUG!! Inconsistent # of terms in torsion)r4   r5   r:   rE   lenr.   tupler   	amplitudephaseperiodicityRuntimeError)r   r4   r5   r:   rE   r*   Zntermsr   )r*   r   r      s    zTorsionAngle.__init__c             C   sZ   t | jdkr.d| jj| jj| jj| jjf S d| jj| jj| jj| jj| j| j| jf S )Nr   z&<TorsionAngle [%s-%s-%s-%s]; No Terms>z7<TorsionAngle [%s-%s-%s-%s]; Ampl=%s; Phase=%s; Per=%s>)	rP   rR   r4   r	   r5   r:   rE   rS   rT   )r   r   r   r   r      s    zTorsionAngle.__repr__c             C   s   t | jdkr&d| j| j| j| jf S d| j| j| j| jf }tt | j}x@tt|| j| j	| j
D ]$\}}}}|d|d |||f 7 }qfW |S )Nr   z0TorsionAngle %r --- %r --- %r --- %r
   No Termsz$TorsionAngle %r --- %r --- %r --- %rzG
   Term %d
   Amplitude = %.4f
       Phase = %.4f
 Periodicity = %.4frN   )rP   rR   r4   r5   r:   rE   r   	enumerater   rS   rT   )r   r   seqrL   ZamprS   Zperr   r   r   r       s    
zTorsionAngle.__str__N)r!   r"   r#   r$   r   r   r    r   r   r   r   rI      s   rI   c               @   s   e Zd ZeZdS )TorsionAngleListN)r!   r"   r#   rI   r)   r   r   r   r   rX   
  s   rX   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )		PiTorsionz  A Pi-Orbital Torsion parameter c             C   s   || | _ | _t|| _d S )N)r4   r5   r   rR   )r   r4   r5   rR   r   r   r   r     s    zPiTorsion.__init__c             C   s   d| j j| jj| jf S )Nz<PiTorsion [%s-%s]; Ampl=%.2f>)r4   r	   r5   rR   )r   r   r   r   r     s    zPiTorsion.__repr__c             C   s   d| j | j| jf S )Nz'PiTorsion %r --- %r
   Amplitude = %.4f)r4   r5   rR   )r   r   r   r   r      s    zPiTorsion.__str__N)r!   r"   r#   r$   r   r   r    r   r   r   r   rY     s   rY   c               @   s   e Zd ZeZdS )PiTorsionListN)r!   r"   r#   rY   r)   r   r   r   r   rZ     s   rZ   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	TorsionTorsionz) A coupled-torsion parameter (like CMAP) c             C   s6   || _ || _|| _|| _|| _t|| _t|| _d S )N)r4   r5   r:   rE   atom5r
   spline1spline2)r   r4   r5   r:   rE   r\   r]   r^   r   r   r   r      s    
zTorsionTorsion.__init__c             C   s.   d| j j| jj| jj| jj| jj| j| jf S )Nz1<TorsionTorsion [%s-%s-%s-%s-%s]; Spline=(%d,%d)>)r4   r	   r5   r:   rE   r\   r]   r^   )r   r   r   r   r   )  s    zTorsionTorsion.__repr__c             C   s$   d| j | j| j| j| j| j| jf S )Nz^TorsionTorsion %r --- %r --- %r ---
                      %r --- %r
   Spline Grid = (%d x %d))r4   r5   r:   rE   r\   r]   r^   )r   r   r   r   r    0  s    zTorsionTorsion.__str__N)r!   r"   r#   r$   r   r   r    r   r   r   r   r[     s   	r[   c               @   s   e Zd ZeZdS )TorsionTorsionListN)r!   r"   r#   r[   r)   r   r   r   r   r_   8  s   r_   c               @   sF   e Zd ZdZe Zedd Zdd Zdd Z	dd	 Z
e
 Z ZZd
S )TorsionTorsionGrida6  
    The interpolation grid of a coupled-torsion correction map. Every unique
    grid is cached and if a duplicate grid is instantiated, a reference to the
    original grid is returned. As a result, all unique TorsionTorsionGrid
    instances are singletons and should be compared for equality with "is"
    c             C   sX   |  }x$|D ]}|d |t |d d < qW xtjD ]}||kr4|S q4W tj| |S )NrO   )rQ   r`   	_typelistr(   )clsdatainstdZttgr   r   r   newE  s    
zTorsionTorsionGrid.newc             C   sB   |   |  krdS x(| D ] }t| | ||  dkrdS qW dS )NFg:0yE>T)keysabs)r   otherkeyr   r   r   __eq__Q  s     
 zTorsionTorsionGrid.__eq__c             C   s
   | |k S )Nr   )r   ri   r   r   r   __ne__W  s    zTorsionTorsionGrid.__ne__c             C   s   t dd S )Nz1TorsionTorsionGrid instances are not well-ordered)NotImplemented)r   ri   r   r   r   __gt__[  s    zTorsionTorsionGrid.__gt__N)r!   r"   r#   r$   listra   classmethodrf   rk   rl   rn   __lt____ge____le__r   r   r   r   r`   ;  s   r`   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	AtomicMultipolez Atomic multipole parameter c             C   s4   || _ dd |D | _| | _dd |D | _d S )Nc             S   s    g | ]}t | rt|qS r   )r   r   r
   )rK   rL   r   r   r   rM   d  s    z,AtomicMultipole.__init__.<locals>.<listcomp>c             S   s   g | ]}t |qS r   )r   )rK   xr   r   r   rM   f  s    )atomframer   
definitionmoment)r   rv   rw   rx   Zmomentsr   r   r   r   b  s    
zAtomicMultipole.__init__c             C   s   d| j j| j| j| jf S )Nz/<AtomicMultipole [%s] %s; Frame=%s; Moments=%s>)rv   r	   rx   rw   ry   )r   r   r   r   r   h  s    
zAtomicMultipole.__repr__c             C   sd   d| j | j| j| jd | jd | jd | jd | jd | jd | jd | jd	 | jd
 | jd f S )NzAtomicMultipole %r "%s"
     Frame = %s
   Moments = %8.5f
             %8.5f %8.5f %8.5f
             %8.5f
             %8.5f %8.5f
             %8.5f %8.5f %8.5fr   rN   rO   rJ                  	   )rv   rx   rw   ry   )r   r   r   r   r    n  s    zAtomicMultipole.__str__N)r!   r"   r#   r$   r   r   r    r   r   r   r   rt   `  s   rt   c               @   s   e Zd ZeZdS )AtomicMultipoleListN)r!   r"   r#   rt   r)   r   r   r   r   r   }  s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	DipolePolarizabilityz# A dipole polarizability parameter c             C   s$   || _ t|| _dd |D | _d S )Nc             S   s   g | ]}t |qS r   )r
   )rK   gr   r   r   rM     s    z1DipolePolarizability.__init__.<locals>.<listcomp>)rv   r   alphagroup)r   rv   r   r   r   r   r   r     s    
zDipolePolarizability.__init__c             C   s   d| j j| j| jf S )Nz1<DipolePolarizability [%s]; Alpha=%.2f; Group=%s>)rv   r	   r   r   )r   r   r   r   r     s    zDipolePolarizability.__repr__c             C   s   d| j | j| jf S )Nz7DipolePolarizability %r
    Alpha = %.4f
    Group = %s)rv   r   r   )r   r   r   r   r      s    zDipolePolarizability.__str__N)r!   r"   r#   r$   r   r   r    r   r   r   r   r     s   r   c               @   s   e Zd ZeZdS )DipolePolarizabilityListN)r!   r"   r#   r   r)   r   r   r   r   r     s   r   N)$r$   Z
__future__r   Zparmed.utils.six.movesr   r   collectionsr   objectr   ro   r%   r2   r3   r8   r9   r=   r>   rA   rB   rC   rD   rF   rG   rH   rI   rX   rY   rZ   r[   r_   r`   rt   r   r   r   r   r   r   r   <module>   s:   :!0%