Пример #1
0
def run(args, cutoff, max_n_terms, six_term=False, params=None,
        plots_dir="kissel_fits_plots", verbose=0):
  if (params is None):
    params = cctbx.eltbx.gaussian_fit.fit_parameters(
      max_n_terms=max_n_terms)
  chunk_n = 1
  chunk_i = 0
  if (len(args) > 0 and len(args[0].split(",")) == 2):
    chunk_n, chunk_i = [int(i) for i in args[0].split(",")]
    args = args[1:]
  if (not six_term):
    if (not os.path.isdir(plots_dir)):
      print "No plots because target directory does not exist (mkdir %s)." % \
        plots_dir
      plots_dir = None
    if (chunk_n > 1):
      assert plots_dir is not None
  i_chunk = 0
  for file_name in args:
    flag = i_chunk % chunk_n == chunk_i
    i_chunk += 1
    if (not flag):
      continue
    results = {}
    results["fit_parameters"] = params
    tab = kissel_io.read_table(file_name)
    more_selection = tab.itvc_sampling_selection()
    fit_selection = more_selection & (tab.x <= cutoff + 1.e-6)
    null_fit = scitbx.math.gaussian.fit(
      tab.x.select(fit_selection),
      tab.y.select(fit_selection),
      tab.sigmas.select(fit_selection),
      xray_scattering.gaussian(0, False))
    null_fit_more = scitbx.math.gaussian.fit(
      tab.x.select(more_selection),
      tab.y.select(more_selection),
      tab.sigmas.select(more_selection),
      xray_scattering.gaussian(0, False))
    if (not six_term):
      results[tab.element] = cctbx.eltbx.gaussian_fit.incremental_fits(
        label=tab.element,
        null_fit=null_fit,
        params=params,
        plots_dir=plots_dir,
        verbose=verbose)
    else:
      best_min = scitbx.math.gaussian_fit.fit_with_golay_starts(
        label=tab.element,
        null_fit=null_fit,
        null_fit_more=null_fit_more,
        params=params)
      g = best_min.final_gaussian_fit
      results[tab.element] = [xray_scattering.fitted_gaussian(
        stol=g.table_x()[-1], gaussian_sum=g)]
    sys.stdout.flush()
    pickle_file_name = "%s_fits.pickle" % identifier(tab.element)
    easy_pickle.dump(pickle_file_name, results)
Пример #2
0
    def add_bulk_solvent(self, reference_registry):
        assert (self.interpreted_pdb is not None)
        assert (self.xyz is not None)

        # determine scattering types
        self.scattering_types = self.interpreted_pdb.all_chain_proxies.\
                                nonbonded_energy_type_registry.symbols
        self.element_types = self.interpreted_pdb.all_chain_proxies.\
                             scattering_type_registry.symbols
        assert (len(self.scattering_types) == len(self.element_types))
        for i in xrange(len(self.scattering_types)):
            if (len(self.scattering_types[i]) == 0):
                self.scattering_types[i] = self.element_types[i]

        atom_library = self.interpreted_pdb.ener_lib.lib_atom
        new_registry = scattering_type_registry()
        for s_type, e_type in zip(self.scattering_types, self.element_types):
            if (new_registry.has_key(s_type) is False):
                new_registry.process(s_type)

                # old parameters
                g = reference_registry.gaussian(e_type)
                a = list(g.array_of_a())
                b = list(g.array_of_b())
                c = g.c()
                use_c = g.use_c()

                # add new parameters for bulk solvent
                if (s_type in atom_library.keys()):
                    if (self.explicit_h):
                        vdw_radius = atom_library[s_type].vdw_radius
                    else:
                        vdw_radius = atom_library[s_type].vdwh_radius
                else:
                    vdw_radius = self.default_radius
                if (vdw_radius is None):
                    vdw_radius = self.default_radius
                v = 4.0 / 3.0 * math.pi * math.pow(vdw_radius,
                                                   3) * self.fudge_factor
                a.append(-self.bulk_solvent_scale * v)
                b.append(math.pi * math.pow(v, 2.0 / 3.0))

                # finalize form factor
                new_g = gaussian(a, b, c, use_c)
                new_registry.assign(s_type, new_g)
            else:
                new_registry.process(s_type)

        ## # add O for boundary layer solvent
        ## o_g = reference_registry.gaussian('O')
        ## new_registry.process('HOH')
        ## new_registry.assign('HOH',o_g)

        return new_registry
