def exercise3(pdb_str, type_list_known): pdb_inp = iotbx.pdb.input(lines=pdb_str.split("\n"), source_info=None) model = mmtbx.model.manager( model_input = pdb_inp, build_grm = True) pdb_hierarchy = model.get_hierarchy() sites_cart = model.get_sites_cart() atoms = pdb_hierarchy.atoms() model.setup_riding_h_manager() riding_h_manager = model.get_riding_h_manager() h_para = riding_h_manager.h_parameterization diagnostics = riding_h_manager.diagnostics( sites_cart = sites_cart, threshold = 0.05) h_distances = diagnostics.h_distances type_list = diagnostics.type_list number_h = model.get_hd_selection().count(True) number_h_para = len(h_para) - h_para.count(None) assert (number_h_para == number_h-2), 'Not all H atoms are parameterized' for ih in h_distances: labels = atoms[ih].fetch_labels() assert (h_distances[ih] < 0.2), \ 'distance too large: %s atom: %s (%s) residue: %s ' \ % (h_para[ih].htype, atoms[ih].name, ih, labels.resseq.strip()) for type1, type2 in zip(type_list, type_list_known): assert (type1 == type2)
def test_1_5_overlaps(): ''' Test if 1_5 overlaps are correctly identified ''' model = obtain_model(raw_records_0) hd_sel = model.get_hd_selection() grm = model.get_restraints_manager().geometry full_connectivity_table = grm.shell_sym_tables[0].full_simple_connectivity() outstring = '1-5 Interaction test error. {}' # check that direction of function calling does not matter tst = pnp.check_if_1_5_interaction(21, 33,hd_sel,full_connectivity_table) msg = 'Test results depend on atoms order' assert(tst), msg tst = pnp.check_if_1_5_interaction(33, 21,hd_sel,full_connectivity_table) assert(tst), msg # check 1-4 interaction tst = pnp.check_if_1_5_interaction(33, 20,hd_sel,full_connectivity_table) msg = 'Test fails on 1-4 interaction' assert(not tst), msg # check 1-6 interaction tst = pnp.check_if_1_5_interaction(33, 38,hd_sel,full_connectivity_table) msg = 'Test fails on 1-6 interaction' assert(not tst), msg # 1-5 interaction of atoms other than hydrogen tst = pnp.check_if_1_5_interaction(38, 25,hd_sel,full_connectivity_table) msg = 'Test fails on 1-5 non hydrogen interaction' assert(not tst), msg # 1-5 interaction of two hydrogens tst = pnp.check_if_1_5_interaction(33, 31,hd_sel,full_connectivity_table) msg = 'Test fails on 1-5 two hydrogen interaction' assert(not tst), msg
def exercise1(pdb_str, cif_str): model = prepare_inputs(pdb_str, cif_str) riding_h_manager = model.get_riding_h_manager() atoms = model.get_hierarchy().atoms() h_para = riding_h_manager.h_parameterization diagnostics = riding_h_manager.diagnostics( sites_cart=model.get_sites_cart(), threshold=0.05) h_distances = diagnostics.h_distances type_list = diagnostics.type_list # number of H atoms number_h = model.get_hd_selection().count(True) number_h_para = len(h_para) - h_para.count(None) assert (number_h_para == number_h), 'Not all H atoms are parameterized' for ih in h_distances: # One atom is expected to be moved if (ih == 16): continue labels = atoms[ih].fetch_labels() assert (h_distances[ih] < 0.1), \ 'distance too large: %s atom: %s (%s) residue: %s ' \ % (h_para[ih].htype, atoms[ih].name, ih, labels.resseq.strip()) for type1, type2 in zip(type_list, type_list_known1): assert (type1 == type2)
def exercise(pdb_str): pdb_inp = iotbx.pdb.input(lines=pdb_str.split("\n"), source_info=None) model = mmtbx.model.manager(model_input=pdb_inp, log=null_out()) model.process(make_restraints=True) pdb_hierarchy = model.get_hierarchy() sites_cart = model.get_sites_cart() atoms = pdb_hierarchy.atoms() model.setup_riding_h_manager() riding_h_manager = model.get_riding_h_manager() h_parameterization = riding_h_manager.h_parameterization diagnostics = riding_h_manager.diagnostics(sites_cart=sites_cart, threshold=0.05) diagnostics = riding_h_manager.diagnostics(sites_cart=sites_cart, threshold=0.05) h_distances = diagnostics.h_distances number_h = model.get_hd_selection().count(True) number_h_para = len(h_parameterization) - h_parameterization.count(None) # There are 90 H atoms in pdb_string, check if all of them are recognized assert (number_h_para == number_h), 'Not all H atoms are parameterized' for ih in h_distances: labels = atoms[ih].fetch_labels() assert (h_distances[ih] < 0.01), \ 'distance too large: %s atom: %s (%s) residue: %s ' \ % (h_parameterization[ih].htype, atoms[ih].name, ih, labels.resseq.strip())
def exercise(pdb_str): params = mmtbx.model.manager.get_default_pdb_interpretation_params() params.pdb_interpretation.use_neutron_distances = True pdb_inp = iotbx.pdb.input(lines=pdb_str.split("\n"), source_info=None) model = mmtbx.model.manager(model_input=pdb_inp, log=null_out()) model.process(pdb_interpretation_params=params, make_restraints=True) pdb_hierarchy = model.get_hierarchy() sites_cart = model.get_sites_cart() atoms = pdb_hierarchy.atoms() model.setup_riding_h_manager() riding_h_manager = model.get_riding_h_manager() h_parameterization = riding_h_manager.h_parameterization diagnostics = riding_h_manager.diagnostics(sites_cart=sites_cart, threshold=0.05) h_distances = diagnostics.h_distances number_h = model.get_hd_selection().count(True) number_h_para = len(h_parameterization) - h_parameterization.count(None) if (pdb_str != pdb_str_02): assert (number_h_para == number_h), 'Not all H atoms are parameterized' # For each H atom, check if distance between computed H and that in input model is # not too large for ih in h_distances: labels = atoms[ih].fetch_labels() assert (h_distances[ih] < 0.1), \ 'distance too large: %s atom: %s (%s) residue: %s ' \ % (h_parameterization[ih].htype, atoms[ih].name, ih, labels.resseq.strip())
def exercise(pdb_str, use_ideal_bonds_angles): # -------------------------------------------------------------- # code to switch off CDL # -------------------------------------------------------------- #params_line = grand_master_phil_str #params = iotbx.phil.parse( # input_string=params_line, process_includes=True).extract() #params.pdb_interpretation.restraints_library.cdl=False # --------------------------------------------------------------- pdb_inp = iotbx.pdb.input(lines=pdb_str.split("\n"), source_info=None) model = mmtbx.model.manager(model_input=pdb_inp, log=null_out(), build_grm=True) pdb_hierarchy = model.get_hierarchy() geometry_restraints = model.get_restraints_manager().geometry xray_structure = model.get_xray_structure() sites_cart = model.get_sites_cart() grf = cctbx.geometry_restraints.flags.flags(default=True) minimized = mmtbx.refinement.geometry_minimization.lbfgs( sites_cart=sites_cart, correct_special_position_tolerance=1.0, geometry_restraints_manager=geometry_restraints, geometry_restraints_flags=grf, lbfgs_termination_params=scitbx.lbfgs.termination_parameters( max_iterations=500)) xray_structure.set_sites_cart(sites_cart) pdb_hierarchy.adopt_xray_structure(xray_structure) atoms = pdb_hierarchy.atoms() sites_cart = xray_structure.sites_cart() riding_h_manager = riding.manager( pdb_hierarchy=pdb_hierarchy, geometry_restraints=geometry_restraints, use_ideal_bonds_angles=use_ideal_bonds_angles) h_parameterization = riding_h_manager.h_parameterization diagnostics = riding_h_manager.diagnostics(sites_cart=sites_cart, threshold=0.05) h_distances = diagnostics.h_distances number_h = model.get_hd_selection().count(True) number_h_para = len(h_parameterization) - h_parameterization.count(None) assert (number_h_para == number_h), 'Not all H atoms are parameterized' for ih in h_distances: labels = atoms[ih].fetch_labels() if use_ideal_bonds_angles: assert (h_distances[ih] < 0.03), \ 'distance too large: %s atom: %s (%s) residue: %s ' \ % (h_parameterization[ih].htype, atoms[ih].name, ih, labels.resseq.strip()) else: assert (h_distances[ih] < 1e-7), \ 'distance too large: %s atom: %s (%s) residue: %s distance %s' \ % (h_parameterization[ih].htype, atoms[ih].name, ih, labels.resseq.strip(), h_distances[ih])
def exercise3(pdb_str, type_list_known): pdb_inp = iotbx.pdb.input(lines=pdb_str.split("\n"), source_info=None) params = mmtbx.model.manager.get_default_pdb_interpretation_scope( ).extract() params.pdb_interpretation.allow_polymer_cross_special_position = True model = mmtbx.model.manager(model_input=pdb_inp, log=null_out()) model.process(pdb_interpretation_params=params, make_restraints=True) pdb_hierarchy = model.get_hierarchy() sites_cart = model.get_sites_cart() atoms = pdb_hierarchy.atoms() model.setup_riding_h_manager() riding_h_manager = model.get_riding_h_manager() h_para = riding_h_manager.h_parameterization diagnostics = riding_h_manager.diagnostics(sites_cart=sites_cart, threshold=0.05) h_distances = diagnostics.h_distances type_list = diagnostics.type_list number_h = model.get_hd_selection().count(True) number_h_para = len(h_para) - h_para.count(None) assert (number_h_para == number_h - 2), 'Not all H atoms are parameterized' for ih in h_distances: labels = atoms[ih].fetch_labels() assert (h_distances[ih] < 0.2), \ 'distance too large: %s atom: %s (%s) residue: %s ' \ % (h_para[ih].htype, atoms[ih].name, ih, labels.resseq.strip()) for type1, type2 in zip(type_list, type_list_known): assert (type1 == type2)
def exercise2(): pdb_inp = iotbx.pdb.input(lines=pdb_str.split("\n"), source_info=None) model = mmtbx.model.manager( model_input = pdb_inp, log = null_out()) model.process(make_restraints=True) pdb_hierarchy = model.get_hierarchy() #sites_cart = model.get_sites_cart() #atoms = pdb_hierarchy.atoms() model.setup_riding_h_manager() riding_h_manager = model.get_riding_h_manager() h_parameterization = riding_h_manager.h_parameterization number_h = model.get_hd_selection().count(True) number_h_para = len(h_parameterization) - h_parameterization.count(None) # Check that all H atoms are parameterized in original manager assert (number_h_para == number_h - 1), 'Not all H atoms are parameterized' # Test several selections and compare with known answers # print('selection1 = not (name CE1 or name CB)') selection1 = pdb_hierarchy.atom_selection_cache().\ selection("not (name CE1 or name CB)") answers1 = group_args( entries_selected_h_para = 19, entries_cpp_selected = 2, h_in_selected_hierarchy = 9) apply_selection( riding_h_manager = riding_h_manager, selection = selection1, answers = answers1) # print('selection2 = not (name CD1 or name HD2 or name C)') selection2 = pdb_hierarchy.atom_selection_cache().\ selection("not (name CD1 or name HD2 or name C)") answers2 = group_args( entries_selected_h_para = 18, entries_cpp_selected = 4, h_in_selected_hierarchy = 8) apply_selection( riding_h_manager = riding_h_manager, selection = selection2, answers = answers2) # print('selection3 = not (name N or name HB2 or name CE2)') selection3 = pdb_hierarchy.atom_selection_cache().\ selection("not (name N or name HB2 or name CE2)") answers3 = group_args( entries_selected_h_para = 18, entries_cpp_selected = 4, h_in_selected_hierarchy = 8) apply_selection( riding_h_manager = riding_h_manager, selection = selection3, answers = answers3)
def setup_riding(model): model.setup_riding_h_manager(ignore_h_with_dof=True) riding_h_manager = model.get_riding_h_manager() h_para = riding_h_manager.h_parameterization sel_h = model.get_hd_selection() sel_h_in_para = flex.bool( [bool(x) for x in riding_h_manager.h_parameterization]) sel_h_not_in_para = sel_h_in_para.exclusive_or(sel_h) return (list(sel_h_not_in_para.iselection()))
def exercise_01(verbose): if (verbose): log = sys.stdout else: log = StringIO() pdb_file = libtbx.env.find_in_repositories( relative_path="phenix_regression/pdb/ala_hd.pdb", test=os.path.isfile) model = get_model(pdb_file, log) model.de_deuterate() assert (len(model.hd_group_selections()) == 0) ph = model.get_hierarchy() atoms = ph.atoms() assert (atoms.extract_element().count('D') == 0) assert (model.get_hd_selection().count(True) == 7)
def exercise_04(verbose): if (verbose): log = sys.stdout else: log = StringIO() model = get_model(file_name=None, log=log, pdb_str=pdb_str_1) model.de_deuterate() assert (len(model.hd_group_selections()) == 0) ph = model.get_hierarchy() atoms = ph.atoms() assert (atoms.extract_element().count('D') == 0) assert (model.get_hd_selection().count(True) == 15) atom_names = [x.strip() for x in atoms.extract_name()] assert ('D' not in atom_names) assert ('DG' not in atom_names)
def compare_XH_bond_length_to_ideal(model): geometry = model.get_restraints_manager().geometry atoms = model.get_hierarchy().atoms() sites_cart = model.get_sites_cart() bond_proxies_simple, asu = \ geometry.get_all_bond_proxies(sites_cart = sites_cart) hd_selection = model.get_hd_selection() for bp in bond_proxies_simple: i, j = bp.i_seqs if hd_selection[i] or hd_selection[j]: assert approx_equal(atoms[i].distance(atoms[j]), bp.distance_ideal, eps=0.001)
def exercise_05(verbose): if (verbose): log = sys.stdout else: log = StringIO() model = get_model(file_name=None, log=log, pdb_str=pdb_str_2) #model.get_hierarchy().write_pdb_file(file_name="haha.pdb") model.de_deuterate() assert (len(model.hd_group_selections()) == 0) ph = model.get_hierarchy() atoms = ph.atoms() assert (atoms.extract_element().count('D') == 0) #print(model.get_hd_selection().count(True)) assert (model.get_hd_selection().count(True) == 35) assert (model.selection('resname DOD').count(True) == 0)
def exercise1(): pdb_inp = iotbx.pdb.input(lines=pdb_str.split("\n"), source_info=None) model = mmtbx.model.manager( model_input = pdb_inp, log = null_out()) model.process(make_restraints=True) pdb_hierarchy = model.get_hierarchy() sites_cart = model.get_sites_cart() atoms = pdb_hierarchy.atoms() model.setup_riding_h_manager() riding_h_manager = model.get_riding_h_manager() h_parameterization = riding_h_manager.h_parameterization number_h = model.get_hd_selection().count(True) number_h_para = len(h_parameterization) - h_parameterization.count(None) assert (number_h_para == number_h-1), 'Not all H atoms are parameterized' rc = h_parameterization[20] new_manager = riding_h_manager.deep_copy() new_h_parameterization = new_manager.h_parameterization rc_new = new_h_parameterization[20] assert (rc_new.htype == rc.htype) assert (rc_new.ih == rc.ih) assert (rc_new.a0 == rc.a0) assert (rc_new.a1 == rc.a1) assert (rc_new.a2 == rc.a2) assert (rc_new.a3 == rc.a3) assert (rc_new.a == rc.a) assert (rc_new.b == rc.b) assert (rc_new.h == rc.h) assert (rc_new.n == rc.n) assert (rc_new.disth == rc.disth) rc_new.htype = 'unk' rc_new.ih = 0 rc_new.a0 = 1 rc_new.a1 = 2 rc_new.a2 = 3 rc_new.a3 = 4 assert (rc_new.htype != rc.htype) assert (rc_new.ih != rc.ih) assert (rc_new.a0 != rc.a0) assert (rc_new.a1 != rc.a1) assert (rc_new.a2 != rc.a2) assert (rc_new.a3 != rc.a3)
def exercise2(pdb_str, cif_str): model = prepare_inputs(pdb_str, cif_str) riding_h_manager = model.get_riding_h_manager() atoms = model.get_hierarchy().atoms() h_para = riding_h_manager.h_parameterization diagnostics = riding_h_manager.diagnostics( sites_cart=model.get_sites_cart(), threshold=0.05) h_distances = diagnostics.h_distances type_list = diagnostics.type_list # number of H atoms number_h = model.get_hd_selection().count(True) number_h_para = len(h_para) - h_para.count(None) assert (number_h_para == 0), 'Not all H atoms are parameterized'
def exercise(): pdb_inp = iotbx.pdb.input(lines=pdb_str.split("\n"), source_info=None) model = mmtbx.model.manager( model_input = pdb_inp, build_grm = True) pdb_hierarchy = model.get_hierarchy() sites_cart = model.get_sites_cart() atoms = pdb_hierarchy.atoms() model.setup_riding_h_manager() riding_h_manager = model.get_riding_h_manager() h_parameterization = riding_h_manager.h_parameterization diagnostics = riding_h_manager.diagnostics( sites_cart = sites_cart, threshold = 0.05) h_distances = diagnostics.h_distances type_list = diagnostics.type_list # number of H atoms in model number_h = model.get_hd_selection().count(True) # number of H in parameterization number_h_para = len(h_parameterization) - h_parameterization.count(None) # There are 152 H atoms in pdb_string, check if all of them are parameterized assert (number_h_para == number_h), 'Not all H atoms are parameterized' # For each H atom, check if distance compared to input model is not > 0.05 # 0.0014 = uncertainty for distance if uncertainty of coordinate = 0.001 for ih in h_distances: labels = atoms[ih].fetch_labels() assert (h_distances[ih] < 0.05), \ 'distance too large: %s atom: %s (%s) residue: %s ' \ % (h_parameterization[ih].htype, atoms[ih].name, ih, labels.resseq.strip()) # KEEP: useful for debugging #for ih in h_parameterization.keys(): # hp = h_parameterization[ih] # print "'"+hp.htype+"'"+',', for type1, type2 in zip(type_list, type_list_known): assert (type1 == type2)
def exercise(): pdb_inp = iotbx.pdb.input(lines=pdb_str.split("\n"), source_info=None) cif_object = iotbx.cif.reader(input_string=cif_str).model() # bla.cif does not exist, but cif_objects needs a filename in first position # of the tuple cif_objects = [('bla.cif', cif_object)] model = mmtbx.model.manager(model_input=pdb_inp, build_grm=True, restraint_objects=cif_objects) pdb_hierarchy = model.get_hierarchy() sites_cart = model.get_sites_cart() atoms = pdb_hierarchy.atoms() model.setup_riding_h_manager() riding_h_manager = model.get_riding_h_manager() h_para = riding_h_manager.h_parameterization diagnostics = riding_h_manager.diagnostics(sites_cart=sites_cart, threshold=0.05) h_distances = diagnostics.h_distances type_list = diagnostics.type_list # number of H atoms number_h = model.get_hd_selection().count(True) number_h_para = len(h_para) - h_para.count(None) assert (number_h_para == number_h), 'Not all H atoms are parameterized' for ih in h_distances: # One atom is expected to be moved if (ih == 16): continue labels = atoms[ih].fetch_labels() assert (h_distances[ih] < 0.1), \ 'distance too large: %s atom: %s (%s) residue: %s ' \ % (h_para[ih].htype, atoms[ih].name, ih, labels.resseq.strip()) for type1, type2 in zip(type_list, type_list_known): assert (type1 == type2)
def exercise(): pdb_inp = iotbx.pdb.input(lines=pdb_str.split("\n"), source_info=None) model = mmtbx.model.manager( model_input = pdb_inp, build_grm = True, log = null_out()) pdb_hierarchy = model.get_hierarchy() sites_cart = model.get_sites_cart() atoms = pdb_hierarchy.atoms() model.setup_riding_h_manager() riding_h_manager = model.get_riding_h_manager() h_parameterization = riding_h_manager.h_parameterization diagnostics = riding_h_manager.diagnostics( sites_cart = sites_cart, threshold = 0.05) h_distances = diagnostics.h_distances type_list = diagnostics.type_list number_h = model.get_hd_selection().count(True) number_h_para = len(h_parameterization) - h_parameterization.count(None) # There are 90 H atoms in pdb_string, check if all of them are recognized assert (number_h_para == number_h), 'Not all H atoms are parameterized' # For every H , check if distance between computed H and H in input model is # < 0.03 A for ih in h_distances: labels = atoms[ih].fetch_labels() assert (h_distances[ih] < 0.03), 'distance too large: %s atom: %s (%s) residue: %s ' \ % (h_parameterization[ih].htype, atoms[ih].name, ih, labels.resseq.strip()) # Check if parameterization types are correct for type1, type2 in zip(type_list, type_list_known): assert (type1 == type2)
def exercise1(): pdb_str = """ CRYST1 21.850 24.325 24.603 90.00 90.00 90.00 P 1 SCALE1 0.045767 0.000000 0.000000 0.00000 SCALE2 0.000000 0.041110 0.000000 0.00000 SCALE3 0.000000 0.000000 0.040645 0.00000 ATOM 1 N CYS D 37 8.132 18.794 15.343 1.00143.27 D N ANISOU 1 N CYS D 37 26762 17628 10046 -3652 3033 538 D N ATOM 2 CA CYS D 37 9.229 18.179 14.592 1.00143.16 D C ANISOU 2 CA CYS D 37 26739 17512 10144 -3661 2916 574 D C ATOM 3 C CYS D 37 10.551 18.924 14.744 1.00143.18 D C ANISOU 3 C CYS D 37 26760 17474 10166 -3627 2815 455 D C ATOM 4 O CYS D 37 11.615 18.295 14.696 1.00141.47 D O ANISOU 4 O CYS D 37 26571 17211 9972 -3636 2700 489 D O ATOM 5 CB CYS D 37 8.857 18.048 13.112 1.00144.61 D C ANISOU 5 CB CYS D 37 26841 17595 10509 -3672 2948 608 D C ATOM 6 SG CYS D 37 7.159 17.517 12.843 1.00142.64 D S ANISOU 6 SG CYS D 37 26553 17390 10253 -3704 3086 716 D S ATOM 7 H CYS D 37 7.635 19.325 14.885 1.00172.08 D H ATOM 8 HA CYS D 37 9.365 17.282 14.934 1.00171.95 D H ATOM 9 HB2 CYS D 37 8.970 18.910 12.683 1.00173.69 D H ATOM 10 HB3 CYS D 37 9.442 17.394 12.699 1.00173.69 D H ATOM 11 N CYS D 40 13.775 17.698 16.644 1.00154.41 D N ANISOU 11 N CYS D 40 28359 18912 11399 -3629 2475 474 D N ATOM 12 CA CYS D 40 14.636 16.639 16.128 1.00149.28 D C ANISOU 12 CA CYS D 40 27712 18183 10825 -3653 2369 564 D C ATOM 13 C CYS D 40 15.084 16.830 14.685 1.00148.00 D C ANISOU 13 C CYS D 40 27476 17888 10868 -3647 2342 540 D C ATOM 14 O CYS D 40 16.158 16.339 14.335 1.00149.38 D O ANISOU 14 O CYS D 40 27657 17989 11113 -3652 2233 563 D O ATOM 15 CB CYS D 40 13.921 15.279 16.208 1.00140.80 D C ANISOU 15 CB CYS D 40 26653 17143 9703 -3698 2398 729 D C ATOM 16 SG CYS D 40 13.262 14.779 17.830 1.00136.64 D S ANISOU 16 SG CYS D 40 26211 16771 8936 -3714 2439 794 D S ATOM 17 H CYS D 40 13.032 17.777 16.218 1.00185.45 D H ATOM 18 HA CYS D 40 15.432 16.588 16.680 1.00179.29 D H ATOM 19 HB2 CYS D 40 13.174 15.295 15.590 1.00169.12 D H ATOM 20 HB3 CYS D 40 14.548 14.592 15.932 1.00169.12 D H HETATM 21 NB HEC D1001 9.421 13.220 11.858 1.00140.59 N ANISOU 21 NB HEC D1001 26354 16953 10112 -3810 2765 1093 N HETATM 22 ND HEC D1001 12.886 11.034 12.753 1.00144.24 N ANISOU 22 ND HEC D1001 26954 17334 10517 -3839 2396 1214 N HETATM 23 C1A HEC D1001 12.227 10.592 9.833 1.00139.00 C ANISOU 23 C1A HEC D1001 26141 16470 10203 -3864 2452 1283 C HETATM 24 C1B HEC D1001 8.860 13.248 10.595 1.00143.63 C ANISOU 24 C1B HEC D1001 26666 17264 10645 -3817 2816 1110 C HETATM 25 C1C HEC D1001 10.125 13.804 14.697 1.00139.27 C ANISOU 25 C1C HEC D1001 26337 16981 9599 -3780 2714 1003 C HETATM 26 C1D HEC D1001 13.435 10.960 14.028 1.00134.69 C ANISOU 26 C1D HEC D1001 25819 16201 9156 -3833 2339 1204 C HETATM 27 C2A HEC D1001 11.928 10.386 8.429 1.00142.28 C ANISOU 27 C2A HEC D1001 26487 16789 10784 -3875 2476 1314 C HETATM 28 C2B HEC D1001 7.789 14.214 10.617 1.00141.94 C ANISOU 28 C2B HEC D1001 26417 17097 10418 -3798 2937 1044 C HETATM 29 C2C HEC D1001 10.451 14.023 16.100 1.00140.94 C ANISOU 29 C2C HEC D1001 26625 17289 9635 -3766 2687 965 C HETATM 30 C2D HEC D1001 14.546 10.022 13.991 1.00142.48 C ANISOU 30 C2D HEC D1001 26834 17133 10168 -3850 2214 1270 C HETATM 31 C3A HEC D1001 10.804 11.059 8.149 1.00136.41 C ANISOU 31 C3A HEC D1001 25701 16075 10056 -3866 2591 1279 C HETATM 32 C3B HEC D1001 7.744 14.781 11.826 1.00143.82 C ANISOU 32 C3B HEC D1001 26706 17431 10509 -3780 2957 983 C HETATM 33 C3C HEC D1001 11.528 13.271 16.400 1.00137.87 C ANISOU 33 C3C HEC D1001 26282 16879 9224 -3777 2567 1011 C HETATM 34 C3D HEC D1001 14.632 9.534 12.538 1.00144.35 C ANISOU 34 C3D HEC D1001 27005 17250 10590 -3867 2201 1319 C HETATM 35 C4A HEC D1001 10.358 11.714 9.366 1.00144.69 C ANISOU 35 C4A HEC D1001 26789 17236 10949 -3849 2645 1224 C HETATM 36 C4B HEC D1001 8.768 14.145 12.649 1.00137.78 C ANISOU 36 C4B HEC D1001 26012 16687 9651 -3787 2848 1015 C HETATM 37 C4C HEC D1001 11.920 12.537 15.214 1.00134.63 C ANISOU 37 C4C HEC D1001 25826 16356 8971 -3798 2515 1081 C HETATM 38 C4D HEC D1001 13.570 10.218 11.849 1.00138.72 C ANISOU 38 C4D HEC D1001 26232 16533 9944 -3858 2317 1280 C HETATM 39 CAA HEC D1001 12.769 9.532 7.451 1.00132.04 C ANISOU 39 CAA HEC D1001 25171 15378 9621 -3893 2385 1376 C HETATM 40 CAB HEC D1001 6.719 15.866 12.240 1.00138.71 C ANISOU 40 CAB HEC D1001 26042 16858 9803 -3757 3079 901 C HETATM 41 CAC HEC D1001 12.297 13.190 17.738 1.00135.76 C ANISOU 41 CAC HEC D1001 26101 16686 8794 -3768 2488 993 C HETATM 42 CAD HEC D1001 15.637 8.535 11.925 1.00138.75 C ANISOU 42 CAD HEC D1001 26295 16445 9980 -3888 2089 1394 C HETATM 43 CBA HEC D1001 11.998 8.251 7.139 1.00132.66 C ANISOU 43 CBA HEC D1001 25237 15456 9711 -3938 2416 1524 C HETATM 44 CBB HEC D1001 5.650 15.212 13.142 1.00135.28 C ANISOU 44 CBB HEC D1001 25642 16531 9227 -3784 3158 997 C HETATM 45 CBC HEC D1001 11.427 12.956 18.987 1.00146.99 C ANISOU 45 CBC HEC D1001 27580 18242 10026 -3778 2561 1040 C HETATM 46 CBD HEC D1001 14.919 7.222 11.642 1.00139.54 C ANISOU 46 CBD HEC D1001 26386 16545 10089 -3933 2120 1549 C HETATM 47 CGA HEC D1001 12.527 7.624 5.875 1.00128.84 C ANISOU 47 CGA HEC D1001 24714 14851 9389 -3953 2359 1570 C HETATM 48 CGD HEC D1001 15.891 6.207 11.098 1.00141.03 C ANISOU 48 CGD HEC D1001 26575 16642 10368 -3955 2011 1625 C HETATM 49 CHA HEC D1001 13.299 10.063 10.513 1.00146.02 C ANISOU 49 CHA HEC D1001 27088 17363 11029 -3868 2342 1305 C HETATM 50 CHB HEC D1001 9.227 12.490 9.500 1.00144.37 C ANISOU 50 CHB HEC D1001 26723 17255 10876 -3837 2764 1179 C HETATM 51 CHC HEC D1001 9.083 14.384 13.975 1.00144.74 C ANISOU 51 CHC HEC D1001 26964 17660 10370 -3774 2826 976 C HETATM 52 CHD HEC D1001 12.978 11.644 15.133 1.00137.25 C ANISOU 52 CHD HEC D1001 26183 16634 9330 -3815 2394 1143 C HETATM 53 CMA HEC D1001 10.090 11.136 6.782 1.00134.85 C ANISOU 53 CMA HEC D1001 25424 15802 10009 -3872 2656 1294 C HETATM 54 CMB HEC D1001 6.909 14.580 9.402 1.00138.00 C ANISOU 54 CMB HEC D1001 25835 16541 10059 -3798 3022 1038 C HETATM 55 CMC HEC D1001 9.714 15.017 17.030 1.00140.17 C ANISOU 55 CMC HEC D1001 26549 17298 9410 -3741 2781 878 C HETATM 56 CMD HEC D1001 15.472 9.587 15.143 1.00143.64 C ANISOU 56 CMD HEC D1001 27061 17330 10186 -3851 2112 1287 C HETATM 57 NA HEC D1001 11.246 11.403 10.381 1.00142.02 N ANISOU 57 NA HEC D1001 26521 16938 10501 -3848 2558 1228 N HETATM 58 NC HEC D1001 11.031 12.874 14.214 1.00135.40 N ANISOU 58 NC HEC D1001 25852 16413 9183 -3799 2607 1074 N HETATM 59 O1A HEC D1001 13.768 7.499 5.723 1.00127.91 O ANISOU 59 O1A HEC D1001 24612 14669 9319 -3944 2254 1548 O HETATM 60 O1D HEC D1001 15.705 5.000 11.405 1.00143.73 O ANISOU 60 O1D HEC D1001 26943 17007 10662 -3991 1995 1754 O HETATM 61 O2A HEC D1001 11.708 7.243 5.000 1.00126.20 O ANISOU 61 O2A HEC D1001 24330 14482 9138 -3973 2418 1629 O HETATM 62 O2D HEC D1001 16.850 6.595 10.375 1.00138.38 O ANISOU 62 O2D HEC D1001 26214 16212 10153 -3936 1943 1558 O HETATM 63 FE HEC D1001 11.115 12.157 12.415 1.00158.39 Fe ANISOU 63 FE HEC D1001 28683 19178 12321 -3824 2585 1151 Fe HETATM 64 HAB HEC D1001 6.266 16.109 11.430 1.00166.61 H HETATM 65 HAC HEC D1001 13.016 12.556 17.688 1.00163.06 H HETATM 66 HHA HEC D1001 13.931 9.523 9.993 1.00175.38 H HETATM 67 HHB HEC D1001 8.617 12.507 8.733 1.00173.40 H HETATM 68 HHC HEC D1001 8.518 15.025 14.454 1.00173.84 H HETATM 69 HHD HEC D1001 13.462 11.479 15.969 1.00164.85 H HETATM 70 HAA1 HEC D1001 13.619 9.309 7.860 1.00158.61 H HETATM 71 HAA2 HEC D1001 12.922 10.028 6.632 1.00158.61 H HETATM 72 HAD1 HEC D1001 16.364 8.380 12.549 1.00166.66 H HETATM 73 HAD2 HEC D1001 15.991 8.897 11.097 1.00166.66 H HETATM 74 HBA1 HEC D1001 11.058 8.462 7.024 1.00159.35 H HETATM 75 HBA2 HEC D1001 12.100 7.627 7.874 1.00159.35 H HETATM 76 HBB1 HEC D1001 5.203 14.504 12.651 1.00162.49 H HETATM 77 HBB2 HEC D1001 5.000 15.880 13.409 1.00162.49 H HETATM 78 HBB3 HEC D1001 6.076 14.841 13.930 1.00162.49 H HETATM 79 HBC1 HEC D1001 11.697 12.130 19.419 1.00176.54 H HETATM 80 HBC2 HEC D1001 10.495 12.894 18.725 1.00176.54 H HETATM 81 HBC3 HEC D1001 11.541 13.696 19.603 1.00176.54 H HETATM 82 HBD1 HEC D1001 14.216 7.374 10.991 1.00167.61 H HETATM 83 HBD2 HEC D1001 14.529 6.885 12.463 1.00167.61 H HETATM 84 HMA1 HEC D1001 9.181 10.779 6.867 1.00161.97 H HETATM 85 HMA2 HEC D1001 10.588 10.607 6.123 1.00161.97 H HETATM 86 HMA3 HEC D1001 10.048 12.069 6.487 1.00161.97 H HETATM 87 HMB1 HEC D1001 7.003 15.525 9.208 1.00165.76 H HETATM 88 HMB2 HEC D1001 5.981 14.382 9.604 1.00165.76 H HETATM 89 HMB3 HEC D1001 7.190 14.061 8.632 1.00165.76 H HETATM 90 HMC1 HEC D1001 9.327 14.535 17.777 1.00168.36 H HETATM 91 HMC2 HEC D1001 9.010 15.463 16.534 1.00168.36 H HETATM 92 HMC3 HEC D1001 10.343 15.677 17.362 1.00168.36 H HETATM 93 HMD1 HEC D1001 16.399 9.817 14.922 1.00172.53 H HETATM 94 HMD2 HEC D1001 15.399 8.618 15.274 1.00172.53 H HETATM 95 HMD3 HEC D1001 15.209 10.048 15.966 1.00172.53 H TER END """ edits = """ geometry_restraints.edits { bond { atom_selection_1 = chain D and resseq 40 and name SG atom_selection_2 = chain D and resseq 1001 and name CAC distance_ideal = 1.81 sigma = 0.05 } bond { atom_selection_1 = chain D and resseq 37 and name SG atom_selection_2 = chain D and resseq 1001 and name CAB distance_ideal = 1.81 sigma = 0.05 } angle { atom_selection_1 = chain D and resseq 40 and name SG atom_selection_2 = chain D and resseq 1001 and name CAC atom_selection_3 = chain D and resseq 1001 and name CBC angle_ideal = 109 sigma = 2 } angle { atom_selection_1 = chain D and resseq 40 and name SG atom_selection_2 = chain D and resseq 1001 and name CAC atom_selection_3 = chain D and resseq 1001 and name C3C angle_ideal = 109 sigma = 2 } angle { atom_selection_1 = chain D and resseq 37 and name SG atom_selection_2 = chain D and resseq 1001 and name CAB atom_selection_3 = chain D and resseq 1001 and name CBB angle_ideal = 109 sigma = 2 } angle { atom_selection_1 = chain D and resseq 1001 and name HAB atom_selection_2 = chain D and resseq 1001 and name CAB atom_selection_3 = chain D and resseq 37 and name SG angle_ideal = 109 sigma = 1.1 } angle { atom_selection_1 = chain D and resseq 1001 and name HAC atom_selection_2 = chain D and resseq 1001 and name CAC atom_selection_3 = chain D and resseq 40 and name SG angle_ideal = 109 sigma = 1.1 } } """ gm_phil = iotbx.phil.parse(input_string=grand_master_phil_str, process_includes=True) edits_phil = iotbx.phil.parse(edits) working_phil = gm_phil.fetch(edits_phil) params = working_phil.extract() # Make sure the angle edit is present assert (params.geometry_restraints.edits.angle[3].atom_selection_1 == \ "chain D and resseq 1001 and name HAB") pdb_inp = iotbx.pdb.input(lines=pdb_str.split("\n"), source_info=None) model = mmtbx.model.manager(model_input=pdb_inp, build_grm=True, pdb_interpretation_params=params) pdb_hierarchy = model.get_hierarchy() sites_cart = model.get_sites_cart() atoms = pdb_hierarchy.atoms() model.setup_riding_h_manager() riding_h_manager = model.get_riding_h_manager() h_para = riding_h_manager.h_parameterization diagnostics = riding_h_manager.diagnostics(sites_cart=sites_cart, threshold=0.05) h_distances = diagnostics.h_distances type_list = diagnostics.type_list number_h = model.get_hd_selection().count(True) number_h_para = len(h_para) - h_para.count(None) for rc in h_para: if rc: assert (rc.ih != 63), 'Wrong atom not recognized.' # Test if number of paramterized H atoms is correct assert (number_h == number_h_para + 1), 'Not all H atoms are parameterized' type_list_known = [ 'alg1b', '3neigbs', '2tetra', '2tetra', 'alg1b', '3neigbs', '2tetra', '2tetra', '3neigbs', 'flat_2neigbs', 'flat_2neigbs', 'flat_2neigbs', 'flat_2neigbs', '2tetra', '2tetra', '2tetra', '2tetra', '2tetra', '2tetra', 'prop', 'prop', 'prop', 'prop', 'prop', 'prop', '2tetra', '2tetra', 'prop', 'prop', 'prop', 'prop', 'prop', 'prop', 'prop', 'prop', 'prop', 'prop', 'prop', 'prop' ] for ih in h_distances: # One H atom is expected to be far (HAC) if (ih == 64): continue labels = atoms[ih].fetch_labels() if (h_distances[ih] > 0.1): assert (h_distances[ih] < 0.1), \ 'distance too large: %s atom: %s (%s) residue: %s ' \ % (h_para[ih].htype, atoms[ih].name, ih, labels.resseq.strip()) # for type1, type2 in zip(type_list, type_list_known): assert (type1 == type2)
def exercise2(): pdb_str = """ CRYST1 16.660 12.742 18.240 90.00 90.00 90.00 P 1 SCALE1 0.060024 0.000000 0.000000 0.00000 SCALE2 0.000000 0.078481 0.000000 0.00000 SCALE3 0.000000 0.000000 0.054825 0.00000 ATOM 1 N TYR A 7 9.837 5.000 6.625 1.00 15.00 N ATOM 2 CA TYR A 7 10.084 6.426 6.798 1.00 15.00 C ATOM 3 C TYR A 7 11.431 6.813 6.197 1.00 15.00 C ATOM 4 O TYR A 7 11.660 6.642 5.000 1.00 15.00 O ATOM 5 CB TYR A 7 10.042 6.803 8.281 1.00 15.00 C ATOM 6 CG TYR A 7 8.697 6.593 8.948 1.00 15.00 C ATOM 7 CD1 TYR A 7 7.540 6.413 8.198 1.00 15.00 C ATOM 8 CD2 TYR A 7 8.586 6.575 10.332 1.00 15.00 C ATOM 9 CE1 TYR A 7 6.315 6.222 8.807 1.00 15.00 C ATOM 10 CE2 TYR A 7 7.364 6.384 10.950 1.00 15.00 C ATOM 11 CZ TYR A 7 6.233 6.208 10.183 1.00 15.00 C ATOM 12 OH TYR A 7 5.015 6.018 10.794 1.00 15.00 O ATOM 13 HA TYR A 7 9.398 6.930 6.331 1.00 15.00 H ATOM 14 HB2 TYR A 7 10.693 6.264 8.757 1.00 15.00 H ATOM 15 HB3 TYR A 7 10.270 7.742 8.369 1.00 15.00 H ATOM 16 HD1 TYR A 7 7.589 6.422 7.269 1.00 15.00 H ATOM 17 HD2 TYR A 7 9.347 6.694 10.853 1.00 15.00 H ATOM 18 HE1 TYR A 7 5.550 6.103 8.292 1.00 15.00 H ATOM 19 HE2 TYR A 7 7.306 6.375 11.878 1.00 15.00 H ATOM 20 HH TYR A 7 5.000 6.415 11.534 1.00 15.00 H TER HETATM 21 O HOH B 1 5.307 7.545 13.240 1.00 30.00 O TER END """ edits = """ geometry_restraints.edits { bond { atom_selection_1 = chain A and resseq 7 and name HH atom_selection_2 = chain B and resseq 1 and name O distance_ideal = 1.81 sigma = 0.05 } } """ type_list_known = [ '3neigbs', '2tetra', '2tetra', 'flat_2neigbs', 'flat_2neigbs', 'flat_2neigbs', 'flat_2neigbs', 'alg1b' ] gm_phil = iotbx.phil.parse(input_string=grand_master_phil_str, process_includes=True) edits_phil = iotbx.phil.parse(edits) working_phil = gm_phil.fetch(edits_phil) params = working_phil.extract() # Make sure the angle edit is present assert (params.geometry_restraints.edits.bond[0].atom_selection_1 == \ "chain A and resseq 7 and name HH") pdb_inp = iotbx.pdb.input(lines=pdb_str.split("\n"), source_info=None) model = mmtbx.model.manager(model_input=pdb_inp, build_grm=True, pdb_interpretation_params=params) pdb_hierarchy = model.get_hierarchy() sites_cart = model.get_sites_cart() atoms = pdb_hierarchy.atoms() model.setup_riding_h_manager() riding_h_manager = model.get_riding_h_manager() h_para = riding_h_manager.h_parameterization diagnostics = riding_h_manager.diagnostics(sites_cart=sites_cart, threshold=0.05) h_distances = diagnostics.h_distances type_list = diagnostics.type_list number_h = model.get_hd_selection().count(True) number_h_para = len(h_para) - h_para.count(None) connectivity_manager = connectivity.determine_connectivity( pdb_hierarchy=pdb_hierarchy, geometry_restraints=model.get_restraints_manager().geometry) double_H = connectivity_manager.double_H # Test if number of paramterized H atoms is correct assert (number_h == number_h_para), 'Not all H atoms are parameterized' assert (double_H[19] == [11, 20]), 'H bound to two atoms wrongly recognized' assert (number_h_para == 8), 'Not all H atoms are parameterized' for ih in h_distances: labels = atoms[ih].fetch_labels() if (h_distances[ih] > 0.1): assert (h_distances[ih] < 0.1), \ 'distance too large: %s atom: %s (%s) residue: %s ' \ % (h_para[ih].htype, atoms[ih].name, ih, labels.resseq.strip()) for type1, type2 in zip(type_list, type_list_known): assert (type1 == type2)
def add(model, use_neutron_distances=False, adp_scale=1, exclude_water=True, protein_only=False, stop_for_unknowns=True, remove_first=True): if (remove_first): model = model.select(~model.get_hd_selection()) pdb_hierarchy = model.get_hierarchy() mon_lib_srv = model.get_mon_lib_srv() get_class = iotbx.pdb.common_residue_names_get_class """ for pmodel in pdb_hierarchy.models(): for chain in pmodel.chains(): for residue_group in chain.residue_groups(): for conformer in residue_group.conformers(): for residue in conformer.residues(): print list(residue.atoms().extract_name()) """ #XXX This breaks for 1jxt, residue 2, TYR for chain in pdb_hierarchy.only_model().chains(): for rg in chain.residue_groups(): for ag in rg.atom_groups(): #print list(ag.atoms().extract_name()) if (get_class(name=ag.resname) == "common_water"): continue if (protein_only and not ag.resname.strip().upper() in aa_codes): continue actual = [a.name.strip().upper() for a in ag.atoms()] mlq = mon_lib_query(residue=ag.resname, mon_lib_srv=mon_lib_srv) expected_all = mlq.atom_dict().keys() expected_h = [] for k, v in mlq.atom_dict().iteritems(): if (v.type_symbol == "H"): expected_h.append(k) missing_h = list(set(expected_h).difference(set(actual))) if 0: print ag.resname, missing_h new_xyz = ag.atoms().extract_xyz().mean() hetero = ag.atoms()[0].hetero for mh in missing_h: # TODO: this should be probably in a central place if len(mh) < 4: mh = (' ' + mh).ljust(4) a = (iotbx.pdb.hierarchy.atom().set_name( new_name=mh).set_element(new_element="H").set_xyz( new_xyz=new_xyz).set_hetero(new_hetero=hetero)) ag.append_atom(a) pdb_hierarchy.atoms().reset_serial() #pdb_hierarchy.sort_atoms_in_place() p = mmtbx.model.manager.get_default_pdb_interpretation_params() p.pdb_interpretation.clash_guard.nonbonded_distance_threshold = None p.pdb_interpretation.use_neutron_distances = use_neutron_distances p.pdb_interpretation.proceed_with_excessive_length_bonds = True #p.pdb_interpretation.restraints_library.cdl=False # XXX this triggers a bug !=360 ro = model.get_restraint_objects() model = mmtbx.model.manager(model_input=None, pdb_hierarchy=pdb_hierarchy, build_grm=True, stop_for_unknowns=stop_for_unknowns, crystal_symmetry=model.crystal_symmetry(), restraint_objects=ro, pdb_interpretation_params=p, log=null_out()) # # Remove lone H # sel_h = model.get_hd_selection() # sel_isolated = model.isolated_atoms_selection() # sel_lone = sel_h & sel_isolated # model = model.select(~sel_lone) # Only keep H which have been parameterized in riding H procedure sel_h = model.get_hd_selection() model.setup_riding_h_manager() sel_h_in_para = flex.bool( [bool(x) for x in model.riding_h_manager.h_parameterization]) sel_h_not_in_para = sel_h_in_para.exclusive_or(sel_h) model = model.select(~sel_h_not_in_para) model = exclude_h_on_SS(model=model) model = exclude_h_on_coordinated_S(model=model) # Reset occupancies, ADPs and idealize model.reset_adp_for_hydrogens(scale=adp_scale) model.reset_occupancy_for_hydrogens_simple() model.idealize_h_riding() return model
def add(model, use_neutron_distances = False, adp_scale = 1, exclude_water = True, protein_only = False, stop_for_unknowns = False, keep_existing_H = False): """ Add H atoms to a model Parameters ---------- use_neutron_distances : bool use neutron distances instead of X-ray adp_scale : float scale factor for isotropic B of H atoms. B(H-atom) = adp_scale * B(parent non-H atom) keep_existing_H : bool keep existing H atoms in model, only place missing H Returns ------- model mmtbx model object with H atoms """ model_has_bogus_cs = False # TODO temporary fix until the code is moved to model class # check if box cussion of 5 A is enough to prevent symm contacts cs = model.crystal_symmetry() if cs is None: model = shift_and_box_model(model = model) model_has_bogus_cs = True # Remove existing H if requested if( not keep_existing_H): model = model.select(~model.get_hd_selection()) pdb_hierarchy = model.get_hierarchy() mon_lib_srv = model.get_mon_lib_srv() """ for pmodel in pdb_hierarchy.models(): for chain in pmodel.chains(): for residue_group in chain.residue_groups(): for conformer in residue_group.conformers(): for residue in conformer.residues(): print list(residue.atoms().extract_name()) """ add_missing_H_atoms_at_bogus_position(pdb_hierarchy = pdb_hierarchy, mon_lib_srv = mon_lib_srv, protein_only = protein_only) pdb_hierarchy.atoms().reset_serial() #pdb_hierarchy.sort_atoms_in_place() p = mmtbx.model.manager.get_default_pdb_interpretation_params() p.pdb_interpretation.clash_guard.nonbonded_distance_threshold=None p.pdb_interpretation.use_neutron_distances = use_neutron_distances p.pdb_interpretation.proceed_with_excessive_length_bonds=True #p.pdb_interpretation.restraints_library.cdl=False # XXX this triggers a bug !=360 ro = model.get_restraint_objects() model = mmtbx.model.manager( model_input = None, pdb_hierarchy = pdb_hierarchy, build_grm = True, stop_for_unknowns = stop_for_unknowns, crystal_symmetry = model.crystal_symmetry(), restraint_objects = ro, pdb_interpretation_params = p, log = null_out()) # f = open("intermediate1.pdb","w") # f.write(model.model_as_pdb()) # # Remove lone H # sel_h = model.get_hd_selection() # sel_isolated = model.isolated_atoms_selection() # sel_lone = sel_h & sel_isolated # model = model.select(~sel_lone) # # Only keep H that have been parameterized in riding H procedure sel_h = model.get_hd_selection() model.setup_riding_h_manager(use_ideal_dihedral = True) sel_h_in_para = flex.bool( [bool(x) for x in model.riding_h_manager.h_parameterization]) sel_h_not_in_para = sel_h_in_para.exclusive_or(sel_h) model = model.select(~sel_h_not_in_para) model = exclude_h_on_SS(model = model) model = exclude_h_on_coordinated_S(model = model) # f = open("intermediate2.pdb","w") # f.write(model.model_as_pdb()) # Reset occupancies, ADPs and idealize model.reset_adp_for_hydrogens(scale = adp_scale) model.reset_occupancy_for_hydrogens_simple() model.idealize_h_riding() # return model