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