ó
ò™xTc           @   sn   d  d l  m Z d  d l j j Z d  d l m Z d  d l Z d e f d „  ƒ  YZ	 d e f d „  ƒ  YZ
 d S(   iÿÿÿÿ(   t   divisionN(   t   InvalidConstraintt    occupancy_pair_affine_constraintc           B   s/   e  Z d  Z d „  Z e d „  ƒ Z d „  Z RS(   s#    Constraint a0 occ0 + a1 occ1 == b c         C   s   | |  _  | |  _ d  S(   N(   t   scatterer_indicest   linear_form(   t   selfR   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/occupancy.pyt   __init__	   s    	c         C   s   |  j  d d f f S(   Ni   t	   occupancy(   R   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/occupancy.pyt   constrained_parameters   s    c   
      C   sš   | j  j ƒ  } |  j \ \ } } } |  j \ } } | j | ƒ } | j t j d | d | | d | | d | | ƒ}	 |	 | j | _	 | | j
 | <d  S(   Nt   dependeet   at   bt	   scatterer(   t	   structuret
   scatterersR   R   t   add_new_occupancy_parametert   addt   _t   affine_asu_occupancy_parametert   asu_scatterer_parametersR   t   shared_occupancies(
   R   t   reparametrisationt   sct   a0t   a1R   t   i0t   i1t   occ0t   param(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/occupancy.pyt   add_to   s    (   t   __name__t
   __module__t   __doc__R   t   propertyR   R   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/occupancy.pyR      s   	t   dependent_occupancyc           B   s/   e  Z d  Z d „  Z e d „  ƒ Z d „  Z RS(   sA    occupancy of a site depend on the occupancy of the other site
  c         C   sA   t  | ƒ t  | ƒ d k r+ t d ƒ ‚ n  | |  _ | |  _ d  S(   Ni    s   at least one atom is expected(   t   lenR   t   as_vart   as_one_minus_var(   R   t   var_refst   var_minus_one_refs(    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/occupancy.pyR   !   s    	c         C   s&   t  d „  t j |  j |  j ƒ Dƒ ƒ S(   Nc         s   s   |  ] } | d  d f Vq d S(   i    R   N(    (   t   .0R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/occupancy.pys	   <genexpr>)   s   (   t   tuplet	   itertoolst   chainR$   R%   (   R   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/occupancy.pyR   '   s    	c   	      C   sÄ  | j  j ƒ  } t |  j ƒ d k rI |  j d d } |  j d d } n" |  j d d } |  j d d } | j | ƒ } x‘ |  j D]† } | d | k r  q„ n  | j t j d | d | d | d d t	 d | j  j ƒ  | d ƒ} | | j
 | d _ | | j | d <q„ Wt |  j ƒ d k } x‘ |  j D]† } | d | k rIq-n  | j t j d | d | d | d d | d | j  j ƒ  | d ƒ} | | j
 | d _ | | j | d <q-W| |  _ d  S(   Ni    i   R   t   original_multipliert
   multipliert   as_oneR   (   R   R   R#   R$   R%   R   R   R   R"   t   TrueR   R   R   t   value(	   R   R   R   t   sc_idxt   original_multR   R   R   R.   (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/occupancy.pyR   ,   sB     	
 	
(   R   R   R    R   R!   R   R   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/occupancy.pyR"      s   	(   t
   __future__R    t   smtbx.refinement.constraintst
   refinementt   constraintsR   R   R*   t   objectR   R"   (    (    (    sT   /public2/ftp/pub/ccp4/6.5/ccp4-6.5/lib/py2/smtbx/refinement/constraints/occupancy.pyt   <module>   s
   