Exemplo n.º 1
0
 def compute_functional_and_gradients(self):
     sites_cart = flex.vec3_double(self.x)
     f = 0
     g = flex.vec3_double(sites_cart.size(), (0, 0, 0))
     for sorted_asu_proxies in [self.conservative_pair_proxies.bond, self.conservative_pair_proxies.angle]:
         if sorted_asu_proxies is None:
             continue
         f += geometry_restraints.bond_residual_sum(
             sites_cart=sites_cart, sorted_asu_proxies=sorted_asu_proxies, gradient_array=g
         )
     return f, g.as_double()
Exemplo n.º 2
0
 def compute_functional_and_gradients(O):
   cs = O.grm.crystal_symmetry
   sst = O.grm.site_symmetry_table
   sites_frac = sst.unpack_coordinates(packed_coordinates=O.x)
   sites_cart = cs.unit_cell().orthogonalize(sites_frac)
   g_cart = flex.vec3_double(sites_cart.size(), (0,0,0))
   f = geometry_restraints.bond_residual_sum(
     unit_cell=cs.unit_cell(),
     sites_cart=sites_cart,
     proxies=O.proxies,
     gradient_array=g_cart)
   g_frac = g_cart * cs.unit_cell().orthogonalization_matrix()
   g = sst.pack_gradients(g_frac=g_frac)
   return f, g
Exemplo n.º 3
0
 def compute_functional_and_gradients(self):
     sites_cart = flex.vec3_double(self.x)
     f = 0
     g = flex.vec3_double(sites_cart.size(), (0, 0, 0))
     for sorted_asu_proxies in [
             self.conservative_pair_proxies.bond,
             self.conservative_pair_proxies.angle
     ]:
         if (sorted_asu_proxies is None): continue
         f += geometry_restraints.bond_residual_sum(
             sites_cart=sites_cart,
             sorted_asu_proxies=sorted_asu_proxies,
             gradient_array=g)
     return f, g.as_double()
