Exemple #1
0
    def accelerations(self):
        self.stereochemistry_residuals = self.restraints_manager.energies_sites(
            sites_cart=self.structure.sites_cart(), compute_gradients=True)

        # Harmonic restraints
        if self.er_data is not None:
            if self.er_data.er_harmonic_restraints_info is not None:
                harmonic_grads = self.restraints_manager.geometry.ta_harmonic_restraints(
                    sites_cart=self.structure.sites_cart(),
                    ta_harmonic_restraint_info=self.er_data.
                    er_harmonic_restraints_info,
                    weight=self.er_data.er_harmonic_restraints_weight,
                    slack=self.er_data.er_harmonic_restraints_slack)
                assert self.stereochemistry_residuals.gradients.size(
                ) == harmonic_grads.size()
                self.stereochemistry_residuals.gradients += harmonic_grads
        result = self.stereochemistry_residuals.gradients

        d_max = None
        if (self.xray_structure_last_updated is not None
                and self.shift_update > 0):
            array_of_distances_between_each_atom = \
              flex.sqrt(self.structure.difference_vectors_cart(
                 self.xray_structure_last_updated).dot())
            d_max = flex.max(array_of_distances_between_each_atom)

        if (self.fmodel is not None):
            if (d_max is not None):
                if (d_max > self.shift_update):
                    self.xray_structure_last_updated = self.structure.deep_copy_scatterers(
                    )
                    self.xray_gradient = self.xray_grads()
            else:
                self.xray_gradient = self.xray_grads()
            result = self.xray_gradient * self.xray_target_weight \
                   + self.stereochemistry_residuals.gradients * self.chem_target_weight

        factor = 1.0
        if (self.chem_target_weight is not None):
            factor *= self.chem_target_weight
        if (self.stereochemistry_residuals.normalization_factor is not None):
            factor *= self.stereochemistry_residuals.normalization_factor

        if (factor != 1.0):
            result *= 1.0 / factor

        #Store RMS non-solvent atom gradients for Xray and Geo
        if self.er_data is not None:
            self.wc = self.chem_target_weight / factor
            self.wx = self.xray_target_weight / factor
            self.gg = self.stereochemistry_residuals.gradients * self.wc
            self.xg = self.xray_gradient * self.wx
            gg_pro = self.gg.select(~self.er_data.solvent_sel)
            xg_pro = self.xg.select(~self.er_data.solvent_sel)
            self.er_data.geo_grad_rms += (flex.mean_sq(gg_pro.as_double())**
                                          0.5) / self.n_steps
            self.er_data.xray_grad_rms += (flex.mean_sq(xg_pro.as_double())**
                                           0.5) / self.n_steps

        return result
Exemple #2
0
    def accelerations(self):
        self.stereochemistry_residuals = self.restraints_manager.energies_sites(
            sites_cart=self.structure.sites_cart(), compute_gradients=True
        )

        # Harmonic restraints
        if self.er_data is not None:
            if self.er_data.er_harmonic_restraints_info is not None:
                harmonic_grads = self.restraints_manager.geometry.ta_harmonic_restraints(
                    sites_cart=self.structure.sites_cart(),
                    ta_harmonic_restraint_info=self.er_data.er_harmonic_restraints_info,
                    weight=self.er_data.er_harmonic_restraints_weight,
                    slack=self.er_data.er_harmonic_restraints_slack,
                )
                assert self.stereochemistry_residuals.gradients.size() == harmonic_grads.size()
                self.stereochemistry_residuals.gradients += harmonic_grads
        result = self.stereochemistry_residuals.gradients

        d_max = None
        if self.xray_structure_last_updated is not None and self.shift_update > 0:
            array_of_distances_between_each_atom = flex.sqrt(
                self.structure.difference_vectors_cart(self.xray_structure_last_updated).dot()
            )
            d_max = flex.max(array_of_distances_between_each_atom)

        if self.fmodel is not None:
            if d_max is not None:
                if d_max > self.shift_update:
                    self.xray_structure_last_updated = self.structure.deep_copy_scatterers()
                    self.xray_gradient = self.xray_grads()
            else:
                self.xray_gradient = self.xray_grads()
            result = (
                self.xray_gradient * self.xray_target_weight
                + self.stereochemistry_residuals.gradients * self.chem_target_weight
            )

        factor = 1.0
        if self.chem_target_weight is not None:
            factor *= self.chem_target_weight
        if self.stereochemistry_residuals.normalization_factor is not None:
            factor *= self.stereochemistry_residuals.normalization_factor

        if factor != 1.0:
            result *= 1.0 / factor

        # Store RMS non-solvent atom gradients for Xray and Geo
        if self.er_data is not None:
            self.wc = self.chem_target_weight / factor
            self.wx = self.xray_target_weight / factor
            self.gg = self.stereochemistry_residuals.gradients * self.wc
            self.xg = self.xray_gradient * self.wx
            gg_pro = self.gg.select(~self.er_data.solvent_sel)
            xg_pro = self.xg.select(~self.er_data.solvent_sel)
            self.er_data.geo_grad_rms += (flex.mean_sq(gg_pro.as_double()) ** 0.5) / self.n_steps
            self.er_data.xray_grad_rms += (flex.mean_sq(xg_pro.as_double()) ** 0.5) / self.n_steps

        return result
