def exercise_packed(structure_ideal, f_obs,
                    anomalous_flag,
                    verbose=0):
  sh, ls = shift_all(structure_ideal, f_obs, anomalous_flag)
  flag = (random.random() > 0.5)
  gradient_flags = randomize_gradient_flags(
    xray.structure_factors.gradient_flags(site=flag, u=not flag),
    f_obs.anomalous_flag(),
    thresholds=(1/2.,0))
  u_iso_refinable_params = flex.double()
  for scatterer in sh.structure_shifted.scatterers():
      scatterer.flags.set_grad_site(gradient_flags.site)
      scatterer.flags.set_grad_u_iso(gradient_flags.u_iso)
      scatterer.flags.set_grad_u_aniso(gradient_flags.u_aniso)
      scatterer.flags.set_grad_occupancy(gradient_flags.occupancy)
      scatterer.flags.set_grad_fp(gradient_flags.fp)
      scatterer.flags.set_grad_fdp(gradient_flags.fdp)
      scatterer.flags.set_tan_u_iso(True)
      param = random.randint(90,120)
      scatterer.flags.param= param
      value = math.tan(scatterer.u_iso*math.pi/adptbx.b_as_u(param)-math.pi/2)
      u_iso_refinable_params.append(value)
  n_parameters = xray.scatterer_grad_flags_counts(
                              sh.structure_shifted.scatterers()).n_parameters()
  assert n_parameters == sh.structure_shifted.n_parameters()
  if (n_parameters > 0):
    sfd = xray.structure_factors.gradients_direct(
      xray_structure=sh.structure_shifted,
      u_iso_refinable_params=u_iso_refinable_params,
      miller_set=f_obs,
      d_target_d_f_calc=ls.derivatives(),
      n_parameters=n_parameters)
    assert sfd.packed().size() == n_parameters
    re = resampling(miller_set=f_obs)
    map0 = re(
      xray_structure=sh.structure_shifted,
      u_iso_refinable_params=u_iso_refinable_params,
      dp=miller.array(miller_set=f_obs, data=ls.derivatives()),
      n_parameters=n_parameters,
      verbose=verbose)
    assert map0.packed().size() == n_parameters
    correlation = flex.linear_correlation(sfd.packed(), map0.packed())
    assert correlation.is_well_defined()
    assert correlation.coefficient() > 0.999