Exemplo n.º 4
0
  def __init__(self, sites_cart,
               unit_cell=None,
               bond_proxies=None,
               nonbonded_proxies=None,
               nonbonded_function=None,
               angle_proxies=None,
               dihedral_proxies=None,
               reference_coordinate_proxies=None,
               reference_dihedral_manager=None,
               ncs_dihedral_manager=None,
               den_manager=None,
               chirality_proxies=None,
               planarity_proxies=None,
               parallelity_proxies=None,
               bond_similarity_proxies=None,
               ramachandran_manager=None,
               external_energy_function=None,
               compute_gradients=True,
               gradients=None,
               disable_asu_cache=False,
               normalization=False,
               extension_objects=[]):
    # runsnaked away...
    #adopt_init_args(self, locals())
    #for local in sorted(locals()):
    #  print "    self.%(local)s=%(local)s" % locals()
    #assert 0
    #
    self.angle_proxies=angle_proxies
    self.bond_proxies=bond_proxies
    self.bond_similarity_proxies=bond_similarity_proxies
    self.chirality_proxies=chirality_proxies
    self.compute_gradients=compute_gradients
    self.den_manager=den_manager
    self.dihedral_proxies=dihedral_proxies
    self.disable_asu_cache=disable_asu_cache
    self.extension_objects=extension_objects
    self.external_energy_function=external_energy_function
    self.gradients=gradients
    self.ncs_dihedral_manager=ncs_dihedral_manager
    self.nonbonded_function=nonbonded_function
    self.nonbonded_proxies=nonbonded_proxies
    self.normalization=normalization
    self.parallelity_proxies=parallelity_proxies
    self.planarity_proxies=planarity_proxies
    self.ramachandran_manager=ramachandran_manager
    self.reference_coordinate_proxies=reference_coordinate_proxies
    self.reference_dihedral_manager=reference_dihedral_manager
    self.sites_cart=sites_cart
    self.unit_cell=unit_cell
    #
    scitbx.restraints.energies.__init__(self,
                                        compute_gradients=compute_gradients,
                                        gradients=gradients,
                                        gradients_size=sites_cart.size(),
                                        gradients_factory=flex.vec3_double,
                                        normalization=normalization)
    self.n_dihedral_restraints = None
    self.dihedral_restraints_residual_sum = 0
    if (nonbonded_proxies is not None): assert nonbonded_function is not None
    if (compute_gradients):
      if (self.gradients is None):
        self.gradients = flex.vec3_double(sites_cart.size(), [0,0,0])
      else:
        assert self.gradients.size() == sites_cart.size()

    if (bond_proxies is None):
      self.n_bond_proxies = None
      self.bond_residual_sum = 0
    else:
      self.n_bond_proxies = bond_proxies.n_total()
      self.bond_residual_sum = geometry_restraints.bond_residual_sum(
        sites_cart=sites_cart,
        sorted_asu_proxies=bond_proxies,
        gradient_array=self.gradients,
        disable_cache=disable_asu_cache)
      self.number_of_restraints += self.n_bond_proxies
      self.residual_sum += self.bond_residual_sum
    if (nonbonded_proxies is None):
      self.n_nonbonded_proxies = None
      self.nonbonded_residual_sum = 0
    else:
      self.n_nonbonded_proxies = nonbonded_proxies.n_total()
      self.nonbonded_residual_sum = geometry_restraints.nonbonded_residual_sum(
        sites_cart=sites_cart,
        sorted_asu_proxies=nonbonded_proxies,
        gradient_array=self.gradients,
        function=nonbonded_function,
        disable_cache=False)
      self.number_of_restraints += self.n_nonbonded_proxies
      self.residual_sum += self.nonbonded_residual_sum

    # ====================================================================
    # Unit cell dependent
    # ====================================================================
    # name, parameter, function to call
    for name, proxies, residual_sum_function in [
        ("angle", angle_proxies, geometry_restraints.angle_residual_sum),
        ("dihedral",dihedral_proxies, geometry_restraints.dihedral_residual_sum),
        ("planarity", planarity_proxies, geometry_restraints.planarity_residual_sum),
        ("parallelity", parallelity_proxies, geometry_restraints.parallelity_residual_sum),
        ("bond_similarity", bond_similarity_proxies, geometry_restraints.bond_similarity_residual_sum)]:
      setattr(self, "n_%s_proxies" % name, None)
      setattr(self, "%s_residual_sum" % name, 0)
      if proxies is not None:
        n_proxies = proxies.size()
        # setattr(self, "n_%s_proxies" % name, proxies.size())
        if unit_cell is None:
          res_sum = residual_sum_function(
              sites_cart=sites_cart,
              proxies=proxies,
              gradient_array=self.gradients)
        else:
          res_sum = residual_sum_function(
              unit_cell=unit_cell,
              sites_cart=sites_cart,
              proxies=proxies,
              gradient_array=self.gradients)
        self.number_of_restraints += n_proxies
        self.residual_sum += res_sum
        setattr(self, "n_%s_proxies" % name, n_proxies)
        setattr(self, "%s_residual_sum" % name, res_sum)

    # ====================================================================
    # Managers
    # ====================================================================
    for name, manager in [
        ("reference_dihedral", reference_dihedral_manager),
        ("ncs_dihedral", ncs_dihedral_manager),
        ("den", den_manager),
        ("ramachandran", ramachandran_manager)]:
      setattr(self, "n_%s_proxies" % name, None)
      setattr(self, "%s_residual_sum" % name, 0)
      if manager is not None:
        n_proxies = manager.get_n_proxies()
        res_sum = manager.target_and_gradients(
            unit_cell=unit_cell,
            sites_cart=sites_cart,
            gradient_array=self.gradients)
        self.number_of_restraints += n_proxies
        self.residual_sum += res_sum
        setattr(self, "n_%s_proxies" % name, n_proxies)
        setattr(self, "%s_residual_sum" % name, res_sum)

    # ====================================================================
    # The rest (not yet unified)
    # ====================================================================
    if reference_coordinate_proxies is None:
      self.n_reference_coordinate_proxies = None
      self.reference_coordinate_residual_sum = 0
    else:
      import boost.python
      ext = boost.python.import_ext("mmtbx_reference_coordinate_ext")
      self.n_reference_coordinate_proxies = reference_coordinate_proxies.size()
      self.reference_coordinate_residual_sum = \
          ext.reference_coordinate_residual_sum(
              sites_cart=sites_cart,
              proxies=reference_coordinate_proxies,
              gradient_array=self.gradients)
      self.number_of_restraints += self.n_reference_coordinate_proxies
      self.residual_sum += self.reference_coordinate_residual_sum

    if (chirality_proxies is None):
      self.n_chirality_proxies = None
      self.chirality_residual_sum = 0
    else:
      self.n_chirality_proxies = len(chirality_proxies)
      self.chirality_residual_sum = geometry_restraints.chirality_residual_sum(
        sites_cart=sites_cart,
        proxies=chirality_proxies,
        gradient_array=self.gradients)
      self.number_of_restraints += self.n_chirality_proxies
      self.residual_sum += self.chirality_residual_sum

    if (external_energy_function is not None) :
      self.external_energy = external_energy_function(
        sites_cart=sites_cart,
        gradient_array=self.gradients)
      self.residual_sum += self.external_energy
    else :
      self.external_energy = 0
    for extension_obj in self.extension_objects:
      extension_obj.energies_add(energies_obj=self)
    self.finalize_target_and_gradients()
