예제 #1
0
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
예제 #2
0
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
예제 #3
0
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))
예제 #4
0
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)
예제 #5
0
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)