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
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)
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
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
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
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