Exemple #3
0
 def e_pot(O, sites_moved):
   if (   O.last_sites_moved is None
       or O.last_sites_moved.id() is not sites_moved.id()):
     O.last_sites_moved = sites_moved
     sites_cart = sites_moved
     #
     if (O.reduced_geo_manager is None):
       flags = None
       if (O.orca_experiments):
         flags = cctbx.geometry_restraints.flags.flags(
           nonbonded=False, default=True)
     else:
       # computing nonbonded interactions only with geo_manager,
       # contributions from other restraints below with reduced_geo_manager
       flags = cctbx.geometry_restraints.flags.flags(
         nonbonded=True, default=False)
     geo_energies = O.geo_manager.energies_sites(
       sites_cart=sites_cart,
       flags=flags,
       custom_nonbonded_function=O.custom_nonbonded_function,
       compute_gradients=True)
     if (0): # XXX orca_experiments
       print "geo_energies:"
       geo_energies.show()
     if (0): # XXX orca_experiments
       O.geo_manager.show_sorted(site_labels=O.site_labels)
     O.f = geo_energies.target
     O.g = geo_energies.gradients
     if (O.reduced_geo_manager is not None):
       reduced_geo_energies = O.reduced_geo_manager.energies_sites(
         sites_cart=sites_cart,
         compute_gradients=True)
       O.f += reduced_geo_energies.target
       O.g += reduced_geo_energies.gradients
     O.last_grms = group_args(geo=flex.mean_sq(O.g.as_double())**0.5)
     #
     if (O.density_map is not None):
       rs_f = maptbx.real_space_target_simple(
         unit_cell=O.geo_manager.crystal_symmetry.unit_cell(),
         density_map=O.density_map,
         sites_cart=sites_cart,
         selection=flex.bool(sites_cart.size(),True))
       rs_g = maptbx.real_space_gradients_simple(
         unit_cell=O.geo_manager.crystal_symmetry.unit_cell(),
         density_map=O.density_map,
         sites_cart=sites_cart,
         delta=O.real_space_gradients_delta,
         selection=flex.bool(sites_cart.size(),True))
       rs_f *= -O.real_space_target_weight
       rs_g *= -O.real_space_target_weight
       O.f += rs_f
       O.g += rs_g
       O.last_grms.real = flex.mean_sq(rs_g.as_double())**0.5
       O.last_grms.real_or_xray = "real"
     #
     O.last_grms.total = flex.mean_sq(O.g.as_double())**0.5
   return O.f
Exemple #4
0
 def e_pot(O, sites_moved):
   if (   O.last_sites_moved is None
       or O.last_sites_moved.id() != sites_moved.id()):
     O.last_sites_moved = sites_moved
     xs = O.fmodels.fmodel_xray().xray_structure
     assert len(sites_moved) == xs.scatterers().size()
     sites_cart = sites_moved
     xs.set_sites_cart(sites_cart=sites_cart)
     O.fmodels.update_xray_structure(update_f_calc=True)
     xs.scatterers().flags_set_grads(state=False)
     xs.scatterers().flags_set_grad_site(
       iselection=flex.size_t_range(xs.scatterers().size()))
     expected_g_size = len(sites_moved) * 3
     if (O.xray_weight_factor is not None):
       tg = O.fmodels.target_and_gradients(
         weights=O.weights,
         compute_gradients=True)
       O.f = tg.target() * O.xray_weight_factor
       O.g = tg.gradients() * O.xray_weight_factor
       assert O.g.size() == expected_g_size
     else:
       O.f = 0.
       O.g = flex.double(expected_g_size, 0)
     if (O.reduced_geo_manager is None):
       reduced_geo_energies = None
     else:
       reduced_geo_energies = O.reduced_geo_manager.energies_sites(
         sites_cart=sites_cart,
         compute_gradients=True)
     other_energies = O.model.restraints_manager.energies_sites(
       sites_cart=sites_cart,
       geometry_flags=cctbx.geometry_restraints.flags.flags(nonbonded=True),
       custom_nonbonded_function=O.custom_nonbonded_function,
       compute_gradients=True)
     nfw = other_energies.normalization_factor * O.weights.w
     O.f += other_energies.target * O.weights.w
     gg = other_energies.gradients * O.weights.w
     if (reduced_geo_energies is not None):
       O.f += reduced_geo_energies.target * nfw
       gg += reduced_geo_energies.gradients * nfw
     assert nfw != 0
     scale = 1 / nfw
     O.last_grms = group_args(
       geo=scale*flex.mean_sq(gg.as_double())**0.5,
       xray=scale*flex.mean_sq(O.g)**0.5,
       real_or_xray="xray")
     xray.minimization.add_gradients(
       scatterers=xs.scatterers(),
       xray_gradients=O.g,
       site_gradients=gg)
     O.f *= scale
     O.g *= scale
     O.last_grms.total = flex.mean_sq(O.g)**0.5
     O.g = flex.vec3_double(O.g)
   return O.f
