-
Notifications
You must be signed in to change notification settings - Fork 164
Closed
Description
Thank you for all your hard work maintaining this project! I recently ran into an issue recently using AmberParameterSet from parmed.amber to write wildcard dihedrals to a file. The dihedrals written are not properly sorted such that wildcard atoms appear only at the beginning.
The offending lines of code can be found here, or as follows:
for (a1, a2, a3, a4), typ in self.improper_periodic_types.items():
# Make sure wild-cards come at the beginning
if a2 == 'X':
assert a4 == 'X', 'Malformed generic improper!'
a1, a2, a3, a4 = a2, a4, a3, a1
elif a4 == 'X':
a1, a2, a3, a4 = a4, a1, a3, a2
a1, a2, a4 = sorted([a1, a2, a4])
if (a1, a2, a3, a4) in written_impropers:
if written_impropers[(a1, a2, a3, a4)] != typ:
raise ValueError('Multiple impropers with the same atom set not allowed')
continue
outfile.write(
f'{a1:<2}-{a2:<2}-{a3:<2}-{a4:<2} {typ.phi_k:14.8f} {typ.phase:8.3f} {typ.per:5.1f}\n'
)
written_impropers[(a1, a2, a3, a4)] = typ
outfile.write('\n')The first two if cases reorder a1, a2, and a4 such that wildcard atoms occur at the beginning. However, the list is then resorted as sorted([a1, a2, a4]) which typically places the wildcard "X" at the end of the list after many common atom types.
PR with a quick fix incoming promptly.
Metadata
Metadata
Assignees
Labels
No labels