Currently, code that handles rigid bodies does it by taking a list consisting of both RigidBody particles and non-rigid body XYZR particles along with a Refiner to turn the rigid bodies into XYZR particles. This has several disadvantages:
- it seems to confuse the hell out of everyone
- it forces all rigid bodies to use the same refiner
- it means that you have to pass a completely different set of particles if some of them happen to be rigid than if none are rigid
I propose a new standard type of interface, namely, simply taking all the XYZR particles of interest, whether or not they happen to be part of a rigid body. That is, if you have some rigid proteins and some non-rigid proteins and are representing everything with all atoms, you simply pass all the atoms.
I think this has the following advantages:
- the user no longer has to worry about whether things are rigid bodies or not, certain code just runs faster when they are
- the user doesn't have to change the set of particles passed when moving to rigid bodies
It has the following disadvantages
- code that takes advantage of rigid bodies is more complicated as it has to group the particles into rigid bodies: this is only a few lines of code and can be factored out, so it doesn't seem too bad
- code that takes advantage of rigid body has to do more work. I don't think the extra work will be that large in practice, but am not yet sure
Typical things affected would be
- ExcludedVolumeRestraint
- RigidClosePairFinder
- perhaps FitRestraint
Thoughts?