Beispiel #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)
Beispiel #2
0
def run(args,
        cutoff,
        high_resolution_only,
        plots_dir="itvc_kissel_plots",
        verbose=0):
    itab = itvc_section61_io.read_table6111(args[0])
    itab_x = cctbx.eltbx.gaussian_fit.international_tables_stols
    isel = itab_x <= cutoff + 1.e-6
    if (high_resolution_only):
        isel &= itab_x > 2 + 1.e-6
    itab_x = itab_x.select(isel)
    for file_name in args[1:]:
        ktab = kissel_io.read_table(file_name)
        if (ktab.element == "Es"): continue
        sel = ktab.x <= cutoff + 1
        ktab_x = ktab.x.select(sel)
        ktab_y = ktab.y.select(sel)
        ktabs_sigmas = ktab.sigmas.select(sel)
        itab_entry = itab.entries[ktab.element]
        itab_y = itab_entry.table_y.select(isel)
        itab_sigmas = itab_entry.table_sigmas.select(isel)
        f = open(os.path.join(plots_dir, ktab.element + ".xy"), "w")
        cctbx.eltbx.gaussian_fit.write_plot(f, ktab_x, ktab_y)
        cctbx.eltbx.gaussian_fit.write_plot(f, itab_x, itab_y)
        f.close()
        ktab_y_i = flex.linear_interpolation(ktab.x, ktab.y, itab_x)
        ktab_sigmas_i = flex.linear_interpolation(ktab.x, ktab.sigmas, itab_x)
        assert ktab_y_i.all_gt(0)
        s = StringIO.StringIO()
        print >> s, "stol  kissel    itvc   delta sig_itvc rel_sig rel_del tol_del"
        max_delta = 0
        max_tol_del = 0
        for x, ky, ksig, iy, isig in zip(itab_x, ktab_y_i, ktab_sigmas_i,
                                         itab_y, itab_sigmas):
            if (iy > 0): ie = "%7.4f" % abs(isig / iy)
            else: ie = " ******"
            delta = iy - ky
            rel_del = abs(delta) / ky
            tol_del = max(0, abs(delta) - ksig - isig) / ky
            print >> s, "%4.2f %7.4f %7.4f %7.4f %8.5f %-s %7.4f %7.4f" % (
                x, ky, iy, delta, isig, ie, rel_del, tol_del)
            max_delta = max(max_delta, abs(delta))
            max_tol_del = max(max_tol_del, tol_del)
        print "Element:", ktab.element, "max_delta=%.4f, max_tol_del=%.4f" % (
            max_delta, max_tol_del)
        sys.stdout.write(s.getvalue())
        print
Beispiel #3
0
def run(args, cutoff, high_resolution_only,
        plots_dir="itvc_kissel_plots", verbose=0):
  itab = itvc_section61_io.read_table6111(args[0])
  itab_x = cctbx.eltbx.gaussian_fit.international_tables_stols
  isel = itab_x <= cutoff + 1.e-6
  if (high_resolution_only):
    isel &= itab_x > 2 + 1.e-6
  itab_x = itab_x.select(isel)
  for file_name in args[1:]:
    ktab = kissel_io.read_table(file_name)
    if (ktab.element == "Es"): continue
    sel = ktab.x <= cutoff + 1
    ktab_x = ktab.x.select(sel)
    ktab_y = ktab.y.select(sel)
    ktabs_sigmas = ktab.sigmas.select(sel)
    itab_entry = itab.entries[ktab.element]
    itab_y = itab_entry.table_y.select(isel)
    itab_sigmas = itab_entry.table_sigmas.select(isel)
    f = open(os.path.join(plots_dir, ktab.element + ".xy"), "w")
    cctbx.eltbx.gaussian_fit.write_plot(f, ktab_x, ktab_y)
    cctbx.eltbx.gaussian_fit.write_plot(f, itab_x, itab_y)
    f.close()
    ktab_y_i = flex.linear_interpolation(ktab.x, ktab.y, itab_x)
    ktab_sigmas_i = flex.linear_interpolation(ktab.x, ktab.sigmas, itab_x)
    assert ktab_y_i.all_gt(0)
    s = StringIO.StringIO()
    print >> s, "stol  kissel    itvc   delta sig_itvc rel_sig rel_del tol_del"
    max_delta = 0
    max_tol_del = 0
    for x,ky,ksig,iy,isig in zip(itab_x, ktab_y_i, ktab_sigmas_i,
                                         itab_y, itab_sigmas):
      if (iy > 0): ie = "%7.4f" % abs(isig/iy)
      else: ie = " ******"
      delta = iy - ky
      rel_del = abs(delta) / ky
      tol_del = max(0, abs(delta)-ksig-isig) / ky
      print >> s, "%4.2f %7.4f %7.4f %7.4f %8.5f %-s %7.4f %7.4f" % (
        x,ky,iy,delta,isig,ie,rel_del,tol_del)
      max_delta = max(max_delta, abs(delta))
      max_tol_del = max(max_tol_del, tol_del)
    print "Element:", ktab.element, "max_delta=%.4f, max_tol_del=%.4f" % (
      max_delta, max_tol_del)
    sys.stdout.write(s.getvalue())
    print
