B
    bm                 @   s   d dl mZ d dlZd dlZd dlZd dlmZ d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dS )    )print_functionN)datetimez!Marcin Kowiel, Dariusz Brzezinskic               @   s   e Zd ZdddZedd Zedd Zedd	 Zd
d Zdd Z	dd Z
dd Zdd Zedd Zedd Zedd Zedd ZdS )PrinterBaseTc             C   s
   || _ d S )N)override_sigma)selfr    r   3lib/python3.7/site-packages/restraintlib/printer.py__init__   s    zPrinterBase.__init__c             C   s   d S )Nr   )cls	hierarchyr   r   r   validate   s    zPrinterBase.validatec             C   s   dS )N r   )r
   r   r   r   header   s    zPrinterBase.headerc             C   s   dS )Nr   r   )r
   r   r   r   footer   s    zPrinterBase.footerc             C   s   |S )Nr   )r   valuer   r   r   angle_sigma_value   s    zPrinterBase.angle_sigma_valuec             C   s   dS )Nr   r   )r   	restraintall_restraintsr   r   r   	get_angle    s    zPrinterBase.get_anglec             C   s   |S )Nr   )r   r   r   r   r   dist_sigma_value#   s    zPrinterBase.dist_sigma_valuec             C   s   dS )Nr   r   )r   r   r   r   r   r   get_dist&   s    zPrinterBase.get_distc             C   sx   g }dd |D }xZ|D ]R}|j |krd}|jdkrB| ||}n|jdkrX| ||}||kr|| qW d|S )Nc             S   s   g | ]}|j D ]
}|jqqS r   )
restraintsname).0groupconditional_restraintr   r   r   
<listcomp>-   s   z0PrinterBase.print_restraints.<locals>.<listcomp>r   angledist
)condition_nametyper   r   appendjoin)r   r   allowed_restraint_groupslinesallowed_condition_namer   liner   r   r   print_restraints)   s    



zPrinterBase.print_restraintsc             C   s   dS )N#r   )r
   r   r   r   header_comment_beginA   s    z PrinterBase.header_comment_beginc             C   s   dS )Nr)   r   )r
   r   r   r   header_comment_endE   s    zPrinterBase.header_comment_endc       
   
   C   s  dg}xF|D ]>}d |d |j}t|dk r8||d< q|d |j qW |  }|  }td |||d td ||||d td |||d td	 |||d td
 |||d td |||d td |||d td |||d td |||d td	 |||d td |||d td |||d td |||d td |||d td	 |||d td |||d td |||d td |||d td |||d td	 |||d td |||d td	 |||d td |||d x2|D ]*}	td ||	ddt|	  ||d q2W td	 |||d td |||d d S )Nr   z{}{}, F   z{}, zM{}#########################################################################{})filezF{}                   RestraintLib version {}                        {}zM{}                                                                         {}zM{} M.Kowiel, D.Brzezinski, M.Jaskolski (2016)                              {}zM{} Conformation-dependent restraints for polynucleotides:                  {}zM{} I. Clustering of the geometry of the phosphodiester group.              {}uO   {} Nucleic Acids Res. 44, 8479–8489.                                       {}zM{} https://doi.org/10.1093/nar/gkw717                                      {}zM{} M.Gilski, J.Zhao, M.Kowiel, D.Brzezinski, D.H.Turner, M.Jaskolski (2019){}zM{} Accurate geometrical restraints for Watson-Crick base pairs.            {}zM{} Acta Cryst. B75, 235-245.                                               {}zM{} https://doi.org/10.1107/S2052520619002002                               {}zM{} M.Kowiel, D.Brzezinski, M. Gilski, M.Jaskolski (2020)                   {}zM{} Conformation-dependent restraints for polynucleotides: The sugar moiety.{}uO   {} Nucleic Acids Res. 48, 962–973.                                         {}zM{} https://doi.org/10.1093/nar/gkz1122                                     {}zM{} Restraints for:                                                         {}z{}  {}{} {} )formatr   lenr"   r*   r+   print)
r
   streamZrestraint_listversionZ
libs_linesresZappended_line
comm_begincomm_endr'   r   r   r   	save_infoI   sF    


