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)
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
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
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