Пример #3
0
def incremental_fits(label, null_fit, params=None, plots_dir=None, verbose=0):
    if (params is None): params = fit_parameters()
    f0 = null_fit.table_y()[0]
    results = []
    previous_n_points = 0
    existing_gaussian = xray_scattering.gaussian([], [])
    while (existing_gaussian.n_terms() < params.max_n_terms):
        if (previous_n_points == null_fit.table_x().size()):
            print "%s: Full fit with %d terms. Search stopped." % (
                label, existing_gaussian.n_terms())
            print
            break
        n_terms = existing_gaussian.n_terms() + 1
        best_min = find_max_x_multi(
            null_fit=null_fit,
            existing_gaussian=existing_gaussian,
            target_powers=params.target_powers,
            minimize_using_sigmas=params.minimize_using_sigmas,
            n_repeats_minimization=params.n_repeats_minimization,
            shift_sqrt_b_mod_n=params.shift_sqrt_b_mod_n,
            b_min=params.b_min,
            max_max_error=params.max_max_error,
            n_start_fractions=params.n_start_fractions)
        if (best_min is None):
            print "Warning: No fit: %s n_terms=%d" % (label, n_terms)
            print
            break
        if (previous_n_points > best_min.final_gaussian_fit.table_x().size()):
            print "Warning: previous fit included more sampling points."
        previous_n_points = best_min.final_gaussian_fit.table_x().size()
        show_fit_summary("Best fit", label, best_min.final_gaussian_fit,
                         best_min.max_error)
        show_literature_fits(
            label=label,
            n_terms=n_terms,
            null_fit=null_fit,
            n_points=best_min.final_gaussian_fit.table_x().size(),
            e_other=best_min.max_error)
        best_min.final_gaussian_fit.show()
        best_min.show_minimization_parameters()
        existing_gaussian = best_min.final_gaussian_fit
        print
        show_minimize_multi_histogram()
        sys.stdout.flush()
        if (plots_dir):
            write_plots(plots_dir=plots_dir,
                        label=label + "_%d" % n_terms,
                        gaussian_fit=best_min.final_gaussian_fit)
        g = best_min.final_gaussian_fit
        results.append(
            xray_scattering.fitted_gaussian(stol=g.table_x()[-1],
                                            gaussian_sum=g))
    return results
Пример #4
0
def incremental_fits(label, null_fit, params=None, plots_dir=None, verbose=0):
  if (params is None): params = fit_parameters()
  f0 = null_fit.table_y()[0]
  results = []
  previous_n_points = 0
  existing_gaussian = xray_scattering.gaussian([],[])
  while (existing_gaussian.n_terms() < params.max_n_terms):
    if (previous_n_points == null_fit.table_x().size()):
      print "%s: Full fit with %d terms. Search stopped." % (
        label, existing_gaussian.n_terms())
      print
      break
    n_terms = existing_gaussian.n_terms() + 1
    best_min = find_max_x_multi(
      null_fit=null_fit,
      existing_gaussian=existing_gaussian,
      target_powers=params.target_powers,
      minimize_using_sigmas=params.minimize_using_sigmas,
      n_repeats_minimization=params.n_repeats_minimization,
      shift_sqrt_b_mod_n=params.shift_sqrt_b_mod_n,
      b_min=params.b_min,
      max_max_error=params.max_max_error,
      n_start_fractions=params.n_start_fractions)
    if (best_min is None):
      print "Warning: No fit: %s n_terms=%d" % (label, n_terms)
      print
      break
    if (previous_n_points > best_min.final_gaussian_fit.table_x().size()):
      print "Warning: previous fit included more sampling points."
    previous_n_points = best_min.final_gaussian_fit.table_x().size()
    show_fit_summary(
      "Best fit", label, best_min.final_gaussian_fit, best_min.max_error)
    show_literature_fits(
      label=label,
      n_terms=n_terms,
      null_fit=null_fit,
      n_points=best_min.final_gaussian_fit.table_x().size(),
      e_other=best_min.max_error)
    best_min.final_gaussian_fit.show()
    best_min.show_minimization_parameters()
    existing_gaussian = best_min.final_gaussian_fit
    print
    show_minimize_multi_histogram()
    sys.stdout.flush()
    if (plots_dir):
      write_plots(
        plots_dir=plots_dir,
        label=label+"_%d"%n_terms,
        gaussian_fit=best_min.final_gaussian_fit)
    g = best_min.final_gaussian_fit
    results.append(xray_scattering.fitted_gaussian(
      stol=g.table_x()[-1], gaussian_sum=g))
  return results