def exercise(target_functor,
             data_type,
             parameter_name,
             space_group_info,
             anomalous_flag,
             cartesian_flag,
             n_elements=9,
             d_min=2.5,
             shake_sigma=0.25,
             test_hard=True,
             verbose=0):
    assert data_type == 'F' or data_type == 'F^2'
    if (data_type == 'F^2'
            and not target_functor == xray.unified_least_squares_residual):
        return
    if (parameter_name != "site" and cartesian_flag == True): return
    if (parameter_name == "fdp" and not anomalous_flag): return
    structure_ideal = random_structure.xray_structure(
        space_group_info,
        elements=(("O", "N", "C") * (n_elements))[:n_elements],
        volume_per_atom=100,
        random_f_prime_d_min=d_min,
        random_f_double_prime=anomalous_flag,
        use_u_aniso=True,
        use_u_iso=False,
        random_u_cart_scale=0.3,
        random_u_iso=False,
        random_occupancy=True)
    if (parameter_name in ["u_star", "u_iso"]): shake_sigma = shake_sigma / 2.
    random_structure.random_modify_adp_and_adp_flags(
        scatterers=structure_ideal.scatterers(),
        random_u_iso_scale=0.3,
        random_u_iso_min=0.0,
        parameter_name=parameter_name)
    rnd_f_calc = structure_ideal.structure_factors(
        anomalous_flag=anomalous_flag, d_min=d_min,
        algorithm="direct").f_calc()
    if data_type == 'F':
        y_obs = abs(rnd_f_calc)
    elif data_type == 'F^2':
        y_obs = rnd_f_calc.norm()
        y_obs.set_observation_type_xray_intensity()
    structure_shake = structure_ideal.random_modify_parameters(
        parameter_name, shake_sigma, vary_z_only=False)
    assert tuple(structure_ideal.special_position_indices()) \
        == tuple(structure_shake.special_position_indices())
    target_ftor = target_functor(y_obs)
    for structure in (structure_ideal, structure_shake)[:]:  #SWITCH
        f_calc = y_obs.structure_factors_from_scatterers(
            xray_structure=structure, algorithm="direct").f_calc()
        target_result = target_ftor(f_calc, compute_derivatives=True)
        if (structure == structure_ideal):
            assert abs(target_result.target()) < 1.e-5

    gradient_flags = xray.structure_factors.gradient_flags(
        site=(parameter_name == "site" or random.choice((False, True))),
        u_iso=(parameter_name == "u_iso" or random.choice((False, True))),
        u_aniso=(parameter_name == "u_star" or random.choice((False, True))),
        occupancy=(parameter_name == "occupancy" or random.choice(
            (False, True))),
        fp=(parameter_name == "fp" or random.choice((False, True))),
        fdp=(parameter_name == "fdp" or (anomalous_flag and random.choice(
            (False, True)))))
    xray.set_scatterer_grad_flags(scatterers=structure.scatterers(),
                                  site=gradient_flags.site,
                                  u_iso=gradient_flags.u_iso,
                                  u_aniso=gradient_flags.u_aniso,
                                  occupancy=gradient_flags.occupancy,
                                  fp=gradient_flags.fp,
                                  fdp=gradient_flags.fdp)
    grad_flags_counts = xray.scatterer_grad_flags_counts(
        structure.scatterers())
    sf = xray.structure_factors.gradients_direct(
        xray_structure=structure,
        u_iso_refinable_params=None,
        miller_set=y_obs,
        d_target_d_f_calc=target_result.derivatives(),
        n_parameters=0)
    if (parameter_name == "site"):
        d_analytical = sf.d_target_d_site_frac()
        if (cartesian_flag
            ):  # average d_analytical or d_numerical, but not both
            structure_ideal.apply_special_position_ops_d_target_d_site(
                d_analytical)
        if (cartesian_flag):
            d_analytical = sf.d_target_d_site_cart()
        d_numerical = finite_differences_site(cartesian_flag, target_ftor,
                                              structure)
        if (not cartesian_flag
            ):  # aver. d_analytical or d_numerical, but not both
            structure_ideal.apply_special_position_ops_d_target_d_site(
                d_numerical)
    elif (parameter_name == "u_star" and grad_flags_counts.use_u_aniso > 0):
        d_analytical = sf.d_target_d_u_star()
        d_numerical = finite_differences_u_star(target_ftor, structure)
    else:
        if (parameter_name == "occupancy"):
            d_analytical = sf.d_target_d_occupancy()
        elif (parameter_name == "u_iso" and grad_flags_counts.use_u_iso > 0):
            d_analytical = sf.d_target_d_u_iso()
        elif (parameter_name == "fp"):
            d_analytical = sf.d_target_d_fp()
        elif (parameter_name == "fdp"):
            d_analytical = sf.d_target_d_fdp()
        else:
            raise RuntimeError
        d_numerical = finite_differences_scalar(parameter_name, target_ftor,
                                                structure)
    linear_regression_test(d_analytical,
                           d_numerical,
                           test_hard,
                           verbose=verbose)
    if (parameter_name == "u_iso" and grad_flags_counts.use_u_iso > 0):
        u_iso_refinable_params = flex.double()
        for scatterer in structure.scatterers():
            scatterer.flags.set_tan_u_iso(True)
            scatterer.flags.set_grad_u_iso(gradient_flags.u_iso)
            param = random.randint(90, 120)
            scatterer.flags.param = param
            value = math.tan(scatterer.u_iso * math.pi / adptbx.b_as_u(param) -
                             math.pi / 2)
            u_iso_refinable_params.append(value)
        sf = xray.structure_factors.gradients_direct(
            xray_structure=structure,
            u_iso_refinable_params=u_iso_refinable_params,
            miller_set=y_obs,
            d_target_d_f_calc=target_result.derivatives(),
            n_parameters=0)
        d_analytical = sf.d_target_d_u_iso()
        d_numerical = finite_differences_scalar("tan_u_iso", target_ftor,
                                                structure)
        linear_regression_test(d_analytical,
                               d_numerical,
                               test_hard,
                               verbose=verbose)