Exemple #5
0
 def e_pot(O, sites_moved):
     if (O.last_sites_moved is None
             or O.last_sites_moved.id() != sites_moved.id()):
         O.last_sites_moved = sites_moved
         xs = O.fmodels.fmodel_xray().xray_structure
         assert len(sites_moved) == xs.scatterers().size()
         sites_cart = sites_moved
         xs.set_sites_cart(sites_cart=sites_cart)
         O.fmodels.update_xray_structure(update_f_calc=True)
         xs.scatterers().flags_set_grads(state=False)
         xs.scatterers().flags_set_grad_site(
             iselection=flex.size_t_range(xs.scatterers().size()))
         expected_g_size = len(sites_moved) * 3
         if (O.xray_weight_factor is not None):
             tg = O.fmodels.target_and_gradients(weights=O.weights,
                                                 compute_gradients=True)
             O.f = tg.target() * O.xray_weight_factor
             O.g = tg.gradients() * O.xray_weight_factor
             assert O.g.size() == expected_g_size
         else:
             O.f = 0.
             O.g = flex.double(expected_g_size, 0)
         if (O.reduced_geo_manager is None):
             reduced_geo_energies = None
         else:
             reduced_geo_energies = O.reduced_geo_manager.energies_sites(
                 sites_cart=sites_cart, compute_gradients=True)
         other_energies = O.model.restraints_manager.energies_sites(
             sites_cart=sites_cart,
             geometry_flags=cctbx.geometry_restraints.flags.flags(
                 nonbonded=True),
             custom_nonbonded_function=O.custom_nonbonded_function,
             compute_gradients=True)
         nfw = other_energies.normalization_factor * O.weights.w
         O.f += other_energies.target * O.weights.w
         gg = other_energies.gradients * O.weights.w
         if (reduced_geo_energies is not None):
             O.f += reduced_geo_energies.target * nfw
             gg += reduced_geo_energies.gradients * nfw
         assert nfw != 0
         scale = 1 / nfw
         O.last_grms = group_args(geo=scale *
                                  flex.mean_sq(gg.as_double())**0.5,
                                  xray=scale * flex.mean_sq(O.g)**0.5,
                                  real_or_xray="xray")
         xray.minimization.add_gradients(scatterers=xs.scatterers(),
                                         xray_gradients=O.g,
                                         site_gradients=gg)
         O.f *= scale
         O.g *= scale
         O.last_grms.total = flex.mean_sq(O.g)**0.5
         O.g = flex.vec3_double(O.g)
     return O.f
 def compute_functional_and_gradients(self):
   self.apply_shifts()
   self.compute_target(compute_gradients = True)
   if(self.verbose > 1):
     print "xray.minimization line search: f,rms(g):",
     print self.f, math.sqrt(flex.mean_sq(self.g))
   return self.f, self.g
 def compute_functional_and_gradients(self):
   u_iso_refinable_params = self.apply_shifts()
   self.compute_target(compute_gradients=True)
   self.f = self.target_result.target()
   if (self.first_target_value is None):
     self.first_target_value = self.f
   if (self.occupancy_penalty is not None
       and self.grad_flags_counts != 0):
     occupancies = self.xray_structure.scatterers().extract_occupancies()
     for occupancy in occupancies:
       self.f += self.occupancy_penalty.functional(occupancy=occupancy)
   self.g = self.structure_factor_gradients(
     xray_structure=self.xray_structure,
     u_iso_refinable_params=u_iso_refinable_params,
     miller_set=self.target_functor.f_obs(),
     d_target_d_f_calc=self.target_result.derivatives(),
     n_parameters=self.x.size(),
     algorithm=self.structure_factor_algorithm).packed()
   if (self.occupancy_penalty is not None
       and self.grad_flags_counts != 0):
     g = flex.double()
     for occupancy in occupancies:
       g.append(self.occupancy_penalty.gradient(occupancy=occupancy))
     del occupancies
     add_gradients(
       scatterers=self.xray_structure.scatterers(),
       xray_gradients=self.g,
       occupancy_gradients=g)
     del g
   if (self.verbose > 1):
     print "xray.minimization line search: f,rms(g):",
     print self.f, math.sqrt(flex.mean_sq(self.g))
   return self.f, self.g
Exemple #8
0
 def get_rms_info(O):
   if (O.reference_structure is None):
     return None
   xs = O.xray_structure
   rs = O.reference_structure
   xf = xs.sites_frac()
   rf = rs.sites_frac()
   cd = xf - rf
   # TODO: use scattering power as weights, move to method of xray.structure
   ave_csh = matrix.col(cd.mean())
   ave_csh_perp = matrix.col(xs.space_group_info()
     .subtract_continuous_allowed_origin_shifts(translation_frac=ave_csh))
   caosh_corr = ave_csh_perp - ave_csh
   ad = cd + caosh_corr
   ud = xs.scatterers().extract_u_iso() \
      - rs.scatterers().extract_u_iso()
   omx = xs.unit_cell().orthogonalization_matrix()
   O.crmsd = (omx * cd).rms_length()
   O.armsd = (omx * ad).rms_length()
   O.urmsd = flex.mean_sq(ud)**0.5
   if (O.params.show_distances_to_reference_structure):
     for sc, a, u in zip(xs.scatterers(), omx * ad, ud):
       print "    %-10s" % sc.label, \
         " ".join(["%6.3f" % v for v in a]), \
         "%6.3f" % u
   return (O.crmsd, O.armsd, O.urmsd)