Пример #5
0
def __get_cache():
  global __cache
  if (__cache is None):
    from cctbx.eltbx.xray_scattering import get_standard_label
    from libtbx.containers import OrderedDict
    __cache = OrderedDict()
    assert len(ito_vol_c_2011_table_4_3_2_2) == 98
    for line in ito_vol_c_2011_table_4_3_2_2:
      flds = line.split()
      assert len(flds) == 12
      std_lbl = get_standard_label(flds[0], exact=True)
      assert flds[0] == std_lbl
      assert std_lbl not in __cache
      assert flds[1] == str(len(__cache)+1)
      def vals(i,j): return [float(s) for s in flds[i:j]]
      array_of_a = vals(2,7)
      array_of_b = vals(7,12)
      __cache[std_lbl] = gaussian(array_of_a, array_of_b)
  return __cache
Пример #6
0
def __get_cache():
  global __cache
  if (__cache is None):
    from cctbx.eltbx.xray_scattering import get_standard_label
    from libtbx.containers import OrderedDict
    __cache = OrderedDict()
    assert len(ito_vol_c_2011_table_4_3_2_2) == 98
    for line in ito_vol_c_2011_table_4_3_2_2:
      flds = line.split()
      assert len(flds) == 12
      std_lbl = get_standard_label(flds[0], exact=True)
      assert flds[0] == std_lbl
      assert std_lbl not in __cache
      assert flds[1] == str(len(__cache)+1)
      def vals(i,j): return [float(s) for s in flds[i:j]]
      array_of_a = vals(2,7)
      array_of_b = vals(7,12)
      __cache[std_lbl] = gaussian(array_of_a, array_of_b)
  return __cache