def exercise_gradient_manager(structure_ideal, f_obs,
                              anomalous_flag,
                              verbose=0):
  sh, ls = shift_all(structure_ideal, f_obs, anomalous_flag)
  grad_manager = xray.structure_factors.gradients(
    miller_set=f_obs,
    quality_factor=100000,
    wing_cutoff=1.e-10)
  gradient_flags=xray.structure_factors.gradient_flags(default=True)
  xray.set_scatterer_grad_flags(scatterers = sh.structure_shifted.scatterers(),
                                site       = gradient_flags.site,
                                u_iso      = gradient_flags.u_iso,
                                u_aniso    = gradient_flags.u_aniso,
                                occupancy  = gradient_flags.occupancy,
                                fp         = gradient_flags.fp,
                                fdp        = gradient_flags.fdp)
  if (0):
    print "exercise_gradient_manager"
    print "gradient_flags.site      ", gradient_flags.site
    print "gradient_flags.u_iso     ", gradient_flags.u_iso
    print "gradient_flags.u_aniso   ", gradient_flags.u_aniso
    print "gradient_flags.occupancy ", gradient_flags.occupancy
    print "gradient_flags.fp        ", gradient_flags.fp
    print "gradient_flags.fdp       ", gradient_flags.fdp
    cntr_use_u_iso = 0
    cntr_use_u_aniso = 0
    cntr_grad_u_iso = 0
    cntr_grad_u_aniso = 0
    for scatterer in sh.structure_shifted.scatterers():
      if (scatterer.flags.use_u_iso()):  cntr_use_u_iso += 1
      if (scatterer.flags.use_u_aniso()):  cntr_use_u_aniso += 1
      if (scatterer.flags.grad_u_iso()):  cntr_grad_u_iso += 1
      if (scatterer.flags.grad_u_aniso()):  cntr_grad_u_aniso += 1
    print "use_u_iso                ", cntr_use_u_iso,cntr_grad_u_iso
    print "use_u_aniso              ", cntr_use_u_aniso,cntr_grad_u_aniso
  if (random.random() > 0.5):
    n_parameters = 0
  else:
    n_parameters = xray.scatterer_grad_flags_counts(
                              sh.structure_shifted.scatterers()).n_parameters()
    assert n_parameters == sh.structure_shifted.n_parameters()
  gd = grad_manager(
    xray_structure=sh.structure_shifted,
    u_iso_refinable_params=None,
    miller_set=f_obs,
    d_target_d_f_calc=ls.derivatives(),
    n_parameters=n_parameters,
    algorithm="direct")
  gf = grad_manager(
    xray_structure=sh.structure_shifted,
    u_iso_refinable_params=None,
    miller_set=f_obs,
    d_target_d_f_calc=ls.derivatives(),
    n_parameters=n_parameters,
    algorithm="fft")
  grad_flags_counts = \
            xray.scatterer_grad_flags_counts(sh.structure_shifted.scatterers())
  if (n_parameters == 0):
    d = gd.d_target_d_site_frac()
    f = gf.d_target_d_site_frac()
    linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose)
    d = gd.d_target_d_site_cart()
    f = gf.d_target_d_site_cart()
    linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose)
    if(grad_flags_counts.u_iso > 0):
       d = gd.d_target_d_u_iso()
       f = gf.d_target_d_u_iso()
       linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose)
    if(grad_flags_counts.u_aniso > 0):
       linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose)
       d = gd.d_target_d_u_cart()
       f = gf.d_target_d_u_cart()
       linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose)
    d = gd.d_target_d_occupancy()
    f = gf.d_target_d_occupancy()
    linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose)
    d = gd.d_target_d_fp()
    f = gf.d_target_d_fp()
    linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose)
    if (anomalous_flag):
      d = gd.d_target_d_fdp()
      f = gf.d_target_d_fdp()
      linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose)
  else:
    correlation = flex.linear_correlation(gd.packed(), gf.packed())
    assert correlation.is_well_defined()
    assert correlation.coefficient() > 0.995, correlation.coefficient()