Beispiel #4
0
def run(gaussian_fit_pickle_file_names, itvc_file_name, kissel_dir):
    itvc_tab = None
    if (itvc_file_name is not None):
        itvc_tab = itvc_section61_io.read_table6111(itvc_file_name)
    fits = read_pickled_fits(gaussian_fit_pickle_file_names)
    #easy_pickle.dump("all_fits.pickle", fits)
    for k, v in fits.parameters.items():
        print "# %s:" % k, v
    print
    max_errors = flex.double()
    labeled_fits = []
    n_processed = 0
    for label in expected_labels(kissel_dir):
        try:
            fit_group = fits.all[label]
        except Exception:
            print "# Warning: Missing scattering_type:", label
        else:
            print "scattering_type:", label
            prev_fit = None
            for fit in fit_group:
                if (prev_fit is not None):
                    if (fit.stol > prev_fit.stol):
                        print "# Warning: decreasing stol"
                    elif (fit.stol == prev_fit.stol):
                        if (fit.max_error < prev_fit.max_error):
                            print "# Warning: same stol but previous has larger error"
                prev_fit = fit
                fit.sort().show()
                gaussian_fit = None
                if (itvc_tab is not None and label != "O2-"):
                    entry = itvc_tab.entries[label]
                    sel = international_tables_stols <= fit.stol + 1.e-6
                    gaussian_fit = scitbx.math.gaussian.fit(
                        international_tables_stols.select(sel),
                        entry.table_y.select(sel),
                        entry.table_sigmas.select(sel), fit)
                elif (kissel_dir is not None):
                    file_name = os.path.join(
                        kissel_dir, "%02d_%s_rf" %
                        (tiny_pse.table(label).atomic_number(), label))
                    tab = kissel_io.read_table(file_name)
                    sel = tab.itvc_sampling_selection() & (tab.x <=
                                                           fit.stol + 1.e-6)
                    gaussian_fit = scitbx.math.gaussian.fit(
                        tab.x.select(sel), tab.y.select(sel),
                        tab.sigmas.select(sel), fit)
                if (gaussian_fit is not None):
                    max_errors.append(
                        flex.max(gaussian_fit.significant_relative_errors()))
                    labeled_fits.append(labeled_fit(label, gaussian_fit))
            n_processed += 1
    print
    if (n_processed != len(fits.all)):
        print "# Warning: %d fits were not processed." % (len(fits.all) -
                                                          n_processed)
        print
    if (max_errors.size() > 0):
        print "Summary:"
        perm = flex.sort_permutation(data=max_errors, reverse=True)
        max_errors = max_errors.select(perm)
        labeled_fits = flex.select(labeled_fits, perm)
        quick_summary = {}
        for me, lf in zip(max_errors, labeled_fits):
            print lf.label, "n_terms=%d max_error: %.4f" % (
                lf.gaussian_fit.n_terms(), me)
            quick_summary[lf.label + "_" + str(lf.gaussian_fit.n_terms())] = me
            if (me > 0.01):
                fit = lf.gaussian_fit
                re = fit.significant_relative_errors()
                for s, y, a, r in zip(fit.table_x(), fit.table_y(),
                                      fit.fitted_values(), re):
                    comment = ""
                    if (r > 0.01): comment = " large error"
                    print "%4.2f %7.4f %7.4f %7.4f %7.4f%s" % (s, y, a, a - y,
                                                               r, comment)
                print
        print