Пример #7
0
def run(file_name,
        args,
        cutoff,
        params,
        zig_zag=False,
        six_term=False,
        full_fits=None,
        plots_dir="itvc_fits_plots",
        verbose=0):
    tab = itvc_section61_io.read_table6111(file_name)
    chunk_n = 1
    chunk_i = 0
    if (len(args) > 0 and len(args[0].split(",")) == 2):
        chunk_n, chunk_i = [int(i) for i in args[0].split(",")]
        args = args[1:]
    if (not six_term and not zig_zag):
        if (not os.path.isdir(plots_dir)):
            print("No plots because target directory does not exist (mkdir %s)." % \
              plots_dir)
            plots_dir = None
        if (chunk_n > 1):
            assert plots_dir is not None
    stols_more = cctbx.eltbx.gaussian_fit.international_tables_stols
    sel = stols_more <= cutoff + 1.e-6
    stols = stols_more.select(sel)
    i_chunk = 0
    for element in tab.elements + ["O2-", "SDS"]:
        if (len(args) > 0 and element not in args): continue
        flag = i_chunk % chunk_n == chunk_i
        i_chunk += 1
        if (not flag):
            continue
        results = {}
        results["fit_parameters"] = params
        if (element == "SDS"):
            wrk_lbl = element
            from cctbx.eltbx.development.hydrogen_plots import fit_input
            fi = fit_input()
            sel = fi.stols <= cutoff + 1.e-6
            null_fit = scitbx.math.gaussian.fit(
                fi.stols.select(sel), fi.data.select(sel),
                fi.sigmas.select(sel), xray_scattering.gaussian(0, False))
            null_fit_more = scitbx.math.gaussian.fit(
                fi.stols, fi.data, fi.sigmas,
                xray_scattering.gaussian(0, False))
        else:
            wrk_lbl = xray_scattering.wk1995(element, True)
            if (element != "O2-"):
                entry = tab.entries[element]
                null_fit = scitbx.math.gaussian.fit(
                    stols, entry.table_y[:stols.size()],
                    entry.table_sigmas[:stols.size()],
                    xray_scattering.gaussian(0, False))
                null_fit_more = scitbx.math.gaussian.fit(
                    stols_more, entry.table_y[:stols_more.size()],
                    entry.table_sigmas[:stols_more.size()],
                    xray_scattering.gaussian(0, False))
            else:
                rrg_stols_more = rez_rez_grant.table_2_stol
                sel = rrg_stols_more <= cutoff + 1.e-6
                rrg_stols = rrg_stols_more.select(sel)
                null_fit = scitbx.math.gaussian.fit(
                    rrg_stols,
                    rez_rez_grant.table_2_o2minus[:rrg_stols.size()],
                    rez_rez_grant.table_2_sigmas[:rrg_stols.size()],
                    xray_scattering.gaussian(0, False))
                null_fit_more = scitbx.math.gaussian.fit(
                    rrg_stols_more,
                    rez_rez_grant.table_2_o2minus[:rrg_stols_more.size()],
                    rez_rez_grant.table_2_sigmas[:rrg_stols_more.size()],
                    xray_scattering.gaussian(0, False))
        if (zig_zag):
            results[wrk_lbl] = cctbx.eltbx.gaussian_fit.zig_zag_fits(
                label=wrk_lbl,
                null_fit=null_fit,
                null_fit_more=null_fit_more,
                params=params)
        elif (full_fits is not None):
            assert len(full_fits.all[wrk_lbl]) == 1
            results[wrk_lbl] = cctbx.eltbx.gaussian_fit.decremental_fits(
                label=wrk_lbl,
                null_fit=null_fit,
                full_fit=full_fits.all[wrk_lbl][0],
                params=params,
                plots_dir=plots_dir,
                verbose=verbose)
        elif (not six_term):
            results[wrk_lbl] = cctbx.eltbx.gaussian_fit.incremental_fits(
                label=wrk_lbl,
                null_fit=null_fit,
                params=params,
                plots_dir=plots_dir,
                verbose=verbose)
        else:
            best_min = scitbx.math.gaussian_fit.fit_with_golay_starts(
                label=wrk_lbl,
                null_fit=null_fit,
                null_fit_more=null_fit_more,
                params=params)
            g = best_min.final_gaussian_fit
            results[wrk_lbl] = [
                xray_scattering.fitted_gaussian(stol=g.table_x()[-1],
                                                gaussian_sum=g)
            ]
        sys.stdout.flush()
        pickle_file_name = "%s_fits.pickle" % identifier(wrk_lbl)
        easy_pickle.dump(pickle_file_name, results)
