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