ó
ð™xTc           @   s  d  d l  m Z d  d l Z d  d l Z e j j d ƒ Z d  d l Td  d l	 Z
 d  d l m Z d  d l Z d  d l m Z d e j j f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d Z d e j j e j f d „  ƒ  YZ d e j j e j f d „  ƒ  YZ d e j f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   divisionNt    smtbx_refinement_constraints_ext(   t   *(   t   flex(   t   xrayt   InvalidConstraintc           B   s   e  Z e j Z RS(    (   t   __name__t
   __module__t	   Exception(    (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyR      s   t   ConflictingConstraintWarningc           B   s    e  Z d  Z d „  Z d „  Z RS(   su    Attempt to constrain some scatterer parameters that have already been
 constrained: this attempt will be ignored.
  c         C   s   | |  _  | |  _ | |  _ d  S(   N(   t	   conflictst   constraint_typet
   scatterers(   t   selfR
   R   R   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyt   __init__   s    		c         C   s\   d j  g  |  j D]) \ } } d | |  j | j | f ^ q ƒ } d |  j j |  j | f S(   Ns   
s   	* %s of scatterer %s (#%i)sj   %s The attempted constraint is of type '%s' and the list of already constrained scatterer parameters is
%s(   t   joinR
   R   t   labelt	   __class__t   __doc__R   (   R   t	   scatt_idxt	   param_tagt   conflicts_printout(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyt   __str__   s
    9(   R   R   R   R   R   (    (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyR	      s   	s4   Invalid %s constraint involving %s: bad connectivityt   _c           B   s   e  Z d  „  Z d „  Z RS(   c         c   s,   x% t  |  j ƒ D] } |  j | ƒ Vq Wd S(   s     An iterator over its arguments N(   t   xranget   n_argumentst   argument(   R   t   i(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyt	   arguments,   s    c         C   sº   y6 d j  g  |  j D] } | j ^ q ƒ } d | } Wn t k
 rO d } n Xg  } |  j so | j d ƒ n  | r‹ d d j  | ƒ } n d } d |  j |  j j | | |  j f } | S(   s7    String representation using the graphviz DOT language s   , s    (%s)t    t   csts    [%s]s   %i [label="%s%s%s #%s"](	   R   R   R   t   AttributeErrort   is_variablet   appendt   indexR   R   (   R   t   sct   scattt   infot   lbl(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyR   1   s"    (
	  	(   R   R   R   R   (    (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyR   *   s   	c           B   s   e  Z d  „  Z RS(   c         C   sÕ   |  j  ƒ  g  } xH |  j ƒ  D]: } x1 | j ƒ  D]# } | j d | j | j f ƒ q0 Wq Wg  } x0 |  j ƒ  D]" } | j | j t | ƒ f ƒ qn W| j ƒ  | j g  | D] \ } } | ^ q« ƒ d d j | ƒ S(   s7    String representation using the graphviz DOT language s   %i -> %is   digraph dependencies {
%s
}s   ;
(	   t   finaliset
   parametersR   R!   R"   t   strt   sortt   extendR   (   R   t   bitst   pt   qt   dsu_bitsR   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyR   E   s    
% 
&(   R   R   R   (    (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyR   C   s   t   reparametrisationc           B   sÃ   e  Z d  Z d Z d Z d Z d Z d „  Z d „  Z	 d „  Z
 d e j f d „  ƒ  YZ d „  Z d „  Z d d	 „ Z d
 „  Z d „  Z d „  Z d „  Z e d „ Z d „  Z d „  Z d „  Z RS(   s?    Enhance the C++ level reparametrisation class for ease of use i   c         K   s�  t  t |  ƒ j | j ƒ  ƒ i  |  _ i  |  _ i  |  _ i  |  _ i  |  _ i  |  _	 | |  _
 } | |  _ | j j d t d t ƒ |  _ | j ƒ  } |  j
 j ƒ  |  _ t j |  | ƒ t | j ƒ  ƒ |  _ t ƒ  |  _ |  j d	 k	 rài  } xç |  j D]Ü } | d d k r(t j | d ƒ | | d <qô | d d k r|g  | d D] }	 |  j |	 d ƒ ^ qC}
 t j |
 ƒ | | d <qô | d d k rô g  | d D] }	 |  j |	 d ƒ ^ q—}
 t j  |
 ƒ | | d <qô qô W| |  _ n  t! ƒ  |  _" x» | D]³ } | j" } t! ƒ  } t! ƒ  } x7 | D]/ } | | k r=| j# | ƒ q| j# | ƒ qW| | |  j" @O} | rŠt$ j% t& | | j' | j ƒ  ƒ ƒ qó|  j" | O_" | j( |  ƒ qóWxD t) t* |  j ƒ ƒ D]- } |  j | ƒ |  j+ | ƒ |  j, | ƒ qÀW|  j- d	 k	 r0x- |  j- D] } | j. r
|  j/ | ƒ q
q
Wn  |  j0 d	 k	 rs|  j0 j. rs|  j# t1 |  j0 ƒ } |  j j2 | ƒ n  |  j3 ƒ  d	 S(
   s0   Construct for the given instance of xray.structure subject to the
    given sequence of constraints. Each constraint instance shall understand:
    constraint.add_to(self). That method shall perform 2 tasks:

      - add to self the parameters relevant to the reparametrisation
        associated with that constraint;

      - update self.asu_scatterer_parameters.

    The latter is an array containing one instance of scatterer_parameters
    for each scatterer in the a.s.u.
    C.f. module geometrical_hydrogens in this package for a typical example
    t   skip_j_seq_less_than_i_seqt    all_interactions_from_inside_asui    t   statici   i   t   vectort   normalN(4   t   superR0   R   t	   unit_cellt	   shared_Ust   shared_sitest   shared_occupanciest   fixed_distancest   fixed_anglest   fixed_dihedral_anglest	   structuret   connectivity_tablet   pair_asu_tablet   extract_pair_sym_tablet   Falset   Truet   pair_sym_tableR   t   site_symmetry_tablet   site_symmetry_table_t   libtbxt   adopt_optional_init_argst   shared_scatterer_parameterst   asu_scatterer_parameterst$   shared_independent_shared_parameterst   independent_scalar_parameterst
   directionst   Nonet   extt   static_directiont   add_new_site_parametert   vector_directiont   normal_directiont   sett   constrained_parameterst   addt   warningst   warnR	   R   t   add_toR   t   lent&   add_new_thermal_displacement_parametert   add_new_occupancy_parametert   twin_fractionst   gradt   add_new_twin_fraction_parametert
   extinctiont   extinction_parameterR!   R'   (   R   R>   t   constraintsR?   t   kwdst   xsR   RM   t   dR   t   sitest
   constraintt   c_paramst   warned_aboutt   uniquesR-   t   i_sct   fraction(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyR   k   sr    							**				c         C   sS  t  t |  ƒ j ƒ  |  j j ƒ  |  _ |  j j ƒ  |  _ |  j j ƒ  |  _ |  j j	 |  j ƒ d } |  j
 d  k	 rž x* |  j
 D] } | j r{ | d 7} q{ q{ Wn  |  j d  k	 rÆ |  j j rÆ | d 7} n  |  j j | } |  j
 d  k	 rx3 |  j
 D]% } | j rï | | _ | d 7} qï qï Wn  |  j d  k	 rO|  j j rO| |  j _ | d 7} n  d  S(   Ni    i   (   R6   R0   R'   RJ   t   mapping_to_grad_fcRL   t&   mapping_to_grad_fc_independent_scalarst	   deep_copyt   mapping_to_grad_fc_allR+   R]   RN   R^   R`   t   jacobian_transposet   n_rowst
   grad_index(   R   t   independent_grad_cntRl   t   independent_grad_i(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyR'   Ã   s*    			c         C   s   t  j j |  | ƒ d  S(   N(   RO   R0   t   apply_shifts(   R   t   shifts(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyRv   ß   s    t   component_annotationsc           B   s   e  Z d  „  Z RS(   c         C   s)   |  j  j d |  j j ƒ  j d ƒ d  ƒ S(   Nt   _component_annotationst   ,iÿÿÿÿ(   t   __dict__t
   setdefaultRJ   Rx   t   split(   R   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyt   fgetã   s    	(   R   R   R~   (    (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyRx   â   s   c         C   s   |  j  |  j ƒ S(   s   The columns of self.jacobian_transpose corresponding to crystallographic
    parameters for the scatterers, in the same order as the derivatives in
    grad Fc. In this class, the latter is assumed to follow the convention of
    smtbx.structure_factors
    (   t   jacobian_transpose_matchingRm   (   R   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyt#   jacobian_transpose_matching_grad_fcè   s    c         C   su   |  j  j | ƒ r |  j  | S|  j | j } | d  k rq |  j j ƒ  | } |  j t | ƒ } | |  j | _ n  | S(   N(	   R:   t   has_keyRJ   t	   occupancyRN   R>   R   RV   t   independent_occupancy_parameter(   R   Rk   t   occR#   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyR\   ð   s    c         C   sÜ   |  j  j | ƒ r |  j  | S|  j | j } | d  k r§ |  j j | ƒ } |  j j ƒ  | } | j	 ƒ  r |  j
 t | ƒ } n |  j
 t | | ƒ } | |  j | _ n  | d  k	 rØ | j ƒ  rØ |  j
 t | | ƒ } n  | S(   N(   R9   R�   RJ   t   siteRN   RF   t   getR>   R   t   is_point_group_1RV   t   independent_site_parametert   special_position_site_parametert
   is_unit_mxt"   symmetry_equivalent_site_parameter(   R   t   i_scatterert   symm_opt   st	   site_symmR#   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyRQ   ú   s    c         C   s=   |  j  j | ƒ r |  j  | S|  j t | | ƒ |  j  | <d  S(   N(   R9   R�   RV   t   rigid_site_proxy(   R   t   paramR   Rk   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyt   add_new_site_proxy_parameter
  s    c         C   s=   |  j  j | ƒ r |  j  | S|  j t | | ƒ |  j  | <d  S(   N(   R9   R�   RV   t   same_group_site_proxy(   R   R‘   R   Rk   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyt'   add_new_same_group_site_proxy_parameter  s    c         C   sô   |  j  j | ƒ r |  j  | S|  j | j } | d  k rð |  j j ƒ  | } | j j ƒ  og | j j	 ƒ  sq t
 ‚ | j j ƒ  r• |  j t | ƒ } nH |  j j | ƒ } | j ƒ  rÈ |  j t | ƒ } n |  j t | | ƒ } | |  j | _ n  | S(   N(   R8   R�   RJ   t   uRN   R>   R   t   flagst	   use_u_isot   use_u_anisot   AssertionErrorRV   t   independent_u_iso_parameterRF   R†   R‡   t   independent_u_star_parametert!   special_position_u_star_parameter(   R   RŒ   R•   R#   R�   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyR[     s     %		c         C   s&   |  j  t | ƒ } |  j j | ƒ | S(   N(   RV   t   twin_fraction_parameterRL   R!   (   R   t   twin_fractionR-   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyR_   (  s    c         C   s/   |  j  t d | d | ƒ} |  j j | ƒ | S(   Nt   valuet   variable(   RV   t   independent_scalar_parameterRL   R!   (   R   RŸ   R    R-   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyt$   add_new_independent_scalar_parameter-  s    c         C   sN   d  } |  j d  k	 r- |  j j | d  ƒ } n  | d  k rJ d | d ‚ n  | S(   Ns   Undefined direction: 't   '(   RN   RM   R†   (   R   t   id_t   res(    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyt   find_direction2  s    c         C   sK   |  j  j ƒ  } g  } x& | D] } | j d | | j ƒ q Wd j | ƒ S(   Ns   %st    (   R>   R   R!   R   R   (   R   t   slR   t   rvR   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyt   format_scatter_list:  s
    c         C   s€   t  j |  j j ƒ  ƒ } |  j d  k	 rT x* |  j D] } | j r1 | j ƒ  q1 q1 Wn  |  j d  k	 r| |  j j r| | j ƒ  n  | S(   N(	   R   t   parameter_mapR>   R   R]   RN   R^   t   add_independent_scalarR`   (   R   R©   Rl   (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyR«   A  s    	N(   R   R   R   t   temperatureRN   R]   R`   RM   R   R'   Rv   RG   t   propertyRx   R€   R\   RQ   R’   R”   R[   R_   RC   R¢   R¦   Rª   R«   (    (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyR0   c   s(   	X				
						(   t
   __future__R    RW   t   boost.pythont   boostt   pythont
   import_extRO   R   t   scitbx.sparset   scitbxt   scitbx.array_familyR   t   libtbx.utilsRG   t   cctbxR   t   utilst   SorryR   t   UserWarningR	   t   bad_connectivity_msgt   injectort	   parameterR   R0   (    (    (    sS   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/__init__.pyt   <module>   s   
"" 