B
    dI                 @   sV   d dl mZmZmZ d dlmZ d dlmZ e ZG dd de	Z
G dd de	ZdS )	    )absolute_importdivisionprint_function)Sorry)get_versionc               @   s   e Zd ZdZd)ddZdd Zdd Zd*d	d
Zd+ddZd,ddZ	d-ddZ
d.ddZd/ddZd0ddZd1ddZd2ddZdd  Zd!d" Zd#d$ Zd%d& Zd3d'd(ZdS )4fmodelsz
  Container object for F_model values used during refinement.

  Attributes
  ----------
  fmodel_xray :
  fmodel_neutron :
  xray_scattering_dict :
  neutron_scattering_dict :
  neutron_refinement :
  twin_law :
  Nc             C   s   || _ || _|| _|| _|| _|| _| jd k	r|d kr| j  }| j }	||	 }
| j j| j 	 |
 d}|
  | jj|d |   d S )N)data)f_obs)fmodel_xfmodel_nxray_scattering_dictneutron_scattering_dictneutron_refinementlogZscale_k1r	   arrayr   Z#set_observation_type_xray_amplitudeupdatecreate_target_functors)selffmodel_xrayfmodel_neutronr   r   r   Ztwin_lawr   Z
scale_k1_xZ
scale_k1_nZxn_scaleZf_obs_n_new r   m/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/mmtbx/__init__.py__init__   s    


zfmodels.__init__c             C   sR   d}| j dk	r| j  }t| j || j| j| j| jd}|j| jj	
 d |S )zO
    Makes a deep copy of self.

    Returns
    -------
    mmtbx.fmodels
    N)r   r   r   r   r   r   )xray_structure)r   Z	deep_copyr   r
   r   r   r   r   update_xray_structurer   Zdeep_copy_scatterers)r   fmodel_n_dcresultr   r   r   pseudo_deep_copy.   s    



zfmodels.pseudo_deep_copyc             C   sF   d}| j dk	r| j j|d}t| jj|d|| j| j| j| jd}|S )a[  
    Returns a copy of self with a resolution filter applied to the x-ray and
    neutron maps above a given resolution.

    Parameters
    ----------
    d_min : float
        Reflections with resolutions <= d_min are removed.

    Returns
    -------
    mmtbx.fmodels

    See Also
    --------
    mmtbx.f_model.manager.resolution_filter
    N)d_min)r   r   r   r   r   r   )r   resolution_filterr   r
   r   r   r   r   )r   r   r   r   r   r   r   r   C   s    

zfmodels.resolution_filterc             C   sL   | j dk	rF| jdk	rF|dk	r$|| j _d| j j_| j jj| jd | _| j S )z
    ...
    N)custom_dict)r
   r   r   _scattering_type_registryscattering_type_registryr   as_type_gaussian_dict)r   r   r   r   r   r   a   s    


zfmodels.fmodel_xrayc             C   sT   | j dk	rN|dk	r|| j _d| j j_| j jj| jdd | _| j j sNt| j S )z
    ...
    NZneutron)r    table)r   r   r!   r"   r   r#   Zguess_scattering_type_neutronAssertionError)r   r   r   r   r   r   s   s    

zfmodels.fmodel_neutronFc             C   sL   | j dk	r$| j|dj||||d | jdk	rH| j|dj||||d dS )z
    ...
    N)r   )r   update_f_calcupdate_f_maskforce_update_f_mask)r
   r   r   r   r   )r   r   r&   r'   r(   r   r   r   r      s    

zfmodels.update_xray_structurec             C   sp   |dkr| j }| jdk	r@d}| jdk	r*d}|   j||d | jdk	rlt| j d |   jd|d dS )z
    ...
    N z
x-ray data)headerout)filezneutron data)r   r
   r   r   infoZ$show_rfactors_targets_scales_overallprintr   )r   r   prefixr   r   r   
show_short   s     

 

zfmodels.show_shortr)   c             C   st   ddl m} |jd| jd | jdk	r>|   j|| jd | jdk	rp|jd| jd | 	  j|| jd dS )z
    ...
    r   )print_statisticsz
X-ray data)r+   N)r*   r+   zNeutron data)
mmtbx.refinementr1   make_sub_headerr   r
   r   r-   Zshow_allr   r   )r   messager1   r   r   r   show_comprehensive   s    

zfmodels.show_comprehensiveT   c
             C   s  |dkr| j }d}
|jdkr d}
ddlm} |jd|d | jdd|d	 | j| jgddkrdd}| jdk	rd}| jdk	rd
}t	||d | 
 j||||
|d||||	d
 | jj||d | jdk	rd}t	||d |  j||||
|d||||	d
 | jj||d dS )z
    ...
    NTZslowFr   )r1   zupdating all scales)r+   )r&   r'   r(   zX-ray:)r,   )
update_f_part1remove_outliersparamsfastr   showoptimize_masknprocapply_back_tracerefine_hd_scattering)r   suffixzNeutron:)r   moder2   r1   make_headerr   r
   r   countr.   r   update_all_scalesr;   r   )r   r7   r8   r9   r<   r(   r=   r   r>   r?   r:   r1   msgr   r   r   rD      sV     
  

zfmodels.update_all_scalesc             C   sX   d}| j dk	rd}|   j||d | d | j dk	rT|   j|d| d dS )z
    ...
    r)   NZxray )r+   textzneutron )r   r   r-   show_targetsr   )r   r   rG   Zprefix_xr   r   r   rH      s    

zfmodels.show_targetsc             C   s4   | j dk	r| j j|d | jdk	r0| jj|d dS )z
    ...
    N)target_name)r
   r   r   )r   rI   r   r   r   r      s    

zfmodels.updatec             C   s4   |   j|d| _d| _| jdk	r0|   | _dS )z
    ...
    )
alpha_betaN)r   Ztarget_functortarget_functor_xraytarget_functor_neutronr   r   )r   rJ   r   r   r   r      s
    

zfmodels.create_target_functorsc             C   s"   | j   | jdk	r| j  dS )z
    ...
    N)rK   Zprepare_for_minimizationrL   )r   r   r   r   (prepare_target_functors_for_minimization  s    

z0fmodels.prepare_target_functors_for_minimizationc             C   s0   x*| j | jgD ]}|dkrq| sdS qW dS )z
    ...
    NFT)rK   rL   Z8target_function_is_invariant_under_allowed_origin_shifts)r   fr   r   r   :target_functions_are_invariant_under_allowed_origin_shifts  s     zBfmodels.target_functions_are_invariant_under_allowed_origin_shiftsc             C   s   |   }| j|dS )z
    ...
    )compute_gradients)r   rK   )r   rP   Zfmxr   r   r   target_functor_result_xray  s    z"fmodels.target_functor_result_xrayc             C   s&   d}| j dk	r"|  }| j|d}|S )z
    ...
    N)rP   )r   r   rL   )r   rP   r   Zfmnr   r   r   target_functor_result_neutron"  s
    
z%fmodels.target_functor_result_neutronc                s8   | j | jG  fdddt}|| d}|S )z
    ...
    c                   s<   e Zd Z fddZfddZ fddZdS )z(fmodels.target_and_gradients.<locals>.tgc                s   || _  d}d}d k	r(jj }| | _| j| | _d | _ rzrZ|jd}n|jd }|| _|| | _	|
 d k	rd}d k	rjj } d}| | _| j| | _ rr|jd}n|jd }|| _|| | _d S )N)rP   g      ?)	occupancy)u_iso_refinable_paramsr6   )r   wxwx_scaleZtarget_worktarget_work_xraytarget_work_xray_weightedgradient_xrayZgradients_wrt_atomic_parametersZpackedgradient_xray_weightedr   wnwn_scaletarget_work_neutronZtarget_work_neutron_weightedgradient_neutronZgradient_neutron_weighted)r   r   Ztfx_rrU   Zsfr[   Ztfn_r)rP   rS   tfntfxrT   weightsr   r   r   4  s:    
 

 

z1fmodels.target_and_gradients.<locals>.tg.__init__c                sN   | j  d k	rD d k	r6| j j | j j   j }qJ| j| j }n| j}|S )N)r   r   rW   rV   r]   r\   wxnrX   )r   r   )ra   r   r   targetR  s    
z/fmodels.target_and_gradients.<locals>.tg.targetc                sV   d } rR| j  d k	rLd k	r>| jj | jj  j }qR| j| j }n| j}|S )N)r   r   rY   rV   r^   r\   rb   rZ   )r   r   )rP   ra   r   r   	gradients[  s    
z2fmodels.target_and_gradients.<locals>.tg.gradientsN)__name__
__module____qualname__r   rc   rd   r   )rP   rS   r_   r`   rT   ra   r   r   tg3  s   	rh   )r   )rQ   rR   object)r   rP   ra   rT   rS   rh   r   r   )rP   rS   r_   r`   rT   ra   r   target_and_gradients,  s
    3
zfmodels.target_and_gradients)NNNNNNN)N)N)NNNF)N)r)   )TNFFr6   NFN)r)   )N)N)NNF)re   rf   rg   __doc__r   r   r   r   r   r   r0   r5   rD   rH   r   r   rM   rO   rQ   rR   rj   r   r   r   r   r      sF         


   


       
-

	


 r   c               @   sl   e Zd ZdZddddddgZdd	d
