예제 #1
0
파일: namd.py 프로젝트: janman13/pdbtool
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
예제 #2
0
파일: namd.py 프로젝트: janman13/pdbtool
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