Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
tsoc
openmm
Commits
c1cae06a
"vscode:/vscode.git/clone" did not exist on "116aed3927066b0a53eba929110d73f3dafb64bd"
Commit
c1cae06a
authored
Apr 20, 2015
by
Jason Swails
Browse files
Fixups and simplifications to PSF parser with inscodes
parent
b21e3182
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
8 additions
and
185 deletions
+8
-185
wrappers/python/simtk/openmm/app/charmmpsffile.py
wrappers/python/simtk/openmm/app/charmmpsffile.py
+1
-173
wrappers/python/simtk/openmm/app/internal/charmm/topologyobjects.py
...ython/simtk/openmm/app/internal/charmm/topologyobjects.py
+7
-12
No files found.
wrappers/python/simtk/openmm/app/charmmpsffile.py
View file @
c1cae06a
...
...
@@ -195,16 +195,13 @@ class CharmmPsfFile(object):
atom_list
=
AtomList
()
for
i
in
xrange
(
natom
):
words
=
psfsections
[
'NATOM'
][
1
][
i
].
split
()
atid
=
int
(
words
[
0
])
if
atid
!=
i
+
1
:
raise
CharmmPSFError
(
'Nonsequential atoms detected!'
)
system
=
words
[
1
]
rematch
=
_resre
.
match
(
words
[
2
])
if
not
rematch
:
raise
RuntimeError
(
'Could not parse residue number %s'
%
words
[
2
])
resid
,
inscode
=
rematch
.
groups
()
resid
=
conv
(
resid
,
int
,
'residue number'
)
resid
=
int
(
resid
)
resname
=
words
[
3
]
name
=
words
[
4
]
attype
=
words
[
5
]
...
...
@@ -451,175 +448,6 @@ class CharmmPsfFile(object):
line
=
psf
.
readline
().
strip
()
return
title
,
pointers
,
data
def
writePsf
(
self
,
dest
,
vmd
=
False
):
"""
Writes a PSF file from the stored molecule
Parameters:
- dest (str or file-like) : The place to write the output PSF file.
If it has a "write" attribute, it will be used to print the
PSF file. Otherwise, it will be treated like a string and a
file will be opened, printed, then closed
- vmd (bool) : If True, it will write out a PSF in the format that
VMD prints it in (i.e., no NUMLP/NUMLPH or MOLNT sections)
Example:
>>> cs = CharmmPsfFile('testfiles/test.psf')
>>> cs.writePsf('testfiles/test2.psf')
"""
# See if this is an extended format
ext
=
'EXT'
in
self
.
flags
own_handle
=
False
# Index the atoms and residues
self
.
residue_list
.
assign_indexes
()
self
.
atom_list
.
assign_indexes
()
if
not
hasattr
(
dest
,
'write'
):
own_handle
=
True
dest
=
open
(
dest
,
'w'
)
# Assign the formats we need to write with
if
ext
:
atmfmt1
=
(
'%10d %-8s %-8i %-8s %-8s %4d %10.6f %13.4f'
+
11
*
' '
)
atmfmt2
=
(
'%10d %-8s %-8i %-8s %-8s %-4s %10.6f %13.4f'
+
11
*
' '
)
intfmt
=
'%10d'
# For pointers
else
:
atmfmt1
=
(
'%8d %-4s %-4i %-4s %-4s %4d %10.6f %13.4f'
+
11
*
' '
)
atmfmt2
=
(
'%8d %-4s %-4i %-4s %-4s %-4s %10.6f %13.4f'
+
11
*
' '
)
intfmt
=
'%8d'
# For pointers
# Now print the header then the title
dest
.
write
(
'PSF '
+
' '
.
join
(
self
.
flags
)
+
'
\n
'
)
dest
.
write
(
'
\n
'
)
dest
.
write
(
intfmt
%
len
(
self
.
title
)
+
' !NTITLE
\n
'
)
dest
.
write
(
'
\n
'
.
join
(
self
.
title
)
+
'
\n\n
'
)
# Now time for the atoms
dest
.
write
(
intfmt
%
len
(
self
.
atom_list
)
+
' !NATOM
\n
'
)
# atmfmt1 is for CHARMM format (i.e., atom types are integers)
# atmfmt is for XPLOR format (i.e., atom types are strings)
for
i
,
atom
in
enumerate
(
self
.
atom_list
):
if
isinstance
(
atom
.
attype
,
str
):
fmt
=
atmfmt2
else
:
fmt
=
atmfmt1
atmstr
=
fmt
%
(
i
+
1
,
atom
.
system
,
atom
.
residue
.
resnum
,
atom
.
residue
.
resname
,
atom
.
name
,
atom
.
attype
,
atom
.
charge
,
atom
.
mass
)
dest
.
write
(
atmstr
+
' '
.
join
(
atom
.
props
)
+
'
\n
'
)
dest
.
write
(
'
\n
'
)
# Bonds
dest
.
write
(
intfmt
%
len
(
self
.
bond_list
)
+
' !NBOND: bonds
\n
'
)
for
i
,
bond
in
enumerate
(
self
.
bond_list
):
dest
.
write
((
intfmt
*
2
)
%
(
bond
.
atom1
.
idx
+
1
,
bond
.
atom2
.
idx
+
1
))
if
i
%
4
==
3
:
# Write 4 bonds per line
dest
.
write
(
'
\n
'
)
# See if we need to terminate
if
len
(
self
.
bond_list
)
%
4
!=
0
or
len
(
self
.
bond_list
)
==
0
:
dest
.
write
(
'
\n
'
)
dest
.
write
(
'
\n
'
)
# Angles
dest
.
write
(
intfmt
%
len
(
self
.
angle_list
)
+
' !NTHETA: angles
\n
'
)
for
i
,
angle
in
enumerate
(
self
.
angle_list
):
dest
.
write
((
intfmt
*
3
)
%
(
angle
.
atom1
.
idx
+
1
,
angle
.
atom2
.
idx
+
1
,
angle
.
atom3
.
idx
+
1
)
)
if
i
%
3
==
2
:
# Write 3 angles per line
dest
.
write
(
'
\n
'
)
# See if we need to terminate
if
len
(
self
.
angle_list
)
%
3
!=
0
or
len
(
self
.
angle_list
)
==
0
:
dest
.
write
(
'
\n
'
)
dest
.
write
(
'
\n
'
)
# Dihedrals
dest
.
write
(
intfmt
%
len
(
self
.
dihedral_list
)
+
' !NPHI: dihedrals
\n
'
)
for
i
,
dih
in
enumerate
(
self
.
dihedral_list
):
dest
.
write
((
intfmt
*
4
)
%
(
dih
.
atom1
.
idx
+
1
,
dih
.
atom2
.
idx
+
1
,
dih
.
atom3
.
idx
+
1
,
dih
.
atom4
.
idx
+
1
)
)
if
i
%
2
==
1
:
# Write 2 dihedrals per line
dest
.
write
(
'
\n
'
)
# See if we need to terminate
if
len
(
self
.
dihedral_list
)
%
2
!=
0
or
len
(
self
.
dihedral_list
)
==
0
:
dest
.
write
(
'
\n
'
)
dest
.
write
(
'
\n
'
)
# Impropers
dest
.
write
(
intfmt
%
len
(
self
.
improper_list
)
+
' !NIMPHI: impropers
\n
'
)
for
i
,
imp
in
enumerate
(
self
.
improper_list
):
dest
.
write
((
intfmt
*
4
)
%
(
imp
.
atom1
.
idx
+
1
,
imp
.
atom2
.
idx
+
1
,
imp
.
atom3
.
idx
+
1
,
imp
.
atom4
.
idx
+
1
)
)
if
i
%
2
==
1
:
# Write 2 dihedrals per line
dest
.
write
(
'
\n
'
)
# See if we need to terminate
if
len
(
self
.
improper_list
)
%
2
!=
0
or
len
(
self
.
improper_list
)
==
0
:
dest
.
write
(
'
\n
'
)
dest
.
write
(
'
\n
'
)
# Donor section
dest
.
write
(
intfmt
%
len
(
self
.
donor_list
)
+
' !NDON: donors
\n
'
)
for
i
,
don
in
enumerate
(
self
.
donor_list
):
dest
.
write
((
intfmt
*
2
)
%
(
don
.
atom1
.
idx
+
1
,
don
.
atom2
.
idx
+
1
))
if
i
%
4
==
3
:
# 4 donors per line
dest
.
write
(
'
\n
'
)
if
len
(
self
.
donor_list
)
%
4
!=
0
or
len
(
self
.
donor_list
)
==
0
:
dest
.
write
(
'
\n
'
)
dest
.
write
(
'
\n
'
)
# Acceptor section
dest
.
write
(
intfmt
%
len
(
self
.
acceptor_list
)
+
' !NACC: acceptors
\n
'
)
for
i
,
acc
in
enumerate
(
self
.
acceptor_list
):
dest
.
write
((
intfmt
*
2
)
%
(
acc
.
atom1
.
idx
+
1
,
acc
.
atom2
.
idx
+
1
))
if
i
%
4
==
3
:
# 4 donors per line
dest
.
write
(
'
\n
'
)
if
len
(
self
.
acceptor_list
)
%
4
!=
0
or
len
(
self
.
acceptor_list
)
==
0
:
dest
.
write
(
'
\n
'
)
dest
.
write
(
'
\n
'
)
# NNB section ??
dest
.
write
(
intfmt
%
0
+
' !NNB
\n\n
'
)
for
i
in
range
(
len
(
self
.
atom_list
)):
dest
.
write
(
intfmt
%
0
)
if
i
%
8
==
7
:
# Write 8 0's per line
dest
.
write
(
'
\n
'
)
if
len
(
self
.
atom_list
)
%
8
!=
0
:
dest
.
write
(
'
\n
'
)
dest
.
write
(
'
\n
'
)
# Group section
dest
.
write
((
intfmt
*
2
)
%
(
len
(
self
.
group_list
),
self
.
group_list
.
nst2
))
dest
.
write
(
' !NGRP NST2
\n
'
)
for
i
,
gp
in
enumerate
(
self
.
group_list
):
dest
.
write
((
intfmt
*
3
)
%
(
gp
.
bs
,
gp
.
type
,
gp
.
move
))
if
i
%
3
==
2
:
dest
.
write
(
'
\n
'
)
if
len
(
self
.
group_list
)
%
3
!=
0
or
len
(
self
.
group_list
)
==
0
:
dest
.
write
(
'
\n
'
)
dest
.
write
(
'
\n
'
)
# The next two sections are never found in VMD prmtops...
if
not
vmd
:
# Molecule section; first set molecularity
set_molecules
(
self
.
atom_list
)
mollist
=
[
a
.
marked
for
a
in
self
.
atom_list
]
dest
.
write
(
intfmt
%
max
(
mollist
)
+
' !MOLNT
\n
'
)
for
i
,
atom
in
enumerate
(
self
.
atom_list
):
dest
.
write
(
intfmt
%
atom
.
marked
)
if
i
%
8
==
7
:
dest
.
write
(
'
\n
'
)
if
len
(
self
.
atom_list
)
%
8
!=
0
:
dest
.
write
(
'
\n
'
)
dest
.
write
(
'
\n
'
)
# NUMLP/NUMLPH section
dest
.
write
((
intfmt
*
2
)
%
(
0
,
0
)
+
' !NUMLP NUMLPH
\n
'
)
dest
.
write
(
'
\n
'
)
# CMAP section
dest
.
write
(
intfmt
%
len
(
self
.
cmap_list
)
+
' !NCRTERM: cross-terms
\n
'
)
for
i
,
cmap
in
enumerate
(
self
.
cmap_list
):
dest
.
write
((
intfmt
*
4
)
%
(
cmap
.
atom1
.
idx
+
1
,
cmap
.
atom2
.
idx
+
1
,
cmap
.
atom3
.
idx
+
1
,
cmap
.
atom4
.
idx
+
1
)
)
if
cmap
.
consecutive
:
dest
.
write
((
intfmt
*
4
)
%
(
cmap
.
atom2
.
idx
+
1
,
cmap
.
atom3
.
idx
+
1
,
cmap
.
atom4
.
idx
+
1
,
cmap
.
atom5
.
idx
+
1
)
)
else
:
dest
.
write
((
intfmt
*
4
)
%
(
cmap
.
atom5
.
idx
+
1
,
cmap
.
atom6
.
idx
+
1
,
cmap
.
atom7
.
idx
+
1
,
cmap
.
atom8
.
idx
+
1
)
)
dest
.
write
(
'
\n
'
)
# Done!
# If we opened our own handle, close it
if
own_handle
:
dest
.
close
()
def
loadParameters
(
self
,
parmset
):
"""
Loads parameters from a parameter set that was loaded via CHARMM RTF,
...
...
wrappers/python/simtk/openmm/app/internal/charmm/topologyobjects.py
View file @
c1cae06a
...
...
@@ -467,22 +467,17 @@ class ResidueList(list):
Returns:
The Atom instance created and added to the list of residues
"""
if
self
.
_last_residue
is
None
:
lr
=
self
.
_last_residue
if
lr
is
None
:
res
=
self
.
_last_residue
=
Residue
(
resname
,
resnum
,
inscode
)
list
.
append
(
self
,
res
)
elif
(
self
.
_last_residue
!=
(
resname
,
resnum
,
inscode
)
or
system
!=
self
.
_last_residue
.
system
):
if
(
self
.
_last_residue
.
idx
==
resnum
and
self
.
_last_residue
.
system
==
system
and
self
.
_last_residue
.
inscode
==
inscode
):
lresname
=
self
.
_last_residue
.
resname
warnings
.
warn
(
'Residue %d split into separate residues %s '
'and %s'
%
(
resnum
,
lresname
,
resname
),
SplitResidueWarning
)
res
=
self
.
_last_residue
=
Residue
(
resname
,
resnum
)
elif
(
lr
.
resname
!=
resname
or
lr
.
idx
!=
resname
or
lr
.
inscode
!=
inscode
or
system
!=
lr
.
system
):
res
=
self
.
_last_residue
=
Residue
(
resname
,
resnum
,
inscode
)
res
.
system
=
system
list
.
append
(
self
,
res
)
else
:
res
=
self
.
_last_residue
res
=
lr
atom
=
Atom
(
system
,
name
,
attype
,
float
(
charge
),
float
(
mass
),
props
)
res
.
add_atom
(
atom
)
return
atom
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment