Example #1
0
def add_fake_water_atom(soup, res_type, bfactor):
  dummy_atom = pdbatoms.Atom()
  dummy_atom.pos = soup.atoms()[0].pos.copy()
  dummy_atom.type = "O"
  dummy_atom.bfactor = bfactor
  dummy_res = pdbatoms.Residue(res_type, '', 9999)
  dummy_res.insert_atom(dummy_atom)
  soup.append_residue(dummy_res)
Example #2
0
def soup_from_psf(psf):
  """
  Returns a Soup from a .psf file
  """
  soup = pdbatoms.Soup()
  curr_res_num = None
  is_header = True
  for line in open(psf):
    if is_header:
      if "NATOM" in line:
        n_atom = int(line.split()[0])
        is_header = False
      continue
    words = line.split()
    atom_num = int(words[0])
    chain_id = words[1]
    res_num = int(words[2])
    res_type = words[3]
    atom_type = words[4]
    charge = float(words[6])
    mass = float(words[7])
    if chain_id.startswith('WT') or chain_id.startswith('ION'):
      is_hetatm = True
      chain_id = " "
    else:
      is_hetatm = False
      chain_id = chain_id[0]
    if curr_res_num != res_num:
      res = pdbatoms.Residue(res_type, chain_id, res_num)
      soup.append_residue(res)
      curr_res_num = res_num
    atom = pdbatoms.Atom()
    atom.vel = v3.vector()
    atom.chain_id = chain_id
    atom.is_hetatm = is_hetatm
    atom.num = atom_num
    atom.res_num = res_num
    atom.res_type = res_type
    atom.type = atom_type
    atom.mass = mass
    atom.charge = charge
    atom.element = data.guess_element(res_type, atom_type)
    soup.insert_atom(-1, atom)
    if len(soup.atoms()) == n_atom:
      break
  convert_to_pdb_atom_names(soup)
  return soup
Example #3
0
def soup_from_top_gro(top, gro, skip_solvent=False):
    """
  Returns a Soup built from GROMACS restart files.
  If skip_solvent=True, will skip all solvent molecules.
  """
    util.check_output(top)
    util.check_output(gro)

    soup = pdbatoms.Soup()
    soup.remaining_text = ""
    soup.n_remaining_text = 0

    atoms = []

    # Read from .gro because .top does not contain water
    # residue information, which is "inferred"
    lines = open(gro, 'r').readlines()
    for i_line, line in enumerate(lines[2:-1]):
        atom = AtomFromGroLine(line)
        if skip_solvent and atom.res_type == "SOL":
            soup.remaining_text = "".join(lines[i_line + 2:-1])
            soup.n_remaining_text = len(lines[i_line + 2:-1])
            break
        atoms.append(atom)
    soup.box = [float(w) for w in lines[-1].split()]

    for atom, (mass, q, chain_id) in zip(atoms, read_top(top)):
        atom.mass = mass
        atom.charge = q

    curr_res_num = -1
    for a in atoms:
        if curr_res_num != a.res_num:
            res = pdbatoms.Residue(a.res_type, a.chain_id, a.res_num)
            soup.append_residue(res.copy())
            curr_res_num = a.res_num
        soup.insert_atom(-1, a)

    convert_to_pdb_atom_names(soup)
    protein.find_chains(soup)

    return soup
Example #4
0
def soup_from_topology(topology):
    """
  Returns a Soup from a topology dictionary.
  """
    soup = pdbatoms.Soup()
    chain_id = ''
    n_res = topology['NRES']
    n_atom = topology['NATOM']
    for i_res in range(n_res):
        res_type = topology['RESIDUE_LABEL'][i_res].strip()
        if res_type == "WAT":
            res_type = "HOH"
        res = pdbatoms.Residue(res_type, chain_id, i_res + 1)
        soup.append_residue(res)
        res = soup.residue(i_res)
        i_atom_start = topology['RESIDUE_POINTER'][i_res] - 1
        if i_res == n_res - 1:
            i_atom_end = n_atom
        else:
            i_atom_end = topology['RESIDUE_POINTER'][i_res + 1] - 1
        for i_atom in range(i_atom_start, i_atom_end):
            atom = pdbatoms.Atom()
            atom.vel = v3.vector()
            atom.num = i_atom + 1
            atom.res_num = i_res + 1
            atom.res_type = res_type
            atom.type = topology['ATOM_NAME'][i_atom].strip()
            atom.mass = topology['MASS'][i_atom]
            atom.charge = topology['CHARGE'][i_atom] / sqrt_of_k
            atom.element = data.guess_element(atom.res_type, atom.type)
            soup.insert_atom(-1, atom)
    convert_to_pdb_atom_names(soup)
    if topology['IFBOX'] > 0:
        # create dummy dimension to ensure box dimension recognized
        soup.box_dimension_str = "1.000000 1.0000000 1.000000"
    return soup