Esempio n. 1
0
def add_c_terminal_oxygens_to_atom_group(ag,
                                         use_capping_hydrogens=False,
                                         append_to_end_of_model=False,
                                         c_ca_n=None,
                                        ):
  #
  # do we need ANISOU
  #
  rc = []
  atom_name=' OXT'
  atom_element = 'O'
  bond_length=1.231
  if use_capping_hydrogens:
    if ag.get_atom(atom_name.strip()): return []
    atom_name=" HC "
    atom_element="H"
    bond_length=1.
  if ag.get_atom(atom_name.strip()): return []
  if c_ca_n is not None:
    c, ca, n = c_ca_n
  else:
    c = ag.get_atom("C")
    if c is None: return
    ca = ag.get_atom("CA")
    if ca is None: return
    n = ag.get_atom("N")
    if n is None: return
  atom = ag.get_atom('O')
  dihedral = dihedral_angle(sites=[atom.xyz,
                                   c.xyz,
                                   ca.xyz,
                                   n.xyz,
                                 ],
                            deg=True)
  ro2 = construct_xyz(c, bond_length,
                      ca, 120.,
                      n, dihedral,
                      period=2,
                     )
  oxys = [' O  ', atom_name]
  for i in range(0,2):
    name = oxys[i]
    atom = ag.get_atom(name.strip())
    if atom:
      pass #atom.xyz = ro2[i]
    else:
      atom = iotbx.pdb.hierarchy.atom()
      atom.name = name
      atom.element = atom_element
      atom.occ = c.occ
      atom.b = c.b
      atom.segid = ' '*4
      atom.xyz = ro2[i]
      if append_to_end_of_model:
        chain = _add_atom_to_chain(atom, ag)
        rc.append(chain)
      else:
        # add the atom to the hierarchy
        ag.append_atom(atom)
  return rc
Esempio n. 2
0
def add_side_chain_acid_hydrogens_to_atom_group(
    atom_group,
    anchors=None,
    configuration_index=0,
    bond_length=0.95,
    element='H',
):
    """Add hydrogen atoms to side-chain acid in place

  Args:
      atom_group (TYPE): Atom group
      anchors (None, optional): Atoms that specify the acids moeity
      configuration_index (int, optional): Configuration to return

  """
    assert element in ['H', 'D']
    c, o1, o2 = anchors
    if configuration_index >= 2:
        tmp = o1.name
        o1.name = o2.name
        o2.name = tmp
        tmp = o1
        o1 = o2
        o2 = tmp
        configuration_index = configuration_index % 2
    if o2.name == ' OD2':
        name = ' HD2'
        atom = atom_group.get_atom('CB')
    elif o2.name == ' OE2':
        name = ' HE2'
        atom = atom_group.get_atom('CG')
    else:
        assert 0
    if element == 'D': name = name.replace('H', 'D')
    dihedral = dihedral_angle(sites=[
        atom.xyz,
        c.xyz,
        o1.xyz,
        o2.xyz,
    ],
                              deg=True)
    ro2 = construct_xyz(
        o2,
        bond_length,
        c,
        120.,
        o1,
        dihedral,
        period=2,
    )
    i = configuration_index
    atom = atom_group.get_atom(name.strip())
    if atom:
        pass  #atom.xyz = ro2[i]
    else:
        atom = new_atom_with_inheritance(name, element, ro2[i], o2)
        atom_group.append_atom(atom)
Esempio n. 3
0
def add_main_chain_o_to_atom_group(ag, c_ca_n=None):
    # cetral functuon
    if c_ca_n is not None:
        c, ca, n = c_ca_n
    else:
        c = ag.get_atom("C")
        if c is None: return
        ca = ag.get_atom("CA")
        if ca is None: return
        n = ag.get_atom("N")
        if n is None: return
    atom = ag.get_atom('O')
    dihedral = dihedral_angle(sites=[
        atom.xyz,
        c.xyz,
        ca.xyz,
        n.xyz,
    ],
                              deg=True)
    ro2 = construct_xyz(
        c,
        bond_length,
        ca,
        120.,
        n,
        dihedral,
        period=2,
    )
    oxys = [' O  ', atom_name]
    for i in range(0, 2):
        name = oxys[i]
        atom = ag.get_atom(name.strip())
        if atom:
            pass  #atom.xyz = ro2[i]
        else:
            atom = iotbx.pdb.hierarchy.atom()
            atom.name = name
            atom.element = atom_element
            atom.occ = c.occ
            atom.b = c.b
            atom.segid = ' ' * 4
            atom.xyz = ro2[i]
            if append_to_end_of_model:
                chain = _add_atom_to_chain(atom, ag)
                rc.append(chain)
            else:
                # add the atom to the hierarchy
                ag.append_atom(atom)

    #for
    assert atom