Exemple #9
0
 def get_rms_info(O):
   if (O.reference_structure is None):
     return None
   xs = O.xray_structure
   rs = O.reference_structure
   xf = xs.sites_frac()
   rf = rs.sites_frac()
   cd = xf - rf
   # TODO: use scattering power as weights, move to method of xray.structure
   ave_csh = matrix.col(cd.mean())
   ave_csh_perp = matrix.col(xs.space_group_info()
     .subtract_continuous_allowed_origin_shifts(translation_frac=ave_csh))
   caosh_corr = ave_csh_perp - ave_csh
   ad = cd + caosh_corr
   ud = xs.scatterers().extract_u_iso() \
      - rs.scatterers().extract_u_iso()
   omx = xs.unit_cell().orthogonalization_matrix()
   O.crmsd = (omx * cd).rms_length()
   O.armsd = (omx * ad).rms_length()
   O.urmsd = flex.mean_sq(ud)**0.5
   if (O.params.show_distances_to_reference_structure):
     for sc, a, u in zip(xs.scatterers(), omx * ad, ud):
       print "    %-10s" % sc.label, \
         " ".join(["%6.3f" % v for v in a]), \
         "%6.3f" % u
   return (O.crmsd, O.armsd, O.urmsd)
Exemple #10
0
 def compute_functional_and_gradients(self):
     u_iso_refinable_params = self.apply_shifts()
     self.compute_target(compute_gradients=True)
     self.f = self.target_result.target()
     if (self.first_target_value is None):
         self.first_target_value = self.f
     if (self.occupancy_penalty is not None
             and self.grad_flags_counts != 0):
         occupancies = self.xray_structure.scatterers().extract_occupancies(
         )
         for occupancy in occupancies:
             self.f += self.occupancy_penalty.functional(
                 occupancy=occupancy)
     self.g = self.structure_factor_gradients(
         xray_structure=self.xray_structure,
         u_iso_refinable_params=u_iso_refinable_params,
         miller_set=self.target_functor.f_obs(),
         d_target_d_f_calc=self.target_result.derivatives(),
         n_parameters=self.x.size(),
         algorithm=self.structure_factor_algorithm).packed()
     if (self.occupancy_penalty is not None
             and self.grad_flags_counts != 0):
         g = flex.double()
         for occupancy in occupancies:
             g.append(self.occupancy_penalty.gradient(occupancy=occupancy))
         del occupancies
         add_gradients(scatterers=self.xray_structure.scatterers(),
                       xray_gradients=self.g,
                       occupancy_gradients=g)
         del g
     if (self.verbose > 1):
         print "xray.minimization line search: f,rms(g):",
         print self.f, math.sqrt(flex.mean_sq(self.g))
     return self.f, self.g
 def compute_functional_and_gradients(self):
   u_iso_refinable_params = self.apply_shifts()
   self.compute_target(compute_gradients     = True,
                       u_iso_refinable_params = u_iso_refinable_params)
   if (self.verbose > 1):
     print "xray.minimization line search: f,rms(g):",
     print self.f, math.sqrt(flex.mean_sq(self.g))
   return self.f, self.g
Exemple #12
0
 def compute_functional_and_gradients(self):
   u_iso_refinable_params = self.apply_shifts()
   self.compute_target(compute_gradients     = True,
                       u_iso_refinable_params = u_iso_refinable_params)
   if (self.verbose > 1):
     print("xray.minimization line search: f,rms(g):", end=' ')
     print(self.f, math.sqrt(flex.mean_sq(self.g)))
   return self.f, self.g
Exemple #13
0
 def __init__(O, curvs, lim_eps):
     c_pos = curvs.select(curvs > 0)
     O.c_lim = flex.max_default(c_pos, default=0) * lim_eps
     if (O.c_lim == 0):
         O.c_lim = 1
         O.c_rms = 1
     else:
         O.c_rms = flex.mean_sq(c_pos)**0.5
     O.n_below_limit = 0
     O.n_above_limit = 0
 def __init__(O, curvs, lim_eps):
   c_pos = curvs.select(curvs > 0)
   O.c_lim = flex.max_default(c_pos, default=0) * lim_eps
   if (O.c_lim == 0):
     O.c_lim = 1
     O.c_rms = 1
   else:
     O.c_rms = flex.mean_sq(c_pos)**0.5
   O.n_below_limit = 0
   O.n_above_limit = 0
Exemple #15
0
  def calcskew(self, map_coeff, iparams):
    real_map = map_coeff.fft_map().real_map()

    ed_limit = iparams.fit_params.ed_sigma_thres*real_map.sample_standard_deviation()

    ed_limit_up=ed_limit
    ed_limit_dn=ed_limit*-1

    #truncate the electron density beyond sigma limit
    real_map.set_selected(real_map>ed_limit_up,ed_limit_up)
    real_map.set_selected(real_map<ed_limit_dn,ed_limit_dn)

    skew = flex.mean(flex.pow(real_map,3))/pow(flex.mean_sq(real_map),3/2)

    return skew
