Task: Correctly assign CMAPs to torsions across multiple CMAPTorsionForce sections (openmm/openmm#4852)

org: openmm
repo: openmm
pr_number: 4852
issue_title: Correctly assign CMAPs to torsions across multiple CMAPTorsionForce sections
issue_body: Should fix #4850.  Adds a test that would have caught the issue.
resolved_issues: number: 4850
title: Multiple CMAPTorsionForce sections result in incorrect map assignment
body: Currently, if two separate `<CMAPTorsionForce>` sections are present in a force field, as can happen if two force field files with CMAPs are being combined, OpenMM will create a single `CMAPTorsionForce` in resulting systems.  However, the indices of `map` attributes of any `<Torsion>` tags in `<CMAPTorsionForce>` sections other than the first will point to `<Map>` entries starting from the first section instead of the section that they are a part of.  For example, if
```
<CMAPTorsionForce>
    <Map>1 2 3 4</Map>
    <Torsion map="0" class1="A" class2="A" class3="A" class4="A" class5="B" />
</CMAPTorsionForce>
```
is followed by
```
<CMAPTorsionForce>
    <Map>5 6 7 8</Map>
    <Torsion map="0" class1="A" class2="A" class3="A" class4="B" class5="B" />
</CMAPTorsionForce>
```
then the `<Torsion>` in the second section points to the `<Map>` in the first section.  I would expect this `<Torsion>` to refer to the `<Map>` in *its own* section.  If that is the desired behavior, I will submit a PR with a fix (just an offset of the map index to point to the start of a section's own maps) and a new test case.  I wanted to check because CMAPs work differently from other bonded forces in that the parameters are defined "out-of-band" rather than with each entry, and I don't know if we want to provide any facility for a `<Torsion>` to refer to a `<Map>` in another section.

## IMPORTANT INSTRUCTIONS

1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory
2. If you edit a c++ file, you MUST run 'make -j4 && make install" inside the build directory

Reference solution:
fix_patch: diff --git a/wrappers/python/openmm/app/forcefield.py b/wrappers/python/openmm/app/forcefield.py
index a222355f85..79f21f22ab 100644
--- a/wrappers/python/openmm/app/forcefield.py
+++ b/wrappers/python/openmm/app/forcefield.py
@@ -2392,6 +2392,7 @@ def parseElement(element, ff):
             ff.registerGenerator(generator)
         else:
             generator = existing[0]
+        mapOffset = len(generator.maps)
         for map in element.findall('Map'):
             values = [float(x) for x in map.text.split()]
             size = sqrt(len(values))
@@ -2401,7 +2402,7 @@ def parseElement(element, ff):
         for torsion in element.findall('Torsion'):
             types = ff._findAtomTypes(torsion.attrib, 5)
             if None not in types:
-                generator.torsions.append(CMAPTorsion(types, int(torsion.attrib['map'])))
+                generator.torsions.append(CMAPTorsion(types, int(torsion.attrib['map']) + mapOffset))
 
     def createForce(self, sys, data, nonbondedMethod, nonbondedCutoff, args):
         existing = [f for f in sys.getForces() if type(f) == mm.CMAPTorsionForce]