示例#1
0
 def callback_after_step(self, minimizer):
     if self.verbose > 0:
         print "xray.minimization step: f,iter,nfun:",
         print self.f, minimizer.iter(), minimizer.nfun()
     if self.verbose > 1 and self.reference_structure is not None:
         xray.meaningful_site_cart_differences(
             self.xray_structure, self.reference_structure).show()
    def check_refinement_stability(self):
        if not self.shall_refine_thermal_displacements:
            for sc in self.xray_structure.scatterers():
                sc.flags.set_grad_site(True)
                if sc.flags.use_u_aniso(): sc.flags.set_grad_u_aniso(False)
                if sc.flags.use_u_iso(): sc.flags.set_grad_u_iso(False)

        xs = self.xray_structure
        xs0 = self.reference_xray_structure = xs.deep_copy_scatterers()
        mi = xs0.build_miller_set(anomalous_flag=False, d_min=0.5)
        fo_sq = mi.structure_factors_from_scatterers(
            xs0, algorithm="direct").f_calc().norm()
        fo_sq = fo_sq.customized_copy(sigmas=flex.double(fo_sq.size(), 1))

        xs.shake_sites_in_place(rms_difference=0.1)
        if self.shall_refine_thermal_displacements:
            # a spread of 10 for u_iso's would be enormous for our low temperature
            # test structures if those u_iso's were not constrained
            xs.shake_adp(
                spread=10,  # absolute
                aniso_spread=0.2)  # relative

        self.reparametrisation = constraints.reparametrisation(
            xs,
            self.constraints,
            self.connectivity_table,
            temperature=self.t_celsius)
        obs = fo_sq.as_xray_observations()
        ls = least_squares.crystallographic_ls(
            obs,
            self.reparametrisation,
            weighting_scheme=least_squares.mainstream_shelx_weighting())
        self.cycles = self.normal_eqns_solving_method(ls)
        print("%i %s iterations to recover from shaking" %
              (self.cycles.n_iterations, self.cycles))
        if 0:
            from crys3d.qttbx.xray_structure_viewer import display
            display(xray_structure=xs)

        diff = xray.meaningful_site_cart_differences(xs0, xs)
        assert diff.max_absolute() < self.site_refinement_tolerance,\
               self.__class__.__name__

        if self.shall_refine_thermal_displacements:
            delta_u = []
            for sc, sc0 in itertools.izip(xs.scatterers(), xs0.scatterers()):
                if not sc.flags.use_u_aniso() or not sc0.flags.use_u_aniso():
                    continue
                delta_u.extend(matrix.col(sc.u_star) - matrix.col(sc0.u_star))
            delta_u = flex.double(delta_u)

            assert flex.max_absolute(delta_u) < self.u_star_refinement_tolerance,\
                   self.__class__.__name__
  def check_refinement_stability(self):
    if not self.shall_refine_thermal_displacements:
      for sc in self.xray_structure.scatterers():
        sc.flags.set_grad_site(True)
        if sc.flags.use_u_aniso(): sc.flags.set_grad_u_aniso(False)
        if sc.flags.use_u_iso(): sc.flags.set_grad_u_iso(False)

    xs = self.xray_structure
    xs0 = self.reference_xray_structure = xs.deep_copy_scatterers()
    mi = xs0.build_miller_set(anomalous_flag=False, d_min=0.5)
    fo_sq = mi.structure_factors_from_scatterers(
      xs0, algorithm="direct").f_calc().norm()
    fo_sq = fo_sq.customized_copy(sigmas=flex.double(fo_sq.size(), 1))

    xs.shake_sites_in_place(rms_difference=0.1)
    if self.shall_refine_thermal_displacements:
      # a spread of 10 for u_iso's would be enormous for our low temperature
      # test structures if those u_iso's were not constrained
      xs.shake_adp(spread=10, # absolute
                   aniso_spread=0.2) # relative

    self.reparametrisation = constraints.reparametrisation(
      xs, self.constraints, self.connectivity_table,
      temperature=self.t_celsius)
    obs = fo_sq.as_xray_observations()
    ls = least_squares.crystallographic_ls(
      obs,
      self.reparametrisation,
      weighting_scheme=least_squares.mainstream_shelx_weighting())
    self.cycles = self.normal_eqns_solving_method(ls)
    print ("%i %s iterations to recover from shaking"
           % (self.cycles.n_iterations,
              self.cycles))
    if 0:
      from crys3d.qttbx.xray_structure_viewer import display
      display(xray_structure=xs)

    diff = xray.meaningful_site_cart_differences(xs0, xs)
    assert diff.max_absolute() < self.site_refinement_tolerance,\
           self.__class__.__name__

    if self.shall_refine_thermal_displacements:
      delta_u = []
      for sc, sc0 in itertools.izip(xs.scatterers(), xs0.scatterers()):
        if not sc.flags.use_u_aniso() or not sc0.flags.use_u_aniso(): continue
        delta_u.extend(matrix.col(sc.u_star) - matrix.col(sc0.u_star))
      delta_u = flex.double(delta_u)

      assert flex.max_absolute(delta_u) < self.u_star_refinement_tolerance,\
             self.__class__.__name__
