예제 #1
0
def exercise_restrained_refinement(options):
    import random
    random.seed(1)
    flex.set_random_seed(1)
    xs0 = smtbx.development.random_xray_structure(
        sgtbx.space_group_info('P1'),
        n_scatterers=options.n_scatterers,
        elements="random")
    for sc in xs0.scatterers():
        sc.flags.set_grad_site(True)
    sc0 = xs0.scatterers()
    uc = xs0.unit_cell()

    mi = xs0.build_miller_set(anomalous_flag=False, d_min=options.resolution)
    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))

    i, j, k, l = random.sample(xrange(options.n_scatterers), 4)
    bond_proxies = geometry_restraints.shared_bond_simple_proxy()
    w = 1e9
    d_ij = uc.distance(sc0[i].site, sc0[j].site) * 0.8
    bond_proxies.append(
        geom.bond_simple_proxy(i_seqs=(i, j), distance_ideal=d_ij, weight=w))
    d_jk = uc.distance(sc0[j].site, sc0[k].site) * 0.85
    bond_proxies.append(
        geom.bond_simple_proxy(i_seqs=(j, k), distance_ideal=d_jk, weight=w))
    d_ki = min(
        uc.distance(sc0[k].site, sc0[i].site) * 0.9, (d_ij + d_jk) * 0.8)
    bond_proxies.append(
        geom.bond_simple_proxy(i_seqs=(k, i), distance_ideal=d_ki, weight=w))
    d_jl = uc.distance(sc0[j].site, sc0[l].site) * 0.9
    bond_proxies.append(
        geom.bond_simple_proxy(i_seqs=(j, l), distance_ideal=d_jl, weight=w))
    d_lk = min(
        uc.distance(sc0[l].site, sc0[k].site) * 0.8, 0.75 * (d_jk + d_jl))
    bond_proxies.append(
        geom.bond_simple_proxy(i_seqs=(l, k), distance_ideal=d_jl, weight=w))
    restraints_manager = restraints.manager(bond_proxies=bond_proxies)

    xs1 = xs0.deep_copy_scatterers()
    xs1.shake_sites_in_place(rms_difference=0.1)

    def ls_problem():
        xs = xs1.deep_copy_scatterers()
        reparametrisation = constraints.reparametrisation(
            structure=xs,
            constraints=[],
            connectivity_table=smtbx.utils.connectivity_table(xs),
            temperature=20)
        return least_squares.crystallographic_ls(
            fo_sq.as_xray_observations(),
            reparametrisation=reparametrisation,
            restraints_manager=restraints_manager)

    gradient_threshold, step_threshold = 1e-6, 1e-6
    eps = 5e-3

    ls = ls_problem()
    t = wall_clock_time()
    cycles = normal_eqns_solving.naive_iterations(
        ls,
        gradient_threshold=gradient_threshold,
        step_threshold=step_threshold,
        track_all=True)
    if options.verbose:
        print "%i %s steps in %.6f s" % (cycles.n_iterations, cycles,
                                         t.elapsed())
    sc = ls.xray_structure.scatterers()
    for p in bond_proxies:
        d = uc.distance(*[sc[i_pair].site for i_pair in p.i_seqs])
        assert approx_equal(d, p.distance_ideal, eps)

    ls = ls_problem()
    t = wall_clock_time()
    cycles = normal_eqns_solving.levenberg_marquardt_iterations(
        ls,
        gradient_threshold=gradient_threshold,
        step_threshold=step_threshold,
        tau=1e-3,
        track_all=True)
    if options.verbose:
        print "%i %s steps in %.6f s" % (cycles.n_iterations, cycles,
                                         t.elapsed())
    sc = ls.xray_structure.scatterers()
    sc = ls.xray_structure.scatterers()
    for p in bond_proxies:
        d = uc.distance(*[sc[i].site for i in p.i_seqs])
        assert approx_equal(d, p.distance_ideal, eps)