Exemplo n.º 5
0
    def __init__(self,
                 sites_cart,
                 unit_cell=None,
                 bond_proxies=None,
                 nonbonded_proxies=None,
                 nonbonded_function=None,
                 angle_proxies=None,
                 dihedral_proxies=None,
                 reference_coordinate_proxies=None,
                 reference_dihedral_manager=None,
                 ncs_dihedral_manager=None,
                 den_manager=None,
                 chirality_proxies=None,
                 planarity_proxies=None,
                 parallelity_proxies=None,
                 bond_similarity_proxies=None,
                 ramachandran_manager=None,
                 external_energy_function=None,
                 compute_gradients=True,
                 gradients=None,
                 disable_asu_cache=False,
                 normalization=False,
                 extension_objects=[]):
        # runsnaked away...
        #adopt_init_args(self, locals())
        #for local in sorted(locals()):
        #  print "    self.%(local)s=%(local)s" % locals()
        #assert 0
        #
        self.angle_proxies = angle_proxies
        self.bond_proxies = bond_proxies
        self.bond_similarity_proxies = bond_similarity_proxies
        self.chirality_proxies = chirality_proxies
        self.compute_gradients = compute_gradients
        self.den_manager = den_manager
        self.dihedral_proxies = dihedral_proxies
        self.disable_asu_cache = disable_asu_cache
        self.extension_objects = extension_objects
        self.external_energy_function = external_energy_function
        self.gradients = gradients
        self.ncs_dihedral_manager = ncs_dihedral_manager
        self.nonbonded_function = nonbonded_function
        self.nonbonded_proxies = nonbonded_proxies
        self.normalization = normalization
        self.parallelity_proxies = parallelity_proxies
        self.planarity_proxies = planarity_proxies
        self.ramachandran_manager = ramachandran_manager
        self.reference_coordinate_proxies = reference_coordinate_proxies
        self.reference_dihedral_manager = reference_dihedral_manager
        self.sites_cart = sites_cart
        self.unit_cell = unit_cell
        #
        scitbx.restraints.energies.__init__(
            self,
            compute_gradients=compute_gradients,
            gradients=gradients,
            gradients_size=sites_cart.size(),
            gradients_factory=flex.vec3_double,
            normalization=normalization)
        self.n_dihedral_restraints = None
        self.dihedral_restraints_residual_sum = 0
        if (nonbonded_proxies is not None):
            assert nonbonded_function is not None
        if (compute_gradients):
            if (self.gradients is None):
                self.gradients = flex.vec3_double(sites_cart.size(), [0, 0, 0])
            else:
                assert self.gradients.size() == sites_cart.size()

        if (bond_proxies is None):
            self.n_bond_proxies = None
            self.bond_residual_sum = 0
        else:
            self.n_bond_proxies = bond_proxies.n_total()
            self.bond_residual_sum = geometry_restraints.bond_residual_sum(
                sites_cart=sites_cart,
                sorted_asu_proxies=bond_proxies,
                gradient_array=self.gradients,
                disable_cache=disable_asu_cache)
            self.number_of_restraints += self.n_bond_proxies
            self.residual_sum += self.bond_residual_sum
        if (nonbonded_proxies is None):
            self.n_nonbonded_proxies = None
            self.nonbonded_residual_sum = 0
        else:
            self.n_nonbonded_proxies = nonbonded_proxies.n_total()
            self.nonbonded_residual_sum = geometry_restraints.nonbonded_residual_sum(
                sites_cart=sites_cart,
                sorted_asu_proxies=nonbonded_proxies,
                gradient_array=self.gradients,
                function=nonbonded_function,
                disable_cache=False)
            self.number_of_restraints += self.n_nonbonded_proxies
            self.residual_sum += self.nonbonded_residual_sum

        # ====================================================================
        # Unit cell dependent
        # ====================================================================
        # name, parameter, function to call
        for name, proxies, residual_sum_function in [
            ("angle", angle_proxies, geometry_restraints.angle_residual_sum),
            ("dihedral", dihedral_proxies,
             geometry_restraints.dihedral_residual_sum),
            ("planarity", planarity_proxies,
             geometry_restraints.planarity_residual_sum),
            ("parallelity", parallelity_proxies,
             geometry_restraints.parallelity_residual_sum),
            ("bond_similarity", bond_similarity_proxies,
             geometry_restraints.bond_similarity_residual_sum)
        ]:
            setattr(self, "n_%s_proxies" % name, None)
            setattr(self, "%s_residual_sum" % name, 0)
            if proxies is not None:
                n_proxies = proxies.size()
                # setattr(self, "n_%s_proxies" % name, proxies.size())
                if unit_cell is None:
                    res_sum = residual_sum_function(
                        sites_cart=sites_cart,
                        proxies=proxies,
                        gradient_array=self.gradients)
                else:
                    res_sum = residual_sum_function(
                        unit_cell=unit_cell,
                        sites_cart=sites_cart,
                        proxies=proxies,
                        gradient_array=self.gradients)
                self.number_of_restraints += n_proxies
                self.residual_sum += res_sum
                setattr(self, "n_%s_proxies" % name, n_proxies)
                setattr(self, "%s_residual_sum" % name, res_sum)

        # ====================================================================
        # Managers
        # ====================================================================
        for name, manager in [("reference_dihedral",
                               reference_dihedral_manager),
                              ("ncs_dihedral", ncs_dihedral_manager),
                              ("den", den_manager),
                              ("ramachandran", ramachandran_manager)]:
            setattr(self, "n_%s_proxies" % name, None)
            setattr(self, "%s_residual_sum" % name, 0)
            if manager is not None:
                n_proxies = manager.get_n_proxies()
                res_sum = manager.target_and_gradients(
                    unit_cell=unit_cell,
                    sites_cart=sites_cart,
                    gradient_array=self.gradients)
                self.number_of_restraints += n_proxies
                self.residual_sum += res_sum
                setattr(self, "n_%s_proxies" % name, n_proxies)
                setattr(self, "%s_residual_sum" % name, res_sum)

        # ====================================================================
        # The rest (not yet unified)
        # ====================================================================
        if reference_coordinate_proxies is None:
            self.n_reference_coordinate_proxies = None
            self.reference_coordinate_residual_sum = 0
        else:
            import boost.python
            ext = boost.python.import_ext("mmtbx_reference_coordinate_ext")
            self.n_reference_coordinate_proxies = reference_coordinate_proxies.size(
            )
            self.reference_coordinate_residual_sum = \
                ext.reference_coordinate_residual_sum(
                    sites_cart=sites_cart,
                    proxies=reference_coordinate_proxies,
                    gradient_array=self.gradients)
            self.number_of_restraints += self.n_reference_coordinate_proxies
            self.residual_sum += self.reference_coordinate_residual_sum

        if (chirality_proxies is None):
            self.n_chirality_proxies = None
            self.chirality_residual_sum = 0
        else:
            self.n_chirality_proxies = len(chirality_proxies)
            self.chirality_residual_sum = geometry_restraints.chirality_residual_sum(
                sites_cart=sites_cart,
                proxies=chirality_proxies,
                gradient_array=self.gradients)
            self.number_of_restraints += self.n_chirality_proxies
            self.residual_sum += self.chirality_residual_sum

        if (external_energy_function is not None):
            self.external_energy = external_energy_function(
                sites_cart=sites_cart, gradient_array=self.gradients)
            self.residual_sum += self.external_energy
        else:
            self.external_energy = 0
        for extension_obj in self.extension_objects:
            extension_obj.energies_add(energies_obj=self)
        self.finalize_target_and_gradients()