def testWriteVmd(self):
     """ Test writing VMD-style PSF files """
     # Test writing VMD-style PSFs
     cpsf = psf.CharmmPsfFile(get_fn('dhfr_cmap_pbc.psf'))
     cpsf.write_psf(get_fn('dhfr_cmap_pbc.psf', written=True), vmd=True)
     cpsf2 = psf.CharmmPsfFile(get_fn('dhfr_cmap_pbc.psf', written=True))
     for attr in dir(cpsf):
         if attr.startswith('_'): continue
         if attr in ('topology', 'positions', 'box_vectors', 'velocities',
                     'name'):
             continue
         if callable(getattr(cpsf, attr)): continue
         if hasattr(getattr(cpsf, attr), '__len__'):
             self.assertEqual(len(getattr(cpsf, attr)),
                              len(getattr(cpsf2, attr)))
         else:
             self.assertEqual(getattr(cpsf, attr), getattr(cpsf2, attr))
     f = open(get_fn('dhfr_cmap_pbc.psf', written=True), 'r')
     try:
         has_key = False
         for line in f:
             if '!MOLNT' in line:
                 has_key = True
                 break
     finally:
         f.close()
     self.assertFalse(has_key)
 def testInscodePSF(self):
     """ Test PSF with insertion code as part of residue number """
     cpsf = psf.CharmmPsfFile(get_fn('4TVP-dmj_wat-ion.psf'))
     self.assertEqual(len(cpsf.atoms), 66264)
     self.assertEqual(len(cpsf.residues), 20169)
     self.assertEqual(len(cpsf.bonds), 46634)
     self.assertEqual(len(cpsf.angles), 32739)
     self.assertEqual(len(cpsf.dihedrals), 19104)
     self.assertEqual(len(cpsf.impropers), 1257)
     self.assertEqual(len(cpsf.cmaps), 447)
     self.assertEqual(cpsf.residues[281].insertion_code, 'A')
 def testCharmmGuiBuilder(self):
     """ Test parsing of CHARMM PSF from CHARMM-GUI """
     cpsf = psf.CharmmPsfFile(get_fn('parv.psf'))
     self.assertEqual(len(cpsf.acceptors), 0)
     self.assertEqual(len(cpsf.angles), 3004)
     self.assertEqual(len(cpsf.atoms), 1659)
     self.assertEqual(len(cpsf.bonds), 1671)
     self.assertEqual(len(cpsf.cmaps), 107)
     self.assertEqual(len(cpsf.dihedrals), 4377)
     self.assertEqual(len(cpsf.donors), 0)
     self.assertEqual(len(cpsf.flags), 3)
     self.assertEqual(len(cpsf.groups), 1)
     self.assertEqual(len(cpsf.impropers), 295)
     self.assertEqual(len(cpsf.residues), 109)
     self.assertEqual(len(cpsf.title), 3)
 def testCharmmPsf(self):
     """ Test CHARMM PSF file parsing """
     cpsf = psf.CharmmPsfFile(get_fn('ala_ala_ala.psf'))
     self.assertEqual(len(cpsf.atoms), 33)
     for i, atom in enumerate(cpsf.atoms):
         self.assertEqual(atom.idx, i)
         self.assertEqual(atom.residue.name, 'ALA')
         self.assertTrue(atom in atom.residue)  # tests __contains__
     # Check the bond, angle, and torsion partners of the first N atom
     a = cpsf.atoms[0]
     for atom in a.bond_partners:
         self.assertTrue(atom.name in ['HT3', 'HT2', 'CA', 'HT1'])
         self.assertEqual(atom.residue.idx, 0)
         self.assertTrue(atom.type in [2, 22])
     for atom in a.angle_partners:
         self.assertTrue(atom.name in ['HA', 'CB', 'C'])
         self.assertTrue(atom.type in [6, 24, 20])
         self.assertEqual(atom.residue.idx, 0)
     for atom in a.dihedral_partners:
         self.assertTrue(atom.name in ['HB1', 'HB2', 'HB3', 'O', 'N'])
         if atom.name == 'N':
             self.assertEqual(atom.residue.idx, 1)
         else:
             self.assertEqual(atom.residue.idx, 0)
         self.assertTrue(atom.type in [3, 70, 54])
     # Check some atom properties
     self.assertRaises(exceptions.MissingParameter,
                       lambda: str(a.atom_type))
     self.assertTrue(all([isinstance(b, to.Bond) for b in a.bonds]))
     self.assertTrue(all([isinstance(an, to.Angle) for an in a.angles]))
     self.assertTrue(all([isinstance(d, to.Dihedral) for d in a.dihedrals]))
     self.assertEqual(len(a.angle_partners), 3)
     self.assertEqual(len(a.angles), 9)
     self.assertEqual(len(a.bond_partners), 4)
     self.assertEqual(len(a.bonds), 4)
     self.assertEqual(len(a.cmaps), 0)
     self.assertEqual(len(a.dihedral_partners), 5)
     self.assertEqual(len(a.dihedrals), 14)
     self.assertEqual(len(a.impropers), 0)
     self.assertEqual(len(a.name), 1)
     self.assertEqual(len(a.props), 3)
     self.assertEqual(len(a.residue), 12)
     self.assertEqual(len(a.segid), 3)
     self.assertEqual(len(a.urey_bradleys), 0)
     # Check attributes of the psf file
     self.assertEqual(len(cpsf.acceptors), 4)
     self.assertEqual(len(cpsf.angles), 57)
     self.assertEqual(len(cpsf.atoms), 33)
     self.assertEqual(len(cpsf.bonds), 32)
     self.assertEqual(len(cpsf.cmaps), 1)
     self.assertEqual(len(cpsf.dihedrals), 74)
     self.assertEqual(len(cpsf.donors), 5)
     self.assertEqual(len(cpsf.flags), 2)
     self.assertEqual(len(cpsf.groups), 9)
     self.assertEqual(len(cpsf.impropers), 5)
     self.assertEqual(len(cpsf.residues), 3)
     self.assertEqual(len(cpsf.title), 2)
     # Check the __contains__ methods of valence terms (make sure the correct
     # number of atoms are in each valence term)
     atoms = cpsf.atoms
     bonds = cpsf.bonds
     for bond in cpsf.bonds:
         self.assertEqual(sum([int(a in bond) for a in atoms]), 2)
     # Other valence terms can also contain bonds
     for i, angle in enumerate(cpsf.angles):
         self.assertEqual(sum([int(a in angle) for a in atoms]), 3)
         self.assertEqual(sum([int(b in angle) for b in bonds]), 2)
     for dih in cpsf.dihedrals:
         self.assertEqual(sum([int(a in dih) for a in atoms]), 4)
         self.assertEqual(sum([int(b in dih) for b in bonds]), 3)
     for imp in cpsf.impropers:
         self.assertEqual(sum([int(a in imp) for a in atoms]), 4)
         self.assertEqual(sum([int(b in imp) for b in bonds]), 3)
     for cmap in cpsf.cmaps:
         self.assertEqual(sum([int(a in cmap) for a in atoms]), 5)
         self.assertEqual(sum([int(b in cmap) for b in bonds]), 4)