def exercise(): pdb_inp = iotbx.pdb.input(source_info=None, lines=pdb_str) ann = pdb_inp.extract_secondary_structure() pdb_int_params = mmtbx.model.manager.get_default_pdb_interpretation_params() pdb_int_params.pdb_interpretation.ncs_search.enabled=True model = mmtbx.model.manager( model_input = pdb_inp, pdb_interpretation_params=pdb_int_params, build_grm = True) model.setup_ncs_constraints_groups() log = StringIO() rm = ssb.substitute_ss( model, log=log) rm.run() # with open("res.pdb", 'w') as f: # f.write(model.model_as_pdb()) # check that strict NCS was implemented throughout dif = get_difference_chainsAB(strings=model.model_as_pdb()) for d in dif: assert approx_equal(d, (0,0,0), eps=0.005) log_cont = log.getvalue() # print("===========================") # print (log_cont) # print("===========================") assert log_cont.find("1 element(s) were skipped because they are in NCS copies") > 0 print("OK")
def exercise_some_atoms_are_absent(): """ CD1, CD2 from 101 residue are absent""" tst_pdb_2 = """\ HELIX 2 2 GLY A 100 TRP A 101 1 2 ATOM 866 N GLY A 100 -128.903-139.939-104.460 1.00 27.58 N ATOM 867 CA GLY A 100 -128.223-140.890-103.603 1.00 27.58 C ATOM 868 C GLY A 100 -128.381-142.356-103.959 1.00 27.58 C ATOM 869 O GLY A 100 -129.283-142.755-104.686 1.00 27.58 O ATOM 871 N TRP A 101 -127.491-143.163-103.397 1.00 25.83 N ATOM 872 CA TRP A 101 -127.455-144.601-103.619 1.00 25.83 C ATOM 873 C TRP A 101 -128.824-145.274-103.752 1.00 25.83 C ATOM 874 O TRP A 101 -129.091-145.962-104.734 1.00 25.83 O ATOM 875 CB TRP A 101 -126.659-145.240-102.480 1.00 42.04 C ATOM 876 CG TRP A 101 -126.207-146.635-102.729 1.00 42.04 C ATOM 879 NE1 TRP A 101 -125.663-148.557-103.751 1.00 42.04 N ATOM 880 CE2 TRP A 101 -125.347-148.723-102.429 1.00 42.04 C ATOM 881 CE3 TRP A 101 -125.446-147.437-100.384 1.00 42.04 C """ pdb_inp = iotbx.pdb.input(source_info=None, lines=tst_pdb_2) ann = pdb_inp.extract_secondary_structure() model = mmtbx.model.manager( model_input = pdb_inp, build_grm = True) model.set_ss_annotation(ann) rm = ssb.substitute_ss( model) rm.run()
def exercise_presence_of_h(): tst_pdb_1 = """\ HELIX 2 2 GLY A 100 TRP A 101 1 2 ATOM 866 N GLY A 100 -128.903-139.939-104.460 1.00 27.58 N ATOM 867 CA GLY A 100 -128.223-140.890-103.603 1.00 27.58 C ATOM 868 C GLY A 100 -128.381-142.356-103.959 1.00 27.58 C ATOM 869 O GLY A 100 -129.283-142.755-104.686 1.00 27.58 O ATOM 870 H GLY A 100 -129.862-139.777-104.337 1.00 36.09 H ATOM 871 N TRP A 101 -127.491-143.163-103.397 1.00 25.83 N ATOM 872 CA TRP A 101 -127.455-144.601-103.619 1.00 25.83 C ATOM 873 C TRP A 101 -128.824-145.274-103.752 1.00 25.83 C ATOM 874 O TRP A 101 -129.091-145.962-104.734 1.00 25.83 O ATOM 875 CB TRP A 101 -126.659-145.240-102.480 1.00 42.04 C ATOM 876 CG TRP A 101 -126.207-146.635-102.729 1.00 42.04 C ATOM 877 CD1 TRP A 101 -126.180-147.300-103.922 1.00 42.04 C ATOM 878 CD2 TRP A 101 -125.677-147.528-101.760 1.00 42.04 C ATOM 879 NE1 TRP A 101 -125.663-148.557-103.751 1.00 42.04 N ATOM 880 CE2 TRP A 101 -125.347-148.723-102.429 1.00 42.04 C ATOM 881 CE3 TRP A 101 -125.446-147.437-100.384 1.00 42.04 C ATOM 882 CZ2 TRP A 101 -124.799-149.820-101.767 1.00 42.04 C ATOM 883 CZ3 TRP A 101 -124.899-148.528 -99.725 1.00 42.04 C ATOM 884 CH2 TRP A 101 -124.581-149.703-100.415 1.00 42.04 C ATOM 885 H TRP A 101 -126.863-142.797-102.745 1.00 42.04 H """ pdb_inp = iotbx.pdb.input(source_info=None, lines=tst_pdb_1) ann = pdb_inp.extract_secondary_structure() model = mmtbx.model.manager( model_input = pdb_inp, build_grm = True) model.set_ss_annotation(ann) rm = ssb.substitute_ss( model, )
def exercise_ca_absent(): # should raise Sorry """ CA from 101 residue are absent. We don't handle it at the moment.""" tst_pdb_1 = """\ HELIX 2 2 GLY A 100 TRP A 101 1 2 ATOM 866 N GLY A 100 -128.903-139.939-104.460 1.00 27.58 N ATOM 867 CA GLY A 100 -128.223-140.890-103.603 1.00 27.58 C ATOM 868 C GLY A 100 -128.381-142.356-103.959 1.00 27.58 C ATOM 869 O GLY A 100 -129.283-142.755-104.686 1.00 27.58 O ATOM 870 H GLY A 100 -129.862-139.777-104.337 1.00 36.09 H ATOM 871 N TRP A 101 -127.491-143.163-103.397 1.00 25.83 N ATOM 873 C TRP A 101 -128.824-145.274-103.752 1.00 25.83 C ATOM 874 O TRP A 101 -129.091-145.962-104.734 1.00 25.83 O ATOM 875 CB TRP A 101 -126.659-145.240-102.480 1.00 42.04 C ATOM 876 CG TRP A 101 -126.207-146.635-102.729 1.00 42.04 C ATOM 877 CD1 TRP A 101 -126.180-147.300-103.922 1.00 42.04 C ATOM 878 CD2 TRP A 101 -125.677-147.528-101.760 1.00 42.04 C ATOM 879 NE1 TRP A 101 -125.663-148.557-103.751 1.00 42.04 N ATOM 880 CE2 TRP A 101 -125.347-148.723-102.429 1.00 42.04 C ATOM 881 CE3 TRP A 101 -125.446-147.437-100.384 1.00 42.04 C ATOM 882 CZ2 TRP A 101 -124.799-149.820-101.767 1.00 42.04 C ATOM 883 CZ3 TRP A 101 -124.899-148.528 -99.725 1.00 42.04 C ATOM 884 CH2 TRP A 101 -124.581-149.703-100.415 1.00 42.04 C ATOM 885 H TRP A 101 -126.863-142.797-102.745 1.00 42.04 H """ pdb_inp = iotbx.pdb.input(source_info=None, lines=tst_pdb_1) ann = pdb_inp.extract_secondary_structure() model = mmtbx.model.manager( model_input = pdb_inp, build_grm = True) model.set_ss_annotation(ann) try: rm = ssb.substitute_ss( model) rm.run() except Sorry as e: assert e.args[0].startswith("C, CA or N") except Exception: assert 0, "Error: This test failed" else: assert 0, "Error: This test failed"
def run(self): # I'm guessing self.data_manager, self.params and self.logger # are already defined here... print('Using model: %s' % self.data_manager.get_default_model_name(), file=self.logger) # this must be mmtbx.model.manager? self.model = self.data_manager.get_model() # Done in place! self.params.ss_idealization.enabled=True sss = ss_idealization.substitute_ss( model = self.model, params = self.params.ss_idealization, log=self.logger) sss.run() inp_fn = os.path.basename(self.data_manager.get_default_model_name())[:-4] fn = "%s" % self.get_default_output_filename( prefix='%s_' % inp_fn, suffix='ss_idealized', serial=Auto) self.data_manager.write_model_file(self.model, filename=fn)
def exercise_process_params(): pdb_inp = iotbx.pdb.input(lines=model_1yjp, source_info='model_1yjp') model = mmtbx.model.manager(model_input=pdb_inp) ssb_obj = ssb.substitute_ss(model) ppars = ssb_obj._process_params(params=None) assert ppars.enabled assert not ppars.restrain_torsion_angles # params = ssb.master_phil.fetch().extract() ppars = ssb_obj._process_params(params=params) assert not ppars.enabled assert not ppars.restrain_torsion_angles params.ss_idealization.enabled = True ppars = ssb_obj._process_params(params=params) assert ppars.enabled ppars = ssb_obj._process_params(params=params.ss_idealization) assert ppars.enabled params.ss_idealization.sigma_on_reference_non_ss = -1 try: ppars = ssb_obj._process_params(params=params.ss_idealization) except AssertionError as e: assert e.args[0] == 'Bad sigma_on_reference_non_ss parameter'
def run(self): t_0 = time() self.ann = self.model.get_ss_annotation() self._setup_model_h() self.model.set_restraint_objects(self.model_h.get_restraint_objects()) self.model.process_input_model(make_restraints=True) # set SS restratins self.set_ss_restraints(self.ann) self.model.setup_ncs_constraints_groups() self.init_model_statistics = self.get_statistics(self.model) # # Cablam idealization # if self.params.debug: self.shift_and_write_result(model=self.model, fname_suffix="start") self.shift_and_write_result(model=self.model_h, fname_suffix="start_h") self.params.cablam_idealization.find_ss_after_fixes = False ci_results = cablam_idealization( model=self.model, params=self.params.cablam_idealization, log=self.log).get_results() self.model = ci_results.model self.after_cablam_statistics = self.get_statistics(self.model) if self.params.debug: self.shift_and_write_result(model=self.model, fname_suffix="cablam_id") # Here we are preparing maps if needed. if self.user_supplied_map is not None: self.prepare_user_map() if self.reference_map is None and self.params.use_map_for_reference: self.prepare_reference_map_3() if self.params.run_minimization_first: # running simple minimization and updating all # self.master, self.working, etc... # self.whole_pdb_h.reset_atom_i_seqs() if self.init_ref_map is None: self.prepare_init_reference_map() print("Minimization first", file=self.log) self.minimize( model=self.model, original_pdb_h=self.original_hierarchy, excl_string_selection=None, # don't need if we have map reference_map=self.init_ref_map, ) self.init_gm_model_statistics = self.get_statistics(self.model) if self.params.debug: self.shift_and_write_result(model=self.model, fname_suffix="init_gm") if (self.init_gm_model_statistics is not None and self.init_gm_model_statistics.ramachandran.outliers == 0 and self.init_gm_model_statistics.omega.twisted_general <= 0.01 and self.init_gm_model_statistics.omega.twisted_proline <= 0.01 and self.init_gm_model_statistics.omega.cis_general <= 0.01 and self.init_gm_model_statistics.omega.cis_proline <= 0.01 and self.init_gm_model_statistics.rotamer.outliers <= 0.01): print("Simple minimization was enough", file=self.log) # Early exit!!! self.shift_and_write_result(model=self.model, fname_suffix="all_idealized") if self.params.output_model_h: self.shift_and_write_result(model=self.model_h, fname_suffix="all_idealized_h") self.final_model_statistics = self.get_statistics(self.model) # self.original_boxed_hierarchy.write_pdb_file(file_name="original_boxed_end.pdb") self.time_for_run = time() - t_0 if self.params.output_pkl: easy_pickle.dump(file_name="%s.pkl" % self.params.output_prefix, obj=self.get_stats_obj()) return self.filtered_whole_ann = None if self.ann is not None: self.filtered_whole_ann = self.ann.deep_copy() print("Original SS annotation", file=self.log) print(self.ann.as_pdb_str(), file=self.log) if self.params.filter_input_ss: self.filtered_whole_ann = self.ann.filter_annotation( hierarchy=self.model.get_hierarchy(), asc=self.model.get_atom_selection_cache()) print("Filtered SS annotation", file=self.log) print(self.filtered_whole_ann.as_pdb_str(), file=self.log) self.model.set_ss_annotation(self.filtered_whole_ann) # getting grm with SS restraints self.update_ss_in_grm(self.filtered_whole_ann) if (self.ann is None or self.ann.get_n_helices() + self.ann.get_n_sheets() == 0 or not self.params.ss_idealization.enabled): print( "No secondary structure annotations found or SS idealization is disabled.", file=self.log) print("Secondary structure substitution step will be skipped", file=self.log) self.log.flush() # here we want to do geometry minimization anyway! negate_selection = None if self.reference_map is None: outlier_selection_txt = mmtbx.building.loop_closure.utils. \ rama_score_selection(self.model.get_hierarchy(), self.model.get_ramachandran_manager(), "outlier",1) print("outlier_selection_txt", outlier_selection_txt, file=self.log) negate_selection = "all" if outlier_selection_txt != "" and outlier_selection_txt is not None: negate_selection = "not (%s)" % outlier_selection_txt # if self.params.run_minimization_first: # self.minimize( # model=self.model, # original_pdb_h=self.whole_pdb_h, # ncs_restraints_group_list=self.filtered_ncs_restr_group_list, # excl_string_selection=negate_selection, # reference_map=self.reference_map) # self.original_boxed_hierarchy.write_pdb_file(file_name="original_boxed_h_1.pdb") else: if self.params.debug: self.params.ss_idealization.file_name_before_regularization = \ "%s_ss_before_reg.pdb" % self.params.output_prefix self.params.ss_idealization.skip_good_ss_elements = True ssb.substitute_ss(model=self.model, params=self.params.ss_idealization, reference_map=self.master_map, log=self.log) self.log.flush() self.after_ss_idealization = self.get_statistics(self.model) self.shift_and_write_result(model=self.model, fname_suffix="ss_ideal_stat") # Write resulting pdb file. if self.params.debug: self.shift_and_write_result( model=self.model, fname_suffix="ss_ideal", ) # self.params.loop_idealization.minimize_whole = not self.model.ncs_constraints_present() and self.params.loop_idealization.minimize_whole self.params.loop_idealization.debug = self.params.debug or self.params.loop_idealization.debug # self.params.loop_idealization.enabled = False # self.params.loop_idealization.variant_search_level = 0 print("Starting loop idealization", file=self.log) loop_ideal = loop_idealization(self.model, params=self.params.loop_idealization, reference_map=self.master_map, log=self.log, verbose=True) self.log.flush() if self.params.debug: self.shift_and_write_result(model=self.model, fname_suffix="rama_ideal") self.after_loop_idealization = self.get_statistics(self.model) # fixing remaining rotamer outliers if (self.params.additionally_fix_rotamer_outliers and self.after_loop_idealization.rotamer.outliers > 0.004): self.idealize_rotamers() self.after_rotamer_fixing = self.get_statistics(self.model) ref_hierarchy_for_final_gm = self.original_boxed_hierarchy if not self.params.use_starting_model_for_final_gm: ref_hierarchy_for_final_gm = self.model.get_hierarchy().deep_copy() ref_hierarchy_for_final_gm.reset_atom_i_seqs() if self.model.ncs_constraints_present(): print("Using ncs", file=self.log) # assert 0 else: print("Not using ncs", file=self.log) # assert 0 # need to update SS manager for the whole model here. if self.params.use_ss_restraints: ss_params = sec_str_master_phil.fetch().extract() ss_params.secondary_structure.protein.remove_outliers = not self.params.ss_idealization.enabled self.set_ss_restraints(ss_annotation=self.filtered_whole_ann, params=ss_params.secondary_structure) if self.params.run_minimization_last: print("loop_ideal.ref_exclusion_selection", loop_ideal.ref_exclusion_selection, file=self.log) print("Minimizing whole model", file=self.log) self.minimize( model=self.model, original_pdb_h=ref_hierarchy_for_final_gm, excl_string_selection=loop_ideal.ref_exclusion_selection, reference_map=self.reference_map) self.shift_and_write_result(model=self.model, fname_suffix="all_idealized") if self.params.output_model_h: self.shift_and_write_result(model=self.model_h, fname_suffix="all_idealized_h") self.final_model_statistics = self.get_statistics(self.model) self.time_for_run = time() - t_0 if self.params.output_pkl or self.params.debug: easy_pickle.dump(file_name="%s.pkl" % self.params.output_prefix, obj=self.get_stats_obj())