Exemple #16
0
 def compute_functional_and_gradients(self):
   u_iso_refinable_params = self.apply_shifts()
   self.compute_target(compute_gradients=True)
   self.f = self.target_result.target()
   gradients = self.structure_factor_gradients(
     xray_structure=self.xray_structure,
     u_iso_refinable_params=u_iso_refinable_params,
     miller_set=self.target_functor.f_obs(),
     d_target_d_f_calc=self.target_result.derivatives(),
     n_parameters=0, # so the gradients aren't packed
     algorithm=self.structure_factor_algorithm)
   if self.scatterer_grad_flags_counts.site:
     d_target_d_site_frac = gradients.d_target_d_site_frac()
   if self.scatterer_grad_flags_counts.u_iso:
     d_target_d_u_iso = gradients.d_target_d_u_iso()
   if self.scatterer_grad_flags_counts.u_aniso:
     d_target_d_u_star = gradients.d_target_d_u_star()
   if self.scatterer_grad_flags_counts.fp:
     d_target_d_fp = gradients.d_target_d_fp()
   if self.scatterer_grad_flags_counts.fdp:
     d_target_d_fdp = gradients.d_target_d_fdp()
   if self.scatterer_grad_flags_counts.occupancy:
     d_target_d_occupancy = gradients.d_target_d_occupancy()
   # pack the gradients ourselves - currently the constraints system assumes
   # we are refining fractional coordinates and u_star
   self.g = flex.double()
   for i, sc in enumerate(self.xray_structure.scatterers()):
     if sc.flags.grad_site():
       for j in range(3):
         self.g.append(d_target_d_site_frac[i][j])
     if sc.flags.use_u_iso() and sc.flags.grad_u_iso():
       self.g.append(d_target_d_u_iso[i])
     if sc.flags.use_u_aniso() and sc.flags.grad_u_aniso():
       for j in range(6):
         self.g.append(d_target_d_u_star[i][j])
     if sc.flags.grad_occupancy():
       self.g.append(d_target_d_occupancy[i])
     if sc.flags.grad_fp():
       self.g.append(d_target_d_fp[i])
     if sc.flags.grad_fdp():
       self.g.append(d_target_d_fdp[i])
   if self.verbose > 0:
     print "xray.minimization line search: f,rms(g):",
     print self.f, math.sqrt(flex.mean_sq(self.g))
   jacobian = self.reparametrisation.jacobian_transpose_matching_grad_fc()
   self.g = jacobian * self.g
   return self.f, self.g
Exemple #17
0
 def compute_functional_and_gradients(self):
     u_iso_refinable_params = self.apply_shifts()
     self.compute_target(compute_gradients=True)
     self.f = self.target_result.target()
     gradients = self.structure_factor_gradients(
         xray_structure=self.xray_structure,
         u_iso_refinable_params=u_iso_refinable_params,
         miller_set=self.target_functor.f_obs(),
         d_target_d_f_calc=self.target_result.derivatives(),
         n_parameters=0,  # so the gradients aren't packed
         algorithm=self.structure_factor_algorithm)
     if self.scatterer_grad_flags_counts.site:
         d_target_d_site_frac = gradients.d_target_d_site_frac()
     if self.scatterer_grad_flags_counts.u_iso:
         d_target_d_u_iso = gradients.d_target_d_u_iso()
     if self.scatterer_grad_flags_counts.u_aniso:
         d_target_d_u_star = gradients.d_target_d_u_star()
     if self.scatterer_grad_flags_counts.fp:
         d_target_d_fp = gradients.d_target_d_fp()
     if self.scatterer_grad_flags_counts.fdp:
         d_target_d_fdp = gradients.d_target_d_fdp()
     if self.scatterer_grad_flags_counts.occupancy:
         d_target_d_occupancy = gradients.d_target_d_occupancy()
     # pack the gradients ourselves - currently the constraints system assumes
     # we are refining fractional coordinates and u_star
     self.g = flex.double()
     for i, sc in enumerate(self.xray_structure.scatterers()):
         if sc.flags.grad_site():
             for j in range(3):
                 self.g.append(d_target_d_site_frac[i][j])
         if sc.flags.use_u_iso() and sc.flags.grad_u_iso():
             self.g.append(d_target_d_u_iso[i])
         if sc.flags.use_u_aniso() and sc.flags.grad_u_aniso():
             for j in range(6):
                 self.g.append(d_target_d_u_star[i][j])
         if sc.flags.grad_occupancy():
             self.g.append(d_target_d_occupancy[i])
         if sc.flags.grad_fp():
             self.g.append(d_target_d_fp[i])
         if sc.flags.grad_fdp():
             self.g.append(d_target_d_fdp[i])
     if self.verbose > 0:
         print "xray.minimization line search: f,rms(g):",
         print self.f, math.sqrt(flex.mean_sq(self.g))
     jacobian = self.reparametrisation.jacobian_transpose_matching_grad_fc()
     self.g = jacobian * self.g
     return self.f, self.g
Exemple #18
0
 def update_fgc(O, is_iterate=False):
   if (len(O.xfgc_infos) != 0):
     prev_xfgc = O.xfgc_infos[-1]
     if (prev_xfgc.x.all_eq(O.x)):
       if (not prev_xfgc.is_iterate):
         prev_xfgc.is_iterate = is_iterate
       return
   tg = O.__unpack_variables_get_tg()
   assert tg.target_work() is not None
   gact = O.xray_structure.grads_and_curvs_target_simple(
     miller_indices=O.f_obs.indices(),
     da_db=tg.gradients_work(),
     daa_dbb_dab=tg.hessians_work())
   O.funcl = tg.target_work()
   O.grads = gact.grads.select(O.gact_indices)
   O.curvs = gact.curvs.select(O.gact_indices)
   O.grads_mean_sq = flex.mean_sq(O.grads)
   O.xfgc_infos.append(xfgc_info(work_obj=O, is_iterate=is_iterate))