예제 #2
0
def exercise_restrained_refinement(options):
  import random
  random.seed(1)
  flex.set_random_seed(1)
  xs0 = smtbx.development.random_xray_structure(
    sgtbx.space_group_info('P1'),
    n_scatterers=options.n_scatterers,
    elements="random")
  for sc in xs0.scatterers():
    sc.flags.set_grad_site(True)
  sc0 = xs0.scatterers()
  uc = xs0.unit_cell()

  mi = xs0.build_miller_set(anomalous_flag=False, d_min=options.resolution)
  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))

  i, j, k, l = random.sample(xrange(options.n_scatterers), 4)
  bond_proxies = geometry_restraints.shared_bond_simple_proxy()
  w = 1e9
  d_ij = uc.distance(sc0[i].site, sc0[j].site)*0.8
  bond_proxies.append(geom.bond_simple_proxy(
    i_seqs=(i, j),
    distance_ideal=d_ij,
    weight=w))
  d_jk = uc.distance(sc0[j].site, sc0[k].site)*0.85
  bond_proxies.append(geom.bond_simple_proxy(
    i_seqs=(j, k),
    distance_ideal=d_jk,
    weight=w))
  d_ki = min(uc.distance(sc0[k].site, sc0[i].site)*0.9, (d_ij + d_jk)*0.8)
  bond_proxies.append(geom.bond_simple_proxy(
    i_seqs=(k, i),
    distance_ideal=d_ki,
    weight=w))
  d_jl = uc.distance(sc0[j].site, sc0[l].site)*0.9
  bond_proxies.append(geom.bond_simple_proxy(
    i_seqs=(j, l),
    distance_ideal=d_jl,
    weight=w))
  d_lk = min(uc.distance(sc0[l].site, sc0[k].site)*0.8, 0.75*(d_jk + d_jl))
  bond_proxies.append(geom.bond_simple_proxy(
    i_seqs=(l, k),
    distance_ideal=d_jl,
    weight=w))
  restraints_manager = restraints.manager(bond_proxies=bond_proxies)

  xs1 = xs0.deep_copy_scatterers()
  xs1.shake_sites_in_place(rms_difference=0.1)

  def ls_problem():
    xs = xs1.deep_copy_scatterers()
    reparametrisation = constraints.reparametrisation(
      structure=xs,
      constraints=[],
      connectivity_table=smtbx.utils.connectivity_table(xs),
      temperature=20)
    return least_squares.crystallographic_ls(
      fo_sq.as_xray_observations(),
      reparametrisation=reparametrisation,
      restraints_manager=restraints_manager)

  gradient_threshold, step_threshold = 1e-6, 1e-6
  eps = 5e-3

  ls = ls_problem()
  t = wall_clock_time()
  cycles = normal_eqns_solving.naive_iterations(
    ls,
    gradient_threshold=gradient_threshold,
    step_threshold=step_threshold,
    track_all=True)
  if options.verbose:
    print "%i %s steps in %.6f s" % (cycles.n_iterations, cycles, t.elapsed())
  sc = ls.xray_structure.scatterers()
  for p in bond_proxies:
    d = uc.distance(*[ sc[i_pair].site for i_pair in p.i_seqs ])
    assert approx_equal(d, p.distance_ideal, eps)

  ls = ls_problem()
  t = wall_clock_time()
  cycles = normal_eqns_solving.levenberg_marquardt_iterations(
    ls,
    gradient_threshold=gradient_threshold,
    step_threshold=step_threshold,
    tau=1e-3,
    track_all=True)
  if options.verbose:
    print "%i %s steps in %.6f s" % (cycles.n_iterations, cycles, t.elapsed())
  sc = ls.xray_structure.scatterers()
  sc = ls.xray_structure.scatterers()
  for p in bond_proxies:
    d = uc.distance(*[ sc[i].site for i in p.i_seqs ])
    assert approx_equal(d, p.distance_ideal, eps)
예제 #3
0
def exercise_direct(space_group_info,
                    elements,
                    anomalous_flag=False,
                    use_random_u_iso=False,
                    verbose=0):
  xs = random_structure.xray_structure(
    space_group_info=space_group_info,
    elements=elements,
    random_u_iso=use_random_u_iso,
    volume_per_atom=18.6,
    min_distance=1.2)
  #show_diagnostics(xs)

  reciprocal_volume = xs.unit_cell().reciprocal().volume()
  times = []

  cuda_platform = direct_summation_cuda_platform()
  cuda_platform_float = direct_summation_cuda_platform(float_t="float")

  direct_reference = True

  for x in xrange(1,7):
    print "There are %d scatterers"%len(elements)
    number_of_reflections = pow(10.,x)
    Volume = number_of_reflections *  reciprocal_volume * 2. #2 P1 asymmetric units
    Volume *= space_group_info.group().order_z() # take space group into acct.
    recip_radius = pow(3.*Volume/(4.*pi),1./3.)
    d_min = 1./recip_radius

    if 0:
      cos_sin_table = math_module.cos_sin_table(2**10)
    if 1:
      cos_sin_table = False

    if direct_reference:
      timer = wall_clock_time()
      cpu_direct = xs.structure_factors(d_min=d_min,algorithm="direct",
                                            cos_sin_table=cos_sin_table)
      cpu_time = timer.elapsed()
      cpu_direct_f = cpu_direct.f_calc()

      timer = wall_clock_time()
      simple_direct = xs.structure_factors(d_min=d_min,algorithm=direct_summation_simple())
      simple_time = timer.elapsed()
      simple_direct_f = simple_direct.f_calc()
    else:
      cpu_time=0
      simple_time=0

    timer = wall_clock_time()
    gpu_direct = xs.structure_factors(d_min=d_min,algorithm=cuda_platform)
    gpu_time = timer.elapsed()
    gpu_direct_f = gpu_direct.f_calc()
    gpu_amplitude = gpu_direct_f.as_amplitude_array()
    sum_amp = flex.sum(gpu_amplitude.data())

    timer = wall_clock_time()
    gpuf_direct = xs.structure_factors(d_min=d_min,algorithm=cuda_platform_float)
    gpuf_time = timer.elapsed()
    gpuf_direct_f = gpuf_direct.f_calc()
    gpuf_amplitude = gpuf_direct_f.as_amplitude_array()

    abs_diff = flex.abs(gpuf_amplitude.data() - gpu_amplitude.data())
    sum_diff = flex.sum(abs_diff)
    gpuf_Rfactor = 100.*sum_diff/sum_amp

    timer = wall_clock_time()
    fft_algorithm = xs.structure_factors(d_min=d_min,algorithm="fft")
    fft_time = timer.elapsed()
    fft_f = fft_algorithm.f_calc()
    fft_amplitude = fft_f.as_amplitude_array()
    abs_diff = flex.abs(fft_amplitude.data() - gpu_amplitude.data())
    sum_diff = flex.sum(abs_diff)
    fft_Rfactor = 100.*sum_diff/sum_amp

    times.append((number_of_reflections,cpu_time,d_min,
                  gpu_time,
                  gpuf_time,gpuf_Rfactor,
                  simple_time,
                  fft_time,fft_Rfactor))
    # doesn't assert correctly: assert approx_equal(cpu_direct_f.data(), fft_f.data())
    if direct_reference:
     assert approx_equal(cpu_direct_f.data(), gpu_direct_f.data(), eps=1e-6)
     assert approx_equal(cpu_direct_f.data(), simple_direct_f.data(), eps=1e-6)

  show_times_vs_complexity(times, header="run time vs. # reflections")