def u_star(structure_ideal, d_min, f_obs, verbose=0):
  sh = shifted_u_star(f_obs, structure_ideal, 0, 0, 0.0001)
  if (0 or verbose):
    print "u_star"
    sh.structure_shifted.show_summary().show_scatterers()
    print
  ls = xray.targets_least_squares_residual(
    f_obs.data(), sh.f_calc.data(), True, 1)
  gradient_flags = randomize_gradient_flags(
    xray.structure_factors.gradient_flags(u_aniso=True),
    f_obs.anomalous_flag())
  xray.set_scatterer_grad_flags(scatterers = sh.structure_shifted.scatterers(),
                                site       = gradient_flags.site,
                                u_iso      = gradient_flags.u_iso,
                                u_aniso    = gradient_flags.u_aniso,
                                occupancy  = gradient_flags.occupancy,
                                fp         = gradient_flags.fp,
                                fdp        = gradient_flags.fdp)
  grad_flags_counts = xray.scatterer_grad_flags_counts(sh.structure_shifted.scatterers())
  if(grad_flags_counts.n_parameters() > 0):
     if (0):
       print "u_aniso"
       print "gradient_flags.site      ", gradient_flags.site
       print "gradient_flags.u_iso     ", gradient_flags.u_iso
       print "gradient_flags.u_aniso   ", gradient_flags.u_aniso
       print "gradient_flags.occupancy ", gradient_flags.occupancy
       print "gradient_flags.fp        ", gradient_flags.fp
       print "gradient_flags.fdp       ", gradient_flags.fdp
       cntr_use_u_iso = 0
       cntr_use_u_aniso = 0
       cntr_grad_u_iso = 0
       cntr_grad_u_aniso = 0
       for scatterer in sh.structure_shifted.scatterers():
         if (scatterer.flags.use_u_iso()):  cntr_use_u_iso += 1
         if (scatterer.flags.use_u_aniso()):  cntr_use_u_aniso += 1
         if (scatterer.flags.grad_u_iso()):  cntr_grad_u_iso += 1
         if (scatterer.flags.grad_u_aniso()):  cntr_grad_u_aniso += 1
       print "use_u_iso                ", cntr_use_u_iso,cntr_grad_u_iso
       print "use_u_aniso              ", cntr_use_u_aniso,cntr_grad_u_aniso
     sfd = xray.structure_factors.gradients_direct(
       xray_structure=sh.structure_shifted,
       u_iso_refinable_params=None,
       miller_set=f_obs,
       d_target_d_f_calc=ls.derivatives(),
       n_parameters= 0
       )
     re = resampling(miller_set=f_obs)
     map0 = re(
       xray_structure=sh.structure_shifted,
       u_iso_refinable_params=None,
       dp=miller.array(miller_set=f_obs, data=ls.derivatives()),
       n_parameters= 0,
       verbose=verbose)

     grad_flags_counts = xray.scatterer_grad_flags_counts(sh.structure_shifted.scatterers())
     if(grad_flags_counts.u_aniso):
        sfd_d_target_d_u_cart = sfd.d_target_d_u_cart()
        map0_d_target_d_u_cart = map0.d_target_d_u_cart()
     top_gradient = None
     gradients_1 = []
     for i_scatterer,scatterer in enumerate(sh.structure_shifted.scatterers()):
       if(scatterer.flags.use_u_iso()):   parameter_name = "u_iso"
       if(scatterer.flags.use_u_aniso()): parameter_name = "u_star"
       if(parameter_name == "u_iso" and scatterer.flags.grad_u_iso()):
          direct_summ = sfd.d_target_d_u_iso()[i_scatterer]
          if (top_gradient is None): top_gradient = direct_summ
          fast_gradie = map0.d_target_d_u_iso()[i_scatterer]
          sys.stdout.flush()
          gradients_1.append([direct_summ, fast_gradie])
          match = judge(scatterer, parameter_name, direct_summ, fast_gradie,
                                                                  top_gradient)
          if (0 or verbose):
            print "direct summ[%d]: " % i_scatterer, direct_summ
            print "fast gradie[%d]: " % i_scatterer, fast_gradie, match
            print
          assert not match.is_bad
       if parameter_name == "u_star" and scatterer.flags.grad_u_aniso():
        sfd_star = sfd.d_target_d_u_star()[i_scatterer]
        sfd_cart = adptbx.grad_u_star_as_u_cart(
          structure_ideal.unit_cell(), sfd_star)
        assert approx_equal(
          sfd_star,
          adptbx.grad_u_cart_as_u_star(structure_ideal.unit_cell(), sfd_cart))
        for ij in xrange(6):
          direct_summ = sfd_d_target_d_u_cart[i_scatterer][ij]
          if (top_gradient is None): top_gradient = direct_summ
          fast_gradie = map0_d_target_d_u_cart[i_scatterer][ij]
          gradients_1.append([direct_summ, fast_gradie])
          match =judge(scatterer,"u_star",direct_summ,fast_gradie,top_gradient)
          if (0 or verbose or match.is_bad):
            print "direct summ[%d][%d]: " % (i_scatterer, ij), direct_summ
            print "fast gradie[%d][%d]: " % (i_scatterer, ij),fast_gradie,match
            print
          assert not match.is_bad
     # Making sure that gradients_1 = gradients_2
     for i_scatterer,scatterer in enumerate(sh.structure_shifted.scatterers()):
         if(not scatterer.flags.use_u_iso()):
            scatterer.u_iso = -12345.0
         if(not scatterer.flags.use_u_aniso()):
            scatterer.u_star =(-999.,-999.,-999.,-999.,-999.,-999.)
     sfd = xray.structure_factors.gradients_direct(
       xray_structure=sh.structure_shifted,
       u_iso_refinable_params=None,
       miller_set=f_obs,
       d_target_d_f_calc=ls.derivatives(),
       n_parameters= 0
       )
     re = resampling(miller_set=f_obs)
     map0 = re(
       xray_structure=sh.structure_shifted,
       u_iso_refinable_params=None,
       dp=miller.array(miller_set=f_obs, data=ls.derivatives()),
       n_parameters= 0,
       verbose=verbose)

     grad_flags_counts = \
            xray.scatterer_grad_flags_counts(sh.structure_shifted.scatterers())
     if(grad_flags_counts.u_aniso):
        sfd_d_target_d_u_cart = sfd.d_target_d_u_cart()
        map0_d_target_d_u_cart = map0.d_target_d_u_cart()
     gradients_2 = []
     for i_scatterer,scatterer in enumerate(sh.structure_shifted.scatterers()):
       if(scatterer.flags.use_u_iso()):   parameter_name = "u_iso"
       if(scatterer.flags.use_u_aniso()): parameter_name = "u_star"
       if(parameter_name == "u_iso" and scatterer.flags.grad_u_iso()):
          direct_summ = sfd.d_target_d_u_iso()[i_scatterer]
          fast_gradie = map0.d_target_d_u_iso()[i_scatterer]
          gradients_2.append([direct_summ, fast_gradie])
       if parameter_name == "u_star" and scatterer.flags.grad_u_aniso():
        sfd_star = sfd.d_target_d_u_star()[i_scatterer]
        sfd_cart = adptbx.grad_u_star_as_u_cart(
          structure_ideal.unit_cell(), sfd_star)
        assert approx_equal(
          sfd_star,
          adptbx.grad_u_cart_as_u_star(structure_ideal.unit_cell(), sfd_cart))
        for ij in xrange(6):
          direct_summ = sfd_d_target_d_u_cart[i_scatterer][ij]
          fast_gradie = map0_d_target_d_u_cart[i_scatterer][ij]
          gradients_2.append([direct_summ, fast_gradie])
     for g1,g2 in zip(gradients_1, gradients_2):
       assert approx_equal(g1, g2)
     sys.stdout.flush()
