B
    3RcI                 @   s  d dl 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edkrdZdZdZi Zi Zi Zi ZeddZejdddddd d! ejd"d#d$d%d&d'd( ejd)d*d$d+d,d-d( e \ZZejdk	rejZn2ejdk	r4ejZed.kr0ed/ e d. d0ZxTe jD ]HZ e ! Z e "d1\Z#Z$Z%Z&e$ee#< e#ee$< dZ'ere$ekree#ee$< ee$ Z'e(e%d kre(e&d krq>e(e%d krPe&"d2Z)ee)d. d.e're)d  Z&e)d. Z%d3e$e%f Z*e+e&g ,e* ee)d  d.e're)d. Z&e)d  Z%d3e$e%f Z*e+e&g ,e* n6e%-d4Z.ee%e.e'r>d3e$e%f Z*e+e&g ,e* q>W e  xeD ]Z/e(ee/ Z0e0d.krqxe1e0D ]Z2xe1e2e0D ]Z3e2e3kree/ e2 "d5\Z4Z5ee/ e3 "d5\Z6Z7e4e6kre5e7kre	e5e7e/\Z8Z&ed6ee4 ee6 e4e6e8e&f  ej9re	e7e5e/\Z8Z&ed6ee6 ee4 e6e4e8e&f  qW qW qW dS )7    N)Chem)OptionParserc             C   s   t | }| S )N)r   MolFromSmilesZGetNumAtoms)smim r   $share/RDKit/Contrib/mmpa/indexing.pyheavy_atom_count'   s    
r	   c             C   sB   d}t | | }tr2t|t| }|tkr>d}n|tkr>d}|S )NFT)r	   	use_ratiofloatratiomax_size)r   attachments
cmpd_heavyresultZ	core_sizeZ
core_ratior   r   r   add_to_index-   s    r   c             C   sR   g }t | }t j|dd}x0t| |D ]\}}| dkr,|| q,W |S )NF)Z	breakTiesr   )r   r   ZCanonicalRankAtomszipZGetAtomsZGetMassappend)r   Zsymmetryr   Zsymmetry_classesZatomsymmetry_classr   r   r   get_symmetry_class=   s    
r   c             C   sZ  i }|  d}|dkr&t| }t|}|dkrD|d |d kr||d |d kr|t| |}t| } t|||}t|||}n|d |d kr|d |d krt| } t|}n|d |d kr|d |d krt| } t||}t|}t|||}nJ|d |d krF|d |d krFt| |}t| } t|||}t|}n|dkrF|d |d kr|d |d kr|d |d kr|d |d kr|d |d kr|d |d krt| } t|}nx|d |d krd|d |d krd|d |d krd|d |d krd|d |d krd|d |d krdt| } t||}t|}t|||}n|d |d kr|d |d kr|d |d kr|d |d kr|d |d kr|d |d krt| |}t| } t|||}t|||}nH|d |d kr|d |d kr|d |d kr|d |d kr|d |d kr|d |d krt| |}t| } t|||}t|}n|d |d krZ|d |d krZ|d |d krZt| |}t| } t|||}t|||}|d |d krt||dd}nB|d |d kr8t||dd}n |d |d krFt||dd}n|d |d kr|d |d kr|d |d krt| } t||}t|}t|||}nt| |}t| } t|||}t|||}|d |d krt||dd}nB|d |d kr&t||dd}n |d |d krFt||dd}d| |f }||fS )N*      r      z%s>>%s)countr   build_track_dictionaryswitch_labels_on_positionswitch_labels"switch_specific_labels_on_symmetry)ZlhsZrhscontextisotope_trackstarsZlhs_symZrhs_symZsmirkr   r   r   cansmirkM   s    

 
 
 
$

$666
66
66
6
6
	
r"   c             C   s   ||d  ||d  krt d| }|rt||t||krt d|| d d|| d | } t d|| d d|| d | } t dd| } | S )	Nr   z1\[\*\:([123])\].*\[\*\:([123])\].*\[\*\:([123])\]z\[\*\:z\]z[*:XXzXX]XX )researchintgroupsub)r   r   abmatchObjr   r   r   r     s    **r   c             C   sB   t dd| d} t dd| d} t dd| d} t dd| } | S )Nz\[\*\:[123]\]z	[*:XX1XX]r   z	[*:XX2XX]z	[*:XX3XX]r#   r$   )r%   r)   )r   r   r   r   r   #  s
    r   c             C   s   |dkr| d dkr.t dd| d  d |}| d dkrTt dd| d  d |}|dkr| d	 d	krt d
d| d	  d |}t dd|}|S )Nr   1z	\[\*\:1\]z[*:XXzXX]2z	\[\*\:2\]r   3z	\[\*\:3\]r#   r$   )r%   r)   )Ztrackr!   r   r   r   r   r   .  s    r   c             C   s   i }|dkr:t d| }|r|d||d< d||d< nB|dkr|t d| }|r|d||d< d||d< d||d< |S )	Nr   z \[\*\:([123])\].*\[\*\:([123])\]r-   r   r.   r   z1\[\*\:([123])\].*\[\*\:([123])\].*\[\*\:([123])\]r/   )r%   r&   r(   )r   r!   r    r,   r   r   r   r   E  s    r   c              C   s   xt D ]} | d}|dkr| }tdd|}t|}|d krVtjd| |f  qtj	|dd}|t
krd}t
| }d	||f }t |  | qW d S )
Nr   r   z	\[\*\:1\]z[H]z Error with key: %s, Added H: %s
T)ZisomericSmilesz[*:1][H]z%s;t%s)indexr   r%   r)   r   r   sysstderrwriteZMolToSmiles	smi_to_idr   )keyr   r   ZtempZc_smicoreidvaluer   r   r   index_hydrogen_change[  s    


r9   __main__
   g333333?FzProgram to generate MMPs)Zdescriptionz-sz--symmetric
store_truesymzkOutput symmetrically equivalent MMPs, i.e output both cmpd1,cmpd2, SMIRKS:A>>B and cmpd2,cmpd1, SMIRKS:B>>A)defaultactiondesthelpz-mz	--maxsizeZstoremaxsizer'   zMaximum size of change (in heavy atoms) allowed in matched molecular pairs identified. DEFAULT=10.                       Note: This option overrides the ratio option if both are specified.)r?   r@   typerA   z-rz--ratior   r   a  Maximum ratio of change allowed in matched molecular pairs identified. The ratio is: size of change /                       size of cmpd (in terms of heavy atoms). DEFAULT=0.3. Note: If this option is used with the maxsize option, the maxsize option will be used.r   z3Ratio specified: %s. Ratio needs to be less than 1.T,.z%s;t%sr   z;tz%s,%s,%s,%s,%s,%s):r1   r%   Zrdkitr   Zoptparser   r	   r   r   r"   r   r   r   r   r9   __name__r   r   r
   r0   r4   Z	id_to_smiZid_to_heavyparserZ
add_option
parse_argsZoptionsargsrB   printexitstdinlinerstripsplitr   r7   r6   r   r   lenZside_chainsr8   
setdefaultr   r   r   r5   ZtotalrangeZxaZxbZid_aZcore_aZid_bZcore_bZsmirksr=   r   r   r   r   <module>!   s    B*













