def get_atom_lines_from_pdb(pdb_file, ignore_residues = [], keep_protons=False, tags = ['ATOM ', 'HETATM'], chains=None): lines = propka.lib.open_file_for_reading(pdb_file).readlines() nterm_residue = 'next_residue' old_residue = None terminal = None model = 1 for line in lines: tag = line[0:6] # set the model number if tag == 'MODEL ': model = int(line[6:]) nterm_residue = 'next_residue' if tag == 'TER ': nterm_residue = 'next_residue' if tag in tags: alt_conf_tag = line[16] residue_name = line[12:16] residue_number = line[22:26] # check if we want this residue if line[17:20] in ignore_residues: continue if chains and line[21] not in chains: continue # set the Nterm residue number - nessecary because we may need to # identify more than one N+ group for structures with alt_conf tags if nterm_residue == 'next_residue' and tag == 'ATOM ': # make sure that we reached a new residue - nessecary if OXT is not the last atom in # the previous residue if old_residue != residue_number: nterm_residue = residue_number old_residue = None # Identify the configuration # convert digits to letters if alt_conf_tag in '123456789': alt_conf_tag = chr(ord(alt_conf_tag)+16) if alt_conf_tag == ' ': alt_conf_tag = 'A' conformation = '%d%s'%(model, alt_conf_tag) # set the terminal if tag == 'ATOM ': if residue_name.strip() == 'N' and nterm_residue == residue_number: terminal = 'N+' if residue_name.strip() in ['OXT','O\'\'']: terminal = 'C-' nterm_residue = 'next_residue' old_residue = residue_number # and yield the atom atom = Atom(line=line) atom.terminal = terminal #if keep_protons: # atom.is_protonated = True if not (atom.element == 'H' and not keep_protons): #ignore hydrogen yield (conformation, atom) terminal = None return
def get_atom_lines_from_input(input_file, tags = ['ATOM ','HETATM']): lines = propka.lib.open_file_for_reading(input_file).readlines() conformation = '' atoms = {} numbers = [] for line in lines: tag = line[0:6] # set the conformation if tag == 'MODEL ': conformation = line[6:].strip() # found an atom - save it if tag in tags: atom = Atom(line=line) atom.get_input_parameters() atom.groups_extracted = 1 atom.is_protonated = True atoms[atom.numb] = atom numbers.append(atom.numb) # found bonding information - apply it if tag == 'CONECT' and len(line)>14: conect_numbers = [line[i:i+5] for i in range(6, len(line)-1, 5)] center_atom = atoms[int(conect_numbers[0])] for n in conect_numbers[1:]: b = atoms[int(n)] # remember to check for cysteine bridges if center_atom.element == 'S' and b.element == 'S': center_atom.cysteine_bridge = True b.cysteine_bridge = True # set up bonding if not b in center_atom.bonded_atoms: center_atom.bonded_atoms.append(b) if not center_atom in b.bonded_atoms: b.bonded_atoms.append(center_atom) # found info on covalent coupling if tag == 'CCOUPL' and len(line)>14: conect_numbers = [line[i:i+5] for i in range(6, len(line)-1, 5)] center_atom = atoms[int(conect_numbers[0])] for n in conect_numbers[1:]: cg = atoms[int(n)] center_atom.group.couple_covalently(cg.group) # found info on non-covalent coupling if tag == 'NCOUPL' and len(line)>14: conect_numbers = [line[i:i+5] for i in range(6, len(line)-1, 5)] center_atom = atoms[int(conect_numbers[0])] for n in conect_numbers[1:]: cg = atoms[int(n)] center_atom.group.couple_non_covalently(cg.group) # this conformation is done - yield the atoms if tag == 'ENDMDL': for n in numbers: yield (conformation, atoms[n]) # prepare for next conformation atoms = {} numbers = [] return
def make_new_h(atom, x, y, z): """Add a new hydrogen to an atom at the specified position. Args: atom: atom to protonate x: x position of hydrogen y: y position of hydrogen z: z position of hydrogen Returns: new hydrogen atom """ new_h = Atom() new_h.set_property(numb=None, name='H{0:s}'.format(atom.name[1:]), res_name=atom.res_name, chain_id=atom.chain_id, res_num=atom.res_num, x=x, y=y, z=z, occ=None, beta=None) new_h.element = 'H' new_h.bonded_atoms = [atom] new_h.charge = 0 new_h.steric_number = 0 new_h.number_of_lone_pairs = 0 new_h.number_of_protons_to_add = 0 new_h.num_pi_elec_2_3_bonds = 0 atom.bonded_atoms.append(new_h) atom.conformation_container.add_atom(new_h) return new_h
def get_atom_lines_from_pdb(pdb_file, ignore_residues=[], keep_protons=False, tags=['ATOM ', 'HETATM'], chains=None): """Get atom lines from PDB file. Args: pdb_file: PDB file to parse ignore_residues: list of residues to ignore keep_protons: bool to keep/ignore protons tags: tags of lines that include atoms chains: list of chains """ lines = open_file_for_reading(pdb_file).readlines() nterm_residue = 'next_residue' old_residue = None terminal = None model = 1 for line in lines: tag = line[0:6] # set the model number if tag == 'MODEL ': model = int(line[6:]) nterm_residue = 'next_residue' if tag == 'TER ': nterm_residue = 'next_residue' if tag in tags: alt_conf_tag = line[16] residue_name = line[12:16] residue_number = line[22:26] # check if we want this residue if line[17:20] in ignore_residues: continue if chains and line[21] not in chains: continue # set the Nterm residue number - nessecary because we may need to # identify more than one N+ group for structures with alt_conf tags if nterm_residue == 'next_residue' and tag == 'ATOM ': # make sure that we reached a new residue - nessecary if OXT is # not the last atom inthe previous residue if old_residue != residue_number: nterm_residue = residue_number old_residue = None # Identify the configuration # convert digits to letters if alt_conf_tag in '123456789': alt_conf_tag = chr(ord(alt_conf_tag) + 16) if alt_conf_tag == ' ': alt_conf_tag = 'A' conformation = '{0:d}{1:s}'.format(model, alt_conf_tag) # set the terminal if tag == 'ATOM ': if (residue_name.strip() == 'N' and nterm_residue == residue_number): terminal = 'N+' if residue_name.strip() in ['OXT', 'O\'\'']: terminal = 'C-' nterm_residue = 'next_residue' old_residue = residue_number # and yield the atom atom = Atom(line=line) atom.terminal = terminal #ignore hydrogen if not (atom.element == 'H' and not keep_protons): yield (conformation, atom) terminal = None
def get_atom_lines_from_input(input_file, tags=['ATOM ', 'HETATM']): lines = propka.lib.open_file_for_reading(input_file).readlines() conformation = '' atoms = {} numbers = [] for line in lines: tag = line[0:6] # set the conformation if tag == 'MODEL ': conformation = line[6:].strip() # found an atom - save it if tag in tags: atom = Atom(line=line) atom.get_input_parameters() atom.groups_extracted = 1 atom.is_protonated = True atoms[atom.numb] = atom numbers.append(atom.numb) # found bonding information - apply it if tag == 'CONECT' and len(line) > 14: conect_numbers = [ line[i:i + 5] for i in range(6, len(line) - 1, 5) ] center_atom = atoms[int(conect_numbers[0])] for n in conect_numbers[1:]: b = atoms[int(n)] # remember to check for cysteine bridges if center_atom.element == 'S' and b.element == 'S': center_atom.cysteine_bridge = True b.cysteine_bridge = True # set up bonding if not b in center_atom.bonded_atoms: center_atom.bonded_atoms.append(b) if not center_atom in b.bonded_atoms: b.bonded_atoms.append(center_atom) # found info on covalent coupling if tag == 'CCOUPL' and len(line) > 14: conect_numbers = [ line[i:i + 5] for i in range(6, len(line) - 1, 5) ] center_atom = atoms[int(conect_numbers[0])] for n in conect_numbers[1:]: cg = atoms[int(n)] center_atom.group.couple_covalently(cg.group) # found info on non-covalent coupling if tag == 'NCOUPL' and len(line) > 14: conect_numbers = [ line[i:i + 5] for i in range(6, len(line) - 1, 5) ] center_atom = atoms[int(conect_numbers[0])] for n in conect_numbers[1:]: cg = atoms[int(n)] center_atom.group.couple_non_covalently(cg.group) # this conformation is done - yield the atoms if tag == 'ENDMDL': for n in numbers: yield (conformation, atoms[n]) # prepare for next conformation atoms = {} numbers = [] return
def get_atom_lines_from_input(input_file, tags=['ATOM ', 'HETATM']): """Get atom lines from a PROPKA input file. Args: input_file: input file tags: tags defining atom lines Yields: conformation container, list of atoms """ lines = open_file_for_reading(input_file).readlines() conformation = '' atoms = {} numbers = [] for line in lines: tag = line[0:6] # set the conformation if tag == 'MODEL ': conformation = line[6:].strip() # found an atom - save it if tag in tags: atom = Atom(line=line) atom.get_input_parameters() initialize_atom_group(atom) atom.groups_extracted = 1 atom.is_protonated = True atoms[atom.numb] = atom numbers.append(atom.numb) # found bonding information - apply it if tag == 'CONECT' and len(line) > 14: conect_numbers = [ line[i:i + 5] for i in range(6, len(line) - 1, 5) ] center_atom = atoms[int(conect_numbers[0])] for num in conect_numbers[1:]: bond_atom = atoms[int(num)] # remember to check for cysteine bridges if center_atom.element == 'S' and bond_atom.element == 'S': center_atom.cysteine_bridge = True bond_atom.cysteine_bridge = True # set up bonding if not bond_atom in center_atom.bonded_atoms: center_atom.bonded_atoms.append(bond_atom) if not center_atom in bond_atom.bonded_atoms: bond_atom.bonded_atoms.append(center_atom) # found info on covalent coupling if tag == 'CCOUPL' and len(line) > 14: conect_numbers = [ line[i:i + 5] for i in range(6, len(line) - 1, 5) ] center_atom = atoms[int(conect_numbers[0])] for num in conect_numbers[1:]: cov_atom = atoms[int(num)] center_atom.group.couple_covalently(cov_atom.group) # found info on non-covalent coupling if tag == 'NCOUPL' and len(line) > 14: conect_numbers = [ line[i:i + 5] for i in range(6, len(line) - 1, 5) ] center_atom = atoms[int(conect_numbers[0])] for num in conect_numbers[1:]: cov_atom = atoms[int(num)] center_atom.group.couple_non_covalently(cov_atom.group) # this conformation is done - yield the atoms if tag == 'ENDMDL': for num in numbers: yield (conformation, atoms[num]) # prepare for next conformation atoms = {} numbers = []