示例#4
0
def exercise_constrained_lbfgs(xray_structure,
                               constraints_list,
                               t_celsius,
                               d_min=0.5,
                               shake_sites_rmsd=0.5,
                               shake_u_iso_spread=0,
                               shake_u_aniso_spread=0,
                               grad_site=True,
                               grad_u_iso=True,
                               grad_u_aniso=False,
                               grad_occupancy=False,
                               grad_fp_fdp=False,
                               lbfgs_m=5,
                               lbfgs_max_iterations=1000,
                               verbose=0):

    xs = xray_structure
    xray.set_scatterer_grad_flags(scatterers=xs.scatterers(),
                                  site=grad_site,
                                  u_iso=grad_u_iso,
                                  u_aniso=grad_u_aniso,
                                  occupancy=grad_occupancy,
                                  fp=grad_fp_fdp,
                                  fdp=grad_fp_fdp,
                                  tan_u_iso=False,
                                  param=0)

    xs0 = xs.deep_copy_scatterers()
    mi = xs0.build_miller_set(anomalous_flag=False, d_min=d_min)
    fo_sq = mi.structure_factors_from_scatterers(
        xs0, algorithm="direct").f_calc().norm()
    fo_sq = fo_sq.customized_copy(sigmas=flex.double(fo_sq.size(), 1))
    fo_sq.set_observation_type_xray_intensity()
    y_obs = fo_sq
    #y_obs = fo_sq.f_sq_as_f()
    if grad_site:
        xs.shake_sites_in_place(rms_difference=shake_sites_rmsd)
    if not grad_u_aniso: shake_u_aniso_spread = 0
    if not grad_u_iso: shake_u_iso_spread = 0
    if grad_u_aniso or grad_u_iso:
        xs.shake_adp(spread=shake_u_iso_spread,
                     aniso_spread=shake_u_aniso_spread)
    xs1 = xs.deep_copy_scatterers()

    core_params = scitbx.lbfgs.core_parameters(m=lbfgs_m,
                                               maxfev=100,
                                               xtol=1e-5)

    connectivity_table = smtbx.utils.connectivity_table(xs0)

    if constraints_list is None:
        from smtbx.development import generate_hydrogen_constraints
        constraints_list = generate_hydrogen_constraints(
            structure=xs0, connectivity_table=connectivity_table)

    reparametrisation = constraints.reparametrisation(xs,
                                                      constraints_list,
                                                      connectivity_table,
                                                      temperature=t_celsius)

    lbfgs_termination_params = scitbx.lbfgs.termination_parameters(
        traditional_convergence_test=False,
        drop_convergence_test_max_drop_eps=1.e-20,
        drop_convergence_test_iteration_coefficient=1,
        min_iterations=500,
        max_iterations=lbfgs_max_iterations)

    minimizer = lbfgs(
        target_functor=xray.target_functors.unified_least_squares_residual(
            y_obs),
        xray_structure=xs,
        reparametrisation=reparametrisation,
        structure_factor_algorithm="direct",
        lbfgs_termination_params=lbfgs_termination_params,
        lbfgs_core_params=core_params,
        reference_structure=xs0,
        verbose=verbose)

    if verbose > 0:
        print "Total parameters: ", xs.n_parameters()
        print "Independent parameters: ", reparametrisation.n_independents

        print "Reference model: "
        xs0.show_angles(distance_cutoff=1.5)
        print
        print "Starting model: "
        xs1.show_angles(distance_cutoff=1.5)
        print
        print "Refined model: "
        xs.show_angles(distance_cutoff=1.5)
        print

        print "n_iter, n_fun: ", minimizer.minimizer.iter(
        ), minimizer.minimizer.nfun()

    h_selection = xs.element_selection('H')

    diff = xray.meaningful_site_cart_differences(
        xs0.select(h_selection, negate=True),
        xs.select(h_selection, negate=True))
    #diff = xray.meaningful_site_cart_differences(xs0, xs)
    #assert diff.max_absolute() < 1e-3
    if verbose > 0:
        diff.show()
        print
    assert diff.max_absolute() < 2e-2, diff.max_absolute()

    diff = xray.meaningful_site_cart_differences(xs0, xs)
    if verbose > 0:
        diff.show()
        print
    # XXX why does this tolerance have to be so high?
    assert diff.max_absolute() < 0.5, diff.max_absolute()
