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
406105ef
"serialization/vscode:/vscode.git/clone" did not exist on "18295108c640e967db9043627fd707aa32b05e12"
Commit
406105ef
authored
Aug 14, 2016
by
Rafal P. Wiewiora
Browse files
add new proposed code for impropers
parent
27550631
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
45 additions
and
8 deletions
+45
-8
wrappers/python/simtk/openmm/app/forcefield.py
wrappers/python/simtk/openmm/app/forcefield.py
+45
-8
No files found.
wrappers/python/simtk/openmm/app/forcefield.py
View file @
406105ef
...
@@ -467,6 +467,7 @@ class ForceField(object):
...
@@ -467,6 +467,7 @@ class ForceField(object):
def
__init__
(
self
):
def
__init__
(
self
):
self
.
atomType
=
{}
self
.
atomType
=
{}
self
.
atomParameters
=
{}
self
.
atomParameters
=
{}
self
.
atomTemplateIndexes
=
{}
self
.
atoms
=
[]
self
.
atoms
=
[]
self
.
excludeAtomWith
=
[]
self
.
excludeAtomWith
=
[]
self
.
virtualSites
=
{}
self
.
virtualSites
=
{}
...
@@ -494,6 +495,7 @@ class ForceField(object):
...
@@ -494,6 +495,7 @@ class ForceField(object):
for
atom
,
match
in
zip
(
residue
.
atoms
(),
matches
):
for
atom
,
match
in
zip
(
residue
.
atoms
(),
matches
):
self
.
atomType
[
atom
]
=
template
.
atoms
[
match
].
type
self
.
atomType
[
atom
]
=
template
.
atoms
[
match
].
type
self
.
atomParameters
[
atom
]
=
template
.
atoms
[
match
].
parameters
self
.
atomParameters
[
atom
]
=
template
.
atoms
[
match
].
parameters
self
.
atomTemplateIndexes
[
atom
]
=
match
for
site
in
template
.
virtualSites
:
for
site
in
template
.
virtualSites
:
if
match
==
site
.
index
:
if
match
==
site
.
index
:
self
.
virtualSites
[
atom
]
=
(
site
,
[
matchAtoms
[
i
].
index
for
i
in
site
.
atoms
],
matchAtoms
[
site
.
excludeWith
].
index
)
self
.
virtualSites
[
atom
]
=
(
site
,
[
matchAtoms
[
i
].
index
for
i
in
site
.
atoms
],
matchAtoms
[
site
.
excludeWith
].
index
)
...
@@ -1875,24 +1877,59 @@ class PeriodicTorsionGenerator(object):
...
@@ -1875,24 +1877,59 @@ class PeriodicTorsionGenerator(object):
types3
=
tordef
.
types3
types3
=
tordef
.
types3
types4
=
tordef
.
types4
types4
=
tordef
.
types4
hasWildcard
=
(
wildcard
in
(
types1
,
types2
,
types3
,
types4
))
hasWildcard
=
(
wildcard
in
(
types1
,
types2
,
types3
,
types4
))
if
(
types1
,
types2
,
types3
,
types4
).
count
(
wildcard
)
==
2
:
hasTwoWildcards
=
True
else
:
hasTwoWildcards
=
False
if
match
is
not
None
and
hasWildcard
:
if
match
is
not
None
and
hasWildcard
:
# Prefer specific definitions over ones with wildcards
# Prefer specific definitions over ones with wildcards
continue
continue
if
type1
in
types1
:
if
type1
in
types1
:
for
(
t2
,
t3
,
t4
)
in
itertools
.
permutations
(((
type2
,
1
),
(
type3
,
2
),
(
type4
,
3
))):
for
(
t2
,
t3
,
t4
)
in
itertools
.
permutations
(((
type2
,
1
),
(
type3
,
2
),
(
type4
,
3
))):
if
t2
[
0
]
in
types2
and
t3
[
0
]
in
types3
and
t4
[
0
]
in
types4
:
if
t2
[
0
]
in
types2
and
t3
[
0
]
in
types3
and
t4
[
0
]
in
types4
:
# Workaround to be more consistent with AMBER. It uses wildcards to define most of its
# topology atom indexes
# impropers, which leaves the ordering ambiguous. It then follows some bizarre rules
# to pick the order.
a1
=
torsion
[
t2
[
1
]]
a1
=
torsion
[
t2
[
1
]]
a2
=
torsion
[
t3
[
1
]]
a2
=
torsion
[
t3
[
1
]]
a4
=
torsion
[
t4
[
1
]]
# residue indexes
r1
=
data
.
atoms
[
a1
].
residue
.
index
r2
=
data
.
atoms
[
a2
].
residue
.
index
r4
=
data
.
atoms
[
a4
].
residue
.
index
# template atom indexes
ta1
=
data
.
atomTemplateIndexes
[
data
.
atoms
[
a1
]]
ta2
=
data
.
atomTemplateIndexes
[
data
.
atoms
[
a2
]]
ta4
=
data
.
atomTemplateIndexes
[
data
.
atoms
[
a4
]]
# elements
e1
=
data
.
atoms
[
a1
].
element
e1
=
data
.
atoms
[
a1
].
element
e2
=
data
.
atoms
[
a2
].
element
e2
=
data
.
atoms
[
a2
].
element
if
e1
==
e2
and
a1
>
a2
:
e4
=
data
.
atoms
[
a4
].
element
# the following for AMBER only - TODO: decide how to pass this in ffxml's
if
isAmber
:
if
not
hasWildcard
:
if
t2
[
0
]
==
t4
[
0
]
and
(
r1
>
r4
or
(
r1
==
r4
and
ta1
>
ta4
)):
(
a1
,
a4
)
=
(
a4
,
a1
)
if
t3
[
0
]
==
t4
[
0
]
and
(
r2
>
r4
or
(
r2
==
r4
and
ta2
>
ta4
)):
(
a2
,
a4
)
=
(
a4
,
a2
)
if
t2
[
0
]
==
t3
[
0
]
and
(
r1
>
r2
or
(
r1
==
r2
and
ta1
>
ta2
)):
(
a1
,
a2
)
=
(
a2
,
a1
)
(
a1
,
a2
)
=
(
a2
,
a1
)
elif
e1
!=
elem
.
carbon
and
(
e2
==
elem
.
carbon
or
e1
.
mass
<
e2
.
mass
):
else
:
if
e1
==
e4
and
(
r1
>
r4
or
(
r1
==
r4
and
ta1
>
ta4
)):
(
a1
,
a4
)
=
(
a4
,
a1
)
if
e2
==
e4
and
(
r2
>
r4
or
(
r2
==
r4
and
ta2
>
ta4
)):
(
a2
,
a4
)
=
(
a4
,
a2
)
if
(
r1
>
r2
or
(
r1
==
r2
and
ta1
>
ta2
)):
(
a1
,
a2
)
=
(
a2
,
a1
)
(
a1
,
a2
)
=
(
a2
,
a1
)
match
=
(
a1
,
a2
,
torsion
[
0
],
torsion
[
t4
[
1
]],
tordef
)
# the following is OpenMM default
else
:
if
t2
[
0
]
==
t4
[
0
]
and
(
r1
>
r4
or
(
r1
==
r4
and
ta1
>
ta4
)):
(
a1
,
a4
)
=
(
a4
,
a1
)
if
t3
[
0
]
==
t4
[
0
]
and
(
r2
>
r4
or
(
r2
==
r4
and
ta2
>
ta4
)):
(
a2
,
a4
)
=
(
a4
,
a2
)
if
t2
[
0
]
==
t3
[
0
]
and
(
r1
>
r2
or
(
r1
==
r2
and
ta1
>
ta2
)):
(
a1
,
a2
)
=
(
a2
,
a1
)
if
hasTwoWildcards
and
(
r1
>
r2
or
(
r1
==
r2
and
ta1
>
ta2
)):
(
a1
,
a2
)
=
(
a2
,
a1
)
match
=
(
a1
,
a2
,
torsion
[
0
],
a4
,
tordef
)
break
break
if
match
is
not
None
:
if
match
is
not
None
:
(
a1
,
a2
,
a3
,
a4
,
tordef
)
=
match
(
a1
,
a2
,
a3
,
a4
,
tordef
)
=
match
...
...
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