def __init__(self, model, h_bond_params=None, protein_only=False, pair_proxies=None, write_eff_file=True): if (h_bond_params is None): import cctbx.geometry_restraints.process_nonbonded_proxies as pnp h_bond_params = pnp.h_bond() Hs = h_bond_params.Hs As = h_bond_params.As Ds = h_bond_params.Ds d_HA_cutoff = h_bond_params.d_HA_cutoff d_DA_cutoff = h_bond_params.d_DA_cutoff a_DHA_cutoff = h_bond_params.a_DHA_cutoff a_YAH_cutoff = h_bond_params.a_YAH_cutoff # self.result = [] self.model = model self.pair_proxies = pair_proxies self.external_proxies = False if (self.pair_proxies is not None): self.external_proxies = True atoms = self.model.get_hierarchy().atoms() geometry = self.model.get_restraints_manager() fsc0 = geometry.geometry.shell_sym_tables[0].full_simple_connectivity() bond_proxies_simple, asu = geometry.geometry.get_all_bond_proxies( sites_cart=self.model.get_sites_cart()) sites_cart = self.model.get_sites_cart() crystal_symmetry = self.model.crystal_symmetry() fm = crystal_symmetry.unit_cell().fractionalization_matrix() om = crystal_symmetry.unit_cell().orthogonalization_matrix() pg = get_pair_generator(crystal_symmetry=crystal_symmetry, buffer_thickness=d_HA_cutoff[1], sites_cart=sites_cart) get_class = iotbx.pdb.common_residue_names_get_class # find proxies if not provided if (self.pair_proxies is None): pp = [] self.pair_proxies = [] pp = [p for p in pg.pair_generator] else: pp = self.pair_proxies # now loop over proxies for p in pp: i, j = p.i_seq, p.j_seq if (self.external_proxies ): # making sure proxies point to same atoms a_i = make_atom_id(atom=atoms[i], index=i).id_str a_j = make_atom_id(atom=atoms[j], index=j).id_str assert a_i == p.atom_A.id_str, [a_i, p.atom_A.id_str] assert a_j == p.atom_H.id_str, [a_j, p.atom_H.id_str] # presecreen candidates ei, ej = atoms[i].element, atoms[j].element is_candidate = precheck(atoms=atoms, i=i, j=j, Hs=Hs, As=As, Ds=Ds, fsc0=fsc0) if (protein_only): for it in [i, j]: resname = atoms[it].parent().resname is_candidate &= get_class( name=resname) == "common_amino_acid" if (not is_candidate): continue # pre-screen candidates end # symop tp map onto symmetry related rt_mx_ji = None if (not self.external_proxies): rt_mx_i = pg.conn_asu_mappings.get_rt_mx_i(p) rt_mx_j = pg.conn_asu_mappings.get_rt_mx_j(p) rt_mx_ji = rt_mx_i.inverse().multiply(rt_mx_j) else: rt_mx_ji = p.rt_mx_ji # D, H, A, Y, atom_A, atom_H, atom_D = get_D_H_A_Y(i=i, j=j, Hs=Hs, fsc0=fsc0, rt_mx_ji=rt_mx_ji, fm=fm, om=om, atoms=atoms) if (len(Y) == 0): continue # don't use 'lone' acceptors # d_DA = D.distance(A) if (not self.external_proxies): if (d_DA < d_DA_cutoff[0] or d_DA > d_DA_cutoff[1]): continue # d_HA = A.distance(H) if (not self.external_proxies): assert d_HA <= d_HA_cutoff[1] assert approx_equal(math.sqrt(p.dist_sq), d_HA, 1.e-3) if (d_HA < d_HA_cutoff[0]): continue # assert H.distance(D) < 1.15, [H.distance(D), H.name, D.name] # filter by a_DHA a_DHA = H.angle(A, D, deg=True) if (not self.external_proxies): if (a_DHA < a_DHA_cutoff): continue # filter by a_YAH a_YAH = [] if (len(Y) > 0): for Y_ in Y: a_YAH_ = A.angle(Y_, H, deg=True) a_YAH.append(a_YAH_) if (not self.external_proxies): flags = [] for a_YAH_ in a_YAH: flags.append(not (a_YAH_ >= a_YAH_cutoff[0] and a_YAH_ <= a_YAH_cutoff[1])) flags = list(set(flags)) if (len(flags) > 1 or (len(flags) == 1 and flags[0])): continue # assert approx_equal(d_HA, H.distance(A), 1.e-3) #a_YAD = [] #if(len(Y)>0): # for Y_ in Y: # a_YAD_ = A.angle(Y_, D, deg=True) # a_YAD.append(a_YAD_) self.result.append( group_args( i=i, j=j, atom_H=atom_H, atom_A=atom_A, atom_D=atom_D, symop=rt_mx_ji, d_HA=d_HA, a_DHA=a_DHA, a_YAH=a_YAH, #a_YAD = a_YAD, d_AD=A.distance(D))) if (not self.external_proxies): proxy_custom = group_args(i_seq=i, j_seq=j, rt_mx_ji=rt_mx_ji, atom_H=atom_H, atom_A=atom_A) self.pair_proxies.append(proxy_custom) # if (write_eff_file): self.as_restraints()
def stats(model, prefix, no_ticks=True): # Get rid of H, multi-model, no-protein and single-atom residue models if (model.percent_of_single_atom_residues() > 20): return None sel = model.selection(string="protein") if (sel.count(True) == 0): return None ssr = "protein and not (element H or element D or resname UNX or resname UNK or resname UNL)" sel = model.selection(string=ssr) model = model.select(sel) if (len(model.get_hierarchy().models()) > 1): return None # Add H; this looses CRYST1 ! rr = run_reduce_with_timeout( stdin_lines=model.get_hierarchy().as_pdb_string().splitlines(), file_name=None, parameters="-oh -his -flip -keep -allalt -pen9999 -", override_auto_timeout_with=None) # Create model; this is a single-model pure protein with new H added pdb_inp = iotbx.pdb.input(source_info=None, lines=rr.stdout_lines) model = mmtbx.model.manager(model_input=None, build_grm=True, pdb_hierarchy=pdb_inp.construct_hierarchy(), process_input=True, log=null_out()) box = uctbx.non_crystallographic_unit_cell_with_the_sites_in_its_center( sites_cart=model.get_sites_cart(), buffer_layer=5) model.set_sites_cart(box.sites_cart) model._crystal_symmetry = box.crystal_symmetry() # N = 10 # import cctbx.geometry_restraints.process_nonbonded_proxies as pnp h_bond_params = pnp.h_bond() h_bond_params.a_DHA_cutoff = 90 # SS = get_ss_selections(hierarchy=model.get_hierarchy()) HB_all = find(model=model.select(flex.bool(model.size(), True)), h_bond_params=h_bond_params).get_params_as_arrays( replace_with_empty_threshold=N) HB_alpha = find(model=model.select(SS.both.h_sel), h_bond_params=h_bond_params).get_params_as_arrays( replace_with_empty_threshold=N) HB_beta = find(model=model.select(SS.both.s_sel), h_bond_params=h_bond_params).get_params_as_arrays( replace_with_empty_threshold=N) print(HB_all.d_HA.size()) result_dict = {} result_dict["all"] = HB_all result_dict["alpha"] = HB_alpha result_dict["beta"] = HB_beta # result_dict["loop"] = get_selected(sel=loop_sel) # Load histograms for reference high-resolution d_HA and a_DHA pkl_fn = libtbx.env.find_in_repositories( relative_path="mmtbx") + "/nci/d_HA_and_a_DHA_high_res.pkl" assert os.path.isfile(pkl_fn) ref = easy_pickle.load(pkl_fn) # import matplotlib as mpl mpl.use('Agg') import matplotlib.pyplot as plt fig = plt.figure(figsize=(10, 10)) kwargs = dict(histtype='bar', bins=20, range=[1.6, 3.0], alpha=.8) for j, it in enumerate([["alpha", 1], ["beta", 3], ["all", 5]]): key, i = it ax = plt.subplot(int("32%d" % i)) if (no_ticks): #ax.set_xticks([]) ax.set_yticks([]) if (j in [0, 1]): ax.tick_params(bottom=False) ax.set_xticklabels([]) ax.tick_params(axis="x", labelsize=12) ax.tick_params(axis="y", labelsize=12, left=False, pad=-2) ax.text(0.98, 0.92, key, size=12, horizontalalignment='right', transform=ax.transAxes) HB = result_dict[key] if HB is None: continue w1 = np.ones_like(HB.d_HA) / HB.d_HA.size() ax.hist(HB.d_HA, color="orangered", weights=w1, rwidth=0.3, **kwargs) # start, end1, end2 = 0, max(ref.distances[key].vals), \ round(max(ref.distances[key].vals),2) if (not no_ticks): plt.yticks([0.01, end1], ["0", end2], visible=True, rotation="horizontal") if (key == "alpha"): plt.ylim(0, end2 + 0.02) elif (key == "beta"): plt.ylim(0, end2 + 0.02) elif (key == "all"): plt.ylim(0, end2 + 0.02) else: assert 0 # if (j == 0): ax.set_title("Distance", size=15) bins = list(flex.double(ref.distances[key].bins)) ax.bar(bins, ref.distances[key].vals, alpha=.3, width=0.07) # kwargs = dict(histtype='bar', bins=20, range=[90, 180], alpha=.8) for j, it in enumerate([["alpha", 2], ["beta", 4], ["all", 6]]): key, i = it ax = plt.subplot(int("32%d" % i)) if (j in [0, 1]): ax.tick_params(bottom=False) ax.set_xticklabels([]) if (no_ticks): #ax.set_xticks([]) ax.set_yticks([]) ax.tick_params(axis="x", labelsize=12) ax.tick_params(axis="y", labelsize=12, left=False, pad=-2) ax.text(0.98, 0.92, key, size=12, horizontalalignment='right', transform=ax.transAxes) ax.text(0.98, 0.92, key, size=12, horizontalalignment='right', transform=ax.transAxes) #if(j in [0,1]): ax.plot_params(bottom=False) HB = result_dict[key] if HB is None: continue w1 = np.ones_like(HB.a_DHA) / HB.a_DHA.size() ax.hist(HB.a_DHA, color="orangered", weights=w1, rwidth=0.3, **kwargs) # start, end1, end2 = 0, max(ref.angles[key].vals), \ round(max(ref.angles[key].vals),2) if (not no_ticks): plt.yticks([0.01, end1], ["0", end2], visible=True, rotation="horizontal") if (key == "alpha"): plt.ylim(0, end2 + 0.02) elif (key == "beta"): plt.ylim(0, end2 + 0.02) elif (key == "all"): plt.ylim(0, end2 + 0.02) else: assert 0 # if (j == 0): ax.set_title("Angle", size=15) ax.bar(ref.angles[key].bins, ref.angles[key].vals, width=4.5, alpha=.3) plt.subplots_adjust(wspace=0.12, hspace=0.025) if (no_ticks): plt.subplots_adjust(wspace=0.025, hspace=0.025) #fig.savefig("%s.png"%prefix, dpi=1000) fig.savefig("%s.pdf" % prefix)