def SoupFromNamdPsf(psf, in_coor_pdb, in_vel_pdb): soup = Soup(in_coor_pdb) load_masses_to_soup(psf, soup) vel_soup = Soup(in_vel_pdb) for atom, vel_atom in zip(soup.atoms(), vel_soup.atoms()): v = vel_atom.pos atom.vel.set(v.x, v.y, v.z) return soup
def SoupFromPsf(psf): "read a psf and parse into protein chains." f = open(psf, "r") line = f.readline() while 'NATOM' not in line: line = f.readline() n_atom = int(line[0:8]) lines = [f.readline() for i in range(0, n_atom)] f.close # work out the chains in the psf file chain_info_list = [] chain_char = "" res_num = -1 chain_type = "" for i, line in enumerate(lines): word_list = line.split() new_chain_type = word_list[1] new_res_num = int(word_list[2]) if chain_type == "": chain_type = new_chain_type res_num = new_res_num chain_info_list.append([chain_type, i, i+1]) elif chain_type is "WATERS" and new_chain_type is "WATERS" and \ res_num <> new_res_num: res_num = new_res_num chain_info_list.append([chain_type, i, i+1]) elif chain_type <> new_chain_type: chain_type = new_chain_type chain_info_list.append([chain_type, i, i+1]) else: chain_info_list[-1][2] = i+1 # make a list of chains using the objects in protein chains = [] for name, first, last in chain_info_list: if "WATERS" in name: chain = polymer.Polymer() else: chain = protein.Protein() curr_res_num = -1 for i, line in enumerate(lines[first:last]): word_list = line.split() atom = molecule.Atom() atom.res_num = int(word_list[2]) atom.res_type = word_list[3][0:3] atom.type = word_list[4] atom.element = atom.type[0] atom.type = atom.type.strip(" ") atom.num = i + first try: atom.mass = float(word_list[7]) except: atom.mass = 0.0 if curr_res_num != atom.res_num: res = polymer.Residue(atom.res_type, atom.chain_id, atom.res_num, '') chain.append_residue_no_renum(res) curr_res_num = atom.res_num chain.insert_atom(chain.n_residue()-1, atom) chains.append(chain) soup = Soup() for chain in chains: soup.append_chain(chain) # load masses in [a.m.u.] masses = [float(line[47:60]) for line in open(psf, "r") if "CHAIN" in line] for a, m in zip(soup.atoms(), masses): a.mass = m return soup