*zPrinterBase.save_infoc             C   s`   |   }|  }td|t  |d td|tj	||d td|||d d S )Nz{} Time of creation: {}Z)r.   z{} Input filename: {}zM{}#########################################################################{})
r*   r+   r2   r0   r   ZutcnowZ	isoformatospathbasename)r
   r3   Zin_filenamer6   r7   r   r   r   save_input_filenamer   s
    zPrinterBase.save_input_filenameN)T)__name__
__module____qualname__r	   classmethodr   r   r   r   r   r   r   r(   r*   r+   r8   r<   r   r   r   r   r      s   
)r   c               @   s   e Zd Zedd Zedd Zedd Zedd Zed	d
 Zedd Z	dd Z
edd Zedd Zedd Zedd Zdd ZdS )ShelxPrinterc             C   s   dS )NzREM r   )r
   r   r   r   r*   }   s    z!ShelxPrinter.header_comment_beginc             C   s   dS )Nr   r   )r
   r   r   r   r+      s    zShelxPrinter.header_comment_endc             C   s*   t |j dkr&d|j  S dS )Nr   z^{})stralt_locstripr0   lower)r
   atomr   r   r   _get_alt_loc   s    zShelxPrinter._get_alt_locc             C   s4   t |j }t |j }|dkr(|S d||f S )Nr   z%s:%s)rB   res_idrD   chain_id)r
   rF   residchainidr   r   r   
_get_resid   s    zShelxPrinter._get_residc             C   s~   |j d k	rz|jd k	rzt|j dk r0d|j }nd|j }|jdkr`d||j|j|j|jS d||j|j|j|jS dS )N@   zREM Restraint {}zREM Restraint
REM {}r   z{}
REM {} {} {:.1f} {:.1f}z{}
REM {} {} {:.3f} {:.3f}r   )r    r   r1   r0   r!   r   sigma)r
   r   Zrestraint_condition_name_liner   r   r   _comment   s    
zShelxPrinter._commentc          	   C   sv   |  |}| |}t|j }|dkrh|dkrhd}||j|j |j|j|j||}|	dd nd}|||fS )Nr   zFREM Chain {} and resid {} and name {} and altloc {} renamed to {}_{}{}z  r/   )
rL   rG   rB   rI   rD   r0   rH   	atom_namerC   replace)r
   rF   rJ   Zalt_coderK   remr   r   r   _get_resid_altcode_rem   s     

z#ShelxPrinter._get_resid_altcode_remc             C   s   |j d }|j d }| |\}}}| |\}}	}
| |}g }x8||
|fD ]*}|dkrNx|dD ]}|| qfW qNW |d|j|j|j|||j||	 d	|S )Nr      r   r   z"DFIX {:.3f} {:.3f} {}_{}{} {}_{}{})
atomsrS   rO   splitr"   r0   r   rN   rP   r#   )r   r   r   atom0atom1resid_0
alt_code_0rem_0Zresid_1Z
alt_code_1Zrem_1commentr%   rR   r'   r   r   r   r      s(    


zShelxPrinter.get_distc          	   C   s2   t || ||  d| | t t |  S )N   )mathZsqrtZcosZradians)r
   Zangle_in_degabr   r   r   _deg_to_dist   s    zShelxPrinter._deg_to_distc             C   s<   x6|D ].}|j dkr||jkr||jkr|j|jfS qW dS )Nr   )NN)r!   rU   r   rN   )r
   rW   rX   r   r5   r   r   r   
_find_dist   s
    

zShelxPrinter._find_distc             C   s  |j d k	r|j S |jd }|jd }|jd }|j}|d krDtd| |||\}}| |||\}	}
|d krx|D ]}|jdkrx|jd }|jd }|j|jkrx|j|jkrx|j|jks|j|jks|j|jks|j|jkrxt	|j
|jdd |jD  qxW tdt|t|n|	d krx|D ]}|jdkr,|jd }|jd }|j|jkr,|j|jkr,|j|jks|j|jks|j|jks|j|jkr,t	|j
|jd	d |jD  q,W tdt|t|| |||	S )
Nr   rT   r]   zAngle should not be Noner   c             S   s   g | ]}t |qS r   )rB   )r   rF   r   r   r   r      s    z1ShelxPrinter._val_deg_to_dist.<locals>.<listcomp>zOFor angle restraint the relevant dist restraint should be added (atoms: {}, {})c             S   s   g | ]}t |qS r   )rB   )r   rF   r   r   r   r     s    )Z
value_distrU   r   	Exceptionrb   r!   rI   rH   rP   r2   r    r   r0   rB   ra   )r
   r   r   rW   rX   atom2r   r_   a_sigr`   b_sigr5   Z	res_atom0Z	res_atom1r   r   r   _val_deg_to_dist   sF    








 



"zShelxPrinter._val_deg_to_distc             C   s   |j d k	r|j S |jd }|jd }|jd }|j}|j}| |||\}}	| |||\}
}| |d|  ||
}| |d|  ||
}|| S )Nr   rT   r]   g      ?)Z
sigma_distrU   r   rN   rb   ra   )r
   r   r   rW   rX   rd   r   Zangle_sigmar_   re   r`   rf   Zdist13_plusZdist13_minusr   r   r   _sig_deg_to_dist  s    