예제 #4
0
def exercise_direct(space_group_info,
                    elements,
                    anomalous_flag=False,
                    use_random_u_iso=False,
                    verbose=0):
    xs = random_structure.xray_structure(space_group_info=space_group_info,
                                         elements=elements,
                                         random_u_iso=use_random_u_iso,
                                         volume_per_atom=18.6,
                                         min_distance=1.2)
    #show_diagnostics(xs)

    reciprocal_volume = xs.unit_cell().reciprocal().volume()
    times = []

    cuda_platform = direct_summation_cuda_platform()
    cuda_platform_float = direct_summation_cuda_platform(float_t="float")

    direct_reference = True

    for x in range(1, 7):
        print("There are %d scatterers" % len(elements))
        number_of_reflections = pow(10., x)
        Volume = number_of_reflections * reciprocal_volume * 2.  #2 P1 asymmetric units
        Volume *= space_group_info.group().order_z(
        )  # take space group into acct.
        recip_radius = pow(3. * Volume / (4. * pi), 1. / 3.)
        d_min = 1. / recip_radius

        if 0:
            cos_sin_table = math_module.cos_sin_table(2**10)
        if 1:
            cos_sin_table = False

        if direct_reference:
            timer = wall_clock_time()
            cpu_direct = xs.structure_factors(d_min=d_min,
                                              algorithm="direct",
                                              cos_sin_table=cos_sin_table)
            cpu_time = timer.elapsed()
            cpu_direct_f = cpu_direct.f_calc()

            timer = wall_clock_time()
            simple_direct = xs.structure_factors(
                d_min=d_min, algorithm=direct_summation_simple())
            simple_time = timer.elapsed()
            simple_direct_f = simple_direct.f_calc()
        else:
            cpu_time = 0
            simple_time = 0

        timer = wall_clock_time()
        gpu_direct = xs.structure_factors(d_min=d_min, algorithm=cuda_platform)
        gpu_time = timer.elapsed()
        gpu_direct_f = gpu_direct.f_calc()
        gpu_amplitude = gpu_direct_f.as_amplitude_array()
        sum_amp = flex.sum(gpu_amplitude.data())

        timer = wall_clock_time()
        gpuf_direct = xs.structure_factors(d_min=d_min,
                                           algorithm=cuda_platform_float)
        gpuf_time = timer.elapsed()
        gpuf_direct_f = gpuf_direct.f_calc()
        gpuf_amplitude = gpuf_direct_f.as_amplitude_array()

        abs_diff = flex.abs(gpuf_amplitude.data() - gpu_amplitude.data())
        sum_diff = flex.sum(abs_diff)
        gpuf_Rfactor = 100. * sum_diff / sum_amp

        timer = wall_clock_time()
        fft_algorithm = xs.structure_factors(d_min=d_min, algorithm="fft")
        fft_time = timer.elapsed()
        fft_f = fft_algorithm.f_calc()
        fft_amplitude = fft_f.as_amplitude_array()
        abs_diff = flex.abs(fft_amplitude.data() - gpu_amplitude.data())
        sum_diff = flex.sum(abs_diff)
        fft_Rfactor = 100. * sum_diff / sum_amp

        times.append(
            (number_of_reflections, cpu_time, d_min, gpu_time, gpuf_time,
             gpuf_Rfactor, simple_time, fft_time, fft_Rfactor))
        # doesn't assert correctly: assert approx_equal(cpu_direct_f.data(), fft_f.data())
        if direct_reference:
            assert approx_equal(cpu_direct_f.data(),
                                gpu_direct_f.data(),
                                eps=1e-6)
            assert approx_equal(cpu_direct_f.data(),
                                simple_direct_f.data(),
                                eps=1e-6)

    show_times_vs_complexity(times, header="run time vs. # reflections")