Exemple #19
0
 def update_fgc(O, is_iterate=False):
   if (len(O.xfgc_infos) != 0):
     prev_xfgc = O.xfgc_infos[-1]
     if (prev_xfgc.x.all_eq(O.x)):
       if (not prev_xfgc.is_iterate):
         prev_xfgc.is_iterate = is_iterate
       return
   tg = O.__unpack_variables_get_tg()
   assert tg.target_work() is not None
   gact = O.xray_structure.grads_and_curvs_target_simple(
     miller_indices=O.f_obs.indices(),
     da_db=tg.gradients_work(),
     daa_dbb_dab=tg.hessians_work())
   O.funcl = tg.target_work()
   O.grads = gact.grads.select(O.gact_indices)
   O.curvs = gact.curvs.select(O.gact_indices)
   O.grads_mean_sq = flex.mean_sq(O.grads)
   O.xfgc_infos.append(xfgc_info(work_obj=O, is_iterate=is_iterate))
Exemple #20
0
 def get_rms_info(O):
     if (O.reference_structure is None):
         return None
     xs = O.xray_structure
     rs = O.reference_structure
     xf = xs.sites_frac()
     rf = rs.sites_frac()
     # TODO: use scattering power as weights, move to method of xray.structure
     ave_csh = matrix.col((xf - rf).mean())
     ave_csh_perp = matrix.col(
         xs.space_group_info().subtract_continuous_allowed_origin_shifts(
             translation_frac=ave_csh))
     caosh_corr = ave_csh - ave_csh_perp
     omx = xs.unit_cell().orthogonalization_matrix()
     O.crmsd = (omx * (rf - xf)).rms_length()
     O.armsd = (omx * (rf - xf + caosh_corr)).rms_length()
     O.urmsd = flex.mean_sq(xs.scatterers().extract_u_iso() -
                            rs.scatterers().extract_u_iso())**0.5
     return (O.crmsd, O.armsd, O.urmsd)
 def get_rms_info(O):
   if (O.reference_structure is None):
     return None
   xs = O.xray_structure
   rs = O.reference_structure
   xf = xs.sites_frac()
   rf = rs.sites_frac()
   # TODO: use scattering power as weights, move to method of xray.structure
   ave_csh = matrix.col((xf-rf).mean())
   ave_csh_perp = matrix.col(xs.space_group_info()
     .subtract_continuous_allowed_origin_shifts(translation_frac=ave_csh))
   caosh_corr = ave_csh - ave_csh_perp
   omx = xs.unit_cell().orthogonalization_matrix()
   O.crmsd = (omx * (rf - xf)).rms_length()
   O.armsd = (omx * (rf - xf + caosh_corr)).rms_length()
   O.urmsd = flex.mean_sq(
       xs.scatterers().extract_u_iso()
     - rs.scatterers().extract_u_iso())**0.5
   return (O.crmsd, O.armsd, O.urmsd)
 def show_f_g(label, f, g):
     print >> out, label, "f, |g|:", f, flex.mean_sq(g)**0.5
Exemple #23
0
 def show_f_g(label, f, g):
     print(label, "f, |g|:", f, flex.mean_sq(g)**0.5, file=out)
 def show_f_g(label, f, g):
   print >> out, label, "f, |g|:", f, flex.mean_sq(g)**0.5
Exemple #25
0
def run_coordinate_refinement(
      geometry_restraints_manager,
      selection_variable,
      density_map,
      real_space_gradients_delta,
      work_params,
      pdb_atoms=None,
      sites_cart=None,
      home_restraints_list=[],
      work_scatterers=None,
      unit_cell=None,
      d_min=None,
      weight_map=None,
      write_pdb_callback=None,
      log=None):
  assert [pdb_atoms, sites_cart].count(None)==1
  if (log is None): log = null_out()
  if (work_scatterers is not None):
    assert unit_cell is not None
    assert d_min is not None
  best_info = None
  if (pdb_atoms is not None):
    sites_cart_start = pdb_atoms.extract_xyz()
    site_labels = [atom.id_str() for atom in pdb_atoms]
  else:
    sites_cart_start = sites_cart
    site_labels = None
  grmp = geometry_restraints_manager_plus(
    manager=geometry_restraints_manager,
    home_sites_cart=sites_cart_start,
    home_restraints_list=home_restraints_list)
  print >> log, "Before coordinate refinement:"
  grmp.energies_sites(sites_cart=sites_cart_start).show(f=log)
  print >> log
  log.flush()
  rstw_params = work_params.coordinate_refinement.real_space_target_weights
  if (rstw_params.number_of_samples is None):
    rstw_list = [work_params.real_space_target_weight]
  else:
    rstw_list = [rstw_params.first_sample + i * rstw_params.sampling_step
      for i in xrange(rstw_params.number_of_samples)]
  lbfgs_termination_params = scitbx.lbfgs.termination_parameters(
    max_iterations=work_params.coordinate_refinement
      .lbfgs_max_iterations)
  lbfgs_exception_handling_params = \
    scitbx.lbfgs.exception_handling_parameters(
      ignore_line_search_failed_step_at_lower_bound=True)
  bond_rmsd_list = []
  for rstw in rstw_list:
    refined = maptbx.real_space_refinement_simple.lbfgs(
      sites_cart=sites_cart_start,
      density_map=density_map,
      weight_map=weight_map,
      selection_variable=selection_variable,
      geometry_restraints_manager=grmp,
      real_space_target_weight=rstw,
      real_space_gradients_delta=real_space_gradients_delta,
      local_standard_deviations_radius=
        work_params.local_standard_deviations_radius,
      weight_map_scale_factor=work_params.weight_map_scale_factor,
      lbfgs_termination_params=lbfgs_termination_params,
      lbfgs_exception_handling_params=lbfgs_exception_handling_params)
    print >> log, "After coordinate refinement" \
      " with real-space target weight %.1f:" % rstw
    grmp.energies_sites(sites_cart=refined.sites_cart).show(f=log)
    bond_proxies = grmp.pair_proxies().bond_proxies
    bond_proxies.show_sorted(
      by_value="residual",
      sites_cart=refined.sites_cart,
      site_labels=site_labels,
      f=log,
      prefix="  ",
      max_items=3)
    print >> log
    print >> log, "  number_of_function_evaluations:", \
      refined.number_of_function_evaluations
    print >> log, "  real+geo target start: %.6g" % refined.f_start
    print >> log, "  real+geo target final: %.6g" % refined.f_final
    deltas = bond_proxies.deltas(sites_cart=refined.sites_cart)
    deltas_abs = flex.abs(deltas)
    deltas_abs_sorted = deltas_abs.select(
      flex.sort_permutation(deltas_abs), reverse=True)
    wabr_params = rstw_params.worst_acceptable_bond_rmsd
    acceptable = (
      flex.mean_default(deltas_abs_sorted[:wabr_params.pool_size],0)
        < wabr_params.max_pool_average)
    if(deltas.size()>0):
      bond_rmsd = flex.mean_sq(deltas)**0.5
    else: bond_rmsd=0
    bond_rmsd_list.append(bond_rmsd)
    print >> log, "  Bond RMSD: %.3f" % bond_rmsd
    #
    if (work_scatterers is None):
      region_cc = None
    else:
      region_cc = maptbx.region_density_correlation(
        large_unit_cell=unit_cell,
        large_d_min=d_min,
        large_density_map=density_map,
        sites_cart=refined.sites_cart_variable,
        site_radii=flex.double(refined.sites_cart_variable.size(), 1),
        work_scatterers=work_scatterers)
    #
    rmsd_diff = abs(rstw_params.bond_rmsd_target - bond_rmsd)
    if (   best_info is None
        or best_info.rmsd_diff > rmsd_diff
          and (acceptable or not best_info.acceptable)):
      best_info = group_args(
        rstw=rstw,
        refined=refined,
        acceptable=acceptable,
        rmsd_diff=rmsd_diff,
        region_cc=region_cc,
        sites_cart=refined.sites_cart)
    print >> log
  if (best_info is not None):
    print >> log, "Table of real-space target weights vs. bond RMSD:"
    print >> log, "  weight   RMSD"
    for w,d in zip(rstw_list, bond_rmsd_list):
      print >> log, "  %6.1f  %5.3f" % (w,d)
    print >> log, "Best real-space target weight: %.1f" % best_info.rstw
    print >> log, \
      "Associated refined final value: %.6g" % best_info.refined.f_final
    if (best_info.region_cc is not None):
      print >> log, "Associated region correlation: %.4f" % best_info.region_cc
    print >> log
    if (pdb_atoms is not None):
      pdb_atoms.set_xyz(new_xyz=refined.sites_cart)
    if (write_pdb_callback is not None):
      write_pdb_callback(situation="after_best_weight_determination")
    #
    fgm_params = work_params.coordinate_refinement \
      .finishing_geometry_minimization
    if (fgm_params.cycles_max is not None and fgm_params.cycles_max > 0):
      print >> log, "As previously obtained with target weight %.1f:" \
        % best_info.rstw
      grmp.energies_sites(sites_cart=refined.sites_cart).show(
        f=log, prefix="  ")
      print >> log, "Finishing refinement to idealize geometry:"
      print >> log, "            number of function"
      print >> log, "    weight     evaluations      cycle RMSD"
      number_of_fgm_cycles = 0
      rstw = best_info.rstw * fgm_params.first_weight_scale
      sites_cart_start = best_info.refined.sites_cart.deep_copy()
      for i_cycle in xrange(fgm_params.cycles_max):
        fgm_refined = maptbx.real_space_refinement_simple.lbfgs(
          sites_cart=sites_cart_start,
          density_map=density_map,
          selection_variable=selection_variable,
          geometry_restraints_manager=grmp,
          energies_sites_flags=cctbx.geometry_restraints.flags.flags(
            default=True, dihedral=fgm_params.dihedral_restraints),
          real_space_target_weight=rstw,
          real_space_gradients_delta=real_space_gradients_delta,
          local_standard_deviations_radius=
            work_params.local_standard_deviations_radius,
          weight_map_scale_factor=work_params.weight_map_scale_factor,
          lbfgs_termination_params=lbfgs_termination_params,
          lbfgs_exception_handling_params=lbfgs_exception_handling_params)
        cycle_rmsd = sites_cart_start.rms_difference(fgm_refined.sites_cart)
        print >> log, "   %6.1f     %10d          %6.3f" % (
          rstw, fgm_refined.number_of_function_evaluations, cycle_rmsd)
        number_of_fgm_cycles += 1
        rstw *= fgm_params.cycle_weight_multiplier
        if (cycle_rmsd < 1.e-4):
          break
        if (fgm_params.superpose_cycle_end_with_cycle_start):
          fit = scitbx.math.superpose.least_squares_fit(
            reference_sites=best_info.refined.sites_cart,
            other_sites=fgm_refined.sites_cart)
          fgm_refined.sites_cart = fit.other_sites_best_fit()
        sites_cart_start = fgm_refined.sites_cart.deep_copy()
      print >> log, "After %d refinements to idealize geometry:" % (
        number_of_fgm_cycles)
      grmp.energies_sites(sites_cart=fgm_refined.sites_cart).show(
        f=log, prefix="  ")
      if (work_scatterers is None):
        fgm_region_cc = None
      else:
        fgm_region_cc = maptbx.region_density_correlation(
          large_unit_cell=unit_cell,
          large_d_min=d_min,
          large_density_map=density_map,
          sites_cart=fgm_refined.sites_cart_variable,
          site_radii=flex.double(fgm_refined.sites_cart_variable.size(), 1),
          work_scatterers=work_scatterers)
        print >> log, "  Associated region correlation: %.4f" % fgm_region_cc
      print >> log
      best_info.fgm_refined = fgm_refined
      best_info.fgm_region_cc = fgm_region_cc
      if (pdb_atoms is not None):
        pdb_atoms.set_xyz(new_xyz=fgm_refined.sites_cart)
      best_info.sites_cart = fgm_refined.sites_cart
      if (write_pdb_callback is not None):
        write_pdb_callback(situation="after_finishing_geo_min")
    else:
      best_info.fgm_refined = None
      best_info.fgm_region_cc = None
  return best_info