zShelxPrinter._sig_deg_to_distc             C   s   |j d }|j d }| |\}}}| |\}}	}
| |}g }x8||
|fD ]*}|dkrNx|dD ]}|| qfW qNW |d| ||| |||j|||j||	 d	|S )Nr   r]   r   r   z"DANG {:.3f} {:.3f} {}_{}{} {}_{}{})
rU   rS   rO   rV   r"   r0   rg   rh   rP   r#   )r   r   r   rW   rd   rY   rZ   r[   Zresid_2Z
alt_code_2Zrem_2r\   r%   rR   r'   r   r   r   r      s(    




zShelxPrinter.get_angleN)r=   r>   r?   r@   r*   r+   rG   rL   rO   rS   r   ra   rb   rg   rh   r   r   r   r   r   rA   |   s   
3rA   c               @   st   e Zd Zedd Zedd Zedd Ze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 )PhenixPrinterc             C   s   dS )Nz&refinement.geometry_restraints.edits {r   )r
   r   r   r   r   =  s    zPhenixPrinter.headerc             C   s   dS )N}r   )r
   r   r   r   r   A  s    zPhenixPrinter.footerc             C   s   |j dkrd|j S dS )Nr   z and altloc {})rC   r0   )r
   rF   r   r   r   rG   E  s    zPhenixPrinter._get_alt_locc             C   s    d |j|j |j| |S )Nz#chain {} and resid {} and name {}{})r0   rI   rH   rD   rP   rG   )r
   rF   r   r   r   	_atom_selI  s
    zPhenixPrinter._atom_selc             C   s   | j r
dS |S )z* Default sigma for angles in PHENIX is 3.0g      @)r   )r   r   r   r   r   r   R  s    zPhenixPrinter.angle_sigma_valuec             C   s   | j r
dS |S )z4 Default sigma for bond distances in PHENIX is 0.020g{Gz?)r   )r   r   r   r   r   r   V  s    zPhenixPrinter.dist_sigma_valuec             C   s   |j |jfdkrdS |jdkrB|jd jdks>|jd jdkrBdS |jdkr|jd jdks||jd jdks||jd jdkrdS d	S )
N))zBase==CytosinedC4C5addr   r   )ZIGZICrT   r   r]   Zchange)r    r   r!   rU   Zres_name)r   kindr   r   r   r   action_typeZ  s    
*
zPhenixPrinter.action_typec             C   s  |j |jd jfdkr t|jS |j |jd jfdkr<|jS |jdkrl|jd jdkrl|jd jdkrl|jS |jdkr|jd jdkr|jd jdkrt|jS |j|j |jd jfdkr|jS |j|j |jd jfdkrt|jS |j |jd jfd	krt|jS |jS )
zY
        Older Phenix requires atoms to be in the right order for action=*change
        r   ))dO3P4P))rp   zO3'r   r   rT   ))zBase==GuaninedC6N1C6)zBase==Thyminerl   C4)zBase==Uracilrl   rt   ))zBase==Cytosinerr   rs   )zBase==Thyminerr   rs   )zBase==Uracilrr   rs   ))ZdO1P4ZOP1)ZdO2P4ZOP2)rp   rq   )ZdO5P4zO5')ZdO3C3zO3')ZdO5C5zC5')rl   rt   )ZdC5N7ZC5)ZdN7C8ZN7)ZdC8N9ZC8)rr   ZN1)zdC4'C5'zC4')zdC3'C4'zC3')zdC1'O4'zC1')zdC1'C2'zC1')zdC2'C3'zC2')zdC5'O5'zC5')ZdC7C5ZC7)r   rU   rP   reversedr!   rC   r    )r   r   r   r   r   atoms_with_fixed_atom_orderl  s$    
**


z)PhenixPrinter.atoms_with_fixed_atom_orderc       
   	   C   s.  g }|j d k	rB|jd k	rB|d|||j |j|j|j|j |d| | ||}|d| x6t| 	|ddD ] \}}|d|| 