Example #5
0
def u_iso(structure_ideal, d_min, f_obs, tan_u_iso, verbose=0):
    sh = shifted_u_iso(f_obs, structure_ideal, 0, 0.05)
    if (0 or verbose):
        print("u_iso")
        sh.structure_shifted.show_summary().show_scatterers()
        print()
    ls = xray.targets_least_squares_residual(f_obs.data(), sh.f_calc.data(),
                                             True, 1)
    gradient_flags = randomize_gradient_flags(
        xray.structure_factors.gradient_flags(u_iso=True),
        f_obs.anomalous_flag())
    if (tan_u_iso):
        u_iso_refinable_params = flex.double()
    else:
        u_iso_refinable_params = None
    for scatterer in sh.structure_shifted.scatterers():
        scatterer.flags.set_grad_site(gradient_flags.site)
        scatterer.flags.set_grad_u_iso(gradient_flags.u_iso)
        scatterer.flags.set_grad_u_aniso(gradient_flags.u_aniso)
        scatterer.flags.set_grad_occupancy(gradient_flags.occupancy)
        scatterer.flags.set_grad_fp(gradient_flags.fp)
        scatterer.flags.set_grad_fdp(gradient_flags.fdp)
        if (tan_u_iso):
            scatterer.flags.set_tan_u_iso(True)
            param = random.randint(90, 120)
            scatterer.flags.param = param
            value = math.tan(scatterer.u_iso * math.pi / adptbx.b_as_u(param) -
                             math.pi / 2)
            u_iso_refinable_params.append(value)
    if (0):
        print("u_iso")
        print("gradient_flags.site      ", gradient_flags.site)
        print("gradient_flags.u_iso     ", gradient_flags.u_iso)
        print("gradient_flags.u_aniso   ", gradient_flags.u_aniso)
        print("gradient_flags.occupancy ", gradient_flags.occupancy)
        print("gradient_flags.fp        ", gradient_flags.fp)
        print("gradient_flags.fdp       ", gradient_flags.fdp)
        cntr_use_u_iso = 0
        cntr_use_u_aniso = 0
        cntr_grad_u_iso = 0
        cntr_grad_u_aniso = 0
        for scatterer in sh.structure_shifted.scatterers():
            if (scatterer.flags.use_u_iso()): cntr_use_u_iso += 1
            if (scatterer.flags.use_u_aniso()): cntr_use_u_aniso += 1
            if (scatterer.flags.grad_u_iso()): cntr_grad_u_iso += 1
            if (scatterer.flags.grad_u_aniso()): cntr_grad_u_aniso += 1
        print("use_u_iso                ", cntr_use_u_iso, cntr_grad_u_iso)
        print("use_u_aniso              ", cntr_use_u_aniso, cntr_grad_u_aniso)
    grad_flags_counts = \
              xray.scatterer_grad_flags_counts(sh.structure_shifted.scatterers())
    if (grad_flags_counts.n_parameters() > 0):
        sfd = xray.structure_factors.gradients_direct(
            xray_structure=sh.structure_shifted,
            u_iso_refinable_params=u_iso_refinable_params,
            miller_set=f_obs,
            d_target_d_f_calc=ls.derivatives(),
            n_parameters=0)
        re = resampling(miller_set=f_obs)
        map0 = re(xray_structure=sh.structure_shifted,
                  u_iso_refinable_params=u_iso_refinable_params,
                  dp=miller.array(miller_set=f_obs, data=ls.derivatives()),
                  n_parameters=0,
                  verbose=verbose)
        if (grad_flags_counts.u_aniso > 0):
            sfd_d_target_d_u_cart = sfd.d_target_d_u_cart()
            map0_d_target_d_u_cart = map0.d_target_d_u_cart()
        top_gradient = None
        gradients_1 = []
        for i_scatterer, scatterer in enumerate(
                sh.structure_shifted.scatterers()):
            if (0):
                print("i_scatterer= ", i_scatterer,scatterer.flags.use_u_iso(),\
                  scatterer.flags.grad_u_iso(), scatterer.flags.use_u_aniso(),\
                  scatterer.flags.grad_u_aniso(), scatterer.u_iso, scatterer.u_star)
            if (scatterer.flags.use_u_iso()): parameter_name = "u_iso"
            if (scatterer.flags.use_u_aniso()): parameter_name = "u_star"
            if (parameter_name == "u_iso" and scatterer.flags.grad_u_iso()
                    and scatterer.flags.use_u_iso()):
                direct_summ = sfd.d_target_d_u_iso()[i_scatterer]
                if (top_gradient is None): top_gradient = direct_summ
                fast_gradie = map0.d_target_d_u_iso()[i_scatterer]
                sys.stdout.flush()
                gradients_1.append([direct_summ, fast_gradie])
                match = judge(scatterer, parameter_name, direct_summ,
                              fast_gradie, top_gradient)
                if (0 or verbose):
                    print("direct summ[%d]: " % i_scatterer, direct_summ)
                    print("fast gradie[%d]: " % i_scatterer, fast_gradie,
                          match)
                    print()
                assert not match.is_bad
            if (parameter_name == "u_star" and scatterer.flags.grad_u_aniso()
                    and scatterer.flags.use_u_aniso()):
                sfd_star = sfd.d_target_d_u_star()[i_scatterer]
                sfd_cart = adptbx.grad_u_star_as_u_cart(
                    structure_ideal.unit_cell(), sfd_star)
                assert approx_equal(
                    sfd_star,
                    adptbx.grad_u_cart_as_u_star(structure_ideal.unit_cell(),
                                                 sfd_cart))
                for ij in range(6):
                    direct_summ = sfd_d_target_d_u_cart[i_scatterer][ij]
                    if (top_gradient is None): top_gradient = direct_summ
                    fast_gradie = map0_d_target_d_u_cart[i_scatterer][ij]
                    gradients_1.append([direct_summ, fast_gradie])
                    match = judge(scatterer, "u_star", direct_summ,
                                  fast_gradie, top_gradient)
                    if (0 or verbose or match.is_bad):
                        print("direct summ[%d][%d]: " % (i_scatterer, ij),
                              direct_summ)
                        print("fast gradie[%d][%d]: " % (i_scatterer, ij),
                              fast_gradie, match)
                        print()
                    assert not match.is_bad
        # Making sure that gradients_1 = gradients_2
        for i_scatterer, scatterer in enumerate(
                sh.structure_shifted.scatterers()):
            if (not scatterer.flags.use_u_iso()):
                scatterer.u_iso = -12345.0
            if (not scatterer.flags.use_u_aniso()):
                scatterer.u_star = (-999., -999., -999., -999., -999., -999.)
        sfd = xray.structure_factors.gradients_direct(
            xray_structure=sh.structure_shifted,
            u_iso_refinable_params=u_iso_refinable_params,
            miller_set=f_obs,
            d_target_d_f_calc=ls.derivatives(),
            n_parameters=0)
        re = resampling(miller_set=f_obs)
        map0 = re(xray_structure=sh.structure_shifted,
                  u_iso_refinable_params=u_iso_refinable_params,
                  dp=miller.array(miller_set=f_obs, data=ls.derivatives()),
                  n_parameters=0,
                  verbose=verbose)
        grad_flags_counts = \
               xray.scatterer_grad_flags_counts(sh.structure_shifted.scatterers())
        if (grad_flags_counts.u_aniso):
            sfd_d_target_d_u_cart = sfd.d_target_d_u_cart()
            map0_d_target_d_u_cart = map0.d_target_d_u_cart()
        gradients_2 = []
        for i_scatterer, scatterer in enumerate(
                sh.structure_shifted.scatterers()):
            if (scatterer.flags.use_u_iso()): parameter_name = "u_iso"
            if (scatterer.flags.use_u_aniso()): parameter_name = "u_star"
            if (parameter_name == "u_iso" and scatterer.flags.grad_u_iso()
                    and scatterer.flags.use_u_iso()):
                direct_summ = sfd.d_target_d_u_iso()[i_scatterer]
                fast_gradie = map0.d_target_d_u_iso()[i_scatterer]
                gradients_2.append([direct_summ, fast_gradie])
            if (parameter_name == "u_star" and scatterer.flags.grad_u_aniso()
                    and scatterer.flags.use_u_aniso()):
                sfd_star = sfd.d_target_d_u_star()[i_scatterer]
                sfd_cart = adptbx.grad_u_star_as_u_cart(
                    structure_ideal.unit_cell(), sfd_star)
                assert approx_equal(
                    sfd_star,
                    adptbx.grad_u_cart_as_u_star(structure_ideal.unit_cell(),
                                                 sfd_cart))
                for ij in range(6):
                    direct_summ = sfd_d_target_d_u_cart[i_scatterer][ij]
                    fast_gradie = map0_d_target_d_u_cart[i_scatterer][ij]
                    gradients_2.append([direct_summ, fast_gradie])
        for g1, g2 in zip(gradients_1, gradients_2):
            assert approx_equal(g1, g2)
        sys.stdout.flush()
