def run(args=(), params=None, out=None): if (out is None): out = sys.stdout if (params is None): if (len(args) == 0): raise Usage("pdb_split_chains.py model.pdb") import iotbx.phil cmdline = iotbx.phil.process_command_line_with_files( args=args, master_phil=master_phil, pdb_file_def="split_chains.pdb_file") params = cmdline.work.extract() validate_params(params) params = params.split_chains if (params.output_dir is None): params.output_dir = os.getcwd() if (params.output_base is None): params.output_base = os.path.basename( os.path.splitext(params.pdb_file)[0]) from iotbx import file_reader from iotbx.pdb.hierarchy import new_hierarchy_from_chain pdb_in = file_reader.any_file(params.pdb_file, force_type="pdb") pdb_in.check_file_type("pdb") symm = pdb_in.file_object.crystallographic_section() hierarchy = pdb_in.file_object.hierarchy if (len(hierarchy.models()) > 1): raise Sorry( "Multi-model PDB files are not supported. You can use " + "iotbx.pdb.split_models to break the structure into individual model " + "files.") id_counts = {} outputs = [] for chain in hierarchy.models()[0].chains(): main_conf = chain.conformers()[0] if (params.exclude_heteroatoms): if ((not main_conf.is_protein()) and (not main_conf.is_na())): continue elif (len(chain.residue_groups()) == 1): continue id = chain.id if (id == " "): id = "_" if (id_counts.get(id, 0) > 0): suffix = "%s-%d" % (id, id_counts[id] + 1) else: suffix = id if (not id in id_counts): id_counts[id] = 0 id_counts[id] += 1 output_file = os.path.join(params.output_dir, "%s_%s.pdb" % (params.output_base, suffix)) f = open(output_file, "w") if (params.preserve_symmetry): f.write("\n".join(symm)) f.write("\n") new_hierarchy = new_hierarchy_from_chain(chain) f.write(new_hierarchy.as_pdb_string()) f.close() outputs.append(output_file) print >> out, "Wrote chain '%s' to %s" % (chain.id, output_file) return outputs
def run (args=(), params=None, out=None) : if (out is None) : out = sys.stdout if (params is None) : if (len(args) == 0) : raise Usage("pdb_split_chains.py model.pdb") import iotbx.phil cmdline = iotbx.phil.process_command_line_with_files( args=args, master_phil=master_phil, pdb_file_def="split_chains.pdb_file") params = cmdline.work.extract() validate_params(params) params = params.split_chains if (params.output_dir is None) : params.output_dir = os.getcwd() if (params.output_base is None) : params.output_base = os.path.basename(os.path.splitext(params.pdb_file)[0]) from iotbx import file_reader from iotbx.pdb.hierarchy import new_hierarchy_from_chain pdb_in = file_reader.any_file(params.pdb_file, force_type="pdb") pdb_in.check_file_type("pdb") symm = pdb_in.file_object.crystallographic_section() hierarchy = pdb_in.file_object.hierarchy if (len(hierarchy.models()) > 1) : raise Sorry("Multi-model PDB files are not supported. You can use "+ "iotbx.pdb.split_models to break the structure into individual model "+ "files.") id_counts = {} outputs = [] for chain in hierarchy.models()[0].chains() : main_conf = chain.conformers()[0] if (params.exclude_heteroatoms) : if ((not main_conf.is_protein()) and (not main_conf.is_na())) : continue elif (len(chain.residue_groups()) == 1) : continue id = chain.id if (id == " ") : id = "_" if (id_counts.get(id, 0) > 0) : suffix = "%s-%d" % (id, id_counts[id] + 1) else : suffix = id if (not id in id_counts) : id_counts[id] = 0 id_counts[id] += 1 output_file = os.path.join(params.output_dir, "%s_%s.pdb" % (params.output_base, suffix)) f = open(output_file, "w") if (params.preserve_symmetry) : f.write("\n".join(symm)) f.write("\n") new_hierarchy = new_hierarchy_from_chain(chain) f.write(new_hierarchy.as_pdb_string()) f.close() outputs.append(output_file) print >> out, "Wrote chain '%s' to %s" % (chain.id, output_file) return outputs
def my_selection(ph, ch_id, sel_list_extended): min_iseq = sel_list_extended[0] new_h = None for chain in ph.only_model().chains(): if chain.id == ch_id: if new_h is None: # append first chain and tweak selections new_h = new_hierarchy_from_chain(chain) min_iseq = chain.atoms()[0].i_seq for i in range(len(sel_list_extended)): sel_list_extended[i] -= min_iseq else: # append extra chain and tweak selection new_start_iseq = new_h.atoms_size() old_start_iseq = chain.atoms()[0].i_seq dif = old_start_iseq - new_start_iseq - min_iseq new_h.only_model().append_chain(chain.detached_copy()) for i in range(len(sel_list_extended)): if sel_list_extended[i] >= old_start_iseq - min_iseq: # new = old - old + new sel_list_extended[i] -= dif return new_h.select(flex.size_t(sel_list_extended))
def chain_from_selection(chain, selection): from iotbx.pdb.hierarchy import new_hierarchy_from_chain new_hierarchy = new_hierarchy_from_chain(chain=chain).select(selection)