Generally, while parsing a PDB, using AMBER's LEAP tool, LEAP will automatically add any missing heavy atoms to residues that it "knows" about. This is is not the case with simtk.openmm.app.modeller.
For example, the following code:
pdb = PDBFile('2SRC.pdb')
forceField = ForceField('amber99sb.xml', 'tip3p.xml')
modeller = Modeller(pdb.topology, pdb.positions)
fails with the slightly left-field message:
Traceback (most recent call last):
File "TypicalProtocol.py", line 35, in <module>
File "/usr/local/lib/python2.6/dist-packages/simtk/openmm/app/modeller.py", line 669, in addHydrogens
system = forcefield.createSystem(newTopology, rigidWater=False)
File "/usr/local/lib/python2.6/dist-packages/simtk/openmm/app/forcefield.py", line 309, in createSystem
raise ValueError('No template found for residue %d (%s)' % (res.index+1, res.name))
ValueError: No template found for residue 340 (LYS)
The problem here is that LYS A 423 is missing the following atoms; CG,CD,CE,NZ. Generally, LEAP can reconstruct a residue just from just the backbone atoms.
It should not be too hard to use the corresponding Residue node in the associated force field xml, to add any missing atoms in, but given that there is no coordinate information, it may required some form of heuristic.