dddgZdddgZdddgZddddddgZdd Z	dd Z
dd Zd S )!	map_namesa  
  Class used for parsing and external display of map's name.

  Attributes
  ----------
  k : float
     Scale for F_obs.
  n : float
      Scale for F_model.
  ml_map : bool
  anomalous : bool
  anomalous_residual : bool
  phaser_sad_llg : bool
  f_obs_filled : bool
  ZfcalcZfcalZfcZfmodelfmodZfmZdfcalcZdfcalZdfcZdfmodelZdfmodZdfmZfobsZfobZfoZmfobsZmfobZmfoz+filledz-filledZfilledz+fillz-fillfillc       
      C   s  |  }d | _d | _d | _d| _d| _d| _d| _xdD ]}||d}q8W x(| j	D ]}||krT||d}d| _qTW |
dr|
drd| _nd| _n|
ds|
drd| _n|| jkrd	| _d
| _d| _n|| jkrd	| _d
| _d| _nl|| jkrd
| _d	| _d| _nJ|| jkr>d
| _d	| _d| _n(d}x*| jD ] }||krJd}||d}qJW d}x*| jD ] }||krzd}||d}qzW ||g
ddkr| | ||g
ddkrd| _n&||g
dd	krd| _n
| | | jsVx&| jD ]}||kr||d}qW x&| jD ]}||kr6||d}q6W |
d|
d dkrz| | x,|D ]$}|dkr| r| | qW |d|dk r ||dd
 |d }d }|
dd
krd}n |
dd
kr
d}n
| | |d |d|| d
  }||d|| d
 d  }	|dd}|	dd}	t|d	krd| _n2t|d
kr|dkrtd| | _n
t|| _t|	d	krd| _n2t|	d
kr|	dkrtd|	 | _n
t|	| _nf|d|dkrV||dd
 |d }d }|
dd
krLd}n |
dd
krbd}n
| | |d |d|| d
  }||d|| d
 d  }	|dd}|	dd}	t|d	krd| _n2t|d
kr|dkrtd| | _n
t|| _t|	d	kr"d| _n2t|	d
krJ|	dkrJtd|	 | _n
t|	| _ntdd|  | jd k	rt| j| _t| j| _d S )NF)~!@#$%^&*()=<>?/:;|[]{},_rF   r)   TZanoZresidZsadZllgr   r6   CO)r      r   )r   r   +-g      ?)r   r   z%s1z+Error attempting to decode map name string z'%s')lowerknml_map	anomalousZanomalous_residualphaser_sad_llgf_obs_filledreplaceFILLEDrC   FCDFCFOMFOerrorisalphaindexlenfloatRuntimeError)
r   Zmap_name_stringssymtmpZfound_DZfound_MsignZpoZpcr   r   r   r     s    














  

 
 



   
    
    
    
  zmap_names.__init__c             C   s   d}d}t |||f dS )z0
    Raises an exception for bad map names.
    a  

Wrong map type requested: %s
  Allowed format is: %s
    where [p] and [q] are any numbers (optional),
          [m] and [D] indicate if the requested map is sigmaa (optional),
          Fo and Fc are Fobs and Fcalc,
          [filled] is for missing Fobs filled map.
  Examples: 2mFo-DFc, 3.2Fo-2.3Fc, mFobs-DFcalc, 2mFobs-DFcalc_filled, Fc,
            2mFobs-DFcalc_fill, anom, anom_diff, anomalous_difference, Fo
z[p][m]Fo+[q][D]Fc[filled]N)r   )r   r   rE   formatr   r   r   r     s    zmap_names.errorc             C   s`  | j s| jstt| j| j dk r8tt| j}n
t| j}tt| j| j dk rd}| jdkrld}| jdkrzd}|tt| j }n
t| j}|dks|dkrd}|dks|dkrd}|dkrd}|dkrd}| jr|d	 | d
 }n|d | d }| jr|d7 }|S | j| j| jg	ddks4t
| jg	ddksLt
| jrXdS dS dS )z
    Formats a map name for external display.

    Examples
    --------
    >>> r = mmtbx.map_names(map_name_string="mFo-DFc ")
    >>> print r.format()
    mFobs-DFmodel
    gư>r)   r   r   r   1z+1z-1ZmFobsZDFmodelZFobsZFmodelZ_filledN   Fr6   r   Zanomalous_difference)r   r   absintr   strr   r   r   rC   r%   )r   r   r   r   r   r   r   r   r     s>    
 

 
 
      zmap_names.formatN)re   rf   rg   rk   r   r   r   r   r   r   r   r   r   r   r   r   rl   i  s   

krl   N)
__future__r   r   r   libtbx.utilsr   Zlibtbx.versionr   __version__ri   r   rl   r   r   r   r   <module>   s     c