def exercise(target_functor, data_type, parameter_name, space_group_info,
             anomalous_flag,
             cartesian_flag,
             n_elements=9,
             d_min=2.5,
             shake_sigma=0.25,
             test_hard=True, verbose=0):
  assert data_type == 'F' or data_type == 'F^2'
  if (data_type == 'F^2'
       and not target_functor == xray.unified_least_squares_residual): return
  if (parameter_name != "site" and cartesian_flag == True): return
  if (parameter_name == "fdp" and not anomalous_flag): return
  structure_ideal = random_structure.xray_structure(
    space_group_info,
    elements=(("O","N","C")*(n_elements))[:n_elements],
    volume_per_atom=100,
    random_f_prime_d_min=d_min,
    random_f_double_prime=anomalous_flag,
    use_u_aniso = True,
    use_u_iso = False,
    random_u_cart_scale = 0.3,
    random_u_iso = False,
    random_occupancy=True)
  if(parameter_name in ["u_star", "u_iso"]): shake_sigma = shake_sigma / 2.
  random_structure.random_modify_adp_and_adp_flags(
                             scatterers         = structure_ideal.scatterers(),
                             random_u_iso_scale = 0.3,
                             random_u_iso_min   = 0.0,
                             parameter_name     = parameter_name)
  rnd_f_calc = structure_ideal.structure_factors(
    anomalous_flag=anomalous_flag, d_min=d_min, algorithm="direct").f_calc()
  if data_type == 'F':
    y_obs = abs(rnd_f_calc)
  elif data_type == 'F^2':
    y_obs = rnd_f_calc.norm()
    y_obs.set_observation_type_xray_intensity()
  structure_shake = structure_ideal.random_modify_parameters(
        parameter_name, shake_sigma, vary_z_only=False)
  assert tuple(structure_ideal.special_position_indices()) \
      == tuple(structure_shake.special_position_indices())
  target_ftor = target_functor(y_obs)
  for structure in (structure_ideal, structure_shake)[:]: #SWITCH
    f_calc = y_obs.structure_factors_from_scatterers(
      xray_structure=structure,
      algorithm="direct").f_calc()
    target_result = target_ftor(f_calc, compute_derivatives=True)
    if (structure == structure_ideal):
      assert abs(target_result.target()) < 1.e-5

  gradient_flags=xray.structure_factors.gradient_flags(
     site=(parameter_name=="site" or random.choice((False,True))),
     u_iso=(parameter_name=="u_iso" or random.choice((False,True))),
     u_aniso=(parameter_name=="u_star" or random.choice((False,True))),
     occupancy=(parameter_name=="occupancy" or random.choice((False,True))),
     fp=(parameter_name=="fp" or random.choice((False,True))),
     fdp=(parameter_name=="fdp" or (anomalous_flag
                                    and random.choice((False,True)))))
  xray.set_scatterer_grad_flags(scatterers = structure.scatterers(),
                                site       = gradient_flags.site,
                                u_iso      = gradient_flags.u_iso,
                                u_aniso    = gradient_flags.u_aniso,
                                occupancy  = gradient_flags.occupancy,
                                fp         = gradient_flags.fp,
                                fdp        = gradient_flags.fdp)
  grad_flags_counts = xray.scatterer_grad_flags_counts(structure.scatterers())
  sf = xray.structure_factors.gradients_direct(
    xray_structure=structure,
    u_iso_refinable_params=None,
    miller_set=y_obs,
    d_target_d_f_calc=target_result.derivatives(),
    n_parameters=0)
  if (parameter_name == "site"):
    d_analytical = sf.d_target_d_site_frac()
    if (cartesian_flag): # average d_analytical or d_numerical, but not both
      structure_ideal.apply_special_position_ops_d_target_d_site(d_analytical)
    if (cartesian_flag):
      d_analytical = sf.d_target_d_site_cart()
    d_numerical = finite_differences_site(
      cartesian_flag, target_ftor, structure)
    if (not cartesian_flag): # aver. d_analytical or d_numerical, but not both
      structure_ideal.apply_special_position_ops_d_target_d_site(d_numerical)
  elif (parameter_name == "u_star" and grad_flags_counts.use_u_aniso > 0):
    d_analytical = sf.d_target_d_u_star()
    d_numerical = finite_differences_u_star(target_ftor, structure)
  else:
   if (parameter_name == "occupancy"):
     d_analytical = sf.d_target_d_occupancy()
   elif (parameter_name == "u_iso" and grad_flags_counts.use_u_iso > 0):
     d_analytical = sf.d_target_d_u_iso()
   elif (parameter_name == "fp"):
     d_analytical = sf.d_target_d_fp()
   elif (parameter_name == "fdp"):
     d_analytical = sf.d_target_d_fdp()
   else:
     raise RuntimeError
   d_numerical = finite_differences_scalar(
     parameter_name, target_ftor, structure)
  linear_regression_test(d_analytical, d_numerical, test_hard,
                           verbose=verbose)
  if (parameter_name == "u_iso" and grad_flags_counts.use_u_iso > 0):
    u_iso_refinable_params = flex.double()
    for scatterer in structure.scatterers():
        scatterer.flags.set_tan_u_iso(True)
        scatterer.flags.set_grad_u_iso(gradient_flags.u_iso)
        param = random.randint(90,120)
        scatterer.flags.param= param
        value = math.tan(scatterer.u_iso*math.pi/adptbx.b_as_u(param)-math.pi/2)
        u_iso_refinable_params.append(value)
    sf = xray.structure_factors.gradients_direct(
      xray_structure=structure,
      u_iso_refinable_params = u_iso_refinable_params,
      miller_set=y_obs,
      d_target_d_f_calc=target_result.derivatives(),
      n_parameters=0)
    d_analytical = sf.d_target_d_u_iso()
    d_numerical = finite_differences_scalar("tan_u_iso",target_ftor, structure)
    linear_regression_test(d_analytical, d_numerical, test_hard,
                           verbose=verbose)