示例#5
0
def exercise_constrained_lbfgs(xray_structure,
                               constraints_list,
                               t_celsius,
                               d_min=0.5,
                               shake_sites_rmsd=0.5,
                               shake_u_iso_spread=0,
                               shake_u_aniso_spread=0,
                               grad_site=True,
                               grad_u_iso=True,
                               grad_u_aniso=False,
                               grad_occupancy=False,
                               grad_fp_fdp=False,
                               lbfgs_m=5,
                               lbfgs_max_iterations=1000,
                               verbose=0):

  xs = xray_structure
  xray.set_scatterer_grad_flags(scatterers=xs.scatterers(),
                                site=grad_site,
                                u_iso=grad_u_iso,
                                u_aniso=grad_u_aniso,
                                occupancy=grad_occupancy,
                                fp=grad_fp_fdp,
                                fdp=grad_fp_fdp,
                                tan_u_iso=False,
                                param=0)

  xs0 = xs.deep_copy_scatterers()
  mi = xs0.build_miller_set(anomalous_flag=False, d_min=d_min)
  fo_sq = mi.structure_factors_from_scatterers(
    xs0, algorithm="direct").f_calc().norm()
  fo_sq = fo_sq.customized_copy(sigmas=flex.double(fo_sq.size(), 1))
  fo_sq.set_observation_type_xray_intensity()
  y_obs = fo_sq
  #y_obs = fo_sq.f_sq_as_f()
  if grad_site:
    xs.shake_sites_in_place(rms_difference=shake_sites_rmsd)
  if not grad_u_aniso: shake_u_aniso_spread = 0
  if not grad_u_iso: shake_u_iso_spread = 0
  if grad_u_aniso or grad_u_iso:
    xs.shake_adp(spread=shake_u_iso_spread, aniso_spread=shake_u_aniso_spread)
  xs1 = xs.deep_copy_scatterers()

  core_params = scitbx.lbfgs.core_parameters(m=lbfgs_m, maxfev=100, xtol=1e-5)

  connectivity_table = smtbx.utils.connectivity_table(xs0)

  if constraints_list is None:
    from smtbx.development import generate_hydrogen_constraints
    constraints_list = generate_hydrogen_constraints(
      structure=xs0, connectivity_table=connectivity_table)

  reparametrisation = constraints.reparametrisation(
    xs,
    constraints_list,
    connectivity_table,
    temperature=t_celsius)

  lbfgs_termination_params=scitbx.lbfgs.termination_parameters(
    traditional_convergence_test=False,
    drop_convergence_test_max_drop_eps=1.e-20,
    drop_convergence_test_iteration_coefficient=1,
    min_iterations=500,
    max_iterations=lbfgs_max_iterations)

  minimizer = lbfgs(
    target_functor=xray.target_functors.unified_least_squares_residual(y_obs),
    xray_structure=xs,
    reparametrisation=reparametrisation,
    structure_factor_algorithm="direct",
    lbfgs_termination_params=lbfgs_termination_params,
    lbfgs_core_params=core_params,
    reference_structure=xs0,
    verbose=verbose)

  if verbose > 0:
    print "Total parameters: ", xs.n_parameters()
    print "Independent parameters: ", reparametrisation.n_independents

    print "Reference model: "
    xs0.show_angles(distance_cutoff=1.5)
    print
    print "Starting model: "
    xs1.show_angles(distance_cutoff=1.5)
    print
    print "Refined model: "
    xs.show_angles(distance_cutoff=1.5)
    print

    print "n_iter, n_fun: ", minimizer.minimizer.iter(), minimizer.minimizer.nfun()

  h_selection = xs.element_selection('H')

  diff = xray.meaningful_site_cart_differences(
    xs0.select(h_selection, negate=True),
    xs.select(h_selection, negate=True))
  #diff = xray.meaningful_site_cart_differences(xs0, xs)
  #assert diff.max_absolute() < 1e-3
  if verbose > 0:
    diff.show()
    print
  assert diff.max_absolute() < 2e-2, diff.max_absolute()

  diff = xray.meaningful_site_cart_differences(xs0, xs)
  if verbose > 0:
    diff.show()
    print
  # XXX why does this tolerance have to be so high?
  assert diff.max_absolute() < 0.5, diff.max_absolute()
示例#6
0
 def callback_after_step(self, minimizer):
   if self.verbose > 0:
     print "xray.minimization step: f,iter,nfun:",
     print self.f,minimizer.iter(),minimizer.nfun()
   if self.verbose > 1 and self.reference_structure is not None:
     xray.meaningful_site_cart_differences(self.xray_structure, self.reference_structure).show()