Esempio n. 4
0
def _add_hydrogens_to_atom_group_using_bad(ag,
                                           atom_name,
                                           atom_element,
                                           bond_atom,
                                           angle_atom,
                                           dihedral_atom,
                                           bond_length,
                                           angle,
                                           dihedral,
                                           append_to_end_of_model=False,
                                           ):
  rc = []
  if ag.get_atom(atom_name.strip()): return []
  if type(bond_atom)==type(''):
    ba = ag.get_atom(bond_atom.strip())
    #print bond_atom,ba.quote()
    if ba is None: return
  else: ba = bond_atom
  if type(angle_atom)==type(''):
    aa = ag.get_atom(angle_atom.strip())
    #print angle_atom,aa.quote()
    if aa is None: return
  else: aa = angle_atom
  if type(dihedral_atom)==type(''):
    da = ag.get_atom(dihedral_atom.strip())
    #print dihedral_atom, da.quote()
    if da is None: return
  else: da = dihedral_atom
  ro2 = construct_xyz(ba, bond_length,
                      aa, angle,
                      da, dihedral,
                      period=1,
                     )
  atom = iotbx.pdb.hierarchy.atom()
  atom.name = atom_name
  atom.element = atom_element
  atom.occ = ba.occ
  atom.b = ba.b
  # altloc???
  atom.hetero = ba.hetero
  atom.segid = ' '*4
  atom.xyz = ro2[0]
  if append_to_end_of_model:
    chain = _add_atom_to_chain(atom, ag)
    rc.append(chain)
  else:
    ag.append_atom(atom)
  return rc
Esempio n. 5
0
def add_hydrogens_to_atom_group_using_bad(
    ag,
    atom_name,
    atom_element,
    bond_atom,
    angle_atom,
    dihedral_atom,
    bond_length,
    angle,
    dihedral,
    append_to_end_of_model=False,
):
    rc = []
    if ag.get_atom(atom_name.strip()): return []
    if type(bond_atom) == type(''):
        ba = ag.get_atom(bond_atom.strip())
        if ba is None: return []
    else: ba = bond_atom
    if type(angle_atom) == type(''):
        aa = ag.get_atom(angle_atom.strip())
        if aa is None: return []
    else: aa = angle_atom
    if type(dihedral_atom) == type(''):
        da = ag.get_atom(dihedral_atom.strip())
        if da is None: return []
    else: da = dihedral_atom
    ro2 = construct_xyz(
        ba,
        bond_length,
        aa,
        angle,
        da,
        dihedral,
        period=1,
    )
    atom = _new_atom(atom_name, atom_element, ro2[0], ba.occ, ba.b, ba.hetero)
    if append_to_end_of_model:
        chain = _add_atom_to_chain(atom, ag)
        rc.append(chain)
    else:
        ag.append_atom(atom)
    return rc
Esempio n. 6
0
def add_n_terminal_hydrogens_to_atom_group(ag,
                                           use_capping_hydrogens=False,
                                           append_to_end_of_model=False,
                                           retain_original_hydrogens=True,
                                           n_ca_c=None,
                                          ):
  rc=[]
  if n_ca_c is not None:
    n, ca, c = n_ca_c
  else:
    n = ag.get_atom("N")
    if n is None: return 'no N'
    ca = ag.get_atom("CA")
    if ca is None: return 'no CA'
    c = ag.get_atom("C")
    if c is None: return 'no C'
  atom = ag.get_atom('H')
  dihedral=120.
  if atom:
    dihedral = dihedral_angle(sites=[atom.xyz,
                                     n.xyz,
                                     ca.xyz,
                                     c.xyz,
                                   ],
                              deg=True)
  if retain_original_hydrogens: pass
  else:
    if ag.get_atom("H"): # maybe needs to be smarter or actually work
      ag.remove_atom(ag.get_atom('H'))
  #if use_capping_hydrogens and 0:
  #  for i, atom in enumerate(ag.atoms()):
  #    if atom.name == ' H3 ':
  #      ag.remove_atom(i)
  #      break
  # add H1
  rh3 = construct_xyz(n, 0.9,
                      ca, 109.5,
                      c, dihedral,
                     )
  # this could be smarter
  possible = ['H', 'H1', 'H2', 'H3', 'HT1', 'HT2']
  h_count = 0
  for h in possible:
    if ag.get_atom(h): h_count+=1
  number_of_hydrogens=3
  if use_capping_hydrogens:
    number_of_hydrogens-=1
    #if ag.atoms()[0].parent().resname=='PRO':
    #  number_of_hydrogens=-1
    #  # should name the hydrogens correctly
  if h_count>=number_of_hydrogens: return []
  for i in range(0, number_of_hydrogens):
    name = " H%d " % (i+1)
    if retain_original_hydrogens:
      if i==0 and ag.get_atom('H'): continue
    if ag.get_atom(name.strip()): continue
    if ag.resname=='PRO':
      if i==0:
        continue
    atom = iotbx.pdb.hierarchy.atom()
    atom.name = name
    atom.element = "H"
    atom.xyz = rh3[i]
    atom.occ = n.occ
    atom.b = n.b
    atom.segid = ' '*4
    if append_to_end_of_model and i+1==number_of_hydrogens:
      rg = _add_atom_to_chain(atom, ag)
      rc.append(rg)
    else:
      ag.append_atom(atom)
  return rc