Пример #8
0
def run(file_name, args, cutoff, params,
        zig_zag=False, six_term=False, full_fits=None,
        plots_dir="itvc_fits_plots", verbose=0):
  tab = itvc_section61_io.read_table6111(file_name)
  chunk_n = 1
  chunk_i = 0
  if (len(args) > 0 and len(args[0].split(",")) == 2):
    chunk_n, chunk_i = [int(i) for i in args[0].split(",")]
    args = args[1:]
  if (not six_term and not zig_zag):
    if (not os.path.isdir(plots_dir)):
      print "No plots because target directory does not exist (mkdir %s)." % \
        plots_dir
      plots_dir = None
    if (chunk_n > 1):
      assert plots_dir is not None
  stols_more = cctbx.eltbx.gaussian_fit.international_tables_stols
  sel = stols_more <= cutoff + 1.e-6
  stols = stols_more.select(sel)
  i_chunk = 0
  for element in tab.elements + ["O2-", "SDS"]:
    if (len(args) > 0 and element not in args): continue
    flag = i_chunk % chunk_n == chunk_i
    i_chunk += 1
    if (not flag):
      continue
    results = {}
    results["fit_parameters"] = params
    if (element == "SDS"):
      wrk_lbl = element
      from cctbx.eltbx.development.hydrogen_plots import fit_input
      fi = fit_input()
      sel = fi.stols <= cutoff + 1.e-6
      null_fit = scitbx.math.gaussian.fit(
        fi.stols.select(sel),
        fi.data.select(sel),
        fi.sigmas.select(sel),
        xray_scattering.gaussian(0, False))
      null_fit_more = scitbx.math.gaussian.fit(
        fi.stols,
        fi.data,
        fi.sigmas,
        xray_scattering.gaussian(0, False))
    else:
      wrk_lbl = xray_scattering.wk1995(element, True)
      if (element != "O2-"):
        entry = tab.entries[element]
        null_fit = scitbx.math.gaussian.fit(
          stols,
          entry.table_y[:stols.size()],
          entry.table_sigmas[:stols.size()],
          xray_scattering.gaussian(0, False))
        null_fit_more = scitbx.math.gaussian.fit(
          stols_more,
          entry.table_y[:stols_more.size()],
          entry.table_sigmas[:stols_more.size()],
          xray_scattering.gaussian(0, False))
      else:
        rrg_stols_more = rez_rez_grant.table_2_stol
        sel = rrg_stols_more <= cutoff + 1.e-6
        rrg_stols = rrg_stols_more.select(sel)
        null_fit = scitbx.math.gaussian.fit(
          rrg_stols,
          rez_rez_grant.table_2_o2minus[:rrg_stols.size()],
          rez_rez_grant.table_2_sigmas[:rrg_stols.size()],
          xray_scattering.gaussian(0, False))
        null_fit_more = scitbx.math.gaussian.fit(
          rrg_stols_more,
          rez_rez_grant.table_2_o2minus[:rrg_stols_more.size()],
          rez_rez_grant.table_2_sigmas[:rrg_stols_more.size()],
          xray_scattering.gaussian(0, False))
    if (zig_zag):
      results[wrk_lbl] = cctbx.eltbx.gaussian_fit.zig_zag_fits(
        label=wrk_lbl,
        null_fit=null_fit,
        null_fit_more=null_fit_more,
        params=params)
    elif (full_fits is not None):
      assert len(full_fits.all[wrk_lbl]) == 1
      results[wrk_lbl] = cctbx.eltbx.gaussian_fit.decremental_fits(
        label=wrk_lbl,
        null_fit=null_fit,
        full_fit=full_fits.all[wrk_lbl][0],
        params=params,
        plots_dir=plots_dir,
        verbose=verbose)
    elif (not six_term):
      results[wrk_lbl] = cctbx.eltbx.gaussian_fit.incremental_fits(
        label=wrk_lbl,
        null_fit=null_fit,
        params=params,
        plots_dir=plots_dir,
        verbose=verbose)
    else:
      best_min = scitbx.math.gaussian_fit.fit_with_golay_starts(
        label=wrk_lbl,
        null_fit=null_fit,
        null_fit_more=null_fit_more,
        params=params)
      g = best_min.final_gaussian_fit
      results[wrk_lbl] = [xray_scattering.fitted_gaussian(
        stol=g.table_x()[-1], gaussian_sum=g)]
    sys.stdout.flush()
    pickle_file_name = "%s_fits.pickle" % identifier(wrk_lbl)
    easy_pickle.dump(pickle_file_name, results)