| qW |dkrdnd	}|d
|||j |dkr| |jn
| |j}	|d||	 |dkr|d |d d|S )Nz0  # Restraint {{}} {{}} {{}} {{:.{}f}} {{:.{}f}}z  {} {{z    action = *{}rT   )startz    atom_selection_{} = {}bondZdistance_idealZangle_idealz    {} = {{:.{}f}}z    sigma = {{:.{}f}}z    slack = Nonez  }r   )r    r   r"   r0   r!   r   rN   ro   	enumeraterv   rk   r   r   r#   )
r   rn   Zdigit_after_dotr   r%   actionZi_atomrF   Zkeyword_idealrN   r   r   r   _prepare_restraint  s&     


z PhenixPrinter._prepare_restraintc             C   s   |  dd|S )Nrx      )r{   )r   r   r   r   r   r   r     s    zPhenixPrinter.get_distc             C   s   |  dd|S )Nr   rT   )r{   )r   r   r   r   r   r   r     s    zPhenixPrinter.get_angleN)r=   r>   r?   r@   r   r   rG   rk   r   r   ro   rv   r{   r   r   r   r   r   r   ri   ;  s   	8ri   c               @   s4   e Zd Zedd Zedd Zdd Zdd Zd	S )
RefmacPrinterc             C   s   |j dkrd|j S dS )Nr   z altecode {})rC   r0   )r
   rF   r   r   r   rG     s    zRefmacPrinter._get_alt_locc             C   sZ   |j d k	rV|jd k	rV|jdkr:d|j |j|j|j|jS d|j |j|j|j|jS dS )Nr   z"# Restraint {} {} {} {:.1f} {:.1f}z"# Restraint {} {} {} {:.3f} {:.3f}r   )r    r   r!   r0   r   rN   )r
   r   r   r   r   rO     s    
zRefmacPrinter._commentc             C   s   |j d }|j d }g }| |}|dkr4|| d|j|j |j| ||j|j |j| ||j	|j
d}|| d|S )Nr   rT   r   znexte dist first chain {} resi {} atom {}{} second chain {} resi {} atom {}{} value {:.3f} sigma {:.3f} type {}r   )rU   rO   r"   r0   rI   rH   rD   rP   rG   r   rN   r#   )r   r   r   rW   rX   r%   r\   r'   r   r   r   r     s(    




zRefmacPrinter.get_distc       	      C   s   |j d }|j d }|j d }g }| |}|dkr>|| d|j|j |j| ||j|j |j| ||j|j |j| ||j	|j
d}|| d|S )Nr   rT   r]   r   zexte angle first chain {} resi {} atom {}{} next chain {} resi {} atom {}{} next chain {} resi {} atom {}{} value {:.1f} sigma {:.1f} type {}r   )rU   rO   r"   r0   rI   rH   rD   rP   rG   r   rN   r#   )	r   r   r   rW   rX   rd   r%   r\   r'   r   r   r   r     s2    





zRefmacPrinter.get_angleN)r=   r>   r?   r@   rG   rO   r   r   r   r   r   r   r}     s   
r}   c               @   sD   e Zd Zedd Zedd Zdd Zdd Zd	d
 Zdd Z	dS )BusterPrinterc             C   s   |j dkrd|j S dS )Nr   z.{})rC   r0   )r
   rF   r   r   r   rG     s    zBusterPrinter._get_alt_locc             C   sZ   |j d k	rV|jd k	rV|jdkr:d|j |j|j|j|jS d|j |j|j|j|jS dS )Nr   z"# Restraint {} {} {} {:.1f} {:.1f}z"# Restraint {} {} {} {:.3f} {:.3f}r   )r    r   r!   r0   r   rN   )r
   r   r   r   r   rO     s    
zBusterPrinter._commentc             C   s   | j r
dS |S )z* Default sigma for angles in BUSTER is 1.5g      ?)r   )r   r   r   r   r   r   "  s    zBusterPrinter.angle_sigma_valuec             C   s   | j r
dS |S )z4 Default sigma for bond distances in BUSTER is 0.020g{Gz?)r   )r   r   r   r   r   r   &  s    zBusterPrinter.dist_sigma_valuec             C   s   |j d }|j d }g }| |}|dkr4|| d|j| |j|j|j	 |j
| ||j|j	 |j
| |
}|| d|S )Nr   rT   r   z9NOTE BUSTER_DISTANCE ={:.3f} {:.3f} {}|{}:{}{} {}|{}:{}{}r   )rU   rO   r"   r0   r   r   rN   rI   rH   rD   rP   rG   r#   )r   r   r   rW   rX   r%   r\   r'   r   r   r   r   *  s&    





zBusterPrinter.get_distc       	      C   s   |j d }|j d }|j d }g }| |}|dkr>|| d|j| |j|j|j	 |j
| ||j|j	 |j
| ||j|j	 |j
| |}|| d|S )Nr   rT   r]   r   zDNOTE BUSTER_UTILANGLE {:.1f} {:.1f} {}|{}:{}{} {}|{}:{}{} {}|{}:{}{}r   )rU   rO   r"   r0   r   r   rN   rI   rH   rD   rP   rG   r#   )	r   r   r   rW   rX   rd   r%   r\   r'   r   r   r   r   D  s0    






zBusterPrinter.get_angleN)
r=   r>   r?   r@   rG   rO   r   r   r   r   r   r   r   r   r~     s   
r~   c               @   s4   e Zd Zedd Zedd Zdd Zdd Zd	S )

CsvPrinterc             C   s   |j S )N)rC   )r
   rF   r   r   r   rG   g  s    zCsvPrinter._get_alt_locc             C   s   dS )Nztype,condition_name,restraint_name,chain1,resi1,atom1,altloc1,chain2,resi2,atom2,altloc2,chain3,resi3,atom3,altloc3,value,sigmar   )r
   r   r   r   r   k  s    zCsvPrinter.headerc             C   s   |j d }|j d }ddd |j|j|j|j|j |j| 	||j|j |j| 	|ddddd
|jd
|jfD }|S )Nr   rT   ,c             s   s   | ]}t |V  qd S )N)rB   )r   _r   r   r   	<genexpr>t  s    z&CsvPrinter.get_dist.<locals>.<genexpr>r   z{:.3f})rU   r#   r!   r    r   rI   rH   rD   rP   rG   r0   r   rN   )r   r   r   rW   rX   r'   r   r   r   r   o  s$    



zCsvPrinter.get_distc             C   s   |j d }|j d }|j d }ddd |j|j|j|j|j |j| 	||j|j |j| 	||j|j |j| 	|d
|jd
|jfD }|S )Nr   rT   r]   r   c             s   s   | ]}t |V  qd S )N)rB   )r   r   r   r   r   r     s    z'CsvPrinter.get_angle.<locals>.<genexpr>z{:.1f})rU   r#   r!   r    r   rI   rH   rD   rP   rG   r0   r   rN   )r   r   r   rW   rX   rd   r'   r   r   r   r     s,    




zCsvPrinter.get_angleN)r=   r>   r?   r@   rG   r   r   r   r   r   r   r   r   e  s   r   c               @   sZ   e Zd ZdddZedd Zedd Zedd	 Zd
d Zdd Z	dd Z
dd ZdS )TuplePrinterTc             C   s
   || _ d S )N)r   )r   r   r   r   r   r	     s    zTuplePrinter.__init__c             C   s   d S )Nr   )r
   r   r   r   r   r     s    zTuplePrinter.validatec             C   s   dS )Nr   r   )r
   r   r   r   r     s    zTuplePrinter.headerc             C   s   dS )Nr   r   )r
   r   r   r   r     s    zTuplePrinter.footerc             C   s@   |j d }|j d }|j|jft|jdt| jr4dn|jdfS )Nr   rT   r|   g{Gz?)rU   i_seqroundr   r   rN   )r   r   r   rW   rX   r   r   r   r     s
    



zTuplePrinter.get_distc             C   s   dS )z* Default sigma for angles in PHENIX is 3.0Nr   )r   r   r   r   r   r     s    zTuplePrinter.angle_sigma_valuec             C   sN   |j d }|j d }|j d }|j|j|jft|jdt| jrBdn|jdfS )Nr   rT   r]   g      @)rU   r   r   r   r   rN   )r   r   r   rW   rX   rd   r   r   r   r     s    



zTuplePrinter.get_anglec             C   sr   g }dd |D }xZ|D ]R}|j |krd }|jdkrB| ||}n|jdkrX| ||}||kr|| qW |S )Nc             S   s   g | ]}|j D ]
}|jqqS r   )r   r   )r   r   r   r   r   r   r     s   z1TuplePrinter.print_restraints.<locals>.<listcomp>r   r   )r    r!   r   r   r"   )r   r   r$   r%   r&   r   r'   r   r   r   r(     s    



zTuplePrinter.print_restraintsN)T)r=   r>   r?   r	   r@   r   r   r   r   r   r   r(   r   r   r   r   r     s   

r   )Z
__future__r   Zloggingr^   r9   r   
__author__objectr   rA   ri   r}   r~   r   r   r   r   r   r   <module>   s   p @ 	OSG