def run(gaussian_fit_pickle_file_names, itvc_file_name, kissel_dir):
  itvc_tab = None
  if (itvc_file_name is not None):
    itvc_tab = itvc_section61_io.read_table6111(itvc_file_name)
  fits = read_pickled_fits(gaussian_fit_pickle_file_names)
  #easy_pickle.dump("all_fits.pickle", fits)
  for k,v in fits.parameters.items():
    print "# %s:" % k, v
  print
  max_errors = flex.double()
  labeled_fits = []
  n_processed = 0
  for label in expected_labels(kissel_dir):
    try:
      fit_group = fits.all[label]
    except Exception:
      print "# Warning: Missing scattering_type:", label
    else:
      print "scattering_type:", label
      prev_fit = None
      for fit in fit_group:
        if (prev_fit is not None):
          if (fit.stol > prev_fit.stol):
            print "# Warning: decreasing stol"
          elif (fit.stol == prev_fit.stol):
            if (fit.max_error < prev_fit.max_error):
              print "# Warning: same stol but previous has larger error"
        prev_fit = fit
        fit.sort().show()
        gaussian_fit = None
        if (itvc_tab is not None and label != "O2-"):
          entry = itvc_tab.entries[label]
          sel = international_tables_stols <= fit.stol + 1.e-6
          gaussian_fit = scitbx.math.gaussian.fit(
            international_tables_stols.select(sel),
            entry.table_y.select(sel),
            entry.table_sigmas.select(sel),
            fit)
        elif (kissel_dir is not None):
          file_name = os.path.join(kissel_dir, "%02d_%s_rf" % (
            tiny_pse.table(label).atomic_number(), label))
          tab = kissel_io.read_table(file_name)
          sel = tab.itvc_sampling_selection() & (tab.x <= fit.stol + 1.e-6)
          gaussian_fit = scitbx.math.gaussian.fit(
            tab.x.select(sel),
            tab.y.select(sel),
            tab.sigmas.select(sel),
            fit)
        if (gaussian_fit is not None):
          max_errors.append(
            flex.max(gaussian_fit.significant_relative_errors()))
          labeled_fits.append(labeled_fit(label, gaussian_fit))
      n_processed += 1
  print
  if (n_processed != len(fits.all)):
    print "# Warning: %d fits were not processed." % (
      len(fits.all) - n_processed)
    print
  if (max_errors.size() > 0):
    print "Summary:"
    perm = flex.sort_permutation(data=max_errors, reverse=True)
    max_errors = max_errors.select(perm)
    labeled_fits = flex.select(labeled_fits, perm)
    quick_summary = {}
    for me,lf in zip(max_errors, labeled_fits):
      print lf.label, "n_terms=%d max_error: %.4f" % (
        lf.gaussian_fit.n_terms(), me)
      quick_summary[lf.label + "_" + str(lf.gaussian_fit.n_terms())] = me
      if (me > 0.01):
        fit = lf.gaussian_fit
        re = fit.significant_relative_errors()
        for s,y,a,r in zip(fit.table_x(),fit.table_y(),fit.fitted_values(),re):
          comment = ""
          if (r > 0.01): comment = " large error"
          print "%4.2f %7.4f %7.4f %7.4f %7.4f%s" % (s,y,a,a-y,r,comment)
        print
    print