Пример #9
0
def exercise_gaussian():
    g = xray_scattering.gaussian(0)
    assert g.n_terms() == 0
    assert approx_equal(g.c(), 0)
    assert g.use_c()
    assert g.n_parameters() == 1
    g = xray_scattering.gaussian(0, False)
    assert g.n_terms() == 0
    assert approx_equal(g.c(), 0)
    assert not g.use_c()
    assert g.n_parameters() == 0
    g = xray_scattering.gaussian(1)
    assert g.n_terms() == 0
    assert g.array_of_a() == ()
    assert g.array_of_b() == ()
    assert approx_equal(g.c(), 1)
    assert g.n_parameters() == 1
    g = xray_scattering.gaussian((), ())
    assert g.n_terms() == 0
    assert g.array_of_a() == ()
    assert g.array_of_b() == ()
    assert g.c() == 0
    g = xray_scattering.gaussian((), (), -2)
    assert g.n_terms() == 0
    assert g.array_of_a() == ()
    assert g.array_of_b() == ()
    assert approx_equal(g.c(), -2)
    g = xray_scattering.gaussian(flex.double((1, 2, 3, 4)))
    assert approx_equal(g.array_of_a(), (1, 3))
    assert approx_equal(g.array_of_b(), (2, 4))
    assert approx_equal(g.c(), 0)
    assert not g.use_c()
    g = xray_scattering.gaussian(flex.double((1, 2, 3, 4)), 0, True)
    assert approx_equal(g.c(), 0)
    assert g.use_c()
    g = xray_scattering.gaussian(flex.double((1, 2, 3, 4)), 5)
    assert approx_equal(g.c(), 5)
    assert g.use_c()
    g = xray_scattering.gaussian((1, -2, 3, -4, 5), (-.1, .2, -.3, .4, -.5), 6)
    assert g.n_terms() == 5
    assert approx_equal(g.array_of_a(), (1, -2, 3, -4, 5))
    assert approx_equal(g.array_of_b(), (-.1, .2, -.3, .4, -.5))
    assert approx_equal(g.c(), 6)
    assert approx_equal(g.at_stol_sq(3 / 4.), 13.4251206)
    assert approx_equal(g.at_stol(math.sqrt(3 / 4.)), 13.4251206)
    assert approx_equal(g.at_d_star_sq(3), 13.4251206)
    assert approx_equal(g.at_d_star_sq(flex.double([3, 4])),
                        [13.4251206, 15.079612])
    assert approx_equal(g.at_d_star(math.sqrt(3)), 13.4251206)
    s = pickle.dumps(g)
    l = pickle.loads(s)
    assert l.n_terms() == g.n_terms()
    assert approx_equal(l.array_of_a(), g.array_of_a())
    assert approx_equal(l.array_of_b(), g.array_of_b())
    assert approx_equal(l.c(), g.c())
    assert l.use_c()
    g = xray_scattering.gaussian((1, -2, 3, -4, 5), (-.1, .2, -.3, .4, -.5))
    s = pickle.dumps(g)
    l = pickle.loads(s)
    assert l.n_terms() == g.n_terms()
    assert approx_equal(l.array_of_a(), g.array_of_a())
    assert approx_equal(l.array_of_b(), g.array_of_b())
    assert approx_equal(l.c(), g.c())
    assert not l.use_c()
    #
    g = xray_scattering.gaussian(*list(
        zip(*[(2.51340127252, 31.8053433708), (
            1.74867019409, 0.445605499982), (1.72398202356,
                                             10.5831679451)])))  # C 3-gaussian
    assert not g.use_c()
    e = g.electron_density
    assert approx_equal(e(r=0, b_iso=0), 264.731533932)
    assert approx_equal(e(r=0, b_iso=1), 47.3615000971)
    assert approx_equal(e(r=1, b_iso=0), 0.233911429529)
    assert approx_equal(e(r=1, b_iso=1), 0.243343387016)
    g = xray_scattering.gaussian((2.31000, 1.02000, 1.58860, 0.865000),
                                 (20.8439, 10.2075, 0.568700, 51.6512),
                                 0.215600)  # C it1992
    assert g.use_c()
    e = g.electron_density
    assert approx_equal(e(r=0, b_iso=0.1), 435.677592698)
    assert approx_equal(e(r=0, b_iso=1), 47.9420591405)
    assert approx_equal(e(r=1, b_iso=0.1), 0.241082494004)
    assert approx_equal(e(r=1, b_iso=1), 0.248806720643)