Exemple #26
0
def exercise_statistics():
  import scitbx.math
  for flex_type in flex_types():
    a = flex_type(flex.grid((3,5)))
    s = maptbx.statistics(a)
    assert s.min() == 0
    assert s.max() == 0
    assert s.mean() == 0
    assert s.mean_sq() == 0
    assert s.sigma() == 0
    a = flex_type([random.random() for i in xrange(3*5)])
    a.resize(flex.grid((3,5)))
    s = maptbx.statistics(a)
    assert approx_equal(flex.min(a), s.min())
    assert approx_equal(flex.max(a), s.max())
    assert approx_equal(flex.mean(a), s.mean())
    assert approx_equal(flex.mean_sq(a), s.mean_sq())
    assert approx_equal(flex.mean_sq(a)-flex.mean(a)**2, s.sigma()**2)
    b = flex_type(flex.grid((4,6)).set_focus((3,5)))
    for i in xrange(3):
      for j in xrange(5):
        b[(i,j)] = a[(i,j)]
    b[(3,5)] = -1
    b[(2,5)] = 2
    b.resize(flex.grid((-2,3), (2,9)).set_focus((1,8)))
    t = maptbx.statistics(b)
    assert not_approx_equal(flex.min(b), t.min())
    assert not_approx_equal(flex.max(b), t.max())
    assert not_approx_equal(flex.mean(b), t.mean())
    assert not_approx_equal(flex.mean_sq(b), t.mean_sq())
    assert not_approx_equal(flex.mean_sq(b)-flex.mean(b)**2, t.sigma()**2)
    assert approx_equal(s.min(), t.min())
    assert approx_equal(s.max(), t.max())
    assert approx_equal(s.mean(), t.mean())
    assert approx_equal(s.mean_sq(), t.mean_sq())
    assert approx_equal(s.sigma(), t.sigma())
  a = flex.double(flex.grid(5,3))
  s = maptbx.more_statistics(a)
  assert s.min() == 0
  assert s.max() == 0
  assert s.mean() == 0
  assert s.mean_sq() == 0
  assert s.sigma() == 0
  assert s.skewness() == 0
  assert s.kurtosis() == 0
  a = flex.random_double(5*3)
  reference = scitbx.math.basic_statistics(a)
  a.resize(flex.grid(5,3))
  s = maptbx.more_statistics(a)
  assert approx_equal(s.min(), reference.min)
  assert approx_equal(s.max(), reference.max)
  assert approx_equal(s.mean(), reference.mean)
  assert approx_equal(s.sigma(), reference.biased_standard_deviation)
  assert approx_equal(s.skewness(), reference.skew)
  assert approx_equal(s.kurtosis(), reference.kurtosis)
  b = flex.double(flex.grid((6,4)).set_focus((5,3)))
  for i in xrange(5):
    for j in xrange(3):
      b[(i,j)] = a[(i,j)]
  b[(5,3)] = -1
  b[(5,2)] = 2
  b.resize(flex.grid((3,-2), (9,2)).set_focus((8,1)))
  t = maptbx.statistics(b)
  assert approx_equal(s.min(), reference.min)
  assert approx_equal(s.max(), reference.max)
  assert approx_equal(s.mean(), reference.mean)
  assert approx_equal(s.sigma(), reference.biased_standard_deviation)
  assert approx_equal(s.skewness(), reference.skew)
  assert approx_equal(s.kurtosis(), reference.kurtosis)
  m = flex.double(flex.grid((6,4,8)).set_focus((5,3,7)))