Пример #10
0
def exercise_gaussian():
  g = xray_scattering.gaussian(0)
  assert g.n_terms() == 0
  assert approx_equal(g.c(), 0)
  assert g.use_c()
  assert g.n_parameters() == 1
  g = xray_scattering.gaussian(0, False)
  assert g.n_terms() == 0
  assert approx_equal(g.c(), 0)
  assert not g.use_c()
  assert g.n_parameters() == 0
  g = xray_scattering.gaussian(1)
  assert g.n_terms() == 0
  assert g.array_of_a() == ()
  assert g.array_of_b() == ()
  assert approx_equal(g.c(), 1)
  assert g.n_parameters() == 1
  g = xray_scattering.gaussian((), ())
  assert g.n_terms() == 0
  assert g.array_of_a() == ()
  assert g.array_of_b() == ()
  assert g.c() == 0
  g = xray_scattering.gaussian((), (), -2)
  assert g.n_terms() == 0
  assert g.array_of_a() == ()
  assert g.array_of_b() == ()
  assert approx_equal(g.c(), -2)
  g = xray_scattering.gaussian(flex.double((1,2,3,4)))
  assert approx_equal(g.array_of_a(), (1,3))
  assert approx_equal(g.array_of_b(), (2,4))
  assert approx_equal(g.c(), 0)
  assert not g.use_c()
  g = xray_scattering.gaussian(flex.double((1,2,3,4)), 0, True)
  assert approx_equal(g.c(), 0)
  assert g.use_c()
  g = xray_scattering.gaussian(flex.double((1,2,3,4)), 5)
  assert approx_equal(g.c(), 5)
  assert g.use_c()
  g = xray_scattering.gaussian((1,-2,3,-4,5), (-.1,.2,-.3,.4,-.5), 6)
  assert g.n_terms() == 5
  assert approx_equal(g.array_of_a(),(1,-2,3,-4,5))
  assert approx_equal(g.array_of_b(),(-.1,.2,-.3,.4,-.5))
  assert approx_equal(g.c(), 6)
  assert approx_equal(g.at_stol_sq(3/4.), 13.4251206)
  assert approx_equal(g.at_stol(math.sqrt(3/4.)), 13.4251206)
  assert approx_equal(g.at_d_star_sq(3), 13.4251206)
  assert approx_equal(g.at_d_star_sq(flex.double([3,4])),
    [13.4251206, 15.079612])
  assert approx_equal(g.at_d_star(math.sqrt(3)), 13.4251206)
  s = pickle.dumps(g)
  l = pickle.loads(s)
  assert l.n_terms() == g.n_terms()
  assert approx_equal(l.array_of_a(), g.array_of_a())
  assert approx_equal(l.array_of_b(), g.array_of_b())
  assert approx_equal(l.c(), g.c())
  assert l.use_c()
  g = xray_scattering.gaussian((1,-2,3,-4,5), (-.1,.2,-.3,.4,-.5))
  s = pickle.dumps(g)
  l = pickle.loads(s)
  assert l.n_terms() == g.n_terms()
  assert approx_equal(l.array_of_a(), g.array_of_a())
  assert approx_equal(l.array_of_b(), g.array_of_b())
  assert approx_equal(l.c(), g.c())
  assert not l.use_c()
  #
  g = xray_scattering.gaussian(*zip(*[
    (2.51340127252, 31.8053433708),
    (1.74867019409, 0.445605499982),
    (1.72398202356, 10.5831679451)])) # C 3-gaussian
  assert not g.use_c()
  e = g.electron_density
  assert approx_equal(e(r=0, b_iso=0), 264.731533932)
  assert approx_equal(e(r=0, b_iso=1), 47.3615000971)
  assert approx_equal(e(r=1, b_iso=0), 0.233911429529)
  assert approx_equal(e(r=1, b_iso=1), 0.243343387016)
  g = xray_scattering.gaussian(
    (2.31000, 1.02000, 1.58860, 0.865000),
    (20.8439, 10.2075, 0.568700, 51.6512),
    0.215600) # C it1992
  assert g.use_c()
  e = g.electron_density
  assert approx_equal(e(r=0, b_iso=0.1), 435.677592698)
  assert approx_equal(e(r=0, b_iso=1), 47.9420591405)
  assert approx_equal(e(r=1, b_iso=0.1), 0.241082494004)
  assert approx_equal(e(r=1, b_iso=1), 0.248806720643)