From e9158016f4017dd1e9942492ed8c9d7b96d2fd37 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 18 Jan 2016 17:57:17 -0500 Subject: [PATCH 01/62] Fix round-trip tests Both energies *used* to be calculated with the same system!! This fixes that. --- test/test_openmm_amber.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_openmm_amber.py b/test/test_openmm_amber.py index 7b3cf665d..569061345 100644 --- a/test/test_openmm_amber.py +++ b/test/test_openmm_amber.py @@ -194,7 +194,7 @@ def test_round_trip(self): system = parm.createSystem() system2 = load_topology(parm.topology, system).createSystem() con1 = mm.Context(system, mm.VerletIntegrator(0.001), CPU) - con2 = mm.Context(system, mm.VerletIntegrator(0.001), CPU) + con2 = mm.Context(system2, mm.VerletIntegrator(0.001), CPU) con1.setPositions(parm.positions) con2.setPositions(parm.positions) e1 = energy_decomposition(parm, con1) @@ -214,7 +214,7 @@ def test_round_trip_xml(self): f.write(mm.XmlSerializer.serialize(system)) system2 = load_topology(parm.topology, fname).createSystem() con1 = mm.Context(system, mm.VerletIntegrator(0.001), CPU) - con2 = mm.Context(system, mm.VerletIntegrator(0.001), CPU) + con2 = mm.Context(system2, mm.VerletIntegrator(0.001), CPU) con1.setPositions(parm.positions) con2.setPositions(parm.positions) e1 = energy_decomposition(parm, con1) From 84c3af9400353071ce170f82c59fa279aa4ff52c Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 12:27:02 -0500 Subject: [PATCH 02/62] Add a couple tests for ChamberParm.from_structure conversions from GROMACS topology. There is a fairly serious bug in assigning 1-4 nonbonded parameters (particularly the L-J parameters) that caused the energy to differ pretty substantially from what the equivalent GROMACS system reported. --- test/test_format_conversions.py | 87 ++++++++++++++++++++++++++++----- 1 file changed, 74 insertions(+), 13 deletions(-) diff --git a/test/test_format_conversions.py b/test/test_format_conversions.py index bbf6325e0..10e88e2b9 100644 --- a/test/test_format_conversions.py +++ b/test/test_format_conversions.py @@ -7,12 +7,12 @@ from parmed.exceptions import GromacsWarning from parmed.gromacs._gromacsfile import GromacsFile from parmed.utils.six.moves import zip, range -from parmed import unit as u +from parmed import unit as u, topologyobjects as to from parmed.tools import addLJType import unittest from utils import (get_fn, get_saved_fn, diff_files, TestCaseRelative, FileIOTestCase, HAS_GROMACS, CPU, has_openmm as HAS_OPENMM, - mm, app, equal_atoms) + mm, app, equal_atoms, Reference) import warnings class TestAmberToGromacs(FileIOTestCase, TestCaseRelative): @@ -55,7 +55,7 @@ def test_benzene_cyclohexane(self): np.testing.assert_allclose(gro.box, parm.box) np.testing.assert_allclose(top.box, parm.box) -@unittest.skipIf(not HAS_GROMACS, "Cannot run GROMACS tests without GROMACS") +@unittest.skipUnless(HAS_GROMACS, "Cannot run GROMACS tests without GROMACS") class TestGromacsToAmber(FileIOTestCase, TestCaseRelative): """ Tests converting Gromacs top/gro files to Amber """ @@ -100,16 +100,77 @@ def test_simple(self): def test_chamber(self): """ Tests converting standard Gromacs system into Chamber prmtop """ + fn = get_fn('1aki.charmm27_fromgmx.parm7') top = load_file(get_fn('1aki.charmm27.solv.top'), xyz=get_fn('1aki.charmm27.solv.gro')) parm = amber.ChamberParm.from_structure(top) - parm.write_parm(get_fn('1aki.charmm27_fromgmx.parm7', written=True)) - self.assertTrue(diff_files(get_fn('1aki.charmm27_fromgmx.parm7', - written=True), - get_saved_fn('1aki.charmm27_fromgmx.parm7'), - relative_error=1e-8) + parm.write_parm(fn) + self.assertTrue( + diff_files(fn, get_saved_fn('1aki.charmm27_fromgmx.parm7'), + relative_error=1e-8) ) + @unittest.skipUnless(False, 'disabled for now') + def test_chamber_expanded_exclusions(self): + """ Tests converting Gromacs to Chamber parm w/ modified exceptions """ + # Now let's modify an exception parameter so that it needs type + # expansion, and ensure that it is handled correctly + top = load_file(get_fn('1aki.charmm27.solv.top'), + xyz=get_fn('1aki.charmm27.solv.gro')) + gsystem1 = top.createSystem(nonbondedCutoff=8*u.angstroms, + nonbondedMethod=app.PME) + gcon1 = mm.Context(gsystem1, mm.VerletIntegrator(1*u.femtosecond), + Reference) + gcon1.setPositions(top.positions) + top.adjust_types.append(to.NonbondedExceptionType(0, 0, 1)) + top.adjust_types.claim() + top.adjusts[10].type = top.adjust_types[-1] + gsystem2 = top.createSystem(nonbondedCutoff=8*u.angstroms, + nonbondedMethod=app.PME) + gcon2 = mm.Context(gsystem2, mm.VerletIntegrator(1*u.femtosecond), + Reference) + gcon2.setPositions(top.positions) + e1 = gcon1.getState(getEnergy=True).getPotentialEnergy() + e1 = e1.value_in_unit(u.kilocalories_per_mole) + e2 = gcon2.getState(getEnergy=True).getPotentialEnergy() + e2 = e2.value_in_unit(u.kilocalories_per_mole) + self.assertGreater(abs(e2 - e1), 1e-2) + # Convert to chamber now + parm = amber.ChamberParm.from_structure(top) + asystem = parm.createSystem(nonbondedCutoff=8*u.angstroms, + nonbondedMethod=app.PME) + acon = mm.Context(asystem, mm.VerletIntegrator(1*u.femtosecond), + Reference) + acon.setPositions(top.positions) + e3 = acon.getState(getEnergy=True).getPotentialEnergy() + e3 = e3.value_in_unit(u.kilocalories_per_mole) + self.assertLess(abs(e1 - e3), 1e-2) + + @unittest.skipUnless(HAS_OPENMM, 'Cannot test without OpenMM') + def test_chamber_energies(self): + """ Tests converting Gromacs to Chamber parm calculated energies """ + # Now let's modify an exception parameter so that it needs type + # expansion, and ensure that it is handled correctly + top = load_file(get_fn('1aki.charmm27.solv.top'), + xyz=get_fn('1aki.charmm27.solv.gro')) + gsystem = top.createSystem(nonbondedCutoff=8*u.angstroms, + nonbondedMethod=app.PME) + gcon = mm.Context(gsystem, mm.VerletIntegrator(1*u.femtosecond), + Reference) + gcon.setPositions(top.positions) + eg = gcon.getState(getEnergy=True).getPotentialEnergy() + eg = eg.value_in_unit(u.kilocalories_per_mole) + # Convert to chamber now + parm = amber.ChamberParm.from_structure(top) + asystem = parm.createSystem(nonbondedCutoff=8*u.angstroms, + nonbondedMethod=app.PME) + acon = mm.Context(asystem, mm.VerletIntegrator(1*u.femtosecond), + Reference) + acon.setPositions(top.positions) + ea = acon.getState(getEnergy=True).getPotentialEnergy() + ea = ea.value_in_unit(u.kilocalories_per_mole) + self.assertLess(abs(eg - ea), 1e-2) + def test_geometric_combining_rule(self): """ Tests converting geom. comb. rule from Gromacs to Amber """ top = load_file(os.path.join(get_fn('05.OPLS'), 'topol.top'), @@ -130,7 +191,7 @@ def test_geometric_combining_rule(self): np.testing.assert_allclose(acoef, parm.parm_data['LENNARD_JONES_ACOEF']) np.testing.assert_allclose(bcoef, parm.parm_data['LENNARD_JONES_BCOEF']) - @unittest.skipIf(not HAS_OPENMM, "Cannot test without OpenMM") + @unittest.skipUnless(HAS_OPENMM, "Cannot test without OpenMM") def test_geometric_combining_rule_energy(self): """ Tests converting geom. comb. rule energy from Gromacs to Amber """ top = load_file(os.path.join(get_fn('05.OPLS'), 'topol.top'), @@ -153,7 +214,7 @@ def test_geometric_combining_rule_energy(self): self._check_energies(top, cong, parm, cona) - @unittest.skipIf(not HAS_OPENMM, "Cannot test without OpenMM") + @unittest.skipUnless(HAS_OPENMM, "Cannot test without OpenMM") def test_energy_simple(self): """ Check equal energies for Gromacs -> Amber conversion of Amber FF """ top = load_file(get_fn(os.path.join('03.AlaGlu', 'topol.top'))) @@ -173,7 +234,7 @@ def test_energy_simple(self): self._check_energies(top, cong, parm, cona) - @unittest.skipIf(not HAS_OPENMM, "Cannot test without OpenMM") + @unittest.skipUnless(HAS_OPENMM, "Cannot test without OpenMM") def test_energy_complicated(self): """ Check equal energies for Gmx -> Amber conversion of complex FF """ warnings.filterwarnings('ignore', category=GromacsWarning) @@ -259,7 +320,7 @@ def test_simple(self): # Make sure that written psf only contains unique torsions. self.assertEqual(nnormal+nimp, len(psf.dihedrals)) -@unittest.skipIf(not HAS_OPENMM, "Cannot test without OpenMM") +@unittest.skipUnless(HAS_OPENMM, "Cannot test without OpenMM") class TestOpenMMToAmber(FileIOTestCase, TestCaseRelative): """ Tests that OpenMM system/topology combo can be translated to other formats @@ -296,7 +357,7 @@ def _check_energies(self, parm1, con1, parm2, con2): else: self.assertRelativeEqual(ene2[term], ene1[term], places=5) -@unittest.skipIf(not HAS_OPENMM, "Cannot test without OpenMM") +@unittest.skipUnless(HAS_OPENMM, "Cannot test without OpenMM") class TestOpenMMToGromacs(FileIOTestCase, TestCaseRelative): """ Tests that OpenMM system/topology combo can be translated to other formats From d7213e987d44caf955e465be33856764d16e1c29 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 12:30:52 -0500 Subject: [PATCH 03/62] Fix the issue of mis-assigned 1-4 L-J parameters for ChamberParm.from_structure (particularly with GROMACS topology files -- CHARMM PSF/prm/rtf files worked fine already). This now passes the test, giving identical energies for both GROMACS and Chamber topologies when starting from a GROMACS topology file. --- parmed/amber/_amberparm.py | 28 ++++++++++++++++------------ parmed/amber/_chamberparm.py | 12 ++++++------ parmed/structure.py | 5 ----- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/parmed/amber/_amberparm.py b/parmed/amber/_amberparm.py index 2eb1ff4f6..cd3f3ec38 100644 --- a/parmed/amber/_amberparm.py +++ b/parmed/amber/_amberparm.py @@ -842,12 +842,12 @@ def has_NBFIX(self): If True, off-diagonal elements in the combined Lennard-Jones matrix exist. If False, they do not. """ + assert self.combining_rule in ('lorentz', 'geometric'), \ + "Unrecognized combining rule" if self.combining_rule == 'lorentz': comb_sig = lambda sig1, sig2: 0.5 * (sig1 + sig2) elif self.combining_rule == 'geometric': comb_sig = lambda sig1, sig2: sqrt(sig1 * sig2) -# else: - assert self.combining_rule in ('lorentz', 'geometric'), "Unrecognized combining rule" fac = 2**(-1/6) * 2 LJ_sigma = [x*fac for x in self.LJ_radius] pd = self.parm_data @@ -978,6 +978,8 @@ def omm_nonbonded_force(self, nonbondedMethod=None, hasnbfix = self.has_NBFIX() has1264 = 'LENNARD_JONES_CCOEF' in self.flag_list if not hasnbfix and not has1264 and not has1012: + if self.chamber: + self._modify_nonb_exceptions(nonbfrc, None) return nonbfrc # If we have NBFIX, omm_nonbonded_force returned a tuple @@ -1741,8 +1743,9 @@ def _modify_nonb_exceptions(self, nonbfrc, customforce): exclusions. The exceptions on the nonbonded force might need to be adjusted if off-diagonal modifications on the L-J matrix are present """ - # To get into this routine, we already needed to know that nbfix is - # present + # To get into this routine, either NBFIX is present OR this is a chamber + # prmtop and we need to pull the 1-4 L-J parameters from the + # LENNARD_JONES_14_A/BCOEF arrays length_conv = u.angstroms.conversion_factor_to(u.nanometers) ene_conv = u.kilocalories.conversion_factor_to(u.kilojoules) atoms = self.atoms @@ -1762,7 +1765,8 @@ def _modify_nonb_exceptions(self, nonbfrc, customforce): ee.value_in_unit(u.kilocalories_per_mole) == 0): # Copy this exclusion as-is... no need to modify the nonbfrc # exception parameters - customforce.addExclusion(i, j) + if customforce is not None: + customforce.addExclusion(i, j) continue # Figure out what the 1-4 scaling parameters were for this pair... unscaled_ee = sqrt(self.atoms[i].epsilon_14 * @@ -1788,7 +1792,8 @@ def _modify_nonb_exceptions(self, nonbfrc, customforce): epsilon = b / (2 * rmin**6) * ene_conv * one_scnb sigma = rmin * sigma_scale nonbfrc.setExceptionParameters(ii, i, j, qq, sigma, epsilon) - customforce.addExclusion(i, j) + if customforce is not None: + customforce.addExclusion(i, j) #=================================================== @@ -1862,12 +1867,11 @@ def _add_missing_13_14(self, ignore_inconsistent_vdw=False): scee = 1e10 else: scee = 1 / pair.type.chgscale - if (abs(rref - pair.type.rmin) > SMALL and + if ignore_inconsistent_vdw: + scnb = 1.0 + elif (abs(rref - pair.type.rmin) > SMALL and pair.type.epsilon != 0): - if ignore_inconsistent_vdw: - scnb = 1.0 - else: - raise TypeError('Cannot translate exceptions') + raise TypeError('Cannot translate exceptions') if (abs(scnb - dihedral.type.scnb) < SMALL and abs(scee - dihedral.type.scee) < SMALL): continue @@ -1875,7 +1879,7 @@ def _add_missing_13_14(self, ignore_inconsistent_vdw=False): scee = scnb = 1e10 newtype = _copy.copy(dihedral.type) newtype.scee = scee - newtype.scnb = scnb + newtype.scnb = scnb if not ignore_inconsistent_vdw else 1.0 dihedral.type = newtype newtype.list = self.dihedral_types self.dihedral_types.append(newtype) diff --git a/parmed/amber/_chamberparm.py b/parmed/amber/_chamberparm.py index f869bcef0..564dfdae3 100644 --- a/parmed/amber/_chamberparm.py +++ b/parmed/amber/_chamberparm.py @@ -193,10 +193,10 @@ def from_structure(cls, struct, copy=False): inst.LJ_14_radius = [0 for i in range(ntyp)] inst.LJ_14_depth = [0 for i in range(ntyp)] for atom in inst.atoms: - inst.LJ_radius[atom.nb_idx-1] = atom.atom_type.rmin - inst.LJ_depth[atom.nb_idx-1] = atom.atom_type.epsilon - inst.LJ_14_radius[atom.nb_idx-1] = atom.atom_type.rmin_14 - inst.LJ_14_depth[atom.nb_idx-1] = atom.atom_type.epsilon_14 + inst.LJ_radius[atom.nb_idx-1] = atom.rmin + inst.LJ_depth[atom.nb_idx-1] = atom.epsilon + inst.LJ_14_radius[atom.nb_idx-1] = atom.rmin_14 + inst.LJ_14_depth[atom.nb_idx-1] = atom.epsilon_14 inst._add_standard_flags() inst.pointers['NATOM'] = len(inst.atoms) inst.parm_data['POINTERS'][NATOM] = len(inst.atoms) @@ -692,8 +692,8 @@ def _set_nonbonded_tables(self, nbfixes=None): a1, a2 = pair.atom1, pair.atom2 i, j = sorted([a1.nb_idx - 1, a2.nb_idx - 1]) idx = data['NONBONDED_PARM_INDEX'][ntypes*i+j] - 1 - eps = sqrt(a1.epsilon_14 * a2.epsilon_14) - rmin = a1.rmin_14 + a2.rmin_14 + eps = pair.type.epsilon + rmin = pair.type.rmin rmin6 = rmin * rmin * rmin * rmin * rmin * rmin acoef = eps * rmin6*rmin6 bcoef = 2 * eps * rmin6 diff --git a/parmed/structure.py b/parmed/structure.py index bebdbc4fb..176ad0ee4 100644 --- a/parmed/structure.py +++ b/parmed/structure.py @@ -1737,7 +1737,6 @@ def createSystem(self, nonbondedMethod=None, ewaldErrorTolerance=0.0005, flexibleConstraints=True, verbose=False, - forceNBFIX=False, splitDihedrals=False): """ Construct an OpenMM System representing the topology described by the @@ -1800,10 +1799,6 @@ def createSystem(self, nonbondedMethod=None, of freedom will *still* be constrained). verbose : bool=False If True, the progress of this subroutine will be printed to stdout - forceNBFIX : bool=False - If True, the NBFIX code path will be executed even if no NBFIXes are - detected. Primarily for debugging, as this will be slower than - setting it to False. splitDihedrals : bool=False If True, the dihedrals will be split into two forces -- proper and impropers. This is primarily useful for debugging torsion parameter From 01663bafbce325fad33d8c420ea5fe37a639d172 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 12:36:01 -0500 Subject: [PATCH 04/62] Update a saved file. --- test/files/saved/1aki.charmm27_fromgmx.parm7 | 4636 +++++++++--------- 1 file changed, 2313 insertions(+), 2323 deletions(-) diff --git a/test/files/saved/1aki.charmm27_fromgmx.parm7 b/test/files/saved/1aki.charmm27_fromgmx.parm7 index 423ac5000..4eab3f5c9 100644 --- a/test/files/saved/1aki.charmm27_fromgmx.parm7 +++ b/test/files/saved/1aki.charmm27_fromgmx.parm7 @@ -1,11 +1,11 @@ -%VERSION VERSION_STAMP = V0001.000 DATE = 07/12/15 13:42:12 +%VERSION VERSION_STAMP = V0001.000 DATE = 01/19/16 12:19:04 %FLAG CTITLE %FORMAT(20a4) %FLAG POINTERS %FORMAT(10I8) 4960 35 2959 1025 3158 1389 3602 1789 0 0 - 14735 1129 1025 1389 1789 68 151 194 1 0 + 14735 1129 1025 1389 1789 68 151 185 1 0 0 0 0 0 0 0 0 1 24 0 0 %FLAG FORCE_FIELD_TYPE @@ -5360,23 +5360,21 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 4.20000000E+00 2.40000000E+00 3.00000000E+00 3.00000000E+00 2.00000000E+00 1.20000000E+00 2.00000000E+00 4.00000000E-01 3.00000000E+00 1.00000000E+00 3.00000000E+00 2.00000000E+00 3.00000000E+00 1.00000000E+00 0.00000000E+00 - 4.00000000E-01 6.00000000E-01 4.00000000E-01 6.00000000E-01 3.00000000E-01 - -3.00000000E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 - 6.00000000E-01 0.00000000E+00 6.00000000E-01 4.00000000E-01 0.00000000E+00 - 6.00000000E-01 3.00000000E+00 1.40000000E+01 3.00000000E+00 1.40000000E+01 - 1.90000000E-01 1.90000000E-01 1.40000000E+01 1.00000000E+00 4.00000000E+00 - 3.50000000E+00 2.80000000E+00 3.00000000E+00 1.00000000E+01 5.00000000E+00 - 4.00000000E-01 6.00000000E-01 4.00000000E-01 6.00000000E-01 -3.00000000E-01 - 1.40000000E+00 1.40000000E+00 1.40000000E+00 0.00000000E+00 0.00000000E+00 - 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.75000000E+00 3.00000000E-01 - 2.75000000E+00 3.00000000E-01 2.50000000E+00 2.50000000E+00 2.50000000E+00 - 0.00000000E+00 1.40000000E+00 3.10000000E+00 4.20000000E+00 1.00000000E-02 - 3.10000000E-01 1.58000000E-01 2.25000000E+00 1.40000000E-01 1.60000000E-01 - 1.40000000E-01 5.00000000E-02 2.00000000E-01 2.00000000E-01 2.00000000E-01 - 1.00000000E-01 1.40000000E-01 0.00000000E+00 5.00000000E-02 1.95000000E-01 - 1.60000000E-01 0.00000000E+00 1.00000000E-01 1.40000000E-01 0.00000000E+00 - 1.40000000E-01 1.40000000E-01 1.40000000E-01 1.40000000E-01 0.00000000E+00 - 1.40000000E-01 1.40000000E-01 1.40000000E-01 1.40000000E-01 + 0.00000000E+00 4.00000000E-01 6.00000000E-01 4.00000000E-01 6.00000000E-01 + 3.00000000E-01 -3.00000000E-01 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 6.00000000E-01 0.00000000E+00 6.00000000E-01 4.00000000E-01 + 0.00000000E+00 6.00000000E-01 3.00000000E+00 1.40000000E+01 3.00000000E+00 + 1.40000000E+01 1.90000000E-01 1.90000000E-01 1.40000000E+01 1.00000000E+00 + 4.00000000E+00 3.50000000E+00 2.80000000E+00 3.00000000E+00 1.00000000E+01 + 5.00000000E+00 4.00000000E-01 6.00000000E-01 4.00000000E-01 6.00000000E-01 + -3.00000000E-01 1.40000000E+00 1.40000000E+00 1.40000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 2.75000000E+00 + 3.00000000E-01 2.75000000E+00 3.00000000E-01 2.50000000E+00 2.50000000E+00 + 2.50000000E+00 0.00000000E+00 1.40000000E+00 3.10000000E+00 4.20000000E+00 + 1.00000000E-02 3.10000000E-01 1.58000000E-01 2.25000000E+00 1.40000000E-01 + 1.60000000E-01 1.40000000E-01 5.00000000E-02 2.00000000E-01 2.00000000E-01 + 2.00000000E-01 1.00000000E-01 1.40000000E-01 0.00000000E+00 5.00000000E-02 + 1.95000000E-01 1.60000000E-01 0.00000000E+00 1.00000000E-01 1.40000000E-01 %FLAG DIHEDRAL_PERIODICITY %FORMAT(5E16.8) 1.00000000E+00 1.00000000E+00 3.00000000E+00 2.00000000E+00 2.00000000E+00 @@ -5401,23 +5399,21 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 1.00000000E+00 - 1.00000000E+00 2.00000000E+00 1.00000000E+00 2.00000000E+00 1.00000000E+00 - 4.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 - 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 3.00000000E+00 - 1.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 - 3.00000000E+00 3.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 - 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 - 1.00000000E+00 2.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 + 1.00000000E+00 1.00000000E+00 2.00000000E+00 1.00000000E+00 2.00000000E+00 + 1.00000000E+00 4.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 - 1.00000000E+00 1.00000000E+00 1.00000000E+00 2.00000000E+00 4.00000000E+00 - 2.00000000E+00 4.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 - 3.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 3.00000000E+00 - 3.00000000E+00 3.00000000E+00 2.00000000E+00 3.00000000E+00 3.00000000E+00 - 3.00000000E+00 6.00000000E+00 3.00000000E+00 3.00000000E+00 3.00000000E+00 - 3.00000000E+00 3.00000000E+00 6.00000000E+00 6.00000000E+00 3.00000000E+00 - 3.00000000E+00 6.00000000E+00 3.00000000E+00 3.00000000E+00 1.00000000E+00 - 3.00000000E+00 3.00000000E+00 3.00000000E+00 3.00000000E+00 1.00000000E+00 - 3.00000000E+00 3.00000000E+00 3.00000000E+00 3.00000000E+00 + 3.00000000E+00 1.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 + 2.00000000E+00 3.00000000E+00 3.00000000E+00 2.00000000E+00 2.00000000E+00 + 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 + 2.00000000E+00 1.00000000E+00 2.00000000E+00 1.00000000E+00 2.00000000E+00 + 4.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 + 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 2.00000000E+00 + 4.00000000E+00 2.00000000E+00 4.00000000E+00 2.00000000E+00 2.00000000E+00 + 2.00000000E+00 3.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 + 3.00000000E+00 3.00000000E+00 3.00000000E+00 2.00000000E+00 3.00000000E+00 + 3.00000000E+00 3.00000000E+00 6.00000000E+00 3.00000000E+00 3.00000000E+00 + 3.00000000E+00 3.00000000E+00 3.00000000E+00 6.00000000E+00 6.00000000E+00 + 3.00000000E+00 3.00000000E+00 6.00000000E+00 3.00000000E+00 3.00000000E+00 %FLAG DIHEDRAL_PHASE %FORMAT(5E16.8) 3.14159265E+00 3.14159265E+00 0.00000000E+00 3.14159265E+00 3.14159265E+00 @@ -5442,23 +5438,21 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 0.00000000E+00 - 0.00000000E+00 0.00000000E+00 3.14159265E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159265E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 - 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159265E+00 - 0.00000000E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 - 0.00000000E+00 0.00000000E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 3.14159265E+00 0.00000000E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 + 3.14159265E+00 0.00000000E+00 0.00000000E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 - 3.14159265E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 3.14159265E+00 3.14159265E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159265E+00 + 0.00000000E+00 3.14159265E+00 0.00000000E+00 3.14159265E+00 3.14159265E+00 + 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159265E+00 0.00000000E+00 - 3.14159265E+00 0.00000000E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 - 3.14159265E+00 3.14159265E+00 3.14159265E+00 3.14159265E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159265E+00 0.00000000E+00 0.00000000E+00 - 0.00000000E+00 3.14159265E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 - 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159265E+00 0.00000000E+00 - 0.00000000E+00 3.14159265E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 - 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 - 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 + 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 3.14159265E+00 + 0.00000000E+00 0.00000000E+00 3.14159265E+00 0.00000000E+00 0.00000000E+00 %FLAG SCEE_SCALE_FACTOR %FORMAT(5E16.8) 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 @@ -5498,8 +5492,6 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 - 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 - 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 %FLAG SCNB_SCALE_FACTOR %FORMAT(5E16.8) 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 @@ -5538,9 +5530,7 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 - 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 4.47213596E+01 - 4.47213596E+01 4.47213596E+01 4.47213596E+01 4.47213596E+01 4.47213596E+01 - 4.47213596E+01 4.47213596E+01 4.47213596E+01 4.47213596E+01 + 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 1.00000000E+00 %FLAG CHARMM_NUM_IMPROPERS %COMMENT Number of terms contributing to the %COMMENT quadratic four atom improper energy term: @@ -6176,77 +6166,77 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL %FLAG LENNARD_JONES_14_ACOEF %FORMAT(3E24.16) 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 1.5745873408935282E+06 - 0.0000000000000000E+00 5.8619918176423056E+00 9.7749169197378229E+04 - 0.0000000000000000E+00 1.8962122985824007E+06 1.8323537098704066E+03 - 1.9999377330216011E+06 1.1554704575221313E+05 2.5248394826824050E+06 - 6.8302639168654554E+04 5.8619918176423056E+00 9.7749169197378229E+04 - 2.5215628838562820E+03 1.1554704575221313E+05 2.5215628838562820E+03 - 0.0000000000000000E+00 1.0443935461470187E+03 1.7476109981995474E+06 - 8.8219519385039821E+04 2.1815011444487376E+06 8.8219519385039821E+04 - 1.8454937599915639E+06 6.2064871065900614E+05 0.0000000000000000E+00 - 7.6234440411894105E+05 2.9572311958377813E+04 9.3117744915464043E+05 - 2.9572311958377813E+04 0.0000000000000000E+00 0.0000000000000000E+00 - 1.3165904011715762E+06 0.0000000000000000E+00 1.5350319889792714E+06 - 6.8302639168654554E+04 1.8962122985824007E+06 6.8302639168654554E+04 - 0.0000000000000000E+00 6.2064871065900614E+05 1.3165904011715762E+06 - 0.0000000000000000E+00 0.0000000000000000E+00 1.8035642024198942E+03 - 5.8619918176423056E+00 1.8323537098704066E+03 5.8619918176423056E+00 - 1.0443935461470187E+03 1.9177170259490964E+02 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 1.7616888802052913E+06 9.3273170045124105E+04 2.2078385610097949E+06 - 9.3273170045124105E+04 1.8817145325808541E+06 7.8232958785163565E+05 - 1.6150318076762222E+06 1.2257950352838034E+03 1.9136238690488692E+06 - 0.0000000000000000E+00 0.0000000000000000E+00 1.3646593413702333E+06 - 6.8465797628205415E+04 1.7025999388435301E+06 6.8465797628205415E+04 - 1.4389772424494515E+06 0.0000000000000000E+00 1.2254480396527511E+06 + 0.0000000000000000E+00 0.0000000000000000E+00 9.0657379083893029E+04 + 0.0000000000000000E+00 5.8619918176423056E+00 1.8428152636178453E+04 + 0.0000000000000000E+00 3.4585193557583797E+05 1.8132585792101199E+02 + 9.0657379083893029E+04 1.8428152636178453E+04 9.0657379083893029E+04 + 6.8302639168654554E+04 5.8619918176423056E+00 1.8428152636178453E+04 + 2.5215628838562770E+03 1.8428152636178453E+04 2.5215628838562770E+03 + 0.0000000000000000E+00 1.0443935461470187E+03 4.1064981062521809E+05 + 8.8219519385039821E+04 4.1064981062521809E+05 8.8219519385039821E+04 + 1.8454937599915639E+06 2.1513246459796751E+05 0.0000000000000000E+00 + 5.7777387625319017E+04 8.4261427396507279E+03 5.7777387625319017E+04 + 8.4261427396507279E+03 0.0000000000000000E+00 0.0000000000000000E+00 + 4.7728413674400322E+05 0.0000000000000000E+00 1.2715813181780890E+05 + 2.0716152484259183E+04 1.2715813181780890E+05 2.0716152484259183E+04 + 0.0000000000000000E+00 6.7292987994558527E+04 1.5753255676109696E+05 + 0.0000000000000000E+00 0.0000000000000000E+00 1.8132585792101199E+02 + 5.8619918176423056E+00 1.8132585792101199E+02 5.8619918176423056E+00 + 1.0443935461470187E+03 2.5096093691000867E+01 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 9.0657379083893029E+04 1.8428152636178453E+04 9.0657379083893029E+04 + 1.8428152636178453E+04 4.1064981062521809E+05 5.7777387625319017E+04 + 1.2715813181780890E+05 1.8132585792101199E+02 9.0657379083893029E+04 + 0.0000000000000000E+00 0.0000000000000000E+00 3.2000634289627575E+05 + 6.8465797628205415E+04 3.2000634289627575E+05 6.8465797628205415E+04 + 1.4389772424494515E+06 0.0000000000000000E+00 4.6199280102242104E+05 7.9961544929069157E+02 0.0000000000000000E+00 1.1219574448510488E+06 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 1.5373071011594997E+05 0.0000000000000000E+00 + 0.0000000000000000E+00 2.4790968839303769E+04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 9.1774657313251513E+00 0.0000000000000000E+00 9.1744630791165284E+04 + 9.1774657311544434E+00 0.0000000000000000E+00 9.1744630793032222E+04 4.8422355994867103E+03 0.0000000000000000E+00 6.0933367985048187E+02 - 0.0000000000000000E+00 0.0000000000000000E+00 1.8962122985824007E+06 + 0.0000000000000000E+00 0.0000000000000000E+00 3.4585193557583797E+05 6.8302639168654554E+04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 3.0274289302021321E+06 - 1.4975046026082200E+05 0.0000000000000000E+00 1.4975046026082200E+05 - 3.1815132537913439E+06 0.0000000000000000E+00 2.7038591843295791E+06 + 0.0000000000000000E+00 0.0000000000000000E+00 7.0656525988817133E+05 + 1.4975046026082177E+05 0.0000000000000000E+00 1.4975046026082177E+05 + 3.1815132537913439E+06 0.0000000000000000E+00 1.0146499821764309E+06 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 1.3941112974741664E+06 + 0.0000000000000000E+00 0.0000000000000000E+00 3.2758522399451659E+05 7.0374830988779388E+04 0.0000000000000000E+00 7.0374830988779388E+04 - 1.4721947291891237E+06 0.0000000000000000E+00 1.2548527649639363E+06 + 1.4721947291891237E+06 0.0000000000000000E+00 4.7402828276215412E+05 8.3313783398747830E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 7.6234440411894105E+05 2.9572311958377813E+04 9.3117744915464043E+05 - 2.9572311958377813E+04 0.0000000000000000E+00 0.0000000000000000E+00 - 6.2064871065900614E+05 0.0000000000000000E+00 0.0000000000000000E+00 + 1.6414234447470799E+05 2.9572311958377766E+04 1.6414234447470799E+05 + 2.9572311958377766E+04 0.0000000000000000E+00 0.0000000000000000E+00 + 2.1513246459796751E+05 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 3.5347172838761527E+06 + 0.0000000000000000E+00 0.0000000000000000E+00 8.3058013753571792E+05 0.0000000000000000E+00 0.0000000000000000E+00 1.7843276350790149E+05 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 1.5350319889792714E+06 + 0.0000000000000000E+00 0.0000000000000000E+00 3.4585193557583797E+05 0.0000000000000000E+00 0.0000000000000000E+00 6.8302639168654554E+04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 6.0933367985048187E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 6.6302721781265666E+05 2.8219640108972635E+04 0.0000000000000000E+00 - 2.8219640108972635E+04 6.7233311761794041E+05 0.0000000000000000E+00 - 5.5913203239071474E+05 2.2734075149969252E+02 0.0000000000000000E+00 + 1.4719928177718198E+05 2.8219640108972635E+04 0.0000000000000000E+00 + 2.8219640108972635E+04 6.7233311761793937E+05 0.0000000000000000E+00 + 1.9977341075752821E+05 2.2734075149969311E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 8.1604093132930633E+05 0.0000000000000000E+00 + 0.0000000000000000E+00 1.4719928177718198E+05 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -6258,9 +6248,9 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 1.8804913883900196E-01 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 7.1982858344136794E+03 0.0000000000000000E+00 + 0.0000000000000000E+00 7.1982858344136630E+03 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 1.8962122985824007E+06 + 0.0000000000000000E+00 0.0000000000000000E+00 3.4585193557583797E+05 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -6268,15 +6258,15 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 1.1317192445388553E+05 0.0000000000000000E+00 + 0.0000000000000000E+00 1.8815349734005889E+04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 1.0465749738027215E+01 0.0000000000000000E+00 0.0000000000000000E+00 + 1.0465749738027228E+01 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 7.0320002812875027E+04 0.0000000000000000E+00 2.9303323381496513E+04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 1.5350319889792714E+06 - 0.0000000000000000E+00 1.8962122985824007E+06 6.8302639168654554E+04 + 0.0000000000000000E+00 0.0000000000000000E+00 3.4585193557583797E+05 + 0.0000000000000000E+00 3.4585193557583797E+05 6.8302639168654554E+04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -6284,45 +6274,45 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 4.3830628738782390E+04 0.0000000000000000E+00 - 4.3830628738782390E+04 1.0662453546584754E+06 0.0000000000000000E+00 - 8.8324756997291511E+05 0.0000000000000000E+00 0.0000000000000000E+00 - 8.3022004697522335E+05 5.9314295252836841E+04 0.0000000000000000E+00 + 0.0000000000000000E+00 4.3830628738782303E+04 0.0000000000000000E+00 + 4.3830628738782303E+04 1.0662453546584742E+06 0.0000000000000000E+00 + 3.1277829600784427E+05 0.0000000000000000E+00 0.0000000000000000E+00 + 8.3022004697522335E+05 5.9314295252866323E+04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 6.8465797628205415E+04 0.0000000000000000E+00 0.0000000000000000E+00 - 1.4389772424494515E+06 0.0000000000000000E+00 1.2254480396527511E+06 + 1.4389772424494515E+06 0.0000000000000000E+00 4.6199280102242104E+05 7.9961544929069157E+02 0.0000000000000000E+00 1.1219574448510488E+06 - 9.1744630791165284E+04 0.0000000000000000E+00 0.0000000000000000E+00 + 9.1744630793032222E+04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 1.8962122985824007E+06 0.0000000000000000E+00 + 0.0000000000000000E+00 3.4585193557583797E+05 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 1.2254480396527511E+06 - 9.2090077615683389E+04 0.0000000000000000E+00 0.0000000000000000E+00 + 9.2090077615786533E+04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 8.8954435797699599E+05 0.0000000000000000E+00 1.0948337969247403E+06 - 3.7860620150545423E+04 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 3.0500962464551986E+02 0.0000000000000000E+00 - 7.0248964928241912E+05 5.1163168536370402E+04 0.0000000000000000E+00 + 2.7197213725167909E+05 0.0000000000000000E+00 2.7197213725167909E+05 + 5.5284457908535347E+04 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 5.4397757376344009E+02 0.0000000000000000E+00 + 9.6001902868882730E+05 7.4372906517877112E+04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 1.5350319889792714E+06 - 6.8302639168654554E+04 0.0000000000000000E+00 6.8302639168654554E+04 - 0.0000000000000000E+00 6.2064871065900614E+05 1.3165904011715762E+06 + 0.0000000000000000E+00 0.0000000000000000E+00 7.7334843809820550E+03 + 1.5272934422046555E+03 0.0000000000000000E+00 1.5272934422046555E+03 + 0.0000000000000000E+00 4.8105081500711813E+03 1.0672397743408559E+04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -6330,9 +6320,9 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 1.9999377330216011E+06 - 1.1554704575221313E+05 0.0000000000000000E+00 1.1554704575221313E+05 - 2.1815011444487376E+06 9.3117744915464043E+05 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 9.0657379083893029E+04 + 1.8428152636178453E+04 0.0000000000000000E+00 1.8428152636178453E+04 + 4.1064981062521809E+05 5.7777387625319017E+04 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -6341,9 +6331,9 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 1.5745873408935282E+06 0.0000000000000000E+00 1.9999377330216011E+06 - 9.7749169197378229E+04 0.0000000000000000E+00 7.6234440411894105E+05 - 0.0000000000000000E+00 1.8035642024198942E+03 0.0000000000000000E+00 + 9.0657379083893029E+04 0.0000000000000000E+00 9.0657379083893029E+04 + 1.8428152636178453E+04 0.0000000000000000E+00 5.7777387625319017E+04 + 0.0000000000000000E+00 1.8132585792101199E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -6352,8 +6342,8 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 1.1554704575221313E+05 0.0000000000000000E+00 1.1554704575221313E+05 - 2.1815011444487376E+06 9.3117744915464043E+05 1.8962122985824007E+06 + 1.8428152636178453E+04 0.0000000000000000E+00 1.8428152636178453E+04 + 4.1064981062521809E+05 5.7777387625319017E+04 1.2715813181780890E+05 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -6388,77 +6378,77 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL %FLAG LENNARD_JONES_14_BCOEF %FORMAT(3E24.16) 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 3.5491828252638982E+02 - 0.0000000000000000E+00 8.6366978783196413E-01 9.0562770962682677E+01 - 0.0000000000000000E+00 8.9191125943387055E+02 1.9200599189531570E+01 - 5.1509389685790768E+02 1.2679606076353396E+02 7.4529503298366956E+02 - 1.3462071944940999E+02 8.6366978783196413E-01 9.0562770962682677E+01 - 1.4896225487664747E+01 1.2679606076353396E+02 1.4896225487664747E+01 - 0.0000000000000000E+00 1.7238509581343376E+01 5.7260884268393590E+02 - 1.3175471954083176E+02 8.2384699493207063E+02 1.3175471954083176E+02 - 9.0111999999794034E+02 6.2016283284020642E+02 0.0000000000000000E+00 - 3.8650793506550417E+02 7.7960320676016011E+01 5.5008804235188563E+02 - 7.7960320676016011E+01 0.0000000000000000E+00 0.0000000000000000E+00 - 1.0262905636013911E+03 0.0000000000000000E+00 6.2316594042954455E+02 - 1.3462071944940999E+02 8.9191125943387055E+02 1.3462071944940999E+02 - 0.0000000000000000E+00 6.2016283284020642E+02 1.0262905636013911E+03 - 0.0000000000000000E+00 0.0000000000000000E+00 1.4792540121182832E+01 - 8.6366978783196413E-01 1.9200599189531570E+01 8.6366978783196413E-01 - 1.7238509581343376E+01 7.5493059634775115E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 5.3091451367696345E+02 1.2510841764818564E+02 7.6537949303846278E+02 - 1.2510841764818564E+02 8.4028678433525374E+02 5.5372315117479025E+02 - 9.0396274311507966E+02 1.7246496291125435E+01 7.8253411305555119E+02 - 0.0000000000000000E+00 0.0000000000000000E+00 4.5193307934108987E+02 - 1.0366854707668827E+02 6.5005706812144115E+02 1.0366854707668827E+02 - 7.1068907566562905E+02 0.0000000000000000E+00 7.6156934668505119E+02 + 0.0000000000000000E+00 0.0000000000000000E+00 6.0218727679648971E+01 + 0.0000000000000000E+00 8.6366978783196413E-01 3.3065612070591797E+01 + 0.0000000000000000E+00 2.4873253717142799E+02 3.9441127724762586E+00 + 6.0218727679648971E+01 3.3065612070591797E+01 6.0218727679648971E+01 + 1.3462071944940999E+02 8.6366978783196413E-01 3.3065612070591797E+01 + 1.4896225487664731E+01 3.3065612070591797E+01 1.4896225487664731E+01 + 0.0000000000000000E+00 1.7238509581343376E+01 2.3340705576907794E+02 + 1.3175471954083176E+02 2.3340705576907794E+02 1.3175471954083176E+02 + 9.0111999999794034E+02 3.6512013422787487E+02 0.0000000000000000E+00 + 8.9475525545437407E+01 4.1614567301766044E+01 8.9475525545437407E+01 + 4.1614567301766044E+01 0.0000000000000000E+00 0.0000000000000000E+00 + 6.1792176640348453E+02 0.0000000000000000E+00 1.5082021791158436E+02 + 7.4139169075511759E+01 1.5082021791158436E+02 7.4139169075511759E+01 + 0.0000000000000000E+00 2.0420563040987912E+02 3.5500147240381631E+02 + 0.0000000000000000E+00 0.0000000000000000E+00 3.9441127724762586E+00 + 8.6366978783196413E-01 3.9441127724762586E+00 8.6366978783196413E-01 + 1.7238509581343376E+01 2.7309756545751518E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 6.0218727679648971E+01 3.3065612070591797E+01 6.0218727679648971E+01 + 3.3065612070591797E+01 2.3340705576907794E+02 8.9475525545437407E+01 + 1.5082021791158436E+02 3.9441127724762586E+00 6.0218727679648971E+01 + 0.0000000000000000E+00 0.0000000000000000E+00 1.8402795453596136E+02 + 1.0366854707668827E+02 1.8402795453596136E+02 1.0366854707668827E+02 + 7.1068907566562905E+02 0.0000000000000000E+00 4.6760549783487755E+02 1.3472076858791818E+01 0.0000000000000000E+00 5.6048914758297826E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 1.5804519562162815E+02 0.0000000000000000E+00 + 0.0000000000000000E+00 4.1443560464101886E+01 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 1.1677803226614298E+00 0.0000000000000000E+00 1.2968064083837513E+02 + 1.1677803226521313E+00 0.0000000000000000E+00 1.2968064083971069E+02 2.4105357743423042E+01 0.0000000000000000E+00 1.5289896454961573E+01 - 0.0000000000000000E+00 0.0000000000000000E+00 8.9191125943387055E+02 + 0.0000000000000000E+00 0.0000000000000000E+00 2.4873253717142799E+02 1.3462071944940999E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 1.0274728907568333E+03 - 2.3402682893153727E+02 0.0000000000000000E+00 2.3402682893153727E+02 - 1.6130243909090048E+03 0.0000000000000000E+00 1.7267339532327687E+03 + 0.0000000000000000E+00 0.0000000000000000E+00 4.1739960623183669E+02 + 2.3402682893153710E+02 0.0000000000000000E+00 2.3402682893153710E+02 + 1.6130243909090048E+03 0.0000000000000000E+00 1.0577706677940305E+03 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 4.5678383658703240E+02 + 0.0000000000000000E+00 0.0000000000000000E+00 1.8619441837706415E+02 1.0510390653105776E+02 0.0000000000000000E+00 1.0510390653105776E+02 - 7.1884508261351971E+02 0.0000000000000000E+00 7.7065214324335966E+02 + 7.1884508261351971E+02 0.0000000000000000E+00 4.7365718744829599E+02 1.3751573424364183E+01 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 3.8650793506550417E+02 7.7960320676016011E+01 5.5008804235188563E+02 - 7.7960320676016011E+01 0.0000000000000000E+00 0.0000000000000000E+00 - 6.2016283284020642E+02 0.0000000000000000E+00 0.0000000000000000E+00 + 1.5081190411978849E+02 7.7960320676015940E+01 1.5081190411978849E+02 + 7.7960320676015940E+01 0.0000000000000000E+00 0.0000000000000000E+00 + 3.6512013422787487E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 1.1581584089482376E+03 + 0.0000000000000000E+00 0.0000000000000000E+00 4.7208901469436734E+02 0.0000000000000000E+00 0.0000000000000000E+00 2.6648704137993542E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 6.2316594042954455E+02 + 0.0000000000000000E+00 0.0000000000000000E+00 2.4873253717142799E+02 0.0000000000000000E+00 0.0000000000000000E+00 1.3462071944940999E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 1.5289896454961573E+01 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 2.8959807727072763E+02 6.1186259228792927E+01 0.0000000000000000E+00 - 6.1186259228792927E+01 4.4659403711659564E+02 0.0000000000000000E+00 - 4.7291945715553499E+02 6.6039017030111182E+00 0.0000000000000000E+00 + 1.1474277324397487E+02 6.1186259228792927E+01 0.0000000000000000E+00 + 6.1186259228792927E+01 4.4659403711659530E+02 0.0000000000000000E+00 + 2.8268244427804723E+02 6.6039017030111271E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 4.1373202661800002E+02 0.0000000000000000E+00 + 0.0000000000000000E+00 1.1474277324397487E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -6470,9 +6460,9 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 1.8601355205031800E-01 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 3.7160067878569073E+01 0.0000000000000000E+00 + 0.0000000000000000E+00 3.7160067878569031E+01 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 8.9191125943387055E+02 + 0.0000000000000000E+00 0.0000000000000000E+00 2.4873253717142799E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -6480,15 +6470,15 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 9.6830833281554447E+01 0.0000000000000000E+00 + 0.0000000000000000E+00 2.5781595719970060E+01 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 8.9048842157005437E-01 0.0000000000000000E+00 0.0000000000000000E+00 + 8.9048842157005492E-01 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 1.0540242066554782E+02 0.0000000000000000E+00 4.8112130233822874E+01 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 6.2316594042954455E+02 - 0.0000000000000000E+00 8.9191125943387055E+02 1.3462071944940999E+02 + 0.0000000000000000E+00 0.0000000000000000E+00 2.4873253717142799E+02 + 0.0000000000000000E+00 2.4873253717142799E+02 1.3462071944940999E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -6496,45 +6486,45 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 1.0070634164380861E+02 0.0000000000000000E+00 - 1.0070634164380861E+02 7.4274381925022249E+02 0.0000000000000000E+00 - 7.8498439571454753E+02 0.0000000000000000E+00 0.0000000000000000E+00 - 5.8537398415889754E+02 1.2659667526012110E+02 0.0000000000000000E+00 + 0.0000000000000000E+00 1.0070634164380851E+02 0.0000000000000000E+00 + 1.0070634164380851E+02 7.4274381925022215E+02 0.0000000000000000E+00 + 4.6713036928586109E+02 0.0000000000000000E+00 0.0000000000000000E+00 + 5.8537398415889754E+02 1.2659667526018411E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 1.0366854707668827E+02 0.0000000000000000E+00 0.0000000000000000E+00 - 7.1068907566562905E+02 0.0000000000000000E+00 7.6156934668505119E+02 + 7.1068907566562905E+02 0.0000000000000000E+00 4.6760549783487755E+02 1.3472076858791818E+01 0.0000000000000000E+00 5.6048914758297826E+02 - 1.2968064083837513E+02 0.0000000000000000E+00 0.0000000000000000E+00 + 1.2968064083971069E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 8.9191125943387055E+02 0.0000000000000000E+00 + 0.0000000000000000E+00 2.4873253717142799E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 7.6156934668505119E+02 - 1.6891733764335504E+02 0.0000000000000000E+00 0.0000000000000000E+00 + 1.6891733764354436E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 3.8853659215835029E+02 0.0000000000000000E+00 5.5507976159196039E+02 - 8.2089980954702895E+01 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 8.8600638747956939E+00 0.0000000000000000E+00 - 4.7226427905547945E+02 1.0312160242036752E+02 0.0000000000000000E+00 + 1.8065618303894689E+02 0.0000000000000000E+00 1.8065618303894689E+02 + 9.9196836211775377E+01 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 1.1832338317437566E+01 0.0000000000000000E+00 + 5.5208386360788404E+02 1.2433068139224849E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 6.2316594042954455E+02 - 1.3462071944940999E+02 0.0000000000000000E+00 1.3462071944940999E+02 - 0.0000000000000000E+00 6.2016283284020642E+02 1.0262905636013911E+03 + 0.0000000000000000E+00 0.0000000000000000E+00 5.5618286133184851E+00 + 3.0102107986553075E+00 0.0000000000000000E+00 3.0102107986553075E+00 + 0.0000000000000000E+00 8.1643344008567169E+00 1.3817150744535903E+01 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -6542,9 +6532,9 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 0.0000000000000000E+00 0.0000000000000000E+00 5.1509389685790768E+02 - 1.2679606076353396E+02 0.0000000000000000E+00 1.2679606076353396E+02 - 8.2384699493207063E+02 5.5008804235188563E+02 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 6.0218727679648971E+01 + 3.3065612070591797E+01 0.0000000000000000E+00 3.3065612070591797E+01 + 2.3340705576907794E+02 8.9475525545437407E+01 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -6553,9 +6543,9 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 3.5491828252638982E+02 0.0000000000000000E+00 5.1509389685790768E+02 - 9.0562770962682677E+01 0.0000000000000000E+00 3.8650793506550417E+02 - 0.0000000000000000E+00 1.4792540121182832E+01 0.0000000000000000E+00 + 6.0218727679648971E+01 0.0000000000000000E+00 6.0218727679648971E+01 + 3.3065612070591797E+01 0.0000000000000000E+00 8.9475525545437407E+01 + 0.0000000000000000E+00 3.9441127724762586E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -6564,8 +6554,8 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 - 1.2679606076353396E+02 0.0000000000000000E+00 1.2679606076353396E+02 - 8.2384699493207063E+02 5.5008804235188563E+02 8.9191125943387055E+02 + 3.3065612070591797E+01 0.0000000000000000E+00 3.3065612070591797E+01 + 2.3340705576907794E+02 8.9475525545437407E+01 1.5082021791158436E+02 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 @@ -9623,57 +9613,57 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 5877 137 5874 5871 5877 139 %FLAG DIHEDRALS_INC_HYDROGEN %FORMAT(10I8) - 3 0 12 15 176 3 0 12 18 176 - 3 0 12 66 176 6 0 12 15 176 - 6 0 12 18 176 6 0 12 66 176 - 9 0 12 15 176 9 0 12 18 176 - 9 0 12 66 176 0 12 18 21 174 - 0 12 18 24 174 15 12 18 21 174 - 15 12 18 24 174 15 12 18 27 174 - 66 12 18 21 174 66 12 18 24 174 - 15 12 66 69 149 15 12 66 72 120 - 12 18 27 30 180 12 18 27 33 180 - 21 18 27 30 180 21 18 27 33 180 - 21 18 27 36 180 24 18 27 30 180 - 24 18 27 33 180 24 18 27 36 180 - 18 27 36 39 180 18 27 36 42 180 - 30 27 36 39 180 30 27 36 42 180 - 30 27 36 45 180 33 27 36 39 180 - 33 27 36 42 180 33 27 36 45 180 - 27 36 45 48 180 27 36 45 51 180 - 39 36 45 48 180 39 36 45 51 180 - 39 36 45 54 180 42 36 45 48 180 - 42 36 45 51 180 42 36 45 54 180 - 36 45 54 57 183 36 45 54 60 183 - 36 45 54 63 183 48 45 54 57 183 - 48 45 54 60 183 48 45 54 63 183 - 51 45 54 57 183 51 45 54 60 183 - 51 45 54 63 183 12 66 72 75 58 - 69 66 72 75 160 66 72 78 81 90 + 3 0 12 15 177 3 0 12 18 177 + 3 0 12 66 177 6 0 12 15 177 + 6 0 12 18 177 6 0 12 66 177 + 9 0 12 15 177 9 0 12 18 177 + 9 0 12 66 177 0 12 18 21 175 + 0 12 18 24 175 15 12 18 21 175 + 15 12 18 24 175 15 12 18 27 175 + 66 12 18 21 175 66 12 18 24 175 + 15 12 66 69 150 15 12 66 72 121 + 12 18 27 30 181 12 18 27 33 181 + 21 18 27 30 181 21 18 27 33 181 + 21 18 27 36 181 24 18 27 30 181 + 24 18 27 33 181 24 18 27 36 181 + 18 27 36 39 181 18 27 36 42 181 + 30 27 36 39 181 30 27 36 42 181 + 30 27 36 45 181 33 27 36 39 181 + 33 27 36 42 181 33 27 36 45 181 + 27 36 45 48 181 27 36 45 51 181 + 39 36 45 48 181 39 36 45 51 181 + 39 36 45 54 181 42 36 45 48 181 + 42 36 45 51 181 42 36 45 54 181 + 36 45 54 57 184 36 45 54 60 184 + 36 45 54 63 184 48 45 54 57 184 + 48 45 54 60 184 48 45 54 63 184 + 51 45 54 57 184 51 45 54 60 184 + 51 45 54 63 184 12 66 72 75 58 + 69 66 72 75 161 66 72 78 81 90 75 72 78 81 91 75 72 78 84 62 - 75 72 78 114 60 72 78 84 87 173 - 81 78 84 87 173 81 78 84 90 173 - 81 78 84 102 173 114 78 84 87 173 - 81 78 114 117 149 81 78 114 120 120 - 78 84 90 93 175 78 84 90 96 175 - 78 84 90 99 175 87 84 90 93 175 - 87 84 90 96 175 87 84 90 99 175 - 102 84 90 93 175 102 84 90 96 175 - 102 84 90 99 175 78 84 102 105 175 - 78 84 102 108 175 78 84 102 111 175 - 87 84 102 105 175 87 84 102 108 175 - 87 84 102 111 175 90 84 102 105 175 - 90 84 102 108 175 90 84 102 111 175 - 78 114 120 123 58 117 114 120 123 160 + 75 72 78 114 60 72 78 84 87 174 + 81 78 84 87 174 81 78 84 90 174 + 81 78 84 102 174 114 78 84 87 174 + 81 78 114 117 150 81 78 114 120 121 + 78 84 90 93 176 78 84 90 96 176 + 78 84 90 99 176 87 84 90 93 176 + 87 84 90 96 176 87 84 90 99 176 + 102 84 90 93 176 102 84 90 96 176 + 102 84 90 99 176 78 84 102 105 176 + 78 84 102 108 176 78 84 102 111 176 + 87 84 102 105 176 87 84 102 108 176 + 87 84 102 111 176 90 84 102 105 176 + 90 84 102 108 176 90 84 102 111 176 + 78 114 120 123 58 117 114 120 123 161 114 120 126 129 90 123 120 126 129 91 123 120 126 132 63 123 120 126 174 60 - 120 126 132 135 174 120 126 132 138 174 - 129 126 132 135 174 129 126 132 138 174 - 129 126 132 141 174 174 126 132 135 174 - 174 126 132 138 174 129 126 174 177 149 - 129 126 174 180 120 135 132 141 144 178 - 135 132 141 162 178 138 132 141 144 178 - 138 132 141 162 178 132 141 144 147 96 + 120 126 132 135 175 120 126 132 138 175 + 129 126 132 135 175 129 126 132 138 175 + 129 126 132 141 175 174 126 132 135 175 + 174 126 132 138 175 129 126 174 177 150 + 129 126 174 180 121 135 132 141 144 179 + 135 132 141 162 179 138 132 141 144 179 + 138 132 141 162 179 132 141 144 147 96 162 141 144 147 94 132 141 162 165 96 144 141 162 165 94 141 144 150 153 94 147 144 150 153 97 147 144 150 156 94 @@ -9682,428 +9672,428 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 159 156 168 162 94 159 156 168 171 97 141 162 168 171 94 165 162 168 156 94 165 162 168 171 97 126 174 180 183 58 - 177 174 180 183 160 174 180 186 189 92 + 177 174 180 183 161 174 180 186 189 92 174 180 186 192 92 183 180 186 189 93 183 180 186 192 93 183 180 186 195 65 - 189 186 195 198 152 189 186 195 201 122 - 192 186 195 198 152 192 186 195 201 122 - 186 195 201 204 59 198 195 201 204 160 + 189 186 195 198 153 189 186 195 201 123 + 192 186 195 198 153 192 186 195 201 123 + 186 195 201 204 59 198 195 201 204 161 195 201 207 210 90 204 201 207 210 91 204 201 207 213 63 204 201 207 267 60 - 201 207 213 216 174 201 207 213 219 174 - 210 207 213 216 174 210 207 213 219 174 - 210 207 213 222 174 267 207 213 216 174 - 267 207 213 219 174 210 207 267 270 149 - 210 207 267 273 120 207 213 222 225 180 - 207 213 222 228 180 216 213 222 225 180 - 216 213 222 228 180 216 213 222 231 180 - 219 213 222 225 180 219 213 222 228 180 - 219 213 222 231 180 213 222 231 234 180 - 213 222 231 237 180 225 222 231 234 180 - 225 222 231 237 180 225 222 231 240 180 - 228 222 231 234 180 228 222 231 237 180 - 228 222 231 240 180 222 231 240 243 182 - 234 231 240 243 182 234 231 240 246 182 - 237 231 240 243 182 237 231 240 246 182 - 243 240 246 249 168 243 240 246 258 168 - 240 246 249 252 168 240 246 249 255 168 - 258 246 249 252 168 258 246 249 255 168 - 240 246 258 261 168 240 246 258 264 168 - 249 246 258 261 168 249 246 258 264 168 - 207 267 273 276 58 270 267 273 276 160 + 201 207 213 216 175 201 207 213 219 175 + 210 207 213 216 175 210 207 213 219 175 + 210 207 213 222 175 267 207 213 216 175 + 267 207 213 219 175 210 207 267 270 150 + 210 207 267 273 121 207 213 222 225 181 + 207 213 222 228 181 216 213 222 225 181 + 216 213 222 228 181 216 213 222 231 181 + 219 213 222 225 181 219 213 222 228 181 + 219 213 222 231 181 213 222 231 234 181 + 213 222 231 237 181 225 222 231 234 181 + 225 222 231 237 181 225 222 231 240 181 + 228 222 231 234 181 228 222 231 237 181 + 228 222 231 240 181 222 231 240 243 183 + 234 231 240 243 183 234 231 240 246 183 + 237 231 240 243 183 237 231 240 246 183 + 243 240 246 249 169 243 240 246 258 169 + 240 246 249 252 169 240 246 249 255 169 + 258 246 249 252 169 258 246 249 255 169 + 240 246 258 261 169 240 246 258 264 169 + 249 246 258 261 169 249 246 258 264 169 + 207 267 273 276 58 270 267 273 276 161 267 273 279 282 90 276 273 279 282 91 276 273 279 285 63 276 273 279 297 60 - 273 279 285 288 174 273 279 285 291 174 - 282 279 285 288 174 282 279 285 291 174 - 282 279 285 294 174 297 279 285 288 174 - 297 279 285 291 174 282 279 297 300 149 - 282 279 297 303 120 288 285 294 5739 167 - 291 285 294 5739 167 279 297 303 306 58 - 300 297 303 306 160 297 303 309 312 90 + 273 279 285 288 175 273 279 285 291 175 + 282 279 285 288 175 282 279 285 291 175 + 282 279 285 294 175 297 279 285 288 175 + 297 279 285 291 175 282 279 297 300 150 + 282 279 297 303 121 288 285 294 5739 168 + 291 285 294 5739 168 279 297 303 306 58 + 300 297 303 306 161 297 303 309 312 90 306 303 309 312 91 306 303 309 315 63 - 306 303 309 342 60 303 309 315 318 174 - 303 309 315 321 174 312 309 315 318 174 - 312 309 315 321 174 312 309 315 324 174 - 342 309 315 318 174 342 309 315 321 174 - 312 309 342 345 149 312 309 342 348 120 - 309 315 324 327 180 309 315 324 330 180 - 318 315 324 327 180 318 315 324 330 180 - 318 315 324 333 180 321 315 324 327 180 - 321 315 324 330 180 321 315 324 333 180 - 327 324 333 336 179 327 324 333 339 179 - 330 324 333 336 179 330 324 333 339 179 - 309 342 348 351 58 345 342 348 351 160 + 306 303 309 342 60 303 309 315 318 175 + 303 309 315 321 175 312 309 315 318 175 + 312 309 315 321 175 312 309 315 324 175 + 342 309 315 318 175 342 309 315 321 175 + 312 309 342 345 150 312 309 342 348 121 + 309 315 324 327 181 309 315 324 330 181 + 318 315 324 327 181 318 315 324 330 181 + 318 315 324 333 181 321 315 324 327 181 + 321 315 324 330 181 321 315 324 333 181 + 327 324 333 336 180 327 324 333 339 180 + 330 324 333 336 180 330 324 333 339 180 + 309 342 348 351 58 345 342 348 351 161 342 348 354 357 90 351 348 354 357 91 351 348 354 360 63 351 348 354 399 60 - 348 354 360 363 174 348 354 360 366 174 - 357 354 360 363 174 357 354 360 366 174 - 357 354 360 369 174 399 354 360 363 174 - 399 354 360 366 174 357 354 399 402 149 - 357 354 399 405 120 354 360 369 372 174 - 363 360 369 372 174 363 360 369 375 174 - 363 360 369 387 174 366 360 369 372 174 - 366 360 369 375 174 366 360 369 387 174 - 360 369 375 378 175 360 369 375 381 175 - 360 369 375 384 175 372 369 375 378 175 - 372 369 375 381 175 372 369 375 384 175 - 387 369 375 378 175 387 369 375 381 175 - 387 369 375 384 175 360 369 387 390 175 - 360 369 387 393 175 360 369 387 396 175 - 372 369 387 390 175 372 369 387 393 175 - 372 369 387 396 175 375 369 387 390 175 - 375 369 387 393 175 375 369 387 396 175 - 354 399 405 408 58 402 399 405 408 160 + 348 354 360 363 175 348 354 360 366 175 + 357 354 360 363 175 357 354 360 366 175 + 357 354 360 369 175 399 354 360 363 175 + 399 354 360 366 175 357 354 399 402 150 + 357 354 399 405 121 354 360 369 372 175 + 363 360 369 372 175 363 360 369 375 175 + 363 360 369 387 175 366 360 369 372 175 + 366 360 369 375 175 366 360 369 387 175 + 360 369 375 378 176 360 369 375 381 176 + 360 369 375 384 176 372 369 375 378 176 + 372 369 375 381 176 372 369 375 384 176 + 387 369 375 378 176 387 369 375 381 176 + 387 369 375 384 176 360 369 387 390 176 + 360 369 387 393 176 360 369 387 396 176 + 372 369 387 390 176 372 369 387 393 176 + 372 369 387 396 176 375 369 387 390 176 + 375 369 387 393 176 375 369 387 396 176 + 354 399 405 408 58 402 399 405 408 161 399 405 411 414 90 408 405 411 414 91 408 405 411 417 64 408 405 411 429 60 - 405 411 417 420 175 405 411 417 423 175 - 405 411 417 426 175 414 411 417 420 175 - 414 411 417 423 175 414 411 417 426 175 - 429 411 417 420 175 429 411 417 423 175 - 429 411 417 426 175 414 411 429 432 149 - 414 411 429 435 120 411 429 435 438 58 - 432 429 435 438 160 429 435 441 444 90 + 405 411 417 420 176 405 411 417 423 176 + 405 411 417 426 176 414 411 417 420 176 + 414 411 417 423 176 414 411 417 426 176 + 429 411 417 420 176 429 411 417 423 176 + 429 411 417 426 176 414 411 429 432 150 + 414 411 429 435 121 411 429 435 438 58 + 432 429 435 438 161 429 435 441 444 90 438 435 441 444 91 438 435 441 447 64 - 438 435 441 459 60 435 441 447 450 175 - 435 441 447 453 175 435 441 447 456 175 - 444 441 447 450 175 444 441 447 453 175 - 444 441 447 456 175 459 441 447 450 175 - 459 441 447 453 175 459 441 447 456 175 - 444 441 459 462 149 444 441 459 465 120 - 441 459 465 468 58 462 459 465 468 160 + 438 435 441 459 60 435 441 447 450 176 + 435 441 447 453 176 435 441 447 456 176 + 444 441 447 450 176 444 441 447 453 176 + 444 441 447 456 176 459 441 447 450 176 + 459 441 447 453 176 459 441 447 456 176 + 444 441 459 462 150 444 441 459 465 121 + 441 459 465 468 58 462 459 465 468 161 459 465 471 474 90 468 465 471 474 91 468 465 471 477 64 468 465 471 489 60 - 465 471 477 480 175 465 471 477 483 175 - 465 471 477 486 175 474 471 477 480 175 - 474 471 477 483 175 474 471 477 486 175 - 489 471 477 480 175 489 471 477 483 175 - 489 471 477 486 175 474 471 489 492 149 - 474 471 489 495 120 471 489 495 498 58 - 492 489 495 498 160 489 495 501 504 90 + 465 471 477 480 176 465 471 477 483 176 + 465 471 477 486 176 474 471 477 480 176 + 474 471 477 483 176 474 471 477 486 176 + 489 471 477 480 176 489 471 477 483 176 + 489 471 477 486 176 474 471 489 492 150 + 474 471 489 495 121 471 489 495 498 58 + 492 489 495 498 161 489 495 501 504 90 498 495 501 504 91 498 495 501 507 63 - 498 495 501 540 60 495 501 507 510 174 - 495 501 507 513 174 504 501 507 510 174 - 504 501 507 513 174 504 501 507 516 174 - 540 501 507 510 174 540 501 507 513 174 - 504 501 540 543 149 504 501 540 546 120 - 501 507 516 519 180 501 507 516 522 180 - 510 507 516 519 180 510 507 516 522 180 - 510 507 516 525 165 513 507 516 519 180 - 513 507 516 522 180 513 507 516 525 165 + 498 495 501 540 60 495 501 507 510 175 + 495 501 507 513 175 504 501 507 510 175 + 504 501 507 513 175 504 501 507 516 175 + 540 501 507 510 175 540 501 507 513 175 + 504 501 540 543 150 504 501 540 546 121 + 501 507 516 519 181 501 507 516 522 181 + 510 507 516 519 181 510 507 516 522 181 + 510 507 516 525 166 513 507 516 519 181 + 513 507 516 522 181 513 507 516 525 166 519 516 525 528 86 522 516 525 528 86 516 525 528 531 87 516 525 528 534 87 516 525 528 537 87 501 540 546 549 58 - 543 540 546 549 160 540 546 552 555 90 + 543 540 546 549 161 540 546 552 555 90 549 546 552 555 91 549 546 552 558 63 - 549 546 552 606 60 546 552 558 561 174 - 546 552 558 564 174 555 552 558 561 174 - 555 552 558 564 174 555 552 558 567 174 - 606 552 558 561 174 606 552 558 564 174 - 555 552 606 609 149 555 552 606 612 120 - 552 558 567 570 180 552 558 567 573 180 - 561 558 567 570 180 561 558 567 573 180 - 561 558 567 576 180 564 558 567 570 180 - 564 558 567 573 180 564 558 567 576 180 - 558 567 576 579 180 558 567 576 582 180 - 570 567 576 579 180 570 567 576 582 180 - 570 567 576 585 180 573 567 576 579 180 - 573 567 576 582 180 573 567 576 585 180 - 567 576 585 588 180 567 576 585 591 180 - 579 576 585 588 180 579 576 585 591 180 - 579 576 585 594 180 582 576 585 588 180 - 582 576 585 591 180 582 576 585 594 180 - 576 585 594 597 183 576 585 594 600 183 - 576 585 594 603 183 588 585 594 597 183 - 588 585 594 600 183 588 585 594 603 183 - 591 585 594 597 183 591 585 594 600 183 - 591 585 594 603 183 552 606 612 615 58 - 609 606 612 615 160 606 612 618 621 90 + 549 546 552 606 60 546 552 558 561 175 + 546 552 558 564 175 555 552 558 561 175 + 555 552 558 564 175 555 552 558 567 175 + 606 552 558 561 175 606 552 558 564 175 + 555 552 606 609 150 555 552 606 612 121 + 552 558 567 570 181 552 558 567 573 181 + 561 558 567 570 181 561 558 567 573 181 + 561 558 567 576 181 564 558 567 570 181 + 564 558 567 573 181 564 558 567 576 181 + 558 567 576 579 181 558 567 576 582 181 + 570 567 576 579 181 570 567 576 582 181 + 570 567 576 585 181 573 567 576 579 181 + 573 567 576 582 181 573 567 576 585 181 + 567 576 585 588 181 567 576 585 591 181 + 579 576 585 588 181 579 576 585 591 181 + 579 576 585 594 181 582 576 585 588 181 + 582 576 585 591 181 582 576 585 594 181 + 576 585 594 597 184 576 585 594 600 184 + 576 585 594 603 184 588 585 594 597 184 + 588 585 594 600 184 588 585 594 603 184 + 591 585 594 597 184 591 585 594 600 184 + 591 585 594 603 184 552 606 612 615 58 + 609 606 612 615 161 606 612 618 621 90 615 612 618 621 91 615 612 618 624 63 - 615 612 618 678 60 612 618 624 627 174 - 612 618 624 630 174 621 618 624 627 174 - 621 618 624 630 174 621 618 624 633 174 - 678 618 624 627 174 678 618 624 630 174 - 621 618 678 681 149 621 618 678 684 120 - 618 624 633 636 180 618 624 633 639 180 - 627 624 633 636 180 627 624 633 639 180 - 627 624 633 642 180 630 624 633 636 180 - 630 624 633 639 180 630 624 633 642 180 - 624 633 642 645 180 624 633 642 648 180 - 636 633 642 645 180 636 633 642 648 180 - 636 633 642 651 180 639 633 642 645 180 - 639 633 642 648 180 639 633 642 651 180 - 633 642 651 654 182 645 642 651 654 182 - 645 642 651 657 182 648 642 651 654 182 - 648 642 651 657 182 654 651 657 660 168 - 654 651 657 669 168 651 657 660 663 168 - 651 657 660 666 168 669 657 660 663 168 - 669 657 660 666 168 651 657 669 672 168 - 651 657 669 675 168 660 657 669 672 168 - 660 657 669 675 168 618 678 684 687 58 - 681 678 684 687 160 678 684 690 693 90 + 615 612 618 678 60 612 618 624 627 175 + 612 618 624 630 175 621 618 624 627 175 + 621 618 624 630 175 621 618 624 633 175 + 678 618 624 627 175 678 618 624 630 175 + 621 618 678 681 150 621 618 678 684 121 + 618 624 633 636 181 618 624 633 639 181 + 627 624 633 636 181 627 624 633 639 181 + 627 624 633 642 181 630 624 633 636 181 + 630 624 633 639 181 630 624 633 642 181 + 624 633 642 645 181 624 633 642 648 181 + 636 633 642 645 181 636 633 642 648 181 + 636 633 642 651 181 639 633 642 645 181 + 639 633 642 648 181 639 633 642 651 181 + 633 642 651 654 183 645 642 651 654 183 + 645 642 651 657 183 648 642 651 654 183 + 648 642 651 657 183 654 651 657 660 169 + 654 651 657 669 169 651 657 660 663 169 + 651 657 660 666 169 669 657 660 663 169 + 669 657 660 666 169 651 657 669 672 169 + 651 657 669 675 169 660 657 669 672 169 + 660 657 669 675 169 618 678 684 687 58 + 681 678 684 687 161 678 684 690 693 90 687 684 690 693 91 687 684 690 696 63 - 687 684 690 729 60 684 690 696 699 174 - 684 690 696 702 174 693 690 696 699 174 - 693 690 696 702 174 693 690 696 708 174 - 729 690 696 699 174 729 690 696 702 174 - 693 690 729 732 149 693 690 729 735 120 - 699 696 708 705 132 699 696 708 723 83 - 702 696 708 705 132 702 696 708 723 83 + 687 684 690 729 60 684 690 696 699 175 + 684 690 696 702 175 693 690 696 699 175 + 693 690 696 702 175 693 690 696 708 175 + 729 690 696 699 175 729 690 696 702 175 + 693 690 729 732 150 693 690 729 735 121 + 699 696 708 705 133 699 696 708 723 83 + 702 696 708 705 133 702 696 708 723 83 708 705 711 714 106 696 708 723 726 107 - 705 708 723 726 129 705 711 717 720 134 + 705 708 723 726 130 705 711 717 720 135 714 711 717 720 105 714 711 717 723 104 711 717 723 726 108 720 717 723 708 67 720 717 723 726 109 690 729 735 738 58 - 732 729 735 738 160 729 735 741 744 92 + 732 729 735 738 161 729 735 741 744 92 729 735 741 747 92 738 735 741 744 93 738 735 741 747 93 738 735 741 750 65 - 744 741 750 753 152 744 741 750 756 122 - 747 741 750 753 152 747 741 750 756 122 - 741 750 756 759 59 753 750 756 759 160 + 744 741 750 753 153 744 741 750 756 123 + 747 741 750 753 153 747 741 750 756 123 + 741 750 756 759 59 753 750 756 759 161 750 756 762 765 90 759 756 762 765 91 759 756 762 768 63 759 756 762 807 60 - 756 762 768 771 174 756 762 768 774 174 - 765 762 768 771 174 765 762 768 774 174 - 765 762 768 777 174 807 762 768 771 174 - 807 762 768 774 174 765 762 807 810 149 - 765 762 807 813 120 762 768 777 780 174 - 771 768 777 780 174 771 768 777 783 174 - 771 768 777 795 174 774 768 777 780 174 - 774 768 777 783 174 774 768 777 795 174 - 768 777 783 786 175 768 777 783 789 175 - 768 777 783 792 175 780 777 783 786 175 - 780 777 783 789 175 780 777 783 792 175 - 795 777 783 786 175 795 777 783 789 175 - 795 777 783 792 175 768 777 795 798 175 - 768 777 795 801 175 768 777 795 804 175 - 780 777 795 798 175 780 777 795 801 175 - 780 777 795 804 175 783 777 795 798 175 - 783 777 795 801 175 783 777 795 804 175 - 762 807 813 816 58 810 807 813 816 160 + 756 762 768 771 175 756 762 768 774 175 + 765 762 768 771 175 765 762 768 774 175 + 765 762 768 777 175 807 762 768 771 175 + 807 762 768 774 175 765 762 807 810 150 + 765 762 807 813 121 762 768 777 780 175 + 771 768 777 780 175 771 768 777 783 175 + 771 768 777 795 175 774 768 777 780 175 + 774 768 777 783 175 774 768 777 795 175 + 768 777 783 786 176 768 777 783 789 176 + 768 777 783 792 176 780 777 783 786 176 + 780 777 783 789 176 780 777 783 792 176 + 795 777 783 786 176 795 777 783 789 176 + 795 777 783 792 176 768 777 795 798 176 + 768 777 795 801 176 768 777 795 804 176 + 780 777 795 798 176 780 777 795 801 176 + 780 777 795 804 176 783 777 795 798 176 + 783 777 795 801 176 783 777 795 804 176 + 762 807 813 816 58 810 807 813 816 161 807 813 819 822 90 816 813 819 822 91 816 813 819 825 63 816 813 819 843 60 - 813 819 825 828 174 813 819 825 831 174 - 822 819 825 828 174 822 819 825 831 174 - 822 819 825 834 174 843 819 825 828 174 - 843 819 825 831 174 822 819 843 846 149 - 822 819 843 849 120 828 825 834 837 179 - 828 825 834 840 179 831 825 834 837 179 - 831 825 834 840 179 819 843 849 852 58 - 846 843 849 852 160 843 849 855 858 90 + 813 819 825 828 175 813 819 825 831 175 + 822 819 825 828 175 822 819 825 831 175 + 822 819 825 834 175 843 819 825 828 175 + 843 819 825 831 175 822 819 843 846 150 + 822 819 843 849 121 828 825 834 837 180 + 828 825 834 840 180 831 825 834 837 180 + 831 825 834 840 180 819 843 849 852 58 + 846 843 849 852 161 843 849 855 858 90 852 849 855 858 91 852 849 855 861 63 - 852 849 855 885 60 849 855 861 864 174 - 849 855 861 867 174 858 855 861 864 174 - 858 855 861 867 174 858 855 861 870 174 - 885 855 861 864 174 885 855 861 867 174 - 858 855 885 888 149 858 855 885 891 120 - 864 861 870 873 161 864 861 870 876 125 - 867 861 870 873 161 867 861 870 876 125 + 852 849 855 885 60 849 855 861 864 175 + 849 855 861 867 175 858 855 861 864 175 + 858 855 861 867 175 858 855 861 870 175 + 885 855 861 864 175 885 855 861 867 175 + 858 855 885 888 150 858 855 885 891 121 + 864 861 870 873 162 864 861 870 876 126 + 867 861 870 873 162 867 861 870 876 126 861 870 876 879 66 861 870 876 882 66 - 873 870 876 879 162 873 870 876 882 162 - 855 885 891 894 58 888 885 891 894 160 + 873 870 876 879 163 873 870 876 882 163 + 855 885 891 894 58 888 885 891 894 161 885 891 897 900 90 894 891 897 900 91 894 891 897 903 63 894 891 897 948 60 - 891 897 903 906 174 891 897 903 909 174 - 900 897 903 906 174 900 897 903 909 174 - 900 897 903 912 174 948 897 903 906 174 - 948 897 903 909 174 900 897 948 951 149 - 900 897 948 954 120 906 903 912 915 178 - 906 903 912 936 178 909 903 912 915 178 - 909 903 912 936 178 903 912 915 918 96 + 891 897 903 906 175 891 897 903 909 175 + 900 897 903 906 175 900 897 903 909 175 + 900 897 903 912 175 948 897 903 906 175 + 948 897 903 909 175 900 897 948 951 150 + 900 897 948 954 121 906 903 912 915 179 + 906 903 912 936 179 909 903 912 915 179 + 909 903 912 936 179 903 912 915 918 96 936 912 915 918 94 903 912 936 939 96 915 912 936 939 94 912 915 921 924 94 918 915 921 924 97 918 915 921 927 94 - 924 921 927 930 164 924 921 927 942 94 + 924 921 927 930 165 924 921 927 942 94 921 927 930 933 71 942 927 930 933 71 - 921 927 942 945 94 930 927 942 945 164 + 921 927 942 945 94 930 927 942 945 165 912 936 942 945 94 939 936 942 927 94 939 936 942 945 97 897 948 954 957 58 - 951 948 954 957 160 948 954 960 963 90 + 951 948 954 957 161 948 954 960 963 90 957 954 960 963 91 957 954 960 966 63 - 957 954 960 1020 60 954 960 966 969 174 - 954 960 966 972 174 963 960 966 969 174 - 963 960 966 972 174 963 960 966 975 174 - 1020 960 966 969 174 1020 960 966 972 174 - 963 960 1020 1023 149 963 960 1020 1026 120 - 960 966 975 978 180 960 966 975 981 180 - 969 966 975 978 180 969 966 975 981 180 - 969 966 975 984 180 972 966 975 978 180 - 972 966 975 981 180 972 966 975 984 180 - 966 975 984 987 180 966 975 984 990 180 - 978 975 984 987 180 978 975 984 990 180 - 978 975 984 993 180 981 975 984 987 180 - 981 975 984 990 180 981 975 984 993 180 - 975 984 993 996 182 987 984 993 996 182 - 987 984 993 999 182 990 984 993 996 182 - 990 984 993 999 182 996 993 999 1002 168 - 996 993 999 1011 168 993 999 1002 1005 168 - 993 999 1002 1008 168 1011 999 1002 1005 168 - 1011 999 1002 1008 168 993 999 1011 1014 168 - 993 999 1011 1017 168 1002 999 1011 1014 168 - 1002 999 1011 1017 168 960 1020 1026 1029 58 - 1023 1020 1026 1029 160 1020 1026 1032 1035 92 + 957 954 960 1020 60 954 960 966 969 175 + 954 960 966 972 175 963 960 966 969 175 + 963 960 966 972 175 963 960 966 975 175 + 1020 960 966 969 175 1020 960 966 972 175 + 963 960 1020 1023 150 963 960 1020 1026 121 + 960 966 975 978 181 960 966 975 981 181 + 969 966 975 978 181 969 966 975 981 181 + 969 966 975 984 181 972 966 975 978 181 + 972 966 975 981 181 972 966 975 984 181 + 966 975 984 987 181 966 975 984 990 181 + 978 975 984 987 181 978 975 984 990 181 + 978 975 984 993 181 981 975 984 987 181 + 981 975 984 990 181 981 975 984 993 181 + 975 984 993 996 183 987 984 993 996 183 + 987 984 993 999 183 990 984 993 996 183 + 990 984 993 999 183 996 993 999 1002 169 + 996 993 999 1011 169 993 999 1002 1005 169 + 993 999 1002 1008 169 1011 999 1002 1005 169 + 1011 999 1002 1008 169 993 999 1011 1014 169 + 993 999 1011 1017 169 1002 999 1011 1014 169 + 1002 999 1011 1017 169 960 1020 1026 1029 58 + 1023 1020 1026 1029 161 1020 1026 1032 1035 92 1020 1026 1032 1038 92 1029 1026 1032 1035 93 1029 1026 1032 1038 93 1029 1026 1032 1041 65 - 1035 1032 1041 1044 152 1035 1032 1041 1047 122 - 1038 1032 1041 1044 152 1038 1032 1041 1047 122 - 1032 1041 1047 1050 59 1044 1041 1047 1050 160 + 1035 1032 1041 1044 153 1035 1032 1041 1047 123 + 1038 1032 1041 1044 153 1038 1032 1041 1047 123 + 1032 1041 1047 1050 59 1044 1041 1047 1050 161 1041 1047 1053 1056 90 1050 1047 1053 1056 91 1050 1047 1053 1059 63 1050 1047 1053 1104 60 - 1047 1053 1059 1062 174 1047 1053 1059 1065 174 - 1056 1053 1059 1062 174 1056 1053 1059 1065 174 - 1056 1053 1059 1068 174 1104 1053 1059 1062 174 - 1104 1053 1059 1065 174 1056 1053 1104 1107 149 - 1056 1053 1104 1110 120 1062 1059 1068 1071 178 - 1062 1059 1068 1092 178 1065 1059 1068 1071 178 - 1065 1059 1068 1092 178 1059 1068 1071 1074 96 + 1047 1053 1059 1062 175 1047 1053 1059 1065 175 + 1056 1053 1059 1062 175 1056 1053 1059 1065 175 + 1056 1053 1059 1068 175 1104 1053 1059 1062 175 + 1104 1053 1059 1065 175 1056 1053 1104 1107 150 + 1056 1053 1104 1110 121 1062 1059 1068 1071 179 + 1062 1059 1068 1092 179 1065 1059 1068 1071 179 + 1065 1059 1068 1092 179 1059 1068 1071 1074 96 1092 1068 1071 1074 94 1059 1068 1092 1095 96 1071 1068 1092 1095 94 1068 1071 1077 1080 94 1074 1071 1077 1080 97 1074 1071 1077 1083 94 - 1080 1077 1083 1086 164 1080 1077 1083 1098 94 + 1080 1077 1083 1086 165 1080 1077 1083 1098 94 1077 1083 1086 1089 71 1098 1083 1086 1089 71 - 1077 1083 1098 1101 94 1086 1083 1098 1101 164 + 1077 1083 1098 1101 94 1086 1083 1098 1101 165 1068 1092 1098 1101 94 1095 1092 1098 1083 94 1095 1092 1098 1101 97 1053 1104 1110 1113 58 - 1107 1104 1110 1113 160 1104 1110 1116 1119 90 + 1107 1104 1110 1113 161 1104 1110 1116 1119 90 1113 1110 1116 1119 91 1113 1110 1116 1122 63 - 1113 1110 1116 1137 60 1110 1116 1122 1125 174 - 1110 1116 1122 1128 174 1119 1116 1122 1125 174 - 1119 1116 1122 1128 174 1119 1116 1122 1131 174 - 1137 1116 1122 1125 174 1137 1116 1122 1128 174 - 1119 1116 1137 1140 149 1119 1116 1137 1143 120 + 1113 1110 1116 1137 60 1110 1116 1122 1125 175 + 1110 1116 1122 1128 175 1119 1116 1122 1125 175 + 1119 1116 1122 1128 175 1119 1116 1122 1131 175 + 1137 1116 1122 1125 175 1137 1116 1122 1128 175 + 1119 1116 1137 1140 150 1119 1116 1137 1143 121 1116 1122 -1131 1134 78 1116 1122 -1131 1134 79 - 1116 1122 1131 1134 80 1125 1122 1131 1134 184 - 1128 1122 1131 1134 184 1116 1137 1143 1146 58 - 1140 1137 1143 1146 160 1137 1143 1149 1152 90 + 1116 1122 1131 1134 80 1125 1122 1131 1134 185 + 1128 1122 1131 1134 185 1116 1137 1143 1146 58 + 1140 1137 1143 1146 161 1137 1143 1149 1152 90 1146 1143 1149 1152 91 1146 1143 1149 1155 63 - 1146 1143 1149 1194 60 1143 1149 1155 1158 174 - 1143 1149 1155 1161 174 1152 1149 1155 1158 174 - 1152 1149 1155 1161 174 1152 1149 1155 1164 174 - 1194 1149 1155 1158 174 1194 1149 1155 1161 174 - 1152 1149 1194 1197 149 1152 1149 1194 1200 120 - 1149 1155 1164 1167 174 1158 1155 1164 1167 174 - 1158 1155 1164 1170 174 1158 1155 1164 1182 174 - 1161 1155 1164 1167 174 1161 1155 1164 1170 174 - 1161 1155 1164 1182 174 1155 1164 1170 1173 175 - 1155 1164 1170 1176 175 1155 1164 1170 1179 175 - 1167 1164 1170 1173 175 1167 1164 1170 1176 175 - 1167 1164 1170 1179 175 1182 1164 1170 1173 175 - 1182 1164 1170 1176 175 1182 1164 1170 1179 175 - 1155 1164 1182 1185 175 1155 1164 1182 1188 175 - 1155 1164 1182 1191 175 1167 1164 1182 1185 175 - 1167 1164 1182 1188 175 1167 1164 1182 1191 175 - 1170 1164 1182 1185 175 1170 1164 1182 1188 175 - 1170 1164 1182 1191 175 1149 1194 1200 1203 58 - 1197 1194 1200 1203 160 1194 1200 1206 1209 92 + 1146 1143 1149 1194 60 1143 1149 1155 1158 175 + 1143 1149 1155 1161 175 1152 1149 1155 1158 175 + 1152 1149 1155 1161 175 1152 1149 1155 1164 175 + 1194 1149 1155 1158 175 1194 1149 1155 1161 175 + 1152 1149 1194 1197 150 1152 1149 1194 1200 121 + 1149 1155 1164 1167 175 1158 1155 1164 1167 175 + 1158 1155 1164 1170 175 1158 1155 1164 1182 175 + 1161 1155 1164 1167 175 1161 1155 1164 1170 175 + 1161 1155 1164 1182 175 1155 1164 1170 1173 176 + 1155 1164 1170 1176 176 1155 1164 1170 1179 176 + 1167 1164 1170 1173 176 1167 1164 1170 1176 176 + 1167 1164 1170 1179 176 1182 1164 1170 1173 176 + 1182 1164 1170 1176 176 1182 1164 1170 1179 176 + 1155 1164 1182 1185 176 1155 1164 1182 1188 176 + 1155 1164 1182 1191 176 1167 1164 1182 1185 176 + 1167 1164 1182 1188 176 1167 1164 1182 1191 176 + 1170 1164 1182 1185 176 1170 1164 1182 1188 176 + 1170 1164 1182 1191 176 1149 1194 1200 1203 58 + 1197 1194 1200 1203 161 1194 1200 1206 1209 92 1194 1200 1206 1212 92 1203 1200 1206 1209 93 1203 1200 1206 1212 93 1203 1200 1206 1215 65 - 1209 1206 1215 1218 152 1209 1206 1215 1221 122 - 1212 1206 1215 1218 152 1212 1206 1215 1221 122 - 1206 1215 1221 1224 59 1218 1215 1221 1224 160 + 1209 1206 1215 1218 153 1209 1206 1215 1221 123 + 1212 1206 1215 1218 153 1212 1206 1215 1221 123 + 1206 1215 1221 1224 59 1218 1215 1221 1224 161 1215 1221 1227 1230 90 1224 1221 1227 1230 91 1224 1221 1227 1233 63 1224 1221 1227 1257 60 - 1221 1227 1233 1236 174 1221 1227 1233 1239 174 - 1230 1227 1233 1236 174 1230 1227 1233 1239 174 - 1230 1227 1233 1242 174 1257 1227 1233 1236 174 - 1257 1227 1233 1239 174 1230 1227 1257 1260 149 - 1230 1227 1257 1263 120 1236 1233 1242 1245 161 - 1236 1233 1242 1248 125 1239 1233 1242 1245 161 - 1239 1233 1242 1248 125 1233 1242 1248 1251 66 - 1233 1242 1248 1254 66 1245 1242 1248 1251 162 - 1245 1242 1248 1254 162 1227 1257 1263 1266 58 - 1260 1257 1263 1266 160 1257 1263 1269 1272 90 + 1221 1227 1233 1236 175 1221 1227 1233 1239 175 + 1230 1227 1233 1236 175 1230 1227 1233 1239 175 + 1230 1227 1233 1242 175 1257 1227 1233 1236 175 + 1257 1227 1233 1239 175 1230 1227 1257 1260 150 + 1230 1227 1257 1263 121 1236 1233 1242 1245 162 + 1236 1233 1242 1248 126 1239 1233 1242 1245 162 + 1239 1233 1242 1248 126 1233 1242 1248 1251 66 + 1233 1242 1248 1254 66 1245 1242 1248 1251 163 + 1245 1242 1248 1254 163 1227 1257 1263 1266 58 + 1260 1257 1263 1266 161 1257 1263 1269 1272 90 1266 1263 1269 1272 91 1266 1263 1269 1275 63 - 1266 1263 1269 1329 60 1263 1269 1275 1278 174 - 1263 1269 1275 1281 174 1272 1269 1275 1278 174 - 1272 1269 1275 1281 174 1272 1269 1275 1284 174 - 1329 1269 1275 1278 174 1329 1269 1275 1281 174 - 1272 1269 1329 1332 149 1272 1269 1329 1335 120 + 1266 1263 1269 1329 60 1263 1269 1275 1278 175 + 1263 1269 1275 1281 175 1272 1269 1275 1278 175 + 1272 1269 1275 1281 175 1272 1269 1275 1284 175 + 1329 1269 1275 1278 175 1329 1269 1275 1281 175 + 1272 1269 1329 1332 150 1272 1269 1329 1335 121 1278 1275 1284 1287 84 1278 1275 1284 1302 85 1281 1275 1284 1287 84 1281 1275 1284 1302 85 1275 1284 1287 1290 101 1302 1284 1287 1290 100 1284 1287 1293 1296 68 1290 1287 1293 1296 103 1290 1287 1293 1299 102 1296 1293 1299 1302 70 - 1296 1293 1299 1317 69 1293 1299 1317 1320 138 + 1296 1293 1299 1317 69 1293 1299 1317 1320 139 1302 1299 1317 1320 98 1284 1302 1305 1308 99 1299 1302 1305 1308 98 1302 1305 1311 1314 95 1308 1305 1311 1314 97 1308 1305 1311 1323 94 1305 1311 1323 1326 94 1314 1311 1323 1317 94 1314 1311 1323 1326 97 1299 1317 1323 1326 95 1320 1317 1323 1311 94 1320 1317 1323 1326 97 - 1269 1329 1335 1338 58 1332 1329 1335 1338 160 + 1269 1329 1335 1338 58 1332 1329 1335 1338 161 1329 1335 1341 1344 90 1338 1335 1341 1344 91 1338 1335 1341 1347 62 1338 1335 1341 1377 60 - 1335 1341 1347 1350 173 1344 1341 1347 1350 173 - 1344 1341 1347 1353 173 1344 1341 1347 1365 173 - 1377 1341 1347 1350 173 1344 1341 1377 1380 149 - 1344 1341 1377 1383 120 1341 1347 1353 1356 175 - 1341 1347 1353 1359 175 1341 1347 1353 1362 175 - 1350 1347 1353 1356 175 1350 1347 1353 1359 175 - 1350 1347 1353 1362 175 1365 1347 1353 1356 175 - 1365 1347 1353 1359 175 1365 1347 1353 1362 175 - 1341 1347 1365 1368 175 1341 1347 1365 1371 175 - 1341 1347 1365 1374 175 1350 1347 1365 1368 175 - 1350 1347 1365 1371 175 1350 1347 1365 1374 175 - 1353 1347 1365 1368 175 1353 1347 1365 1371 175 - 1353 1347 1365 1374 175 1341 1377 1383 1386 58 - 1380 1377 1383 1386 160 1377 1383 1389 1392 90 + 1335 1341 1347 1350 174 1344 1341 1347 1350 174 + 1344 1341 1347 1353 174 1344 1341 1347 1365 174 + 1377 1341 1347 1350 174 1344 1341 1377 1380 150 + 1344 1341 1377 1383 121 1341 1347 1353 1356 176 + 1341 1347 1353 1359 176 1341 1347 1353 1362 176 + 1350 1347 1353 1356 176 1350 1347 1353 1359 176 + 1350 1347 1353 1362 176 1365 1347 1353 1356 176 + 1365 1347 1353 1359 176 1365 1347 1353 1362 176 + 1341 1347 1365 1368 176 1341 1347 1365 1371 176 + 1341 1347 1365 1374 176 1350 1347 1365 1368 176 + 1350 1347 1365 1371 176 1350 1347 1365 1374 176 + 1353 1347 1365 1368 176 1353 1347 1365 1371 176 + 1353 1347 1365 1374 176 1341 1377 1383 1386 58 + 1380 1377 1383 1386 161 1377 1383 1389 1392 90 1386 1383 1389 1392 91 1386 1383 1389 1395 63 - 1386 1383 1389 1407 60 1383 1389 1395 1398 174 - 1383 1389 1395 1401 174 1392 1389 1395 1398 174 - 1392 1389 1395 1401 174 1392 1389 1395 1404 174 - 1407 1389 1395 1398 174 1407 1389 1395 1401 174 - 1392 1389 1407 1410 149 1392 1389 1407 1413 120 - 1398 1395 1404 5193 167 1401 1395 1404 5193 167 - 1389 1407 1413 1416 58 1410 1407 1413 1416 160 + 1386 1383 1389 1407 60 1383 1389 1395 1398 175 + 1383 1389 1395 1401 175 1392 1389 1395 1398 175 + 1392 1389 1395 1401 175 1392 1389 1395 1404 175 + 1407 1389 1395 1398 175 1407 1389 1395 1401 175 + 1392 1389 1407 1410 150 1392 1389 1407 1413 121 + 1398 1395 1404 5193 168 1401 1395 1404 5193 168 + 1389 1407 1413 1416 58 1410 1407 1413 1416 161 1407 1413 1419 1422 90 1416 1413 1419 1422 91 1416 1413 1419 1425 64 1416 1413 1419 1437 60 - 1413 1419 1425 1428 175 1413 1419 1425 1431 175 - 1413 1419 1425 1434 175 1422 1419 1425 1428 175 - 1422 1419 1425 1431 175 1422 1419 1425 1434 175 - 1437 1419 1425 1428 175 1437 1419 1425 1431 175 - 1437 1419 1425 1434 175 1422 1419 1437 1440 149 - 1422 1419 1437 1443 120 1419 1437 1443 1446 58 - 1440 1437 1443 1446 160 1437 1443 1449 1452 90 + 1413 1419 1425 1428 176 1413 1419 1425 1431 176 + 1413 1419 1425 1434 176 1422 1419 1425 1428 176 + 1422 1419 1425 1431 176 1422 1419 1425 1434 176 + 1437 1419 1425 1428 176 1437 1419 1425 1431 176 + 1437 1419 1425 1434 176 1422 1419 1437 1440 150 + 1422 1419 1437 1443 121 1419 1437 1443 1446 58 + 1440 1437 1443 1446 161 1437 1443 1449 1452 90 1446 1443 1449 1452 91 1446 1443 1449 1455 64 - 1446 1443 1449 1467 60 1443 1449 1455 1458 175 - 1443 1449 1455 1461 175 1443 1449 1455 1464 175 - 1452 1449 1455 1458 175 1452 1449 1455 1461 175 - 1452 1449 1455 1464 175 1467 1449 1455 1458 175 - 1467 1449 1455 1461 175 1467 1449 1455 1464 175 - 1452 1449 1467 1470 149 1452 1449 1467 1473 120 - 1449 1467 1473 1476 58 1470 1467 1473 1476 160 + 1446 1443 1449 1467 60 1443 1449 1455 1458 176 + 1443 1449 1455 1461 176 1443 1449 1455 1464 176 + 1452 1449 1455 1458 176 1452 1449 1455 1461 176 + 1452 1449 1455 1464 176 1467 1449 1455 1458 176 + 1467 1449 1455 1461 176 1467 1449 1455 1464 176 + 1452 1449 1467 1470 150 1452 1449 1467 1473 121 + 1449 1467 1473 1476 58 1470 1467 1473 1476 161 1467 1473 1479 1482 90 1476 1473 1479 1482 91 1476 1473 1479 1485 63 1476 1473 1479 1533 60 - 1473 1479 1485 1488 174 1473 1479 1485 1491 174 - 1482 1479 1485 1488 174 1482 1479 1485 1491 174 - 1482 1479 1485 1494 174 1533 1479 1485 1488 174 - 1533 1479 1485 1491 174 1482 1479 1533 1536 149 - 1482 1479 1533 1539 120 1479 1485 1494 1497 180 - 1479 1485 1494 1500 180 1488 1485 1494 1497 180 - 1488 1485 1494 1500 180 1488 1485 1494 1503 180 - 1491 1485 1494 1497 180 1491 1485 1494 1500 180 - 1491 1485 1494 1503 180 1485 1494 1503 1506 180 - 1485 1494 1503 1509 180 1497 1494 1503 1506 180 - 1497 1494 1503 1509 180 1497 1494 1503 1512 180 - 1500 1494 1503 1506 180 1500 1494 1503 1509 180 - 1500 1494 1503 1512 180 1494 1503 1512 1515 180 - 1494 1503 1512 1518 180 1506 1503 1512 1515 180 - 1506 1503 1512 1518 180 1506 1503 1512 1521 180 - 1509 1503 1512 1515 180 1509 1503 1512 1518 180 - 1509 1503 1512 1521 180 1503 1512 1521 1524 183 - 1503 1512 1521 1527 183 1503 1512 1521 1530 183 - 1515 1512 1521 1524 183 1515 1512 1521 1527 183 - 1515 1512 1521 1530 183 1518 1512 1521 1524 183 - 1518 1512 1521 1527 183 1518 1512 1521 1530 183 - 1479 1533 1539 1542 58 1536 1533 1539 1542 160 + 1473 1479 1485 1488 175 1473 1479 1485 1491 175 + 1482 1479 1485 1488 175 1482 1479 1485 1491 175 + 1482 1479 1485 1494 175 1533 1479 1485 1488 175 + 1533 1479 1485 1491 175 1482 1479 1533 1536 150 + 1482 1479 1533 1539 121 1479 1485 1494 1497 181 + 1479 1485 1494 1500 181 1488 1485 1494 1497 181 + 1488 1485 1494 1500 181 1488 1485 1494 1503 181 + 1491 1485 1494 1497 181 1491 1485 1494 1500 181 + 1491 1485 1494 1503 181 1485 1494 1503 1506 181 + 1485 1494 1503 1509 181 1497 1494 1503 1506 181 + 1497 1494 1503 1509 181 1497 1494 1503 1512 181 + 1500 1494 1503 1506 181 1500 1494 1503 1509 181 + 1500 1494 1503 1512 181 1494 1503 1512 1515 181 + 1494 1503 1512 1518 181 1506 1503 1512 1515 181 + 1506 1503 1512 1518 181 1506 1503 1512 1521 181 + 1509 1503 1512 1515 181 1509 1503 1512 1518 181 + 1509 1503 1512 1521 181 1503 1512 1521 1524 184 + 1503 1512 1521 1527 184 1503 1512 1521 1530 184 + 1515 1512 1521 1524 184 1515 1512 1521 1527 184 + 1515 1512 1521 1530 184 1518 1512 1521 1524 184 + 1518 1512 1521 1527 184 1518 1512 1521 1530 184 + 1479 1533 1539 1542 58 1536 1533 1539 1542 161 1533 1539 1545 1548 90 1542 1539 1545 1548 91 1542 1539 1545 1551 63 1542 1539 1545 1593 60 - 1539 1545 1551 1554 174 1539 1545 1551 1557 174 - 1548 1545 1551 1554 174 1548 1545 1551 1557 174 - 1548 1545 1551 1560 174 1593 1545 1551 1554 174 - 1593 1545 1551 1557 174 1548 1545 1593 1596 149 - 1548 1545 1593 1599 120 1554 1551 1560 1563 178 - 1554 1551 1560 1581 178 1557 1551 1560 1563 178 - 1557 1551 1560 1581 178 1551 1560 1563 1566 96 + 1539 1545 1551 1554 175 1539 1545 1551 1557 175 + 1548 1545 1551 1554 175 1548 1545 1551 1557 175 + 1548 1545 1551 1560 175 1593 1545 1551 1554 175 + 1593 1545 1551 1557 175 1548 1545 1593 1596 150 + 1548 1545 1593 1599 121 1554 1551 1560 1563 179 + 1554 1551 1560 1581 179 1557 1551 1560 1563 179 + 1557 1551 1560 1581 179 1551 1560 1563 1566 96 1581 1560 1563 1566 94 1551 1560 1581 1584 96 1563 1560 1581 1584 94 1560 1563 1569 1572 94 1566 1563 1569 1572 97 1566 1563 1569 1575 94 @@ -10112,50 +10102,50 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 1578 1575 1587 1581 94 1578 1575 1587 1590 97 1560 1581 1587 1590 94 1584 1581 1587 1575 94 1584 1581 1587 1590 97 1545 1593 1599 1602 58 - 1596 1593 1599 1602 160 1593 1599 1605 1608 90 + 1596 1593 1599 1602 161 1593 1599 1605 1608 90 1602 1599 1605 1608 91 1602 1599 1605 1611 63 - 1602 1599 1605 1638 60 1599 1605 1611 1614 174 - 1599 1605 1611 1617 174 1608 1605 1611 1614 174 - 1608 1605 1611 1617 174 1608 1605 1611 1620 174 - 1638 1605 1611 1614 174 1638 1605 1611 1617 174 - 1608 1605 1638 1641 149 1608 1605 1638 1644 120 - 1605 1611 1620 1623 180 1605 1611 1620 1626 180 - 1614 1611 1620 1623 180 1614 1611 1620 1626 180 - 1614 1611 1620 1629 180 1617 1611 1620 1623 180 - 1617 1611 1620 1626 180 1617 1611 1620 1629 180 - 1623 1620 1629 1632 179 1623 1620 1629 1635 179 - 1626 1620 1629 1632 179 1626 1620 1629 1635 179 - 1605 1638 1644 1647 58 1641 1638 1644 1647 160 + 1602 1599 1605 1638 60 1599 1605 1611 1614 175 + 1599 1605 1611 1617 175 1608 1605 1611 1614 175 + 1608 1605 1611 1617 175 1608 1605 1611 1620 175 + 1638 1605 1611 1614 175 1638 1605 1611 1617 175 + 1608 1605 1638 1641 150 1608 1605 1638 1644 121 + 1605 1611 1620 1623 181 1605 1611 1620 1626 181 + 1614 1611 1620 1623 181 1614 1611 1620 1626 181 + 1614 1611 1620 1629 181 1617 1611 1620 1623 181 + 1617 1611 1620 1626 181 1617 1611 1620 1629 181 + 1623 1620 1629 1632 180 1623 1620 1629 1635 180 + 1626 1620 1629 1632 180 1626 1620 1629 1635 180 + 1605 1638 1644 1647 58 1641 1638 1644 1647 161 1638 1644 1650 1653 90 1647 1644 1650 1653 91 1647 1644 1650 1656 63 1647 1644 1650 1671 60 - 1644 1650 1656 1659 174 1644 1650 1656 1662 174 - 1653 1650 1656 1659 174 1653 1650 1656 1662 174 - 1653 1650 1656 1665 174 1671 1650 1656 1659 174 - 1671 1650 1656 1662 174 1653 1650 1671 1674 149 - 1653 1650 1671 1677 120 1650 1656 -1665 1668 78 + 1644 1650 1656 1659 175 1644 1650 1656 1662 175 + 1653 1650 1656 1659 175 1653 1650 1656 1662 175 + 1653 1650 1656 1665 175 1671 1650 1656 1659 175 + 1671 1650 1656 1662 175 1653 1650 1671 1674 150 + 1653 1650 1671 1677 121 1650 1656 -1665 1668 78 1650 1656 -1665 1668 79 1650 1656 1665 1668 80 - 1659 1656 1665 1668 184 1662 1656 1665 1668 184 - 1650 1671 1677 1680 58 1674 1671 1677 1680 160 + 1659 1656 1665 1668 185 1662 1656 1665 1668 185 + 1650 1671 1677 1680 58 1674 1671 1677 1680 161 1671 1677 1683 1686 90 1680 1677 1683 1686 91 1680 1677 1683 1689 63 1680 1677 1683 1713 60 - 1677 1683 1689 1692 174 1677 1683 1689 1695 174 - 1686 1683 1689 1692 174 1686 1683 1689 1695 174 - 1686 1683 1689 1698 174 1713 1683 1689 1692 174 - 1713 1683 1689 1695 174 1686 1683 1713 1716 149 - 1686 1683 1713 1719 120 1692 1689 1698 1701 161 - 1692 1689 1698 1704 125 1695 1689 1698 1701 161 - 1695 1689 1698 1704 125 1689 1698 1704 1707 66 - 1689 1698 1704 1710 66 1701 1698 1704 1707 162 - 1701 1698 1704 1710 162 1683 1713 1719 1722 58 - 1716 1713 1719 1722 160 1713 1719 1725 1728 90 + 1677 1683 1689 1692 175 1677 1683 1689 1695 175 + 1686 1683 1689 1692 175 1686 1683 1689 1695 175 + 1686 1683 1689 1698 175 1713 1683 1689 1692 175 + 1713 1683 1689 1695 175 1686 1683 1713 1716 150 + 1686 1683 1713 1719 121 1692 1689 1698 1701 162 + 1692 1689 1698 1704 126 1695 1689 1698 1701 162 + 1695 1689 1698 1704 126 1689 1698 1704 1707 66 + 1689 1698 1704 1710 66 1701 1698 1704 1707 163 + 1701 1698 1704 1710 163 1683 1713 1719 1722 58 + 1716 1713 1719 1722 161 1713 1719 1725 1728 90 1722 1719 1725 1728 91 1722 1719 1725 1731 63 - 1722 1719 1725 1773 60 1719 1725 1731 1734 174 - 1719 1725 1731 1737 174 1728 1725 1731 1734 174 - 1728 1725 1731 1737 174 1728 1725 1731 1740 174 - 1773 1725 1731 1734 174 1773 1725 1731 1737 174 - 1728 1725 1773 1776 149 1728 1725 1773 1779 120 - 1734 1731 1740 1743 178 1734 1731 1740 1761 178 - 1737 1731 1740 1743 178 1737 1731 1740 1761 178 + 1722 1719 1725 1773 60 1719 1725 1731 1734 175 + 1719 1725 1731 1737 175 1728 1725 1731 1734 175 + 1728 1725 1731 1737 175 1728 1725 1731 1740 175 + 1773 1725 1731 1734 175 1773 1725 1731 1737 175 + 1728 1725 1773 1776 150 1728 1725 1773 1779 121 + 1734 1731 1740 1743 179 1734 1731 1740 1761 179 + 1737 1731 1740 1743 179 1737 1731 1740 1761 179 1731 1740 1743 1746 96 1761 1740 1743 1746 94 1731 1740 1761 1764 96 1743 1740 1761 1764 94 1740 1743 1749 1752 94 1746 1743 1749 1752 97 @@ -10164,2163 +10154,2163 @@ SOL SOL SOL SOL SOL SOL SOL SOL SOL 1749 1755 1767 1770 94 1758 1755 1767 1761 94 1758 1755 1767 1770 97 1740 1761 1767 1770 94 1764 1761 1767 1755 94 1764 1761 1767 1770 97 - 1725 1773 1779 1782 58 1776 1773 1779 1782 160 + 1725 1773 1779 1782 58 1776 1773 1779 1782 161 1773 1779 1785 1788 90 1782 1779 1785 1788 91 1782 1779 1785 1791 63 1782 1779 1785 1815 60 - 1779 1785 1791 1794 174 1779 1785 1791 1797 174 - 1788 1785 1791 1794 174 1788 1785 1791 1797 174 - 1788 1785 1791 1800 174 1815 1785 1791 1794 174 - 1815 1785 1791 1797 174 1788 1785 1815 1818 149 - 1788 1785 1815 1821 120 1794 1791 1800 1803 161 - 1794 1791 1800 1806 125 1797 1791 1800 1803 161 - 1797 1791 1800 1806 125 1791 1800 1806 1809 66 - 1791 1800 1806 1812 66 1803 1800 1806 1809 162 - 1803 1800 1806 1812 162 1785 1815 1821 1824 58 - 1818 1815 1821 1824 160 1815 1821 1827 1830 90 + 1779 1785 1791 1794 175 1779 1785 1791 1797 175 + 1788 1785 1791 1794 175 1788 1785 1791 1797 175 + 1788 1785 1791 1800 175 1815 1785 1791 1794 175 + 1815 1785 1791 1797 175 1788 1785 1815 1818 150 + 1788 1785 1815 1821 121 1794 1791 1800 1803 162 + 1794 1791 1800 1806 126 1797 1791 1800 1803 162 + 1797 1791 1800 1806 126 1791 1800 1806 1809 66 + 1791 1800 1806 1812 66 1803 1800 1806 1809 163 + 1803 1800 1806 1812 163 1785 1815 1821 1824 58 + 1818 1815 1821 1824 161 1815 1821 1827 1830 90 1824 1821 1827 1830 91 1824 1821 1827 1833 62 - 1824 1821 1827 1857 60 1821 1827 1833 1836 173 - 1830 1827 1833 1836 173 1830 1827 1833 1839 173 - 1830 1827 1833 1845 173 1857 1827 1833 1836 173 - 1830 1827 1857 1860 149 1830 1827 1857 1863 120 + 1824 1821 1827 1857 60 1821 1827 1833 1836 174 + 1830 1827 1833 1836 174 1830 1827 1833 1839 174 + 1830 1827 1833 1845 174 1857 1827 1833 1836 174 + 1830 1827 1857 1860 150 1830 1827 1857 1863 121 1827 1833 -1839 1842 72 1827 1833 -1839 1842 73 - 1827 1833 1839 1842 74 1836 1833 1839 1842 177 + 1827 1833 1839 1842 74 1836 1833 1839 1842 178 1845 1833 -1839 1842 75 1845 1833 -1839 1842 76 - 1845 1833 1839 1842 77 1827 1833 1845 1848 175 - 1827 1833 1845 1851 175 1827 1833 1845 1854 175 - 1836 1833 1845 1848 175 1836 1833 1845 1851 175 - 1836 1833 1845 1854 175 1839 1833 1845 1848 175 - 1839 1833 1845 1851 175 1839 1833 1845 1854 175 - 1827 1857 1863 1866 58 1860 1857 1863 1866 160 + 1845 1833 1839 1842 77 1827 1833 1845 1848 176 + 1827 1833 1845 1851 176 1827 1833 1845 1854 176 + 1836 1833 1845 1848 176 1836 1833 1845 1851 176 + 1836 1833 1845 1854 176 1839 1833 1845 1848 176 + 1839 1833 1845 1851 176 1839 1833 1845 1854 176 + 1827 1857 1863 1866 58 1860 1857 1863 1866 161 1857 1863 1869 1872 90 1866 1863 1869 1872 91 1866 1863 1869 1875 63 1866 1863 1869 1908 60 - 1863 1869 1875 1878 174 1863 1869 1875 1881 174 - 1872 1869 1875 1878 174 1872 1869 1875 1881 174 - 1872 1869 1875 1884 174 1908 1869 1875 1878 174 - 1908 1869 1875 1881 174 1872 1869 1908 1911 149 - 1872 1869 1908 1914 120 1869 1875 1884 1887 180 - 1869 1875 1884 1890 180 1878 1875 1884 1887 180 - 1878 1875 1884 1890 180 1878 1875 1884 1893 180 - 1881 1875 1884 1887 180 1881 1875 1884 1890 180 - 1881 1875 1884 1893 180 1887 1884 1893 1896 161 - 1887 1884 1893 1899 125 1890 1884 1893 1896 161 - 1890 1884 1893 1899 125 1884 1893 1899 1902 66 - 1884 1893 1899 1905 66 1896 1893 1899 1902 162 - 1896 1893 1899 1905 162 1869 1908 1914 1917 58 - 1911 1908 1914 1917 160 1908 1914 1920 1923 90 + 1863 1869 1875 1878 175 1863 1869 1875 1881 175 + 1872 1869 1875 1878 175 1872 1869 1875 1881 175 + 1872 1869 1875 1884 175 1908 1869 1875 1878 175 + 1908 1869 1875 1881 175 1872 1869 1908 1911 150 + 1872 1869 1908 1914 121 1869 1875 1884 1887 181 + 1869 1875 1884 1890 181 1878 1875 1884 1887 181 + 1878 1875 1884 1890 181 1878 1875 1884 1893 181 + 1881 1875 1884 1887 181 1881 1875 1884 1890 181 + 1881 1875 1884 1893 181 1887 1884 1893 1896 162 + 1887 1884 1893 1899 126 1890 1884 1893 1896 162 + 1890 1884 1893 1899 126 1884 1893 1899 1902 66 + 1884 1893 1899 1905 66 1896 1893 1899 1902 163 + 1896 1893 1899 1905 163 1869 1908 1914 1917 58 + 1911 1908 1914 1917 161 1908 1914 1920 1923 90 1917 1914 1920 1923 91 1917 1914 1920 1926 64 - 1917 1914 1920 1938 60 1914 1920 1926 1929 175 - 1914 1920 1926 1932 175 1914 1920 1926 1935 175 - 1923 1920 1926 1929 175 1923 1920 1926 1932 175 - 1923 1920 1926 1935 175 1938 1920 1926 1929 175 - 1938 1920 1926 1932 175 1938 1920 1926 1935 175 - 1923 1920 1938 1941 149 1923 1920 1938 1944 120 - 1920 1938 1944 1947 58 1941 1938 1944 1947 160 + 1917 1914 1920 1938 60 1914 1920 1926 1929 176 + 1914 1920 1926 1932 176 1914 1920 1926 1935 176 + 1923 1920 1926 1929 176 1923 1920 1926 1932 176 + 1923 1920 1926 1935 176 1938 1920 1926 1929 176 + 1938 1920 1926 1932 176 1938 1920 1926 1935 176 + 1923 1920 1938 1941 150 1923 1920 1938 1944 121 + 1920 1938 1944 1947 58 1941 1938 1944 1947 161 1938 1944 1950 1953 90 1947 1944 1950 1953 91 1947 1944 1950 1956 62 1947 1944 1950 1980 60 - 1944 1950 1956 1959 173 1953 1950 1956 1959 173 - 1953 1950 1956 1962 173 1953 1950 1956 1968 173 - 1980 1950 1956 1959 173 1953 1950 1980 1983 149 - 1953 1950 1980 1986 120 1950 1956 -1962 1965 72 + 1944 1950 1956 1959 174 1953 1950 1956 1959 174 + 1953 1950 1956 1962 174 1953 1950 1956 1968 174 + 1980 1950 1956 1959 174 1953 1950 1980 1983 150 + 1953 1950 1980 1986 121 1950 1956 -1962 1965 72 1950 1956 -1962 1965 73 1950 1956 1962 1965 74 - 1959 1956 1962 1965 177 1968 1956 -1962 1965 75 + 1959 1956 1962 1965 178 1968 1956 -1962 1965 75 1968 1956 -1962 1965 76 1968 1956 1962 1965 77 - 1950 1956 1968 1971 175 1950 1956 1968 1974 175 - 1950 1956 1968 1977 175 1959 1956 1968 1971 175 - 1959 1956 1968 1974 175 1959 1956 1968 1977 175 - 1962 1956 1968 1971 175 1962 1956 1968 1974 175 - 1962 1956 1968 1977 175 1950 1980 1986 1989 58 - 1983 1980 1986 1989 160 1980 1986 1992 1995 90 + 1950 1956 1968 1971 176 1950 1956 1968 1974 176 + 1950 1956 1968 1977 176 1959 1956 1968 1971 176 + 1959 1956 1968 1974 176 1959 1956 1968 1977 176 + 1962 1956 1968 1971 176 1962 1956 1968 1974 176 + 1962 1956 1968 1977 176 1950 1980 1986 1989 58 + 1983 1980 1986 1989 161 1980 1986 1992 1995 90 1989 1986 1992 1995 91 1989 1986 1992 1998 63 - 1989 1986 1992 2022 60 1986 1992 1998 2001 174 - 1986 1992 1998 2004 174 1995 1992 1998 2001 174 - 1995 1992 1998 2004 174 1995 1992 1998 2007 174 - 2022 1992 1998 2001 174 2022 1992 1998 2004 174 - 1995 1992 2022 2025 149 1995 1992 2022 2028 120 - 2001 1998 2007 2010 161 2001 1998 2007 2013 125 - 2004 1998 2007 2010 161 2004 1998 2007 2013 125 + 1989 1986 1992 2022 60 1986 1992 1998 2001 175 + 1986 1992 1998 2004 175 1995 1992 1998 2001 175 + 1995 1992 1998 2004 175 1995 1992 1998 2007 175 + 2022 1992 1998 2001 175 2022 1992 1998 2004 175 + 1995 1992 2022 2025 150 1995 1992 2022 2028 121 + 2001 1998 2007 2010 162 2001 1998 2007 2013 126 + 2004 1998 2007 2010 162 2004 1998 2007 2013 126 1998 2007 2013 2016 66 1998 2007 2013 2019 66 - 2010 2007 2013 2016 162 2010 2007 2013 2019 162 - 1992 2022 2028 2031 58 2025 2022 2028 2031 160 + 2010 2007 2013 2016 163 2010 2007 2013 2019 163 + 1992 2022 2028 2031 58 2025 2022 2028 2031 161 2022 2028 2034 2037 90 2031 2028 2034 2037 91 2031 2028 2034 2040 63 2031 2028 2034 2094 60 - 2028 2034 2040 2043 174 2028 2034 2040 2046 174 - 2037 2034 2040 2043 174 2037 2034 2040 2046 174 - 2037 2034 2040 2049 174 2094 2034 2040 2043 174 - 2094 2034 2040 2046 174 2037 2034 2094 2097 149 - 2037 2034 2094 2100 120 2034 2040 2049 2052 180 - 2034 2040 2049 2055 180 2043 2040 2049 2052 180 - 2043 2040 2049 2055 180 2043 2040 2049 2058 180 - 2046 2040 2049 2052 180 2046 2040 2049 2055 180 - 2046 2040 2049 2058 180 2040 2049 2058 2061 180 - 2040 2049 2058 2064 180 2052 2049 2058 2061 180 - 2052 2049 2058 2064 180 2052 2049 2058 2067 180 - 2055 2049 2058 2061 180 2055 2049 2058 2064 180 - 2055 2049 2058 2067 180 2049 2058 2067 2070 182 - 2061 2058 2067 2070 182 2061 2058 2067 2073 182 - 2064 2058 2067 2070 182 2064 2058 2067 2073 182 - 2070 2067 2073 2076 168 2070 2067 2073 2085 168 - 2067 2073 2076 2079 168 2067 2073 2076 2082 168 - 2085 2073 2076 2079 168 2085 2073 2076 2082 168 - 2067 2073 2085 2088 168 2067 2073 2085 2091 168 - 2076 2073 2085 2088 168 2076 2073 2085 2091 168 - 2034 2094 2100 2103 58 2097 2094 2100 2103 160 + 2028 2034 2040 2043 175 2028 2034 2040 2046 175 + 2037 2034 2040 2043 175 2037 2034 2040 2046 175 + 2037 2034 2040 2049 175 2094 2034 2040 2043 175 + 2094 2034 2040 2046 175 2037 2034 2094 2097 150 + 2037 2034 2094 2100 121 2034 2040 2049 2052 181 + 2034 2040 2049 2055 181 2043 2040 2049 2052 181 + 2043 2040 2049 2055 181 2043 2040 2049 2058 181 + 2046 2040 2049 2052 181 2046 2040 2049 2055 181 + 2046 2040 2049 2058 181 2040 2049 2058 2061 181 + 2040 2049 2058 2064 181 2052 2049 2058 2061 181 + 2052 2049 2058 2064 181 2052 2049 2058 2067 181 + 2055 2049 2058 2061 181 2055 2049 2058 2064 181 + 2055 2049 2058 2067 181 2049 2058 2067 2070 183 + 2061 2058 2067 2070 183 2061 2058 2067 2073 183 + 2064 2058 2067 2070 183 2064 2058 2067 2073 183 + 2070 2067 2073 2076 169 2070 2067 2073 2085 169 + 2067 2073 2076 2079 169 2067 2073 2076 2082 169 + 2085 2073 2076 2079 169 2085 2073 2076 2082 169 + 2067 2073 2085 2088 169 2067 2073 2085 2091 169 + 2076 2073 2085 2088 169 2076 2073 2085 2091 169 + 2034 2094 2100 2103 58 2097 2094 2100 2103 161 2094 2100 2106 2109 90 2103 2100 2106 2109 91 2103 2100 2106 2112 63 2103 2100 2106 2136 60 - 2100 2106 2112 2115 174 2100 2106 2112 2118 174 - 2109 2106 2112 2115 174 2109 2106 2112 2118 174 - 2109 2106 2112 2121 174 2136 2106 2112 2115 174 - 2136 2106 2112 2118 174 2109 2106 2136 2139 149 - 2109 2106 2136 2142 120 2115 2112 2121 2124 161 - 2115 2112 2121 2127 125 2118 2112 2121 2124 161 - 2118 2112 2121 2127 125 2112 2121 2127 2130 66 - 2112 2121 2127 2133 66 2124 2121 2127 2130 162 - 2124 2121 2127 2133 162 2106 2136 2142 2145 58 - 2139 2136 2142 2145 160 2136 2142 2148 2151 90 + 2100 2106 2112 2115 175 2100 2106 2112 2118 175 + 2109 2106 2112 2115 175 2109 2106 2112 2118 175 + 2109 2106 2112 2121 175 2136 2106 2112 2115 175 + 2136 2106 2112 2118 175 2109 2106 2136 2139 150 + 2109 2106 2136 2142 121 2115 2112 2121 2124 162 + 2115 2112 2121 2127 126 2118 2112 2121 2124 162 + 2118 2112 2121 2127 126 2112 2121 2127 2130 66 + 2112 2121 2127 2133 66 2124 2121 2127 2130 163 + 2124 2121 2127 2133 163 2106 2136 2142 2145 58 + 2139 2136 2142 2145 161 2136 2142 2148 2151 90 2145 2142 2148 2151 91 2145 2142 2148 2154 62 - 2145 2142 2148 2178 60 2142 2148 2154 2157 173 - 2151 2148 2154 2157 173 2151 2148 2154 2160 173 - 2151 2148 2154 2166 173 2178 2148 2154 2157 173 - 2151 2148 2178 2181 149 2151 2148 2178 2184 120 + 2145 2142 2148 2178 60 2142 2148 2154 2157 174 + 2151 2148 2154 2157 174 2151 2148 2154 2160 174 + 2151 2148 2154 2166 174 2178 2148 2154 2157 174 + 2151 2148 2178 2181 150 2151 2148 2178 2184 121 2148 2154 -2160 2163 72 2148 2154 -2160 2163 73 - 2148 2154 2160 2163 74 2157 2154 2160 2163 177 + 2148 2154 2160 2163 74 2157 2154 2160 2163 178 2166 2154 -2160 2163 75 2166 2154 -2160 2163 76 - 2166 2154 2160 2163 77 2148 2154 2166 2169 175 - 2148 2154 2166 2172 175 2148 2154 2166 2175 175 - 2157 2154 2166 2169 175 2157 2154 2166 2172 175 - 2157 2154 2166 2175 175 2160 2154 2166 2169 175 - 2160 2154 2166 2172 175 2160 2154 2166 2175 175 - 2148 2178 2184 2187 58 2181 2178 2184 2187 160 + 2166 2154 2160 2163 77 2148 2154 2166 2169 176 + 2148 2154 2166 2172 176 2148 2154 2166 2175 176 + 2157 2154 2166 2169 176 2157 2154 2166 2172 176 + 2157 2154 2166 2175 176 2160 2154 2166 2169 176 + 2160 2154 2166 2172 176 2160 2154 2166 2175 176 + 2148 2178 2184 2187 58 2181 2178 2184 2187 161 2178 2184 2190 2193 90 2187 2184 2190 2193 91 2187 2184 2190 2196 63 2187 2184 2190 2214 60 - 2184 2190 2196 2199 174 2184 2190 2196 2202 174 - 2193 2190 2196 2199 174 2193 2190 2196 2202 174 - 2193 2190 2196 2205 174 2214 2190 2196 2199 174 - 2214 2190 2196 2202 174 2193 2190 2214 2217 149 - 2193 2190 2214 2220 120 2199 2196 2205 2208 179 - 2199 2196 2205 2211 179 2202 2196 2205 2208 179 - 2202 2196 2205 2211 179 2190 2214 2220 2223 58 - 2217 2214 2220 2223 160 2214 2220 2226 2229 92 + 2184 2190 2196 2199 175 2184 2190 2196 2202 175 + 2193 2190 2196 2199 175 2193 2190 2196 2202 175 + 2193 2190 2196 2205 175 2214 2190 2196 2199 175 + 2214 2190 2196 2202 175 2193 2190 2214 2217 150 + 2193 2190 2214 2220 121 2199 2196 2205 2208 180 + 2199 2196 2205 2211 180 2202 2196 2205 2208 180 + 2202 2196 2205 2211 180 2190 2214 2220 2223 58 + 2217 2214 2220 2223 161 2214 2220 2226 2229 92 2214 2220 2226 2232 92 2223 2220 2226 2229 93 2223 2220 2226 2232 93 2223 2220 2226 2235 65 - 2229 2226 2235 2238 152 2229 2226 2235 2241 122 - 2232 2226 2235 2238 152 2232 2226 2235 2241 122 - 2226 2235 2241 2244 59 2238 2235 2241 2244 160 + 2229 2226 2235 2238 153 2229 2226 2235 2241 123 + 2232 2226 2235 2238 153 2232 2226 2235 2241 123 + 2226 2235 2241 2244 59 2238 2235 2241 2244 161 2235 2241 2247 2250 90 2244 2241 2247 2250 91 2244 2241 2247 2253 63 2244 2241 2247 2268 60 - 2241 2247 2253 2256 174 2241 2247 2253 2259 174 - 2250 2247 2253 2256 174 2250 2247 2253 2259 174 - 2250 2247 2253 2262 174 2268 2247 2253 2256 174 - 2268 2247 2253 2259 174 2250 2247 2268 2271 149 - 2250 2247 2268 2274 120 2247 2253 -2262 2265 78 + 2241 2247 2253 2256 175 2241 2247 2253 2259 175 + 2250 2247 2253 2256 175 2250 2247 2253 2259 175 + 2250 2247 2253 2262 175 2268 2247 2253 2256 175 + 2268 2247 2253 2259 175 2250 2247 2268 2271 150 + 2250 2247 2268 2274 121 2247 2253 -2262 2265 78 2247 2253 -2262 2265 79 2247 2253 2262 2265 80 - 2256 2253 2262 2265 184 2259 2253 2262 2265 184 - 2247 2268 2274 2277 58 2271 2268 2274 2277 160 + 2256 2253 2262 2265 185 2259 2253 2262 2265 185 + 2247 2268 2274 2277 58 2271 2268 2274 2277 161 2268 2274 2280 2283 90 2277 2274 2280 2283 91 2277 2274 2280 2286 62 2277 2274 2280 2310 60 - 2274 2280 2286 2289 173 2283 2280 2286 2289 173 - 2283 2280 2286 2292 173 2283 2280 2286 2298 173 - 2310 2280 2286 2289 173 2283 2280 2310 2313 149 - 2283 2280 2310 2316 120 2280 2286 -2292 2295 72 + 2274 2280 2286 2289 174 2283 2280 2286 2289 174 + 2283 2280 2286 2292 174 2283 2280 2286 2298 174 + 2310 2280 2286 2289 174 2283 2280 2310 2313 150 + 2283 2280 2310 2316 121 2280 2286 -2292 2295 72 2280 2286 -2292 2295 73 2280 2286 2292 2295 74 - 2289 2286 2292 2295 177 2298 2286 -2292 2295 75 + 2289 2286 2292 2295 178 2298 2286 -2292 2295 75 2298 2286 -2292 2295 76 2298 2286 2292 2295 77 - 2280 2286 2298 2301 175 2280 2286 2298 2304 175 - 2280 2286 2298 2307 175 2289 2286 2298 2301 175 - 2289 2286 2298 2304 175 2289 2286 2298 2307 175 - 2292 2286 2298 2301 175 2292 2286 2298 2304 175 - 2292 2286 2298 2307 175 2280 2310 2316 2319 58 - 2313 2310 2316 2319 160 2310 2316 2322 2325 90 + 2280 2286 2298 2301 176 2280 2286 2298 2304 176 + 2280 2286 2298 2307 176 2289 2286 2298 2301 176 + 2289 2286 2298 2304 176 2289 2286 2298 2307 176 + 2292 2286 2298 2301 176 2292 2286 2298 2304 176 + 2292 2286 2298 2307 176 2280 2310 2316 2319 58 + 2313 2310 2316 2319 161 2310 2316 2322 2325 90 2319 2316 2322 2325 91 2319 2316 2322 2328 63 - 2319 2316 2322 2346 60 2316 2322 2328 2331 174 - 2316 2322 2328 2334 174 2325 2322 2328 2331 174 - 2325 2322 2328 2334 174 2325 2322 2328 2337 174 - 2346 2322 2328 2331 174 2346 2322 2328 2334 174 - 2325 2322 2346 2349 149 2325 2322 2346 2352 120 - 2331 2328 2337 2340 179 2331 2328 2337 2343 179 - 2334 2328 2337 2340 179 2334 2328 2337 2343 179 - 2322 2346 2352 2355 58 2349 2346 2352 2355 160 + 2319 2316 2322 2346 60 2316 2322 2328 2331 175 + 2316 2322 2328 2334 175 2325 2322 2328 2331 175 + 2325 2322 2328 2334 175 2325 2322 2328 2337 175 + 2346 2322 2328 2331 175 2346 2322 2328 2334 175 + 2325 2322 2346 2349 150 2325 2322 2346 2352 121 + 2331 2328 2337 2340 180 2331 2328 2337 2343 180 + 2334 2328 2337 2340 180 2334 2328 2337 2343 180 + 2322 2346 2352 2355 58 2349 2346 2352 2355 161 2346 2352 2358 2361 90 2355 2352 2358 2361 91 2355 2352 2358 2364 63 2355 2352 2358 2409 60 - 2352 2358 2364 2367 174 2352 2358 2364 2370 174 - 2361 2358 2364 2367 174 2361 2358 2364 2370 174 - 2361 2358 2364 2373 174 2409 2358 2364 2367 174 - 2409 2358 2364 2370 174 2361 2358 2409 2412 149 - 2361 2358 2409 2415 120 2367 2364 2373 2376 178 - 2367 2364 2373 2397 178 2370 2364 2373 2376 178 - 2370 2364 2373 2397 178 2364 2373 2376 2379 96 + 2352 2358 2364 2367 175 2352 2358 2364 2370 175 + 2361 2358 2364 2367 175 2361 2358 2364 2370 175 + 2361 2358 2364 2373 175 2409 2358 2364 2367 175 + 2409 2358 2364 2370 175 2361 2358 2409 2412 150 + 2361 2358 2409 2415 121 2367 2364 2373 2376 179 + 2367 2364 2373 2397 179 2370 2364 2373 2376 179 + 2370 2364 2373 2397 179 2364 2373 2376 2379 96 2397 2373 2376 2379 94 2364 2373 2397 2400 96 2376 2373 2397 2400 94 2373 2376 2382 2385 94 2379 2376 2382 2385 97 2379 2376 2382 2388 94 - 2385 2382 2388 2391 164 2385 2382 2388 2403 94 + 2385 2382 2388 2391 165 2385 2382 2388 2403 94 2382 2388 2391 2394 71 2403 2388 2391 2394 71 - 2382 2388 2403 2406 94 2391 2388 2403 2406 164 + 2382 2388 2403 2406 94 2391 2388 2403 2406 165 2373 2397 2403 2406 94 2400 2397 2403 2388 94 2400 2397 2403 2406 97 2358 2409 2415 2418 58 - 2412 2409 2415 2418 160 2409 2415 2421 2424 92 + 2412 2409 2415 2418 161 2409 2415 2421 2424 92 2409 2415 2421 2427 92 2418 2415 2421 2424 93 2418 2415 2421 2427 93 2418 2415 2421 2430 65 - 2424 2421 2430 2433 152 2424 2421 2430 2436 122 - 2427 2421 2430 2433 152 2427 2421 2430 2436 122 - 2421 2430 2436 2439 59 2433 2430 2436 2439 160 + 2424 2421 2430 2433 153 2424 2421 2430 2436 123 + 2427 2421 2430 2433 153 2427 2421 2430 2436 123 + 2421 2430 2436 2439 59 2433 2430 2436 2439 161 2430 2436 2442 2445 90 2439 2436 2442 2445 91 2439 2436 2442 2448 62 2439 2436 2442 2487 60 - 2436 2442 2448 2451 173 2445 2442 2448 2451 173 - 2445 2442 2448 2454 173 2445 2442 2448 2466 173 - 2487 2442 2448 2451 173 2445 2442 2487 2490 149 - 2445 2442 2487 2493 120 2442 2448 2454 2457 175 - 2442 2448 2454 2460 175 2442 2448 2454 2463 175 - 2451 2448 2454 2457 175 2451 2448 2454 2460 175 - 2451 2448 2454 2463 175 2466 2448 2454 2457 175 - 2466 2448 2454 2460 175 2466 2448 2454 2463 175 - 2442 2448 2466 2469 174 2442 2448 2466 2472 174 - 2451 2448 2466 2469 174 2451 2448 2466 2472 174 - 2451 2448 2466 2475 174 2454 2448 2466 2469 174 - 2454 2448 2466 2472 174 2448 2466 2475 2478 181 - 2448 2466 2475 2481 181 2448 2466 2475 2484 181 - 2469 2466 2475 2478 181 2469 2466 2475 2481 181 - 2469 2466 2475 2484 181 2472 2466 2475 2478 181 - 2472 2466 2475 2481 181 2472 2466 2475 2484 181 - 2442 2487 2493 2496 58 2490 2487 2493 2496 160 + 2436 2442 2448 2451 174 2445 2442 2448 2451 174 + 2445 2442 2448 2454 174 2445 2442 2448 2466 174 + 2487 2442 2448 2451 174 2445 2442 2487 2490 150 + 2445 2442 2487 2493 121 2442 2448 2454 2457 176 + 2442 2448 2454 2460 176 2442 2448 2454 2463 176 + 2451 2448 2454 2457 176 2451 2448 2454 2460 176 + 2451 2448 2454 2463 176 2466 2448 2454 2457 176 + 2466 2448 2454 2460 176 2466 2448 2454 2463 176 + 2442 2448 2466 2469 175 2442 2448 2466 2472 175 + 2451 2448 2466 2469 175 2451 2448 2466 2472 175 + 2451 2448 2466 2475 175 2454 2448 2466 2469 175 + 2454 2448 2466 2472 175 2448 2466 2475 2478 182 + 2448 2466 2475 2481 182 2448 2466 2475 2484 182 + 2469 2466 2475 2478 182 2469 2466 2475 2481 182 + 2469 2466 2475 2484 182 2472 2466 2475 2478 182 + 2472 2466 2475 2481 182 2472 2466 2475 2484 182 + 2442 2487 2493 2496 58 2490 2487 2493 2496 161 2487 2493 2499 2502 90 2496 2493 2499 2502 91 2496 2493 2499 2505 63 2496 2493 2499 2544 60 - 2493 2499 2505 2508 174 2493 2499 2505 2511 174 - 2502 2499 2505 2508 174 2502 2499 2505 2511 174 - 2502 2499 2505 2514 174 2544 2499 2505 2508 174 - 2544 2499 2505 2511 174 2502 2499 2544 2547 149 - 2502 2499 2544 2550 120 2499 2505 2514 2517 174 - 2508 2505 2514 2517 174 2508 2505 2514 2520 174 - 2508 2505 2514 2532 174 2511 2505 2514 2517 174 - 2511 2505 2514 2520 174 2511 2505 2514 2532 174 - 2505 2514 2520 2523 175 2505 2514 2520 2526 175 - 2505 2514 2520 2529 175 2517 2514 2520 2523 175 - 2517 2514 2520 2526 175 2517 2514 2520 2529 175 - 2532 2514 2520 2523 175 2532 2514 2520 2526 175 - 2532 2514 2520 2529 175 2505 2514 2532 2535 175 - 2505 2514 2532 2538 175 2505 2514 2532 2541 175 - 2517 2514 2532 2535 175 2517 2514 2532 2538 175 - 2517 2514 2532 2541 175 2520 2514 2532 2535 175 - 2520 2514 2532 2538 175 2520 2514 2532 2541 175 - 2499 2544 2550 2553 58 2547 2544 2550 2553 160 + 2493 2499 2505 2508 175 2493 2499 2505 2511 175 + 2502 2499 2505 2508 175 2502 2499 2505 2511 175 + 2502 2499 2505 2514 175 2544 2499 2505 2508 175 + 2544 2499 2505 2511 175 2502 2499 2544 2547 150 + 2502 2499 2544 2550 121 2499 2505 2514 2517 175 + 2508 2505 2514 2517 175 2508 2505 2514 2520 175 + 2508 2505 2514 2532 175 2511 2505 2514 2517 175 + 2511 2505 2514 2520 175 2511 2505 2514 2532 175 + 2505 2514 2520 2523 176 2505 2514 2520 2526 176 + 2505 2514 2520 2529 176 2517 2514 2520 2523 176 + 2517 2514 2520 2526 176 2517 2514 2520 2529 176 + 2532 2514 2520 2523 176 2532 2514 2520 2526 176 + 2532 2514 2520 2529 176 2505 2514 2532 2535 176 + 2505 2514 2532 2538 176 2505 2514 2532 2541 176 + 2517 2514 2532 2535 176 2517 2514 2532 2538 176 + 2517 2514 2532 2541 176 2520 2514 2532 2535 176 + 2520 2514 2532 2538 176 2520 2514 2532 2541 176 + 2499 2544 2550 2553 58 2547 2544 2550 2553 161 2544 2550 2556 2559 90 2553 2550 2556 2559 91 2553 2550 2556 2562 63 2553 2550 2556 2595 60 - 2550 2556 2562 2565 174 2550 2556 2562 2568 174 - 2559 2556 2562 2565 174 2559 2556 2562 2568 174 - 2559 2556 2562 2571 174 2595 2556 2562 2565 174 - 2595 2556 2562 2568 174 2559 2556 2595 2598 149 - 2559 2556 2595 2601 120 2556 2562 2571 2574 180 - 2556 2562 2571 2577 180 2565 2562 2571 2574 180 - 2565 2562 2571 2577 180 2565 2562 2571 2580 180 - 2568 2562 2571 2574 180 2568 2562 2571 2577 180 - 2568 2562 2571 2580 180 2574 2571 2580 2583 161 - 2574 2571 2580 2586 125 2577 2571 2580 2583 161 - 2577 2571 2580 2586 125 2571 2580 2586 2589 66 - 2571 2580 2586 2592 66 2583 2580 2586 2589 162 - 2583 2580 2586 2592 162 2556 2595 2601 2604 58 - 2598 2595 2601 2604 160 2595 2601 2607 2610 90 + 2550 2556 2562 2565 175 2550 2556 2562 2568 175 + 2559 2556 2562 2565 175 2559 2556 2562 2568 175 + 2559 2556 2562 2571 175 2595 2556 2562 2565 175 + 2595 2556 2562 2568 175 2559 2556 2595 2598 150 + 2559 2556 2595 2601 121 2556 2562 2571 2574 181 + 2556 2562 2571 2577 181 2565 2562 2571 2574 181 + 2565 2562 2571 2577 181 2565 2562 2571 2580 181 + 2568 2562 2571 2574 181 2568 2562 2571 2577 181 + 2568 2562 2571 2580 181 2574 2571 2580 2583 162 + 2574 2571 2580 2586 126 2577 2571 2580 2583 162 + 2577 2571 2580 2586 126 2571 2580 2586 2589 66 + 2571 2580 2586 2592 66 2583 2580 2586 2589 163 + 2583 2580 2586 2592 163 2556 2595 2601 2604 58 + 2598 2595 2601 2604 161 2595 2601 2607 2610 90 2604 2601 2607 2610 91 2604 2601 2607 2613 62 - 2604 2601 2607 2652 60 2601 2607 2613 2616 173 - 2610 2607 2613 2616 173 2610 2607 2613 2619 173 - 2610 2607 2613 2631 173 2652 2607 2613 2616 173 - 2610 2607 2652 2655 149 2610 2607 2652 2658 120 - 2607 2613 2619 2622 175 2607 2613 2619 2625 175 - 2607 2613 2619 2628 175 2616 2613 2619 2622 175 - 2616 2613 2619 2625 175 2616 2613 2619 2628 175 - 2631 2613 2619 2622 175 2631 2613 2619 2625 175 - 2631 2613 2619 2628 175 2607 2613 2631 2634 174 - 2607 2613 2631 2637 174 2616 2613 2631 2634 174 - 2616 2613 2631 2637 174 2616 2613 2631 2640 174 - 2619 2613 2631 2634 174 2619 2613 2631 2637 174 - 2613 2631 2640 2643 181 2613 2631 2640 2646 181 - 2613 2631 2640 2649 181 2634 2631 2640 2643 181 - 2634 2631 2640 2646 181 2634 2631 2640 2649 181 - 2637 2631 2640 2643 181 2637 2631 2640 2646 181 - 2637 2631 2640 2649 181 2607 2652 2658 2661 58 - 2655 2652 2658 2661 160 2652 2658 2664 2667 90 + 2604 2601 2607 2652 60 2601 2607 2613 2616 174 + 2610 2607 2613 2616 174 2610 2607 2613 2619 174 + 2610 2607 2613 2631 174 2652 2607 2613 2616 174 + 2610 2607 2652 2655 150 2610 2607 2652 2658 121 + 2607 2613 2619 2622 176 2607 2613 2619 2625 176 + 2607 2613 2619 2628 176 2616 2613 2619 2622 176 + 2616 2613 2619 2625 176 2616 2613 2619 2628 176 + 2631 2613 2619 2622 176 2631 2613 2619 2625 176 + 2631 2613 2619 2628 176 2607 2613 2631 2634 175 + 2607 2613 2631 2637 175 2616 2613 2631 2634 175 + 2616 2613 2631 2637 175 2616 2613 2631 2640 175 + 2619 2613 2631 2634 175 2619 2613 2631 2637 175 + 2613 2631 2640 2643 182 2613 2631 2640 2646 182 + 2613 2631 2640 2649 182 2634 2631 2640 2643 182 + 2634 2631 2640 2646 182 2634 2631 2640 2649 182 + 2637 2631 2640 2643 182 2637 2631 2640 2646 182 + 2637 2631 2640 2649 182 2607 2652 2658 2661 58 + 2655 2652 2658 2661 161 2652 2658 2664 2667 90 2661 2658 2664 2667 91 2661 2658 2664 2670 63 - 2661 2658 2664 2694 60 2658 2664 2670 2673 174 - 2658 2664 2670 2676 174 2667 2664 2670 2673 174 - 2667 2664 2670 2676 174 2667 2664 2670 2679 174 - 2694 2664 2670 2673 174 2694 2664 2670 2676 174 - 2667 2664 2694 2697 149 2667 2664 2694 2700 120 - 2673 2670 2679 2682 161 2673 2670 2679 2685 125 - 2676 2670 2679 2682 161 2676 2670 2679 2685 125 + 2661 2658 2664 2694 60 2658 2664 2670 2673 175 + 2658 2664 2670 2676 175 2667 2664 2670 2673 175 + 2667 2664 2670 2676 175 2667 2664 2670 2679 175 + 2694 2664 2670 2673 175 2694 2664 2670 2676 175 + 2667 2664 2694 2697 150 2667 2664 2694 2700 121 + 2673 2670 2679 2682 162 2673 2670 2679 2685 126 + 2676 2670 2679 2682 162 2676 2670 2679 2685 126 2670 2679 2685 2688 66 2670 2679 2685 2691 66 - 2682 2679 2685 2688 162 2682 2679 2685 2691 162 - 2664 2694 2700 2703 58 2697 2694 2700 2703 160 + 2682 2679 2685 2688 163 2682 2679 2685 2691 163 + 2664 2694 2700 2703 58 2697 2694 2700 2703 161 2694 2700 2706 2709 90 2703 2700 2706 2709 91 2703 2700 2706 2712 63 2703 2700 2706 2727 60 - 2700 2706 2712 2715 174 2700 2706 2712 2718 174 - 2709 2706 2712 2715 174 2709 2706 2712 2718 174 - 2709 2706 2712 2721 174 2727 2706 2712 2715 174 - 2727 2706 2712 2718 174 2709 2706 2727 2730 149 - 2709 2706 2727 2733 120 2706 2712 -2721 2724 78 + 2700 2706 2712 2715 175 2700 2706 2712 2718 175 + 2709 2706 2712 2715 175 2709 2706 2712 2718 175 + 2709 2706 2712 2721 175 2727 2706 2712 2715 175 + 2727 2706 2712 2718 175 2709 2706 2727 2730 150 + 2709 2706 2727 2733 121 2706 2712 -2721 2724 78 2706 2712 -2721 2724 79 2706 2712 2721 2724 80 - 2715 2712 2721 2724 184 2718 2712 2721 2724 184 - 2706 2727 2733 2736 58 2730 2727 2733 2736 160 + 2715 2712 2721 2724 185 2718 2712 2721 2724 185 + 2706 2727 2733 2736 58 2730 2727 2733 2736 161 2727 2733 2739 2742 90 2736 2733 2739 2742 91 2736 2733 2739 2745 63 2736 2733 2739 2799 60 - 2733 2739 2745 2748 174 2733 2739 2745 2751 174 - 2742 2739 2745 2748 174 2742 2739 2745 2751 174 - 2742 2739 2745 2754 174 2799 2739 2745 2748 174 - 2799 2739 2745 2751 174 2742 2739 2799 2802 149 - 2742 2739 2799 2805 120 2739 2745 2754 2757 180 - 2739 2745 2754 2760 180 2748 2745 2754 2757 180 - 2748 2745 2754 2760 180 2748 2745 2754 2763 180 - 2751 2745 2754 2757 180 2751 2745 2754 2760 180 - 2751 2745 2754 2763 180 2745 2754 2763 2766 180 - 2745 2754 2763 2769 180 2757 2754 2763 2766 180 - 2757 2754 2763 2769 180 2757 2754 2763 2772 180 - 2760 2754 2763 2766 180 2760 2754 2763 2769 180 - 2760 2754 2763 2772 180 2754 2763 2772 2775 182 - 2766 2763 2772 2775 182 2766 2763 2772 2778 182 - 2769 2763 2772 2775 182 2769 2763 2772 2778 182 - 2775 2772 2778 2781 168 2775 2772 2778 2790 168 - 2772 2778 2781 2784 168 2772 2778 2781 2787 168 - 2790 2778 2781 2784 168 2790 2778 2781 2787 168 - 2772 2778 2790 2793 168 2772 2778 2790 2796 168 - 2781 2778 2790 2793 168 2781 2778 2790 2796 168 - 2739 2799 2805 2808 58 2802 2799 2805 2808 160 + 2733 2739 2745 2748 175 2733 2739 2745 2751 175 + 2742 2739 2745 2748 175 2742 2739 2745 2751 175 + 2742 2739 2745 2754 175 2799 2739 2745 2748 175 + 2799 2739 2745 2751 175 2742 2739 2799 2802 150 + 2742 2739 2799 2805 121 2739 2745 2754 2757 181 + 2739 2745 2754 2760 181 2748 2745 2754 2757 181 + 2748 2745 2754 2760 181 2748 2745 2754 2763 181 + 2751 2745 2754 2757 181 2751 2745 2754 2760 181 + 2751 2745 2754 2763 181 2745 2754 2763 2766 181 + 2745 2754 2763 2769 181 2757 2754 2763 2766 181 + 2757 2754 2763 2769 181 2757 2754 2763 2772 181 + 2760 2754 2763 2766 181 2760 2754 2763 2769 181 + 2760 2754 2763 2772 181 2754 2763 2772 2775 183 + 2766 2763 2772 2775 183 2766 2763 2772 2778 183 + 2769 2763 2772 2775 183 2769 2763 2772 2778 183 + 2775 2772 2778 2781 169 2775 2772 2778 2790 169 + 2772 2778 2781 2784 169 2772 2778 2781 2787 169 + 2790 2778 2781 2784 169 2790 2778 2781 2787 169 + 2772 2778 2790 2793 169 2772 2778 2790 2796 169 + 2781 2778 2790 2793 169 2781 2778 2790 2796 169 + 2739 2799 2805 2808 58 2802 2799 2805 2808 161 2799 2805 2811 2814 90 2808 2805 2811 2814 91 2808 2805 2811 2817 63 2808 2805 2811 2871 60 - 2805 2811 2817 2820 174 2805 2811 2817 2823 174 - 2814 2811 2817 2820 174 2814 2811 2817 2823 174 - 2814 2811 2817 2826 174 2871 2811 2817 2820 174 - 2871 2811 2817 2823 174 2814 2811 2871 2874 149 - 2814 2811 2871 2877 120 2820 2817 2826 2829 84 + 2805 2811 2817 2820 175 2805 2811 2817 2823 175 + 2814 2811 2817 2820 175 2814 2811 2817 2823 175 + 2814 2811 2817 2826 175 2871 2811 2817 2820 175 + 2871 2811 2817 2823 175 2814 2811 2871 2874 150 + 2814 2811 2871 2877 121 2820 2817 2826 2829 84 2820 2817 2826 2844 85 2823 2817 2826 2829 84 2823 2817 2826 2844 85 2817 2826 2829 2832 101 2844 2826 2829 2832 100 2826 2829 2835 2838 68 2832 2829 2835 2838 103 2832 2829 2835 2841 102 2838 2835 2841 2844 70 2838 2835 2841 2859 69 - 2835 2841 2859 2862 138 2844 2841 2859 2862 98 + 2835 2841 2859 2862 139 2844 2841 2859 2862 98 2826 2844 2847 2850 99 2841 2844 2847 2850 98 2844 2847 2853 2856 95 2850 2847 2853 2856 97 2850 2847 2853 2865 94 2847 2853 2865 2868 94 2856 2853 2865 2859 94 2856 2853 2865 2868 97 2841 2859 2865 2868 95 2862 2859 2865 2853 94 2862 2859 2865 2868 97 2811 2871 2877 2880 58 - 2874 2871 2877 2880 160 2871 2877 2883 2886 90 + 2874 2871 2877 2880 161 2871 2877 2883 2886 90 2880 2877 2883 2886 91 2880 2877 2883 2889 63 - 2880 2877 2883 2943 60 2877 2883 2889 2892 174 - 2877 2883 2889 2895 174 2886 2883 2889 2892 174 - 2886 2883 2889 2895 174 2886 2883 2889 2898 174 - 2943 2883 2889 2892 174 2943 2883 2889 2895 174 - 2886 2883 2943 2946 149 2886 2883 2943 2949 120 + 2880 2877 2883 2943 60 2877 2883 2889 2892 175 + 2877 2883 2889 2895 175 2886 2883 2889 2892 175 + 2886 2883 2889 2895 175 2886 2883 2889 2898 175 + 2943 2883 2889 2892 175 2943 2883 2889 2895 175 + 2886 2883 2943 2946 150 2886 2883 2943 2949 121 2892 2889 2898 2901 84 2892 2889 2898 2916 85 2895 2889 2898 2901 84 2895 2889 2898 2916 85 2889 2898 2901 2904 101 2916 2898 2901 2904 100 2898 2901 2907 2910 68 2904 2901 2907 2910 103 2904 2901 2907 2913 102 2910 2907 2913 2916 70 - 2910 2907 2913 2931 69 2907 2913 2931 2934 138 + 2910 2907 2913 2931 69 2907 2913 2931 2934 139 2916 2913 2931 2934 98 2898 2916 2919 2922 99 2913 2916 2919 2922 98 2916 2919 2925 2928 95 2922 2919 2925 2928 97 2922 2919 2925 2937 94 2919 2925 2937 2940 94 2928 2925 2937 2931 94 2928 2925 2937 2940 97 2913 2931 2937 2940 95 2934 2931 2937 2925 94 2934 2931 2937 2940 97 - 2883 2943 2949 2952 58 2946 2943 2949 2952 160 + 2883 2943 2949 2952 58 2946 2943 2949 2952 161 2943 2949 2955 2958 90 2952 2949 2955 2958 91 2952 2949 2955 2961 63 2952 2949 2955 2973 60 - 2949 2955 2961 2964 174 2949 2955 2961 2967 174 - 2958 2955 2961 2964 174 2958 2955 2961 2967 174 - 2958 2955 2961 2970 174 2973 2955 2961 2964 174 - 2973 2955 2961 2967 174 2958 2955 2973 2976 149 - 2958 2955 2973 2979 120 2964 2961 2970 3651 167 - 2967 2961 2970 3651 167 2955 2973 2979 2982 58 - 2976 2973 2979 2982 160 2973 2979 2985 2988 90 + 2949 2955 2961 2964 175 2949 2955 2961 2967 175 + 2958 2955 2961 2964 175 2958 2955 2961 2967 175 + 2958 2955 2961 2970 175 2973 2955 2961 2964 175 + 2973 2955 2961 2967 175 2958 2955 2973 2976 150 + 2958 2955 2973 2979 121 2964 2961 2970 3651 168 + 2967 2961 2970 3651 168 2955 2973 2979 2982 58 + 2976 2973 2979 2982 161 2973 2979 2985 2988 90 2982 2979 2985 2988 91 2982 2979 2985 2991 63 - 2982 2979 2985 3015 60 2979 2985 2991 2994 174 - 2979 2985 2991 2997 174 2988 2985 2991 2994 174 - 2988 2985 2991 2997 174 2988 2985 2991 3000 174 - 3015 2985 2991 2994 174 3015 2985 2991 2997 174 - 2988 2985 3015 3018 149 2988 2985 3015 3021 120 - 2994 2991 3000 3003 161 2994 2991 3000 3006 125 - 2997 2991 3000 3003 161 2997 2991 3000 3006 125 + 2982 2979 2985 3015 60 2979 2985 2991 2994 175 + 2979 2985 2991 2997 175 2988 2985 2991 2994 175 + 2988 2985 2991 2997 175 2988 2985 2991 3000 175 + 3015 2985 2991 2994 175 3015 2985 2991 2997 175 + 2988 2985 3015 3018 150 2988 2985 3015 3021 121 + 2994 2991 3000 3003 162 2994 2991 3000 3006 126 + 2997 2991 3000 3003 162 2997 2991 3000 3006 126 2991 3000 3006 3009 66 2991 3000 3006 3012 66 - 3003 3000 3006 3009 162 3003 3000 3006 3012 162 - 2985 3015 3021 3024 58 3018 3015 3021 3024 160 + 3003 3000 3006 3009 163 3003 3000 3006 3012 163 + 2985 3015 3021 3024 58 3018 3015 3021 3024 161 3015 3021 3027 3030 90 3024 3021 3027 3030 91 3024 3021 3027 3033 63 3024 3021 3027 3051 60 - 3021 3027 3033 3036 174 3021 3027 3033 3039 174 - 3030 3027 3033 3036 174 3030 3027 3033 3039 174 - 3030 3027 3033 3042 174 3051 3027 3033 3036 174 - 3051 3027 3033 3039 174 3030 3027 3051 3054 149 - 3030 3027 3051 3057 120 3036 3033 3042 3045 179 - 3036 3033 3042 3048 179 3039 3033 3042 3045 179 - 3039 3033 3042 3048 179 3027 3051 3057 3060 58 - 3054 3051 3057 3060 160 3051 3057 3063 3066 92 + 3021 3027 3033 3036 175 3021 3027 3033 3039 175 + 3030 3027 3033 3036 175 3030 3027 3033 3039 175 + 3030 3027 3033 3042 175 3051 3027 3033 3036 175 + 3051 3027 3033 3039 175 3030 3027 3051 3054 150 + 3030 3027 3051 3057 121 3036 3033 3042 3045 180 + 3036 3033 3042 3048 180 3039 3033 3042 3045 180 + 3039 3033 3042 3048 180 3027 3051 3057 3060 58 + 3054 3051 3057 3060 161 3051 3057 3063 3066 92 3051 3057 3063 3069 92 3060 3057 3063 3066 93 3060 3057 3063 3069 93 3060 3057 3063 3072 65 - 3066 3063 3072 3075 152 3066 3063 3072 3078 122 - 3069 3063 3072 3075 152 3069 3063 3072 3078 122 - 3063 3072 3078 3081 59 3075 3072 3078 3081 160 + 3066 3063 3072 3075 153 3066 3063 3072 3078 123 + 3069 3063 3072 3075 153 3069 3063 3072 3078 123 + 3063 3072 3078 3081 59 3075 3072 3078 3081 161 3072 3078 3084 3087 90 3081 3078 3084 3087 91 3081 3078 3084 3090 63 3081 3078 3084 3144 60 - 3078 3084 3090 3093 174 3078 3084 3090 3096 174 - 3087 3084 3090 3093 174 3087 3084 3090 3096 174 - 3087 3084 3090 3099 174 3144 3084 3090 3093 174 - 3144 3084 3090 3096 174 3087 3084 3144 3147 149 - 3087 3084 3144 3150 120 3084 3090 3099 3102 180 - 3084 3090 3099 3105 180 3093 3090 3099 3102 180 - 3093 3090 3099 3105 180 3093 3090 3099 3108 180 - 3096 3090 3099 3102 180 3096 3090 3099 3105 180 - 3096 3090 3099 3108 180 3090 3099 3108 3111 180 - 3090 3099 3108 3114 180 3102 3099 3108 3111 180 - 3102 3099 3108 3114 180 3102 3099 3108 3117 180 - 3105 3099 3108 3111 180 3105 3099 3108 3114 180 - 3105 3099 3108 3117 180 3099 3108 3117 3120 182 - 3111 3108 3117 3120 182 3111 3108 3117 3123 182 - 3114 3108 3117 3120 182 3114 3108 3117 3123 182 - 3120 3117 3123 3126 168 3120 3117 3123 3135 168 - 3117 3123 3126 3129 168 3117 3123 3126 3132 168 - 3135 3123 3126 3129 168 3135 3123 3126 3132 168 - 3117 3123 3135 3138 168 3117 3123 3135 3141 168 - 3126 3123 3135 3138 168 3126 3123 3135 3141 168 - 3084 3144 3150 3153 58 3147 3144 3150 3153 160 + 3078 3084 3090 3093 175 3078 3084 3090 3096 175 + 3087 3084 3090 3093 175 3087 3084 3090 3096 175 + 3087 3084 3090 3099 175 3144 3084 3090 3093 175 + 3144 3084 3090 3096 175 3087 3084 3144 3147 150 + 3087 3084 3144 3150 121 3084 3090 3099 3102 181 + 3084 3090 3099 3105 181 3093 3090 3099 3102 181 + 3093 3090 3099 3105 181 3093 3090 3099 3108 181 + 3096 3090 3099 3102 181 3096 3090 3099 3105 181 + 3096 3090 3099 3108 181 3090 3099 3108 3111 181 + 3090 3099 3108 3114 181 3102 3099 3108 3111 181 + 3102 3099 3108 3114 181 3102 3099 3108 3117 181 + 3105 3099 3108 3111 181 3105 3099 3108 3114 181 + 3105 3099 3108 3117 181 3099 3108 3117 3120 183 + 3111 3108 3117 3120 183 3111 3108 3117 3123 183 + 3114 3108 3117 3120 183 3114 3108 3117 3123 183 + 3120 3117 3123 3126 169 3120 3117 3123 3135 169 + 3117 3123 3126 3129 169 3117 3123 3126 3132 169 + 3135 3123 3126 3129 169 3135 3123 3126 3132 169 + 3117 3123 3135 3138 169 3117 3123 3135 3141 169 + 3126 3123 3135 3138 169 3126 3123 3135 3141 169 + 3084 3144 3150 3153 58 3147 3144 3150 3153 161 3144 3150 3156 3159 90 3153 3150 3156 3159 91 3153 3150 3156 3162 62 3153 3150 3156 3186 60 - 3150 3156 3162 3165 173 3159 3156 3162 3165 173 - 3159 3156 3162 3168 173 3159 3156 3162 3174 173 - 3186 3156 3162 3165 173 3159 3156 3186 3189 149 - 3159 3156 3186 3192 185 3156 3162 -3168 3171 72 + 3150 3156 3162 3165 174 3159 3156 3162 3165 174 + 3159 3156 3162 3168 174 3159 3156 3162 3174 174 + 3186 3156 3162 3165 174 3159 3156 3186 3189 150 + 3159 3156 3186 3192 111 3156 3162 -3168 3171 72 3156 3162 -3168 3171 73 3156 3162 3168 3171 74 - 3165 3162 3168 3171 177 3174 3162 -3168 3171 75 + 3165 3162 3168 3171 178 3174 3162 -3168 3171 75 3174 3162 -3168 3171 76 3174 3162 3168 3171 77 - 3156 3162 3174 3177 175 3156 3162 3174 3180 175 - 3156 3162 3174 3183 175 3165 3162 3174 3177 175 - 3165 3162 3174 3180 175 3165 3162 3174 3183 175 - 3168 3162 3174 3177 175 3168 3162 3174 3180 175 - 3168 3162 3174 3183 175 3186 3192 3195 3198 81 + 3156 3162 3174 3177 176 3156 3162 3174 3180 176 + 3156 3162 3174 3183 176 3165 3162 3174 3177 176 + 3165 3162 3174 3180 176 3165 3162 3174 3183 176 + 3168 3162 3174 3177 176 3168 3162 3174 3180 176 + 3168 3162 3174 3183 176 3186 3192 3195 3198 81 3186 3192 3195 3201 81 3204 3192 3195 3198 82 3204 3192 3195 3201 82 3186 3192 3204 3207 88 - 3195 3192 3204 3207 89 3192 3195 3219 3222 186 - 3192 3195 3219 3225 187 3198 3195 3219 3210 171 - 3198 3195 3219 3222 171 3198 3195 3219 3225 171 - 3201 3195 3219 3210 171 3201 3195 3219 3222 171 - 3201 3195 3219 3225 171 3192 3204 3210 3213 188 - 3192 3204 3210 3216 189 3207 3204 3210 3213 169 - 3207 3204 3210 3216 169 3207 3204 3210 3219 169 - 3228 3204 3210 3213 169 3228 3204 3210 3216 169 - 3207 3204 -3228 3231 143 3207 3204 3228 3231 144 - 3207 3204 -3228 3234 113 3207 3204 3228 3234 114 - 3204 3210 3219 3222 170 3204 3210 3219 3225 170 - 3213 3210 3219 3195 170 3213 3210 3219 3222 170 - 3213 3210 3219 3225 170 3216 3210 3219 3195 170 - 3216 3210 3219 3222 170 3216 3210 3219 3225 170 - 3204 3228 3234 3237 57 3231 3228 3234 3237 160 + 3195 3192 3204 3207 89 3192 3195 3219 3222 172 + 3192 3195 3219 3225 172 3198 3195 3219 3210 172 + 3198 3195 3219 3222 172 3198 3195 3219 3225 172 + 3201 3195 3219 3210 172 3201 3195 3219 3222 172 + 3201 3195 3219 3225 172 3192 3204 3210 3213 170 + 3192 3204 3210 3216 170 3207 3204 3210 3213 170 + 3207 3204 3210 3216 170 3207 3204 3210 3219 170 + 3228 3204 3210 3213 170 3228 3204 3210 3216 170 + 3207 3204 -3228 3231 144 3207 3204 3228 3231 145 + 3207 3204 -3228 3234 114 3207 3204 3228 3234 115 + 3204 3210 3219 3222 171 3204 3210 3219 3225 171 + 3213 3210 3219 3195 171 3213 3210 3219 3222 171 + 3213 3210 3219 3225 171 3216 3210 3219 3195 171 + 3216 3210 3219 3222 171 3216 3210 3219 3225 171 + 3204 3228 3234 3237 57 3231 3228 3234 3237 161 3228 3234 3240 3243 92 3228 3234 3240 3246 92 3237 3234 3240 3243 93 3237 3234 3240 3246 93 - 3237 3234 3240 3249 65 3243 3240 3249 3252 152 - 3243 3240 3249 3255 122 3246 3240 3249 3252 152 - 3246 3240 3249 3255 122 3240 3249 3255 3258 59 - 3252 3249 3255 3258 160 3249 3255 3261 3264 90 + 3237 3234 3240 3249 65 3243 3240 3249 3252 153 + 3243 3240 3249 3255 123 3246 3240 3249 3252 153 + 3246 3240 3249 3255 123 3240 3249 3255 3258 59 + 3252 3249 3255 3258 161 3249 3255 3261 3264 90 3258 3255 3261 3264 91 3258 3255 3261 3267 63 - 3258 3255 3261 3282 60 3255 3261 3267 3270 174 - 3255 3261 3267 3273 174 3264 3261 3267 3270 174 - 3264 3261 3267 3273 174 3264 3261 3267 3276 174 - 3282 3261 3267 3270 174 3282 3261 3267 3273 174 - 3264 3261 3282 3285 149 3264 3261 3282 3288 120 + 3258 3255 3261 3282 60 3255 3261 3267 3270 175 + 3255 3261 3267 3273 175 3264 3261 3267 3270 175 + 3264 3261 3267 3273 175 3264 3261 3267 3276 175 + 3282 3261 3267 3270 175 3282 3261 3267 3273 175 + 3264 3261 3282 3285 150 3264 3261 3282 3288 121 3261 3267 -3276 3279 78 3261 3267 -3276 3279 79 - 3261 3267 3276 3279 80 3270 3267 3276 3279 184 - 3273 3267 3276 3279 184 3261 3282 3288 3291 58 - 3285 3282 3288 3291 160 3282 3288 3294 3297 90 + 3261 3267 3276 3279 80 3270 3267 3276 3279 185 + 3273 3267 3276 3279 185 3261 3282 3288 3291 58 + 3285 3282 3288 3291 161 3282 3288 3294 3297 90 3291 3288 3294 3297 91 3291 3288 3294 3300 63 - 3291 3288 3294 3354 60 3288 3294 3300 3303 174 - 3288 3294 3300 3306 174 3297 3294 3300 3303 174 - 3297 3294 3300 3306 174 3297 3294 3300 3309 174 - 3354 3294 3300 3303 174 3354 3294 3300 3306 174 - 3297 3294 3354 3357 149 3297 3294 3354 3360 120 - 3294 3300 3309 3312 180 3294 3300 3309 3315 180 - 3303 3300 3309 3312 180 3303 3300 3309 3315 180 - 3303 3300 3309 3318 180 3306 3300 3309 3312 180 - 3306 3300 3309 3315 180 3306 3300 3309 3318 180 - 3300 3309 3318 3321 180 3300 3309 3318 3324 180 - 3312 3309 3318 3321 180 3312 3309 3318 3324 180 - 3312 3309 3318 3327 180 3315 3309 3318 3321 180 - 3315 3309 3318 3324 180 3315 3309 3318 3327 180 - 3309 3318 3327 3330 182 3321 3318 3327 3330 182 - 3321 3318 3327 3333 182 3324 3318 3327 3330 182 - 3324 3318 3327 3333 182 3330 3327 3333 3336 168 - 3330 3327 3333 3345 168 3327 3333 3336 3339 168 - 3327 3333 3336 3342 168 3345 3333 3336 3339 168 - 3345 3333 3336 3342 168 3327 3333 3345 3348 168 - 3327 3333 3345 3351 168 3336 3333 3345 3348 168 - 3336 3333 3345 3351 168 3294 3354 3360 3363 58 - 3357 3354 3360 3363 160 3354 3360 3366 3369 90 + 3291 3288 3294 3354 60 3288 3294 3300 3303 175 + 3288 3294 3300 3306 175 3297 3294 3300 3303 175 + 3297 3294 3300 3306 175 3297 3294 3300 3309 175 + 3354 3294 3300 3303 175 3354 3294 3300 3306 175 + 3297 3294 3354 3357 150 3297 3294 3354 3360 121 + 3294 3300 3309 3312 181 3294 3300 3309 3315 181 + 3303 3300 3309 3312 181 3303 3300 3309 3315 181 + 3303 3300 3309 3318 181 3306 3300 3309 3312 181 + 3306 3300 3309 3315 181 3306 3300 3309 3318 181 + 3300 3309 3318 3321 181 3300 3309 3318 3324 181 + 3312 3309 3318 3321 181 3312 3309 3318 3324 181 + 3312 3309 3318 3327 181 3315 3309 3318 3321 181 + 3315 3309 3318 3324 181 3315 3309 3318 3327 181 + 3309 3318 3327 3330 183 3321 3318 3327 3330 183 + 3321 3318 3327 3333 183 3324 3318 3327 3330 183 + 3324 3318 3327 3333 183 3330 3327 3333 3336 169 + 3330 3327 3333 3345 169 3327 3333 3336 3339 169 + 3327 3333 3336 3342 169 3345 3333 3336 3339 169 + 3345 3333 3336 3342 169 3327 3333 3345 3348 169 + 3327 3333 3345 3351 169 3336 3333 3345 3348 169 + 3336 3333 3345 3351 169 3294 3354 3360 3363 58 + 3357 3354 3360 3363 161 3354 3360 3366 3369 90 3363 3360 3366 3369 91 3363 3360 3366 3372 63 - 3363 3360 3366 3396 60 3360 3366 3372 3375 174 - 3360 3366 3372 3378 174 3369 3366 3372 3375 174 - 3369 3366 3372 3378 174 3369 3366 3372 3381 174 - 3396 3366 3372 3375 174 3396 3366 3372 3378 174 - 3369 3366 3396 3399 149 3369 3366 3396 3402 120 - 3375 3372 3381 3384 161 3375 3372 3381 3387 125 - 3378 3372 3381 3384 161 3378 3372 3381 3387 125 + 3363 3360 3366 3396 60 3360 3366 3372 3375 175 + 3360 3366 3372 3378 175 3369 3366 3372 3375 175 + 3369 3366 3372 3378 175 3369 3366 3372 3381 175 + 3396 3366 3372 3375 175 3396 3366 3372 3378 175 + 3369 3366 3396 3399 150 3369 3366 3396 3402 121 + 3375 3372 3381 3384 162 3375 3372 3381 3387 126 + 3378 3372 3381 3384 162 3378 3372 3381 3387 126 3372 3381 3387 3390 66 3372 3381 3387 3393 66 - 3384 3381 3387 3390 162 3384 3381 3387 3393 162 - 3366 3396 3402 3405 58 3399 3396 3402 3405 160 + 3384 3381 3387 3390 163 3384 3381 3387 3393 163 + 3366 3396 3402 3405 58 3399 3396 3402 3405 161 3396 3402 3408 3411 90 3405 3402 3408 3411 91 3405 3402 3408 3414 63 3405 3402 3408 3453 60 - 3402 3408 3414 3417 174 3402 3408 3414 3420 174 - 3411 3408 3414 3417 174 3411 3408 3414 3420 174 - 3411 3408 3414 3423 174 3453 3408 3414 3417 174 - 3453 3408 3414 3420 174 3411 3408 3453 3456 149 - 3411 3408 3453 3459 120 3408 3414 3423 3426 174 - 3417 3414 3423 3426 174 3417 3414 3423 3429 174 - 3417 3414 3423 3441 174 3420 3414 3423 3426 174 - 3420 3414 3423 3429 174 3420 3414 3423 3441 174 - 3414 3423 3429 3432 175 3414 3423 3429 3435 175 - 3414 3423 3429 3438 175 3426 3423 3429 3432 175 - 3426 3423 3429 3435 175 3426 3423 3429 3438 175 - 3441 3423 3429 3432 175 3441 3423 3429 3435 175 - 3441 3423 3429 3438 175 3414 3423 3441 3444 175 - 3414 3423 3441 3447 175 3414 3423 3441 3450 175 - 3426 3423 3441 3444 175 3426 3423 3441 3447 175 - 3426 3423 3441 3450 175 3429 3423 3441 3444 175 - 3429 3423 3441 3447 175 3429 3423 3441 3450 175 - 3408 3453 3459 3462 58 3456 3453 3459 3462 160 + 3402 3408 3414 3417 175 3402 3408 3414 3420 175 + 3411 3408 3414 3417 175 3411 3408 3414 3420 175 + 3411 3408 3414 3423 175 3453 3408 3414 3417 175 + 3453 3408 3414 3420 175 3411 3408 3453 3456 150 + 3411 3408 3453 3459 121 3408 3414 3423 3426 175 + 3417 3414 3423 3426 175 3417 3414 3423 3429 175 + 3417 3414 3423 3441 175 3420 3414 3423 3426 175 + 3420 3414 3423 3429 175 3420 3414 3423 3441 175 + 3414 3423 3429 3432 176 3414 3423 3429 3435 176 + 3414 3423 3429 3438 176 3426 3423 3429 3432 176 + 3426 3423 3429 3435 176 3426 3423 3429 3438 176 + 3441 3423 3429 3432 176 3441 3423 3429 3435 176 + 3441 3423 3429 3438 176 3414 3423 3441 3444 176 + 3414 3423 3441 3447 176 3414 3423 3441 3450 176 + 3426 3423 3441 3444 176 3426 3423 3441 3447 176 + 3426 3423 3441 3450 176 3429 3423 3441 3444 176 + 3429 3423 3441 3447 176 3429 3423 3441 3450 176 + 3408 3453 3459 3462 58 3456 3453 3459 3462 161 3453 3459 3465 3468 90 3462 3459 3465 3468 91 3462 3459 3465 3471 63 3462 3459 3465 3483 60 - 3459 3465 3471 3474 174 3459 3465 3471 3477 174 - 3468 3465 3471 3474 174 3468 3465 3471 3477 174 - 3468 3465 3471 3480 174 3483 3465 3471 3474 174 - 3483 3465 3471 3477 174 3468 3465 3483 3486 149 - 3468 3465 3483 3489 120 3474 3471 3480 4212 167 - 3477 3471 3480 4212 167 3465 3483 3489 3492 58 - 3486 3483 3489 3492 160 3483 3489 3495 3498 90 + 3459 3465 3471 3474 175 3459 3465 3471 3477 175 + 3468 3465 3471 3474 175 3468 3465 3471 3477 175 + 3468 3465 3471 3480 175 3483 3465 3471 3474 175 + 3483 3465 3471 3477 175 3468 3465 3483 3486 150 + 3468 3465 3483 3489 121 3474 3471 3480 4212 168 + 3477 3471 3480 4212 168 3465 3483 3489 3492 58 + 3486 3483 3489 3492 161 3483 3489 3495 3498 90 3492 3489 3495 3498 91 3492 3489 3495 3501 63 - 3492 3489 3495 3525 60 3489 3495 3501 3504 174 - 3489 3495 3501 3507 174 3498 3495 3501 3504 174 - 3498 3495 3501 3507 174 3498 3495 3501 3510 174 - 3525 3495 3501 3504 174 3525 3495 3501 3507 174 - 3498 3495 3525 3528 149 3498 3495 3525 3531 120 - 3504 3501 3510 3513 161 3504 3501 3510 3516 125 - 3507 3501 3510 3513 161 3507 3501 3510 3516 125 + 3492 3489 3495 3525 60 3489 3495 3501 3504 175 + 3489 3495 3501 3507 175 3498 3495 3501 3504 175 + 3498 3495 3501 3507 175 3498 3495 3501 3510 175 + 3525 3495 3501 3504 175 3525 3495 3501 3507 175 + 3498 3495 3525 3528 150 3498 3495 3525 3531 121 + 3504 3501 3510 3513 162 3504 3501 3510 3516 126 + 3507 3501 3510 3513 162 3507 3501 3510 3516 126 3501 3510 3516 3519 66 3501 3510 3516 3522 66 - 3513 3510 3516 3519 162 3513 3510 3516 3522 162 - 3495 3525 3531 3534 58 3528 3525 3531 3534 160 + 3513 3510 3516 3519 163 3513 3510 3516 3522 163 + 3495 3525 3531 3534 58 3528 3525 3531 3534 161 3525 3531 3537 3540 90 3534 3531 3537 3540 91 3534 3531 3537 3543 62 3534 3531 3537 3582 60 - 3531 3537 3543 3546 173 3540 3537 3543 3546 173 - 3540 3537 3543 3549 173 3540 3537 3543 3561 173 - 3582 3537 3543 3546 173 3540 3537 3582 3585 149 - 3540 3537 3582 3588 190 3537 3543 3549 3552 175 - 3537 3543 3549 3555 175 3537 3543 3549 3558 175 - 3546 3543 3549 3552 175 3546 3543 3549 3555 175 - 3546 3543 3549 3558 175 3561 3543 3549 3552 175 - 3561 3543 3549 3555 175 3561 3543 3549 3558 175 - 3537 3543 3561 3564 174 3537 3543 3561 3567 174 - 3546 3543 3561 3564 174 3546 3543 3561 3567 174 - 3546 3543 3561 3570 174 3549 3543 3561 3564 174 - 3549 3543 3561 3567 174 3543 3561 3570 3573 181 - 3543 3561 3570 3576 181 3543 3561 3570 3579 181 - 3564 3561 3570 3573 181 3564 3561 3570 3576 181 - 3564 3561 3570 3579 181 3567 3561 3570 3573 181 - 3567 3561 3570 3576 181 3567 3561 3570 3579 181 + 3531 3537 3543 3546 174 3540 3537 3543 3546 174 + 3540 3537 3543 3549 174 3540 3537 3543 3561 174 + 3582 3537 3543 3546 174 3540 3537 3582 3585 150 + 3540 3537 3582 3588 111 3537 3543 3549 3552 176 + 3537 3543 3549 3555 176 3537 3543 3549 3558 176 + 3546 3543 3549 3552 176 3546 3543 3549 3555 176 + 3546 3543 3549 3558 176 3561 3543 3549 3552 176 + 3561 3543 3549 3555 176 3561 3543 3549 3558 176 + 3537 3543 3561 3564 175 3537 3543 3561 3567 175 + 3546 3543 3561 3564 175 3546 3543 3561 3567 175 + 3546 3543 3561 3570 175 3549 3543 3561 3564 175 + 3549 3543 3561 3567 175 3543 3561 3570 3573 182 + 3543 3561 3570 3576 182 3543 3561 3570 3579 182 + 3564 3561 3570 3573 182 3564 3561 3570 3576 182 + 3564 3561 3570 3579 182 3567 3561 3570 3573 182 + 3567 3561 3570 3576 182 3567 3561 3570 3579 182 3582 3588 3591 3594 81 3582 3588 3591 3597 81 3600 3588 3591 3594 82 3600 3588 3591 3597 82 3582 3588 3600 3603 88 3591 3588 3600 3603 89 - 3588 3591 3615 3618 191 3588 3591 3615 3621 192 - 3594 3591 3615 3606 171 3594 3591 3615 3618 171 - 3594 3591 3615 3621 171 3597 3591 3615 3606 171 - 3597 3591 3615 3618 171 3597 3591 3615 3621 171 - 3588 3600 3606 3609 193 3588 3600 3606 3612 194 - 3603 3600 3606 3609 169 3603 3600 3606 3612 169 - 3603 3600 3606 3615 169 3624 3600 3606 3609 169 - 3624 3600 3606 3612 169 3603 3600 -3624 3627 143 - 3603 3600 3624 3627 144 3603 3600 -3624 3630 113 - 3603 3600 3624 3630 114 3600 3606 3615 3618 170 - 3600 3606 3615 3621 170 3609 3606 3615 3591 170 - 3609 3606 3615 3618 170 3609 3606 3615 3621 170 - 3612 3606 3615 3591 170 3612 3606 3615 3618 170 - 3612 3606 3615 3621 170 3600 3624 3630 3633 57 - 3627 3624 3630 3633 160 3624 3630 3636 3639 90 + 3588 3591 3615 3618 172 3588 3591 3615 3621 172 + 3594 3591 3615 3606 172 3594 3591 3615 3618 172 + 3594 3591 3615 3621 172 3597 3591 3615 3606 172 + 3597 3591 3615 3618 172 3597 3591 3615 3621 172 + 3588 3600 3606 3609 170 3588 3600 3606 3612 170 + 3603 3600 3606 3609 170 3603 3600 3606 3612 170 + 3603 3600 3606 3615 170 3624 3600 3606 3609 170 + 3624 3600 3606 3612 170 3603 3600 -3624 3627 144 + 3603 3600 3624 3627 145 3603 3600 -3624 3630 114 + 3603 3600 3624 3630 115 3600 3606 3615 3618 171 + 3600 3606 3615 3621 171 3609 3606 3615 3591 171 + 3609 3606 3615 3618 171 3609 3606 3615 3621 171 + 3612 3606 3615 3591 171 3612 3606 3615 3618 171 + 3612 3606 3615 3621 171 3600 3624 3630 3633 57 + 3627 3624 3630 3633 161 3624 3630 3636 3639 90 3633 3630 3636 3639 91 3633 3630 3636 3642 63 - 3633 3630 3636 3654 60 3630 3636 3642 3645 174 - 3630 3636 3642 3648 174 3639 3636 3642 3645 174 - 3639 3636 3642 3648 174 3639 3636 3642 3651 174 - 3654 3636 3642 3645 174 3654 3636 3642 3648 174 - 3639 3636 3654 3657 149 3639 3636 3654 3660 120 - 3645 3642 3651 2970 167 3648 3642 3651 2970 167 - 3636 3654 3660 3663 58 3657 3654 3660 3663 160 + 3633 3630 3636 3654 60 3630 3636 3642 3645 175 + 3630 3636 3642 3648 175 3639 3636 3642 3645 175 + 3639 3636 3642 3648 175 3639 3636 3642 3651 175 + 3654 3636 3642 3645 175 3654 3636 3642 3648 175 + 3639 3636 3654 3657 150 3639 3636 3654 3660 121 + 3645 3642 3651 2970 168 3648 3642 3651 2970 168 + 3636 3654 3660 3663 58 3657 3654 3660 3663 161 3654 3660 3666 3669 90 3663 3660 3666 3669 91 3663 3660 3666 3672 63 3663 3660 3666 3687 60 - 3660 3666 3672 3675 174 3660 3666 3672 3678 174 - 3669 3666 3672 3675 174 3669 3666 3672 3678 174 - 3669 3666 3672 3681 174 3687 3666 3672 3675 174 - 3687 3666 3672 3678 174 3669 3666 3687 3690 149 - 3669 3666 3687 3693 120 3666 3672 -3681 3684 78 + 3660 3666 3672 3675 175 3660 3666 3672 3678 175 + 3669 3666 3672 3675 175 3669 3666 3672 3678 175 + 3669 3666 3672 3681 175 3687 3666 3672 3675 175 + 3687 3666 3672 3678 175 3669 3666 3687 3690 150 + 3669 3666 3687 3693 121 3666 3672 -3681 3684 78 3666 3672 -3681 3684 79 3666 3672 3681 3684 80 - 3675 3672 3681 3684 184 3678 3672 3681 3684 184 - 3666 3687 3693 3696 58 3690 3687 3693 3696 160 + 3675 3672 3681 3684 185 3678 3672 3681 3684 185 + 3666 3687 3693 3696 58 3690 3687 3693 3696 161 3687 3693 3699 3702 90 3696 3693 3699 3702 91 3696 3693 3699 3705 64 3696 3693 3699 3717 60 - 3693 3699 3705 3708 175 3693 3699 3705 3711 175 - 3693 3699 3705 3714 175 3702 3699 3705 3708 175 - 3702 3699 3705 3711 175 3702 3699 3705 3714 175 - 3717 3699 3705 3708 175 3717 3699 3705 3711 175 - 3717 3699 3705 3714 175 3702 3699 3717 3720 149 - 3702 3699 3717 3723 120 3699 3717 3723 3726 58 - 3720 3717 3723 3726 160 3717 3723 3729 3732 90 + 3693 3699 3705 3708 176 3693 3699 3705 3711 176 + 3693 3699 3705 3714 176 3702 3699 3705 3708 176 + 3702 3699 3705 3711 176 3702 3699 3705 3714 176 + 3717 3699 3705 3708 176 3717 3699 3705 3711 176 + 3717 3699 3705 3714 176 3702 3699 3717 3720 150 + 3702 3699 3717 3723 121 3699 3717 3723 3726 58 + 3720 3717 3723 3726 161 3717 3723 3729 3732 90 3726 3723 3729 3732 91 3726 3723 3729 3735 63 - 3726 3723 3729 3774 60 3723 3729 3735 3738 174 - 3723 3729 3735 3741 174 3732 3729 3735 3738 174 - 3732 3729 3735 3741 174 3732 3729 3735 3744 174 - 3774 3729 3735 3738 174 3774 3729 3735 3741 174 - 3732 3729 3774 3777 149 3732 3729 3774 3780 120 - 3729 3735 3744 3747 174 3738 3735 3744 3747 174 - 3738 3735 3744 3750 174 3738 3735 3744 3762 174 - 3741 3735 3744 3747 174 3741 3735 3744 3750 174 - 3741 3735 3744 3762 174 3735 3744 3750 3753 175 - 3735 3744 3750 3756 175 3735 3744 3750 3759 175 - 3747 3744 3750 3753 175 3747 3744 3750 3756 175 - 3747 3744 3750 3759 175 3762 3744 3750 3753 175 - 3762 3744 3750 3756 175 3762 3744 3750 3759 175 - 3735 3744 3762 3765 175 3735 3744 3762 3768 175 - 3735 3744 3762 3771 175 3747 3744 3762 3765 175 - 3747 3744 3762 3768 175 3747 3744 3762 3771 175 - 3750 3744 3762 3765 175 3750 3744 3762 3768 175 - 3750 3744 3762 3771 175 3729 3774 3780 3783 58 - 3777 3774 3780 3783 160 3774 3780 3786 3789 90 + 3726 3723 3729 3774 60 3723 3729 3735 3738 175 + 3723 3729 3735 3741 175 3732 3729 3735 3738 175 + 3732 3729 3735 3741 175 3732 3729 3735 3744 175 + 3774 3729 3735 3738 175 3774 3729 3735 3741 175 + 3732 3729 3774 3777 150 3732 3729 3774 3780 121 + 3729 3735 3744 3747 175 3738 3735 3744 3747 175 + 3738 3735 3744 3750 175 3738 3735 3744 3762 175 + 3741 3735 3744 3747 175 3741 3735 3744 3750 175 + 3741 3735 3744 3762 175 3735 3744 3750 3753 176 + 3735 3744 3750 3756 176 3735 3744 3750 3759 176 + 3747 3744 3750 3753 176 3747 3744 3750 3756 176 + 3747 3744 3750 3759 176 3762 3744 3750 3753 176 + 3762 3744 3750 3756 176 3762 3744 3750 3759 176 + 3735 3744 3762 3765 176 3735 3744 3762 3768 176 + 3735 3744 3762 3771 176 3747 3744 3762 3765 176 + 3747 3744 3762 3768 176 3747 3744 3762 3771 176 + 3750 3744 3762 3765 176 3750 3744 3762 3768 176 + 3750 3744 3762 3771 176 3729 3774 3780 3783 58 + 3777 3774 3780 3783 161 3774 3780 3786 3789 90 3783 3780 3786 3789 91 3783 3780 3786 3792 63 - 3783 3780 3786 3831 60 3780 3786 3792 3795 174 - 3780 3786 3792 3798 174 3789 3786 3792 3795 174 - 3789 3786 3792 3798 174 3789 3786 3792 3801 174 - 3831 3786 3792 3795 174 3831 3786 3792 3798 174 - 3789 3786 3831 3834 149 3789 3786 3831 3837 120 - 3786 3792 3801 3804 174 3795 3792 3801 3804 174 - 3795 3792 3801 3807 174 3795 3792 3801 3819 174 - 3798 3792 3801 3804 174 3798 3792 3801 3807 174 - 3798 3792 3801 3819 174 3792 3801 3807 3810 175 - 3792 3801 3807 3813 175 3792 3801 3807 3816 175 - 3804 3801 3807 3810 175 3804 3801 3807 3813 175 - 3804 3801 3807 3816 175 3819 3801 3807 3810 175 - 3819 3801 3807 3813 175 3819 3801 3807 3816 175 - 3792 3801 3819 3822 175 3792 3801 3819 3825 175 - 3792 3801 3819 3828 175 3804 3801 3819 3822 175 - 3804 3801 3819 3825 175 3804 3801 3819 3828 175 - 3807 3801 3819 3822 175 3807 3801 3819 3825 175 - 3807 3801 3819 3828 175 3786 3831 3837 3840 58 - 3834 3831 3837 3840 160 3831 3837 3843 3846 90 + 3783 3780 3786 3831 60 3780 3786 3792 3795 175 + 3780 3786 3792 3798 175 3789 3786 3792 3795 175 + 3789 3786 3792 3798 175 3789 3786 3792 3801 175 + 3831 3786 3792 3795 175 3831 3786 3792 3798 175 + 3789 3786 3831 3834 150 3789 3786 3831 3837 121 + 3786 3792 3801 3804 175 3795 3792 3801 3804 175 + 3795 3792 3801 3807 175 3795 3792 3801 3819 175 + 3798 3792 3801 3804 175 3798 3792 3801 3807 175 + 3798 3792 3801 3819 175 3792 3801 3807 3810 176 + 3792 3801 3807 3813 176 3792 3801 3807 3816 176 + 3804 3801 3807 3810 176 3804 3801 3807 3813 176 + 3804 3801 3807 3816 176 3819 3801 3807 3810 176 + 3819 3801 3807 3813 176 3819 3801 3807 3816 176 + 3792 3801 3819 3822 176 3792 3801 3819 3825 176 + 3792 3801 3819 3828 176 3804 3801 3819 3822 176 + 3804 3801 3819 3825 176 3804 3801 3819 3828 176 + 3807 3801 3819 3822 176 3807 3801 3819 3825 176 + 3807 3801 3819 3828 176 3786 3831 3837 3840 58 + 3834 3831 3837 3840 161 3831 3837 3843 3846 90 3840 3837 3843 3846 91 3840 3837 3843 3849 63 - 3840 3837 3843 3864 60 3837 3843 3849 3852 174 - 3837 3843 3849 3855 174 3846 3843 3849 3852 174 - 3846 3843 3849 3855 174 3846 3843 3849 3858 174 - 3864 3843 3849 3852 174 3864 3843 3849 3855 174 - 3846 3843 3864 3867 149 3846 3843 3864 3870 120 + 3840 3837 3843 3864 60 3837 3843 3849 3852 175 + 3837 3843 3849 3855 175 3846 3843 3849 3852 175 + 3846 3843 3849 3855 175 3846 3843 3849 3858 175 + 3864 3843 3849 3852 175 3864 3843 3849 3855 175 + 3846 3843 3864 3867 150 3846 3843 3864 3870 121 3843 3849 -3858 3861 78 3843 3849 -3858 3861 79 - 3843 3849 3858 3861 80 3852 3849 3858 3861 184 - 3855 3849 3858 3861 184 3843 3864 3870 3873 58 - 3867 3864 3870 3873 160 3864 3870 3876 3879 90 + 3843 3849 3858 3861 80 3852 3849 3858 3861 185 + 3855 3849 3858 3861 185 3843 3864 3870 3873 58 + 3867 3864 3870 3873 161 3864 3870 3876 3879 90 3873 3870 3876 3879 91 3873 3870 3876 3882 63 - 3873 3870 3876 3897 60 3870 3876 3882 3885 174 - 3870 3876 3882 3888 174 3879 3876 3882 3885 174 - 3879 3876 3882 3888 174 3879 3876 3882 3891 174 - 3897 3876 3882 3885 174 3897 3876 3882 3888 174 - 3879 3876 3897 3900 149 3879 3876 3897 3903 120 + 3873 3870 3876 3897 60 3870 3876 3882 3885 175 + 3870 3876 3882 3888 175 3879 3876 3882 3885 175 + 3879 3876 3882 3888 175 3879 3876 3882 3891 175 + 3897 3876 3882 3885 175 3897 3876 3882 3888 175 + 3879 3876 3897 3900 150 3879 3876 3897 3903 121 3876 3882 -3891 3894 78 3876 3882 -3891 3894 79 - 3876 3882 3891 3894 80 3885 3882 3891 3894 184 - 3888 3882 3891 3894 184 3876 3897 3903 3906 58 - 3900 3897 3903 3906 160 3897 3903 3909 3912 90 + 3876 3882 3891 3894 80 3885 3882 3891 3894 185 + 3888 3882 3891 3894 185 3876 3897 3903 3906 58 + 3900 3897 3903 3906 161 3897 3903 3909 3912 90 3906 3903 3909 3912 91 3906 3903 3909 3915 63 - 3906 3903 3909 3933 60 3903 3909 3915 3918 174 - 3903 3909 3915 3921 174 3912 3909 3915 3918 174 - 3912 3909 3915 3921 174 3912 3909 3915 3924 174 - 3933 3909 3915 3918 174 3933 3909 3915 3921 174 - 3912 3909 3933 3936 149 3912 3909 3933 3939 120 - 3918 3915 3924 3927 179 3918 3915 3924 3930 179 - 3921 3915 3924 3927 179 3921 3915 3924 3930 179 - 3909 3933 3939 3942 58 3936 3933 3939 3942 160 + 3906 3903 3909 3933 60 3903 3909 3915 3918 175 + 3903 3909 3915 3921 175 3912 3909 3915 3918 175 + 3912 3909 3915 3921 175 3912 3909 3915 3924 175 + 3933 3909 3915 3918 175 3933 3909 3915 3921 175 + 3912 3909 3933 3936 150 3912 3909 3933 3939 121 + 3918 3915 3924 3927 180 3918 3915 3924 3930 180 + 3921 3915 3924 3927 180 3921 3915 3924 3930 180 + 3909 3933 3939 3942 58 3936 3933 3939 3942 161 3933 3939 3945 3948 90 3942 3939 3945 3948 91 3942 3939 3945 3951 62 3942 3939 3945 3990 60 - 3939 3945 3951 3954 173 3948 3945 3951 3954 173 - 3948 3945 3951 3957 173 3948 3945 3951 3969 173 - 3990 3945 3951 3954 173 3948 3945 3990 3993 149 - 3948 3945 3990 3996 120 3945 3951 3957 3960 175 - 3945 3951 3957 3963 175 3945 3951 3957 3966 175 - 3954 3951 3957 3960 175 3954 3951 3957 3963 175 - 3954 3951 3957 3966 175 3969 3951 3957 3960 175 - 3969 3951 3957 3963 175 3969 3951 3957 3966 175 - 3945 3951 3969 3972 174 3945 3951 3969 3975 174 - 3954 3951 3969 3972 174 3954 3951 3969 3975 174 - 3954 3951 3969 3978 174 3957 3951 3969 3972 174 - 3957 3951 3969 3975 174 3951 3969 3978 3981 181 - 3951 3969 3978 3984 181 3951 3969 3978 3987 181 - 3972 3969 3978 3981 181 3972 3969 3978 3984 181 - 3972 3969 3978 3987 181 3975 3969 3978 3981 181 - 3975 3969 3978 3984 181 3975 3969 3978 3987 181 - 3945 3990 3996 3999 58 3993 3990 3996 3999 160 + 3939 3945 3951 3954 174 3948 3945 3951 3954 174 + 3948 3945 3951 3957 174 3948 3945 3951 3969 174 + 3990 3945 3951 3954 174 3948 3945 3990 3993 150 + 3948 3945 3990 3996 121 3945 3951 3957 3960 176 + 3945 3951 3957 3963 176 3945 3951 3957 3966 176 + 3954 3951 3957 3960 176 3954 3951 3957 3963 176 + 3954 3951 3957 3966 176 3969 3951 3957 3960 176 + 3969 3951 3957 3963 176 3969 3951 3957 3966 176 + 3945 3951 3969 3972 175 3945 3951 3969 3975 175 + 3954 3951 3969 3972 175 3954 3951 3969 3975 175 + 3954 3951 3969 3978 175 3957 3951 3969 3972 175 + 3957 3951 3969 3975 175 3951 3969 3978 3981 182 + 3951 3969 3978 3984 182 3951 3969 3978 3987 182 + 3972 3969 3978 3981 182 3972 3969 3978 3984 182 + 3972 3969 3978 3987 182 3975 3969 3978 3981 182 + 3975 3969 3978 3984 182 3975 3969 3978 3987 182 + 3945 3990 3996 3999 58 3993 3990 3996 3999 161 3990 3996 4002 4005 90 3999 3996 4002 4005 91 3999 3996 4002 4008 62 3999 3996 4002 4032 60 - 3996 4002 4008 4011 173 4005 4002 4008 4011 173 - 4005 4002 4008 4014 173 4005 4002 4008 4020 173 - 4032 4002 4008 4011 173 4005 4002 4032 4035 149 - 4005 4002 4032 4038 120 4002 4008 -4014 4017 72 + 3996 4002 4008 4011 174 4005 4002 4008 4011 174 + 4005 4002 4008 4014 174 4005 4002 4008 4020 174 + 4032 4002 4008 4011 174 4005 4002 4032 4035 150 + 4005 4002 4032 4038 121 4002 4008 -4014 4017 72 4002 4008 -4014 4017 73 4002 4008 4014 4017 74 - 4011 4008 4014 4017 177 4020 4008 -4014 4017 75 + 4011 4008 4014 4017 178 4020 4008 -4014 4017 75 4020 4008 -4014 4017 76 4020 4008 4014 4017 77 - 4002 4008 4020 4023 175 4002 4008 4020 4026 175 - 4002 4008 4020 4029 175 4011 4008 4020 4023 175 - 4011 4008 4020 4026 175 4011 4008 4020 4029 175 - 4014 4008 4020 4023 175 4014 4008 4020 4026 175 - 4014 4008 4020 4029 175 4002 4032 4038 4041 58 - 4035 4032 4038 4041 160 4032 4038 4044 4047 90 + 4002 4008 4020 4023 176 4002 4008 4020 4026 176 + 4002 4008 4020 4029 176 4011 4008 4020 4023 176 + 4011 4008 4020 4026 176 4011 4008 4020 4029 176 + 4014 4008 4020 4023 176 4014 4008 4020 4026 176 + 4014 4008 4020 4029 176 4002 4032 4038 4041 58 + 4035 4032 4038 4041 161 4032 4038 4044 4047 90 4041 4038 4044 4047 91 4041 4038 4044 4050 64 - 4041 4038 4044 4062 60 4038 4044 4050 4053 175 - 4038 4044 4050 4056 175 4038 4044 4050 4059 175 - 4047 4044 4050 4053 175 4047 4044 4050 4056 175 - 4047 4044 4050 4059 175 4062 4044 4050 4053 175 - 4062 4044 4050 4056 175 4062 4044 4050 4059 175 - 4047 4044 4062 4065 149 4047 4044 4062 4068 120 - 4044 4062 4068 4071 58 4065 4062 4068 4071 160 + 4041 4038 4044 4062 60 4038 4044 4050 4053 176 + 4038 4044 4050 4056 176 4038 4044 4050 4059 176 + 4047 4044 4050 4053 176 4047 4044 4050 4056 176 + 4047 4044 4050 4059 176 4062 4044 4050 4053 176 + 4062 4044 4050 4056 176 4062 4044 4050 4059 176 + 4047 4044 4062 4065 150 4047 4044 4062 4068 121 + 4044 4062 4068 4071 58 4065 4062 4068 4071 161 4062 4068 4074 4077 90 4071 4068 4074 4077 91 4071 4068 4074 4080 63 4071 4068 4074 4095 60 - 4068 4074 4080 4083 174 4068 4074 4080 4086 174 - 4077 4074 4080 4083 174 4077 4074 4080 4086 174 - 4077 4074 4080 4089 174 4095 4074 4080 4083 174 - 4095 4074 4080 4086 174 4077 4074 4095 4098 149 - 4077 4074 4095 4101 120 4074 4080 -4089 4092 78 + 4068 4074 4080 4083 175 4068 4074 4080 4086 175 + 4077 4074 4080 4083 175 4077 4074 4080 4086 175 + 4077 4074 4080 4089 175 4095 4074 4080 4083 175 + 4095 4074 4080 4086 175 4077 4074 4095 4098 150 + 4077 4074 4095 4101 121 4074 4080 -4089 4092 78 4074 4080 -4089 4092 79 4074 4080 4089 4092 80 - 4083 4080 4089 4092 184 4086 4080 4089 4092 184 - 4074 4095 4101 4104 58 4098 4095 4101 4104 160 + 4083 4080 4089 4092 185 4086 4080 4089 4092 185 + 4074 4095 4101 4104 58 4098 4095 4101 4104 161 4095 4101 4107 4110 90 4104 4101 4107 4110 91 4104 4101 4107 4113 62 4104 4101 4107 4143 60 - 4101 4107 4113 4116 173 4110 4107 4113 4116 173 - 4110 4107 4113 4119 173 4110 4107 4113 4131 173 - 4143 4107 4113 4116 173 4110 4107 4143 4146 149 - 4110 4107 4143 4149 120 4107 4113 4119 4122 175 - 4107 4113 4119 4125 175 4107 4113 4119 4128 175 - 4116 4113 4119 4122 175 4116 4113 4119 4125 175 - 4116 4113 4119 4128 175 4131 4113 4119 4122 175 - 4131 4113 4119 4125 175 4131 4113 4119 4128 175 - 4107 4113 4131 4134 175 4107 4113 4131 4137 175 - 4107 4113 4131 4140 175 4116 4113 4131 4134 175 - 4116 4113 4131 4137 175 4116 4113 4131 4140 175 - 4119 4113 4131 4134 175 4119 4113 4131 4137 175 - 4119 4113 4131 4140 175 4107 4143 4149 4152 58 - 4146 4143 4149 4152 160 4143 4149 4155 4158 90 + 4101 4107 4113 4116 174 4110 4107 4113 4116 174 + 4110 4107 4113 4119 174 4110 4107 4113 4131 174 + 4143 4107 4113 4116 174 4110 4107 4143 4146 150 + 4110 4107 4143 4149 121 4107 4113 4119 4122 176 + 4107 4113 4119 4125 176 4107 4113 4119 4128 176 + 4116 4113 4119 4122 176 4116 4113 4119 4125 176 + 4116 4113 4119 4128 176 4131 4113 4119 4122 176 + 4131 4113 4119 4125 176 4131 4113 4119 4128 176 + 4107 4113 4131 4134 176 4107 4113 4131 4137 176 + 4107 4113 4131 4140 176 4116 4113 4131 4134 176 + 4116 4113 4131 4137 176 4116 4113 4131 4140 176 + 4119 4113 4131 4134 176 4119 4113 4131 4137 176 + 4119 4113 4131 4140 176 4107 4143 4149 4152 58 + 4146 4143 4149 4152 161 4143 4149 4155 4158 90 4152 4149 4155 4158 91 4152 4149 4155 4161 63 - 4152 4149 4155 4185 60 4149 4155 4161 4164 174 - 4149 4155 4161 4167 174 4158 4155 4161 4164 174 - 4158 4155 4161 4167 174 4158 4155 4161 4170 174 - 4185 4155 4161 4164 174 4185 4155 4161 4167 174 - 4158 4155 4185 4188 149 4158 4155 4185 4191 120 - 4164 4161 4170 4173 161 4164 4161 4170 4176 125 - 4167 4161 4170 4173 161 4167 4161 4170 4176 125 + 4152 4149 4155 4185 60 4149 4155 4161 4164 175 + 4149 4155 4161 4167 175 4158 4155 4161 4164 175 + 4158 4155 4161 4167 175 4158 4155 4161 4170 175 + 4185 4155 4161 4164 175 4185 4155 4161 4167 175 + 4158 4155 4185 4188 150 4158 4155 4185 4191 121 + 4164 4161 4170 4173 162 4164 4161 4170 4176 126 + 4167 4161 4170 4173 162 4167 4161 4170 4176 126 4161 4170 4176 4179 66 4161 4170 4176 4182 66 - 4173 4170 4176 4179 162 4173 4170 4176 4182 162 - 4155 4185 4191 4194 58 4188 4185 4191 4194 160 + 4173 4170 4176 4179 163 4173 4170 4176 4182 163 + 4155 4185 4191 4194 58 4188 4185 4191 4194 161 4185 4191 4197 4200 90 4194 4191 4197 4200 91 4194 4191 4197 4203 63 4194 4191 4197 4215 60 - 4191 4197 4203 4206 174 4191 4197 4203 4209 174 - 4200 4197 4203 4206 174 4200 4197 4203 4209 174 - 4200 4197 4203 4212 174 4215 4197 4203 4206 174 - 4215 4197 4203 4209 174 4200 4197 4215 4218 149 - 4200 4197 4215 4221 120 4206 4203 4212 3480 167 - 4209 4203 4212 3480 167 4197 4215 4221 4224 58 - 4218 4215 4221 4224 160 4215 4221 4227 4230 90 + 4191 4197 4203 4206 175 4191 4197 4203 4209 175 + 4200 4197 4203 4206 175 4200 4197 4203 4209 175 + 4200 4197 4203 4212 175 4215 4197 4203 4206 175 + 4215 4197 4203 4209 175 4200 4197 4215 4218 150 + 4200 4197 4215 4221 121 4206 4203 4212 3480 168 + 4209 4203 4212 3480 168 4197 4215 4221 4224 58 + 4218 4215 4221 4224 161 4215 4221 4227 4230 90 4224 4221 4227 4230 91 4224 4221 4227 4233 64 - 4224 4221 4227 4245 60 4221 4227 4233 4236 175 - 4221 4227 4233 4239 175 4221 4227 4233 4242 175 - 4230 4227 4233 4236 175 4230 4227 4233 4239 175 - 4230 4227 4233 4242 175 4245 4227 4233 4236 175 - 4245 4227 4233 4239 175 4245 4227 4233 4242 175 - 4230 4227 4245 4248 149 4230 4227 4245 4251 120 - 4227 4245 4251 4254 58 4248 4245 4251 4254 160 + 4224 4221 4227 4245 60 4221 4227 4233 4236 176 + 4221 4227 4233 4239 176 4221 4227 4233 4242 176 + 4230 4227 4233 4236 176 4230 4227 4233 4239 176 + 4230 4227 4233 4242 176 4245 4227 4233 4236 176 + 4245 4227 4233 4239 176 4245 4227 4233 4242 176 + 4230 4227 4245 4248 150 4230 4227 4245 4251 121 + 4227 4245 4251 4254 58 4248 4245 4251 4254 161 4245 4251 4257 4260 90 4254 4251 4257 4260 91 4254 4251 4257 4263 63 4254 4251 4257 4311 60 - 4251 4257 4263 4266 174 4251 4257 4263 4269 174 - 4260 4257 4263 4266 174 4260 4257 4263 4269 174 - 4260 4257 4263 4272 174 4311 4257 4263 4266 174 - 4311 4257 4263 4269 174 4260 4257 4311 4314 149 - 4260 4257 4311 4317 120 4257 4263 4272 4275 180 - 4257 4263 4272 4278 180 4266 4263 4272 4275 180 - 4266 4263 4272 4278 180 4266 4263 4272 4281 180 - 4269 4263 4272 4275 180 4269 4263 4272 4278 180 - 4269 4263 4272 4281 180 4263 4272 4281 4284 180 - 4263 4272 4281 4287 180 4275 4272 4281 4284 180 - 4275 4272 4281 4287 180 4275 4272 4281 4290 180 - 4278 4272 4281 4284 180 4278 4272 4281 4287 180 - 4278 4272 4281 4290 180 4272 4281 4290 4293 180 - 4272 4281 4290 4296 180 4284 4281 4290 4293 180 - 4284 4281 4290 4296 180 4284 4281 4290 4299 180 - 4287 4281 4290 4293 180 4287 4281 4290 4296 180 - 4287 4281 4290 4299 180 4281 4290 4299 4302 183 - 4281 4290 4299 4305 183 4281 4290 4299 4308 183 - 4293 4290 4299 4302 183 4293 4290 4299 4305 183 - 4293 4290 4299 4308 183 4296 4290 4299 4302 183 - 4296 4290 4299 4305 183 4296 4290 4299 4308 183 - 4257 4311 4317 4320 58 4314 4311 4317 4320 160 + 4251 4257 4263 4266 175 4251 4257 4263 4269 175 + 4260 4257 4263 4266 175 4260 4257 4263 4269 175 + 4260 4257 4263 4272 175 4311 4257 4263 4266 175 + 4311 4257 4263 4269 175 4260 4257 4311 4314 150 + 4260 4257 4311 4317 121 4257 4263 4272 4275 181 + 4257 4263 4272 4278 181 4266 4263 4272 4275 181 + 4266 4263 4272 4278 181 4266 4263 4272 4281 181 + 4269 4263 4272 4275 181 4269 4263 4272 4278 181 + 4269 4263 4272 4281 181 4263 4272 4281 4284 181 + 4263 4272 4281 4287 181 4275 4272 4281 4284 181 + 4275 4272 4281 4287 181 4275 4272 4281 4290 181 + 4278 4272 4281 4284 181 4278 4272 4281 4287 181 + 4278 4272 4281 4290 181 4272 4281 4290 4293 181 + 4272 4281 4290 4296 181 4284 4281 4290 4293 181 + 4284 4281 4290 4296 181 4284 4281 4290 4299 181 + 4287 4281 4290 4293 181 4287 4281 4290 4296 181 + 4287 4281 4290 4299 181 4281 4290 4299 4302 184 + 4281 4290 4299 4305 184 4281 4290 4299 4308 184 + 4293 4290 4299 4302 184 4293 4290 4299 4305 184 + 4293 4290 4299 4308 184 4296 4290 4299 4302 184 + 4296 4290 4299 4305 184 4296 4290 4299 4308 184 + 4257 4311 4317 4320 58 4314 4311 4317 4320 161 4311 4317 4323 4326 90 4320 4317 4323 4326 91 4320 4317 4323 4329 63 4320 4317 4323 4377 60 - 4317 4323 4329 4332 174 4317 4323 4329 4335 174 - 4326 4323 4329 4332 174 4326 4323 4329 4335 174 - 4326 4323 4329 4338 174 4377 4323 4329 4332 174 - 4377 4323 4329 4335 174 4326 4323 4377 4380 149 - 4326 4323 4377 4383 120 4323 4329 4338 4341 180 - 4323 4329 4338 4344 180 4332 4329 4338 4341 180 - 4332 4329 4338 4344 180 4332 4329 4338 4347 180 - 4335 4329 4338 4341 180 4335 4329 4338 4344 180 - 4335 4329 4338 4347 180 4329 4338 4347 4350 180 - 4329 4338 4347 4353 180 4341 4338 4347 4350 180 - 4341 4338 4347 4353 180 4341 4338 4347 4356 180 - 4344 4338 4347 4350 180 4344 4338 4347 4353 180 - 4344 4338 4347 4356 180 4338 4347 4356 4359 180 - 4338 4347 4356 4362 180 4350 4347 4356 4359 180 - 4350 4347 4356 4362 180 4350 4347 4356 4365 180 - 4353 4347 4356 4359 180 4353 4347 4356 4362 180 - 4353 4347 4356 4365 180 4347 4356 4365 4368 183 - 4347 4356 4365 4371 183 4347 4356 4365 4374 183 - 4359 4356 4365 4368 183 4359 4356 4365 4371 183 - 4359 4356 4365 4374 183 4362 4356 4365 4368 183 - 4362 4356 4365 4371 183 4362 4356 4365 4374 183 - 4323 4377 4383 4386 58 4380 4377 4383 4386 160 + 4317 4323 4329 4332 175 4317 4323 4329 4335 175 + 4326 4323 4329 4332 175 4326 4323 4329 4335 175 + 4326 4323 4329 4338 175 4377 4323 4329 4332 175 + 4377 4323 4329 4335 175 4326 4323 4377 4380 150 + 4326 4323 4377 4383 121 4323 4329 4338 4341 181 + 4323 4329 4338 4344 181 4332 4329 4338 4341 181 + 4332 4329 4338 4344 181 4332 4329 4338 4347 181 + 4335 4329 4338 4341 181 4335 4329 4338 4344 181 + 4335 4329 4338 4347 181 4329 4338 4347 4350 181 + 4329 4338 4347 4353 181 4341 4338 4347 4350 181 + 4341 4338 4347 4353 181 4341 4338 4347 4356 181 + 4344 4338 4347 4350 181 4344 4338 4347 4353 181 + 4344 4338 4347 4356 181 4338 4347 4356 4359 181 + 4338 4347 4356 4362 181 4350 4347 4356 4359 181 + 4350 4347 4356 4362 181 4350 4347 4356 4365 181 + 4353 4347 4356 4359 181 4353 4347 4356 4362 181 + 4353 4347 4356 4365 181 4347 4356 4365 4368 184 + 4347 4356 4365 4371 184 4347 4356 4365 4374 184 + 4359 4356 4365 4368 184 4359 4356 4365 4371 184 + 4359 4356 4365 4374 184 4362 4356 4365 4368 184 + 4362 4356 4365 4371 184 4362 4356 4365 4374 184 + 4323 4377 4383 4386 58 4380 4377 4383 4386 161 4377 4383 4389 4392 90 4386 4383 4389 4392 91 4386 4383 4389 4395 62 4386 4383 4389 4434 60 - 4383 4389 4395 4398 173 4392 4389 4395 4398 173 - 4392 4389 4395 4401 173 4392 4389 4395 4413 173 - 4434 4389 4395 4398 173 4392 4389 4434 4437 149 - 4392 4389 4434 4440 120 4389 4395 4401 4404 175 - 4389 4395 4401 4407 175 4389 4395 4401 4410 175 - 4398 4395 4401 4404 175 4398 4395 4401 4407 175 - 4398 4395 4401 4410 175 4413 4395 4401 4404 175 - 4413 4395 4401 4407 175 4413 4395 4401 4410 175 - 4389 4395 4413 4416 174 4389 4395 4413 4419 174 - 4398 4395 4413 4416 174 4398 4395 4413 4419 174 - 4398 4395 4413 4422 174 4401 4395 4413 4416 174 - 4401 4395 4413 4419 174 4395 4413 4422 4425 181 - 4395 4413 4422 4428 181 4395 4413 4422 4431 181 - 4416 4413 4422 4425 181 4416 4413 4422 4428 181 - 4416 4413 4422 4431 181 4419 4413 4422 4425 181 - 4419 4413 4422 4428 181 4419 4413 4422 4431 181 - 4389 4434 4440 4443 58 4437 4434 4440 4443 160 + 4383 4389 4395 4398 174 4392 4389 4395 4398 174 + 4392 4389 4395 4401 174 4392 4389 4395 4413 174 + 4434 4389 4395 4398 174 4392 4389 4434 4437 150 + 4392 4389 4434 4440 121 4389 4395 4401 4404 176 + 4389 4395 4401 4407 176 4389 4395 4401 4410 176 + 4398 4395 4401 4404 176 4398 4395 4401 4407 176 + 4398 4395 4401 4410 176 4413 4395 4401 4404 176 + 4413 4395 4401 4407 176 4413 4395 4401 4410 176 + 4389 4395 4413 4416 175 4389 4395 4413 4419 175 + 4398 4395 4413 4416 175 4398 4395 4413 4419 175 + 4398 4395 4413 4422 175 4401 4395 4413 4416 175 + 4401 4395 4413 4419 175 4395 4413 4422 4425 182 + 4395 4413 4422 4428 182 4395 4413 4422 4431 182 + 4416 4413 4422 4425 182 4416 4413 4422 4428 182 + 4416 4413 4422 4431 182 4419 4413 4422 4425 182 + 4419 4413 4422 4428 182 4419 4413 4422 4431 182 + 4389 4434 4440 4443 58 4437 4434 4440 4443 161 4434 4440 4446 4449 90 4443 4440 4446 4449 91 4443 4440 4446 4452 62 4443 4440 4446 4482 60 - 4440 4446 4452 4455 173 4449 4446 4452 4455 173 - 4449 4446 4452 4458 173 4449 4446 4452 4470 173 - 4482 4446 4452 4455 173 4449 4446 4482 4485 149 - 4449 4446 4482 4488 120 4446 4452 4458 4461 175 - 4446 4452 4458 4464 175 4446 4452 4458 4467 175 - 4455 4452 4458 4461 175 4455 4452 4458 4464 175 - 4455 4452 4458 4467 175 4470 4452 4458 4461 175 - 4470 4452 4458 4464 175 4470 4452 4458 4467 175 - 4446 4452 4470 4473 175 4446 4452 4470 4476 175 - 4446 4452 4470 4479 175 4455 4452 4470 4473 175 - 4455 4452 4470 4476 175 4455 4452 4470 4479 175 - 4458 4452 4470 4473 175 4458 4452 4470 4476 175 - 4458 4452 4470 4479 175 4446 4482 4488 4491 58 - 4485 4482 4488 4491 160 4482 4488 4494 4497 90 + 4440 4446 4452 4455 174 4449 4446 4452 4455 174 + 4449 4446 4452 4458 174 4449 4446 4452 4470 174 + 4482 4446 4452 4455 174 4449 4446 4482 4485 150 + 4449 4446 4482 4488 121 4446 4452 4458 4461 176 + 4446 4452 4458 4464 176 4446 4452 4458 4467 176 + 4455 4452 4458 4461 176 4455 4452 4458 4464 176 + 4455 4452 4458 4467 176 4470 4452 4458 4461 176 + 4470 4452 4458 4464 176 4470 4452 4458 4467 176 + 4446 4452 4470 4473 176 4446 4452 4470 4476 176 + 4446 4452 4470 4479 176 4455 4452 4470 4473 176 + 4455 4452 4470 4476 176 4455 4452 4470 4479 176 + 4458 4452 4470 4473 176 4458 4452 4470 4476 176 + 4458 4452 4470 4479 176 4446 4482 4488 4491 58 + 4485 4482 4488 4491 161 4482 4488 4494 4497 90 4491 4488 4494 4497 91 4491 4488 4494 4500 63 - 4491 4488 4494 4515 60 4488 4494 4500 4503 174 - 4488 4494 4500 4506 174 4497 4494 4500 4503 174 - 4497 4494 4500 4506 174 4497 4494 4500 4509 174 - 4515 4494 4500 4503 174 4515 4494 4500 4506 174 - 4497 4494 4515 4518 149 4497 4494 4515 4521 120 + 4491 4488 4494 4515 60 4488 4494 4500 4503 175 + 4488 4494 4500 4506 175 4497 4494 4500 4503 175 + 4497 4494 4500 4506 175 4497 4494 4500 4509 175 + 4515 4494 4500 4503 175 4515 4494 4500 4506 175 + 4497 4494 4515 4518 150 4497 4494 4515 4521 121 4494 4500 -4509 4512 78 4494 4500 -4509 4512 79 - 4494 4500 4509 4512 80 4503 4500 4509 4512 184 - 4506 4500 4509 4512 184 4494 4515 4521 4524 58 - 4518 4515 4521 4524 160 4515 4521 4527 4530 90 + 4494 4500 4509 4512 80 4503 4500 4509 4512 185 + 4506 4500 4509 4512 185 4494 4515 4521 4524 58 + 4518 4515 4521 4524 161 4515 4521 4527 4530 90 4524 4521 4527 4530 91 4524 4521 4527 4533 63 - 4524 4521 4527 4551 60 4521 4527 4533 4536 174 - 4521 4527 4533 4539 174 4530 4527 4533 4536 174 - 4530 4527 4533 4539 174 4530 4527 4533 4542 174 - 4551 4527 4533 4536 174 4551 4527 4533 4539 174 - 4530 4527 4551 4554 149 4530 4527 4551 4557 120 - 4536 4533 4542 4545 179 4536 4533 4542 4548 179 - 4539 4533 4542 4545 179 4539 4533 4542 4548 179 - 4527 4551 4557 4560 58 4554 4551 4557 4560 160 + 4524 4521 4527 4551 60 4521 4527 4533 4536 175 + 4521 4527 4533 4539 175 4530 4527 4533 4536 175 + 4530 4527 4533 4539 175 4530 4527 4533 4542 175 + 4551 4527 4533 4536 175 4551 4527 4533 4539 175 + 4530 4527 4551 4554 150 4530 4527 4551 4557 121 + 4536 4533 4542 4545 180 4536 4533 4542 4548 180 + 4539 4533 4542 4545 180 4539 4533 4542 4548 180 + 4527 4551 4557 4560 58 4554 4551 4557 4560 161 4551 4557 4563 4566 92 4551 4557 4563 4569 92 4560 4557 4563 4566 93 4560 4557 4563 4569 93 - 4560 4557 4563 4572 65 4566 4563 4572 4575 152 - 4566 4563 4572 4578 122 4569 4563 4572 4575 152 - 4569 4563 4572 4578 122 4563 4572 4578 4581 59 - 4575 4572 4578 4581 160 4572 4578 4584 4587 90 + 4560 4557 4563 4572 65 4566 4563 4572 4575 153 + 4566 4563 4572 4578 123 4569 4563 4572 4575 153 + 4569 4563 4572 4578 123 4563 4572 4578 4581 59 + 4575 4572 4578 4581 161 4572 4578 4584 4587 90 4581 4578 4584 4587 91 4581 4578 4584 4590 63 - 4581 4578 4584 4614 60 4578 4584 4590 4593 174 - 4578 4584 4590 4596 174 4587 4584 4590 4593 174 - 4587 4584 4590 4596 174 4587 4584 4590 4599 174 - 4614 4584 4590 4593 174 4614 4584 4590 4596 174 - 4587 4584 4614 4617 149 4587 4584 4614 4620 120 - 4593 4590 4599 4602 161 4593 4590 4599 4605 125 - 4596 4590 4599 4602 161 4596 4590 4599 4605 125 + 4581 4578 4584 4614 60 4578 4584 4590 4593 175 + 4578 4584 4590 4596 175 4587 4584 4590 4593 175 + 4587 4584 4590 4596 175 4587 4584 4590 4599 175 + 4614 4584 4590 4593 175 4614 4584 4590 4596 175 + 4587 4584 4614 4617 150 4587 4584 4614 4620 121 + 4593 4590 4599 4602 162 4593 4590 4599 4605 126 + 4596 4590 4599 4602 162 4596 4590 4599 4605 126 4590 4599 4605 4608 66 4590 4599 4605 4611 66 - 4602 4599 4605 4608 162 4602 4599 4605 4611 162 - 4584 4614 4620 4623 58 4617 4614 4620 4623 160 + 4602 4599 4605 4608 163 4602 4599 4605 4611 163 + 4584 4614 4620 4623 58 4617 4614 4620 4623 161 4614 4620 4626 4629 92 4614 4620 4626 4632 92 4623 4620 4626 4629 93 4623 4620 4626 4632 93 - 4623 4620 4626 4635 65 4629 4626 4635 4638 152 - 4629 4626 4635 4641 122 4632 4626 4635 4638 152 - 4632 4626 4635 4641 122 4626 4635 4641 4644 59 - 4638 4635 4641 4644 160 4635 4641 4647 4650 90 + 4623 4620 4626 4635 65 4629 4626 4635 4638 153 + 4629 4626 4635 4641 123 4632 4626 4635 4638 153 + 4632 4626 4635 4641 123 4626 4635 4641 4644 59 + 4638 4635 4641 4644 161 4635 4641 4647 4650 90 4644 4641 4647 4650 91 4644 4641 4647 4653 63 - 4644 4641 4647 4686 60 4641 4647 4653 4656 174 - 4641 4647 4653 4659 174 4650 4647 4653 4656 174 - 4650 4647 4653 4659 174 4650 4647 4653 4662 174 - 4686 4647 4653 4656 174 4686 4647 4653 4659 174 - 4650 4647 4686 4689 149 4650 4647 4686 4692 120 - 4647 4653 4662 4665 180 4647 4653 4662 4668 180 - 4656 4653 4662 4665 180 4656 4653 4662 4668 180 - 4656 4653 4662 4671 165 4659 4653 4662 4665 180 - 4659 4653 4662 4668 180 4659 4653 4662 4671 165 + 4644 4641 4647 4686 60 4641 4647 4653 4656 175 + 4641 4647 4653 4659 175 4650 4647 4653 4656 175 + 4650 4647 4653 4659 175 4650 4647 4653 4662 175 + 4686 4647 4653 4656 175 4686 4647 4653 4659 175 + 4650 4647 4686 4689 150 4650 4647 4686 4692 121 + 4647 4653 4662 4665 181 4647 4653 4662 4668 181 + 4656 4653 4662 4665 181 4656 4653 4662 4668 181 + 4656 4653 4662 4671 166 4659 4653 4662 4665 181 + 4659 4653 4662 4668 181 4659 4653 4662 4671 166 4665 4662 4671 4674 86 4668 4662 4671 4674 86 4662 4671 4674 4677 87 4662 4671 4674 4680 87 4662 4671 4674 4683 87 4647 4686 4692 4695 58 - 4689 4686 4692 4695 160 4686 4692 4698 4701 90 + 4689 4686 4692 4695 161 4686 4692 4698 4701 90 4695 4692 4698 4701 91 4695 4692 4698 4704 63 - 4695 4692 4698 4728 60 4692 4698 4704 4707 174 - 4692 4698 4704 4710 174 4701 4698 4704 4707 174 - 4701 4698 4704 4710 174 4701 4698 4704 4713 174 - 4728 4698 4704 4707 174 4728 4698 4704 4710 174 - 4701 4698 4728 4731 149 4701 4698 4728 4734 120 - 4707 4704 4713 4716 161 4707 4704 4713 4719 125 - 4710 4704 4713 4716 161 4710 4704 4713 4719 125 + 4695 4692 4698 4728 60 4692 4698 4704 4707 175 + 4692 4698 4704 4710 175 4701 4698 4704 4707 175 + 4701 4698 4704 4710 175 4701 4698 4704 4713 175 + 4728 4698 4704 4707 175 4728 4698 4704 4710 175 + 4701 4698 4728 4731 150 4701 4698 4728 4734 121 + 4707 4704 4713 4716 162 4707 4704 4713 4719 126 + 4710 4704 4713 4716 162 4710 4704 4713 4719 126 4704 4713 4719 4722 66 4704 4713 4719 4725 66 - 4716 4713 4719 4722 162 4716 4713 4719 4725 162 - 4698 4728 4734 4737 58 4731 4728 4734 4737 160 + 4716 4713 4719 4722 163 4716 4713 4719 4725 163 + 4698 4728 4734 4737 58 4731 4728 4734 4737 161 4728 4734 4740 4743 90 4737 4734 4740 4743 91 4737 4734 4740 4746 64 4737 4734 4740 4758 60 - 4734 4740 4746 4749 175 4734 4740 4746 4752 175 - 4734 4740 4746 4755 175 4743 4740 4746 4749 175 - 4743 4740 4746 4752 175 4743 4740 4746 4755 175 - 4758 4740 4746 4749 175 4758 4740 4746 4752 175 - 4758 4740 4746 4755 175 4743 4740 4758 4761 149 - 4743 4740 4758 4764 120 4740 4758 4764 4767 58 - 4761 4758 4764 4767 160 4758 4764 4770 4773 90 + 4734 4740 4746 4749 176 4734 4740 4746 4752 176 + 4734 4740 4746 4755 176 4743 4740 4746 4749 176 + 4743 4740 4746 4752 176 4743 4740 4746 4755 176 + 4758 4740 4746 4749 176 4758 4740 4746 4752 176 + 4758 4740 4746 4755 176 4743 4740 4758 4761 150 + 4743 4740 4758 4764 121 4740 4758 4764 4767 58 + 4761 4758 4764 4767 161 4758 4764 4770 4773 90 4767 4764 4770 4773 91 4767 4764 4770 4776 63 - 4767 4764 4770 4830 60 4764 4770 4776 4779 174 - 4764 4770 4776 4782 174 4773 4770 4776 4779 174 - 4773 4770 4776 4782 174 4773 4770 4776 4785 174 - 4830 4770 4776 4779 174 4830 4770 4776 4782 174 - 4773 4770 4830 4833 149 4773 4770 4830 4836 120 + 4767 4764 4770 4830 60 4764 4770 4776 4779 175 + 4764 4770 4776 4782 175 4773 4770 4776 4779 175 + 4773 4770 4776 4782 175 4773 4770 4776 4785 175 + 4830 4770 4776 4779 175 4830 4770 4776 4782 175 + 4773 4770 4830 4833 150 4773 4770 4830 4836 121 4779 4776 4785 4788 84 4779 4776 4785 4803 85 4782 4776 4785 4788 84 4782 4776 4785 4803 85 4776 4785 4788 4791 101 4803 4785 4788 4791 100 4785 4788 4794 4797 68 4791 4788 4794 4797 103 4791 4788 4794 4800 102 4797 4794 4800 4803 70 - 4797 4794 4800 4818 69 4794 4800 4818 4821 138 + 4797 4794 4800 4818 69 4794 4800 4818 4821 139 4803 4800 4818 4821 98 4785 4803 4806 4809 99 4800 4803 4806 4809 98 4803 4806 4812 4815 95 4809 4806 4812 4815 97 4809 4806 4812 4824 94 4806 4812 4824 4827 94 4815 4812 4824 4818 94 4815 4812 4824 4827 97 4800 4818 4824 4827 95 4821 4818 4824 4812 94 4821 4818 4824 4827 97 - 4770 4830 4836 4839 58 4833 4830 4836 4839 160 + 4770 4830 4836 4839 58 4833 4830 4836 4839 161 4830 4836 4842 4845 90 4839 4836 4842 4845 91 4839 4836 4842 4848 62 4839 4836 4842 4878 60 - 4836 4842 4848 4851 173 4845 4842 4848 4851 173 - 4845 4842 4848 4854 173 4845 4842 4848 4866 173 - 4878 4842 4848 4851 173 4845 4842 4878 4881 149 - 4845 4842 4878 4884 120 4842 4848 4854 4857 175 - 4842 4848 4854 4860 175 4842 4848 4854 4863 175 - 4851 4848 4854 4857 175 4851 4848 4854 4860 175 - 4851 4848 4854 4863 175 4866 4848 4854 4857 175 - 4866 4848 4854 4860 175 4866 4848 4854 4863 175 - 4842 4848 4866 4869 175 4842 4848 4866 4872 175 - 4842 4848 4866 4875 175 4851 4848 4866 4869 175 - 4851 4848 4866 4872 175 4851 4848 4866 4875 175 - 4854 4848 4866 4869 175 4854 4848 4866 4872 175 - 4854 4848 4866 4875 175 4842 4878 4884 4887 58 - 4881 4878 4884 4887 160 4878 4884 4890 4893 90 + 4836 4842 4848 4851 174 4845 4842 4848 4851 174 + 4845 4842 4848 4854 174 4845 4842 4848 4866 174 + 4878 4842 4848 4851 174 4845 4842 4878 4881 150 + 4845 4842 4878 4884 121 4842 4848 4854 4857 176 + 4842 4848 4854 4860 176 4842 4848 4854 4863 176 + 4851 4848 4854 4857 176 4851 4848 4854 4860 176 + 4851 4848 4854 4863 176 4866 4848 4854 4857 176 + 4866 4848 4854 4860 176 4866 4848 4854 4863 176 + 4842 4848 4866 4869 176 4842 4848 4866 4872 176 + 4842 4848 4866 4875 176 4851 4848 4866 4869 176 + 4851 4848 4866 4872 176 4851 4848 4866 4875 176 + 4854 4848 4866 4869 176 4854 4848 4866 4872 176 + 4854 4848 4866 4875 176 4842 4878 4884 4887 58 + 4881 4878 4884 4887 161 4878 4884 4890 4893 90 4887 4884 4890 4893 91 4887 4884 4890 4896 64 - 4887 4884 4890 4908 60 4884 4890 4896 4899 175 - 4884 4890 4896 4902 175 4884 4890 4896 4905 175 - 4893 4890 4896 4899 175 4893 4890 4896 4902 175 - 4893 4890 4896 4905 175 4908 4890 4896 4899 175 - 4908 4890 4896 4902 175 4908 4890 4896 4905 175 - 4893 4890 4908 4911 149 4893 4890 4908 4914 120 - 4890 4908 4914 4917 58 4911 4908 4914 4917 160 + 4887 4884 4890 4908 60 4884 4890 4896 4899 176 + 4884 4890 4896 4902 176 4884 4890 4896 4905 176 + 4893 4890 4896 4899 176 4893 4890 4896 4902 176 + 4893 4890 4896 4905 176 4908 4890 4896 4899 176 + 4908 4890 4896 4902 176 4908 4890 4896 4905 176 + 4893 4890 4908 4911 150 4893 4890 4908 4914 121 + 4890 4908 4914 4917 58 4911 4908 4914 4917 161 4908 4914 4920 4923 90 4917 4914 4920 4923 91 4917 4914 4920 4926 63 4917 4914 4920 4980 60 - 4914 4920 4926 4929 174 4914 4920 4926 4932 174 - 4923 4920 4926 4929 174 4923 4920 4926 4932 174 - 4923 4920 4926 4935 174 4980 4920 4926 4929 174 - 4980 4920 4926 4932 174 4923 4920 4980 4983 149 - 4923 4920 4980 4986 120 4929 4926 4935 4938 84 + 4914 4920 4926 4929 175 4914 4920 4926 4932 175 + 4923 4920 4926 4929 175 4923 4920 4926 4932 175 + 4923 4920 4926 4935 175 4980 4920 4926 4929 175 + 4980 4920 4926 4932 175 4923 4920 4980 4983 150 + 4923 4920 4980 4986 121 4929 4926 4935 4938 84 4929 4926 4935 4953 85 4932 4926 4935 4938 84 4932 4926 4935 4953 85 4926 4935 4938 4941 101 4953 4935 4938 4941 100 4935 4938 4944 4947 68 4941 4938 4944 4947 103 4941 4938 4944 4950 102 4947 4944 4950 4953 70 4947 4944 4950 4968 69 - 4944 4950 4968 4971 138 4953 4950 4968 4971 98 + 4944 4950 4968 4971 139 4953 4950 4968 4971 98 4935 4953 4956 4959 99 4950 4953 4956 4959 98 4953 4956 4962 4965 95 4959 4956 4962 4965 97 4959 4956 4962 4974 94 4956 4962 4974 4977 94 4965 4962 4974 4968 94 4965 4962 4974 4977 97 4950 4968 4974 4977 95 4971 4968 4974 4962 94 4971 4968 4974 4977 97 4920 4980 4986 4989 58 - 4983 4980 4986 4989 160 4980 4986 4992 4995 90 + 4983 4980 4986 4989 161 4980 4986 4992 4995 90 4989 4986 4992 4995 91 4989 4986 4992 4998 63 - 4989 4986 4992 5052 60 4986 4992 4998 5001 174 - 4986 4992 4998 5004 174 4995 4992 4998 5001 174 - 4995 4992 4998 5004 174 4995 4992 4998 5007 174 - 5052 4992 4998 5001 174 5052 4992 4998 5004 174 - 4995 4992 5052 5055 149 4995 4992 5052 5058 120 - 4992 4998 5007 5010 180 4992 4998 5007 5013 180 - 5001 4998 5007 5010 180 5001 4998 5007 5013 180 - 5001 4998 5007 5016 180 5004 4998 5007 5010 180 - 5004 4998 5007 5013 180 5004 4998 5007 5016 180 - 4998 5007 5016 5019 180 4998 5007 5016 5022 180 - 5010 5007 5016 5019 180 5010 5007 5016 5022 180 - 5010 5007 5016 5025 180 5013 5007 5016 5019 180 - 5013 5007 5016 5022 180 5013 5007 5016 5025 180 - 5007 5016 5025 5028 182 5019 5016 5025 5028 182 - 5019 5016 5025 5031 182 5022 5016 5025 5028 182 - 5022 5016 5025 5031 182 5028 5025 5031 5034 168 - 5028 5025 5031 5043 168 5025 5031 5034 5037 168 - 5025 5031 5034 5040 168 5043 5031 5034 5037 168 - 5043 5031 5034 5040 168 5025 5031 5043 5046 168 - 5025 5031 5043 5049 168 5034 5031 5043 5046 168 - 5034 5031 5043 5049 168 4992 5052 5058 5061 58 - 5055 5052 5058 5061 160 5052 5058 5064 5067 90 + 4989 4986 4992 5052 60 4986 4992 4998 5001 175 + 4986 4992 4998 5004 175 4995 4992 4998 5001 175 + 4995 4992 4998 5004 175 4995 4992 4998 5007 175 + 5052 4992 4998 5001 175 5052 4992 4998 5004 175 + 4995 4992 5052 5055 150 4995 4992 5052 5058 121 + 4992 4998 5007 5010 181 4992 4998 5007 5013 181 + 5001 4998 5007 5010 181 5001 4998 5007 5013 181 + 5001 4998 5007 5016 181 5004 4998 5007 5010 181 + 5004 4998 5007 5013 181 5004 4998 5007 5016 181 + 4998 5007 5016 5019 181 4998 5007 5016 5022 181 + 5010 5007 5016 5019 181 5010 5007 5016 5022 181 + 5010 5007 5016 5025 181 5013 5007 5016 5019 181 + 5013 5007 5016 5022 181 5013 5007 5016 5025 181 + 5007 5016 5025 5028 183 5019 5016 5025 5028 183 + 5019 5016 5025 5031 183 5022 5016 5025 5028 183 + 5022 5016 5025 5031 183 5028 5025 5031 5034 169 + 5028 5025 5031 5043 169 5025 5031 5034 5037 169 + 5025 5031 5034 5040 169 5043 5031 5034 5037 169 + 5043 5031 5034 5040 169 5025 5031 5043 5046 169 + 5025 5031 5043 5049 169 5034 5031 5043 5046 169 + 5034 5031 5043 5049 169 4992 5052 5058 5061 58 + 5055 5052 5058 5061 161 5052 5058 5064 5067 90 5061 5058 5064 5067 91 5061 5058 5064 5070 63 - 5061 5058 5064 5094 60 5058 5064 5070 5073 174 - 5058 5064 5070 5076 174 5067 5064 5070 5073 174 - 5067 5064 5070 5076 174 5067 5064 5070 5079 174 - 5094 5064 5070 5073 174 5094 5064 5070 5076 174 - 5067 5064 5094 5097 149 5067 5064 5094 5100 120 - 5073 5070 5079 5082 161 5073 5070 5079 5085 125 - 5076 5070 5079 5082 161 5076 5070 5079 5085 125 + 5061 5058 5064 5094 60 5058 5064 5070 5073 175 + 5058 5064 5070 5076 175 5067 5064 5070 5073 175 + 5067 5064 5070 5076 175 5067 5064 5070 5079 175 + 5094 5064 5070 5073 175 5094 5064 5070 5076 175 + 5067 5064 5094 5097 150 5067 5064 5094 5100 121 + 5073 5070 5079 5082 162 5073 5070 5079 5085 126 + 5076 5070 5079 5082 162 5076 5070 5079 5085 126 5070 5079 5085 5088 66 5070 5079 5085 5091 66 - 5082 5079 5085 5088 162 5082 5079 5085 5091 162 - 5064 5094 5100 5103 58 5097 5094 5100 5103 160 + 5082 5079 5085 5088 163 5082 5079 5085 5091 163 + 5064 5094 5100 5103 58 5097 5094 5100 5103 161 5094 5100 5106 5109 90 5103 5100 5106 5109 91 5103 5100 5106 5112 63 5103 5100 5106 5166 60 - 5100 5106 5112 5115 174 5100 5106 5112 5118 174 - 5109 5106 5112 5115 174 5109 5106 5112 5118 174 - 5109 5106 5112 5121 174 5166 5106 5112 5115 174 - 5166 5106 5112 5118 174 5109 5106 5166 5169 149 - 5109 5106 5166 5172 120 5106 5112 5121 5124 180 - 5106 5112 5121 5127 180 5115 5112 5121 5124 180 - 5115 5112 5121 5127 180 5115 5112 5121 5130 180 - 5118 5112 5121 5124 180 5118 5112 5121 5127 180 - 5118 5112 5121 5130 180 5112 5121 5130 5133 180 - 5112 5121 5130 5136 180 5124 5121 5130 5133 180 - 5124 5121 5130 5136 180 5124 5121 5130 5139 180 - 5127 5121 5130 5133 180 5127 5121 5130 5136 180 - 5127 5121 5130 5139 180 5121 5130 5139 5142 182 - 5133 5130 5139 5142 182 5133 5130 5139 5145 182 - 5136 5130 5139 5142 182 5136 5130 5139 5145 182 - 5142 5139 5145 5148 168 5142 5139 5145 5157 168 - 5139 5145 5148 5151 168 5139 5145 5148 5154 168 - 5157 5145 5148 5151 168 5157 5145 5148 5154 168 - 5139 5145 5157 5160 168 5139 5145 5157 5163 168 - 5148 5145 5157 5160 168 5148 5145 5157 5163 168 - 5106 5166 5172 5175 58 5169 5166 5172 5175 160 + 5100 5106 5112 5115 175 5100 5106 5112 5118 175 + 5109 5106 5112 5115 175 5109 5106 5112 5118 175 + 5109 5106 5112 5121 175 5166 5106 5112 5115 175 + 5166 5106 5112 5118 175 5109 5106 5166 5169 150 + 5109 5106 5166 5172 121 5106 5112 5121 5124 181 + 5106 5112 5121 5127 181 5115 5112 5121 5124 181 + 5115 5112 5121 5127 181 5115 5112 5121 5130 181 + 5118 5112 5121 5124 181 5118 5112 5121 5127 181 + 5118 5112 5121 5130 181 5112 5121 5130 5133 181 + 5112 5121 5130 5136 181 5124 5121 5130 5133 181 + 5124 5121 5130 5136 181 5124 5121 5130 5139 181 + 5127 5121 5130 5133 181 5127 5121 5130 5136 181 + 5127 5121 5130 5139 181 5121 5130 5139 5142 183 + 5133 5130 5139 5142 183 5133 5130 5139 5145 183 + 5136 5130 5139 5142 183 5136 5130 5139 5145 183 + 5142 5139 5145 5148 169 5142 5139 5145 5157 169 + 5139 5145 5148 5151 169 5139 5145 5148 5154 169 + 5157 5145 5148 5151 169 5157 5145 5148 5154 169 + 5139 5145 5157 5160 169 5139 5145 5157 5163 169 + 5148 5145 5157 5160 169 5148 5145 5157 5163 169 + 5106 5166 5172 5175 58 5169 5166 5172 5175 161 5166 5172 5178 5181 90 5175 5172 5178 5181 91 5175 5172 5178 5184 63 5175 5172 5178 5196 60 - 5172 5178 5184 5187 174 5172 5178 5184 5190 174 - 5181 5178 5184 5187 174 5181 5178 5184 5190 174 - 5181 5178 5184 5193 174 5196 5178 5184 5187 174 - 5196 5178 5184 5190 174 5181 5178 5196 5199 149 - 5181 5178 5196 5202 120 5187 5184 5193 1404 167 - 5190 5184 5193 1404 167 5178 5196 5202 5205 58 - 5199 5196 5202 5205 160 5196 5202 5208 5211 90 + 5172 5178 5184 5187 175 5172 5178 5184 5190 175 + 5181 5178 5184 5187 175 5181 5178 5184 5190 175 + 5181 5178 5184 5193 175 5196 5178 5184 5187 175 + 5196 5178 5184 5190 175 5181 5178 5196 5199 150 + 5181 5178 5196 5202 121 5187 5184 5193 1404 168 + 5190 5184 5193 1404 168 5178 5196 5202 5205 58 + 5199 5196 5202 5205 161 5196 5202 5208 5211 90 5205 5202 5208 5211 91 5205 5202 5208 5214 63 - 5205 5202 5208 5262 60 5202 5208 5214 5217 174 - 5202 5208 5214 5220 174 5211 5208 5214 5217 174 - 5211 5208 5214 5220 174 5211 5208 5214 5223 174 - 5262 5208 5214 5217 174 5262 5208 5214 5220 174 - 5211 5208 5262 5265 149 5211 5208 5262 5268 120 - 5208 5214 5223 5226 180 5208 5214 5223 5229 180 - 5217 5214 5223 5226 180 5217 5214 5223 5229 180 - 5217 5214 5223 5232 180 5220 5214 5223 5226 180 - 5220 5214 5223 5229 180 5220 5214 5223 5232 180 - 5214 5223 5232 5235 180 5214 5223 5232 5238 180 - 5226 5223 5232 5235 180 5226 5223 5232 5238 180 - 5226 5223 5232 5241 180 5229 5223 5232 5235 180 - 5229 5223 5232 5238 180 5229 5223 5232 5241 180 - 5223 5232 5241 5244 180 5223 5232 5241 5247 180 - 5235 5232 5241 5244 180 5235 5232 5241 5247 180 - 5235 5232 5241 5250 180 5238 5232 5241 5244 180 - 5238 5232 5241 5247 180 5238 5232 5241 5250 180 - 5232 5241 5250 5253 183 5232 5241 5250 5256 183 - 5232 5241 5250 5259 183 5244 5241 5250 5253 183 - 5244 5241 5250 5256 183 5244 5241 5250 5259 183 - 5247 5241 5250 5253 183 5247 5241 5250 5256 183 - 5247 5241 5250 5259 183 5208 5262 5268 5271 58 - 5265 5262 5268 5271 160 5262 5268 5274 5277 92 + 5205 5202 5208 5262 60 5202 5208 5214 5217 175 + 5202 5208 5214 5220 175 5211 5208 5214 5217 175 + 5211 5208 5214 5220 175 5211 5208 5214 5223 175 + 5262 5208 5214 5217 175 5262 5208 5214 5220 175 + 5211 5208 5262 5265 150 5211 5208 5262 5268 121 + 5208 5214 5223 5226 181 5208 5214 5223 5229 181 + 5217 5214 5223 5226 181 5217 5214 5223 5229 181 + 5217 5214 5223 5232 181 5220 5214 5223 5226 181 + 5220 5214 5223 5229 181 5220 5214 5223 5232 181 + 5214 5223 5232 5235 181 5214 5223 5232 5238 181 + 5226 5223 5232 5235 181 5226 5223 5232 5238 181 + 5226 5223 5232 5241 181 5229 5223 5232 5235 181 + 5229 5223 5232 5238 181 5229 5223 5232 5241 181 + 5223 5232 5241 5244 181 5223 5232 5241 5247 181 + 5235 5232 5241 5244 181 5235 5232 5241 5247 181 + 5235 5232 5241 5250 181 5238 5232 5241 5244 181 + 5238 5232 5241 5247 181 5238 5232 5241 5250 181 + 5232 5241 5250 5253 184 5232 5241 5250 5256 184 + 5232 5241 5250 5259 184 5244 5241 5250 5253 184 + 5244 5241 5250 5256 184 5244 5241 5250 5259 184 + 5247 5241 5250 5253 184 5247 5241 5250 5256 184 + 5247 5241 5250 5259 184 5208 5262 5268 5271 58 + 5265 5262 5268 5271 161 5262 5268 5274 5277 92 5262 5268 5274 5280 92 5271 5268 5274 5277 93 5271 5268 5274 5280 93 5271 5268 5274 5283 65 - 5277 5274 5283 5286 152 5277 5274 5283 5289 122 - 5280 5274 5283 5286 152 5280 5274 5283 5289 122 - 5274 5283 5289 5292 59 5286 5283 5289 5292 160 + 5277 5274 5283 5286 153 5277 5274 5283 5289 123 + 5280 5274 5283 5286 153 5280 5274 5283 5289 123 + 5274 5283 5289 5292 59 5286 5283 5289 5292 161 5283 5289 5295 5298 90 5292 5289 5295 5298 91 5292 5289 5295 5301 62 5292 5289 5295 5325 60 - 5289 5295 5301 5304 173 5298 5295 5301 5304 173 - 5298 5295 5301 5307 173 5298 5295 5301 5313 173 - 5325 5295 5301 5304 173 5298 5295 5325 5328 149 - 5298 5295 5325 5331 120 5295 5301 -5307 5310 72 + 5289 5295 5301 5304 174 5298 5295 5301 5304 174 + 5298 5295 5301 5307 174 5298 5295 5301 5313 174 + 5325 5295 5301 5304 174 5298 5295 5325 5328 150 + 5298 5295 5325 5331 121 5295 5301 -5307 5310 72 5295 5301 -5307 5310 73 5295 5301 5307 5310 74 - 5304 5301 5307 5310 177 5313 5301 -5307 5310 75 + 5304 5301 5307 5310 178 5313 5301 -5307 5310 75 5313 5301 -5307 5310 76 5313 5301 5307 5310 77 - 5295 5301 5313 5316 175 5295 5301 5313 5319 175 - 5295 5301 5313 5322 175 5304 5301 5313 5316 175 - 5304 5301 5313 5319 175 5304 5301 5313 5322 175 - 5307 5301 5313 5316 175 5307 5301 5313 5319 175 - 5307 5301 5313 5322 175 5295 5325 5331 5334 58 - 5328 5325 5331 5334 160 5325 5331 5337 5340 90 + 5295 5301 5313 5316 176 5295 5301 5313 5319 176 + 5295 5301 5313 5322 176 5304 5301 5313 5316 176 + 5304 5301 5313 5319 176 5304 5301 5313 5322 176 + 5307 5301 5313 5316 176 5307 5301 5313 5319 176 + 5307 5301 5313 5322 176 5295 5325 5331 5334 58 + 5328 5325 5331 5334 161 5325 5331 5337 5340 90 5334 5331 5337 5340 91 5334 5331 5337 5343 63 - 5334 5331 5337 5361 60 5331 5337 5343 5346 174 - 5331 5337 5343 5349 174 5340 5337 5343 5346 174 - 5340 5337 5343 5349 174 5340 5337 5343 5352 174 - 5361 5337 5343 5346 174 5361 5337 5343 5349 174 - 5340 5337 5361 5364 149 5340 5337 5361 5367 120 - 5346 5343 5352 5355 179 5346 5343 5352 5358 179 - 5349 5343 5352 5355 179 5349 5343 5352 5358 179 - 5337 5361 5367 5370 58 5364 5361 5367 5370 160 + 5334 5331 5337 5361 60 5331 5337 5343 5346 175 + 5331 5337 5343 5349 175 5340 5337 5343 5346 175 + 5340 5337 5343 5349 175 5340 5337 5343 5352 175 + 5361 5337 5343 5346 175 5361 5337 5343 5349 175 + 5340 5337 5361 5364 150 5340 5337 5361 5367 121 + 5346 5343 5352 5355 180 5346 5343 5352 5358 180 + 5349 5343 5352 5355 180 5349 5343 5352 5358 180 + 5337 5361 5367 5370 58 5364 5361 5367 5370 161 5361 5367 5373 5376 90 5370 5367 5373 5376 91 5370 5367 5373 5379 62 5370 5367 5373 5409 60 - 5367 5373 5379 5382 173 5376 5373 5379 5382 173 - 5376 5373 5379 5385 173 5376 5373 5379 5397 173 - 5409 5373 5379 5382 173 5376 5373 5409 5412 149 - 5376 5373 5409 5415 120 5373 5379 5385 5388 175 - 5373 5379 5385 5391 175 5373 5379 5385 5394 175 - 5382 5379 5385 5388 175 5382 5379 5385 5391 175 - 5382 5379 5385 5394 175 5397 5379 5385 5388 175 - 5397 5379 5385 5391 175 5397 5379 5385 5394 175 - 5373 5379 5397 5400 175 5373 5379 5397 5403 175 - 5373 5379 5397 5406 175 5382 5379 5397 5400 175 - 5382 5379 5397 5403 175 5382 5379 5397 5406 175 - 5385 5379 5397 5400 175 5385 5379 5397 5403 175 - 5385 5379 5397 5406 175 5373 5409 5415 5418 58 - 5412 5409 5415 5418 160 5409 5415 5421 5424 90 + 5367 5373 5379 5382 174 5376 5373 5379 5382 174 + 5376 5373 5379 5385 174 5376 5373 5379 5397 174 + 5409 5373 5379 5382 174 5376 5373 5409 5412 150 + 5376 5373 5409 5415 121 5373 5379 5385 5388 176 + 5373 5379 5385 5391 176 5373 5379 5385 5394 176 + 5382 5379 5385 5388 176 5382 5379 5385 5391 176 + 5382 5379 5385 5394 176 5397 5379 5385 5388 176 + 5397 5379 5385 5391 176 5397 5379 5385 5394 176 + 5373 5379 5397 5400 176 5373 5379 5397 5403 176 + 5373 5379 5397 5406 176 5382 5379 5397 5400 176 + 5382 5379 5397 5403 176 5382 5379 5397 5406 176 + 5385 5379 5397 5400 176 5385 5379 5397 5403 176 + 5385 5379 5397 5406 176 5373 5409 5415 5418 58 + 5412 5409 5415 5418 161 5409 5415 5421 5424 90 5418 5415 5421 5424 91 5418 5415 5421 5427 63 - 5418 5415 5421 5460 60 5415 5421 5427 5430 174 - 5415 5421 5427 5433 174 5424 5421 5427 5430 174 - 5424 5421 5427 5433 174 5424 5421 5427 5436 174 - 5460 5421 5427 5430 174 5460 5421 5427 5433 174 - 5424 5421 5460 5463 149 5424 5421 5460 5466 120 - 5421 5427 5436 5439 180 5421 5427 5436 5442 180 - 5430 5427 5436 5439 180 5430 5427 5436 5442 180 - 5430 5427 5436 5445 180 5433 5427 5436 5439 180 - 5433 5427 5436 5442 180 5433 5427 5436 5445 180 - 5439 5436 5445 5448 161 5439 5436 5445 5451 125 - 5442 5436 5445 5448 161 5442 5436 5445 5451 125 + 5418 5415 5421 5460 60 5415 5421 5427 5430 175 + 5415 5421 5427 5433 175 5424 5421 5427 5430 175 + 5424 5421 5427 5433 175 5424 5421 5427 5436 175 + 5460 5421 5427 5430 175 5460 5421 5427 5433 175 + 5424 5421 5460 5463 150 5424 5421 5460 5466 121 + 5421 5427 5436 5439 181 5421 5427 5436 5442 181 + 5430 5427 5436 5439 181 5430 5427 5436 5442 181 + 5430 5427 5436 5445 181 5433 5427 5436 5439 181 + 5433 5427 5436 5442 181 5433 5427 5436 5445 181 + 5439 5436 5445 5448 162 5439 5436 5445 5451 126 + 5442 5436 5445 5448 162 5442 5436 5445 5451 126 5436 5445 5451 5454 66 5436 5445 5451 5457 66 - 5448 5445 5451 5454 162 5448 5445 5451 5457 162 - 5421 5460 5466 5469 58 5463 5460 5466 5469 160 + 5448 5445 5451 5454 163 5448 5445 5451 5457 163 + 5421 5460 5466 5469 58 5463 5460 5466 5469 161 5460 5466 5472 5475 90 5469 5466 5472 5475 91 5469 5466 5472 5478 64 5469 5466 5472 5490 60 - 5466 5472 5478 5481 175 5466 5472 5478 5484 175 - 5466 5472 5478 5487 175 5475 5472 5478 5481 175 - 5475 5472 5478 5484 175 5475 5472 5478 5487 175 - 5490 5472 5478 5481 175 5490 5472 5478 5484 175 - 5490 5472 5478 5487 175 5475 5472 5490 5493 149 - 5475 5472 5490 5496 120 5472 5490 5496 5499 58 - 5493 5490 5496 5499 160 5490 5496 5502 5505 90 + 5466 5472 5478 5481 176 5466 5472 5478 5484 176 + 5466 5472 5478 5487 176 5475 5472 5478 5481 176 + 5475 5472 5478 5484 176 5475 5472 5478 5487 176 + 5490 5472 5478 5481 176 5490 5472 5478 5484 176 + 5490 5472 5478 5487 176 5475 5472 5490 5493 150 + 5475 5472 5490 5496 121 5472 5490 5496 5499 58 + 5493 5490 5496 5499 161 5490 5496 5502 5505 90 5499 5496 5502 5505 91 5499 5496 5502 5508 63 - 5499 5496 5502 5562 60 5496 5502 5508 5511 174 - 5496 5502 5508 5514 174 5505 5502 5508 5511 174 - 5505 5502 5508 5514 174 5505 5502 5508 5517 174 - 5562 5502 5508 5511 174 5562 5502 5508 5514 174 - 5505 5502 5562 5565 149 5505 5502 5562 5568 120 + 5499 5496 5502 5562 60 5496 5502 5508 5511 175 + 5496 5502 5508 5514 175 5505 5502 5508 5511 175 + 5505 5502 5508 5514 175 5505 5502 5508 5517 175 + 5562 5502 5508 5511 175 5562 5502 5508 5514 175 + 5505 5502 5562 5565 150 5505 5502 5562 5568 121 5511 5508 5517 5520 84 5511 5508 5517 5535 85 5514 5508 5517 5520 84 5514 5508 5517 5535 85 5508 5517 5520 5523 101 5535 5517 5520 5523 100 5517 5520 5526 5529 68 5523 5520 5526 5529 103 5523 5520 5526 5532 102 5529 5526 5532 5535 70 - 5529 5526 5532 5550 69 5526 5532 5550 5553 138 + 5529 5526 5532 5550 69 5526 5532 5550 5553 139 5535 5532 5550 5553 98 5517 5535 5538 5541 99 5532 5535 5538 5541 98 5535 5538 5544 5547 95 5541 5538 5544 5547 97 5541 5538 5544 5556 94 5538 5544 5556 5559 94 5547 5544 5556 5550 94 5547 5544 5556 5559 97 5532 5550 5556 5559 95 5553 5550 5556 5544 94 5553 5550 5556 5559 97 - 5502 5562 5568 5571 58 5565 5562 5568 5571 160 + 5502 5562 5568 5571 58 5565 5562 5568 5571 161 5562 5568 5574 5577 90 5571 5568 5574 5577 91 5571 5568 5574 5580 62 5571 5568 5574 5619 60 - 5568 5574 5580 5583 173 5577 5574 5580 5583 173 - 5577 5574 5580 5586 173 5577 5574 5580 5598 173 - 5619 5574 5580 5583 173 5577 5574 5619 5622 149 - 5577 5574 5619 5625 120 5574 5580 5586 5589 175 - 5574 5580 5586 5592 175 5574 5580 5586 5595 175 - 5583 5580 5586 5589 175 5583 5580 5586 5592 175 - 5583 5580 5586 5595 175 5598 5580 5586 5589 175 - 5598 5580 5586 5592 175 5598 5580 5586 5595 175 - 5574 5580 5598 5601 174 5574 5580 5598 5604 174 - 5583 5580 5598 5601 174 5583 5580 5598 5604 174 - 5583 5580 5598 5607 174 5586 5580 5598 5601 174 - 5586 5580 5598 5604 174 5580 5598 5607 5610 181 - 5580 5598 5607 5613 181 5580 5598 5607 5616 181 - 5601 5598 5607 5610 181 5601 5598 5607 5613 181 - 5601 5598 5607 5616 181 5604 5598 5607 5610 181 - 5604 5598 5607 5613 181 5604 5598 5607 5616 181 - 5574 5619 5625 5628 58 5622 5619 5625 5628 160 + 5568 5574 5580 5583 174 5577 5574 5580 5583 174 + 5577 5574 5580 5586 174 5577 5574 5580 5598 174 + 5619 5574 5580 5583 174 5577 5574 5619 5622 150 + 5577 5574 5619 5625 121 5574 5580 5586 5589 176 + 5574 5580 5586 5592 176 5574 5580 5586 5595 176 + 5583 5580 5586 5589 176 5583 5580 5586 5592 176 + 5583 5580 5586 5595 176 5598 5580 5586 5589 176 + 5598 5580 5586 5592 176 5598 5580 5586 5595 176 + 5574 5580 5598 5601 175 5574 5580 5598 5604 175 + 5583 5580 5598 5601 175 5583 5580 5598 5604 175 + 5583 5580 5598 5607 175 5586 5580 5598 5601 175 + 5586 5580 5598 5604 175 5580 5598 5607 5610 182 + 5580 5598 5607 5613 182 5580 5598 5607 5616 182 + 5601 5598 5607 5610 182 5601 5598 5607 5613 182 + 5601 5598 5607 5616 182 5604 5598 5607 5610 182 + 5604 5598 5607 5613 182 5604 5598 5607 5616 182 + 5574 5619 5625 5628 58 5622 5619 5625 5628 161 5619 5625 5631 5634 90 5628 5625 5631 5634 91 5628 5625 5631 5637 63 5628 5625 5631 5691 60 - 5625 5631 5637 5640 174 5625 5631 5637 5643 174 - 5634 5631 5637 5640 174 5634 5631 5637 5643 174 - 5634 5631 5637 5646 174 5691 5631 5637 5640 174 - 5691 5631 5637 5643 174 5634 5631 5691 5694 149 - 5634 5631 5691 5697 120 5631 5637 5646 5649 180 - 5631 5637 5646 5652 180 5640 5637 5646 5649 180 - 5640 5637 5646 5652 180 5640 5637 5646 5655 180 - 5643 5637 5646 5649 180 5643 5637 5646 5652 180 - 5643 5637 5646 5655 180 5637 5646 5655 5658 180 - 5637 5646 5655 5661 180 5649 5646 5655 5658 180 - 5649 5646 5655 5661 180 5649 5646 5655 5664 180 - 5652 5646 5655 5658 180 5652 5646 5655 5661 180 - 5652 5646 5655 5664 180 5646 5655 5664 5667 182 - 5658 5655 5664 5667 182 5658 5655 5664 5670 182 - 5661 5655 5664 5667 182 5661 5655 5664 5670 182 - 5667 5664 5670 5673 168 5667 5664 5670 5682 168 - 5664 5670 5673 5676 168 5664 5670 5673 5679 168 - 5682 5670 5673 5676 168 5682 5670 5673 5679 168 - 5664 5670 5682 5685 168 5664 5670 5682 5688 168 - 5673 5670 5682 5685 168 5673 5670 5682 5688 168 - 5631 5691 5697 5700 58 5694 5691 5697 5700 160 + 5625 5631 5637 5640 175 5625 5631 5637 5643 175 + 5634 5631 5637 5640 175 5634 5631 5637 5643 175 + 5634 5631 5637 5646 175 5691 5631 5637 5640 175 + 5691 5631 5637 5643 175 5634 5631 5691 5694 150 + 5634 5631 5691 5697 121 5631 5637 5646 5649 181 + 5631 5637 5646 5652 181 5640 5637 5646 5649 181 + 5640 5637 5646 5652 181 5640 5637 5646 5655 181 + 5643 5637 5646 5649 181 5643 5637 5646 5652 181 + 5643 5637 5646 5655 181 5637 5646 5655 5658 181 + 5637 5646 5655 5661 181 5649 5646 5655 5658 181 + 5649 5646 5655 5661 181 5649 5646 5655 5664 181 + 5652 5646 5655 5658 181 5652 5646 5655 5661 181 + 5652 5646 5655 5664 181 5646 5655 5664 5667 183 + 5658 5655 5664 5667 183 5658 5655 5664 5670 183 + 5661 5655 5664 5667 183 5661 5655 5664 5670 183 + 5667 5664 5670 5673 169 5667 5664 5670 5682 169 + 5664 5670 5673 5676 169 5664 5670 5673 5679 169 + 5682 5670 5673 5676 169 5682 5670 5673 5679 169 + 5664 5670 5682 5685 169 5664 5670 5682 5688 169 + 5673 5670 5682 5685 169 5673 5670 5682 5688 169 + 5631 5691 5697 5700 58 5694 5691 5697 5700 161 5691 5697 5703 5706 92 5691 5697 5703 5709 92 5700 5697 5703 5706 93 5700 5697 5703 5709 93 - 5700 5697 5703 5712 65 5706 5703 5712 5715 152 - 5706 5703 5712 5718 122 5709 5703 5712 5715 152 - 5709 5703 5712 5718 122 5703 5712 5718 5721 59 - 5715 5712 5718 5721 160 5712 5718 5724 5727 90 + 5700 5697 5703 5712 65 5706 5703 5712 5715 153 + 5706 5703 5712 5718 123 5709 5703 5712 5715 153 + 5709 5703 5712 5718 123 5703 5712 5718 5721 59 + 5715 5712 5718 5721 161 5712 5718 5724 5727 90 5721 5718 5724 5727 91 5721 5718 5724 5730 63 - 5721 5718 5724 5742 60 5718 5724 5730 5733 174 - 5718 5724 5730 5736 174 5727 5724 5730 5733 174 - 5727 5724 5730 5736 174 5727 5724 5730 5739 174 - 5742 5724 5730 5733 174 5742 5724 5730 5736 174 - 5727 5724 5742 5745 149 5727 5724 5742 5748 120 - 5733 5730 5739 294 167 5736 5730 5739 294 167 - 5724 5742 5748 5751 58 5745 5742 5748 5751 160 + 5721 5718 5724 5742 60 5718 5724 5730 5733 175 + 5718 5724 5730 5736 175 5727 5724 5730 5733 175 + 5727 5724 5730 5736 175 5727 5724 5730 5739 175 + 5742 5724 5730 5733 175 5742 5724 5730 5736 175 + 5727 5724 5742 5745 150 5727 5724 5742 5748 121 + 5733 5730 5739 294 168 5736 5730 5739 294 168 + 5724 5742 5748 5751 58 5745 5742 5748 5751 161 5742 5748 5754 5757 90 5751 5748 5754 5757 91 5751 5748 5754 5760 63 5751 5748 5754 5814 60 - 5748 5754 5760 5763 174 5748 5754 5760 5766 174 - 5757 5754 5760 5763 174 5757 5754 5760 5766 174 - 5757 5754 5760 5769 174 5814 5754 5760 5763 174 - 5814 5754 5760 5766 174 5757 5754 5814 5817 149 - 5757 5754 5814 5820 120 5754 5760 5769 5772 180 - 5754 5760 5769 5775 180 5763 5760 5769 5772 180 - 5763 5760 5769 5775 180 5763 5760 5769 5778 180 - 5766 5760 5769 5772 180 5766 5760 5769 5775 180 - 5766 5760 5769 5778 180 5760 5769 5778 5781 180 - 5760 5769 5778 5784 180 5772 5769 5778 5781 180 - 5772 5769 5778 5784 180 5772 5769 5778 5787 180 - 5775 5769 5778 5781 180 5775 5769 5778 5784 180 - 5775 5769 5778 5787 180 5769 5778 5787 5790 182 - 5781 5778 5787 5790 182 5781 5778 5787 5793 182 - 5784 5778 5787 5790 182 5784 5778 5787 5793 182 - 5790 5787 5793 5796 168 5790 5787 5793 5805 168 - 5787 5793 5796 5799 168 5787 5793 5796 5802 168 - 5805 5793 5796 5799 168 5805 5793 5796 5802 168 - 5787 5793 5805 5808 168 5787 5793 5805 5811 168 - 5796 5793 5805 5808 168 5796 5793 5805 5811 168 - 5754 5814 5820 5823 58 5817 5814 5820 5823 160 + 5748 5754 5760 5763 175 5748 5754 5760 5766 175 + 5757 5754 5760 5763 175 5757 5754 5760 5766 175 + 5757 5754 5760 5769 175 5814 5754 5760 5763 175 + 5814 5754 5760 5766 175 5757 5754 5814 5817 150 + 5757 5754 5814 5820 121 5754 5760 5769 5772 181 + 5754 5760 5769 5775 181 5763 5760 5769 5772 181 + 5763 5760 5769 5775 181 5763 5760 5769 5778 181 + 5766 5760 5769 5772 181 5766 5760 5769 5775 181 + 5766 5760 5769 5778 181 5760 5769 5778 5781 181 + 5760 5769 5778 5784 181 5772 5769 5778 5781 181 + 5772 5769 5778 5784 181 5772 5769 5778 5787 181 + 5775 5769 5778 5781 181 5775 5769 5778 5784 181 + 5775 5769 5778 5787 181 5769 5778 5787 5790 183 + 5781 5778 5787 5790 183 5781 5778 5787 5793 183 + 5784 5778 5787 5790 183 5784 5778 5787 5793 183 + 5790 5787 5793 5796 169 5790 5787 5793 5805 169 + 5787 5793 5796 5799 169 5787 5793 5796 5802 169 + 5805 5793 5796 5799 169 5805 5793 5796 5802 169 + 5787 5793 5805 5808 169 5787 5793 5805 5811 169 + 5796 5793 5805 5808 169 5796 5793 5805 5811 169 + 5754 5814 5820 5823 58 5817 5814 5820 5823 161 5814 5820 5826 5829 90 5823 5820 5826 5829 91 5823 5820 5826 5832 63 5823 5820 5826 5871 61 - 5820 5826 5832 5835 174 5820 5826 5832 5838 174 - 5829 5826 5832 5835 174 5829 5826 5832 5838 174 - 5829 5826 5832 5841 174 5871 5826 5832 5835 174 - 5871 5826 5832 5838 174 5829 5826 5871 5874 172 - 5829 5826 5871 5877 172 5826 5832 5841 5844 174 - 5835 5832 5841 5844 174 5835 5832 5841 5847 174 - 5835 5832 5841 5859 174 5838 5832 5841 5844 174 - 5838 5832 5841 5847 174 5838 5832 5841 5859 174 - 5832 5841 5847 5850 175 5832 5841 5847 5853 175 - 5832 5841 5847 5856 175 5844 5841 5847 5850 175 - 5844 5841 5847 5853 175 5844 5841 5847 5856 175 - 5859 5841 5847 5850 175 5859 5841 5847 5853 175 - 5859 5841 5847 5856 175 5832 5841 5859 5862 175 - 5832 5841 5859 5865 175 5832 5841 5859 5868 175 - 5844 5841 5859 5862 175 5844 5841 5859 5865 175 - 5844 5841 5859 5868 175 5847 5841 5859 5862 175 - 5847 5841 5859 5865 175 5847 5841 5859 5868 175 + 5820 5826 5832 5835 175 5820 5826 5832 5838 175 + 5829 5826 5832 5835 175 5829 5826 5832 5838 175 + 5829 5826 5832 5841 175 5871 5826 5832 5835 175 + 5871 5826 5832 5838 175 5829 5826 5871 5874 173 + 5829 5826 5871 5877 173 5826 5832 5841 5844 175 + 5835 5832 5841 5844 175 5835 5832 5841 5847 175 + 5835 5832 5841 5859 175 5838 5832 5841 5844 175 + 5838 5832 5841 5847 175 5838 5832 5841 5859 175 + 5832 5841 5847 5850 176 5832 5841 5847 5853 176 + 5832 5841 5847 5856 176 5844 5841 5847 5850 176 + 5844 5841 5847 5853 176 5844 5841 5847 5856 176 + 5859 5841 5847 5850 176 5859 5841 5847 5853 176 + 5859 5841 5847 5856 176 5832 5841 5859 5862 176 + 5832 5841 5859 5865 176 5832 5841 5859 5868 176 + 5844 5841 5859 5862 176 5844 5841 5859 5865 176 + 5844 5841 5859 5868 176 5847 5841 5859 5862 176 + 5847 5841 5859 5865 176 5847 5841 5859 5868 176 %FLAG DIHEDRALS_WITHOUT_HYDROGEN %FORMAT(10I8) - 0 12 18 27 174 66 12 18 27 174 - 0 12 66 69 151 0 12 66 72 126 - 18 12 66 69 147 18 12 66 72 118 - 12 18 27 36 180 18 27 36 45 41 - 27 36 45 54 180 12 66 -72 78 25 - 12 66 72 78 26 69 66 72 78 158 + 0 12 18 27 175 66 12 18 27 175 + 0 12 66 69 152 0 12 66 72 127 + 18 12 66 69 148 18 12 66 72 119 + 12 18 27 36 181 18 27 36 45 41 + 27 36 45 54 181 12 66 -72 78 25 + 12 66 72 78 26 69 66 72 78 159 66 72 78 84 27 66 72 78 114 1 - 72 78 84 90 173 72 78 84 102 173 - 114 78 84 90 173 114 78 84 102 173 - 72 78 114 117 150 72 78 114 120 121 - 84 78 114 117 146 84 78 114 120 117 + 72 78 84 90 174 72 78 84 102 174 + 114 78 84 90 174 114 78 84 102 174 + 72 78 114 117 151 72 78 114 120 122 + 84 78 114 117 147 84 78 114 120 118 78 114 -120 126 25 78 114 120 126 26 - 117 114 120 126 158 114 120 126 132 40 - 114 120 126 174 1 120 126 132 141 174 - 174 126 132 141 6 120 126 174 177 150 - 120 126 174 180 121 132 126 174 177 147 - 132 126 174 180 118 126 132 141 144 28 + 117 114 120 126 159 114 120 126 132 40 + 114 120 126 174 1 120 126 132 141 175 + 174 126 132 141 6 120 126 174 177 151 + 120 126 174 180 122 132 126 174 177 148 + 132 126 174 180 119 126 132 141 144 28 126 132 141 162 28 132 141 144 150 38 162 141 144 150 4 132 141 162 168 38 144 141 162 168 4 141 144 150 156 4 144 150 -156 168 4 150 156 -168 162 4 141 162 -168 156 4 126 174 -180 186 46 - 126 174 180 186 47 177 174 180 186 159 - 174 180 186 195 2 180 186 195 198 153 - 180 186 195 201 123 186 195 -201 207 36 - 186 195 201 207 37 198 195 201 207 158 + 126 174 180 186 47 177 174 180 186 160 + 174 180 186 195 2 180 186 195 198 154 + 180 186 195 201 124 186 195 -201 207 36 + 186 195 201 207 37 198 195 201 207 159 195 201 207 213 40 195 201 207 267 1 - 201 207 213 222 174 267 207 213 222 174 - 201 207 267 270 150 201 207 267 273 121 - 213 207 267 270 147 213 207 267 273 118 - 207 213 222 231 180 213 222 231 240 180 - 222 231 240 246 182 231 240 246 249 168 - 231 240 246 258 168 207 267 -273 279 25 - 207 267 273 279 26 270 267 273 279 158 + 201 207 213 222 175 267 207 213 222 175 + 201 207 267 270 151 201 207 267 273 122 + 213 207 267 270 148 213 207 267 273 119 + 207 213 222 231 181 213 222 231 240 181 + 222 231 240 246 183 231 240 246 249 169 + 231 240 246 258 169 207 267 -273 279 25 + 207 267 273 279 26 270 267 273 279 159 267 273 279 285 40 267 273 279 297 1 - 273 279 285 294 174 297 279 285 294 174 - 273 279 297 300 150 273 279 297 303 121 - 285 279 297 300 147 285 279 297 303 118 - 279 285 294 5739 166 285 294 -5739 5730 48 + 273 279 285 294 175 297 279 285 294 175 + 273 279 297 300 151 273 279 297 303 122 + 285 279 297 300 148 285 279 297 303 119 + 279 285 294 5739 167 285 294 -5739 5730 48 285 294 -5739 5730 49 285 294 5739 5730 50 279 297 -303 309 25 279 297 303 309 26 - 300 297 303 309 158 297 303 309 315 40 - 297 303 309 342 1 303 309 315 324 174 - 342 309 315 324 174 303 309 342 345 150 - 303 309 342 348 121 315 309 342 345 147 - 315 309 342 348 118 309 315 324 333 180 - 315 324 333 336 179 315 324 333 339 179 + 300 297 303 309 159 297 303 309 315 40 + 297 303 309 342 1 303 309 315 324 175 + 342 309 315 324 175 303 309 342 345 151 + 303 309 342 348 122 315 309 342 345 148 + 315 309 342 348 119 309 315 324 333 181 + 315 324 333 336 180 315 324 333 339 180 309 342 -348 354 25 309 342 348 354 26 - 345 342 348 354 158 342 348 354 360 40 - 342 348 354 399 1 348 354 360 369 174 - 399 354 360 369 174 348 354 399 402 150 - 348 354 399 405 121 360 354 399 402 147 - 360 354 399 405 118 354 360 369 375 174 - 354 360 369 387 174 354 399 -405 411 25 - 354 399 405 411 26 402 399 405 411 158 + 345 342 348 354 159 342 348 354 360 40 + 342 348 354 399 1 348 354 360 369 175 + 399 354 360 369 175 348 354 399 402 151 + 348 354 399 405 122 360 354 399 402 148 + 360 354 399 405 119 354 360 369 375 175 + 354 360 369 387 175 354 399 -405 411 25 + 354 399 405 411 26 402 399 405 411 159 399 405 411 417 51 399 405 411 429 1 - 405 411 429 432 150 405 411 429 435 121 - 417 411 429 432 148 417 411 429 435 119 + 405 411 429 432 151 405 411 429 435 122 + 417 411 429 432 149 417 411 429 435 120 411 429 -435 441 25 411 429 435 441 26 - 432 429 435 441 158 429 435 441 447 51 - 429 435 441 459 1 435 441 459 462 150 - 435 441 459 465 121 447 441 459 462 148 - 447 441 459 465 119 441 459 -465 471 25 - 441 459 465 471 26 462 459 465 471 158 + 432 429 435 441 159 429 435 441 447 51 + 429 435 441 459 1 435 441 459 462 151 + 435 441 459 465 122 447 441 459 462 149 + 447 441 459 465 120 441 459 -465 471 25 + 441 459 465 471 26 462 459 465 471 159 459 465 471 477 51 459 465 471 489 1 - 465 471 489 492 150 465 471 489 495 121 - 477 471 489 492 148 477 471 489 495 119 + 465 471 489 492 151 465 471 489 495 122 + 477 471 489 492 149 477 471 489 495 120 471 489 -495 501 25 471 489 495 501 26 - 492 489 495 501 158 489 495 501 507 40 - 489 495 501 540 1 495 501 507 516 174 - 540 501 507 516 174 495 501 540 543 150 - 495 501 540 546 121 507 501 540 543 147 - 507 501 540 546 118 501 507 516 525 180 + 492 489 495 501 159 489 495 501 507 40 + 489 495 501 540 1 495 501 507 516 175 + 540 501 507 516 175 495 501 540 543 151 + 495 501 540 546 122 507 501 540 543 148 + 507 501 540 546 119 501 507 516 525 181 507 516 -525 528 52 507 516 525 528 53 501 540 -546 552 25 501 540 546 552 26 - 543 540 546 552 158 540 546 552 558 40 - 540 546 552 606 1 546 552 558 567 174 - 606 552 558 567 174 546 552 606 609 150 - 546 552 606 612 121 558 552 606 609 147 - 558 552 606 612 118 552 558 567 576 180 - 558 567 576 585 41 567 576 585 594 180 + 543 540 546 552 159 540 546 552 558 40 + 540 546 552 606 1 546 552 558 567 175 + 606 552 558 567 175 546 552 606 609 151 + 546 552 606 612 122 558 552 606 609 148 + 558 552 606 612 119 552 558 567 576 181 + 558 567 576 585 41 567 576 585 594 181 552 606 -612 618 25 552 606 612 618 26 - 609 606 612 618 158 606 612 618 624 40 - 606 612 618 678 1 612 618 624 633 174 - 678 618 624 633 174 612 618 678 681 150 - 612 618 678 684 121 624 618 678 681 147 - 624 618 678 684 118 618 624 633 642 180 - 624 633 642 651 180 633 642 651 657 182 - 642 651 657 660 168 642 651 657 669 168 + 609 606 612 618 159 606 612 618 624 40 + 606 612 618 678 1 612 618 624 633 175 + 678 618 624 633 175 612 618 678 681 151 + 612 618 678 684 122 624 618 678 681 148 + 624 618 678 684 119 618 624 633 642 181 + 624 633 642 651 181 633 642 651 657 183 + 642 651 657 660 169 642 651 657 669 169 618 678 -684 690 25 618 678 684 690 26 - 681 678 684 690 158 678 684 690 696 40 - 678 684 690 729 1 684 690 696 708 174 - 729 690 696 708 174 684 690 729 732 150 - 684 690 729 735 121 696 690 729 732 147 - 696 690 729 735 118 690 696 708 705 131 + 681 678 684 690 159 678 684 690 696 40 + 678 684 690 729 1 684 690 696 708 175 + 729 690 696 708 175 684 690 729 732 151 + 684 690 729 735 122 696 690 729 732 148 + 696 690 729 735 119 690 696 708 705 132 690 696 -708 723 29 690 696 -708 723 30 690 696 708 723 31 711 705 708 696 39 - 711 705 -708 723 16 708 705 -711 717 128 - 696 708 723 717 127 705 708 -723 717 130 - 705 711 -717 723 133 711 717 -723 708 15 + 711 705 -708 723 16 708 705 -711 717 129 + 696 708 723 717 128 705 708 -723 717 131 + 705 711 -717 723 134 711 717 -723 708 15 690 729 -735 741 46 690 729 735 741 47 - 732 729 735 741 159 729 735 741 750 2 - 735 741 750 753 153 735 741 750 756 123 + 732 729 735 741 160 729 735 741 750 2 + 735 741 750 753 154 735 741 750 756 124 741 750 -756 762 36 741 750 756 762 37 - 753 750 756 762 158 750 756 762 768 40 - 750 756 762 807 1 756 762 768 777 174 - 807 762 768 777 174 756 762 807 810 150 - 756 762 807 813 121 768 762 807 810 147 - 768 762 807 813 118 762 768 777 783 174 - 762 768 777 795 174 762 807 -813 819 25 - 762 807 813 819 26 810 807 813 819 158 + 753 750 756 762 159 750 756 762 768 40 + 750 756 762 807 1 756 762 768 777 175 + 807 762 768 777 175 756 762 807 810 151 + 756 762 807 813 122 768 762 807 810 148 + 768 762 807 813 119 762 768 777 783 175 + 762 768 777 795 175 762 807 -813 819 25 + 762 807 813 819 26 810 807 813 819 159 807 813 819 825 40 807 813 819 843 1 - 813 819 825 834 174 843 819 825 834 174 - 813 819 843 846 150 813 819 843 849 121 - 825 819 843 846 147 825 819 843 849 118 - 819 825 834 837 179 819 825 834 840 179 + 813 819 825 834 175 843 819 825 834 175 + 813 819 843 846 151 813 819 843 849 122 + 825 819 843 846 148 825 819 843 849 119 + 819 825 834 837 180 819 825 834 840 180 819 843 -849 855 25 819 843 849 855 26 - 846 843 849 855 158 843 849 855 861 40 - 843 849 855 885 1 849 855 861 870 174 - 885 855 861 870 174 849 855 885 888 150 - 849 855 885 891 121 861 855 885 888 147 - 861 855 885 891 118 855 861 870 873 179 - 855 861 870 876 179 855 885 -891 897 25 - 855 885 891 897 26 888 885 891 897 158 + 846 843 849 855 159 843 849 855 861 40 + 843 849 855 885 1 849 855 861 870 175 + 885 855 861 870 175 849 855 885 888 151 + 849 855 885 891 122 861 855 885 888 148 + 861 855 885 891 119 855 861 870 873 180 + 855 861 870 876 180 855 885 -891 897 25 + 855 885 891 897 26 888 885 891 897 159 885 891 897 903 40 885 891 897 948 1 - 891 897 903 912 174 948 897 903 912 6 - 891 897 948 951 150 891 897 948 954 121 - 903 897 948 951 147 903 897 948 954 118 + 891 897 903 912 175 948 897 903 912 6 + 891 897 948 951 151 891 897 948 954 122 + 903 897 948 951 148 903 897 948 954 119 897 903 912 915 28 897 903 912 936 28 903 912 915 921 38 936 912 915 921 4 903 912 936 942 38 915 912 936 942 4 - 912 915 921 927 4 915 921 927 930 163 + 912 915 921 927 4 915 921 927 930 164 915 921 -927 942 4 921 927 -942 936 4 - 930 927 942 936 163 912 936 -942 927 4 + 930 927 942 936 164 912 936 -942 927 4 897 948 -954 960 25 897 948 954 960 26 - 951 948 954 960 158 948 954 960 966 40 - 948 954 960 1020 1 954 960 966 975 174 - 1020 960 966 975 174 954 960 1020 1023 150 - 954 960 1020 1026 121 966 960 1020 1023 147 - 966 960 1020 1026 118 960 966 975 984 180 - 966 975 984 993 180 975 984 993 999 182 - 984 993 999 1002 168 984 993 999 1011 168 + 951 948 954 960 159 948 954 960 966 40 + 948 954 960 1020 1 954 960 966 975 175 + 1020 960 966 975 175 954 960 1020 1023 151 + 954 960 1020 1026 122 966 960 1020 1023 148 + 966 960 1020 1026 119 960 966 975 984 181 + 966 975 984 993 181 975 984 993 999 183 + 984 993 999 1002 169 984 993 999 1011 169 960 1020 -1026 1032 46 960 1020 1026 1032 47 - 1023 1020 1026 1032 159 1020 1026 1032 1041 2 - 1026 1032 1041 1044 153 1026 1032 1041 1047 123 + 1023 1020 1026 1032 160 1020 1026 1032 1041 2 + 1026 1032 1041 1044 154 1026 1032 1041 1047 124 1032 1041 -1047 1053 36 1032 1041 1047 1053 37 - 1044 1041 1047 1053 158 1041 1047 1053 1059 40 - 1041 1047 1053 1104 1 1047 1053 1059 1068 174 - 1104 1053 1059 1068 6 1047 1053 1104 1107 150 - 1047 1053 1104 1110 121 1059 1053 1104 1107 147 - 1059 1053 1104 1110 118 1053 1059 1068 1071 28 + 1044 1041 1047 1053 159 1041 1047 1053 1059 40 + 1041 1047 1053 1104 1 1047 1053 1059 1068 175 + 1104 1053 1059 1068 6 1047 1053 1104 1107 151 + 1047 1053 1104 1110 122 1059 1053 1104 1107 148 + 1059 1053 1104 1110 119 1053 1059 1068 1071 28 1053 1059 1068 1092 28 1059 1068 1071 1077 38 1092 1068 1071 1077 4 1059 1068 1092 1098 38 1071 1068 1092 1098 4 1068 1071 1077 1083 4 - 1071 1077 1083 1086 163 1071 1077 -1083 1098 4 - 1077 1083 -1098 1092 4 1086 1083 1098 1092 163 + 1071 1077 1083 1086 164 1071 1077 -1083 1098 4 + 1077 1083 -1098 1092 4 1086 1083 1098 1092 164 1068 1092 -1098 1083 4 1053 1104 -1110 1116 25 - 1053 1104 1110 1116 26 1107 1104 1110 1116 158 + 1053 1104 1110 1116 26 1107 1104 1110 1116 159 1104 1110 1116 1122 40 1104 1110 1116 1137 1 - 1110 1116 1122 1131 174 1137 1116 1122 1131 174 - 1110 1116 1137 1140 150 1110 1116 1137 1143 121 - 1122 1116 1137 1140 147 1122 1116 1137 1143 118 + 1110 1116 1122 1131 175 1137 1116 1122 1131 175 + 1110 1116 1137 1140 151 1110 1116 1137 1143 122 + 1122 1116 1137 1140 148 1122 1116 1137 1143 119 1116 1137 -1143 1149 25 1116 1137 1143 1149 26 - 1140 1137 1143 1149 158 1137 1143 1149 1155 40 - 1137 1143 1149 1194 1 1143 1149 1155 1164 174 - 1194 1149 1155 1164 174 1143 1149 1194 1197 150 - 1143 1149 1194 1200 121 1155 1149 1194 1197 147 - 1155 1149 1194 1200 118 1149 1155 1164 1170 174 - 1149 1155 1164 1182 174 1149 1194 -1200 1206 46 - 1149 1194 1200 1206 47 1197 1194 1200 1206 159 - 1194 1200 1206 1215 2 1200 1206 1215 1218 153 - 1200 1206 1215 1221 123 1206 1215 -1221 1227 36 - 1206 1215 1221 1227 37 1218 1215 1221 1227 158 + 1140 1137 1143 1149 159 1137 1143 1149 1155 40 + 1137 1143 1149 1194 1 1143 1149 1155 1164 175 + 1194 1149 1155 1164 175 1143 1149 1194 1197 151 + 1143 1149 1194 1200 122 1155 1149 1194 1197 148 + 1155 1149 1194 1200 119 1149 1155 1164 1170 175 + 1149 1155 1164 1182 175 1149 1194 -1200 1206 46 + 1149 1194 1200 1206 47 1197 1194 1200 1206 160 + 1194 1200 1206 1215 2 1200 1206 1215 1218 154 + 1200 1206 1215 1221 124 1206 1215 -1221 1227 36 + 1206 1215 1221 1227 37 1218 1215 1221 1227 159 1215 1221 1227 1233 40 1215 1221 1227 1257 1 - 1221 1227 1233 1242 174 1257 1227 1233 1242 174 - 1221 1227 1257 1260 150 1221 1227 1257 1263 121 - 1233 1227 1257 1260 147 1233 1227 1257 1263 118 - 1227 1233 1242 1245 179 1227 1233 1242 1248 179 + 1221 1227 1233 1242 175 1257 1227 1233 1242 175 + 1221 1227 1257 1260 151 1221 1227 1257 1263 122 + 1233 1227 1257 1260 148 1233 1227 1257 1263 119 + 1227 1233 1242 1245 180 1227 1233 1242 1248 180 1227 1257 -1263 1269 25 1227 1257 1263 1269 26 - 1260 1257 1263 1269 158 1257 1263 1269 1275 40 - 1257 1263 1269 1329 1 1263 1269 1275 1284 174 - 1329 1269 1275 1284 174 1263 1269 1329 1332 150 - 1263 1269 1329 1335 121 1275 1269 1329 1332 147 - 1275 1269 1329 1335 118 1269 1275 1284 1287 32 - 1269 1275 1284 1302 33 1275 1284 1287 1293 136 - 1302 1284 -1287 1293 135 1275 1284 1302 1299 43 + 1260 1257 1263 1269 159 1257 1263 1269 1275 40 + 1257 1263 1269 1329 1 1263 1269 1275 1284 175 + 1329 1269 1275 1284 175 1263 1269 1329 1332 151 + 1263 1269 1329 1335 122 1275 1269 1329 1332 148 + 1275 1269 1329 1335 119 1269 1275 1284 1287 32 + 1269 1275 1284 1302 33 1275 1284 1287 1293 137 + 1302 1284 -1287 1293 136 1275 1284 1302 1299 43 1275 1284 1302 1305 42 1287 1284 -1302 1299 19 1287 1284 1302 1305 7 1284 1287 -1293 1299 54 1287 1293 -1299 1302 20 1287 1293 1299 1317 8 - 1293 1299 -1302 1284 140 1293 1299 1302 1305 139 + 1293 1299 -1302 1284 141 1293 1299 1302 1305 140 1317 1299 1302 1284 56 1317 1299 1302 1305 5 - 1293 1299 1317 1323 137 1302 1299 1317 1323 18 + 1293 1299 1317 1323 138 1302 1299 1317 1323 18 1284 1302 1305 1311 55 1299 1302 1305 1311 18 1302 1305 -1311 1323 17 1305 1311 -1323 1317 4 1299 1317 -1323 1311 17 1269 1329 -1335 1341 25 - 1269 1329 1335 1341 26 1332 1329 1335 1341 158 + 1269 1329 1335 1341 26 1332 1329 1335 1341 159 1329 1335 1341 1347 27 1329 1335 1341 1377 1 - 1335 1341 1347 1353 173 1335 1341 1347 1365 173 - 1377 1341 1347 1353 173 1377 1341 1347 1365 173 - 1335 1341 1377 1380 150 1335 1341 1377 1383 121 - 1347 1341 1377 1380 146 1347 1341 1377 1383 117 + 1335 1341 1347 1353 174 1335 1341 1347 1365 174 + 1377 1341 1347 1353 174 1377 1341 1347 1365 174 + 1335 1341 1377 1380 151 1335 1341 1377 1383 122 + 1347 1341 1377 1380 147 1347 1341 1377 1383 118 1341 1377 -1383 1389 25 1341 1377 1383 1389 26 - 1380 1377 1383 1389 158 1377 1383 1389 1395 40 - 1377 1383 1389 1407 1 1383 1389 1395 1404 174 - 1407 1389 1395 1404 174 1383 1389 1407 1410 150 - 1383 1389 1407 1413 121 1395 1389 1407 1410 147 - 1395 1389 1407 1413 118 1389 1395 1404 5193 166 + 1380 1377 1383 1389 159 1377 1383 1389 1395 40 + 1377 1383 1389 1407 1 1383 1389 1395 1404 175 + 1407 1389 1395 1404 175 1383 1389 1407 1410 151 + 1383 1389 1407 1413 122 1395 1389 1407 1410 148 + 1395 1389 1407 1413 119 1389 1395 1404 5193 167 1395 1404 -5193 5184 48 1395 1404 -5193 5184 49 1395 1404 5193 5184 50 1389 1407 -1413 1419 25 - 1389 1407 1413 1419 26 1410 1407 1413 1419 158 + 1389 1407 1413 1419 26 1410 1407 1413 1419 159 1407 1413 1419 1425 51 1407 1413 1419 1437 1 - 1413 1419 1437 1440 150 1413 1419 1437 1443 121 - 1425 1419 1437 1440 148 1425 1419 1437 1443 119 + 1413 1419 1437 1440 151 1413 1419 1437 1443 122 + 1425 1419 1437 1440 149 1425 1419 1437 1443 120 1419 1437 -1443 1449 25 1419 1437 1443 1449 26 - 1440 1437 1443 1449 158 1437 1443 1449 1455 51 - 1437 1443 1449 1467 1 1443 1449 1467 1470 150 - 1443 1449 1467 1473 121 1455 1449 1467 1470 148 - 1455 1449 1467 1473 119 1449 1467 -1473 1479 25 - 1449 1467 1473 1479 26 1470 1467 1473 1479 158 + 1440 1437 1443 1449 159 1437 1443 1449 1455 51 + 1437 1443 1449 1467 1 1443 1449 1467 1470 151 + 1443 1449 1467 1473 122 1455 1449 1467 1470 149 + 1455 1449 1467 1473 120 1449 1467 -1473 1479 25 + 1449 1467 1473 1479 26 1470 1467 1473 1479 159 1467 1473 1479 1485 40 1467 1473 1479 1533 1 - 1473 1479 1485 1494 174 1533 1479 1485 1494 174 - 1473 1479 1533 1536 150 1473 1479 1533 1539 121 - 1485 1479 1533 1536 147 1485 1479 1533 1539 118 - 1479 1485 1494 1503 180 1485 1494 1503 1512 41 - 1494 1503 1512 1521 180 1479 1533 -1539 1545 25 - 1479 1533 1539 1545 26 1536 1533 1539 1545 158 + 1473 1479 1485 1494 175 1533 1479 1485 1494 175 + 1473 1479 1533 1536 151 1473 1479 1533 1539 122 + 1485 1479 1533 1536 148 1485 1479 1533 1539 119 + 1479 1485 1494 1503 181 1485 1494 1503 1512 41 + 1494 1503 1512 1521 181 1479 1533 -1539 1545 25 + 1479 1533 1539 1545 26 1536 1533 1539 1545 159 1533 1539 1545 1551 40 1533 1539 1545 1593 1 - 1539 1545 1551 1560 174 1593 1545 1551 1560 6 - 1539 1545 1593 1596 150 1539 1545 1593 1599 121 - 1551 1545 1593 1596 147 1551 1545 1593 1599 118 + 1539 1545 1551 1560 175 1593 1545 1551 1560 6 + 1539 1545 1593 1596 151 1539 1545 1593 1599 122 + 1551 1545 1593 1596 148 1551 1545 1593 1599 119 1545 1551 1560 1563 28 1545 1551 1560 1581 28 1551 1560 1563 1569 38 1581 1560 1563 1569 4 1551 1560 1581 1587 38 1563 1560 1581 1587 4 1560 1563 1569 1575 4 1563 1569 -1575 1587 4 1569 1575 -1587 1581 4 1560 1581 -1587 1575 4 1545 1593 -1599 1605 25 1545 1593 1599 1605 26 - 1596 1593 1599 1605 158 1593 1599 1605 1611 40 - 1593 1599 1605 1638 1 1599 1605 1611 1620 174 - 1638 1605 1611 1620 174 1599 1605 1638 1641 150 - 1599 1605 1638 1644 121 1611 1605 1638 1641 147 - 1611 1605 1638 1644 118 1605 1611 1620 1629 180 - 1611 1620 1629 1632 179 1611 1620 1629 1635 179 + 1596 1593 1599 1605 159 1593 1599 1605 1611 40 + 1593 1599 1605 1638 1 1599 1605 1611 1620 175 + 1638 1605 1611 1620 175 1599 1605 1638 1641 151 + 1599 1605 1638 1644 122 1611 1605 1638 1641 148 + 1611 1605 1638 1644 119 1605 1611 1620 1629 181 + 1611 1620 1629 1632 180 1611 1620 1629 1635 180 1605 1638 -1644 1650 25 1605 1638 1644 1650 26 - 1641 1638 1644 1650 158 1638 1644 1650 1656 40 - 1638 1644 1650 1671 1 1644 1650 1656 1665 174 - 1671 1650 1656 1665 174 1644 1650 1671 1674 150 - 1644 1650 1671 1677 121 1656 1650 1671 1674 147 - 1656 1650 1671 1677 118 1650 1671 -1677 1683 25 - 1650 1671 1677 1683 26 1674 1671 1677 1683 158 + 1641 1638 1644 1650 159 1638 1644 1650 1656 40 + 1638 1644 1650 1671 1 1644 1650 1656 1665 175 + 1671 1650 1656 1665 175 1644 1650 1671 1674 151 + 1644 1650 1671 1677 122 1656 1650 1671 1674 148 + 1656 1650 1671 1677 119 1650 1671 -1677 1683 25 + 1650 1671 1677 1683 26 1674 1671 1677 1683 159 1671 1677 1683 1689 40 1671 1677 1683 1713 1 - 1677 1683 1689 1698 174 1713 1683 1689 1698 174 - 1677 1683 1713 1716 150 1677 1683 1713 1719 121 - 1689 1683 1713 1716 147 1689 1683 1713 1719 118 - 1683 1689 1698 1701 179 1683 1689 1698 1704 179 + 1677 1683 1689 1698 175 1713 1683 1689 1698 175 + 1677 1683 1713 1716 151 1677 1683 1713 1719 122 + 1689 1683 1713 1716 148 1689 1683 1713 1719 119 + 1683 1689 1698 1701 180 1683 1689 1698 1704 180 1683 1713 -1719 1725 25 1683 1713 1719 1725 26 - 1716 1713 1719 1725 158 1713 1719 1725 1731 40 - 1713 1719 1725 1773 1 1719 1725 1731 1740 174 - 1773 1725 1731 1740 6 1719 1725 1773 1776 150 - 1719 1725 1773 1779 121 1731 1725 1773 1776 147 - 1731 1725 1773 1779 118 1725 1731 1740 1743 28 + 1716 1713 1719 1725 159 1713 1719 1725 1731 40 + 1713 1719 1725 1773 1 1719 1725 1731 1740 175 + 1773 1725 1731 1740 6 1719 1725 1773 1776 151 + 1719 1725 1773 1779 122 1731 1725 1773 1776 148 + 1731 1725 1773 1779 119 1725 1731 1740 1743 28 1725 1731 1740 1761 28 1731 1740 1743 1749 38 1761 1740 1743 1749 4 1731 1740 1761 1767 38 1743 1740 1761 1767 4 1740 1743 1749 1755 4 1743 1749 -1755 1767 4 1749 1755 -1767 1761 4 1740 1761 -1767 1755 4 1725 1773 -1779 1785 25 - 1725 1773 1779 1785 26 1776 1773 1779 1785 158 + 1725 1773 1779 1785 26 1776 1773 1779 1785 159 1773 1779 1785 1791 40 1773 1779 1785 1815 1 - 1779 1785 1791 1800 174 1815 1785 1791 1800 174 - 1779 1785 1815 1818 150 1779 1785 1815 1821 121 - 1791 1785 1815 1818 147 1791 1785 1815 1821 118 - 1785 1791 1800 1803 179 1785 1791 1800 1806 179 + 1779 1785 1791 1800 175 1815 1785 1791 1800 175 + 1779 1785 1815 1818 151 1779 1785 1815 1821 122 + 1791 1785 1815 1818 148 1791 1785 1815 1821 119 + 1785 1791 1800 1803 180 1785 1791 1800 1806 180 1785 1815 -1821 1827 25 1785 1815 1821 1827 26 - 1818 1815 1821 1827 158 1815 1821 1827 1833 27 - 1815 1821 1827 1857 1 1821 1827 1833 1839 173 - 1821 1827 1833 1845 173 1857 1827 1833 1839 173 - 1857 1827 1833 1845 173 1821 1827 1857 1860 150 - 1821 1827 1857 1863 121 1833 1827 1857 1860 146 - 1833 1827 1857 1863 117 1827 1857 -1863 1869 25 - 1827 1857 1863 1869 26 1860 1857 1863 1869 158 + 1818 1815 1821 1827 159 1815 1821 1827 1833 27 + 1815 1821 1827 1857 1 1821 1827 1833 1839 174 + 1821 1827 1833 1845 174 1857 1827 1833 1839 174 + 1857 1827 1833 1845 174 1821 1827 1857 1860 151 + 1821 1827 1857 1863 122 1833 1827 1857 1860 147 + 1833 1827 1857 1863 118 1827 1857 -1863 1869 25 + 1827 1857 1863 1869 26 1860 1857 1863 1869 159 1857 1863 1869 1875 40 1857 1863 1869 1908 1 - 1863 1869 1875 1884 174 1908 1869 1875 1884 174 - 1863 1869 1908 1911 150 1863 1869 1908 1914 121 - 1875 1869 1908 1911 147 1875 1869 1908 1914 118 - 1869 1875 1884 1893 180 1875 1884 1893 1896 179 - 1875 1884 1893 1899 179 1869 1908 -1914 1920 25 - 1869 1908 1914 1920 26 1911 1908 1914 1920 158 + 1863 1869 1875 1884 175 1908 1869 1875 1884 175 + 1863 1869 1908 1911 151 1863 1869 1908 1914 122 + 1875 1869 1908 1911 148 1875 1869 1908 1914 119 + 1869 1875 1884 1893 181 1875 1884 1893 1896 180 + 1875 1884 1893 1899 180 1869 1908 -1914 1920 25 + 1869 1908 1914 1920 26 1911 1908 1914 1920 159 1908 1914 1920 1926 51 1908 1914 1920 1938 1 - 1914 1920 1938 1941 150 1914 1920 1938 1944 121 - 1926 1920 1938 1941 148 1926 1920 1938 1944 119 + 1914 1920 1938 1941 151 1914 1920 1938 1944 122 + 1926 1920 1938 1941 149 1926 1920 1938 1944 120 1920 1938 -1944 1950 25 1920 1938 1944 1950 26 - 1941 1938 1944 1950 158 1938 1944 1950 1956 27 - 1938 1944 1950 1980 1 1944 1950 1956 1962 173 - 1944 1950 1956 1968 173 1980 1950 1956 1962 173 - 1980 1950 1956 1968 173 1944 1950 1980 1983 150 - 1944 1950 1980 1986 121 1956 1950 1980 1983 146 - 1956 1950 1980 1986 117 1950 1980 -1986 1992 25 - 1950 1980 1986 1992 26 1983 1980 1986 1992 158 + 1941 1938 1944 1950 159 1938 1944 1950 1956 27 + 1938 1944 1950 1980 1 1944 1950 1956 1962 174 + 1944 1950 1956 1968 174 1980 1950 1956 1962 174 + 1980 1950 1956 1968 174 1944 1950 1980 1983 151 + 1944 1950 1980 1986 122 1956 1950 1980 1983 147 + 1956 1950 1980 1986 118 1950 1980 -1986 1992 25 + 1950 1980 1986 1992 26 1983 1980 1986 1992 159 1980 1986 1992 1998 40 1980 1986 1992 2022 1 - 1986 1992 1998 2007 174 2022 1992 1998 2007 174 - 1986 1992 2022 2025 150 1986 1992 2022 2028 121 - 1998 1992 2022 2025 147 1998 1992 2022 2028 118 - 1992 1998 2007 2010 179 1992 1998 2007 2013 179 + 1986 1992 1998 2007 175 2022 1992 1998 2007 175 + 1986 1992 2022 2025 151 1986 1992 2022 2028 122 + 1998 1992 2022 2025 148 1998 1992 2022 2028 119 + 1992 1998 2007 2010 180 1992 1998 2007 2013 180 1992 2022 -2028 2034 25 1992 2022 2028 2034 26 - 2025 2022 2028 2034 158 2022 2028 2034 2040 40 - 2022 2028 2034 2094 1 2028 2034 2040 2049 174 - 2094 2034 2040 2049 174 2028 2034 2094 2097 150 - 2028 2034 2094 2100 121 2040 2034 2094 2097 147 - 2040 2034 2094 2100 118 2034 2040 2049 2058 180 - 2040 2049 2058 2067 180 2049 2058 2067 2073 182 - 2058 2067 2073 2076 168 2058 2067 2073 2085 168 + 2025 2022 2028 2034 159 2022 2028 2034 2040 40 + 2022 2028 2034 2094 1 2028 2034 2040 2049 175 + 2094 2034 2040 2049 175 2028 2034 2094 2097 151 + 2028 2034 2094 2100 122 2040 2034 2094 2097 148 + 2040 2034 2094 2100 119 2034 2040 2049 2058 181 + 2040 2049 2058 2067 181 2049 2058 2067 2073 183 + 2058 2067 2073 2076 169 2058 2067 2073 2085 169 2034 2094 -2100 2106 25 2034 2094 2100 2106 26 - 2097 2094 2100 2106 158 2094 2100 2106 2112 40 - 2094 2100 2106 2136 1 2100 2106 2112 2121 174 - 2136 2106 2112 2121 174 2100 2106 2136 2139 150 - 2100 2106 2136 2142 121 2112 2106 2136 2139 147 - 2112 2106 2136 2142 118 2106 2112 2121 2124 179 - 2106 2112 2121 2127 179 2106 2136 -2142 2148 25 - 2106 2136 2142 2148 26 2139 2136 2142 2148 158 + 2097 2094 2100 2106 159 2094 2100 2106 2112 40 + 2094 2100 2106 2136 1 2100 2106 2112 2121 175 + 2136 2106 2112 2121 175 2100 2106 2136 2139 151 + 2100 2106 2136 2142 122 2112 2106 2136 2139 148 + 2112 2106 2136 2142 119 2106 2112 2121 2124 180 + 2106 2112 2121 2127 180 2106 2136 -2142 2148 25 + 2106 2136 2142 2148 26 2139 2136 2142 2148 159 2136 2142 2148 2154 27 2136 2142 2148 2178 1 - 2142 2148 2154 2160 173 2142 2148 2154 2166 173 - 2178 2148 2154 2160 173 2178 2148 2154 2166 173 - 2142 2148 2178 2181 150 2142 2148 2178 2184 121 - 2154 2148 2178 2181 146 2154 2148 2178 2184 117 + 2142 2148 2154 2160 174 2142 2148 2154 2166 174 + 2178 2148 2154 2160 174 2178 2148 2154 2166 174 + 2142 2148 2178 2181 151 2142 2148 2178 2184 122 + 2154 2148 2178 2181 147 2154 2148 2178 2184 118 2148 2178 -2184 2190 25 2148 2178 2184 2190 26 - 2181 2178 2184 2190 158 2178 2184 2190 2196 40 - 2178 2184 2190 2214 1 2184 2190 2196 2205 174 - 2214 2190 2196 2205 174 2184 2190 2214 2217 150 - 2184 2190 2214 2220 121 2196 2190 2214 2217 147 - 2196 2190 2214 2220 118 2190 2196 2205 2208 179 - 2190 2196 2205 2211 179 2190 2214 -2220 2226 46 - 2190 2214 2220 2226 47 2217 2214 2220 2226 159 - 2214 2220 2226 2235 2 2220 2226 2235 2238 153 - 2220 2226 2235 2241 123 2226 2235 -2241 2247 36 - 2226 2235 2241 2247 37 2238 2235 2241 2247 158 + 2181 2178 2184 2190 159 2178 2184 2190 2196 40 + 2178 2184 2190 2214 1 2184 2190 2196 2205 175 + 2214 2190 2196 2205 175 2184 2190 2214 2217 151 + 2184 2190 2214 2220 122 2196 2190 2214 2217 148 + 2196 2190 2214 2220 119 2190 2196 2205 2208 180 + 2190 2196 2205 2211 180 2190 2214 -2220 2226 46 + 2190 2214 2220 2226 47 2217 2214 2220 2226 160 + 2214 2220 2226 2235 2 2220 2226 2235 2238 154 + 2220 2226 2235 2241 124 2226 2235 -2241 2247 36 + 2226 2235 2241 2247 37 2238 2235 2241 2247 159 2235 2241 2247 2253 40 2235 2241 2247 2268 1 - 2241 2247 2253 2262 174 2268 2247 2253 2262 174 - 2241 2247 2268 2271 150 2241 2247 2268 2274 121 - 2253 2247 2268 2271 147 2253 2247 2268 2274 118 + 2241 2247 2253 2262 175 2268 2247 2253 2262 175 + 2241 2247 2268 2271 151 2241 2247 2268 2274 122 + 2253 2247 2268 2271 148 2253 2247 2268 2274 119 2247 2268 -2274 2280 25 2247 2268 2274 2280 26 - 2271 2268 2274 2280 158 2268 2274 2280 2286 27 - 2268 2274 2280 2310 1 2274 2280 2286 2292 173 - 2274 2280 2286 2298 173 2310 2280 2286 2292 173 - 2310 2280 2286 2298 173 2274 2280 2310 2313 150 - 2274 2280 2310 2316 121 2286 2280 2310 2313 146 - 2286 2280 2310 2316 117 2280 2310 -2316 2322 25 - 2280 2310 2316 2322 26 2313 2310 2316 2322 158 + 2271 2268 2274 2280 159 2268 2274 2280 2286 27 + 2268 2274 2280 2310 1 2274 2280 2286 2292 174 + 2274 2280 2286 2298 174 2310 2280 2286 2292 174 + 2310 2280 2286 2298 174 2274 2280 2310 2313 151 + 2274 2280 2310 2316 122 2286 2280 2310 2313 147 + 2286 2280 2310 2316 118 2280 2310 -2316 2322 25 + 2280 2310 2316 2322 26 2313 2310 2316 2322 159 2310 2316 2322 2328 40 2310 2316 2322 2346 1 - 2316 2322 2328 2337 174 2346 2322 2328 2337 174 - 2316 2322 2346 2349 150 2316 2322 2346 2352 121 - 2328 2322 2346 2349 147 2328 2322 2346 2352 118 - 2322 2328 2337 2340 179 2322 2328 2337 2343 179 + 2316 2322 2328 2337 175 2346 2322 2328 2337 175 + 2316 2322 2346 2349 151 2316 2322 2346 2352 122 + 2328 2322 2346 2349 148 2328 2322 2346 2352 119 + 2322 2328 2337 2340 180 2322 2328 2337 2343 180 2322 2346 -2352 2358 25 2322 2346 2352 2358 26 - 2349 2346 2352 2358 158 2346 2352 2358 2364 40 - 2346 2352 2358 2409 1 2352 2358 2364 2373 174 - 2409 2358 2364 2373 6 2352 2358 2409 2412 150 - 2352 2358 2409 2415 121 2364 2358 2409 2412 147 - 2364 2358 2409 2415 118 2358 2364 2373 2376 28 + 2349 2346 2352 2358 159 2346 2352 2358 2364 40 + 2346 2352 2358 2409 1 2352 2358 2364 2373 175 + 2409 2358 2364 2373 6 2352 2358 2409 2412 151 + 2352 2358 2409 2415 122 2364 2358 2409 2412 148 + 2364 2358 2409 2415 119 2358 2364 2373 2376 28 2358 2364 2373 2397 28 2364 2373 2376 2382 38 2397 2373 2376 2382 4 2364 2373 2397 2403 38 2376 2373 2397 2403 4 2373 2376 2382 2388 4 - 2376 2382 2388 2391 163 2376 2382 -2388 2403 4 - 2382 2388 -2403 2397 4 2391 2388 2403 2397 163 + 2376 2382 2388 2391 164 2376 2382 -2388 2403 4 + 2382 2388 -2403 2397 4 2391 2388 2403 2397 164 2373 2397 -2403 2388 4 2358 2409 -2415 2421 46 - 2358 2409 2415 2421 47 2412 2409 2415 2421 159 - 2409 2415 2421 2430 2 2415 2421 2430 2433 153 - 2415 2421 2430 2436 123 2421 2430 -2436 2442 36 - 2421 2430 2436 2442 37 2433 2430 2436 2442 158 + 2358 2409 2415 2421 47 2412 2409 2415 2421 160 + 2409 2415 2421 2430 2 2415 2421 2430 2433 154 + 2415 2421 2430 2436 124 2421 2430 -2436 2442 36 + 2421 2430 2436 2442 37 2433 2430 2436 2442 159 2430 2436 2442 2448 27 2430 2436 2442 2487 1 - 2436 2442 2448 2454 173 2436 2442 2448 2466 173 - 2487 2442 2448 2454 173 2487 2442 2448 2466 173 - 2436 2442 2487 2490 150 2436 2442 2487 2493 121 - 2448 2442 2487 2490 146 2448 2442 2487 2493 117 - 2442 2448 2466 2475 174 2454 2448 2466 2475 174 + 2436 2442 2448 2454 174 2436 2442 2448 2466 174 + 2487 2442 2448 2454 174 2487 2442 2448 2466 174 + 2436 2442 2487 2490 151 2436 2442 2487 2493 122 + 2448 2442 2487 2490 147 2448 2442 2487 2493 118 + 2442 2448 2466 2475 175 2454 2448 2466 2475 175 2442 2487 -2493 2499 25 2442 2487 2493 2499 26 - 2490 2487 2493 2499 158 2487 2493 2499 2505 40 - 2487 2493 2499 2544 1 2493 2499 2505 2514 174 - 2544 2499 2505 2514 174 2493 2499 2544 2547 150 - 2493 2499 2544 2550 121 2505 2499 2544 2547 147 - 2505 2499 2544 2550 118 2499 2505 2514 2520 174 - 2499 2505 2514 2532 174 2499 2544 -2550 2556 25 - 2499 2544 2550 2556 26 2547 2544 2550 2556 158 + 2490 2487 2493 2499 159 2487 2493 2499 2505 40 + 2487 2493 2499 2544 1 2493 2499 2505 2514 175 + 2544 2499 2505 2514 175 2493 2499 2544 2547 151 + 2493 2499 2544 2550 122 2505 2499 2544 2547 148 + 2505 2499 2544 2550 119 2499 2505 2514 2520 175 + 2499 2505 2514 2532 175 2499 2544 -2550 2556 25 + 2499 2544 2550 2556 26 2547 2544 2550 2556 159 2544 2550 2556 2562 40 2544 2550 2556 2595 1 - 2550 2556 2562 2571 174 2595 2556 2562 2571 174 - 2550 2556 2595 2598 150 2550 2556 2595 2601 121 - 2562 2556 2595 2598 147 2562 2556 2595 2601 118 - 2556 2562 2571 2580 180 2562 2571 2580 2583 179 - 2562 2571 2580 2586 179 2556 2595 -2601 2607 25 - 2556 2595 2601 2607 26 2598 2595 2601 2607 158 + 2550 2556 2562 2571 175 2595 2556 2562 2571 175 + 2550 2556 2595 2598 151 2550 2556 2595 2601 122 + 2562 2556 2595 2598 148 2562 2556 2595 2601 119 + 2556 2562 2571 2580 181 2562 2571 2580 2583 180 + 2562 2571 2580 2586 180 2556 2595 -2601 2607 25 + 2556 2595 2601 2607 26 2598 2595 2601 2607 159 2595 2601 2607 2613 27 2595 2601 2607 2652 1 - 2601 2607 2613 2619 173 2601 2607 2613 2631 173 - 2652 2607 2613 2619 173 2652 2607 2613 2631 173 - 2601 2607 2652 2655 150 2601 2607 2652 2658 121 - 2613 2607 2652 2655 146 2613 2607 2652 2658 117 - 2607 2613 2631 2640 174 2619 2613 2631 2640 174 + 2601 2607 2613 2619 174 2601 2607 2613 2631 174 + 2652 2607 2613 2619 174 2652 2607 2613 2631 174 + 2601 2607 2652 2655 151 2601 2607 2652 2658 122 + 2613 2607 2652 2655 147 2613 2607 2652 2658 118 + 2607 2613 2631 2640 175 2619 2613 2631 2640 175 2607 2652 -2658 2664 25 2607 2652 2658 2664 26 - 2655 2652 2658 2664 158 2652 2658 2664 2670 40 - 2652 2658 2664 2694 1 2658 2664 2670 2679 174 - 2694 2664 2670 2679 174 2658 2664 2694 2697 150 - 2658 2664 2694 2700 121 2670 2664 2694 2697 147 - 2670 2664 2694 2700 118 2664 2670 2679 2682 179 - 2664 2670 2679 2685 179 2664 2694 -2700 2706 25 - 2664 2694 2700 2706 26 2697 2694 2700 2706 158 + 2655 2652 2658 2664 159 2652 2658 2664 2670 40 + 2652 2658 2664 2694 1 2658 2664 2670 2679 175 + 2694 2664 2670 2679 175 2658 2664 2694 2697 151 + 2658 2664 2694 2700 122 2670 2664 2694 2697 148 + 2670 2664 2694 2700 119 2664 2670 2679 2682 180 + 2664 2670 2679 2685 180 2664 2694 -2700 2706 25 + 2664 2694 2700 2706 26 2697 2694 2700 2706 159 2694 2700 2706 2712 40 2694 2700 2706 2727 1 - 2700 2706 2712 2721 174 2727 2706 2712 2721 174 - 2700 2706 2727 2730 150 2700 2706 2727 2733 121 - 2712 2706 2727 2730 147 2712 2706 2727 2733 118 + 2700 2706 2712 2721 175 2727 2706 2712 2721 175 + 2700 2706 2727 2730 151 2700 2706 2727 2733 122 + 2712 2706 2727 2730 148 2712 2706 2727 2733 119 2706 2727 -2733 2739 25 2706 2727 2733 2739 26 - 2730 2727 2733 2739 158 2727 2733 2739 2745 40 - 2727 2733 2739 2799 1 2733 2739 2745 2754 174 - 2799 2739 2745 2754 174 2733 2739 2799 2802 150 - 2733 2739 2799 2805 121 2745 2739 2799 2802 147 - 2745 2739 2799 2805 118 2739 2745 2754 2763 180 - 2745 2754 2763 2772 180 2754 2763 2772 2778 182 - 2763 2772 2778 2781 168 2763 2772 2778 2790 168 + 2730 2727 2733 2739 159 2727 2733 2739 2745 40 + 2727 2733 2739 2799 1 2733 2739 2745 2754 175 + 2799 2739 2745 2754 175 2733 2739 2799 2802 151 + 2733 2739 2799 2805 122 2745 2739 2799 2802 148 + 2745 2739 2799 2805 119 2739 2745 2754 2763 181 + 2745 2754 2763 2772 181 2754 2763 2772 2778 183 + 2763 2772 2778 2781 169 2763 2772 2778 2790 169 2739 2799 -2805 2811 25 2739 2799 2805 2811 26 - 2802 2799 2805 2811 158 2799 2805 2811 2817 40 - 2799 2805 2811 2871 1 2805 2811 2817 2826 174 - 2871 2811 2817 2826 174 2805 2811 2871 2874 150 - 2805 2811 2871 2877 121 2817 2811 2871 2874 147 - 2817 2811 2871 2877 118 2811 2817 2826 2829 32 - 2811 2817 2826 2844 33 2817 2826 2829 2835 136 - 2844 2826 -2829 2835 135 2817 2826 2844 2841 43 + 2802 2799 2805 2811 159 2799 2805 2811 2817 40 + 2799 2805 2811 2871 1 2805 2811 2817 2826 175 + 2871 2811 2817 2826 175 2805 2811 2871 2874 151 + 2805 2811 2871 2877 122 2817 2811 2871 2874 148 + 2817 2811 2871 2877 119 2811 2817 2826 2829 32 + 2811 2817 2826 2844 33 2817 2826 2829 2835 137 + 2844 2826 -2829 2835 136 2817 2826 2844 2841 43 2817 2826 2844 2847 42 2829 2826 -2844 2841 19 2829 2826 2844 2847 7 2826 2829 -2835 2841 54 2829 2835 -2841 2844 20 2829 2835 2841 2859 8 - 2835 2841 -2844 2826 140 2835 2841 2844 2847 139 + 2835 2841 -2844 2826 141 2835 2841 2844 2847 140 2859 2841 2844 2826 56 2859 2841 2844 2847 5 - 2835 2841 2859 2865 137 2844 2841 2859 2865 18 + 2835 2841 2859 2865 138 2844 2841 2859 2865 18 2826 2844 2847 2853 55 2841 2844 2847 2853 18 2844 2847 -2853 2865 17 2847 2853 -2865 2859 4 2841 2859 -2865 2853 17 2811 2871 -2877 2883 25 - 2811 2871 2877 2883 26 2874 2871 2877 2883 158 + 2811 2871 2877 2883 26 2874 2871 2877 2883 159 2871 2877 2883 2889 40 2871 2877 2883 2943 1 - 2877 2883 2889 2898 174 2943 2883 2889 2898 174 - 2877 2883 2943 2946 150 2877 2883 2943 2949 121 - 2889 2883 2943 2946 147 2889 2883 2943 2949 118 + 2877 2883 2889 2898 175 2943 2883 2889 2898 175 + 2877 2883 2943 2946 151 2877 2883 2943 2949 122 + 2889 2883 2943 2946 148 2889 2883 2943 2949 119 2883 2889 2898 2901 32 2883 2889 2898 2916 33 - 2889 2898 2901 2907 136 2916 2898 -2901 2907 135 + 2889 2898 2901 2907 137 2916 2898 -2901 2907 136 2889 2898 2916 2913 43 2889 2898 2916 2919 42 2901 2898 -2916 2913 19 2901 2898 2916 2919 7 2898 2901 -2907 2913 54 2901 2907 -2913 2916 20 - 2901 2907 2913 2931 8 2907 2913 -2916 2898 140 - 2907 2913 2916 2919 139 2931 2913 2916 2898 56 - 2931 2913 2916 2919 5 2907 2913 2931 2937 137 + 2901 2907 2913 2931 8 2907 2913 -2916 2898 141 + 2907 2913 2916 2919 140 2931 2913 2916 2898 56 + 2931 2913 2916 2919 5 2907 2913 2931 2937 138 2916 2913 2931 2937 18 2898 2916 2919 2925 55 2913 2916 2919 2925 18 2916 2919 -2925 2937 17 2919 2925 -2937 2931 4 2913 2931 -2937 2925 17 2883 2943 -2949 2955 25 2883 2943 2949 2955 26 - 2946 2943 2949 2955 158 2943 2949 2955 2961 40 - 2943 2949 2955 2973 1 2949 2955 2961 2970 174 - 2973 2955 2961 2970 174 2949 2955 2973 2976 150 - 2949 2955 2973 2979 121 2961 2955 2973 2976 147 - 2961 2955 2973 2979 118 2955 2961 2970 3651 166 + 2946 2943 2949 2955 159 2943 2949 2955 2961 40 + 2943 2949 2955 2973 1 2949 2955 2961 2970 175 + 2973 2955 2961 2970 175 2949 2955 2973 2976 151 + 2949 2955 2973 2979 122 2961 2955 2973 2976 148 + 2961 2955 2973 2979 119 2955 2961 2970 3651 167 2961 2970 -3651 3642 48 2961 2970 -3651 3642 49 2961 2970 3651 3642 50 2955 2973 -2979 2985 25 - 2955 2973 2979 2985 26 2976 2973 2979 2985 158 + 2955 2973 2979 2985 26 2976 2973 2979 2985 159 2973 2979 2985 2991 40 2973 2979 2985 3015 1 - 2979 2985 2991 3000 174 3015 2985 2991 3000 174 - 2979 2985 3015 3018 150 2979 2985 3015 3021 121 - 2991 2985 3015 3018 147 2991 2985 3015 3021 118 - 2985 2991 3000 3003 179 2985 2991 3000 3006 179 + 2979 2985 2991 3000 175 3015 2985 2991 3000 175 + 2979 2985 3015 3018 151 2979 2985 3015 3021 122 + 2991 2985 3015 3018 148 2991 2985 3015 3021 119 + 2985 2991 3000 3003 180 2985 2991 3000 3006 180 2985 3015 -3021 3027 25 2985 3015 3021 3027 26 - 3018 3015 3021 3027 158 3015 3021 3027 3033 40 - 3015 3021 3027 3051 1 3021 3027 3033 3042 174 - 3051 3027 3033 3042 174 3021 3027 3051 3054 150 - 3021 3027 3051 3057 121 3033 3027 3051 3054 147 - 3033 3027 3051 3057 118 3027 3033 3042 3045 179 - 3027 3033 3042 3048 179 3027 3051 -3057 3063 46 - 3027 3051 3057 3063 47 3054 3051 3057 3063 159 - 3051 3057 3063 3072 2 3057 3063 3072 3075 153 - 3057 3063 3072 3078 123 3063 3072 -3078 3084 36 - 3063 3072 3078 3084 37 3075 3072 3078 3084 158 + 3018 3015 3021 3027 159 3015 3021 3027 3033 40 + 3015 3021 3027 3051 1 3021 3027 3033 3042 175 + 3051 3027 3033 3042 175 3021 3027 3051 3054 151 + 3021 3027 3051 3057 122 3033 3027 3051 3054 148 + 3033 3027 3051 3057 119 3027 3033 3042 3045 180 + 3027 3033 3042 3048 180 3027 3051 -3057 3063 46 + 3027 3051 3057 3063 47 3054 3051 3057 3063 160 + 3051 3057 3063 3072 2 3057 3063 3072 3075 154 + 3057 3063 3072 3078 124 3063 3072 -3078 3084 36 + 3063 3072 3078 3084 37 3075 3072 3078 3084 159 3072 3078 3084 3090 40 3072 3078 3084 3144 1 - 3078 3084 3090 3099 174 3144 3084 3090 3099 174 - 3078 3084 3144 3147 150 3078 3084 3144 3150 121 - 3090 3084 3144 3147 147 3090 3084 3144 3150 118 - 3084 3090 3099 3108 180 3090 3099 3108 3117 180 - 3099 3108 3117 3123 182 3108 3117 3123 3126 168 - 3108 3117 3123 3135 168 3084 3144 -3150 3156 25 - 3084 3144 3150 3156 26 3147 3144 3150 3156 158 + 3078 3084 3090 3099 175 3144 3084 3090 3099 175 + 3078 3084 3144 3147 151 3078 3084 3144 3150 122 + 3090 3084 3144 3147 148 3090 3084 3144 3150 119 + 3084 3090 3099 3108 181 3090 3099 3108 3117 181 + 3099 3108 3117 3123 183 3108 3117 3123 3126 169 + 3108 3117 3123 3135 169 3084 3144 -3150 3156 25 + 3084 3144 3150 3156 26 3147 3144 3150 3156 159 3144 3150 3156 3162 27 3144 3150 3156 3186 1 - 3150 3156 3162 3168 173 3150 3156 3162 3174 173 - 3186 3156 3162 3168 173 3186 3156 3162 3174 173 - 3150 3156 3186 3189 150 3150 3156 3186 3192 124 - 3162 3156 3186 3189 146 3162 3156 3186 3192 110 + 3150 3156 3162 3168 174 3150 3156 3162 3174 174 + 3186 3156 3162 3168 174 3186 3156 3162 3174 174 + 3150 3156 3186 3189 151 3150 3156 3186 3192 125 + 3162 3156 3186 3189 147 3162 3156 3186 3192 110 3156 3186 -3192 3195 23 3156 3186 3192 3195 24 3156 3186 -3192 3204 21 3156 3186 3192 3204 22 - 3189 3186 -3192 3195 156 3189 3186 3192 3195 157 - 3189 3186 -3192 3204 154 3189 3186 3192 3204 155 + 3189 3186 -3192 3195 157 3189 3186 3192 3195 158 + 3189 3186 -3192 3204 155 3189 3186 3192 3204 156 3186 3192 3195 3219 11 3204 3192 -3195 3219 12 3186 3192 3204 3210 10 3186 3192 3204 3228 3 3195 3192 -3204 3210 14 3195 3192 3204 3228 13 - 3192 3195 -3219 3210 171 3192 3204 -3210 3219 169 - 3228 3204 3210 3219 169 3192 3204 3228 3231 145 - 3192 3204 -3228 3234 115 3192 3204 3228 3234 116 - 3210 3204 -3228 3231 141 3210 3204 3228 3231 142 - 3210 3204 -3228 3234 111 3210 3204 3228 3234 112 - 3204 3210 -3219 3195 170 3204 3228 -3234 3240 44 - 3204 3228 3234 3240 45 3231 3228 3234 3240 159 - 3228 3234 3240 3249 2 3234 3240 3249 3252 153 - 3234 3240 3249 3255 123 3240 3249 -3255 3261 36 - 3240 3249 3255 3261 37 3252 3249 3255 3261 158 + 3192 3195 -3219 3210 172 3192 3204 -3210 3219 170 + 3228 3204 3210 3219 170 3192 3204 3228 3231 146 + 3192 3204 -3228 3234 116 3192 3204 3228 3234 117 + 3210 3204 -3228 3231 142 3210 3204 3228 3231 143 + 3210 3204 -3228 3234 112 3210 3204 3228 3234 113 + 3204 3210 -3219 3195 171 3204 3228 -3234 3240 44 + 3204 3228 3234 3240 45 3231 3228 3234 3240 160 + 3228 3234 3240 3249 2 3234 3240 3249 3252 154 + 3234 3240 3249 3255 124 3240 3249 -3255 3261 36 + 3240 3249 3255 3261 37 3252 3249 3255 3261 159 3249 3255 3261 3267 40 3249 3255 3261 3282 1 - 3255 3261 3267 3276 174 3282 3261 3267 3276 174 - 3255 3261 3282 3285 150 3255 3261 3282 3288 121 - 3267 3261 3282 3285 147 3267 3261 3282 3288 118 + 3255 3261 3267 3276 175 3282 3261 3267 3276 175 + 3255 3261 3282 3285 151 3255 3261 3282 3288 122 + 3267 3261 3282 3285 148 3267 3261 3282 3288 119 3261 3282 -3288 3294 25 3261 3282 3288 3294 26 - 3285 3282 3288 3294 158 3282 3288 3294 3300 40 - 3282 3288 3294 3354 1 3288 3294 3300 3309 174 - 3354 3294 3300 3309 174 3288 3294 3354 3357 150 - 3288 3294 3354 3360 121 3300 3294 3354 3357 147 - 3300 3294 3354 3360 118 3294 3300 3309 3318 180 - 3300 3309 3318 3327 180 3309 3318 3327 3333 182 - 3318 3327 3333 3336 168 3318 3327 3333 3345 168 + 3285 3282 3288 3294 159 3282 3288 3294 3300 40 + 3282 3288 3294 3354 1 3288 3294 3300 3309 175 + 3354 3294 3300 3309 175 3288 3294 3354 3357 151 + 3288 3294 3354 3360 122 3300 3294 3354 3357 148 + 3300 3294 3354 3360 119 3294 3300 3309 3318 181 + 3300 3309 3318 3327 181 3309 3318 3327 3333 183 + 3318 3327 3333 3336 169 3318 3327 3333 3345 169 3294 3354 -3360 3366 25 3294 3354 3360 3366 26 - 3357 3354 3360 3366 158 3354 3360 3366 3372 40 - 3354 3360 3366 3396 1 3360 3366 3372 3381 174 - 3396 3366 3372 3381 174 3360 3366 3396 3399 150 - 3360 3366 3396 3402 121 3372 3366 3396 3399 147 - 3372 3366 3396 3402 118 3366 3372 3381 3384 179 - 3366 3372 3381 3387 179 3366 3396 -3402 3408 25 - 3366 3396 3402 3408 26 3399 3396 3402 3408 158 + 3357 3354 3360 3366 159 3354 3360 3366 3372 40 + 3354 3360 3366 3396 1 3360 3366 3372 3381 175 + 3396 3366 3372 3381 175 3360 3366 3396 3399 151 + 3360 3366 3396 3402 122 3372 3366 3396 3399 148 + 3372 3366 3396 3402 119 3366 3372 3381 3384 180 + 3366 3372 3381 3387 180 3366 3396 -3402 3408 25 + 3366 3396 3402 3408 26 3399 3396 3402 3408 159 3396 3402 3408 3414 40 3396 3402 3408 3453 1 - 3402 3408 3414 3423 174 3453 3408 3414 3423 174 - 3402 3408 3453 3456 150 3402 3408 3453 3459 121 - 3414 3408 3453 3456 147 3414 3408 3453 3459 118 - 3408 3414 3423 3429 174 3408 3414 3423 3441 174 + 3402 3408 3414 3423 175 3453 3408 3414 3423 175 + 3402 3408 3453 3456 151 3402 3408 3453 3459 122 + 3414 3408 3453 3456 148 3414 3408 3453 3459 119 + 3408 3414 3423 3429 175 3408 3414 3423 3441 175 3408 3453 -3459 3465 25 3408 3453 3459 3465 26 - 3456 3453 3459 3465 158 3453 3459 3465 3471 40 - 3453 3459 3465 3483 1 3459 3465 3471 3480 174 - 3483 3465 3471 3480 174 3459 3465 3483 3486 150 - 3459 3465 3483 3489 121 3471 3465 3483 3486 147 - 3471 3465 3483 3489 118 3465 3471 3480 4212 166 + 3456 3453 3459 3465 159 3453 3459 3465 3471 40 + 3453 3459 3465 3483 1 3459 3465 3471 3480 175 + 3483 3465 3471 3480 175 3459 3465 3483 3486 151 + 3459 3465 3483 3489 122 3471 3465 3483 3486 148 + 3471 3465 3483 3489 119 3465 3471 3480 4212 167 3471 3480 -4212 4203 48 3471 3480 -4212 4203 49 3471 3480 4212 4203 50 3465 3483 -3489 3495 25 - 3465 3483 3489 3495 26 3486 3483 3489 3495 158 + 3465 3483 3489 3495 26 3486 3483 3489 3495 159 3483 3489 3495 3501 40 3483 3489 3495 3525 1 - 3489 3495 3501 3510 174 3525 3495 3501 3510 174 - 3489 3495 3525 3528 150 3489 3495 3525 3531 121 - 3501 3495 3525 3528 147 3501 3495 3525 3531 118 - 3495 3501 3510 3513 179 3495 3501 3510 3516 179 + 3489 3495 3501 3510 175 3525 3495 3501 3510 175 + 3489 3495 3525 3528 151 3489 3495 3525 3531 122 + 3501 3495 3525 3528 148 3501 3495 3525 3531 119 + 3495 3501 3510 3513 180 3495 3501 3510 3516 180 3495 3525 -3531 3537 25 3495 3525 3531 3537 26 - 3528 3525 3531 3537 158 3525 3531 3537 3543 27 - 3525 3531 3537 3582 1 3531 3537 3543 3549 173 - 3531 3537 3543 3561 173 3582 3537 3543 3549 173 - 3582 3537 3543 3561 173 3531 3537 3582 3585 150 - 3531 3537 3582 3588 124 3543 3537 3582 3585 146 - 3543 3537 3582 3588 110 3537 3543 3561 3570 174 - 3549 3543 3561 3570 174 3537 3582 -3588 3591 23 + 3528 3525 3531 3537 159 3525 3531 3537 3543 27 + 3525 3531 3537 3582 1 3531 3537 3543 3549 174 + 3531 3537 3543 3561 174 3582 3537 3543 3549 174 + 3582 3537 3543 3561 174 3531 3537 3582 3585 151 + 3531 3537 3582 3588 125 3543 3537 3582 3585 147 + 3543 3537 3582 3588 110 3537 3543 3561 3570 175 + 3549 3543 3561 3570 175 3537 3582 -3588 3591 23 3537 3582 3588 3591 24 3537 3582 -3588 3600 21 - 3537 3582 3588 3600 22 3585 3582 -3588 3591 156 - 3585 3582 3588 3591 157 3585 3582 -3588 3600 154 - 3585 3582 3588 3600 155 3582 3588 3591 3615 11 + 3537 3582 3588 3600 22 3585 3582 -3588 3591 157 + 3585 3582 3588 3591 158 3585 3582 -3588 3600 155 + 3585 3582 3588 3600 156 3582 3588 3591 3615 11 3600 3588 -3591 3615 12 3582 3588 3600 3606 10 3582 3588 3600 3624 3 3591 3588 -3600 3606 14 - 3591 3588 3600 3624 13 3588 3591 -3615 3606 171 - 3588 3600 -3606 3615 169 3624 3600 3606 3615 169 - 3588 3600 3624 3627 145 3588 3600 -3624 3630 115 - 3588 3600 3624 3630 116 3606 3600 -3624 3627 141 - 3606 3600 3624 3627 142 3606 3600 -3624 3630 111 - 3606 3600 3624 3630 112 3600 3606 -3615 3591 170 + 3591 3588 3600 3624 13 3588 3591 -3615 3606 172 + 3588 3600 -3606 3615 170 3624 3600 3606 3615 170 + 3588 3600 3624 3627 146 3588 3600 -3624 3630 116 + 3588 3600 3624 3630 117 3606 3600 -3624 3627 142 + 3606 3600 3624 3627 143 3606 3600 -3624 3630 112 + 3606 3600 3624 3630 113 3600 3606 -3615 3591 171 3600 3624 -3630 3636 34 3600 3624 3630 3636 35 - 3627 3624 3630 3636 158 3624 3630 3636 3642 40 - 3624 3630 3636 3654 1 3630 3636 3642 3651 174 - 3654 3636 3642 3651 174 3630 3636 3654 3657 150 - 3630 3636 3654 3660 121 3642 3636 3654 3657 147 - 3642 3636 3654 3660 118 3636 3642 3651 2970 166 + 3627 3624 3630 3636 159 3624 3630 3636 3642 40 + 3624 3630 3636 3654 1 3630 3636 3642 3651 175 + 3654 3636 3642 3651 175 3630 3636 3654 3657 151 + 3630 3636 3654 3660 122 3642 3636 3654 3657 148 + 3642 3636 3654 3660 119 3636 3642 3651 2970 167 3636 3654 -3660 3666 25 3636 3654 3660 3666 26 - 3657 3654 3660 3666 158 3654 3660 3666 3672 40 - 3654 3660 3666 3687 1 3660 3666 3672 3681 174 - 3687 3666 3672 3681 174 3660 3666 3687 3690 150 - 3660 3666 3687 3693 121 3672 3666 3687 3690 147 - 3672 3666 3687 3693 118 3666 3687 -3693 3699 25 - 3666 3687 3693 3699 26 3690 3687 3693 3699 158 + 3657 3654 3660 3666 159 3654 3660 3666 3672 40 + 3654 3660 3666 3687 1 3660 3666 3672 3681 175 + 3687 3666 3672 3681 175 3660 3666 3687 3690 151 + 3660 3666 3687 3693 122 3672 3666 3687 3690 148 + 3672 3666 3687 3693 119 3666 3687 -3693 3699 25 + 3666 3687 3693 3699 26 3690 3687 3693 3699 159 3687 3693 3699 3705 51 3687 3693 3699 3717 1 - 3693 3699 3717 3720 150 3693 3699 3717 3723 121 - 3705 3699 3717 3720 148 3705 3699 3717 3723 119 + 3693 3699 3717 3720 151 3693 3699 3717 3723 122 + 3705 3699 3717 3720 149 3705 3699 3717 3723 120 3699 3717 -3723 3729 25 3699 3717 3723 3729 26 - 3720 3717 3723 3729 158 3717 3723 3729 3735 40 - 3717 3723 3729 3774 1 3723 3729 3735 3744 174 - 3774 3729 3735 3744 174 3723 3729 3774 3777 150 - 3723 3729 3774 3780 121 3735 3729 3774 3777 147 - 3735 3729 3774 3780 118 3729 3735 3744 3750 174 - 3729 3735 3744 3762 174 3729 3774 -3780 3786 25 - 3729 3774 3780 3786 26 3777 3774 3780 3786 158 + 3720 3717 3723 3729 159 3717 3723 3729 3735 40 + 3717 3723 3729 3774 1 3723 3729 3735 3744 175 + 3774 3729 3735 3744 175 3723 3729 3774 3777 151 + 3723 3729 3774 3780 122 3735 3729 3774 3777 148 + 3735 3729 3774 3780 119 3729 3735 3744 3750 175 + 3729 3735 3744 3762 175 3729 3774 -3780 3786 25 + 3729 3774 3780 3786 26 3777 3774 3780 3786 159 3774 3780 3786 3792 40 3774 3780 3786 3831 1 - 3780 3786 3792 3801 174 3831 3786 3792 3801 174 - 3780 3786 3831 3834 150 3780 3786 3831 3837 121 - 3792 3786 3831 3834 147 3792 3786 3831 3837 118 - 3786 3792 3801 3807 174 3786 3792 3801 3819 174 + 3780 3786 3792 3801 175 3831 3786 3792 3801 175 + 3780 3786 3831 3834 151 3780 3786 3831 3837 122 + 3792 3786 3831 3834 148 3792 3786 3831 3837 119 + 3786 3792 3801 3807 175 3786 3792 3801 3819 175 3786 3831 -3837 3843 25 3786 3831 3837 3843 26 - 3834 3831 3837 3843 158 3831 3837 3843 3849 40 - 3831 3837 3843 3864 1 3837 3843 3849 3858 174 - 3864 3843 3849 3858 174 3837 3843 3864 3867 150 - 3837 3843 3864 3870 121 3849 3843 3864 3867 147 - 3849 3843 3864 3870 118 3843 3864 -3870 3876 25 - 3843 3864 3870 3876 26 3867 3864 3870 3876 158 + 3834 3831 3837 3843 159 3831 3837 3843 3849 40 + 3831 3837 3843 3864 1 3837 3843 3849 3858 175 + 3864 3843 3849 3858 175 3837 3843 3864 3867 151 + 3837 3843 3864 3870 122 3849 3843 3864 3867 148 + 3849 3843 3864 3870 119 3843 3864 -3870 3876 25 + 3843 3864 3870 3876 26 3867 3864 3870 3876 159 3864 3870 3876 3882 40 3864 3870 3876 3897 1 - 3870 3876 3882 3891 174 3897 3876 3882 3891 174 - 3870 3876 3897 3900 150 3870 3876 3897 3903 121 - 3882 3876 3897 3900 147 3882 3876 3897 3903 118 + 3870 3876 3882 3891 175 3897 3876 3882 3891 175 + 3870 3876 3897 3900 151 3870 3876 3897 3903 122 + 3882 3876 3897 3900 148 3882 3876 3897 3903 119 3876 3897 -3903 3909 25 3876 3897 3903 3909 26 - 3900 3897 3903 3909 158 3897 3903 3909 3915 40 - 3897 3903 3909 3933 1 3903 3909 3915 3924 174 - 3933 3909 3915 3924 174 3903 3909 3933 3936 150 - 3903 3909 3933 3939 121 3915 3909 3933 3936 147 - 3915 3909 3933 3939 118 3909 3915 3924 3927 179 - 3909 3915 3924 3930 179 3909 3933 -3939 3945 25 - 3909 3933 3939 3945 26 3936 3933 3939 3945 158 + 3900 3897 3903 3909 159 3897 3903 3909 3915 40 + 3897 3903 3909 3933 1 3903 3909 3915 3924 175 + 3933 3909 3915 3924 175 3903 3909 3933 3936 151 + 3903 3909 3933 3939 122 3915 3909 3933 3936 148 + 3915 3909 3933 3939 119 3909 3915 3924 3927 180 + 3909 3915 3924 3930 180 3909 3933 -3939 3945 25 + 3909 3933 3939 3945 26 3936 3933 3939 3945 159 3933 3939 3945 3951 27 3933 3939 3945 3990 1 - 3939 3945 3951 3957 173 3939 3945 3951 3969 173 - 3990 3945 3951 3957 173 3990 3945 3951 3969 173 - 3939 3945 3990 3993 150 3939 3945 3990 3996 121 - 3951 3945 3990 3993 146 3951 3945 3990 3996 117 - 3945 3951 3969 3978 174 3957 3951 3969 3978 174 + 3939 3945 3951 3957 174 3939 3945 3951 3969 174 + 3990 3945 3951 3957 174 3990 3945 3951 3969 174 + 3939 3945 3990 3993 151 3939 3945 3990 3996 122 + 3951 3945 3990 3993 147 3951 3945 3990 3996 118 + 3945 3951 3969 3978 175 3957 3951 3969 3978 175 3945 3990 -3996 4002 25 3945 3990 3996 4002 26 - 3993 3990 3996 4002 158 3990 3996 4002 4008 27 - 3990 3996 4002 4032 1 3996 4002 4008 4014 173 - 3996 4002 4008 4020 173 4032 4002 4008 4014 173 - 4032 4002 4008 4020 173 3996 4002 4032 4035 150 - 3996 4002 4032 4038 121 4008 4002 4032 4035 146 - 4008 4002 4032 4038 117 4002 4032 -4038 4044 25 - 4002 4032 4038 4044 26 4035 4032 4038 4044 158 + 3993 3990 3996 4002 159 3990 3996 4002 4008 27 + 3990 3996 4002 4032 1 3996 4002 4008 4014 174 + 3996 4002 4008 4020 174 4032 4002 4008 4014 174 + 4032 4002 4008 4020 174 3996 4002 4032 4035 151 + 3996 4002 4032 4038 122 4008 4002 4032 4035 147 + 4008 4002 4032 4038 118 4002 4032 -4038 4044 25 + 4002 4032 4038 4044 26 4035 4032 4038 4044 159 4032 4038 4044 4050 51 4032 4038 4044 4062 1 - 4038 4044 4062 4065 150 4038 4044 4062 4068 121 - 4050 4044 4062 4065 148 4050 4044 4062 4068 119 + 4038 4044 4062 4065 151 4038 4044 4062 4068 122 + 4050 4044 4062 4065 149 4050 4044 4062 4068 120 4044 4062 -4068 4074 25 4044 4062 4068 4074 26 - 4065 4062 4068 4074 158 4062 4068 4074 4080 40 - 4062 4068 4074 4095 1 4068 4074 4080 4089 174 - 4095 4074 4080 4089 174 4068 4074 4095 4098 150 - 4068 4074 4095 4101 121 4080 4074 4095 4098 147 - 4080 4074 4095 4101 118 4074 4095 -4101 4107 25 - 4074 4095 4101 4107 26 4098 4095 4101 4107 158 + 4065 4062 4068 4074 159 4062 4068 4074 4080 40 + 4062 4068 4074 4095 1 4068 4074 4080 4089 175 + 4095 4074 4080 4089 175 4068 4074 4095 4098 151 + 4068 4074 4095 4101 122 4080 4074 4095 4098 148 + 4080 4074 4095 4101 119 4074 4095 -4101 4107 25 + 4074 4095 4101 4107 26 4098 4095 4101 4107 159 4095 4101 4107 4113 27 4095 4101 4107 4143 1 - 4101 4107 4113 4119 173 4101 4107 4113 4131 173 - 4143 4107 4113 4119 173 4143 4107 4113 4131 173 - 4101 4107 4143 4146 150 4101 4107 4143 4149 121 - 4113 4107 4143 4146 146 4113 4107 4143 4149 117 + 4101 4107 4113 4119 174 4101 4107 4113 4131 174 + 4143 4107 4113 4119 174 4143 4107 4113 4131 174 + 4101 4107 4143 4146 151 4101 4107 4143 4149 122 + 4113 4107 4143 4146 147 4113 4107 4143 4149 118 4107 4143 -4149 4155 25 4107 4143 4149 4155 26 - 4146 4143 4149 4155 158 4143 4149 4155 4161 40 - 4143 4149 4155 4185 1 4149 4155 4161 4170 174 - 4185 4155 4161 4170 174 4149 4155 4185 4188 150 - 4149 4155 4185 4191 121 4161 4155 4185 4188 147 - 4161 4155 4185 4191 118 4155 4161 4170 4173 179 - 4155 4161 4170 4176 179 4155 4185 -4191 4197 25 - 4155 4185 4191 4197 26 4188 4185 4191 4197 158 + 4146 4143 4149 4155 159 4143 4149 4155 4161 40 + 4143 4149 4155 4185 1 4149 4155 4161 4170 175 + 4185 4155 4161 4170 175 4149 4155 4185 4188 151 + 4149 4155 4185 4191 122 4161 4155 4185 4188 148 + 4161 4155 4185 4191 119 4155 4161 4170 4173 180 + 4155 4161 4170 4176 180 4155 4185 -4191 4197 25 + 4155 4185 4191 4197 26 4188 4185 4191 4197 159 4185 4191 4197 4203 40 4185 4191 4197 4215 1 - 4191 4197 4203 4212 174 4215 4197 4203 4212 174 - 4191 4197 4215 4218 150 4191 4197 4215 4221 121 - 4203 4197 4215 4218 147 4203 4197 4215 4221 118 - 4197 4203 4212 3480 166 4197 4215 -4221 4227 25 - 4197 4215 4221 4227 26 4218 4215 4221 4227 158 + 4191 4197 4203 4212 175 4215 4197 4203 4212 175 + 4191 4197 4215 4218 151 4191 4197 4215 4221 122 + 4203 4197 4215 4218 148 4203 4197 4215 4221 119 + 4197 4203 4212 3480 167 4197 4215 -4221 4227 25 + 4197 4215 4221 4227 26 4218 4215 4221 4227 159 4215 4221 4227 4233 51 4215 4221 4227 4245 1 - 4221 4227 4245 4248 150 4221 4227 4245 4251 121 - 4233 4227 4245 4248 148 4233 4227 4245 4251 119 + 4221 4227 4245 4248 151 4221 4227 4245 4251 122 + 4233 4227 4245 4248 149 4233 4227 4245 4251 120 4227 4245 -4251 4257 25 4227 4245 4251 4257 26 - 4248 4245 4251 4257 158 4245 4251 4257 4263 40 - 4245 4251 4257 4311 1 4251 4257 4263 4272 174 - 4311 4257 4263 4272 174 4251 4257 4311 4314 150 - 4251 4257 4311 4317 121 4263 4257 4311 4314 147 - 4263 4257 4311 4317 118 4257 4263 4272 4281 180 - 4263 4272 4281 4290 41 4272 4281 4290 4299 180 + 4248 4245 4251 4257 159 4245 4251 4257 4263 40 + 4245 4251 4257 4311 1 4251 4257 4263 4272 175 + 4311 4257 4263 4272 175 4251 4257 4311 4314 151 + 4251 4257 4311 4317 122 4263 4257 4311 4314 148 + 4263 4257 4311 4317 119 4257 4263 4272 4281 181 + 4263 4272 4281 4290 41 4272 4281 4290 4299 181 4257 4311 -4317 4323 25 4257 4311 4317 4323 26 - 4314 4311 4317 4323 158 4311 4317 4323 4329 40 - 4311 4317 4323 4377 1 4317 4323 4329 4338 174 - 4377 4323 4329 4338 174 4317 4323 4377 4380 150 - 4317 4323 4377 4383 121 4329 4323 4377 4380 147 - 4329 4323 4377 4383 118 4323 4329 4338 4347 180 - 4329 4338 4347 4356 41 4338 4347 4356 4365 180 + 4314 4311 4317 4323 159 4311 4317 4323 4329 40 + 4311 4317 4323 4377 1 4317 4323 4329 4338 175 + 4377 4323 4329 4338 175 4317 4323 4377 4380 151 + 4317 4323 4377 4383 122 4329 4323 4377 4380 148 + 4329 4323 4377 4383 119 4323 4329 4338 4347 181 + 4329 4338 4347 4356 41 4338 4347 4356 4365 181 4323 4377 -4383 4389 25 4323 4377 4383 4389 26 - 4380 4377 4383 4389 158 4377 4383 4389 4395 27 - 4377 4383 4389 4434 1 4383 4389 4395 4401 173 - 4383 4389 4395 4413 173 4434 4389 4395 4401 173 - 4434 4389 4395 4413 173 4383 4389 4434 4437 150 - 4383 4389 4434 4440 121 4395 4389 4434 4437 146 - 4395 4389 4434 4440 117 4389 4395 4413 4422 174 - 4401 4395 4413 4422 174 4389 4434 -4440 4446 25 - 4389 4434 4440 4446 26 4437 4434 4440 4446 158 + 4380 4377 4383 4389 159 4377 4383 4389 4395 27 + 4377 4383 4389 4434 1 4383 4389 4395 4401 174 + 4383 4389 4395 4413 174 4434 4389 4395 4401 174 + 4434 4389 4395 4413 174 4383 4389 4434 4437 151 + 4383 4389 4434 4440 122 4395 4389 4434 4437 147 + 4395 4389 4434 4440 118 4389 4395 4413 4422 175 + 4401 4395 4413 4422 175 4389 4434 -4440 4446 25 + 4389 4434 4440 4446 26 4437 4434 4440 4446 159 4434 4440 4446 4452 27 4434 4440 4446 4482 1 - 4440 4446 4452 4458 173 4440 4446 4452 4470 173 - 4482 4446 4452 4458 173 4482 4446 4452 4470 173 - 4440 4446 4482 4485 150 4440 4446 4482 4488 121 - 4452 4446 4482 4485 146 4452 4446 4482 4488 117 + 4440 4446 4452 4458 174 4440 4446 4452 4470 174 + 4482 4446 4452 4458 174 4482 4446 4452 4470 174 + 4440 4446 4482 4485 151 4440 4446 4482 4488 122 + 4452 4446 4482 4485 147 4452 4446 4482 4488 118 4446 4482 -4488 4494 25 4446 4482 4488 4494 26 - 4485 4482 4488 4494 158 4482 4488 4494 4500 40 - 4482 4488 4494 4515 1 4488 4494 4500 4509 174 - 4515 4494 4500 4509 174 4488 4494 4515 4518 150 - 4488 4494 4515 4521 121 4500 4494 4515 4518 147 - 4500 4494 4515 4521 118 4494 4515 -4521 4527 25 - 4494 4515 4521 4527 26 4518 4515 4521 4527 158 + 4485 4482 4488 4494 159 4482 4488 4494 4500 40 + 4482 4488 4494 4515 1 4488 4494 4500 4509 175 + 4515 4494 4500 4509 175 4488 4494 4515 4518 151 + 4488 4494 4515 4521 122 4500 4494 4515 4518 148 + 4500 4494 4515 4521 119 4494 4515 -4521 4527 25 + 4494 4515 4521 4527 26 4518 4515 4521 4527 159 4515 4521 4527 4533 40 4515 4521 4527 4551 1 - 4521 4527 4533 4542 174 4551 4527 4533 4542 174 - 4521 4527 4551 4554 150 4521 4527 4551 4557 121 - 4533 4527 4551 4554 147 4533 4527 4551 4557 118 - 4527 4533 4542 4545 179 4527 4533 4542 4548 179 + 4521 4527 4533 4542 175 4551 4527 4533 4542 175 + 4521 4527 4551 4554 151 4521 4527 4551 4557 122 + 4533 4527 4551 4554 148 4533 4527 4551 4557 119 + 4527 4533 4542 4545 180 4527 4533 4542 4548 180 4527 4551 -4557 4563 46 4527 4551 4557 4563 47 - 4554 4551 4557 4563 159 4551 4557 4563 4572 2 - 4557 4563 4572 4575 153 4557 4563 4572 4578 123 + 4554 4551 4557 4563 160 4551 4557 4563 4572 2 + 4557 4563 4572 4575 154 4557 4563 4572 4578 124 4563 4572 -4578 4584 36 4563 4572 4578 4584 37 - 4575 4572 4578 4584 158 4572 4578 4584 4590 40 - 4572 4578 4584 4614 1 4578 4584 4590 4599 174 - 4614 4584 4590 4599 174 4578 4584 4614 4617 150 - 4578 4584 4614 4620 121 4590 4584 4614 4617 147 - 4590 4584 4614 4620 118 4584 4590 4599 4602 179 - 4584 4590 4599 4605 179 4584 4614 -4620 4626 46 - 4584 4614 4620 4626 47 4617 4614 4620 4626 159 - 4614 4620 4626 4635 2 4620 4626 4635 4638 153 - 4620 4626 4635 4641 123 4626 4635 -4641 4647 36 - 4626 4635 4641 4647 37 4638 4635 4641 4647 158 + 4575 4572 4578 4584 159 4572 4578 4584 4590 40 + 4572 4578 4584 4614 1 4578 4584 4590 4599 175 + 4614 4584 4590 4599 175 4578 4584 4614 4617 151 + 4578 4584 4614 4620 122 4590 4584 4614 4617 148 + 4590 4584 4614 4620 119 4584 4590 4599 4602 180 + 4584 4590 4599 4605 180 4584 4614 -4620 4626 46 + 4584 4614 4620 4626 47 4617 4614 4620 4626 160 + 4614 4620 4626 4635 2 4620 4626 4635 4638 154 + 4620 4626 4635 4641 124 4626 4635 -4641 4647 36 + 4626 4635 4641 4647 37 4638 4635 4641 4647 159 4635 4641 4647 4653 40 4635 4641 4647 4686 1 - 4641 4647 4653 4662 174 4686 4647 4653 4662 174 - 4641 4647 4686 4689 150 4641 4647 4686 4692 121 - 4653 4647 4686 4689 147 4653 4647 4686 4692 118 - 4647 4653 4662 4671 180 4653 4662 -4671 4674 52 + 4641 4647 4653 4662 175 4686 4647 4653 4662 175 + 4641 4647 4686 4689 151 4641 4647 4686 4692 122 + 4653 4647 4686 4689 148 4653 4647 4686 4692 119 + 4647 4653 4662 4671 181 4653 4662 -4671 4674 52 4653 4662 4671 4674 53 4647 4686 -4692 4698 25 - 4647 4686 4692 4698 26 4689 4686 4692 4698 158 + 4647 4686 4692 4698 26 4689 4686 4692 4698 159 4686 4692 4698 4704 40 4686 4692 4698 4728 1 - 4692 4698 4704 4713 174 4728 4698 4704 4713 174 - 4692 4698 4728 4731 150 4692 4698 4728 4734 121 - 4704 4698 4728 4731 147 4704 4698 4728 4734 118 - 4698 4704 4713 4716 179 4698 4704 4713 4719 179 + 4692 4698 4704 4713 175 4728 4698 4704 4713 175 + 4692 4698 4728 4731 151 4692 4698 4728 4734 122 + 4704 4698 4728 4731 148 4704 4698 4728 4734 119 + 4698 4704 4713 4716 180 4698 4704 4713 4719 180 4698 4728 -4734 4740 25 4698 4728 4734 4740 26 - 4731 4728 4734 4740 158 4728 4734 4740 4746 51 - 4728 4734 4740 4758 1 4734 4740 4758 4761 150 - 4734 4740 4758 4764 121 4746 4740 4758 4761 148 - 4746 4740 4758 4764 119 4740 4758 -4764 4770 25 - 4740 4758 4764 4770 26 4761 4758 4764 4770 158 + 4731 4728 4734 4740 159 4728 4734 4740 4746 51 + 4728 4734 4740 4758 1 4734 4740 4758 4761 151 + 4734 4740 4758 4764 122 4746 4740 4758 4761 149 + 4746 4740 4758 4764 120 4740 4758 -4764 4770 25 + 4740 4758 4764 4770 26 4761 4758 4764 4770 159 4758 4764 4770 4776 40 4758 4764 4770 4830 1 - 4764 4770 4776 4785 174 4830 4770 4776 4785 174 - 4764 4770 4830 4833 150 4764 4770 4830 4836 121 - 4776 4770 4830 4833 147 4776 4770 4830 4836 118 + 4764 4770 4776 4785 175 4830 4770 4776 4785 175 + 4764 4770 4830 4833 151 4764 4770 4830 4836 122 + 4776 4770 4830 4833 148 4776 4770 4830 4836 119 4770 4776 4785 4788 32 4770 4776 4785 4803 33 - 4776 4785 4788 4794 136 4803 4785 -4788 4794 135 + 4776 4785 4788 4794 137 4803 4785 -4788 4794 136 4776 4785 4803 4800 43 4776 4785 4803 4806 42 4788 4785 -4803 4800 19 4788 4785 4803 4806 7 4785 4788 -4794 4800 54 4788 4794 -4800 4803 20 - 4788 4794 4800 4818 8 4794 4800 -4803 4785 140 - 4794 4800 4803 4806 139 4818 4800 4803 4785 56 - 4818 4800 4803 4806 5 4794 4800 4818 4824 137 + 4788 4794 4800 4818 8 4794 4800 -4803 4785 141 + 4794 4800 4803 4806 140 4818 4800 4803 4785 56 + 4818 4800 4803 4806 5 4794 4800 4818 4824 138 4803 4800 4818 4824 18 4785 4803 4806 4812 55 4800 4803 4806 4812 18 4803 4806 -4812 4824 17 4806 4812 -4824 4818 4 4800 4818 -4824 4812 17 4770 4830 -4836 4842 25 4770 4830 4836 4842 26 - 4833 4830 4836 4842 158 4830 4836 4842 4848 27 - 4830 4836 4842 4878 1 4836 4842 4848 4854 173 - 4836 4842 4848 4866 173 4878 4842 4848 4854 173 - 4878 4842 4848 4866 173 4836 4842 4878 4881 150 - 4836 4842 4878 4884 121 4848 4842 4878 4881 146 - 4848 4842 4878 4884 117 4842 4878 -4884 4890 25 - 4842 4878 4884 4890 26 4881 4878 4884 4890 158 + 4833 4830 4836 4842 159 4830 4836 4842 4848 27 + 4830 4836 4842 4878 1 4836 4842 4848 4854 174 + 4836 4842 4848 4866 174 4878 4842 4848 4854 174 + 4878 4842 4848 4866 174 4836 4842 4878 4881 151 + 4836 4842 4878 4884 122 4848 4842 4878 4881 147 + 4848 4842 4878 4884 118 4842 4878 -4884 4890 25 + 4842 4878 4884 4890 26 4881 4878 4884 4890 159 4878 4884 4890 4896 51 4878 4884 4890 4908 1 - 4884 4890 4908 4911 150 4884 4890 4908 4914 121 - 4896 4890 4908 4911 148 4896 4890 4908 4914 119 + 4884 4890 4908 4911 151 4884 4890 4908 4914 122 + 4896 4890 4908 4911 149 4896 4890 4908 4914 120 4890 4908 -4914 4920 25 4890 4908 4914 4920 26 - 4911 4908 4914 4920 158 4908 4914 4920 4926 40 - 4908 4914 4920 4980 1 4914 4920 4926 4935 174 - 4980 4920 4926 4935 174 4914 4920 4980 4983 150 - 4914 4920 4980 4986 121 4926 4920 4980 4983 147 - 4926 4920 4980 4986 118 4920 4926 4935 4938 32 - 4920 4926 4935 4953 33 4926 4935 4938 4944 136 - 4953 4935 -4938 4944 135 4926 4935 4953 4950 43 + 4911 4908 4914 4920 159 4908 4914 4920 4926 40 + 4908 4914 4920 4980 1 4914 4920 4926 4935 175 + 4980 4920 4926 4935 175 4914 4920 4980 4983 151 + 4914 4920 4980 4986 122 4926 4920 4980 4983 148 + 4926 4920 4980 4986 119 4920 4926 4935 4938 32 + 4920 4926 4935 4953 33 4926 4935 4938 4944 137 + 4953 4935 -4938 4944 136 4926 4935 4953 4950 43 4926 4935 4953 4956 42 4938 4935 -4953 4950 19 4938 4935 4953 4956 7 4935 4938 -4944 4950 54 4938 4944 -4950 4953 20 4938 4944 4950 4968 8 - 4944 4950 -4953 4935 140 4944 4950 4953 4956 139 + 4944 4950 -4953 4935 141 4944 4950 4953 4956 140 4968 4950 4953 4935 56 4968 4950 4953 4956 5 - 4944 4950 4968 4974 137 4953 4950 4968 4974 18 + 4944 4950 4968 4974 138 4953 4950 4968 4974 18 4935 4953 4956 4962 55 4950 4953 4956 4962 18 4953 4956 -4962 4974 17 4956 4962 -4974 4968 4 4950 4968 -4974 4962 17 4920 4980 -4986 4992 25 - 4920 4980 4986 4992 26 4983 4980 4986 4992 158 + 4920 4980 4986 4992 26 4983 4980 4986 4992 159 4980 4986 4992 4998 40 4980 4986 4992 5052 1 - 4986 4992 4998 5007 174 5052 4992 4998 5007 174 - 4986 4992 5052 5055 150 4986 4992 5052 5058 121 - 4998 4992 5052 5055 147 4998 4992 5052 5058 118 - 4992 4998 5007 5016 180 4998 5007 5016 5025 180 - 5007 5016 5025 5031 182 5016 5025 5031 5034 168 - 5016 5025 5031 5043 168 4992 5052 -5058 5064 25 - 4992 5052 5058 5064 26 5055 5052 5058 5064 158 + 4986 4992 4998 5007 175 5052 4992 4998 5007 175 + 4986 4992 5052 5055 151 4986 4992 5052 5058 122 + 4998 4992 5052 5055 148 4998 4992 5052 5058 119 + 4992 4998 5007 5016 181 4998 5007 5016 5025 181 + 5007 5016 5025 5031 183 5016 5025 5031 5034 169 + 5016 5025 5031 5043 169 4992 5052 -5058 5064 25 + 4992 5052 5058 5064 26 5055 5052 5058 5064 159 5052 5058 5064 5070 40 5052 5058 5064 5094 1 - 5058 5064 5070 5079 174 5094 5064 5070 5079 174 - 5058 5064 5094 5097 150 5058 5064 5094 5100 121 - 5070 5064 5094 5097 147 5070 5064 5094 5100 118 - 5064 5070 5079 5082 179 5064 5070 5079 5085 179 + 5058 5064 5070 5079 175 5094 5064 5070 5079 175 + 5058 5064 5094 5097 151 5058 5064 5094 5100 122 + 5070 5064 5094 5097 148 5070 5064 5094 5100 119 + 5064 5070 5079 5082 180 5064 5070 5079 5085 180 5064 5094 -5100 5106 25 5064 5094 5100 5106 26 - 5097 5094 5100 5106 158 5094 5100 5106 5112 40 - 5094 5100 5106 5166 1 5100 5106 5112 5121 174 - 5166 5106 5112 5121 174 5100 5106 5166 5169 150 - 5100 5106 5166 5172 121 5112 5106 5166 5169 147 - 5112 5106 5166 5172 118 5106 5112 5121 5130 180 - 5112 5121 5130 5139 180 5121 5130 5139 5145 182 - 5130 5139 5145 5148 168 5130 5139 5145 5157 168 + 5097 5094 5100 5106 159 5094 5100 5106 5112 40 + 5094 5100 5106 5166 1 5100 5106 5112 5121 175 + 5166 5106 5112 5121 175 5100 5106 5166 5169 151 + 5100 5106 5166 5172 122 5112 5106 5166 5169 148 + 5112 5106 5166 5172 119 5106 5112 5121 5130 181 + 5112 5121 5130 5139 181 5121 5130 5139 5145 183 + 5130 5139 5145 5148 169 5130 5139 5145 5157 169 5106 5166 -5172 5178 25 5106 5166 5172 5178 26 - 5169 5166 5172 5178 158 5166 5172 5178 5184 40 - 5166 5172 5178 5196 1 5172 5178 5184 5193 174 - 5196 5178 5184 5193 174 5172 5178 5196 5199 150 - 5172 5178 5196 5202 121 5184 5178 5196 5199 147 - 5184 5178 5196 5202 118 5178 5184 5193 1404 166 + 5169 5166 5172 5178 159 5166 5172 5178 5184 40 + 5166 5172 5178 5196 1 5172 5178 5184 5193 175 + 5196 5178 5184 5193 175 5172 5178 5196 5199 151 + 5172 5178 5196 5202 122 5184 5178 5196 5199 148 + 5184 5178 5196 5202 119 5178 5184 5193 1404 167 5178 5196 -5202 5208 25 5178 5196 5202 5208 26 - 5199 5196 5202 5208 158 5196 5202 5208 5214 40 - 5196 5202 5208 5262 1 5202 5208 5214 5223 174 - 5262 5208 5214 5223 174 5202 5208 5262 5265 150 - 5202 5208 5262 5268 121 5214 5208 5262 5265 147 - 5214 5208 5262 5268 118 5208 5214 5223 5232 180 - 5214 5223 5232 5241 41 5223 5232 5241 5250 180 + 5199 5196 5202 5208 159 5196 5202 5208 5214 40 + 5196 5202 5208 5262 1 5202 5208 5214 5223 175 + 5262 5208 5214 5223 175 5202 5208 5262 5265 151 + 5202 5208 5262 5268 122 5214 5208 5262 5265 148 + 5214 5208 5262 5268 119 5208 5214 5223 5232 181 + 5214 5223 5232 5241 41 5223 5232 5241 5250 181 5208 5262 -5268 5274 46 5208 5262 5268 5274 47 - 5265 5262 5268 5274 159 5262 5268 5274 5283 2 - 5268 5274 5283 5286 153 5268 5274 5283 5289 123 + 5265 5262 5268 5274 160 5262 5268 5274 5283 2 + 5268 5274 5283 5286 154 5268 5274 5283 5289 124 5274 5283 -5289 5295 36 5274 5283 5289 5295 37 - 5286 5283 5289 5295 158 5283 5289 5295 5301 27 - 5283 5289 5295 5325 1 5289 5295 5301 5307 173 - 5289 5295 5301 5313 173 5325 5295 5301 5307 173 - 5325 5295 5301 5313 173 5289 5295 5325 5328 150 - 5289 5295 5325 5331 121 5301 5295 5325 5328 146 - 5301 5295 5325 5331 117 5295 5325 -5331 5337 25 - 5295 5325 5331 5337 26 5328 5325 5331 5337 158 + 5286 5283 5289 5295 159 5283 5289 5295 5301 27 + 5283 5289 5295 5325 1 5289 5295 5301 5307 174 + 5289 5295 5301 5313 174 5325 5295 5301 5307 174 + 5325 5295 5301 5313 174 5289 5295 5325 5328 151 + 5289 5295 5325 5331 122 5301 5295 5325 5328 147 + 5301 5295 5325 5331 118 5295 5325 -5331 5337 25 + 5295 5325 5331 5337 26 5328 5325 5331 5337 159 5325 5331 5337 5343 40 5325 5331 5337 5361 1 - 5331 5337 5343 5352 174 5361 5337 5343 5352 174 - 5331 5337 5361 5364 150 5331 5337 5361 5367 121 - 5343 5337 5361 5364 147 5343 5337 5361 5367 118 - 5337 5343 5352 5355 179 5337 5343 5352 5358 179 + 5331 5337 5343 5352 175 5361 5337 5343 5352 175 + 5331 5337 5361 5364 151 5331 5337 5361 5367 122 + 5343 5337 5361 5364 148 5343 5337 5361 5367 119 + 5337 5343 5352 5355 180 5337 5343 5352 5358 180 5337 5361 -5367 5373 25 5337 5361 5367 5373 26 - 5364 5361 5367 5373 158 5361 5367 5373 5379 27 - 5361 5367 5373 5409 1 5367 5373 5379 5385 173 - 5367 5373 5379 5397 173 5409 5373 5379 5385 173 - 5409 5373 5379 5397 173 5367 5373 5409 5412 150 - 5367 5373 5409 5415 121 5379 5373 5409 5412 146 - 5379 5373 5409 5415 117 5373 5409 -5415 5421 25 - 5373 5409 5415 5421 26 5412 5409 5415 5421 158 + 5364 5361 5367 5373 159 5361 5367 5373 5379 27 + 5361 5367 5373 5409 1 5367 5373 5379 5385 174 + 5367 5373 5379 5397 174 5409 5373 5379 5385 174 + 5409 5373 5379 5397 174 5367 5373 5409 5412 151 + 5367 5373 5409 5415 122 5379 5373 5409 5412 147 + 5379 5373 5409 5415 118 5373 5409 -5415 5421 25 + 5373 5409 5415 5421 26 5412 5409 5415 5421 159 5409 5415 5421 5427 40 5409 5415 5421 5460 1 - 5415 5421 5427 5436 174 5460 5421 5427 5436 174 - 5415 5421 5460 5463 150 5415 5421 5460 5466 121 - 5427 5421 5460 5463 147 5427 5421 5460 5466 118 - 5421 5427 5436 5445 180 5427 5436 5445 5448 179 - 5427 5436 5445 5451 179 5421 5460 -5466 5472 25 - 5421 5460 5466 5472 26 5463 5460 5466 5472 158 + 5415 5421 5427 5436 175 5460 5421 5427 5436 175 + 5415 5421 5460 5463 151 5415 5421 5460 5466 122 + 5427 5421 5460 5463 148 5427 5421 5460 5466 119 + 5421 5427 5436 5445 181 5427 5436 5445 5448 180 + 5427 5436 5445 5451 180 5421 5460 -5466 5472 25 + 5421 5460 5466 5472 26 5463 5460 5466 5472 159 5460 5466 5472 5478 51 5460 5466 5472 5490 1 - 5466 5472 5490 5493 150 5466 5472 5490 5496 121 - 5478 5472 5490 5493 148 5478 5472 5490 5496 119 + 5466 5472 5490 5493 151 5466 5472 5490 5496 122 + 5478 5472 5490 5493 149 5478 5472 5490 5496 120 5472 5490 -5496 5502 25 5472 5490 5496 5502 26 - 5493 5490 5496 5502 158 5490 5496 5502 5508 40 - 5490 5496 5502 5562 1 5496 5502 5508 5517 174 - 5562 5502 5508 5517 174 5496 5502 5562 5565 150 - 5496 5502 5562 5568 121 5508 5502 5562 5565 147 - 5508 5502 5562 5568 118 5502 5508 5517 5520 32 - 5502 5508 5517 5535 33 5508 5517 5520 5526 136 - 5535 5517 -5520 5526 135 5508 5517 5535 5532 43 + 5493 5490 5496 5502 159 5490 5496 5502 5508 40 + 5490 5496 5502 5562 1 5496 5502 5508 5517 175 + 5562 5502 5508 5517 175 5496 5502 5562 5565 151 + 5496 5502 5562 5568 122 5508 5502 5562 5565 148 + 5508 5502 5562 5568 119 5502 5508 5517 5520 32 + 5502 5508 5517 5535 33 5508 5517 5520 5526 137 + 5535 5517 -5520 5526 136 5508 5517 5535 5532 43 5508 5517 5535 5538 42 5520 5517 -5535 5532 19 5520 5517 5535 5538 7 5517 5520 -5526 5532 54 5520 5526 -5532 5535 20 5520 5526 5532 5550 8 - 5526 5532 -5535 5517 140 5526 5532 5535 5538 139 + 5526 5532 -5535 5517 141 5526 5532 5535 5538 140 5550 5532 5535 5517 56 5550 5532 5535 5538 5 - 5526 5532 5550 5556 137 5535 5532 5550 5556 18 + 5526 5532 5550 5556 138 5535 5532 5550 5556 18 5517 5535 5538 5544 55 5532 5535 5538 5544 18 5535 5538 -5544 5556 17 5538 5544 -5556 5550 4 5532 5550 -5556 5544 17 5502 5562 -5568 5574 25 - 5502 5562 5568 5574 26 5565 5562 5568 5574 158 + 5502 5562 5568 5574 26 5565 5562 5568 5574 159 5562 5568 5574 5580 27 5562 5568 5574 5619 1 - 5568 5574 5580 5586 173 5568 5574 5580 5598 173 - 5619 5574 5580 5586 173 5619 5574 5580 5598 173 - 5568 5574 5619 5622 150 5568 5574 5619 5625 121 - 5580 5574 5619 5622 146 5580 5574 5619 5625 117 - 5574 5580 5598 5607 174 5586 5580 5598 5607 174 + 5568 5574 5580 5586 174 5568 5574 5580 5598 174 + 5619 5574 5580 5586 174 5619 5574 5580 5598 174 + 5568 5574 5619 5622 151 5568 5574 5619 5625 122 + 5580 5574 5619 5622 147 5580 5574 5619 5625 118 + 5574 5580 5598 5607 175 5586 5580 5598 5607 175 5574 5619 -5625 5631 25 5574 5619 5625 5631 26 - 5622 5619 5625 5631 158 5619 5625 5631 5637 40 - 5619 5625 5631 5691 1 5625 5631 5637 5646 174 - 5691 5631 5637 5646 174 5625 5631 5691 5694 150 - 5625 5631 5691 5697 121 5637 5631 5691 5694 147 - 5637 5631 5691 5697 118 5631 5637 5646 5655 180 - 5637 5646 5655 5664 180 5646 5655 5664 5670 182 - 5655 5664 5670 5673 168 5655 5664 5670 5682 168 + 5622 5619 5625 5631 159 5619 5625 5631 5637 40 + 5619 5625 5631 5691 1 5625 5631 5637 5646 175 + 5691 5631 5637 5646 175 5625 5631 5691 5694 151 + 5625 5631 5691 5697 122 5637 5631 5691 5694 148 + 5637 5631 5691 5697 119 5631 5637 5646 5655 181 + 5637 5646 5655 5664 181 5646 5655 5664 5670 183 + 5655 5664 5670 5673 169 5655 5664 5670 5682 169 5631 5691 -5697 5703 46 5631 5691 5697 5703 47 - 5694 5691 5697 5703 159 5691 5697 5703 5712 2 - 5697 5703 5712 5715 153 5697 5703 5712 5718 123 + 5694 5691 5697 5703 160 5691 5697 5703 5712 2 + 5697 5703 5712 5715 154 5697 5703 5712 5718 124 5703 5712 -5718 5724 36 5703 5712 5718 5724 37 - 5715 5712 5718 5724 158 5712 5718 5724 5730 40 - 5712 5718 5724 5742 1 5718 5724 5730 5739 174 - 5742 5724 5730 5739 174 5718 5724 5742 5745 150 - 5718 5724 5742 5748 121 5730 5724 5742 5745 147 - 5730 5724 5742 5748 118 5724 5730 5739 294 166 + 5715 5712 5718 5724 159 5712 5718 5724 5730 40 + 5712 5718 5724 5742 1 5718 5724 5730 5739 175 + 5742 5724 5730 5739 175 5718 5724 5742 5745 151 + 5718 5724 5742 5748 122 5730 5724 5742 5745 148 + 5730 5724 5742 5748 119 5724 5730 5739 294 167 5724 5742 -5748 5754 25 5724 5742 5748 5754 26 - 5745 5742 5748 5754 158 5742 5748 5754 5760 40 - 5742 5748 5754 5814 1 5748 5754 5760 5769 174 - 5814 5754 5760 5769 174 5748 5754 5814 5817 150 - 5748 5754 5814 5820 121 5760 5754 5814 5817 147 - 5760 5754 5814 5820 118 5754 5760 5769 5778 180 - 5760 5769 5778 5787 180 5769 5778 5787 5793 182 - 5778 5787 5793 5796 168 5778 5787 5793 5805 168 + 5745 5742 5748 5754 159 5742 5748 5754 5760 40 + 5742 5748 5754 5814 1 5748 5754 5760 5769 175 + 5814 5754 5760 5769 175 5748 5754 5814 5817 151 + 5748 5754 5814 5820 122 5760 5754 5814 5817 148 + 5760 5754 5814 5820 119 5754 5760 5769 5778 181 + 5760 5769 5778 5787 181 5769 5778 5787 5793 183 + 5778 5787 5793 5796 169 5778 5787 5793 5805 169 5754 5814 -5820 5826 25 5754 5814 5820 5826 26 - 5817 5814 5820 5826 158 5814 5820 5826 5832 40 - 5814 5820 5826 5871 9 5820 5826 5832 5841 174 - 5871 5826 5832 5841 174 5820 5826 5871 5874 172 - 5820 5826 5871 5877 172 5832 5826 5871 5874 172 - 5832 5826 5871 5877 172 5826 5832 5841 5847 174 - 5826 5832 5841 5859 174 + 5817 5814 5820 5826 159 5814 5820 5826 5832 40 + 5814 5820 5826 5871 9 5820 5826 5832 5841 175 + 5871 5826 5832 5841 175 5820 5826 5871 5874 173 + 5820 5826 5871 5877 173 5832 5826 5871 5874 173 + 5832 5826 5871 5877 173 5826 5832 5841 5847 175 + 5826 5832 5841 5859 175 %FLAG EXCLUDED_ATOMS_LIST %FORMAT(10I8) 2 3 4 5 6 7 8 9 10 23 From 0ba23f486bcea749c151814af157c379ae3a6f80 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 13:00:00 -0500 Subject: [PATCH 05/62] Version bump. --- parmed/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parmed/__init__.py b/parmed/__init__.py index 5283f5864..2e2103072 100644 --- a/parmed/__init__.py +++ b/parmed/__init__.py @@ -6,7 +6,7 @@ # Version format should be "major.minor.patch". For beta releases, attach # "-beta#" to the end. The beta number will be turned into another number in the # version tuple -__version__ = '2.1.6' +__version__ = '2.1.7' __author__ = 'Jason Swails' __all__ = ['exceptions', 'periodic_table', 'residue', 'unit', 'utils', From 5301e43470f936f21f1f0271b6c37e9abadf23a7 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 13:01:24 -0500 Subject: [PATCH 06/62] Simplification of no-longer necessary code. --- parmed/amber/_amberparm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parmed/amber/_amberparm.py b/parmed/amber/_amberparm.py index cd3f3ec38..2f7a171e4 100644 --- a/parmed/amber/_amberparm.py +++ b/parmed/amber/_amberparm.py @@ -1879,7 +1879,7 @@ def _add_missing_13_14(self, ignore_inconsistent_vdw=False): scee = scnb = 1e10 newtype = _copy.copy(dihedral.type) newtype.scee = scee - newtype.scnb = scnb if not ignore_inconsistent_vdw else 1.0 + newtype.scnb = scnb dihedral.type = newtype newtype.list = self.dihedral_types self.dihedral_types.append(newtype) From d590e457a48a987d2c3286227f844abfdc78a5a0 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 13:45:15 -0500 Subject: [PATCH 07/62] write_PDB/write_CIF --> struct.write_pdb/struct.write_cif in tests. Add a test for deprecation of the parmed.write_PDB/CIF methods --- test/test_parmed_formats.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/test/test_parmed_formats.py b/test/test_parmed_formats.py index 4956e3dba..92edbd676 100644 --- a/test/test_parmed_formats.py +++ b/test/test_parmed_formats.py @@ -6,8 +6,8 @@ import numpy as np from parmed import amber, charmm, exceptions, formats, gromacs, residue -from parmed import (Structure, read_PDB, write_PDB, read_CIF, write_CIF, - download_PDB, download_CIF, topologyobjects, Atom) +from parmed import (Structure, read_PDB, read_CIF, download_PDB, download_CIF, + topologyobjects, Atom, write_PDB, write_CIF) from parmed.modeller import ResidueTemplate, ResidueTemplateContainer from parmed.utils import PYPY from parmed.utils.six import iteritems, add_metaclass @@ -780,7 +780,7 @@ def test_pdb_write_models(self): self.assertEqual(pdbfile.get_coordinates('all').shape, (20, 451, 3)) self.assertEqual(len(pdbfile.atoms), 451) output = StringIO() - write_PDB(pdbfile, output) + pdbfile.write_pdb(output) output.seek(0) pdbfile2 = read_PDB(output) self.assertEqual(len(pdbfile2.atoms), 451) @@ -807,7 +807,7 @@ def test_pdb_write_xtal(self): self._check4lzt(pdbfile2, check_meta=False) self._compareInputOutputPDBs(pdbfile, pdbfile2) output = reset_stringio(output) - write_PDB(pdbfile, output) + pdbfile.write_pdb(output) output.seek(0) pdbfile3 = read_PDB(output) self._check4lzt(pdbfile3, check_meta=False) @@ -842,7 +842,7 @@ def test_pdb_write_altloc_options(self): self._compareInputOutputPDBs(pdbfile, pdbfile3, altloc_option='first') # Check that the 'occupancy' option works output = reset_stringio(output) - write_PDB(pdbfile, output, renumber=False, altlocs='occupancy') + pdbfile.write_pdb(output, renumber=False, altlocs='occupancy') output.seek(0) pdbfile4 = read_PDB(output) self._check4lzt(pdbfile4, check_meta=False, has_altloc=False) @@ -856,7 +856,7 @@ def test_pdb_write_standard_names(self): """ Test PDB file writing converting to standard names """ parm = formats.load_file(get_fn('trx.prmtop'), get_fn('trx.inpcrd')) output = StringIO() - write_PDB(parm, output, standard_resnames=True) + parm.write_pdb(output, standard_resnames=True) output.seek(0) pdb = read_PDB(output) for res in pdb.residues: @@ -881,7 +881,7 @@ def test_anisou_read(self): self.assertEqual(x/10000, y) def test_anisou_write(self): - """ Tests that write_PDB properly writes ANISOU records """ + """ Tests that write_pdb properly writes ANISOU records """ def check_aniso(pdbfile): aniso1 = [2066, 1204, 1269, 44, 126, 191] aniso2 = [2090, 1182, 921, 46, 64, 60] @@ -957,6 +957,16 @@ def test_private_functions(self): self.assertEqual(formats.pdb._standardize_resname('DG'), 'DG') self.assertEqual(formats.pdb._standardize_resname('BLA'), 'BLA') + def test_deprecations(self): + warnings.filterwarnings('error', category=DeprecationWarning) + fn = get_fn('blah', written=True) + try: + parm = formats.load_file(get_fn('ash.parm7'), get_fn('ash.rst7')) + self.assertRaises(DeprecationWarning, lambda: write_PDB(parm, fn)) + self.assertRaises(DeprecationWarning, lambda: write_CIF(parm, fn)) + finally: + warnings.filterwarnings('always', category=DeprecationWarning) + # Private helper test functions def _compareInputOutputPDBs(self, pdbfile, pdbfile2, reordered=False, altloc_option='all'): @@ -1439,7 +1449,7 @@ def test_cif_models(self): self.assertEqual(cif.get_coordinates('all').shape, (20, 451, 3)) self.assertEqual(len(cif.atoms), 451) output = StringIO() - write_CIF(cif, output) + cif.write_cif(output) output.seek(0) pdbfile2 = read_CIF(output) self.assertEqual(len(pdbfile2.atoms), 451) @@ -1481,7 +1491,7 @@ def test_cif_write_standard_names(self): """ Test PDBx/mmCIF file writing converting to standard names """ parm = formats.load_file(get_fn('trx.prmtop'), get_fn('trx.inpcrd')) output = StringIO() - write_CIF(parm, output, standard_resnames=True) + parm.write_cif(output, standard_resnames=True) output.seek(0) pdb = read_CIF(output) for res in pdb.residues: From 83b5029134301735d120c2b20c6c9fba6c2a5250 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 13:46:23 -0500 Subject: [PATCH 08/62] Deprecate write_PDB and write_CIF and bump version. --- parmed/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/parmed/__init__.py b/parmed/__init__.py index 2e2103072..31beb8479 100644 --- a/parmed/__init__.py +++ b/parmed/__init__.py @@ -6,7 +6,7 @@ # Version format should be "major.minor.patch". For beta releases, attach # "-beta#" to the end. The beta number will be turned into another number in the # version tuple -__version__ = '2.1.7' +__version__ = '2.1.8' __author__ = 'Jason Swails' __all__ = ['exceptions', 'periodic_table', 'residue', 'unit', 'utils', @@ -23,11 +23,12 @@ from parmed import formats from parmed.vec3 import Vec3 from parmed.parameters import ParameterSet +from parmed.utils.decorators import deprecated as _deprecated load_file = formats.load_file read_PDB = formats.PDBFile.parse read_CIF = formats.CIFFile.parse -write_PDB = formats.PDBFile.write -write_CIF = formats.CIFFile.write +write_PDB = _deprecated(formats.PDBFile.write) +write_CIF = _deprecated(formats.CIFFile.write) load_rosetta = rosetta.RosettaPose.load download_PDB = formats.PDBFile.download From 040516abc4dc668066c5cfa69e4c652548215a35 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 13:55:37 -0500 Subject: [PATCH 09/62] Update docs to avoid using examples with deprecated functions and clarify some of the dev. docs --- doc/devdoc.rst | 26 +++++++++++++------------- doc/index.rst | 4 ++-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/devdoc.rst b/doc/devdoc.rst index 0f63add6c..0e4a00de2 100644 --- a/doc/devdoc.rst +++ b/doc/devdoc.rst @@ -23,9 +23,9 @@ is clearly not being run, or not being run correctly (which means there is no way that your test could prevent a breakage in the future). Once you have a failing test case, write code until the test case passes. Then -add more test until the test case fails again. Then update the test case until -it fails again. Rinse-and-repeat until the functionality you are adding is -complete. +add more test until the test case fails again. Then update the code until the +test passes again. Rinse-and-repeat until the functionality you are adding is +complete and fully-tested. Coding Style ------------ @@ -40,7 +40,7 @@ the following I consider very important (and will block any PRs): - Please make sure comments and docstrings are written in English - Use only absolute imports or *explicit* relative imports - Always use ``print`` as a function (via the ``print_function`` futures - import) + import) -- see below for why this is a hard requirement. Things I would like to see, but are not as important: @@ -62,8 +62,8 @@ package, and all components should be imported from there. In particular, the ``range`` and ``zip`` builtins should be imported from ``parmed.utils.six.moves`` rather than relying on the standard versions. This is because in Python 3, ``range`` and ``zip`` return efficient iterators, while in -Python 2 they return (sometimes *very* inefficient lists). The Python -2-equivalent versions of the ``range`` and ``zip`` iterators are ``xrange`` and +Python 2 they return potentially inefficient lists. The Python 2-equivalent +versions of the ``range`` and ``zip`` iterators are ``xrange`` and ``itertools.izip``, respectively, which are the *actual* functions defined within ``parmed.utils.six.moves`` for Python 2. @@ -108,14 +108,14 @@ Obviously in this case, ``test_parmed_structure.py`` is replaced with whichever test module you are working on. You can select *specific* tests using the ``-m`` flag specifying a regex that matches the test case method. For example:: - nosetests -vs test/test_parmed_structure.py -m AddAtom + nosetests -vs test/test_parmed_structure.py -m add_atom -will test both the ``tesAddAtom`` and ``testAddAtomToResidue`` methods. This is -an easy way to run tests quickly while working on new methods *without* having -to run ``python setup.py install`` after every change. Note that when you run -tests from the root ParmEd directory, however, the imported ParmEd repository -will not have any Python extensions installed (meaning that the tests relying on -them -- like the test for the Amber optimized reader -- will fail). +will test both the ``test_add_atom`` and ``test_add_atom_to_residue`` methods. +This is an easy way to run tests quickly while working on new methods *without* +having to run ``python setup.py install`` after every change. Note that when you +run tests from the root ParmEd directory, however, the imported ParmEd +repository will not have any Python extensions installed (meaning that the tests +relying on them -- like the test for the Amber optimized reader -- will fail). ParmEd utilizes the Travis continuous integration server to perform automatic tests of all pull requests. Tests generally must pass these tests before being diff --git a/doc/index.rst b/doc/index.rst index fb2f4faf4..0735ccd2d 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -151,9 +151,9 @@ A simple example demonstrating the file conversion capabilities is to convert a PDBx/mmCIF file into the more commonly supported PDB format:: >>> import parmed as pmd - >>> pmd.write_PDB(pmd.download_CIF('4lzt'), '4lzt.pdb') + >>> pmd.download_CIF('4lzt').save('4lzt.pdb') >>> # Now read in the PDB file we just created - ... pmd.read_PDB('4lzt.pdb') + ... pmd.load_file('4lzt.pdb') Program and API Reference From 08392261c848ad0ba63ea0c4923138b4fc9bcdc1 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 13:58:54 -0500 Subject: [PATCH 10/62] Do not swamp the output with all of the short test time taken... --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3a90a2bf0..d2e67c1a0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,4 +36,4 @@ script: - cd test - echo "Using `which nosetests`::" - which nosetests - - nosetests -vs --with-timer --timer-ok=5s --timer-warning=12s . + - nosetests -vs --with-timer --timer-ok=5s --timer-warning=12s --timer-filter=warning,error . From 36bdc9f870382839c53dbf5b2c166788a938f4af Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 20:18:03 -0500 Subject: [PATCH 11/62] Add a test for custom exceptions in ChamberParm (which is the only amber prmtop type that can handle arbitrary exception rules). Does not currently pass. --- test/test_format_conversions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_format_conversions.py b/test/test_format_conversions.py index 10e88e2b9..8c2e82967 100644 --- a/test/test_format_conversions.py +++ b/test/test_format_conversions.py @@ -110,7 +110,7 @@ def test_chamber(self): relative_error=1e-8) ) - @unittest.skipUnless(False, 'disabled for now') + @unittest.skipUnless(HAS_OPENMM, 'Cannot test without OpenMM') def test_chamber_expanded_exclusions(self): """ Tests converting Gromacs to Chamber parm w/ modified exceptions """ # Now let's modify an exception parameter so that it needs type @@ -144,7 +144,7 @@ def test_chamber_expanded_exclusions(self): acon.setPositions(top.positions) e3 = acon.getState(getEnergy=True).getPotentialEnergy() e3 = e3.value_in_unit(u.kilocalories_per_mole) - self.assertLess(abs(e1 - e3), 1e-2) + self.assertLess(abs(e2 - e3), 1e-2) @unittest.skipUnless(HAS_OPENMM, 'Cannot test without OpenMM') def test_chamber_energies(self): From 32f02c58304a7b51ef82f4b99d737c063a5bed65 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 20:18:58 -0500 Subject: [PATCH 12/62] Fix modified exception handling in ChamberParm --- parmed/amber/_chamberparm.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/parmed/amber/_chamberparm.py b/parmed/amber/_chamberparm.py index 564dfdae3..70bf59f50 100644 --- a/parmed/amber/_chamberparm.py +++ b/parmed/amber/_chamberparm.py @@ -701,16 +701,7 @@ def _set_nonbonded_tables(self, nbfixes=None): if abs(data['LENNARD_JONES_14_ACOEF'][idx] - acoef) > SMALL: # Need to split out another type needed_split = True - if a1.type in atom_types_assigned_unique_idx: - if a2.type in atom_types_assigned_unique_idx: - # Ugh. Split out this atom by itself - mask = '@%d' % (a1.idx + 1) - else: - mask = '@%%%s' % a2.type - atom_types_assigned_unique_idx.add(a2.type) - else: - atom_types_assigned_unique_idx.add(a1.type) - mask = '@%%%s' % a1.type + mask = '@%d' % (a1.idx + 1) addLJType(self, mask, radius_14=0, epsilon_14=0).execute() ntypes += 1 @@ -731,7 +722,6 @@ def _set_nonbonded_tables(self, nbfixes=None): # The following should never happen assert ii <= len(self.atoms), 'Could not resolve all exceptions. ' \ 'Some unexpected problem with the algorithm' - # TODO delete # Now go through and change all None's to 0s, as these terms won't be # used for any exceptions, anyway for i, item in enumerate(data['LENNARD_JONES_14_ACOEF']): From 6b713dc220bb8f95225e64d43a501419f0976206 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 20:46:48 -0500 Subject: [PATCH 13/62] Version bump. --- parmed/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parmed/__init__.py b/parmed/__init__.py index 31beb8479..d33ddbf94 100644 --- a/parmed/__init__.py +++ b/parmed/__init__.py @@ -6,7 +6,7 @@ # Version format should be "major.minor.patch". For beta releases, attach # "-beta#" to the end. The beta number will be turned into another number in the # version tuple -__version__ = '2.1.8' +__version__ = '2.1.9' __author__ = 'Jason Swails' __all__ = ['exceptions', 'periodic_table', 'residue', 'unit', 'utils', From b4c78abc06cfb27f737a603f2cd40ef435fd41c7 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 21:00:09 -0500 Subject: [PATCH 14/62] Add a couple tests to bring coverage of _chamberparm.py to 100% --- test/test_format_conversions.py | 3 +++ test/test_parmed_amber.py | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/test/test_format_conversions.py b/test/test_format_conversions.py index 8c2e82967..8df2eab6c 100644 --- a/test/test_format_conversions.py +++ b/test/test_format_conversions.py @@ -109,6 +109,9 @@ def test_chamber(self): diff_files(fn, get_saved_fn('1aki.charmm27_fromgmx.parm7'), relative_error=1e-8) ) + parm.fill_LJ() + self.assertTrue(0 in parm.LJ_14_radius) + self.assertTrue(0 in parm.LJ_14_depth) @unittest.skipUnless(HAS_OPENMM, 'Cannot test without OpenMM') def test_chamber_expanded_exclusions(self): diff --git a/test/test_parmed_amber.py b/test/test_parmed_amber.py index 9d1f6c9e0..42a72ebcd 100644 --- a/test/test_parmed_amber.py +++ b/test/test_parmed_amber.py @@ -330,7 +330,14 @@ def test_chamber_gas_parm(self): self._extensive_checks(parm) self.assertTrue(parm.chamber) self.assertTrue(parm.has_cmap) + self.assertFalse(parm.amoeba) self.assertEqual(parm.ptr('ifbox'), 0) + # Make sure that a corrupted data section is properly caught + fmt = readparm.AmberFormat(get_fn('ala_ala_ala.parm7')) + del fmt.parm_data['CHARMM_UREY_BRADLEY'][-1] + self.assertRaises(AmberError, lambda: + readparm.ChamberParm.from_rawdata(fmt) + ) def test_chamber_solv_parm(self): """ Test the ChamberParm class with a periodic prmtop """ From 4dbb6d9dd6741469a528fe7e912c84ccaf6368d5 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 21:01:20 -0500 Subject: [PATCH 15/62] Remove extra variable. --- parmed/amber/_chamberparm.py | 1 - 1 file changed, 1 deletion(-) diff --git a/parmed/amber/_chamberparm.py b/parmed/amber/_chamberparm.py index 70bf59f50..651f7966d 100644 --- a/parmed/amber/_chamberparm.py +++ b/parmed/amber/_chamberparm.py @@ -684,7 +684,6 @@ def _set_nonbonded_tables(self, nbfixes=None): for i in range(len(data['LENNARD_JONES_14_ACOEF'])): data['LENNARD_JONES_14_ACOEF'][i] = None data['LENNARD_JONES_14_BCOEF'][i] = None - atom_types_assigned_unique_idx = set() ii = 0 while True: needed_split = False From b0ff2b0e4ea6d79862d998dcbd101fa22989a32a Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 19 Jan 2016 21:30:05 -0500 Subject: [PATCH 16/62] Add a few AmberParm tests. --- test/test_parmed_amber.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/test_parmed_amber.py b/test/test_parmed_amber.py index 42a72ebcd..ece4d4a8e 100644 --- a/test/test_parmed_amber.py +++ b/test/test_parmed_amber.py @@ -141,9 +141,12 @@ def test_load_parm(self): self.assertIs(parm.view_as(readparm.AmberParm), parm) for key in parm.parm_data: self.assertEqual(parm.parm_data[key], parm2.parm_data[key]) + parm.box = [2*u.nanometer, 2*u.nanometer, 2*u.nanometer, + math.pi/2*u.radian, math.pi/2*u.radian, math.pi/2*u.radian] + np.testing.assert_allclose(parm.box, [20, 20, 20, 90, 90, 90]) # Now check that the box info is set properly - crd3 = load_file(get_fn('solv.rst7')) - parm3 = readparm.LoadParm(get_fn('solv.prmtop'), xyz=crd3.coordinates) + crd3 = load_file(get_fn('solv2.rst7')) + parm3 = readparm.LoadParm(get_fn('solv2.parm7'), xyz=crd3.coordinates) np.testing.assert_equal(parm3.box[:3], parm3.parm_data['BOX_DIMENSIONS'][1:]) self.assertEqual(parm3.box[3], parm3.parm_data['BOX_DIMENSIONS'][0]) @@ -687,7 +690,7 @@ def test_amber_parm_box_xyz_args(self): np.testing.assert_allclose(parm2.velocities, parm.velocities) np.testing.assert_allclose(parm2.box, parm.box) - @unittest.skipIf(not HAS_GROMACS, 'Cannot test without Gromacs') + @unittest.skipUnless(HAS_GROMACS, 'Cannot test without Gromacs') def test_amber_parm_from_structure(self): """ Tests AmberParm.from_structure """ aparm = load_file(get_fn('ash.parm7'), get_fn('ash.rst7')) @@ -762,6 +765,9 @@ def test_amber_parm_from_structure(self): self.assertEqual(parm.dihedral_types[0].phi_k, 0) self.assertEqual(parm.dihedral_types[0].phase, tmp.dihedral_types[0][0].phase) + def assign_box_badly(): + readparm.AmberParm(get_fn('ash.parm7')).box = [1, 2, 3, 4] + self.assertRaises(ValueError, assign_box_badly) def test_old_parm_format(self): """ Test reading old Amber prmtop file format """ From 160fd511ef86c2d864a407d705dce5aac28fdce9 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Wed, 20 Jan 2016 09:11:09 -0500 Subject: [PATCH 17/62] Add tests for CPreProcessor class, as well as a test for context manager --- test/test_parmed_gromacs_cpp.py | 44 +++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/test/test_parmed_gromacs_cpp.py b/test/test_parmed_gromacs_cpp.py index 5f747875a..17241be9a 100644 --- a/test/test_parmed_gromacs_cpp.py +++ b/test/test_parmed_gromacs_cpp.py @@ -23,9 +23,18 @@ def test_ifdef(self): pp = CPreProcessor(f) # no defines self.assertEqual(pp.read().strip(), 'MY_DEFINE is not set') f.seek(0) + self.assertEqual(f.tell(), 0) + self.assertEqual(pp.tell(), 0) pp = CPreProcessor(f, defines=dict(MY_DEFINE='SUCCESS')) self.assertEqual(pp.read().strip(), 'PPVAR is set to SUCCESS') + def test_not_implemented(self): + """ Test error catching for PP features not implemented """ + f = StringIO('#define MYVAR 1\n#if (MYVAR == 1)\nCORRECT\n#endif') + pp = CPreProcessor(f) + self.assertRaises(NotImplementedError, lambda: pp.seek(10)) + self.assertRaises(NotImplementedError, pp.read) + def test_ifndef(self): """ Tests CPreProcessor #ifndef/#else#endif preprocessing """ f = StringIO('#ifndef MY_DEFINE\nMY_DEFINE is not set\n' @@ -123,6 +132,23 @@ def test_nested_ifs(self): f.seek(0) pp = CPreProcessor(f, defines=dict(MY_VAR=1)) self.assertEqual(pp.read().strip(), "line 1\nline 2") + f = StringIO(""" +#ifdef MY_VAR +# ifndef MY_VAR_2 +MY_VAR defined... MY_VAR_2 not +# else +MY_VAR defined... MY_VAR_2 also +# endif +#endif +""") + pp = CPreProcessor(f) + self.assertEqual(pp.read().strip(), '') + f.seek(0) + pp = CPreProcessor(f, defines=dict(MY_VAR=1)) + self.assertEqual(pp.read().strip(), '1 defined... MY_VAR_2 not') + f.seek(0) + pp = CPreProcessor(f, defines=dict(MY_VAR=1, MY_VAR_2=2)) + self.assertEqual(pp.read().strip(), '1 defined... 2 also') def test_simple_include(self): """ Tests CPreProcessor simple #include directive """ @@ -178,6 +204,24 @@ def test_nested_defines(self): pp = CPreProcessor(f) self.assertEqual(pp.read().strip(), 'replace1') + def test_close(self): + """ Test closing file object before deleting it """ + pp = CPreProcessor(get_fn('pptest1/pptest1.h')) + pp.close() + del pp + + def test_context_manager(self): + """ Test using CPreProcessor in a context manager """ + with CPreProcessor(get_fn('pptest2/pptest1.h')) as pp: + self.assertEqual(pp.read().strip(), """\ +pptest1 line 1 +pptest2 line 1 +pptest3 line 1 +pptest1 line 2 +pptest1 line 3 +pptest3 line 1 +pptest1 line 4""") + def test_bad_ifdef(self): """ Tests CPreProcessor error processing of bad #ifdef/#ifndef """ f = StringIO("#ifdef\n#endif") From 7d5acb1e4a3c40d38ac5945291f617584eb097f2 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Wed, 20 Jan 2016 09:11:30 -0500 Subject: [PATCH 18/62] Implement the context manager in CPreProcessor --- parmed/gromacs/_cpp.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/parmed/gromacs/_cpp.py b/parmed/gromacs/_cpp.py index fe5bbb406..89c6e68f1 100644 --- a/parmed/gromacs/_cpp.py +++ b/parmed/gromacs/_cpp.py @@ -328,6 +328,13 @@ def _pp_undef(self, args): elif len(words) == 0: raise PreProcessorError('Nothing defined in #undef') + # Context manager protocol + def __exit__(self, type, value, traceback): + self.close() + + def __enter__(self): + return self + _ppcmdmap = {'if' : _pp_if, 'elif' : _pp_elif, 'ifdef' : _pp_ifdef, 'else' : _pp_else, 'define' : _pp_define, 'undef' : _pp_undef, 'include' : _pp_include, 'endif' : _pp_endif, From 7babc45b461327eb6aa4ad718e6990e10c6ecf07 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Wed, 20 Jan 2016 15:33:39 -0500 Subject: [PATCH 19/62] Add a test to work out the scripts in ParmEd, then add some CL script test cases for the parmed/gromacs/_cpp module. --- parmed/gromacs/_cpp.py | 8 +++- test/files/saved_scripts/cpptest1 | 7 ++++ test/files/saved_scripts/cpptest2 | 7 ++++ test/run_scripts.sh | 64 +++++++++++++++++++++++++++++++ test/test_parmed_gromacs_cpp.py | 62 +++++++++++++++++++++++++----- 5 files changed, 136 insertions(+), 12 deletions(-) create mode 100644 test/files/saved_scripts/cpptest1 create mode 100644 test/files/saved_scripts/cpptest2 create mode 100755 test/run_scripts.sh diff --git a/parmed/gromacs/_cpp.py b/parmed/gromacs/_cpp.py index 89c6e68f1..96e621966 100644 --- a/parmed/gromacs/_cpp.py +++ b/parmed/gromacs/_cpp.py @@ -347,7 +347,7 @@ def __enter__(self): parser = argparse.ArgumentParser() parser.add_argument('-i', '--input-file', dest='input', metavar='FILE', required=True, help='''Input file to pre-process. Either a file - name or, if '--' is given, from standard input.''') + name or, if '-' is given, from standard input.''') parser.add_argument('-o', '--output-file', dest='output', metavar='FILE', default=None, help='''Output file with preprocessed results. Default is standard output''') @@ -368,15 +368,19 @@ def __enter__(self): val = '1' defines[define] = val - if opt.input == '--': + if opt.input == '-': f = sys.stdin else: f = opt.input pp = CPreProcessor(f, defines=defines, includes=opt.includes) if opt.output is None: output = sys.stdout + own_handle = False else: output = genopen(opt.output, 'w') + own_handle = True for line in pp: output.write(line) + if own_handle: + output.close() diff --git a/test/files/saved_scripts/cpptest1 b/test/files/saved_scripts/cpptest1 new file mode 100644 index 000000000..777ebf515 --- /dev/null +++ b/test/files/saved_scripts/cpptest1 @@ -0,0 +1,7 @@ +pptest1 line 1 +pptest2 line 1 +pptest3 line 1 +pptest2 line 2 +pptest1 line 2 +pptest3 line 1 +pptest1 line 3 diff --git a/test/files/saved_scripts/cpptest2 b/test/files/saved_scripts/cpptest2 new file mode 100644 index 000000000..bbe027866 --- /dev/null +++ b/test/files/saved_scripts/cpptest2 @@ -0,0 +1,7 @@ +REPLACED 1 1 +pptest2 1 1 +pptest3 1 1 +pptest2 1 2 +REPLACED 1 2 +pptest3 1 1 +REPLACED 1 3 diff --git a/test/run_scripts.sh b/test/run_scripts.sh new file mode 100755 index 000000000..bb5fa2d92 --- /dev/null +++ b/test/run_scripts.sh @@ -0,0 +1,64 @@ +#!/bin/sh + +if [ -z "`which coverage 2>/dev/null`" ]; then + run_cmd="python" + has_coverage="no" + echo "No coverage module found..." +else + run_cmd="coverage run --parallel-mode --source=parmed" + has_coverage="yes" + echo "coverage found and will be used..." +fi + +old_pwd=`pwd` +cd `dirname $0` +/bin/rm -fr files/writes +/bin/mkdir -p files/writes +errors=0 +failures=0 + +evaluate_test() { + if [ $1 -ne 0 ]; then + echo "ERROR" + errors=`python -c "print($errors + 1)"` + else + diff files/saved_scripts/$2 files/writes/$2 > /dev/null 2>&1 + if [ $? -ne 0 ]; then + failures=`python -c "print($failures + 1)"` + echo "FAILED" + else + echo "PASSED" + fi + fi +} +###### TESTS ###### +printf "Running test python -m parmed.gromacs._cpp test 1..." +$run_cmd -m parmed.gromacs._cpp -i files/pptest1/pptest1.h > files/writes/cpptest1 +evaluate_test $? cpptest1 + +printf "Running test python -m parmed.gromacs._cpp test 2..." +$run_cmd -m parmed.gromacs._cpp -i files/pptest1/pptest1.h \ + -Dline -Dpptest1=REPLACED -o files/writes/cpptest2 +evaluate_test $? cpptest2 + +printf "Running test python -m parmed.gromacs._cpp test 3..." +$run_cmd -m parmed.gromacs._cpp -i - < files/pptest1/pptest1.h \ + -Ifiles/pptest1 > files/writes/cpptest1 || exit +evaluate_test $? cpptest1 +###### END TESTS ###### + +if [ "$has_coverage" = "yes" ]; then + coverage combine .coverage* + echo "Coverage data combined. Run 'coverage report' to get the report" +fi + +# Clean up if everything passed +if [ $failures -eq 0 ]; then + /bin/rm -fr files/writes +fi +cd "$old_pwd" + +if [ $failures -gt 0 -o $errors -gt 0 ]; then + exit 1 +fi +exit 0 diff --git a/test/test_parmed_gromacs_cpp.py b/test/test_parmed_gromacs_cpp.py index 17241be9a..1bd0aff6a 100644 --- a/test/test_parmed_gromacs_cpp.py +++ b/test/test_parmed_gromacs_cpp.py @@ -34,6 +34,9 @@ def test_not_implemented(self): pp = CPreProcessor(f) self.assertRaises(NotImplementedError, lambda: pp.seek(10)) self.assertRaises(NotImplementedError, pp.read) + f = StringIO('#ifdef MYVAR\n#elif defined(NOTMYVAR)\n#else\nline\#endif') + pp = CPreProcessor(f) + self.assertRaises(NotImplementedError, pp.read) def test_ifndef(self): """ Tests CPreProcessor #ifndef/#else#endif preprocessing """ @@ -56,6 +59,15 @@ def test_define(self): pp = CPreProcessor(f) self.assertEqual(pp.read().strip(), 'MY_DEFINE is not set\nPPVAR is set to SUCCESS') + warnings.filterwarnings('error', category=PreProcessorWarning) + f = StringIO('#define MYVAR something\nMYVAR\n#define MYVAR ' + 'something_else\nMYVAR') + with CPreProcessor(f) as pp: + self.assertRaises(PreProcessorWarning, pp.read) + warnings.filterwarnings('ignore', category=PreProcessorWarning) + f.seek(0) + with CPreProcessor(f) as pp: + self.assertEqual(pp.read().strip(), 'something\nsomething_else') def test_undef(self): """ Tests CPreProcessor #undef preprocessing """ @@ -64,6 +76,11 @@ def test_undef(self): "#undef MY_DEFINE\nMY_DEFINE\n#undef NO_VARIABLE\n") pp = CPreProcessor(f) self.assertEqual(pp.read().strip(), "MY_DEFINE\nChanged\nMY_DEFINE") + # Make sure undef does not occur where it shouldn't + f = StringIO('#define MYVAR something\n#ifdef NOVAR\n#undef MYVAR\n' + '#endif\nMYVAR') + with CPreProcessor(f) as pp: + self.assertEqual(pp.read().strip(), 'something') def test_multiword_define(self): """ Tests CPreProcessor #define with multiple words """ @@ -210,6 +227,13 @@ def test_close(self): pp.close() del pp + def test_warnings(self): + """ Test CPreProcessor warnings """ + warnings.filterwarnings('error', category=PreProcessorWarning) + f = StringIO('#ifndef MYVAR extra tokens\nline\n#endif') + with CPreProcessor(f) as f: + self.assertRaises(PreProcessorWarning, f.read) + def test_context_manager(self): """ Test using CPreProcessor in a context manager """ with CPreProcessor(get_fn('pptest2/pptest1.h')) as pp: @@ -225,21 +249,33 @@ def test_context_manager(self): def test_bad_ifdef(self): """ Tests CPreProcessor error processing of bad #ifdef/#ifndef """ f = StringIO("#ifdef\n#endif") - pp = CPreProcessor(f) - self.assertRaises(PreProcessorError, lambda: pp.read()) + with CPreProcessor(f) as pp: + self.assertRaises(PreProcessorError, pp.read) f = StringIO("#ifndef\n#endif") - pp = CPreProcessor(f) - self.assertRaises(PreProcessorError, lambda: pp.read()) + with CPreProcessor(f) as pp: + self.assertRaises(PreProcessorError, pp.read) f = StringIO("#ifdef SOME_VAR\ndangling ifdef\n\n\n") - pp = CPreProcessor(f) - self.assertRaises(PreProcessorError, lambda: pp.read()) + with CPreProcessor(f) as pp: + self.assertRaises(PreProcessorError, pp.read) warnings.filterwarnings('error', category=PreProcessorWarning) f = StringIO("#ifdef SOME_VAR misplaced comments\n#endif\n") - pp = CPreProcessor(f) - self.assertRaises(PreProcessorWarning, lambda: pp.read()) + with CPreProcessor(f) as pp: + self.assertRaises(PreProcessorWarning, pp.read) f = StringIO("#ifdef SOME_VAR\n#endif misplaced comments\n") - pp = CPreProcessor(f) - self.assertRaises(PreProcessorWarning, lambda: pp.read()) + with CPreProcessor(f) as pp: + self.assertRaises(PreProcessorWarning, pp.read) + f = StringIO('#else\nNOVAR\n#endif') + with CPreProcessor(f) as pp: + self.assertRaises(PreProcessorError, pp.read) + f = StringIO('#ifdef MYVAR\nline1\n#else extra tokens\nline2\n#endif') + with CPreProcessor(f) as pp: + self.assertRaises(PreProcessorWarning, pp.read) + f = StringIO('#ifdef MYVAR\nline1\n#else\nline2\n#else\nline3\n#endif') + with CPreProcessor(f) as pp: + self.assertRaises(PreProcessorError, pp.read) + f = StringIO('#endif\nline1\nline2') + with CPreProcessor(f) as pp: + self.assertRaises(PreProcessorError, pp.read) def test_bad_define_undef(self): """ Tests CPreProcessor error processing of bad #define/#undef """ @@ -263,3 +299,9 @@ def test_missing_include(self): f.seek(0) pp = CPreProcessor(f, notfound_fatal=False) self.assertRaises(PreProcessorWarning, lambda: pp.read()) + + def test_bad_include(self): + """ Tests bad #include syntax in CPreProcessor """ + f = StringIO('#include bad syntax gremlin\nline 1') + with CPreProcessor(f) as pp: + self.assertRaises(PreProcessorError, pp.read) From 847ad8c050227cbb5120116882602eaf36ee7e33 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Wed, 20 Jan 2016 15:36:19 -0500 Subject: [PATCH 20/62] Add coverage report. --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d2e67c1a0..191d6757f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,4 +36,6 @@ script: - cd test - echo "Using `which nosetests`::" - which nosetests - - nosetests -vs --with-timer --timer-ok=5s --timer-warning=12s --timer-filter=warning,error . + - nosetests -vs --with-timer --timer-ok=5s --timer-warning=12s --timer-filter=warning,error --with-coverage --cover-package=parmed . + - ./run_scripts.sh + - coverage report -m From 53002065f9e6a303ca45ee77edbd96e4ba2ff667 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Wed, 20 Jan 2016 20:54:39 -0500 Subject: [PATCH 21/62] Fix up a docstring, fix some small issues in GromacsFile helper class, and add required test cases to bring coverage of that module up to 100% --- parmed/gromacs/_gromacsfile.py | 12 +++++----- test/test_parmed_gromacs.py | 42 ++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/parmed/gromacs/_gromacsfile.py b/parmed/gromacs/_gromacsfile.py index a275c3401..e42ef4173 100644 --- a/parmed/gromacs/_gromacsfile.py +++ b/parmed/gromacs/_gromacsfile.py @@ -19,8 +19,8 @@ class GromacsFile(object): Parameters ---------- - fname : str - Name of the file to parse + fname : str or file-like + Name of the file to parse or file-like object to parse defines : dict{str : str}, optional List of defines for the preprocessed file, if any includes : list of str, optional @@ -47,13 +47,13 @@ def __iter__(self): if not parts: yield '%s\n' % line[:idx] else: - parts.append(line) + parts.append('%s' % line[:idx]) yield '%s\n' % ''.join(parts) parts = [] except ValueError: # There is no comment... if line.rstrip('\r\n').endswith('\\'): - chars = list(reversed(line)) + chars = list(reversed(line.rstrip('\r\n'))) del chars[chars.index('\\')] parts.append(''.join(reversed(chars))) elif parts: @@ -78,12 +78,12 @@ def readline(self): if not parts: return '%s\n' % line[:idx] else: - parts.append(line) + parts.append('%s' % line[:idx]) return '%s\n' % ''.join(parts) except ValueError: # There is no comment... if line.rstrip('\r\n').endswith('\\'): - chars = list(reversed(line)) + chars = list(reversed(line.rstrip('\r\n'))) del chars[chars.index('\\')] parts.append(''.join(reversed(chars))) elif parts: diff --git a/test/test_parmed_gromacs.py b/test/test_parmed_gromacs.py index 6eea05ce5..fc08cb4af 100644 --- a/test/test_parmed_gromacs.py +++ b/test/test_parmed_gromacs.py @@ -5,6 +5,7 @@ from parmed import load_file, Structure, ExtraPoint, DihedralTypeList from parmed.exceptions import GromacsWarning from parmed.gromacs import GromacsTopologyFile, GromacsGroFile +from parmed.gromacs._gromacsfile import GromacsFile from parmed import gromacs as gmx from parmed.topologyobjects import _UnassignedAtomType from parmed.utils.six.moves import range, zip, StringIO @@ -126,6 +127,47 @@ def test_charmm27_top(self): 'charmm27.ff/ions.itp']) self._charmm27_checks(top) + def test_gromacs_file(self): + """ Test GromacsFile helper class """ + f = StringIO('This is the first line \\\n this is still the first line' + '\nThis is the second line') + gf = GromacsFile(f) + self.assertEqual(gf.readline(), 'This is the first line this is ' + 'still the first line\n') + self.assertEqual(gf.readline(), 'This is the second line') + self.assertEqual(gf.readline(), '') + f.seek(0) + lines = [line for line in gf] + self.assertEqual(lines[0], 'This is the first line this is ' + 'still the first line\n') + self.assertEqual(lines[1], 'This is the second line') + + # Try with comments now + f = StringIO('This is the first line \\\n this is still the first line' + ' ; and this is a comment\nThis is the second line ; and ' + 'this is also a comment') + gf = GromacsFile(f) + self.assertEqual(gf.readline(), 'This is the first line this is still' + ' the first line \n') + self.assertEqual(gf.readline(), 'This is the second line \n') + f.seek(0) + lines = [line for line in gf] + self.assertEqual(lines[0], 'This is the first line this is still' + ' the first line \n') + self.assertEqual(lines[1], 'This is the second line \n') + f.seek(0) + lines = gf.readlines() + self.assertEqual(lines[0], 'This is the first line this is still' + ' the first line \n') + self.assertEqual(lines[1], 'This is the second line \n') + f.seek(0) + self.assertEqual(gf.read(), 'This is the first line this is still' + ' the first line \nThis is the second line \n') + + # Error handling + self.assertRaises(IOError, lambda: + GromacsFile('some_file that does_not exist')) + def test_write_charmm27_top(self): """ Tests writing a Gromacs topology file with CHARMM 27 FF """ top = load_file(get_fn('1aki.charmm27.top')) From d439beff076a76cacf793bf890e2517fafa94fdb Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Wed, 20 Jan 2016 20:57:46 -0500 Subject: [PATCH 22/62] Version bump --- parmed/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parmed/__init__.py b/parmed/__init__.py index d33ddbf94..4bc371a18 100644 --- a/parmed/__init__.py +++ b/parmed/__init__.py @@ -6,7 +6,7 @@ # Version format should be "major.minor.patch". For beta releases, attach # "-beta#" to the end. The beta number will be turned into another number in the # version tuple -__version__ = '2.1.9' +__version__ = '2.1.10' __author__ = 'Jason Swails' __all__ = ['exceptions', 'periodic_table', 'residue', 'unit', 'utils', From 1b2feacb9c097f37c54eaa8e4a00a8799710dc96 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Thu, 21 Jan 2016 11:14:13 -0500 Subject: [PATCH 23/62] A little overhaul on Travis-CI setup. Move test script to a separate script called from .travis.yml and stop looking at coverage on pypy, since performance is horrific (4x longer when using coverage). --- .travis.yml | 17 +---------------- devtools/travis-ci/install.sh | 2 +- devtools/travis-ci/runtest.sh | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 17 deletions(-) create mode 100644 devtools/travis-ci/runtest.sh diff --git a/.travis.yml b/.travis.yml index 191d6757f..10cf63081 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,6 @@ addons: packages: - g++ - gromacs - - pypy matrix: include: @@ -24,18 +23,4 @@ install: - python setup.py install script: - # Skip tests that use a lot of memory so Travis doesn't sporadically kill - # them. Also fix the number of running threads to 1. - - export PARMED_SKIP_BIG_TESTS=1 - - export OPENMM_CPU_THREADS=1 - - echo "Checking parmed source with pyflakes linter" - - if [ "$PYTHON_VERSION" = "pypy" ]; then export PYENV_ROOT="${HOME}/.pyenv"; fi - - if [ "$PYTHON_VERSION" = "pypy" ]; then export PATH="${PYENV_ROOT}/bin:${PATH}"; fi - - if [ "$PYTHON_VERSION" = "pypy" ]; then eval "$(pyenv init -)"; fi - - devtools/travis-ci/pyflakes_check.sh - - cd test - - echo "Using `which nosetests`::" - - which nosetests - - nosetests -vs --with-timer --timer-ok=5s --timer-warning=12s --timer-filter=warning,error --with-coverage --cover-package=parmed . - - ./run_scripts.sh - - coverage report -m + - source devtools/travis-ci/runtests.sh diff --git a/devtools/travis-ci/install.sh b/devtools/travis-ci/install.sh index f9c5192b6..bc2b834a0 100755 --- a/devtools/travis-ci/install.sh +++ b/devtools/travis-ci/install.sh @@ -7,7 +7,7 @@ if [ "$PYTHON_VERSION" = "pypy" ]; then pyenv install pypy-4.0.1 pyenv global pypy-4.0.1 - pypy -m pip install nose coverage pyflakes nose-timer + pypy -m pip install nose pyflakes nose-timer which pyflakes pypy -m pip install --user git+https://bitbucket.org/pypy/numpy.git else # Otherwise, CPython... go through conda diff --git a/devtools/travis-ci/runtest.sh b/devtools/travis-ci/runtest.sh new file mode 100644 index 000000000..9715c2208 --- /dev/null +++ b/devtools/travis-ci/runtest.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +echo "Checking parmed source with pyflakes linter" +if [ "$PYTHON_VERSION" = "pypy" ]; then + export PYENV_ROOT="${HOME}/.pyenv" + export PATH="${PYENV_ROOT}/bin:${PATH}" + eval "$(pyenv init -)" +fi +sh devtools/travis-ci/pyflakes_check.sh +cd test +echo "Using nosetests...:" +which nosetests +if [ "$PYTHON_VERSION" = "pypy" ]; then + # Disable coverage with pyflakes, since it multiplies the time taken by 6 or + # something ridiculous like that + nosetests -vs --with-timer --timer-ok=5s --timer-warning=12s \ + --timer-filter=warning,error . +else + nosetests -vs --with-timer --timer-ok=5s --timer-warning=12s \ + --timer-filter=warning,error --with-coverage \ + --cover-package=parmed . +fi +./run_scripts.sh +coverage report -m From d8f3b14292cd8bc82a3a23b345982a2e27ae61d9 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Thu, 21 Jan 2016 11:23:58 -0500 Subject: [PATCH 24/62] Fix minor issue with GromacsFile, fix processing of velocities from GRO files if they exist, and add tests for the relevant changes. --- parmed/gromacs/_gromacsfile.py | 4 +- parmed/gromacs/gromacsgro.py | 89 +++++++++++++++++++++++----------- test/test_parmed_gromacs.py | 50 ++++++++++++++++--- 3 files changed, 105 insertions(+), 38 deletions(-) diff --git a/parmed/gromacs/_gromacsfile.py b/parmed/gromacs/_gromacsfile.py index e42ef4173..cd829d4d9 100644 --- a/parmed/gromacs/_gromacsfile.py +++ b/parmed/gromacs/_gromacsfile.py @@ -55,7 +55,7 @@ def __iter__(self): if line.rstrip('\r\n').endswith('\\'): chars = list(reversed(line.rstrip('\r\n'))) del chars[chars.index('\\')] - parts.append(''.join(reversed(chars))) + parts.append('%s ' % ''.join(reversed(chars))) elif parts: parts.append(line) yield ''.join(parts) @@ -85,7 +85,7 @@ def readline(self): if line.rstrip('\r\n').endswith('\\'): chars = list(reversed(line.rstrip('\r\n'))) del chars[chars.index('\\')] - parts.append(''.join(reversed(chars))) + parts.append('%s ' % ''.join(reversed(chars))) elif parts: parts.append(line) return ''.join(parts) diff --git a/parmed/gromacs/gromacsgro.py b/parmed/gromacs/gromacsgro.py index fd40db108..bc130580a 100644 --- a/parmed/gromacs/gromacsgro.py +++ b/parmed/gromacs/gromacsgro.py @@ -18,6 +18,56 @@ from parmed.utils.io import genopen from parmed.utils.six import add_metaclass, string_types +class _AtomLineParser(object): + """ Parses atom lines from GRO files """ + def __init__(self): + self._digits = None + self._pdeci = 0 + self._ndeci = 0 + + def read(self, line): + """ Reads a line + + Parameters + ---------- + line : str + A line with an atom record from a GRO file + + Returns + ------- + atom, resname, resnum : Atom, str, int + The Atom instance, residue name, and residue number containing the + atom + """ + resnum = int(line[:5]) + resname = line[5:10].strip() + atomname = line[10:15].strip() + elem = element_by_name(atomname) + atomic_number = AtomicNum[elem] + mass = Mass[elem] + atnum = int(line[15:20]) + if atomic_number == 0: + atom = ExtraPoint(name=atomname, number=atnum) + else: + atom = Atom(atomic_number=atomic_number, name=atomname, + number=atnum, mass=mass) + if self._digits is None: + self._pdeci = line.index('.', 20) + self._ndeci = line.index('.', self._pdeci+1) + self._digits = self._ndeci - self._pdeci + atom.xx, atom.xy, atom.xz = ( + float(line[20+i*self._digits:20+(i+1)*self._digits])*10 + for i in range(3) + ) + wbeg = 20 + self._digits * 3 + wend = wbeg + self._digits + if line[wbeg:wend].strip(): + atom.vx, atom.vy, atom.vz = ( + float(line[wbeg+i*self._digits:wend+i*self._digits])*10 + for i in range(3) + ) + return atom, resname, resnum + @add_metaclass(FileFormatType) class GromacsGroFile(object): """ Parses and writes Gromacs GRO files """ @@ -100,42 +150,23 @@ def parse(filename): except ValueError: raise GromacsError('Could not parse %s as GRO file' % filename) digits = None + line_parser = _AtomLineParser() for i, line in enumerate(fileobj): if i == natom: break try: - resnum = int(line[:5]) - resname = line[5:10].strip() - atomname = line[10:15].strip() - elem = element_by_name(atomname) - atomic_number = AtomicNum[elem] - mass = Mass[elem] - atnum = int(line[15:20]) - if atomic_number == 0: - atom = ExtraPoint(name=atomname, number=atnum) - else: - atom = Atom(atomic_number=atomic_number, name=atomname, - number=atnum, mass=mass) - if digits is None: - pdeci = line.index('.', 20) - ndeci = line.index('.', pdeci+1) - digits = ndeci - pdeci - atom.xx, atom.xy, atom.xz = ( - float(line[20+i*digits:20+(i+1)*digits])*10 - for i in range(3) - ) - i = 4 - wbeg = (pdeci-4)+(5+ndeci)*(i-1) - wend = (pdeci-4)+(5+ndeci)*i - if line[wbeg:wend].strip(): - atom.vx, atom.vy, atom.vz = ( - float(line[(pdeci-3)+(6+ndeci)*i: - (pdeci-3)+(6+ndeci)*(i+1)])*10 - for i in range(3, 6) - ) + atom, resname, resnum = line_parser.read(line) except (ValueError, IndexError): raise GromacsError('Could not parse the atom record of ' 'GRO file %s' % filename) struct.add_atom(atom, resname, resnum) + else: + # If no box exists, the break did not hit, so line still + # contains the last atom (which cannot be interpreted as a box). + # This wipes out line (IFF fileobj reached the line) + line = fileobj.readline() + if i+1 != natom: + raise GromacsError('Truncated GRO file. Found %d of %d ' + 'atoms' % (i+1, natom)) # Get the box from the last line if it's present if line.strip(): try: diff --git a/test/test_parmed_gromacs.py b/test/test_parmed_gromacs.py index fc08cb4af..a38f30691 100644 --- a/test/test_parmed_gromacs.py +++ b/test/test_parmed_gromacs.py @@ -2,6 +2,8 @@ Tests the functionality in the parmed.gromacs package """ import copy +import numpy as np +import os from parmed import load_file, Structure, ExtraPoint, DihedralTypeList from parmed.exceptions import GromacsWarning from parmed.gromacs import GromacsTopologyFile, GromacsGroFile @@ -9,7 +11,6 @@ from parmed import gromacs as gmx from parmed.topologyobjects import _UnassignedAtomType from parmed.utils.six.moves import range, zip, StringIO -import os import unittest from utils import get_fn, diff_files, get_saved_fn, FileIOTestCase, HAS_GROMACS import utils @@ -132,13 +133,13 @@ def test_gromacs_file(self): f = StringIO('This is the first line \\\n this is still the first line' '\nThis is the second line') gf = GromacsFile(f) - self.assertEqual(gf.readline(), 'This is the first line this is ' + self.assertEqual(gf.readline(), 'This is the first line this is ' 'still the first line\n') self.assertEqual(gf.readline(), 'This is the second line') self.assertEqual(gf.readline(), '') f.seek(0) lines = [line for line in gf] - self.assertEqual(lines[0], 'This is the first line this is ' + self.assertEqual(lines[0], 'This is the first line this is ' 'still the first line\n') self.assertEqual(lines[1], 'This is the second line') @@ -147,21 +148,21 @@ def test_gromacs_file(self): ' ; and this is a comment\nThis is the second line ; and ' 'this is also a comment') gf = GromacsFile(f) - self.assertEqual(gf.readline(), 'This is the first line this is still' + self.assertEqual(gf.readline(), 'This is the first line this is still' ' the first line \n') self.assertEqual(gf.readline(), 'This is the second line \n') f.seek(0) lines = [line for line in gf] - self.assertEqual(lines[0], 'This is the first line this is still' + self.assertEqual(lines[0], 'This is the first line this is still' ' the first line \n') self.assertEqual(lines[1], 'This is the second line \n') f.seek(0) lines = gf.readlines() - self.assertEqual(lines[0], 'This is the first line this is still' + self.assertEqual(lines[0], 'This is the first line this is still' ' the first line \n') self.assertEqual(lines[1], 'This is the second line \n') f.seek(0) - self.assertEqual(gf.read(), 'This is the first line this is still' + self.assertEqual(gf.read(), 'This is the first line this is still' ' the first line \nThis is the second line \n') # Error handling @@ -358,6 +359,28 @@ def test_molecule_combine(self): class TestGromacsGro(FileIOTestCase): """ Tests the Gromacs GRO file parser """ + def test_gro_velocities(self): + """ Test parsing and writing GROMACS GRO files with velocities """ + gro = load_file(get_fn('1aki.ff99sbildn.gro')) + self.assertIsInstance(gro, Structure) + vel = np.random.rand(len(gro.atoms), 3) + gro.velocities = vel + fn = get_fn('test.gro', written=True) + gro.save(fn) + self.assertTrue(GromacsGroFile.id_format(fn)) + gro.save(fn, overwrite=True, precision=8) + self.assertTrue(GromacsGroFile.id_format(fn)) + with open(fn) as f: + tmp = GromacsGroFile.parse(f) + np.testing.assert_allclose(vel, tmp.velocities, atol=1e-8) + + def test_gro_detection(self): + """ Tests automatic detection of GROMACS GRO files """ + fn = get_fn('candidate.gro', written=True) + with open(fn, 'w') as f: + f.write('Some title\n 1000\n aISNot a valid format\n') + self.assertFalse(GromacsGroFile.id_format(fn)) + def test_read_gro_file(self): """ Tests reading GRO file """ gro = GromacsGroFile.parse(get_fn('1aki.ff99sbildn.gro')) @@ -401,6 +424,19 @@ def test_write_gro_file(self): self.assertAlmostEqual(gro.box[4], 109.47126278) self.assertAlmostEqual(gro.box[5], 70.52875398) + def test_write_gro_file_nobox(self): + """ Test GROMACS GRO file writing without a box """ + parm = load_file(get_fn('trx.prmtop'), get_fn('trx.inpcrd')) + self.assertIs(parm.box, None) + fn = get_fn('test.gro', written=True) + parm.save(fn) + # Make sure it has a box + gro = load_file(fn) + self.assertIsNot(gro.box, None) + parm.save(fn, nobox=True, overwrite=True) + gro = load_file(fn) + self.assertIs(gro.box, None) + def test_read_write_high_precision_gro_file(self): """ Tests reading/writing high-precision GRO files """ gro = GromacsGroFile.parse(get_fn('1aki.ff99sbildn.gro')) From 2c0c0d9e089a6ade6fee558f616dea31c7227674 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Thu, 21 Jan 2016 11:34:54 -0500 Subject: [PATCH 25/62] Oops... fix name of run script. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 10cf63081..edd29e950 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,4 +23,4 @@ install: - python setup.py install script: - - source devtools/travis-ci/runtests.sh + - source devtools/travis-ci/runtest.sh From d0f3b0cb051bd979d0a3f435ceb54f5e0e3818fc Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Thu, 21 Jan 2016 13:13:41 -0500 Subject: [PATCH 26/62] Improve determination of whether or not to run coverage --- devtools/travis-ci/runtest.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devtools/travis-ci/runtest.sh b/devtools/travis-ci/runtest.sh index 9715c2208..2318e7c14 100644 --- a/devtools/travis-ci/runtest.sh +++ b/devtools/travis-ci/runtest.sh @@ -21,4 +21,4 @@ else --cover-package=parmed . fi ./run_scripts.sh -coverage report -m +test -z `which coverage 2>/dev/null` || coverage report -m From db8a12b29778412e56eef39b4f565e1f7a3411c4 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Thu, 21 Jan 2016 18:18:23 -0500 Subject: [PATCH 27/62] Add gro tests. Coverage of module is now up to 100% --- test/test_parmed_gromacs.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/test/test_parmed_gromacs.py b/test/test_parmed_gromacs.py index a38f30691..d6db9d6a8 100644 --- a/test/test_parmed_gromacs.py +++ b/test/test_parmed_gromacs.py @@ -5,7 +5,7 @@ import numpy as np import os from parmed import load_file, Structure, ExtraPoint, DihedralTypeList -from parmed.exceptions import GromacsWarning +from parmed.exceptions import GromacsWarning, GromacsError from parmed.gromacs import GromacsTopologyFile, GromacsGroFile from parmed.gromacs._gromacsfile import GromacsFile from parmed import gromacs as gmx @@ -380,6 +380,9 @@ def test_gro_detection(self): with open(fn, 'w') as f: f.write('Some title\n 1000\n aISNot a valid format\n') self.assertFalse(GromacsGroFile.id_format(fn)) + self.assertRaises(GromacsError, lambda: GromacsGroFile.parse(fn)) + f = StringIO('Gromacs title line\n notanumber\nsome line\n') + self.assertRaises(GromacsError, lambda: GromacsGroFile.parse(f)) def test_read_gro_file(self): """ Tests reading GRO file """ @@ -402,6 +405,18 @@ def test_read_gro_file(self): # Check atomic number and mass assignment self.assertEqual(gro.atoms[0].atomic_number, 7) self.assertEqual(gro.atoms[0].mass, 14.0067) + fn = get_fn('test.gro', written=True) + # Test bad GRO files + with open(fn, 'w') as wf, open(get_fn('1aki.charmm27.solv.gro')) as f: + for i in range(1000): + wf.write(f.readline()) + self.assertRaises(GromacsError, lambda: GromacsGroFile.parse(fn)) + with open(get_fn('1aki.ff99sbildn.gro')) as f: + lines = f.readlines() + lines[-1] = 'not a legal box line\n' + with open(fn, 'w') as f: + f.write(''.join(lines)) + self.assertRaises(GromacsError, lambda: GromacsGroFile.parse(fn)) def test_write_gro_file(self): """ Tests writing GRO file """ @@ -423,6 +438,7 @@ def test_write_gro_file(self): self.assertAlmostEqual(gro.box[3], 70.52882666) self.assertAlmostEqual(gro.box[4], 109.47126278) self.assertAlmostEqual(gro.box[5], 70.52875398) + self.assertRaises(TypeError, lambda: GromacsGroFile.write(gro, 10)) def test_write_gro_file_nobox(self): """ Test GROMACS GRO file writing without a box """ From c6ef978e669700eac8bd34eebcf93efc605ba725 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Fri, 22 Jan 2016 09:22:51 -0500 Subject: [PATCH 28/62] Add some test files. --- test/files/gmxtops/duplicated_topol.top | 425 ++++++++++++++++++++++++ test/files/gmxtops/missing_atomtype.top | 235 +++++++++++++ 2 files changed, 660 insertions(+) create mode 100644 test/files/gmxtops/duplicated_topol.top create mode 100644 test/files/gmxtops/missing_atomtype.top diff --git a/test/files/gmxtops/duplicated_topol.top b/test/files/gmxtops/duplicated_topol.top new file mode 100644 index 000000000..d0d2f029c --- /dev/null +++ b/test/files/gmxtops/duplicated_topol.top @@ -0,0 +1,425 @@ +; +; File 'topol.top' was generated +; By user: leeping (1000) +; On host: leeping +; At date: Thu May 14 17:29:21 2015 +; +; This is a standalone topology file +; +; It was generated using program: +; pdb2gmx - VERSION 4.6.5 +; +; Command line was: +; pdb2gmx -f ace-ALA-nme.pdb -ignh +; +; Force field was read from the standard Gromacs share directory. +; + +; Include forcefield parameters +#include "amber99sb.ff/forcefield.itp" + +[ moleculetype ] +; Name nrexcl +Protein_chain_1 3 + +[ atoms ] +; nr type resnr residue atom cgnr charge mass typeB chargeB massB +; residue 1 ACE rtp ACE q 0.0 + 1 CT 1 ACE CH3 1 -0.3662 12.01 ; qtot -0.3662 + 2 HC 1 ACE HH31 2 0.1123 1.008 ; qtot -0.2539 + 3 HC 1 ACE HH32 3 0.1123 1.008 ; qtot -0.1416 + 4 HC 1 ACE HH33 4 0.1123 1.008 ; qtot -0.0293 + 5 C 1 ACE C 5 0.5972 12.01 ; qtot 0.5679 + 6 O 1 ACE O 6 -0.5679 16 ; qtot 0 +; residue 2 ALA rtp ALA q 0.0 + 7 N 2 ALA N 7 -0.4157 14.01 ; qtot -0.4157 + 8 H 2 ALA H 8 0.2719 1.008 ; qtot -0.1438 + 9 CT 2 ALA CA 9 0.0337 12.01 ; qtot -0.1101 + 10 H1 2 ALA HA 10 0.0823 1.008 ; qtot -0.0278 + 11 CT 2 ALA CB 11 -0.1825 12.01 ; qtot -0.2103 + 12 HC 2 ALA HB1 12 0.0603 1.008 ; qtot -0.15 + 13 HC 2 ALA HB2 13 0.0603 1.008 ; qtot -0.0897 + 14 HC 2 ALA HB3 14 0.0603 1.008 ; qtot -0.0294 + 15 C 2 ALA C 15 0.5973 12.01 ; qtot 0.5679 + 16 O 2 ALA O 16 -0.5679 16 ; qtot 0 +; residue 3 NME rtp NME q 0.0 + 17 N 3 NME N 17 -0.4157 14.01 ; qtot -0.4157 + 18 H 3 NME H 18 0.2719 1.008 ; qtot -0.1438 + 19 CT 3 NME CH3 19 -0.149 12.01 ; qtot -0.2928 + 20 H1 3 NME HH31 20 0.0976 1.008 ; qtot -0.1952 + 21 H1 3 NME HH32 21 0.0976 1.008 ; qtot -0.0976 + 22 H1 3 NME HH33 22 0.0976 1.008 ; qtot 0 + +[ bonds ] +; ai aj funct c0 c1 c2 c3 + 1 2 1 + 1 3 1 + 1 4 1 + 1 5 1 + 5 6 1 + 5 7 1 + 7 8 1 + 7 9 1 + 9 10 1 + 9 11 1 + 9 15 1 + 11 12 1 + 11 13 1 + 11 14 1 + 15 16 1 + 15 17 1 + 17 18 1 + 17 19 1 + 19 20 1 + 19 21 1 + 19 22 1 + +[ pairs ] +; ai aj funct c0 c1 c2 c3 + 1 8 1 + 1 9 1 + 2 6 1 + 2 7 1 + 3 6 1 + 3 7 1 + 4 6 1 + 4 7 1 + 5 10 1 + 5 11 1 + 5 15 1 + 6 8 1 + 6 9 1 + 7 12 1 + 7 13 1 + 7 14 1 + 7 16 1 + 7 17 1 + 8 10 1 + 8 11 1 + 8 15 1 + 9 18 1 + 9 19 1 + 10 12 1 + 10 13 1 + 10 14 1 + 10 16 1 + 10 17 1 + 11 16 1 + 11 17 1 + 12 15 1 + 13 15 1 + 14 15 1 + 15 20 1 + 15 21 1 + 15 22 1 + 16 18 1 + 16 19 1 + 18 20 1 + 18 21 1 + 18 22 1 + +[ angles ] +; ai aj ak funct c0 c1 c2 c3 + 2 1 3 1 + 2 1 4 1 + 2 1 5 1 + 3 1 4 1 + 3 1 5 1 + 4 1 5 1 + 1 5 6 1 + 1 5 7 1 + 6 5 7 1 + 5 7 8 1 + 5 7 9 1 + 8 7 9 1 + 7 9 10 1 + 7 9 11 1 + 7 9 15 1 + 10 9 11 1 + 10 9 15 1 + 11 9 15 1 + 9 11 12 1 + 9 11 13 1 + 9 11 14 1 + 12 11 13 1 + 12 11 14 1 + 13 11 14 1 + 9 15 16 1 + 9 15 17 1 + 16 15 17 1 + 15 17 18 1 + 15 17 19 1 + 18 17 19 1 + 17 19 20 1 + 17 19 21 1 + 17 19 22 1 + 20 19 21 1 + 20 19 22 1 + 21 19 22 1 + +[ dihedrals ] +; ai aj ak al funct c0 c1 c2 c3 c4 c5 + 2 1 5 6 9 + 2 1 5 7 9 + 3 1 5 6 9 + 3 1 5 7 9 + 4 1 5 6 9 + 4 1 5 7 9 + 1 5 7 8 9 + 1 5 7 9 9 + 6 5 7 8 9 + 6 5 7 9 9 + 5 7 9 10 9 + 5 7 9 11 9 + 5 7 9 15 9 + 8 7 9 10 9 + 8 7 9 11 9 + 8 7 9 15 9 + 7 9 11 12 9 + 7 9 11 13 9 + 7 9 11 14 9 + 10 9 11 12 9 + 10 9 11 13 9 + 10 9 11 14 9 + 15 9 11 12 9 + 15 9 11 13 9 + 15 9 11 14 9 + 7 9 15 16 9 + 7 9 15 17 9 + 10 9 15 16 9 + 10 9 15 17 9 + 11 9 15 16 9 + 11 9 15 17 9 + 9 15 17 18 9 + 9 15 17 19 9 + 16 15 17 18 9 + 16 15 17 19 9 + 15 17 19 20 9 + 15 17 19 21 9 + 15 17 19 22 9 + 18 17 19 20 9 + 18 17 19 21 9 + 18 17 19 22 9 + +[ dihedrals ] +; ai aj ak al funct c0 c1 c2 c3 + 1 7 5 6 4 + 5 9 7 8 4 + 9 17 15 16 4 + 15 19 17 18 4 + +[ moleculetype ] +; Name nrexcl +Protein_chain_1 3 + +[ atoms ] +; nr type resnr residue atom cgnr charge mass typeB chargeB massB +; residue 1 ACE rtp ACE q 0.0 + 1 CT 1 ACE CH3 1 -0.3662 12.01 ; qtot -0.3662 + 2 HC 1 ACE HH31 2 0.1123 1.008 ; qtot -0.2539 + 3 HC 1 ACE HH32 3 0.1123 1.008 ; qtot -0.1416 + 4 HC 1 ACE HH33 4 0.1123 1.008 ; qtot -0.0293 + 5 C 1 ACE C 5 0.5972 12.01 ; qtot 0.5679 + 6 O 1 ACE O 6 -0.5679 16 ; qtot 0 +; residue 2 ALA rtp ALA q 0.0 + 7 N 2 ALA N 7 -0.4157 14.01 ; qtot -0.4157 + 8 H 2 ALA H 8 0.2719 1.008 ; qtot -0.1438 + 9 CT 2 ALA CA 9 0.0337 12.01 ; qtot -0.1101 + 10 H1 2 ALA HA 10 0.0823 1.008 ; qtot -0.0278 + 11 CT 2 ALA CB 11 -0.1825 12.01 ; qtot -0.2103 + 12 HC 2 ALA HB1 12 0.0603 1.008 ; qtot -0.15 + 13 HC 2 ALA HB2 13 0.0603 1.008 ; qtot -0.0897 + 14 HC 2 ALA HB3 14 0.0603 1.008 ; qtot -0.0294 + 15 C 2 ALA C 15 0.5973 12.01 ; qtot 0.5679 + 16 O 2 ALA O 16 -0.5679 16 ; qtot 0 +; residue 3 NME rtp NME q 0.0 + 17 N 3 NME N 17 -0.4157 14.01 ; qtot -0.4157 + 18 H 3 NME H 18 0.2719 1.008 ; qtot -0.1438 + 19 CT 3 NME CH3 19 -0.149 12.01 ; qtot -0.2928 + 20 H1 3 NME HH31 20 0.0976 1.008 ; qtot -0.1952 + 21 H1 3 NME HH32 21 0.0976 1.008 ; qtot -0.0976 + 22 H1 3 NME HH33 22 0.0976 1.008 ; qtot 0 + +[ bonds ] +; ai aj funct c0 c1 c2 c3 + 1 2 1 + 1 3 1 + 1 4 1 + 1 5 1 + 5 6 1 + 5 7 1 + 7 8 1 + 7 9 1 + 9 10 1 + 9 11 1 + 9 15 1 + 11 12 1 + 11 13 1 + 11 14 1 + 15 16 1 + 15 17 1 + 17 18 1 + 17 19 1 + 19 20 1 + 19 21 1 + 19 22 1 + +[ pairs ] +; ai aj funct c0 c1 c2 c3 + 1 8 1 + 1 9 1 + 2 6 1 + 2 7 1 + 3 6 1 + 3 7 1 + 4 6 1 + 4 7 1 + 5 10 1 + 5 11 1 + 5 15 1 + 6 8 1 + 6 9 1 + 7 12 1 + 7 13 1 + 7 14 1 + 7 16 1 + 7 17 1 + 8 10 1 + 8 11 1 + 8 15 1 + 9 18 1 + 9 19 1 + 10 12 1 + 10 13 1 + 10 14 1 + 10 16 1 + 10 17 1 + 11 16 1 + 11 17 1 + 12 15 1 + 13 15 1 + 14 15 1 + 15 20 1 + 15 21 1 + 15 22 1 + 16 18 1 + 16 19 1 + 18 20 1 + 18 21 1 + 18 22 1 + +[ angles ] +; ai aj ak funct c0 c1 c2 c3 + 2 1 3 1 + 2 1 4 1 + 2 1 5 1 + 3 1 4 1 + 3 1 5 1 + 4 1 5 1 + 1 5 6 1 + 1 5 7 1 + 6 5 7 1 + 5 7 8 1 + 5 7 9 1 + 8 7 9 1 + 7 9 10 1 + 7 9 11 1 + 7 9 15 1 + 10 9 11 1 + 10 9 15 1 + 11 9 15 1 + 9 11 12 1 + 9 11 13 1 + 9 11 14 1 + 12 11 13 1 + 12 11 14 1 + 13 11 14 1 + 9 15 16 1 + 9 15 17 1 + 16 15 17 1 + 15 17 18 1 + 15 17 19 1 + 18 17 19 1 + 17 19 20 1 + 17 19 21 1 + 17 19 22 1 + 20 19 21 1 + 20 19 22 1 + 21 19 22 1 + +[ dihedrals ] +; ai aj ak al funct c0 c1 c2 c3 c4 c5 + 2 1 5 6 9 + 2 1 5 7 9 + 3 1 5 6 9 + 3 1 5 7 9 + 4 1 5 6 9 + 4 1 5 7 9 + 1 5 7 8 9 + 1 5 7 9 9 + 6 5 7 8 9 + 6 5 7 9 9 + 5 7 9 10 9 + 5 7 9 11 9 + 5 7 9 15 9 + 8 7 9 10 9 + 8 7 9 11 9 + 8 7 9 15 9 + 7 9 11 12 9 + 7 9 11 13 9 + 7 9 11 14 9 + 10 9 11 12 9 + 10 9 11 13 9 + 10 9 11 14 9 + 15 9 11 12 9 + 15 9 11 13 9 + 15 9 11 14 9 + 7 9 15 16 9 + 7 9 15 17 9 + 10 9 15 16 9 + 10 9 15 17 9 + 11 9 15 16 9 + 11 9 15 17 9 + 9 15 17 18 9 + 9 15 17 19 9 + 16 15 17 18 9 + 16 15 17 19 9 + 15 17 19 20 9 + 15 17 19 21 9 + 15 17 19 22 9 + 18 17 19 20 9 + 18 17 19 21 9 + 18 17 19 22 9 + +[ dihedrals ] +; ai aj ak al funct c0 c1 c2 c3 + 1 7 5 6 4 + 5 9 7 8 4 + 9 17 15 16 4 + 15 19 17 18 4 + +; Include Position restraint file +#ifdef POSRES +#include "posre.itp" +#endif + +; Include water topology +#include "amber99sb.ff/tip3p.itp" + +#ifdef POSRES_WATER +; Position restraint for each water oxygen +[ position_restraints ] +; i funct fcx fcy fcz + 1 1 1000 1000 1000 +#endif + +; Include topology for ions +#include "amber99sb.ff/ions.itp" + +[ system ] +; Name +Protein + +[ molecules ] +; Compound #mols +Protein_chain_1 1 diff --git a/test/files/gmxtops/missing_atomtype.top b/test/files/gmxtops/missing_atomtype.top new file mode 100644 index 000000000..6ab0abecb --- /dev/null +++ b/test/files/gmxtops/missing_atomtype.top @@ -0,0 +1,235 @@ +; +; File 'topol.top' was generated +; By user: leeping (1000) +; On host: leeping +; At date: Thu May 14 17:29:21 2015 +; +; This is a standalone topology file +; +; It was generated using program: +; pdb2gmx - VERSION 4.6.5 +; +; Command line was: +; pdb2gmx -f ace-ALA-nme.pdb -ignh +; +; Force field was read from the standard Gromacs share directory. +; + +; Include forcefield parameters +#include "amber99sb.ff/forcefield.itp" + +[ moleculetype ] +; Name nrexcl +Protein_chain_1 3 + +[ atoms ] +; nr type resnr residue atom cgnr charge mass typeB chargeB massB +; residue 1 ACE rtp ACE q 0.0 + 1 CTXA 1 ACE CH3 1 -0.3662 ; qtot -0.3662 + 2 HC 1 ACE HH31 2 0.1123 ; qtot -0.2539 + 3 HC 1 ACE HH32 3 0.1123 1.008 ; qtot -0.1416 + 4 HC 1 ACE HH33 4 0.1123 1.008 ; qtot -0.0293 + 5 C 1 ACE C 5 0.5972 12.01 ; qtot 0.5679 + 6 O 1 ACE O 6 -0.5679 16 ; qtot 0 +; residue 2 ALA rtp ALA q 0.0 + 7 N 2 ALA N 7 -0.4157 14.01 ; qtot -0.4157 + 8 H 2 ALA H 8 0.2719 1.008 ; qtot -0.1438 + 9 CT 2 ALA CA 9 0.0337 12.01 ; qtot -0.1101 + 10 H1 2 ALA HA 10 0.0823 1.008 ; qtot -0.0278 + 11 CT 2 ALA CB 11 -0.1825 12.01 ; qtot -0.2103 + 12 HC 2 ALA HB1 12 0.0603 1.008 ; qtot -0.15 + 13 HC 2 ALA HB2 13 0.0603 1.008 ; qtot -0.0897 + 14 HC 2 ALA HB3 14 0.0603 1.008 ; qtot -0.0294 + 15 C 2 ALA C 15 0.5973 12.01 ; qtot 0.5679 + 16 O 2 ALA O 16 -0.5679 16 ; qtot 0 +; residue 3 NME rtp NME q 0.0 + 17 N 3 NME N 17 -0.4157 14.01 ; qtot -0.4157 + 18 H 3 NME H 18 0.2719 1.008 ; qtot -0.1438 + 19 CT 3 NME CH3 19 -0.149 12.01 ; qtot -0.2928 + 20 H1 3 NME HH31 20 0.0976 1.008 ; qtot -0.1952 + 21 H1 3 NME HH32 21 0.0976 1.008 ; qtot -0.0976 + 22 H1 3 NME HH33 22 ; qtot 0 + +[ bonds ] +; ai aj funct c0 c1 c2 c3 + 1 2 2 + 1 3 1 + 1 4 1 + 1 5 1 + 5 6 1 + 5 7 1 + 7 8 1 + 7 9 1 + 9 10 1 + 9 11 1 + 9 15 1 + 11 12 1 + 11 13 1 + 11 14 1 + 15 16 1 + 15 17 1 + 17 18 1 + 17 19 1 + 19 20 1 + 19 21 1 + 19 22 1 + +[ pairs ] +; ai aj funct c0 c1 c2 c3 + 1 8 1 + 1 9 1 + 2 6 1 + 2 7 1 + 3 6 1 + 3 7 1 + 4 6 1 + 4 7 1 + 5 10 1 + 5 11 1 + 5 15 1 + 6 8 1 + 6 9 1 + 7 12 1 + 7 13 1 + 7 14 1 + 7 16 1 + 7 17 1 + 8 10 1 + 8 11 1 + 8 15 1 + 9 18 1 + 9 19 1 + 10 12 1 + 10 13 1 + 10 14 1 + 10 16 1 + 10 17 1 + 11 16 1 + 11 17 1 + 12 15 1 + 13 15 1 + 14 15 1 + 15 20 1 + 15 21 1 + 15 22 1 + 16 18 1 + 16 19 1 + 18 20 1 + 18 21 1 + 18 22 1 + +[ angles ] +; ai aj ak funct c0 c1 c2 c3 + 2 1 3 1 + 2 1 4 1 + 2 1 5 1 + 3 1 4 1 + 3 1 5 1 + 4 1 5 1 + 1 5 6 1 + 1 5 7 1 + 6 5 7 1 + 5 7 8 1 + 5 7 9 1 + 8 7 9 1 + 7 9 10 1 + 7 9 11 1 + 7 9 15 1 + 10 9 11 1 + 10 9 15 1 + 11 9 15 1 + 9 11 12 1 + 9 11 13 1 + 9 11 14 1 + 12 11 13 1 + 12 11 14 1 + 13 11 14 1 + 9 15 16 1 + 9 15 17 1 + 16 15 17 1 + 15 17 18 1 + 15 17 19 1 + 18 17 19 1 + 17 19 20 1 + 17 19 21 1 + 17 19 22 1 + 20 19 21 1 + 20 19 22 1 + 21 19 22 1 + +[ dihedrals ] +; ai aj ak al funct c0 c1 c2 c3 c4 c5 + 2 1 5 6 9 + 2 1 5 7 9 + 3 1 5 6 9 + 3 1 5 7 9 + 4 1 5 6 9 + 4 1 5 7 9 + 1 5 7 8 9 + 1 5 7 9 9 + 6 5 7 8 9 + 6 5 7 9 9 + 5 7 9 10 9 + 5 7 9 11 9 + 5 7 9 15 9 + 8 7 9 10 9 + 8 7 9 11 9 + 8 7 9 15 9 + 7 9 11 12 9 + 7 9 11 13 9 + 7 9 11 14 9 + 10 9 11 12 9 + 10 9 11 13 9 + 10 9 11 14 9 + 15 9 11 12 9 + 15 9 11 13 9 + 15 9 11 14 9 + 7 9 15 16 9 + 7 9 15 17 9 + 10 9 15 16 9 + 10 9 15 17 9 + 11 9 15 16 9 + 11 9 15 17 9 + 9 15 17 18 9 + 9 15 17 19 9 + 16 15 17 18 9 + 16 15 17 19 9 + 15 17 19 20 9 + 15 17 19 21 9 + 15 17 19 22 9 + 18 17 19 20 9 + 18 17 19 21 9 + 18 17 19 22 9 + +[ dihedrals ] +; ai aj ak al funct c0 c1 c2 c3 + 1 7 5 6 4 + 5 9 7 8 4 + 9 17 15 16 4 + 15 19 17 18 4 + +; Include Position restraint file +#ifdef POSRES +#include "posre.itp" +#endif + +; Include water topology +#include "amber99sb.ff/tip3p.itp" + +#ifdef POSRES_WATER +; Position restraint for each water oxygen +[ position_restraints ] +; i funct fcx fcy fcz + 1 1 1000 1000 1000 +#endif + +; Include topology for ions +#include "amber99sb.ff/ions.itp" + +[ system ] +; Name +Protein + +[ molecules ] +; Compound #mols +Protein_chain_1 1 From 829843aefb45f6189faa1678219bda89d22e0b4a Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Fri, 22 Jan 2016 09:23:06 -0500 Subject: [PATCH 29/62] Fix up a test that was writing to the main test file repo, and add a bunch of GROMACS topology file tests. --- test/test_format_conversions.py | 2 +- test/test_parmed_gromacs.py | 101 +++++++++++++++++++++++++++++++- 2 files changed, 99 insertions(+), 4 deletions(-) diff --git a/test/test_format_conversions.py b/test/test_format_conversions.py index 8df2eab6c..54fb8b31f 100644 --- a/test/test_format_conversions.py +++ b/test/test_format_conversions.py @@ -100,7 +100,7 @@ def test_simple(self): def test_chamber(self): """ Tests converting standard Gromacs system into Chamber prmtop """ - fn = get_fn('1aki.charmm27_fromgmx.parm7') + fn = get_fn('1aki.charmm27_fromgmx.parm7', written=True) top = load_file(get_fn('1aki.charmm27.solv.top'), xyz=get_fn('1aki.charmm27.solv.gro')) parm = amber.ChamberParm.from_structure(top) diff --git a/test/test_parmed_gromacs.py b/test/test_parmed_gromacs.py index d6db9d6a8..37a2f7d8a 100644 --- a/test/test_parmed_gromacs.py +++ b/test/test_parmed_gromacs.py @@ -9,7 +9,7 @@ from parmed.gromacs import GromacsTopologyFile, GromacsGroFile from parmed.gromacs._gromacsfile import GromacsFile from parmed import gromacs as gmx -from parmed.topologyobjects import _UnassignedAtomType +from parmed.topologyobjects import UnassignedAtomType from parmed.utils.six.moves import range, zip, StringIO import unittest from utils import get_fn, diff_files, get_saved_fn, FileIOTestCase, HAS_GROMACS @@ -128,6 +128,16 @@ def test_charmm27_top(self): 'charmm27.ff/ions.itp']) self._charmm27_checks(top) + def test_gromacs_top_detection(self): + """ Tests automatic file detection of GROMACS topology files """ + fn = get_fn('test.top', written=True) + with open(fn, 'w') as f: + f.write('# not a gromacs topology file\n') + self.assertFalse(GromacsTopologyFile.id_format(fn)) + with open(fn, 'w') as f: + pass + self.assertFalse(GromacsTopologyFile.id_format(fn)) + def test_gromacs_file(self): """ Test GromacsFile helper class """ f = StringIO('This is the first line \\\n this is still the first line' @@ -277,14 +287,47 @@ def test_OPLS(self): self.assertEqual(len(parm.atoms), len(parm2.atoms)) # Check that the charge attribute is read correctly self.assertEqual(parm.parameterset.atom_types['opls_001'].charge, 0.5) + # Check the xyz argument in the constructor being coordinates + parm2 = load_file(os.path.join(get_fn('05.OPLS'), 'topol.top'), + xyz=parm.coordinates, box=[10, 10, 10, 90, 90, 90]) + np.testing.assert_equal(parm2.coordinates, parm.coordinates) + np.testing.assert_equal(parm2.box, [10, 10, 10, 90, 90, 90]) def test_without_parametrize(self): """ Tests loading a Gromacs topology without parametrizing """ parm = load_file(os.path.join(get_fn('05.OPLS'), 'topol.top'), xyz=os.path.join(get_fn('05.OPLS'), 'conf.gro'), parametrize=False) - assert isinstance(parm.atoms[0].atom_type, _UnassignedAtomType) - assert all(x.type is None for x in parm.bonds) + self.assertIs(parm.atoms[0].atom_type, UnassignedAtomType) + self.assertTrue(all(x.type is None for x in parm.bonds)) + + def test_bad_top_loads(self): + """ Test error catching in GromacsTopologyFile reading """ + fn = os.path.join(get_fn('03.AlaGlu'), 'topol.top') + self.assertRaises(TypeError, lambda: load_file(fn, xyz=fn)) + self.assertRaises(ValueError, lambda: GromacsTopologyFile(xyz=1, box=1)) + wfn = os.path.join(get_fn('gmxtops'), 'duplicated_topol.top') + self.assertRaises(GromacsError, lambda: GromacsTopologyFile(wfn)) + + def test_top_parsing_missing_types(self): + """ Test GROMACS topology files with missing types """ + warnings.filterwarnings('ignore', category=GromacsWarning) + top = GromacsTopologyFile(os.path.join(get_fn('gmxtops'), + 'missing_atomtype.top'), parametrize=False) + self.assertIs(top[0].atom_type, UnassignedAtomType) + self.assertEqual(top[0].mass, -1) + self.assertEqual(top[0].atomic_number, -1) + self.assertEqual(top[1].atomic_number, 1) # taken from atom_type + self.assertEqual(top[-1].atomic_number, 1) # taken from atom_type + self.assertEqual(top[-1].charge, 0) # removed + self.assertEqual(top.bonds[0].funct, 2) + self.assertTrue(top.unknown_functional) + warnings.filterwarnings('error', category=GromacsWarning) + self.assertRaises(GromacsWarning, lambda: + GromacsTopologyFile(os.path.join(get_fn('gmxtops'), + 'missing_atomtype.top'), parametrize=False) + ) + warnings.filterwarnings('always', category=GromacsWarning) def test_molecule_ordering(self): """ Tests non-contiguous atoms in Gromacs topology file writes """ @@ -354,6 +397,58 @@ def test_molecule_combine(self): for a1, a2 in zip(r1, r2): self._equal_atoms(a1, a2) + def test_private_functions(self): + """ Tests private helper functions for GromacsTopologyFile """ + Defaults = gmx.gromacstop._Defaults + self.assertRaises(ValueError, lambda: Defaults(nbfunc=3)) + self.assertRaises(ValueError, lambda: Defaults(comb_rule=4)) + self.assertRaises(ValueError, lambda: Defaults(gen_pairs='nada')) + self.assertRaises(ValueError, lambda: Defaults(fudgeLJ=-1.0)) + self.assertRaises(ValueError, lambda: Defaults(fudgeQQ=-1.0)) + repr(Defaults()) # To make sure it doesn't crash + defaults = Defaults(nbfunc=2, comb_rule=3, gen_pairs='no', fudgeLJ=2.0, + fudgeQQ=1.5) + self.assertEqual(defaults[0], 2) + self.assertEqual(defaults[1], 3) + self.assertEqual(defaults[2], 'no') + self.assertEqual(defaults[3], 2.0) + self.assertEqual(defaults[4], 1.5) + self.assertEqual(defaults[-1], 1.5) + self.assertEqual(defaults[-2], 2.0) + self.assertEqual(defaults[-3], 'no') + self.assertEqual(defaults[-4], 3) + self.assertEqual(defaults[-5], 2) + self.assertRaises(IndexError, lambda: defaults[-6]) + self.assertRaises(IndexError, lambda: defaults[5]) + # Try setting as an array + defaults[0] = defaults[1] = 1 + defaults[2] = 'yes' + defaults[3] = 1.5 + defaults[4] = 2.0 + self.assertEqual(defaults.nbfunc, 1) + self.assertEqual(defaults.comb_rule, 1) + self.assertEqual(defaults.gen_pairs, 'yes') + self.assertEqual(defaults.fudgeLJ, 1.5) + self.assertEqual(defaults.fudgeQQ, 2.0) + defaults[-5] = defaults[-4] = 1 + defaults[-3] = 'yes' + defaults[-2] = 1.5 + defaults[-1] = 2.0 + self.assertEqual(defaults.nbfunc, 1) + self.assertEqual(defaults.comb_rule, 1) + self.assertEqual(defaults.gen_pairs, 'yes') + self.assertEqual(defaults.fudgeLJ, 1.5) + self.assertEqual(defaults.fudgeQQ, 2.0) + # Error checking + def setter(idx, val): + defaults[idx] = val + self.assertRaises(ValueError, lambda: setter(0, 0)) + self.assertRaises(ValueError, lambda: setter(1, 0)) + self.assertRaises(ValueError, lambda: setter(2, 'nada')) + self.assertRaises(ValueError, lambda: setter(3, -1)) + self.assertRaises(ValueError, lambda: setter(4, -1)) + self.assertRaises(IndexError, lambda: setter(5, 0)) + _equal_atoms = utils.equal_atoms class TestGromacsGro(FileIOTestCase): From 51b2aa4c885a3d91c78a75fb7588acb49dc53051 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Fri, 22 Jan 2016 09:23:38 -0500 Subject: [PATCH 30/62] Begin splitting up the monolithic parsing function. Move atom parsing to a private function. --- parmed/gromacs/gromacstop.py | 72 ++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 32 deletions(-) diff --git a/parmed/gromacs/gromacstop.py b/parmed/gromacs/gromacstop.py index 5b86445e9..a9c0364c9 100644 --- a/parmed/gromacs/gromacstop.py +++ b/parmed/gromacs/gromacstop.py @@ -142,7 +142,9 @@ def __setitem__(self, idx, value): elif idx == 4: if float(value) < 0: raise ValueError('fudgeQQ must be non-negative') - self.fudgeLJ = value + self.fudgeQQ = value + else: + raise IndexError('Index %d out of range' % idx) @add_metaclass(FileFormatType) class GromacsTopologyFile(Structure): @@ -233,8 +235,8 @@ def __init__(self, fname=None, defines=None, parametrize=True, if xyz is not None: if isinstance(xyz, string_types): f = load_file(xyz) - if (not hasattr(f, 'coordinates') or - f.coordinates is None): + if not hasattr(f, 'coordinates') or f.coordinates is None: + # TODO delete raise TypeError('File %s does not have coordinates' % xyz) self.coordinates = f.coordinates @@ -288,35 +290,7 @@ def read(self, fname, defines=None, parametrize=True): dihedral_types = dict() exc_types = dict() elif current_section == 'atoms': - words = line.split() - try: - attype = params.atom_types[words[1]] - except KeyError: - attype = None - if len(words) < 8: - if attype is not None: - mass = attype.mass - atomic_number = attype.atomic_number - else: - mass = -1 - atomic_number = -1 - else: - mass = float(words[7]) - if attype is not None and attype.atomic_number >= 0: - atomic_number = attype.atomic_number - else: - atomic_number = AtomicNum[element_by_mass(mass)] - if len(words) < 7: - charge = None - else: - charge = float(words[6]) - if atomic_number == 0: - atom = ExtraPoint(name=words[4], type=words[1], - charge=charge) - else: - atom = Atom(atomic_number=atomic_number, name=words[4], - type=words[1], charge=charge, mass=mass) - molecule.add_atom(atom, words[3], int(words[2])) + molecule.add_atom(*self._parse_atoms(line, params)) elif current_section == 'bonds': words = line.split() i, j = int(words[0])-1, int(words[1])-1 @@ -875,6 +849,40 @@ def read(self, fname, defines=None, parametrize=True): #=================================================== + def _parse_atoms(self, line, params): + """ Parses an atom line. Returns an Atom, resname, resnum """ + words = line.split() + try: + attype = params.atom_types[words[1]] + except KeyError: + attype = None + if len(words) < 8: + if attype is not None: + mass = attype.mass + atomic_number = attype.atomic_number + else: + mass = -1 + atomic_number = -1 + else: + mass = float(words[7]) + if attype is not None and attype.atomic_number >= 0: + atomic_number = attype.atomic_number + else: + atomic_number = AtomicNum[element_by_mass(mass)] + if len(words) < 7: + charge = None + else: + charge = float(words[6]) + if atomic_number == 0: + atom = ExtraPoint(name=words[4], type=words[1], + charge=charge) + else: + atom = Atom(atomic_number=atomic_number, name=words[4], + type=words[1], charge=charge, mass=mass) + return atom, words[3], int(words[2]) + + #=================================================== + def parametrize(self): """ Assign parameters to the current structure. This should be called From 36399f4915ed285bd0f52edcbcd6877211ac49fd Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Fri, 22 Jan 2016 12:59:49 -0500 Subject: [PATCH 31/62] Start to break out the chunks of the GromacsTopologyFile parsing routine into separate private functions. --- parmed/gromacs/gromacsgro.py | 1 - parmed/gromacs/gromacstop.py | 436 +++++++++++++++++++---------------- 2 files changed, 241 insertions(+), 196 deletions(-) diff --git a/parmed/gromacs/gromacsgro.py b/parmed/gromacs/gromacsgro.py index bc130580a..eddbbba8c 100644 --- a/parmed/gromacs/gromacsgro.py +++ b/parmed/gromacs/gromacsgro.py @@ -149,7 +149,6 @@ def parse(filename): natom = int(fileobj.readline().strip()) except ValueError: raise GromacsError('Could not parse %s as GRO file' % filename) - digits = None line_parser = _AtomLineParser() for i, line in enumerate(fileobj): if i == natom: break diff --git a/parmed/gromacs/gromacstop.py b/parmed/gromacs/gromacstop.py index a9c0364c9..65f32f172 100644 --- a/parmed/gromacs/gromacstop.py +++ b/parmed/gromacs/gromacstop.py @@ -292,203 +292,34 @@ def read(self, fname, defines=None, parametrize=True): elif current_section == 'atoms': molecule.add_atom(*self._parse_atoms(line, params)) elif current_section == 'bonds': - words = line.split() - i, j = int(words[0])-1, int(words[1])-1 - funct = int(words[2]) - if funct != 1: - warnings.warn('bond funct != 1; unknown functional', - GromacsWarning) - self.unknown_functional = True - molecule.bonds.append(Bond(molecule.atoms[i], - molecule.atoms[j])) - molecule.bonds[-1].funct = funct - if len(words) >= 5 and funct == 1: - req, k = (float(x) for x in words[3:5]) - if (req, k) in bond_types: - bt = bond_types[(req, k)] - else: - bt = BondType( - k*u.kilojoule_per_mole/u.nanometer**2/2, - req*u.nanometer, list=molecule.bond_types - ) - molecule.bond_types.append(bt) - bond_types[(req, k)] = bt - molecule.bonds[-1].type= bt + bond, bond_type = self._parse_bonds(line, bond_types, + molecule.atoms) + molecule.bonds.append(bond) + if bond_type is not None: + molecule.bond_types.append(bond_type) + bond_type.list = molecule.bond_types elif current_section == 'pairs': - words = line.split() - i, j = int(words[0])-1, int(words[1])-1 - funct = int(words[2]) - if funct != 1: - # This is not even supported in Gromacs - warnings.warn('pairs funct != 1; unknown functional', - GromacsWarning) - self.unknown_functional = True - molecule.adjusts.append( - NonbondedException(molecule.atoms[i], - molecule.atoms[j]) - ) - molecule.adjusts[-1].funct = funct - if funct == 1 and len(words) >= 5: - sig = float(words[3]) * 2**(1/6) - eps = float(words[4]) - if (sig, eps) in exc_types: - nt = exc_types[(sig, eps)] - else: - nt = NonbondedExceptionType( - sig*u.nanometers, - eps*u.kilojoules_per_mole, - self.defaults.fudgeQQ, - list=molecule.adjust_types - ) - molecule.adjust_types.append(nt) - exc_types[(sig, eps)] = nt - molecule.adjusts[-1].type = nt + nbe, nbet = self._parse_pairs(line, exc_types, + molecule.atoms) + molecule.adjusts.append(nbe) + if nbet is not None: + molecule.adjust_types.append(nbet) + nbet.list = molecule.adjust_types elif current_section == 'angles': - words = line.split() - i, j, k = [int(w)-1 for w in words[:3]] - funct = int(words[3]) - if funct not in (1, 5): - warnings.warn('angles funct != 1 or 5; unknown ' - 'functional', GromacsWarning) - self.unknown_functional = True - molecule.angles.append( - Angle(molecule.atoms[i], molecule.atoms[j], - molecule.atoms[k]) - ) - if funct == 5: - molecule.urey_bradleys.append( - UreyBradley(molecule.atoms[i],molecule.atoms[k]) - ) - molecule.angles[-1].funct = funct - if funct == 1 and len(words) >= 6: - theteq, k = (float(x) for x in words[4:6]) - if (theteq, k) in angle_types: - at = angle_types[(theteq, k)] - else: - at = AngleType(k*u.kilojoule_per_mole/u.radian**2/2, - theteq*u.degree, list=molecule.angle_types) - molecule.angle_types.append(at) - angle_types[(theteq, k)] = at - molecule.angles[-1].type = at - elif funct == 5 and len(words) >= 8: - theteq, k, ubreq, ubk = (float(x) for x in words[4:8]) - at = AngleType(k*u.kilojoule_per_mole/u.radian**2/2, - theteq*u.degree, list=molecule.angle_types) - molecule.angle_types.append(at) - molecule.angles[-1].type = at - if ubreq > 0 and ubk > 0: - if (ubreq, ubk) in ub_types: - ubt = ub_types[(ubreq, ubk)] - else: - ubt = BondType( - ubk*u.kilojoule_per_mole/u.nanometer**2/2, - ubreq*u.nanometer, - list=molecule.urey_bradley_types - ) - molecule.urey_bradley_types.append(ubt) - ub_types[(ubreq, ubk)] = ubt - else: - ubt = NoUreyBradley - molecule.urey_bradleys[-1].type = ubt + ang, ub, angt, ubt = self._parse_angles(line, angle_types, + ub_types, molecule.atoms) + molecule.angles.append(ang) + if ub is not None: + molecule.urey_bradleys.append(ub) + if angt is not None: + molecule.angle_types.append(angt) + angt.list = molecule.angle_types + if ubt is not None: + molecule.urey_bradley_types.append(ubt) + ubt.list = molecule.urey_bradley_types elif current_section == 'dihedrals': - words = line.split() - i, j, k, l = [int(x)-1 for x in words[:4]] - funct = int(words[4]) - if funct in (1, 4) or (funct == 9 and len(words) < 8): - # Normal dihedral - improper = funct == 4 - dih = Dihedral(molecule.atoms[i], molecule.atoms[j], - molecule.atoms[k], molecule.atoms[l], - improper=improper) - molecule.dihedrals.append(dih) - molecule.dihedrals[-1].funct = funct - elif funct == 9: - atoms = tuple(molecule.atoms[int(x)-1] - for x in words[:4]) - phase, phi_k, per = (float(x) for x in words[5:8]) - dt = DihedralType(phi_k*u.kilojoule_per_mole, - per, phase*u.degrees, - scee=1/self.defaults.fudgeQQ, - scnb=1/self.defaults.fudgeLJ) - if atoms in proper_multiterm_dihedrals: - for edt in proper_multiterm_dihedrals[atoms]: - if edt.per == dt.per: - raise GromacsError( - 'duplicate periodicity term found ' - 'in inline dihedral parameter for ' - 'atoms [%s]' % ', '.join(words[:4]) - ) - proper_multiterm_dihedrals[atoms].append(dt) - else: - dt = DihedralType(phi_k*u.kilojoule_per_mole, - per, phase*u.degrees, - scee=1/self.defaults.fudgeQQ, - scnb=1/self.defaults.fudgeLJ) - dtl = DihedralTypeList() - dtl.append(dt) - dtl.list = molecule.dihedral_types - molecule.dihedral_types.append(dtl) - dih = Dihedral(*atoms, improper=False, type=dtl) - molecule.dihedrals.append(dih) - proper_multiterm_dihedrals[atoms] = dtl - proper_multiterm_dihedrals[tuple(reversed(atoms))] = dtl - elif funct == 2: - # Improper - imp = Improper(molecule.atoms[i], molecule.atoms[j], - molecule.atoms[k], molecule.atoms[l]) - molecule.impropers.append(imp) - molecule.impropers[-1].funct = funct - elif funct == 3: - rb = Dihedral(molecule.atoms[i], molecule.atoms[j], - molecule.atoms[k], molecule.atoms[l]) - molecule.rb_torsions.append(rb) - molecule.rb_torsions[-1].funct = funct - else: - # ??? unknown - warnings.warn('torsions funct != 1, 2, 3, 4, 9; unknown' - ' functional', GromacsWarning) - dih = Dihedral(molecule.atoms[i], molecule.atoms[j], - molecule.atoms[k], molecule.atoms[l]) - molecule.dihedrals.append(dih) - molecule.dihedrals[-1].funct == funct - self.unknown_functional = True - if funct in (1, 4) and len(words) >= 8: - phase, phi_k, per = (float(x) for x in words[5:8]) - if (phase, phi_k, per) in dihedral_types: - dt = dihedral_types[(phase, phi_k, per)] - else: - dt = DihedralType(phi_k*u.kilojoule_per_mole, - per, phase*u.degrees, - scee=1/self.defaults.fudgeQQ, - scnb=1/self.defaults.fudgeLJ, - list=molecule.dihedral_types) - molecule.dihedral_types.append(dt) - dihedral_types[(phase, phi_k, per)] = dt - molecule.dihedrals[-1].type = dt - elif funct == 2 and len(words) >= 7: - psieq, k = (float(x) for x in words[5:7]) - if (psieq, k) in dihedral_types: - dt = dihedral_types[(psieq, k)] - else: - dt = ImproperType(k*u.kilojoule_per_mole/u.radian**2/2, - psieq*u.degree, list=molecule.improper_types) - molecule.improper_types.append(dt) - dihedral_types[(psieq, k)] = dt - molecule.impropers[-1].type = dt - elif funct == 3 and len(words) >= 11: - c0, c1, c2, c3, c4, c5 = (float(x) for x in words[5:11]) - if (c0, c1, c2, c3, c4, c5) in dihedral_types: - dt = dihedral_types[(c0, c1, c2, c3, c4, c5)] - else: - kjpm = u.kilojoules_per_mole - dt = RBTorsionType(c0*kjpm, c1*kjpm, c2*kjpm, - c3*kjpm, c4*kjpm, c5*kjpm, - scee=1/self.defaults.fudgeQQ, - scnb=1/self.defaults.fudgeLJ, - list=molecule.rb_torsion_types) - molecule.rb_torsion_types.append(dt) - dihedral_types[(c0, c1, c2, c3, c4, c5)] = dt - molecule.rb_torsions[-1].type = dt + self._parse_dihedrals(line, dihedral_types, + proper_multiterm_dihedrals, molecule) elif current_section == 'cmap': words = line.split() i, j, k, l, m = (int(w)-1 for w in words[:5]) @@ -847,7 +678,7 @@ def read(self, fname, defines=None, parametrize=True): if parametrize: self.parametrize() - #=================================================== + # Private parsing helper functions def _parse_atoms(self, line, params): """ Parses an atom line. Returns an Atom, resname, resnum """ @@ -881,6 +712,221 @@ def _parse_atoms(self, line, params): type=words[1], charge=charge, mass=mass) return atom, words[3], int(words[2]) + def _parse_bonds(self, line, bond_types, atoms): + """ Parses a bond line. Returns a Bond, BondType/None """ + words = line.split() + i, j = int(words[0])-1, int(words[1])-1 + funct = int(words[2]) + if funct != 1: + warnings.warn('bond funct != 1; unknown functional', + GromacsWarning) + self.unknown_functional = True + bond = Bond(atoms[i], atoms[j]) + bond.funct = funct + bond_type = None + if len(words) >= 5 and funct == 1: + req, k = (float(x) for x in words[3:5]) + if (req, k) in bond_types: + bond.type = bond_types[(req, k)] + else: + bond_type = BondType( + k*u.kilojoule_per_mole/u.nanometer**2/2, + req*u.nanometer + ) + bond_types[(req, k)] = bond.type = bond_type + return bond, bond_type + + def _parse_pairs(self, line, exc_types, atoms): + """ Parses a pairs line. Returns NonbondedException, NEType/None """ + words = line.split() + i, j = int(words[0])-1, int(words[1])-1 + funct = int(words[2]) + if funct != 1: + # This is not even supported in Gromacs + warnings.warn('pairs funct != 1; unknown functional', + GromacsWarning) + self.unknown_functional = True + nbe = NonbondedException(atoms[i], atoms[j]) + nbe.funct = funct + nbet = None + if funct == 1 and len(words) >= 5: + sig = float(words[3]) * 2**(1/6) + eps = float(words[4]) + if (sig, eps) in exc_types: + nbe.type = exc_types[(sig, eps)] + else: + nbet = NonbondedExceptionType( + sig*u.nanometers, + eps*u.kilojoules_per_mole, + self.defaults.fudgeQQ, + ) + exc_types[(sig, eps)] = nbe.type = nbet + return nbe, nbet + + def _parse_angles(self, line, angle_types, ub_types, atoms): + """ Parse an angles line, Returns Angle, UB/None, and types """ + words = line.split() + i, j, k = [int(w)-1 for w in words[:3]] + funct = int(words[3]) + if funct not in (1, 5): + warnings.warn('angles funct != 1 or 5; unknown ' + 'functional', GromacsWarning) + self.unknown_functional = True + angt = ub = ubt = None + ang = Angle(atoms[i], atoms[j], atoms[k]) + if funct == 5: + ub = UreyBradley(atoms[i], atoms[k]) + ang.funct = funct + if (funct == 1 and len(words) >= 6) or (funct == 5 and len(words) >= 8): + theteq, k = (float(x) for x in words[4:6]) + if (theteq, k) in angle_types: + ang.type = angle_types[(theteq, k)] + else: + angt = AngleType(k*u.kilojoule_per_mole/u.radian**2/2, + theteq*u.degree) + angle_types[(theteq, k)] = ang.type = angt + if funct == 5 and len(words) >= 8: + ubreq, ubk = (float(x) for x in words[6:8]) + if ubreq > 0 and ubk > 0: + if (ubreq, ubk) in ub_types: + ub.type = ub_types[(ubreq, ubk)] + else: + ubt = BondType( + ubk*u.kilojoule_per_mole/u.nanometer**2/2, + ubreq*u.nanometer, + ) + ub_types[(ubreq, ubk)] = ub.type = ubt + else: + ub.type = NoUreyBradley + return ang, ub, angt, ubt + + def _parse_dihedrals(self, line, dihedral_types, proper_multiterm_dihedrals, + molecule): + """ Processes a dihedrals line, returns None """ + words = line.split() + i, j, k, l = [int(x)-1 for x in words[:4]] + funct = int(words[4]) + if funct in (1, 4, 9): + dih, diht = self._process_normal_dihedral(words, molecule.atoms, i, + j, k, l, dihedral_types, + funct==4, funct==9) + if funct == 9 and len(words) >= 8: + key = dih.atom1, dih.atom2, dih.atom3, dih.atom4 + if key in proper_multiterm_dihedrals: + # In this case, all this line does is add another term + diht = proper_multiterm_dihedrals[key] + dih.delete() + dih = None + self._process_dihedral_series(words, dih, diht) + else: + diht = self._process_dihedral_series(words, dih, diht) + proper_multiterm_dihedrals[key] = diht + proper_multiterm_dihedrals[tuple(reversed(key))] = diht + if dih is not None: + dih.type = diht + if dih is not None: + molecule.dihedrals.append(dih) + if diht is not None: + molecule.dihedral_types.append(diht) + diht.list = molecule.dihedral_types + elif funct == 2: + dih, impt = self._process_improper(words, i, j, k, l, + molecule.atoms, dihedral_types) + molecule.impropers.append(dih) + if impt is not None: + molecule.improper_types.append(impt) + impt.list = molecule.improper_types + elif funct == 3: + dih, rbt = self._process_rbtorsion(words, i, j, k, l, molecule.atoms, + dihedral_types) + molecule.rb_torsions.append(dih) + if rbt is not None: + molecule.rb_torsion_types.append(rbt) + rbt.list = molecule.rb_torsion_types + else: + # ??? unknown funct + warnings.warn('torsions funct != 1, 2, 3, 4, 9; unknown' + ' functional', GromacsWarning) + dih = Dihedral(molecule.atoms[i], molecule.atoms[j], + molecule.atoms[k], molecule.atoms[l]) + molecule.dihedrals.append(dih) + self.unknown_functional = True + + if dih is not None: + dih.funct = funct + + def _process_normal_dihedral(self, words, atoms, i, j, k, l, + dihedral_types, imp, multiterm): + dih = Dihedral(atoms[i], atoms[j], atoms[k], atoms[l], improper=imp) + diht = None + if not multiterm and len(words) >= 8: + phase, phi_k, per = (float(x) for x in words[5:8]) + if (phase, phi_k, per) in dihedral_types: + dih.type = dihedral_types[(phase, phi_k, per)] + else: + diht = DihedralType(phi_k*u.kilojoule_per_mole, + per, phase*u.degrees, + scee=1/self.defaults.fudgeQQ, + scnb=1/self.defaults.fudgeLJ) + dihedral_types[(phase, phi_k, per)] = dih.type = diht + return dih, diht + + def _process_dihedral_series(self, words, dih, dihtype): + phase, phi_k, per = (float(x) for x in words[5:8]) + dt = DihedralType(phi_k*u.kilojoule_per_mole, + per, phase*u.degrees, + scee=1/self.defaults.fudgeQQ, + scnb=1/self.defaults.fudgeLJ) + if dihtype is not None: + for edt in dihtype: + if edt.per == dt.per: + raise GromacsError( + 'duplicate periodicity term found ' + 'in inline dihedral parameter for ' + 'atoms [%s]' % ', '.join(words[:4]) + ) + dihtype.append(dt) + dtl = None + else: + dt = DihedralType(phi_k*u.kilojoule_per_mole, + per, phase*u.degrees, + scee=1/self.defaults.fudgeQQ, + scnb=1/self.defaults.fudgeLJ) + dtl = DihedralTypeList() + dtl.append(dt) + return dtl + + def _process_improper(self, words, i, j, k, l, atoms, dihedral_types): + """ Processes an improper, returns Improper, ImproperType """ + # Improper + imp = Improper(atoms[i], atoms[j], atoms[k], atoms[l]) + impt = None + if len(words) >= 7: + psieq, k = (float(x) for x in words[5:7]) + if (psieq, k) in dihedral_types: + imp.type = dihedral_types[(psieq, k)] + else: + impt = ImproperType(k*u.kilojoule_per_mole/u.radian**2/2, + psieq*u.degree) + imp.type = dihedral_types[(psieq, k)] = impt + return imp, impt + + def _process_rbtorsion(self, words, i, j, k, l, atoms, dihedral_types): + rb = Dihedral(atoms[i], atoms[j], atoms[k], atoms[l]) + rbt = None + if len(words) >= 11: + c0, c1, c2, c3, c4, c5 = (float(x) for x in words[5:11]) + if (c0, c1, c2, c3, c4, c5) in dihedral_types: + rb.type = dihedral_types[(c0, c1, c2, c3, c4, c5)] + else: + kjpm = u.kilojoules_per_mole + rbt = RBTorsionType(c0*kjpm, c1*kjpm, c2*kjpm, + c3*kjpm, c4*kjpm, c5*kjpm, + scee=1/self.defaults.fudgeQQ, + scnb=1/self.defaults.fudgeLJ) + dihedral_types[(c0, c1, c2, c3, c4, c5)] = rb.type = rbt + return rb, rbt + #=================================================== def parametrize(self): From 4549d6fa8438c96433f7294a9bae97257671dfa9 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Fri, 22 Jan 2016 14:16:38 -0500 Subject: [PATCH 32/62] More shuffling and function simplification --- parmed/gromacs/gromacstop.py | 131 ++++++++++++++++++----------------- 1 file changed, 66 insertions(+), 65 deletions(-) diff --git a/parmed/gromacs/gromacstop.py b/parmed/gromacs/gromacstop.py index 65f32f172..5466c3b7e 100644 --- a/parmed/gromacs/gromacstop.py +++ b/parmed/gromacs/gromacstop.py @@ -321,18 +321,8 @@ def read(self, fname, defines=None, parametrize=True): self._parse_dihedrals(line, dihedral_types, proper_multiterm_dihedrals, molecule) elif current_section == 'cmap': - words = line.split() - i, j, k, l, m = (int(w)-1 for w in words[:5]) - funct = int(words[5]) - if funct != 1: - warnings.warn('cmap funct != 1; unknown functional', - GromacsWarning) - self.unknown_functional = True - cmap = Cmap(molecule.atoms[i], molecule.atoms[j], - molecule.atoms[k], molecule.atoms[l], - molecule.atoms[m]) + cmap = self._parse_cmaps(line, molecule.atoms) molecule.cmaps.append(cmap) - molecule.cmaps[-1].funct = funct elif current_section == 'system': self.title = line elif current_section == 'defaults': @@ -355,34 +345,10 @@ def read(self, fname, defines=None, parametrize=True): # (or other 3-atom molecules), GROMACS uses a "settles" # section to specify the constraint geometry. We have to # translate that into bonds. - natoms = len([a for a in molecule.atoms - if not isinstance(a, ExtraPoint)]) - if natoms != 3: - raise GromacsError("Cannot SETTLE a %d-atom molecule" % - natoms) - try: - oxy, = [atom for atom in molecule.atoms - if atom.atomic_number == 8] - hyd1, hyd2 = [atom for atom in molecule.atoms - if atom.atomic_number == 1] - except ValueError: - raise GromacsError('Can only SETTLE water; Could not ' - 'detect 2 hydrogens and 1 oxygen') - #TODO see if there's a bond_type entry in the parameter set - # that we can fill in - try: - i, funct, doh, dhh = line.split() - doh, dhh = float(doh), float(dhh) - except ValueError: - raise GromacsError('Bad [ settles ] line') - bt_oh = BondType(5e5*u.kilojoules_per_mole/u.nanometers**2, - doh*u.nanometers, list=molecule.bond_types) - bt_hh = BondType(5e5*u.kilojoules_per_mole/u.nanometers**2, - dhh*u.nanometers, list=molecule.bond_types) - molecule.bond_types.extend([bt_oh, bt_hh]) - molecule.bonds.append(Bond(oxy, hyd1, bt_oh)) - molecule.bonds.append(Bond(oxy, hyd2, bt_oh)) - molecule.bonds.append(Bond(hyd1, hyd2, bt_hh)) + bnds, bndts = self._parse_settles(molecule.atoms, line) + molecule.bonds.extend(bnds) + molecule.bond_types.extend(bndts) + molecule.bond_types.claim() elif current_section in ('virtual_sites3', 'dummies3'): words = line.split() vsite = molecule.atoms[int(words[0])-1] @@ -800,35 +766,19 @@ def _parse_angles(self, line, angle_types, ub_types, atoms): ub.type = NoUreyBradley return ang, ub, angt, ubt - def _parse_dihedrals(self, line, dihedral_types, proper_multiterm_dihedrals, - molecule): + def _parse_dihedrals(self, line, dihedral_types, PMD, molecule): """ Processes a dihedrals line, returns None """ words = line.split() i, j, k, l = [int(x)-1 for x in words[:4]] funct = int(words[4]) - if funct in (1, 4, 9): + if funct in (1, 4) or (funct == 9 and len(words) < 8): dih, diht = self._process_normal_dihedral(words, molecule.atoms, i, j, k, l, dihedral_types, - funct==4, funct==9) - if funct == 9 and len(words) >= 8: - key = dih.atom1, dih.atom2, dih.atom3, dih.atom4 - if key in proper_multiterm_dihedrals: - # In this case, all this line does is add another term - diht = proper_multiterm_dihedrals[key] - dih.delete() - dih = None - self._process_dihedral_series(words, dih, diht) - else: - diht = self._process_dihedral_series(words, dih, diht) - proper_multiterm_dihedrals[key] = diht - proper_multiterm_dihedrals[tuple(reversed(key))] = diht - if dih is not None: - dih.type = diht - if dih is not None: - molecule.dihedrals.append(dih) - if diht is not None: - molecule.dihedral_types.append(diht) - diht.list = molecule.dihedral_types + funct==4) + molecule.dihedrals.append(dih) + if diht is not None: + molecule.dihedral_types.append(diht) + diht.list = molecule.dihedral_types elif funct == 2: dih, impt = self._process_improper(words, i, j, k, l, molecule.atoms, dihedral_types) @@ -843,6 +793,21 @@ def _parse_dihedrals(self, line, dihedral_types, proper_multiterm_dihedrals, if rbt is not None: molecule.rb_torsion_types.append(rbt) rbt.list = molecule.rb_torsion_types + elif funct == 9: + # in-line parameters, since len(words) must be >= 8 + key = (molecule.atoms[i], molecule.atoms[j], + molecule.atoms[k], molecule.atoms[l]) + if key in PMD: + diht = PMD[key] + self._process_dihedral_series(words, diht) + dih = None + else: + dih = Dihedral(*key) + diht = self._process_dihedral_series(words) + dih.type = PMD[key] = PMD[tuple(reversed(key))] = diht + molecule.dihedrals.append(dih) + molecule.dihedral_types.append(diht) + diht.list = molecule.dihedral_types else: # ??? unknown funct warnings.warn('torsions funct != 1, 2, 3, 4, 9; unknown' @@ -855,11 +820,47 @@ def _parse_dihedrals(self, line, dihedral_types, proper_multiterm_dihedrals, if dih is not None: dih.funct = funct + def _parse_cmaps(self, line, atoms): + """ Parses cmap terms, returns cmap """ + words = line.split() + i, j, k, l, m = (int(w)-1 for w in words[:5]) + funct = int(words[5]) + if funct != 1: + warnings.warn('cmap funct != 1; unknown functional', + GromacsWarning) + self.unknown_functional = True + cmap = Cmap(atoms[i], atoms[j], atoms[k], atoms[l], atoms[m]) + cmap.funct = funct + return cmap + + def _parse_settles(self, atoms, line): + """ Parses settles line; returns list of Bonds, list of BondTypes """ + natoms = len([a for a in atoms if not isinstance(a, ExtraPoint)]) + if natoms != 3: + raise GromacsError("Cannot SETTLE a %d-atom molecule" % natoms) + try: + oxy, = [atom for atom in atoms if atom.atomic_number == 8] + hyd1, hyd2 = [atom for atom in atoms if atom.atomic_number == 1] + except ValueError: + raise GromacsError('Can only SETTLE water; wrong atoms') + #TODO see if there's a bond_type entry in the parameter set + # that we can fill in + try: + i, funct, doh, dhh = line.split() + doh, dhh = float(doh), float(dhh) + except ValueError: + raise GromacsError('Bad [ settles ] line') + nm = u.nanometers + bt_oh = BondType(5e5*u.kilojoules_per_mole/nm**2, doh*nm) + bt_hh = BondType(5e5*u.kilojoules_per_mole/nm**2, dhh*nm) + return [Bond(oxy, hyd1, bt_oh), Bond(oxy, hyd2, bt_oh), + Bond(hyd1, hyd2, bt_hh)], [bt_oh, bt_hh] + def _process_normal_dihedral(self, words, atoms, i, j, k, l, - dihedral_types, imp, multiterm): + dihedral_types, imp): dih = Dihedral(atoms[i], atoms[j], atoms[k], atoms[l], improper=imp) diht = None - if not multiterm and len(words) >= 8: + if len(words) >= 8: phase, phi_k, per = (float(x) for x in words[5:8]) if (phase, phi_k, per) in dihedral_types: dih.type = dihedral_types[(phase, phi_k, per)] @@ -871,7 +872,7 @@ def _process_normal_dihedral(self, words, atoms, i, j, k, l, dihedral_types[(phase, phi_k, per)] = dih.type = diht return dih, diht - def _process_dihedral_series(self, words, dih, dihtype): + def _process_dihedral_series(self, words, dihtype=None): phase, phi_k, per = (float(x) for x in words[5:8]) dt = DihedralType(phi_k*u.kilojoule_per_mole, per, phase*u.degrees, From d0eaec5d95cf1bfee4d55ccb1ab35c3056f348a9 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Fri, 22 Jan 2016 17:10:09 -0500 Subject: [PATCH 33/62] Significant simplifications of the vsite handling. --- parmed/gromacs/gromacstop.py | 132 +++++++++++++++-------------------- 1 file changed, 55 insertions(+), 77 deletions(-) diff --git a/parmed/gromacs/gromacstop.py b/parmed/gromacs/gromacstop.py index 5466c3b7e..c4bc8acf2 100644 --- a/parmed/gromacs/gromacstop.py +++ b/parmed/gromacs/gromacstop.py @@ -21,7 +21,7 @@ AngleType, DihedralType, DihedralTypeList, ImproperType, CmapType, RBTorsionType, ThreeParticleExtraPointFrame, AtomType, UreyBradley, TwoParticleExtraPointFrame, OutOfPlaneExtraPointFrame, - NonbondedExceptionType) + NonbondedExceptionType, UnassignedAtomType) from parmed.periodic_table import element_by_mass, AtomicNum from parmed import unit as u from parmed.utils.io import genopen @@ -345,84 +345,19 @@ def read(self, fname, defines=None, parametrize=True): # (or other 3-atom molecules), GROMACS uses a "settles" # section to specify the constraint geometry. We have to # translate that into bonds. - bnds, bndts = self._parse_settles(molecule.atoms, line) + bnds, bndts = self._parse_settles(line, molecule.atoms) molecule.bonds.extend(bnds) molecule.bond_types.extend(bndts) molecule.bond_types.claim() elif current_section in ('virtual_sites3', 'dummies3'): - words = line.split() - vsite = molecule.atoms[int(words[0])-1] - atoms = [molecule.atoms[int(i)-1] for i in words[1:4]] - funct = int(words[4]) - if funct == 1: - a, b = float(words[5]), float(words[6]) - if abs(a - b) > TINY: - raise GromacsError('Cannot handle virtual site ' - 'frames with different weights') - else: - raise GromacsError('Only 3-point virtual site type "1" ' - 'is supported') - # We need to know the geometry of the frame in order to - # determine the bond length between the virtual site and its - # parent atom - parent = atoms[0] - foundt = False - kws = dict() - for bond in parent.bonds: - if atoms[1] in bond: - if bond.type is None: - key = (parent.type, atoms[1].type) - if key not in params.bond_types: - raise GromacsError( - 'Cannot determine geometry of ' - 'virtual site without bond types' - ) - kws['dp1'] = params[key].req - if atoms[2] in bond: - if bond.type is None: - key = (_gettype(bond.atom1), - _gettype(bond.atom2)) - if key not in params.bond_types: - raise GromacsError( - 'Cannot determine geometry of ' - 'virtual site without bond types' - ) - kws['dp2'] = params.bond_types[key].req - for angle in parent.angles: - if parent is not angle.atom2: continue - if atoms[0] not in angle or atoms[1] not in angle: - continue - foundt = True - if angle.type is None: - key = (_gettype(angle.atom1), _gettype(angle.atom2), - _gettype(angle.atom3)) - if key not in params.angle_types: - raise GromacsError( - 'Cannot determine geometry of ' - 'virtual site without bond types' - ) - kws['theteq'] = params.angle_types[key].theteq - if not foundt: - for bond in atoms[1].bonds: - if atoms[2] in bond: - if bond.type is None: - key = (_gettype(bond.atom1), - _gettype(bond.atom2)) - if key not in params.bond_types: - raise GromacsError( - 'Cannot determine geometry of ' - 'virtual site without bond types' - ) - kws['d12'] = params.bond_types[key].req - bondlen = ThreeParticleExtraPointFrame.from_weights(parent, - atoms[1], atoms[2], a, b, **kws) - bt_vs = BondType(0, bondlen*u.angstroms, - list=molecule.bond_types) - if vsite in parent.bond_partners: - raise GromacsError('Unexpected bond b/w virtual site ' - 'and its parent') - molecule.bonds.append(Bond(vsite, parent, bt_vs)) - molecule.bond_types.append(bt_vs) + try: + b, bt = self._parse_vsites3(line, molecule.atoms, params) + except KeyError: + raise GromacsError('Cannot determine vsite geometry' + 'without parameter types') + molecule.bonds.append(b) + molecule.bond_types.append(bt) + bt.list = molecule.bond_types elif current_section == 'exclusions': atoms = [molecule.atoms[int(w)-1] for w in line.split()] for a in atoms[1:]: @@ -833,7 +768,7 @@ def _parse_cmaps(self, line, atoms): cmap.funct = funct return cmap - def _parse_settles(self, atoms, line): + def _parse_settles(self, line, atoms): """ Parses settles line; returns list of Bonds, list of BondTypes """ natoms = len([a for a in atoms if not isinstance(a, ExtraPoint)]) if natoms != 3: @@ -856,6 +791,49 @@ def _parse_settles(self, atoms, line): return [Bond(oxy, hyd1, bt_oh), Bond(oxy, hyd2, bt_oh), Bond(hyd1, hyd2, bt_hh)], [bt_oh, bt_hh] + def _parse_vsites3(self, line, all_atoms, params): + """ Parse vsites3/dummy3 line; returns Bond, BondType """ + words = line.split() + vsite = all_atoms[int(words[0])-1] + atoms = [all_atoms[int(i)-1] for i in words[1:4]] + funct = int(words[4]) + if funct == 1: + a, b = float(words[5]), float(words[6]) + if abs(a - b) > TINY: + raise GromacsError("No vsite frames with different weights") + else: + raise GromacsError('Only 3-point vsite type 1 is supported') + # We need to know the geometry of the frame in order to + # determine the bond length between the virtual site and its + # parent atom + parent = atoms[0] + kws = dict() + for bond in parent.bonds: + if atoms[1] in bond: + key = (_gettype(parent), _gettype(atoms[1])) + kws['dp1'] = (bond.type or params[key]).req + if atoms[2] in bond: + key = (_gettype(bond.atom1), _gettype(bond.atom2)) + kws['dp2'] = (bond.type or params.bond_types[key]).req + for angle in parent.angles: + if parent is not angle.atom2: continue + if atoms[0] not in angle or atoms[1] not in angle: continue + key = (_gettype(angle.atom1), _gettype(angle.atom2), + _gettype(angle.atom3)) + kws['theteq'] = (angle.type or params.angle_types[key]).theteq + break + else: # Did not break, no theta found + for bond in atoms[1].bonds: + if atoms[2] in bond: + key = (_gettype(bond.atom1), _gettype(bond.atom2)) + kws['d12'] = (bond.type or params.bond_types[key]).req + bondlen = ThreeParticleExtraPointFrame.from_weights(parent, atoms[1], + atoms[2], a, b, **kws) + bt_vs = BondType(0, bondlen*u.angstroms) + if vsite in parent.bond_partners: + raise GromacsError('Unexpected bond b/w vsite and its parent') + return Bond(vsite, parent, bt_vs), bt_vs + def _process_normal_dihedral(self, words, atoms, i, j, k, l, dihedral_types, imp): dih = Dihedral(atoms[i], atoms[j], atoms[k], atoms[l], improper=imp) @@ -2053,6 +2031,6 @@ def _diff_diheds(dt1, dt2): return True def _gettype(atom): - if atom.atom_type is not None: + if atom.atom_type not in (None, UnassignedAtomType): return atom.atom_type.bond_type return atom.type From e65f310b6f0395754d1de202b8d46f9ce3834640 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Fri, 22 Jan 2016 21:19:03 -0500 Subject: [PATCH 34/62] More rearrangements of GromacsTopologyFile parsing to offload more work into private functions. --- parmed/gromacs/gromacstop.py | 323 ++++++++++++++++++----------------- parmed/topologyobjects.py | 30 +++- 2 files changed, 188 insertions(+), 165 deletions(-) diff --git a/parmed/gromacs/gromacstop.py b/parmed/gromacs/gromacstop.py index c4bc8acf2..78730c758 100644 --- a/parmed/gromacs/gromacstop.py +++ b/parmed/gromacs/gromacstop.py @@ -236,7 +236,6 @@ def __init__(self, fname=None, defines=None, parametrize=True, if isinstance(xyz, string_types): f = load_file(xyz) if not hasattr(f, 'coordinates') or f.coordinates is None: - # TODO delete raise TypeError('File %s does not have coordinates' % xyz) self.coordinates = f.coordinates @@ -341,10 +340,6 @@ def read(self, fname, defines=None, parametrize=True): num = int(num) structure_contents.append((name, num)) elif current_section == 'settles': - # Instead of adding bonds that get constrained for waters - # (or other 3-atom molecules), GROMACS uses a "settles" - # section to specify the constraint geometry. We have to - # translate that into bonds. bnds, bndts = self._parse_settles(line, molecule.atoms) molecule.bonds.extend(bnds) molecule.bond_types.extend(bndts) @@ -363,54 +358,12 @@ def read(self, fname, defines=None, parametrize=True): for a in atoms[1:]: atoms[0].exclude(a) elif current_section == 'atomtypes': - words = line.split() - # Support the following spec, found in the Gromacs source - # code: - # Field 0 (mandatory) : nonbonded type name (string) - # Field 1 (optional) : bonded type (string) - # Field 2 (optional) : atomic number (int) - # Field 3 (mandatory) : mass (float) - # Field 4 (mandatory) : charge (float) - # Field 5 (mandatory) : particle type (single character) - attype = words[0] - if len(words[3]) == 1 and words[3] in letters: - atnum = -1 - sigidx = 4 - ptypeidx = 3 - massidx = 1 - bond_type = None - elif len(words[5]) == 1 and words[5] in letters: - sigidx = 6 - ptypeidx = 5 - massidx = 3 - atnum = int(words[2]) - bond_type = words[1] - else: - ptypeidx = 4 - massidx = 2 - sigidx = 5 - try: - atnum = int(words[1]) - bond_type = None - except ValueError: - # This must be a bonded type string - bond_type = words[1] - atnum = -1 - mass = float(words[massidx]) - if mass > 0 and atnum == -1: - atnum = AtomicNum[element_by_mass(mass)] - chg = float(words[massidx+1]) - ptype = words[ptypeidx] - sig = float(words[sigidx]) * u.nanometers - eps = float(words[sigidx+1]) * u.kilojoules_per_mole - typ = AtomType(attype, None, mass, atnum, - bond_type=bond_type, charge=chg) - typ.set_lj_params(eps, sig*2**(1/6)/2) + attype, typ = self._parse_atomtypes(line) params.atom_types[attype] = typ elif current_section == 'nonbond_params': words = line.split() a1, a2 = words[:2] -# func = int(words[2]) +# func = int(words[2]) #... unused sig, eps = (float(x) for x in words[3:5]) sig *= 10 # Convert to Angstroms eps *= u.kilojoule.conversion_factor_to(u.kilocalorie) @@ -419,116 +372,38 @@ def read(self, fname, defines=None, parametrize=True): params.atom_types[a1].add_nbfix(a2, sig*2**(1/6), eps) params.atom_types[a2].add_nbfix(a1, sig*2**(1/6), eps) elif current_section == 'bondtypes': - words = line.split() - r = float(words[3]) * u.nanometers - k = (float(words[4]) / 2) * ( - u.kilojoules_per_mole / u.nanometers**2) - if words[2] != '1': - warnings.warn('bondtypes funct != 1; unknown ' - 'functional', GromacsWarning) - self.unknown_functional = True - ptype = BondType(k, r) - params.bond_types[(words[0], words[1])] = ptype - params.bond_types[(words[1], words[0])] = ptype + a, b, t = self._parse_bondtypes(line) + params.bond_types[(a, b)] = t + params.bond_types[(b, a)] = t elif current_section == 'angletypes': - words = line.split() - theta = float(words[4]) * u.degrees - k = (float(words[5]) / 2) * ( - u.kilojoules_per_mole / u.radians**2) - if words[3] != '1' and words[3] != '5': - warnings.warn('angletypes funct != 1 or 5; unknown ' - 'functional', GromacsWarning) - self.unknown_functional = True - if words[3] == '5': - # Contains the angle with urey-bradley - ub0 = float(words[6]) - cub = float(words[7]) / 2 - if cub == 0: - ub = NoUreyBradley - else: - ub0 *= u.nanometers - cub *= u.kilojoules_per_mole / u.nanometers**2 - ub = BondType(cub, ub0) - params.urey_bradley_types[(words[0], words[2])] = ub - params.urey_bradley_types[(words[2], words[0])] = ub - ptype = AngleType(k, theta) - params.angle_types[(words[0], words[1], words[2])] = ptype - params.angle_types[(words[2], words[1], words[0])] = ptype + a, b, c, t, ut = self._parse_angletypes(line) + params.angle_types[(a, b, c)] = t + params.angle_types[(c, b, a)] = t + if ut is not None: + params.urey_bradley_types[(a, c)] = ut + params.urey_bradley_types[(c, a)] = ut elif current_section == 'dihedraltypes': - words = line.split() - replace = False - dtype = 'normal' - # Ugh. Gromacs allows only two atom types (the middle atom - # types) to be specified. We have to figure out if that's - # the case here. - middle_only = words[2] in ('1', '2', '3', '4', '5', '8', - '9', '10', '11') - if middle_only: - a1 = a4 = 'X' - a2, a3 = words[:2] - si = 2 - else: - a1, a2, a3, a4 = words[:4] - si = 4 - improper_periodic = False - if words[si] == '1': - pass - elif words[si] == '4': - replace = True - improper_periodic = True - elif words[si] == '9': - pass - elif words[si] == '2': - replace = True - dtype = 'improper' - elif words[si] == '3': - dtype = 'rbtorsion' - else: - warnings.warn('dihedraltypes funct not supported', - GromacsWarning) - self.unknown_functional = True - # Do the proper types - if dtype == 'normal': - phase = float(words[si+1]) * u.degrees - phi_k = float(words[si+2]) * u.kilojoules_per_mole - per = int(words[si+3]) - dt = DihedralType(phi_k, per, phase, - scee=1/self.defaults.fudgeQQ, - scnb=1/self.defaults.fudgeLJ) - key = (a1, a2, a3, a4) - rkey = (a4, a3, a2, a1) - if improper_periodic: - # Impropers only ever have 1 term, and therefore - # always replace. - params.improper_periodic_types[key] = dt - params.improper_periodic_types[rkey] = dt - else: - if replace or not key in params.dihedral_types: - dtl = DihedralTypeList() - dtl.append(dt) - params.dihedral_types[key] = dtl - params.dihedral_types[rkey] = dtl - else: - params.dihedral_types[key].append(dt) - elif dtype == 'improper': - theta = float(words[si+1])*u.degrees - k = float(words[si+2])*u.kilojoules_per_mole/u.radians**2/2 - a1, a2, a3, a4 = sorted([a1, a2, a3, a4]) - ptype = ImproperType(k, theta) - params.improper_types[(a1, a2, a3, a4)] = ptype - elif dtype == 'rbtorsion': - a1, a2, a3, a4 = words[:4] - c0, c1, c2, c3, c4, c5 = [float(x)*u.kilojoules_per_mole - for x in words[si+1:si+7]] - ptype = RBTorsionType(c0, c1, c2, c3, c4, c5, - scee=1/self.defaults.fudgeQQ, - scnb=1/self.defaults.fudgeLJ) - params.rb_torsion_types[(a1, a2, a3, a4)] = ptype - params.rb_torsion_types[(a4, a3, a2, a1)] = ptype + key, knd, t, replace = self._parse_dihedraltypes(line) + rkey = tuple(reversed(key)) + if knd == 'normal': + if replace or key not in params.dihedral_types: + t = DihedralTypeList([t]) + params.dihedral_types[key] = t + params.dihedral_types[rkey] = t + elif key in params.dihedral_types: + params.dihedral_types[key].append(t, override=True) + elif knd == 'improper': + params.improper_types[key] = t + elif knd == 'improper_periodic': + params.improper_periodic_types[key] = t + params.improper_periodic_types[rkey] = t + elif knd == 'rbtorsion': + params.rb_torsion_types[key] = t + params.rb_torsion_types[rkey] = t elif current_section == 'cmaptypes': words = line.split() a1, a2, a3, a4, a5 = words[:5] - funct = int(words[5]) +# funct = int(words[5]) # ... unused res1, res2 = int(words[6]), int(words[7]) grid = [float(w) for w in words[8:]] * u.kilojoules_per_mole if len(grid) != res1 * res2: @@ -542,7 +417,7 @@ def read(self, fname, defines=None, parametrize=True): elif current_section == 'pairtypes': words = line.split() a1, a2 = words[:2] - funct = int(words[2]) +# funct = int(words[2]) # ... unused cs6, cs12 = (float(x) for x in words[3:5]) cs6 *= u.nanometers * 2**(1/6) cs12 *= u.kilojoules_per_mole @@ -770,6 +645,9 @@ def _parse_cmaps(self, line, atoms): def _parse_settles(self, line, atoms): """ Parses settles line; returns list of Bonds, list of BondTypes """ + # Instead of adding bonds that get constrained for waters (or other + # 3-atom molecules), GROMACS uses a "settles" section to specify the + # constraint geometry. We have to translate that into bonds. natoms = len([a for a in atoms if not isinstance(a, ExtraPoint)]) if natoms != 3: raise GromacsError("Cannot SETTLE a %d-atom molecule" % natoms) @@ -779,7 +657,7 @@ def _parse_settles(self, line, atoms): except ValueError: raise GromacsError('Can only SETTLE water; wrong atoms') #TODO see if there's a bond_type entry in the parameter set - # that we can fill in + # that we can fill in? Wait until this is needed... try: i, funct, doh, dhh = line.split() doh, dhh = float(doh), float(dhh) @@ -834,6 +712,139 @@ def _parse_vsites3(self, line, all_atoms, params): raise GromacsError('Unexpected bond b/w vsite and its parent') return Bond(vsite, parent, bt_vs), bt_vs + def _parse_atomtypes(self, line): + """ Parses line from atomtypes section, returns str, AtomType """ + words = line.split() + # Support the following spec, found in the Gromacs source + # code: + # Field 0 (mandatory) : nonbonded type name (string) + # Field 1 (optional) : bonded type (string) + # Field 2 (optional) : atomic number (int) + # Field 3 (mandatory) : mass (float) + # Field 4 (mandatory) : charge (float) + # Field 5 (mandatory) : particle type (single character) + attype = words[0] + if len(words[3]) == 1 and words[3] in letters: + atnum = -1 + sigidx = 4 +# ptypeidx = 3 # ... unused + massidx = 1 + bond_type = None + elif len(words[5]) == 1 and words[5] in letters: + sigidx = 6 +# ptypeidx = 5 # ... unused + massidx = 3 + atnum = int(words[2]) + bond_type = words[1] + else: +# ptypeidx = 4 # ... unused + massidx = 2 + sigidx = 5 + try: + atnum = int(words[1]) + bond_type = None + except ValueError: + # This must be a bonded type string + bond_type = words[1] + atnum = -1 + mass = float(words[massidx]) + if mass > 0 and atnum == -1: + atnum = AtomicNum[element_by_mass(mass)] + chg = float(words[massidx+1]) +# ptype = words[ptypeidx] # ... unused + sig = float(words[sigidx]) * u.nanometers + eps = float(words[sigidx+1]) * u.kilojoules_per_mole + typ = AtomType(attype, None, mass, atnum, + bond_type=bond_type, charge=chg) + typ.set_lj_params(eps, sig*2**(1/6)/2) + return attype, typ + + def _parse_bondtypes(self, line): + """ Parse bondtypes line. Returns str, str, BondType """ + words = line.split() + r = float(words[3]) * u.nanometers + k = (float(words[4]) / 2) * (u.kilojoules_per_mole / u.nanometers**2) + if words[2] != '1': + warnings.warn('bondtypes funct != 1; unknown functional', + GromacsWarning) + self.unknown_functional = True + return words[0], words[1], BondType(k, r) + + def _parse_angletypes(self, line): + """ + Parses angletypes line. Returns str, str, str, AngleType, BondType/None + """ + words = line.split() + theta = float(words[4]) * u.degrees + k = (float(words[5]) / 2) * (u.kilojoules_per_mole / u.radians**2) + if words[3] != '1' and words[3] != '5': + warnings.warn('angletypes funct != 1 or 5; unknown functional', + GromacsWarning) + self.unknown_functional = True + ub = None + if words[3] == '5': + # Contains the angle with urey-bradley + ub0 = float(words[6]) + cub = float(words[7]) / 2 + if cub == 0: + ub = NoUreyBradley + else: + ub0 *= u.nanometers + cub *= u.kilojoules_per_mole / u.nanometers**2 + ub = BondType(cub, ub0) + return words[0], words[1], words[2], AngleType(k, theta), ub + + def _parse_dihedraltypes(self, line): + """ Parse dihedraltypes, returns (str,str,str,str), str, Type, bool """ + words = line.split() + replace = False + dtype = 'normal' + # Ugh. Gromacs allows only two atom types (the middle atom types) to be + # specified. This signifies wild-cards + if words[2] in ('1', '2', '3', '4', '5', '8', '9', '10', '11'): + a1 = a4 = 'X' + a2, a3 = words[:2] + si = 2 + else: + a1, a2, a3, a4 = words[:4] + si = 4 + improper_periodic = False + replace = words[si] in ('1', '2', '3', '4') + improper_periodic = words[si] == '4' + if words[si] == '2': + dtype = 'improper' + elif words[si] == '3': + dtype = 'rbtorsion' + elif words[si] not in ('1', '4', '9'): + warnings.warn('dihedraltypes funct not supported', GromacsWarning) + self.unknown_functional = True + # Do the proper types + if dtype == 'normal': + phase = float(words[si+1]) * u.degrees + phi_k = float(words[si+2]) * u.kilojoules_per_mole + per = int(words[si+3]) + ptype = DihedralType(phi_k, per, phase, + scee=1/self.defaults.fudgeQQ, + scnb=1/self.defaults.fudgeLJ) + if improper_periodic: + # must do this here, since dtype has to be 'normal' above + dtype = 'improper_periodic' + elif dtype == 'improper': + theta = float(words[si+1])*u.degrees + k = float(words[si+2])*u.kilojoules_per_mole/u.radians**2/2 + a1, a2, a3, a4 = sorted([a1, a2, a3, a4]) + ptype = ImproperType(k, theta) + elif dtype == 'rbtorsion': + a1, a2, a3, a4 = words[:4] + c0, c1, c2, c3, c4, c5 = (float(x)*u.kilojoules_per_mole + for x in words[si+1:si+7]) + ptype = RBTorsionType(c0, c1, c2, c3, c4, c5, + scee=1/self.defaults.fudgeQQ, + scnb=1/self.defaults.fudgeLJ) + return (a1, a2, a3, a4), dtype, ptype, replace + + # Internal Dihedral processing routines for different kinds of dihedrals + def _process_normal_dihedral(self, words, atoms, i, j, k, l, dihedral_types, imp): dih = Dihedral(atoms[i], atoms[j], atoms[k], atoms[l], improper=imp) diff --git a/parmed/topologyobjects.py b/parmed/topologyobjects.py index ff9c6b347..42a954e70 100644 --- a/parmed/topologyobjects.py +++ b/parmed/topologyobjects.py @@ -6,14 +6,15 @@ """ from __future__ import division, print_function, absolute_import -from parmed.exceptions import MoleculeError, ParameterError +from copy import copy +import math +from parmed.exceptions import MoleculeError, ParameterError, ParameterWarning from parmed.constants import TINY, DEG_TO_RAD, RAD_TO_DEG import parmed.unit as u from parmed.utils.decorators import deprecated from parmed.utils.six import string_types, iteritems from parmed.utils.six.moves import zip, range -from copy import copy -import math +import warnings __all__ = ['Angle', 'AngleType', 'Atom', 'AtomList', 'Bond', 'BondType', 'ChiralFrame', 'Cmap', 'CmapType', 'Dihedral', 'DihedralType', @@ -2342,7 +2343,7 @@ def __eq__(self, other): return False return True - def append(self, other): + def append(self, other, override=False): """ Adds a DihedralType to the DihedralTypeList Parameters @@ -2350,23 +2351,34 @@ def append(self, other): other : :class:`DihedralType` The DihedralType instance to add to this list. It cannot have the same periodicity as any other DihedralType in the list + override : bool, optional, default=False + If True, this will override an existing torsion, but will raise a + warning if it does so Raises ------ TypeError if other is not an instance of :class:`DihedralTypeList` ParameterError if other has the same periodicity as another member in - this list + this list and override is False + + ParameterWarning if other has same periodicit as another member in this + list and override is True """ if not isinstance(other, DihedralType): raise TypeError('Can only add DihedralType to DihedralTypeList') - for existing in self: + for i, existing in enumerate(self): if existing.per == other.per: # Do not add duplicate periodicities if existing == other: return - raise ParameterError('Cannot add two DihedralType instances ' - 'with the same periodicity to the same ' - 'DihedralTypeList') + if override: + warnings.warn('Overriding DihedralType in DihedralTypeList ' + 'with same periodicity', ParameterWarning) + self[i] = other + else: + raise ParameterError('Cannot add two DihedralType ' + 'instances with the same periodicity ' + 'to the same DihedralTypeList') list.append(self, other) @property From b38d138a550e411e5d132f20ebbc53c9e36d6b41 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Fri, 22 Jan 2016 21:44:58 -0500 Subject: [PATCH 35/62] Finish pulling out parsing into separate methods. --- parmed/gromacs/gromacstop.py | 59 ++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/parmed/gromacs/gromacstop.py b/parmed/gromacs/gromacstop.py index 78730c758..9d83b5eb4 100644 --- a/parmed/gromacs/gromacstop.py +++ b/parmed/gromacs/gromacstop.py @@ -401,31 +401,12 @@ def read(self, fname, defines=None, parametrize=True): params.rb_torsion_types[key] = t params.rb_torsion_types[rkey] = t elif current_section == 'cmaptypes': - words = line.split() - a1, a2, a3, a4, a5 = words[:5] -# funct = int(words[5]) # ... unused - res1, res2 = int(words[6]), int(words[7]) - grid = [float(w) for w in words[8:]] * u.kilojoules_per_mole - if len(grid) != res1 * res2: - raise GromacsError('CMAP grid dimensions do not match ' - 'resolution') - if res1 != res2: - raise GromacsError('Only square CMAPs are supported') - cmaptype = CmapType(res1, grid) - params.cmap_types[(a1, a2, a3, a4, a5)] = cmaptype - params.cmap_types[(a5, a4, a3, a2, a1)] = cmaptype + a1, a2, a3, a4, a5, t = self._parse_cmaptypes(line) + params.cmap_types[(a1, a2, a3, a4, a5)] = t + params.cmap_types[(a5, a4, a3, a2, a1)] = t elif current_section == 'pairtypes': - words = line.split() - a1, a2 = words[:2] -# funct = int(words[2]) # ... unused - cs6, cs12 = (float(x) for x in words[3:5]) - cs6 *= u.nanometers * 2**(1/6) - cs12 *= u.kilojoules_per_mole - pairtype = NonbondedExceptionType(cs6, cs12, - self.defaults.fudgeQQ, list=self.adjust_types) - self.adjust_types.append(pairtype) - params.pair_types[(a1, a2)] = pairtype - params.pair_types[(a2, a1)] = pairtype + a, b, t = self._parse_pairtypes(line) + params.pair_types[(a, b)] = params.pair_types[(b, a)] = t itplist = f.included_files # Combine first, then parametrize. That way, we don't have to create @@ -454,6 +435,8 @@ def read(self, fname, defines=None, parametrize=True): if parametrize: self.parametrize() + #=================================================== + # Private parsing helper functions def _parse_atoms(self, line, params): @@ -843,6 +826,30 @@ def _parse_dihedraltypes(self, line): scnb=1/self.defaults.fudgeLJ) return (a1, a2, a3, a4), dtype, ptype, replace + def _parse_cmaptypes(self, line): + words = line.split() + a1, a2, a3, a4, a5 = words[:5] +# funct = int(words[5]) # ... unused + res1, res2 = int(words[6]), int(words[7]) + grid = [float(w) for w in words[8:]] * u.kilojoules_per_mole + if len(grid) != res1 * res2: + raise GromacsError('CMAP grid dimensions do not match ' + 'resolution') + if res1 != res2: + raise GromacsError('Only square CMAPs are supported') + return a1, a2, a3, a4, a5, CmapType(res1, grid) + + def _parse_pairtypes(self, line): + words = line.split() + a1, a2 = words[:2] +# funct = int(words[2]) # ... unused + cs6, cs12 = (float(x) for x in words[3:5]) + cs6 *= u.nanometers * 2**(1/6) + cs12 *= u.kilojoules_per_mole + return a1, a2, NonbondedExceptionType(cs6, cs12, self.defaults.fudgeQQ) + + #=================================================== + # Internal Dihedral processing routines for different kinds of dihedrals def _process_normal_dihedral(self, words, atoms, i, j, k, l, @@ -953,14 +960,14 @@ def update_typelist_from(ptypes, types): pair.type = params.pair_types[key] pair.type.used = True elif self.defaults.gen_pairs: + assert self.combining_rule in ('geometric', 'lorentz'), \ + 'Unrecognized combining rule' if self.combining_rule == 'geometric': eps = math.sqrt(pair.atom1.epsilon * pair.atom2.epsilon) sig = math.sqrt(pair.atom1.sigma * pair.atom2.sigma) elif self.combining_rule == 'lorentz': eps = math.sqrt(pair.atom1.epsilon * pair.atom2.epsilon) sig = 0.5 * (pair.atom1.sigma + pair.atom2.sigma) - else: - assert False, 'Unrecognized combining rule' eps *= self.defaults.fudgeLJ pairtype = NonbondedExceptionType(sig*2**(1/6), eps, self.defaults.fudgeQQ, list=self.adjust_types) From 3ff1e3a2c464bc211358c72fe15cf7948f84e6bc Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Fri, 22 Jan 2016 23:16:31 -0500 Subject: [PATCH 36/62] Make sure pairtypes are written when gen_pairs = no in Gromacs topology files --- parmed/gromacs/gromacstop.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/parmed/gromacs/gromacstop.py b/parmed/gromacs/gromacstop.py index 9d83b5eb4..b2135b085 100644 --- a/parmed/gromacs/gromacstop.py +++ b/parmed/gromacs/gromacstop.py @@ -1433,6 +1433,21 @@ def write(self, dest, combine=None, parameters='inline'): parfile.write('%-5s %-5s 1 %.5f %f\n' % (key[0], key[1], param.req/10, param.k*conv)) parfile.write('\n') + if params.pair_types and self.defaults.gen_pairs == 'no': + parfile.write('[ pairtypes ]\n') + parfile.write('; i j func sigma1-4 epsilon1-4 ;' + ' ; THESE ARE 1-4 INTERACTIONS\n') + econv = u.kilocalorie.conversion_factor_to(u.kilojoule) + lconv = u.angstrom.conversion_factor_to(u.nanometer) + used_keys = set() + for key, param in iteritems(params.pair_types): + if key in used_keys: continue + used_keys.add(key) + used_keys.add(tuple(reversed(key))) + parfile.write('%-5s %-5s 1 %.5f %.5f\n' % + (key[0], key[1], param.epsilon*econv, + param.sigma*lconv)) + parfile.write('\n') if params.angle_types: parfile.write('[ angletypes ]\n') parfile.write('; i j k func th0 cth ' @@ -1752,9 +1767,19 @@ def _write_molecule(struct, dest, title, params, writeparams): dest.write('[ pairs ]\n') dest.write(';%6s %6s %5s %10s %10s %10s %10s\n' % ('ai', 'aj', 'funct', 'c0', 'c1', 'c2', 'c3')) + econv = u.kilocalories.conversion_factor_to(u.kilojoules) + lconv = u.angstroms.conversion_factor_to(u.nanometer) for adjust in struct.adjusts: - dest.write('%7d %6d %5d\n' % (adjust.atom1.idx+1, + key = (_gettype(adjust.atom1), _gettype(adjust.atom2)) + dest.write('%7d %6d %5d' % (adjust.atom1.idx+1, adjust.atom2.idx+1, adjust.funct)) + if struct.defaults.gen_pairs == 'no' and (writeparams or + key not in params.pair_types or + adjust.type != params.pair_types[key]) and \ + adjust.type is not None: + dest.write(' %.5f %.5f' % (adjust.type.sigma*lconv, + adjust.type.epsilon*econv)) + dest.write('\n') dest.write('\n') elif struct.dihedrals: dest.write('[ pairs ]\n') From 85bae7828379ccc584a2d22add6a6ff0405dc87e Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Sat, 23 Jan 2016 00:47:16 -0500 Subject: [PATCH 37/62] Add a bunch of tests to GromacsTopologyFile. --- parmed/gromacs/gromacstop.py | 12 +-- test/files/gmxtops/duplicated_topol.top | 11 +++ test/test_parmed_gromacs.py | 126 +++++++++++++++++++++++- 3 files changed, 141 insertions(+), 8 deletions(-) diff --git a/parmed/gromacs/gromacstop.py b/parmed/gromacs/gromacstop.py index b2135b085..d5039c490 100644 --- a/parmed/gromacs/gromacstop.py +++ b/parmed/gromacs/gromacstop.py @@ -81,7 +81,7 @@ class _Defaults(object): """ Global properties of force fields as implemented in GROMACS """ - def __init__(self, nbfunc=1, comb_rule=2, gen_pairs='yes', + def __init__(self, nbfunc=1, comb_rule=2, gen_pairs='no', fudgeLJ=1.0, fudgeQQ=1.0): if int(nbfunc) not in (1, 2): raise ValueError('nbfunc must be 1 (L-J) or 2 (Buckingham)') @@ -228,7 +228,7 @@ def __init__(self, fname=None, defines=None, parametrize=True, from parmed import load_file super(GromacsTopologyFile, self).__init__() self.parameterset = None - self.defaults = _Defaults() + self.defaults = _Defaults(gen_pairs='yes') # make ParmEd's default yes if fname is not None: self.read(fname, defines, parametrize) # Fill in coordinates and unit cell information if appropriate @@ -326,7 +326,7 @@ def read(self, fname, defines=None, parametrize=True): self.title = line elif current_section == 'defaults': words = line.split() - if len(words) < 4: + if len(words) < 2: # 3, 4, and 5 fields are optional raise GromacsError('Too few fields in [ defaults ]') if words[0] != '1': warnings.warn('Unsupported nonbonded type; unknown ' @@ -668,11 +668,13 @@ def _parse_vsites3(self, line, all_atoms, params): # determine the bond length between the virtual site and its # parent atom parent = atoms[0] + if vsite in parent.bond_partners: + raise GromacsError('Unexpected bond b/w vsite and its parent') kws = dict() for bond in parent.bonds: if atoms[1] in bond: key = (_gettype(parent), _gettype(atoms[1])) - kws['dp1'] = (bond.type or params[key]).req + kws['dp1'] = (bond.type or params.bond_types[key]).req if atoms[2] in bond: key = (_gettype(bond.atom1), _gettype(bond.atom2)) kws['dp2'] = (bond.type or params.bond_types[key]).req @@ -691,8 +693,6 @@ def _parse_vsites3(self, line, all_atoms, params): bondlen = ThreeParticleExtraPointFrame.from_weights(parent, atoms[1], atoms[2], a, b, **kws) bt_vs = BondType(0, bondlen*u.angstroms) - if vsite in parent.bond_partners: - raise GromacsError('Unexpected bond b/w vsite and its parent') return Bond(vsite, parent, bt_vs), bt_vs def _parse_atomtypes(self, line): diff --git a/test/files/gmxtops/duplicated_topol.top b/test/files/gmxtops/duplicated_topol.top index d0d2f029c..ea1cf8b6e 100644 --- a/test/files/gmxtops/duplicated_topol.top +++ b/test/files/gmxtops/duplicated_topol.top @@ -208,6 +208,7 @@ Protein_chain_1 3 9 17 15 16 4 15 19 17 18 4 +#ifndef NODUP [ moleculetype ] ; Name nrexcl Protein_chain_1 3 @@ -398,6 +399,8 @@ Protein_chain_1 3 9 17 15 16 4 15 19 17 18 4 +#endif + ; Include Position restraint file #ifdef POSRES #include "posre.itp" @@ -422,4 +425,12 @@ Protein [ molecules ] ; Compound #mols +#ifdef NODUP +# ifdef BADNUM +Protein_chain_1 -1 +# else +Protein_chain_1 0 +# endif +#else Protein_chain_1 1 +#endif diff --git a/test/test_parmed_gromacs.py b/test/test_parmed_gromacs.py index 37a2f7d8a..c45f57427 100644 --- a/test/test_parmed_gromacs.py +++ b/test/test_parmed_gromacs.py @@ -4,7 +4,8 @@ import copy import numpy as np import os -from parmed import load_file, Structure, ExtraPoint, DihedralTypeList +from parmed import (load_file, Structure, ExtraPoint, DihedralTypeList, Atom, + ParameterSet, Bond) from parmed.exceptions import GromacsWarning, GromacsError from parmed.gromacs import GromacsTopologyFile, GromacsGroFile from parmed.gromacs._gromacsfile import GromacsFile @@ -24,6 +25,10 @@ def setUp(self): warnings.filterwarnings('error', category=GromacsWarning) FileIOTestCase.setUp(self) + def tearDown(self): + warnings.filterwarnings('always', category=GromacsWarning) + FileIOTestCase.tearDown(self) + def _charmm27_checks(self, top): # Check that the number of terms are correct self.assertEqual(len(top.atoms), 1960) @@ -261,10 +266,16 @@ def test_write_amber99SBILDN(self): top = load_file(get_fn('ildn.solv.top')) self.assertEqual(top.combining_rule, 'lorentz') fn = get_fn('ildn.solv.top', written=True) - GromacsTopologyFile.write(top, fn, combine=None) + top.write(fn, combine=None) top2 = load_file(fn) self._check_ff99sbildn(top2) self._check_equal_structures(top, top2) + # Turn off gen_pairs and write another version + top.defaults.gen_pairs = 'no' + top.write(fn) + top3 = load_file(fn) + self._check_ff99sbildn(top3) + self._check_equal_structures(top, top3) def test_duplicate_system_names(self): """ Tests that Gromacs topologies never have duplicate moleculetypes """ @@ -308,6 +319,31 @@ def test_bad_top_loads(self): self.assertRaises(ValueError, lambda: GromacsTopologyFile(xyz=1, box=1)) wfn = os.path.join(get_fn('gmxtops'), 'duplicated_topol.top') self.assertRaises(GromacsError, lambda: GromacsTopologyFile(wfn)) + f = StringIO('\n[ defaults ]\n; not enough data\n 1\n\n') + self.assertRaises(GromacsError, lambda: GromacsTopologyFile(f)) + f = StringIO('\n[ defaults ]\n; unsupported function type\n 2 1 yes\n') + self.assertRaises(GromacsWarning, lambda: GromacsTopologyFile(f)) + warnings.filterwarnings('ignore', category=GromacsWarning) + f.seek(0) + self.assertTrue(GromacsTopologyFile(f).unknown_functional) + warnings.filterwarnings('error', category=GromacsWarning) + fn = os.path.join(get_fn('gmxtops'), 'bad_vsites3.top') + self.assertRaises(GromacsError, lambda: load_file(fn)) + self.assertRaises(ValueError, lambda: load_file(fn, defines=dict())) + f = StringIO('\n[ defaults ]\n1 1 yes\n\n[ system ]\nname\n' + '[ molecules ]\nNOMOL 2\n') + self.assertRaises(GromacsError, lambda: GromacsTopologyFile(f)) + fn = os.path.join(get_fn('gmxtops'), 'bad_nrexcl.top') + self.assertRaises(GromacsWarning, lambda: + GromacsTopologyFile(fn, defines=dict(SMALL_NREXCL=1)) + ) + self.assertRaises(GromacsWarning, lambda: GromacsTopologyFile(fn)) + self.assertRaises(GromacsWarning, lambda: + GromacsTopologyFile(wfn, defines=dict(NODUP=1)) + ) + self.assertRaises(GromacsError, lambda: + GromacsTopologyFile(wfn, defines=dict(NODUP=1, BADNUM=1)) + ) def test_top_parsing_missing_types(self): """ Test GROMACS topology files with missing types """ @@ -451,6 +487,92 @@ def setter(idx, val): _equal_atoms = utils.equal_atoms +class TestGromacsTopHelperFunctions(FileIOTestCase): + """ Test GROMACS helper functions """ + + def setUp(self): + self.top = GromacsTopologyFile() + self.top.add_atom(Atom(name='C1'), 'ABC', 1) + self.top.add_atom(Atom(name='C1'), 'DEF', 2) + self.top.add_atom(Atom(name='C1'), 'GHI', 3) + self.top.add_atom(Atom(name='C1'), 'JKL', 4) + self.top.add_atom(Atom(name='C1'), 'MNO', 5) + self.top.add_atom(Atom(name='C1'), 'PQR', 5) + warnings.filterwarnings('error', category=GromacsWarning) + FileIOTestCase.setUp(self) + + def test_parse_pairs(self): + """ Test GromacsTopologyFile._parse_pairs """ + self.assertRaises(GromacsWarning, lambda: + self.top._parse_pairs('1 2 3\n', dict(), self.top.atoms)) + warnings.filterwarnings('ignore', category=GromacsWarning) + self.top._parse_pairs('1 2 3\n', dict(), self.top.atoms) + self.assertTrue(self.top.unknown_functional) + + def test_parse_angles(self): + """ Test GromacsTopologyFile._parse_angles """ + self.assertRaises(GromacsWarning, lambda: + self.top._parse_angles('1 2 3 2\n', dict(), dict(), + self.top.atoms) + ) + warnings.filterwarnings('ignore', category=GromacsWarning) + self.top._parse_angles('1 2 3 2\n', dict(), dict(), self.top.atoms) + self.assertTrue(self.top.unknown_functional) + + def test_parse_dihedrals(self): + """ Test GromacsTopologyFile._parse_dihedrals """ + self.assertRaises(GromacsWarning, lambda: + self.top._parse_dihedrals('1 2 3 4 100\n', dict(), dict(), + self.top) + ) + warnings.filterwarnings('ignore', category=GromacsWarning) + self.top._parse_dihedrals('1 2 3 4 100\n', dict(), dict(), self.top) + self.assertTrue(self.top.unknown_functional) + self.assertEqual(len(self.top.dihedrals), 1) + dih = self.top.dihedrals[0] + self.assertIs(dih.atom1, self.top[0]) + self.assertIs(dih.atom2, self.top[1]) + self.assertIs(dih.atom3, self.top[2]) + self.assertIs(dih.atom4, self.top[3]) + self.assertIs(dih.type, None) + + def test_parse_cmaps(self): + """ Test GromacsTopologyFile._parse_cmaps """ + self.assertRaises(GromacsWarning, lambda: + self.top._parse_cmaps('1 2 3 4 5 2\n', self.top.atoms)) + warnings.filterwarnings('ignore', category=GromacsWarning) + self.top._parse_cmaps('1 2 3 4 5 2\n', self.top.atoms) + self.assertTrue(self.top.unknown_functional) + + def test_parse_settles(self): + """ Test GromacsTopologyFile._parse_settles """ + self.assertRaises(GromacsError, lambda: + self.top._parse_settles('whatever', self.top.atoms)) + self.assertRaises(GromacsError, lambda: + self.top._parse_settles('whatever', self.top.atoms[:3])) + self.top[0].atomic_number = 8 + self.top[1].atomic_number = self.top[2].atomic_number = 1 + self.assertRaises(GromacsError, lambda: + self.top._parse_settles('1 2 nofloat nofloat\n', + self.top.atoms[:3]) + ) + + def test_parse_vsite3(self): + """ Test GromacsTopologyFile._parse_vsites3 """ + self.assertRaises(GromacsError, lambda: + self.top._parse_vsites3('1 2 3 4 1 1.2 1.3\n', self.top.atoms, + ParameterSet()) + ) + self.assertRaises(GromacsError, lambda: + self.top._parse_vsites3('1 2 3 4 2 1.2 1.3\n', self.top.atoms, + ParameterSet()) + ) + bond = Bond(self.top[0], self.top[1]) + self.assertRaises(GromacsError, lambda: + self.top._parse_vsites3('1 2 3 4 1 1.2 1.2', self.top.atoms, + ParameterSet()) + ) + class TestGromacsGro(FileIOTestCase): """ Tests the Gromacs GRO file parser """ From 7d250adf20f7c9d5cb66442e10ecda1749408ea8 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 08:26:51 -0500 Subject: [PATCH 38/62] Fix up GromacsTopologyFile writing when not writing parameters in-line. Also adds a `join_dihedrals` method to Structure to combine all dihedral types into a DihedralTypeList (Fourier series), and remove redundant dihedrals. --- parmed/gromacs/gromacstop.py | 78 ++++------ parmed/structure.py | 48 +++++- test/test_parmed_gromacs.py | 289 ++++++++++++++++++++++++++++++++++- 3 files changed, 356 insertions(+), 59 deletions(-) diff --git a/parmed/gromacs/gromacstop.py b/parmed/gromacs/gromacstop.py index d5039c490..98c6b9e71 100644 --- a/parmed/gromacs/gromacstop.py +++ b/parmed/gromacs/gromacstop.py @@ -11,7 +11,7 @@ import math import os from parmed.constants import TINY, DEG_TO_RAD -from parmed.exceptions import GromacsError, GromacsWarning, ParameterWarning +from parmed.exceptions import GromacsError, GromacsWarning, ParameterError from parmed.formats.registry import FileFormatType from parmed.parameters import ParameterSet from parmed.gromacs._gromacsfile import GromacsFile @@ -833,8 +833,7 @@ def _parse_cmaptypes(self, line): res1, res2 = int(words[6]), int(words[7]) grid = [float(w) for w in words[8:]] * u.kilojoules_per_mole if len(grid) != res1 * res2: - raise GromacsError('CMAP grid dimensions do not match ' - 'resolution') + raise GromacsError('CMAP grid dimensions do not match resolution') if res1 != res2: raise GromacsError('Only square CMAPs are supported') return a1, a2, a3, a4, a5, CmapType(res1, grid) @@ -875,13 +874,6 @@ def _process_dihedral_series(self, words, dihtype=None): scee=1/self.defaults.fudgeQQ, scnb=1/self.defaults.fudgeLJ) if dihtype is not None: - for edt in dihtype: - if edt.per == dt.per: - raise GromacsError( - 'duplicate periodicity term found ' - 'in inline dihedral parameter for ' - 'atoms [%s]' % ', '.join(words[:4]) - ) dihtype.append(dt) dtl = None else: @@ -959,7 +951,7 @@ def update_typelist_from(ptypes, types): if key in params.pair_types: pair.type = params.pair_types[key] pair.type.used = True - elif self.defaults.gen_pairs: + elif self.defaults.gen_pairs == 'yes': assert self.combining_rule in ('geometric', 'lorentz'), \ 'Unrecognized combining rule' if self.combining_rule == 'geometric': @@ -975,8 +967,7 @@ def update_typelist_from(ptypes, types): pair.type = pairtype pair.type.used = True else: - warnings.warn('Not all pair parameters can be found', - ParameterWarning) + raise ParameterError('Not all pair parameters can be found') update_typelist_from(params.pair_types, self.adjust_types) # This is the list of 1-4 pairs determined from the bond graph. # If this is different from what's in [ pairs ], we print a warning @@ -1001,8 +992,7 @@ def update_typelist_from(ptypes, types): bond.type = params.bond_types[key] bond.type.used = True else: - warnings.warn('Not all bond parameters found', - ParameterWarning) + raise ParameterError('Not all bond parameters found') if len(true_14 - gmx_pair) > 0: zero_pairtype = NonbondedExceptionType(0.0, 0.0, 0.0, list=self.adjust_types) @@ -1029,8 +1019,7 @@ def update_typelist_from(ptypes, types): angle.type = params.angle_types[key] angle.type.used = True else: - warnings.warn('Not all angle parameters found', - ParameterWarning) + raise ParameterError('Not all angle parameters found') update_typelist_from(params.angle_types, self.angle_types) for ub in self.urey_bradleys: if ub.type is not None: continue @@ -1040,8 +1029,7 @@ def update_typelist_from(ptypes, types): if ub.type is not NoUreyBradley: ub.type.used = True else: - warnings.warn('Not all urey-bradley parameters found', - ParameterWarning) + raise ParameterError('Not all urey-bradley parameters found') # Now strip out all of the Urey-Bradley terms whose parameters are 0 for i in reversed(range(len(self.urey_bradleys))): if self.urey_bradleys[i].type is NoUreyBradley: @@ -1070,8 +1058,7 @@ def update_typelist_from(ptypes, types): t.type = params.dihedral_types[wckey] t.type.used = True else: - warnings.warn('Not all torsion parameters found', - ParameterWarning) + raise ParameterError('Not all torsion parameters found') else: if key in params.improper_periodic_types: t.type = params.improper_periodic_types[key] @@ -1086,8 +1073,8 @@ def update_typelist_from(ptypes, types): t.type.used = True break else: - warnings.warn('Not all improper torsion parameters ' - 'found', ParameterWarning) + raise ParameterError('Not all improper torsion ' + 'parameters found') update_typelist_from(params.dihedral_types, self.dihedral_types) update_typelist_from(params.improper_periodic_types, self.dihedral_types) for t in self.rb_torsions: @@ -1112,8 +1099,7 @@ def update_typelist_from(ptypes, types): t.type = params.rb_torsion_types[wckey] t.type.used = True else: - warnings.warn('Not all R-B torsion parameters found', - ParameterWarning) + raise ParameterError('Not all R-B torsion parameters found') update_typelist_from(params.rb_torsion_types, self.rb_torsion_types) self.update_dihedral_exclusions() for t in self.impropers: @@ -1135,8 +1121,7 @@ def update_typelist_from(ptypes, types): t.type.used = True break else: - warnings.warn('Not all quadratic improper parameters found', - ParameterWarning) + raise ParameterError('Not all improper parameters found') update_typelist_from(params.improper_types, self.improper_types) for c in self.cmaps: if c.type is not None: continue @@ -1146,7 +1131,7 @@ def update_typelist_from(ptypes, types): c.type = params.cmap_types[key] c.type.used = True else: - warnings.warn('Not all cmap parameters found', ParameterWarning) + raise ParameterError('Not all cmap parameters found') update_typelist_from(params.cmap_types, self.cmap_types) #=================================================== @@ -1209,6 +1194,7 @@ def from_structure(cls, struct, copy=False): gmxtop = cls() if copy: struct = _copy(struct) + struct.join_dihedrals() gmxtop.atoms = struct.atoms gmxtop.residues = struct.residues gmxtop.bonds = struct.bonds @@ -1235,8 +1221,7 @@ def from_structure(cls, struct, copy=False): struct.torsion_torsions or struct.chiral_frames or struct.multipole_frames): - raise TypeError('GromacsTopologyFile does not support Amoeba ' - 'potential terms') + raise TypeError('GromacsTopologyFile does not support Amoeba FF') # Now check what the 1-4 scaling factors should be if hasattr(struct, 'defaults') and isinstance(struct.defaults, _Defaults): @@ -1273,6 +1258,7 @@ def from_structure(cls, struct, copy=False): if gmxtop.combining_rule == 'geometric': gmxtop.defaults.comb_rule = 3 + gmxtop.parameterset = ParameterSet.from_structure(struct) return gmxtop #=================================================== @@ -1306,7 +1292,7 @@ def write(self, dest, combine=None, parameters='inline'): from parmed import __version__ own_handle = False fname = '' - params = ParameterSet.from_structure(self) + params = self.parameterset or ParameterSet.from_structure(self) if isinstance(dest, string_types): fname = '%s ' % dest dest = genopen(dest, 'w') @@ -1342,17 +1328,9 @@ def write(self, dest, combine=None, parameters='inline'): raise ValueError('combine must be None, list of indices, ' 'or "all"') else: - try: - it = iter(combine) - except TypeError: - raise TypeError('combine must be a list of molecule index ' - 'lists') combine_lists = [] - for indices in it: - try: - indices = sorted(set(indices)) - except TypeError: - raise ValueError('combine must be a list of iterables') + for indices in combine: + indices = sorted(set(indices)) if any((indices[i+1] - indices[i]) != 1 for i in range(len(indices)-1)): raise ValueError('Can only combine adjacent molecules') @@ -1454,7 +1432,7 @@ def write(self, dest, combine=None, parameters='inline'): ' rub kub\n') used_keys = set() conv = (u.kilocalorie/u.radian**2).conversion_factor_to( - u.kilojoule/u.nanometer**2) * 2 + u.kilojoule/u.radian**2) * 2 bconv = (u.kilocalorie/u.angstrom**2).conversion_factor_to( u.kilojoule/u.nanometer**2) * 2 for key, param in iteritems(params.angle_types): @@ -1479,16 +1457,15 @@ def write(self, dest, combine=None, parameters='inline'): 'pn\n') used_keys = set() conv = u.kilocalories.conversion_factor_to(u.kilojoules) - fmt = '%-6s %-6s %-6s %d %.2f %.6f %d\n' + fmt = '%-6s %-6s %-6s %-6s %d %.2f %.6f %d\n' for key, param in iteritems(params.dihedral_types): if key in used_keys: continue used_keys.add(key) used_keys.add(tuple(reversed(key))) if isinstance(param, DihedralTypeList): - funct = 9 for dt in param: parfile.write(fmt % (key[0], key[1], key[2], - key[3], funct, dt.phase, + key[3], 9, dt.phase, dt.phi_k*conv, int(dt.per))) else: funct = 1 @@ -1502,7 +1479,7 @@ def write(self, dest, combine=None, parameters='inline'): 'pn\n') used_keys = set() conv = u.kilojoules.conversion_factor_to(u.kilocalories) - fmt = '%-6s %-6s %-6s %d %.2f %.6f %d\n' + fmt = '%-6s %-6s %-6s %-6s %d %.2f %.6f %d\n' for key, param in iteritems(params.improper_periodic_types): if key in used_keys: continue used_keys.add(key) @@ -1856,17 +1833,18 @@ def _write_molecule(struct, dest, title, params, writeparams): if writeparams or key not in typedict or \ _diff_diheds(dihed.type, typedict[key]): if isinstance(dihed.type, DihedralTypeList): - dest.write(' %.5f %.5f %d\n' % (dihed.type[0].phase, + dest.write(' %.5f %.5f %d' % (dihed.type[0].phase, dihed.type[0].phi_k*conv, int(dihed.type[0].per))) for dt in dihed.type[1:]: - dest.write('%7d %6d %6d %6d %5d %.5f %.5f %d\n' % + dest.write('\n%7d %6d %6d %6d %5d %.5f %.5f %d' % (dihed.atom1.idx+1, dihed.atom2.idx+1, dihed.atom3.idx+1, dihed.atom4.idx+1, dihed.funct, dt.phase, dt.phi_k*conv, int(dt.per))) else: - dest.write(' %.5f %.5f %d\n' % (dihed.type.phase, + dest.write(' %.5f %.5f %d' % (dihed.type.phase, dihed.type.phi_k*conv, int(dihed.type.per))) + dest.write('\n') dest.write('\n') # RB-torsions if struct.rb_torsions: @@ -2067,7 +2045,7 @@ def _diff_diheds(dt1, dt2): be a DihedralTypeList. This returns True if dt1 == dt2 *or* dt1 is equal to the only element of dt2 """ - if dt1 == dt2: + if type(dt1) is type(dt2) and dt1 == dt2: return False if isinstance(dt2, DihedralTypeList) and isinstance(dt1, DihedralType): if len(dt2) == 1 and dt2[0] == dt1: return False diff --git a/parmed/structure.py b/parmed/structure.py index 176ad0ee4..0f30ee6ce 100644 --- a/parmed/structure.py +++ b/parmed/structure.py @@ -38,11 +38,11 @@ box_vectors_to_lengths_and_angles) from parmed.residue import SOLVENT_NAMES from parmed.topologyobjects import (AtomList, ResidueList, TrackedList, - DihedralTypeList, Bond, Angle, Dihedral, UreyBradley, Improper, Cmap, - TrigonalAngle, OutOfPlaneBend, PiTorsion, StretchBend, TorsionTorsion, - NonbondedException, AcceptorDonor, Group, Atom, ExtraPoint, + DihedralTypeList, DihedralType, Bond, Angle, Dihedral, UreyBradley, + Improper, Cmap, TrigonalAngle, OutOfPlaneBend, PiTorsion, StretchBend, + TorsionTorsion, NonbondedException, AcceptorDonor, Group, ExtraPoint, TwoParticleExtraPointFrame, ChiralFrame, MultipoleFrame, NoUreyBradley, - ThreeParticleExtraPointFrame, OutOfPlaneExtraPointFrame) + ThreeParticleExtraPointFrame, OutOfPlaneExtraPointFrame, Atom) from parmed import unit as u from parmed.utils import tag_molecules, PYPY from parmed.utils.decorators import needs_openmm @@ -647,7 +647,7 @@ def copy(self, cls, split_dihedrals=False): ) for g in self.groups: c.groups.append(Group(atoms[g.atom.idx], g.type, g.move)) - c._box = copy(self.box) + c._box = copy(self.box).reshape(-1, 6) c._coordinates = copy(self._coordinates) c.combining_rule = self.combining_rule return c @@ -1379,6 +1379,44 @@ def save(self, fname, format=None, overwrite=False, **kwargs): #=================================================== + def join_dihedrals(self): + """ + Joins multi-term torsions into a single term and makes all of the + parameters DihedralTypeList instances. If any dihedrals are *already* + DihedralTypeList instances, or any are not parametrized, or there are no + dihedral_types, this method returns without doing anything + """ + if not self.dihedral_types: + return # nothing to do + if any(isinstance(t, DihedralTypeList) for t in self.dihedral_types): + return # already done + if any(d.type is None for d in self.dihedrals): + return # Not fully parametrized + dihedrals_to_delete = list() + dihedrals_processed = dict() + new_dihedral_types = TrackedList() + for i, d in enumerate(self.dihedrals): + if d.atom1 < d.atom4: + key = (d.atom1, d.atom2, d.atom3, d.atom4) + else: + key = (d.atom4, d.atom3, d.atom2, d.atom1) + if key in dihedrals_processed: + dihedrals_processed[key].append(d.type) + dihedrals_to_delete.append(i) + else: + dihedrals_processed[key] = dtl = DihedralTypeList() + dtl.append(d.type) + new_dihedral_types.append(dtl) + d.type = dtl + # Now drop the new dihedral types into place + self.dihedral_types = new_dihedral_types + # Remove the "duplicate" dihedrals + for i in reversed(dihedrals_to_delete): + self.dihedrals[i].delete() + del self.dihedrals[i] + + #=================================================== + @property def combining_rule(self): return self._combining_rule diff --git a/test/test_parmed_gromacs.py b/test/test_parmed_gromacs.py index c45f57427..68592de85 100644 --- a/test/test_parmed_gromacs.py +++ b/test/test_parmed_gromacs.py @@ -5,19 +5,21 @@ import numpy as np import os from parmed import (load_file, Structure, ExtraPoint, DihedralTypeList, Atom, - ParameterSet, Bond) -from parmed.exceptions import GromacsWarning, GromacsError + ParameterSet, Bond, NonbondedException, DihedralType, + RBTorsionType, Improper, Cmap) +from parmed.exceptions import GromacsWarning, GromacsError, ParameterError from parmed.gromacs import GromacsTopologyFile, GromacsGroFile from parmed.gromacs._gromacsfile import GromacsFile from parmed import gromacs as gmx from parmed.topologyobjects import UnassignedAtomType from parmed.utils.six.moves import range, zip, StringIO import unittest -from utils import get_fn, diff_files, get_saved_fn, FileIOTestCase, HAS_GROMACS +from utils import (get_fn, diff_files, get_saved_fn, FileIOTestCase, HAS_GROMACS, + create_random_structure) import utils import warnings -@unittest.skipIf(not HAS_GROMACS, "Cannot run GROMACS tests without Gromacs") +@unittest.skipUnless(HAS_GROMACS, "Cannot run GROMACS tests without Gromacs") class TestGromacsTop(FileIOTestCase): """ Tests the Gromacs topology file parser """ @@ -287,6 +289,20 @@ def test_duplicate_system_names(self): top2 = GromacsTopologyFile(get_fn('phenol_biphenyl.top', written=True)) self.assertEqual(len(top.residues), 40) + def test_gromacs_top_from_structure(self): + """ Tests the GromacsTopologyFile.from_structure constructor """ + struct = create_random_structure(True) + self.assertRaises(TypeError, lambda: + GromacsTopologyFile.from_structure(struct)) + parm = load_file(get_fn('ash.parm7')) + parm.dihedrals[0].type.scee = 8.0 + self.assertRaises(GromacsError, lambda: + GromacsTopologyFile.from_structure(parm)) + for dt in parm.dihedral_types: dt.scee = dt.scnb = 0 + top = GromacsTopologyFile.from_structure(parm) + self.assertEqual(top.defaults.fudgeLJ, 1.0) + self.assertEqual(top.defaults.fudgeQQ, 1.0) + def test_OPLS(self): """ Tests the geometric combining rules in Gromacs with OPLS/AA """ parm = load_file(os.path.join(get_fn('05.OPLS'), 'topol.top'), @@ -303,6 +319,18 @@ def test_OPLS(self): xyz=parm.coordinates, box=[10, 10, 10, 90, 90, 90]) np.testing.assert_equal(parm2.coordinates, parm.coordinates) np.testing.assert_equal(parm2.box, [10, 10, 10, 90, 90, 90]) + # Check the copy constructor + p2 = GromacsTopologyFile.from_structure(parm, copy=True) + self.assertEqual(p2.combining_rule, 'geometric') + self.assertEqual(p2.defaults.comb_rule, 3) + self.assertEqual(len(p2.atoms), len(parm.atoms)) + for a1, a2 in zip(p2.atoms, parm.atoms): + self.assertIsNot(a1, a2) + self.assertEqual(a1.name, a2.name) + self.assertEqual(a1.type, a2.type) + self.assertEqual(a1.atomic_number, a2.atomic_number) + self.assertEqual(a1.mass, a2.mass) + np.testing.assert_equal(p2.box, parm.box) def test_without_parametrize(self): """ Tests loading a Gromacs topology without parametrizing """ @@ -344,6 +372,7 @@ def test_bad_top_loads(self): self.assertRaises(GromacsError, lambda: GromacsTopologyFile(wfn, defines=dict(NODUP=1, BADNUM=1)) ) + self.assertRaises(RuntimeError, GromacsTopologyFile().parametrize) def test_top_parsing_missing_types(self): """ Test GROMACS topology files with missing types """ @@ -433,6 +462,38 @@ def test_molecule_combine(self): for a1, a2 in zip(r1, r2): self._equal_atoms(a1, a2) + def test_gromacs_top_write(self): + """ Tests the GromacsTopologyFile writer """ + def total_diheds(dlist): + n = 0 + for d in dlist: + if isinstance(d.type, DihedralTypeList): + n += len(d.type) + elif not d.improper: + n += 1 + return n + parm = load_file(get_fn('ash.parm7')) + top = GromacsTopologyFile.from_structure(parm) + self.assertRaises(TypeError, lambda: top.write(10)) + f = StringIO() + self.assertRaises(ValueError, lambda: top.write(f, parameters=10)) + # Write parameters and topology to same filename + fn = get_fn('test.top')#, written=True) + top.write(fn, parameters=fn) + top2 = load_file(fn) + self.assertEqual(len(top2.atoms), len(top.atoms)) + self.assertEqual(len(top2.bonds), len(top.bonds)) + self.assertEqual(len(top2.angles), len(top.angles)) + self.assertEqual(total_diheds(top2.dihedrals), total_diheds(top.dihedrals)) + for a1, a2 in zip(top2.atoms, top.atoms): + self.assertAlmostEqual(a1.atom_type.sigma, a2.atom_type.sigma, places=3) + self.assertAlmostEqual(a1.atom_type.epsilon, a2.atom_type.epsilon, places=3) + self.assertEqual(a1.atom_type.name, a2.atom_type.name) + self.assertEqual(a1.name, a2.name) + self.assertEqual(a1.type, a2.type) + self.assertEqual(set(a.name for a in a1.bond_partners), + set(a.name for a in a2.bond_partners)) + def test_private_functions(self): """ Tests private helper functions for GromacsTopologyFile """ Defaults = gmx.gromacstop._Defaults @@ -487,6 +548,171 @@ def setter(idx, val): _equal_atoms = utils.equal_atoms +class TestGromacsMissingParameters(FileIOTestCase): + """ Test handling of missing parameters """ + + def setUp(self): + self.top = load_file(get_fn('ildn.solv.top'), parametrize=False) + warnings.filterwarnings('error', category=GromacsWarning) + FileIOTestCase.setUp(self) + + def tearDown(self): + warnings.filterwarnings('always', category=GromacsWarning) + FileIOTestCase.tearDown(self) + + def test_missing_pairtypes(self): + """ Tests handling of missing pairtypes parameters """ + self.top.defaults.gen_pairs = 'no' + self.assertRaises(ParameterError, self.top.parametrize) + + def test_missing_bondtypes(self): + """ Tests handling of missing bondtypes parameters """ + b1 = self.top.bonds[0] + del self.top.parameterset.bond_types[(b1.atom1.type, b1.atom2.type)] + del self.top.parameterset.bond_types[(b1.atom2.type, b1.atom1.type)] + self.assertRaises(ParameterError, self.top.parametrize) + + def test_extra_pairs(self): + """ Tests warning if "extra" exception pair found """ + self.top.adjusts.append(NonbondedException(self.top[0], self.top[-1])) + self.assertRaises(GromacsWarning, self.top.parametrize) + + def test_missing_angletypes(self): + """ Tests handling of missing angletypes parameters """ + a1 = self.top.angles[0] + key = (a1.atom1.type, a1.atom2.type, a1.atom3.type) + del self.top.parameterset.angle_types[key] + if key != tuple(reversed(key)): + del self.top.parameterset.angle_types[tuple(reversed(key))] + self.assertRaises(ParameterError, self.top.parametrize) + + def test_missing_wildcard_dihedraltypes(self): + """ Tests handling of wild-card dihedraltypes parameters """ + def get_key(d, wc=None): + if wc is None: + return (d.atom1.type, d.atom2.type, d.atom3.type, d.atom4.type) + if wc == 0: + return ('X', d.atom2.type, d.atom3.type, d.atom4.type) + if wc == 3: + return (d.atom1.type, d.atom2.type, d.atom3.type, 'X') + else: + return ('X', d.atom2.type, d.atom3.type, 'X') + d1 = self.top.dihedrals[0] + for d in self.top.dihedrals: + if get_key(d) == get_key(d1): continue + if get_key(d, 0) == get_key(d1, 0): continue + if get_key(d, 3) == get_key(d1, 3): continue + if get_key(d, 0) == get_key(d1, 3): continue + if get_key(d1, 0) == get_key(d, 3): continue + if d.improper: continue + if d.type is not None: continue + d2 = d + break + else: + assert False, 'Bad test parm' + # Now make sure the two dihedrals match where only one wild-card is + # present + params = self.top.parameterset + if get_key(d1) in params.dihedral_types: + del params.dihedral_types[get_key(d1)] + del params.dihedral_types[tuple(reversed(get_key(d1)))] + if get_key(d2) in params.dihedral_types: + del params.dihedral_types[get_key(d2)] + del params.dihedral_types[tuple(reversed(get_key(d2)))] + dt1 = DihedralTypeList([DihedralType(10, 180, 1)]) + dt2 = DihedralTypeList([DihedralType(11, 0, 2)]) + params.dihedral_types[get_key(d1, 0)] = dt1 + params.dihedral_types[tuple(reversed(get_key(d1, 0)))] = dt1 + params.dihedral_types[get_key(d2, 3)] = dt2 + params.dihedral_types[tuple(reversed(get_key(d2, 3)))] = dt2 + + self.top.parametrize() + self.assertEqual(d1.type, dt1) + self.assertEqual(d2.type, dt2) + + def test_missing_dihedraltypes(self): + """ Tests handling of missing dihedraltypes parameters """ + def get_key(d, wc=None): + if wc is None: + return (d.atom1.type, d.atom2.type, d.atom3.type, d.atom4.type) + if wc == 0: + return ('X', d.atom2.type, d.atom3.type, d.atom4.type) + if wc == 3: + return (d.atom1.type, d.atom2.type, d.atom3.type, 'X') + else: + return ('X', d.atom2.type, d.atom3.type, 'X') + for d in self.top.dihedrals: + if d.type is not None: continue + break + params = self.top.parameterset + if get_key(d) in params.dihedral_types: + del params.dihedral_types[get_key(d)] + del params.dihedral_types[tuple(reversed(get_key(d)))] + if get_key(d, wc=100) in params.dihedral_types: + del params.dihedral_types[get_key(d, wc=100)] + del params.dihedral_types[tuple(reversed(get_key(d, wc=100)))] + self.assertRaises(ParameterError, self.top.parametrize) + + def test_missing_impropertypes(self): + """ Tests handling of missing improper type """ + for key in set(self.top.parameterset.improper_periodic_types.keys()): + del self.top.parameterset.improper_periodic_types[key] + self.assertRaises(ParameterError, self.top.parametrize) + + def test_wildcard_rbtorsions(self): + """ Tests handling of missing and wild-cards with R-B torsion types """ + def get_key(d, wc=None): + if wc is None: + return (d.atom1.type, d.atom2.type, d.atom3.type, d.atom4.type) + if wc == 0: + return ('X', d.atom2.type, d.atom3.type, d.atom4.type) + if wc == 3: + return (d.atom1.type, d.atom2.type, d.atom3.type, 'X') + else: + return ('X', d.atom2.type, d.atom3.type, 'X') + for i, d1 in enumerate(self.top.dihedrals): + if not d1.improper and d1.type is None: + break + else: + assert False, 'Bad topology file for test' + del self.top.dihedrals[i] + for i, d2 in enumerate(self.top.dihedrals): + if get_key(d1) == get_key(d2): continue + if get_key(d1, 0) == get_key(d2, 0): continue + if get_key(d1, 3) == get_key(d2, 3): continue + if get_key(d1, 0) == get_key(d2, 3): continue + if get_key(d2, 0) == get_key(d1, 3): continue + if not d2.improper and d2.type is None: + break + else: + assert False, 'Bad topology file for test' + del self.top.dihedrals[i] + self.top.rb_torsions.extend([d1, d2]) + self.assertRaises(ParameterError, self.top.parametrize) + # Now assign wild-cards + params = self.top.parameterset + rbt = RBTorsionType(1, 2, 3, 4, 5, 6) + params.rb_torsion_types[get_key(d1, 0)] = rbt + params.rb_torsion_types[tuple(reversed(get_key(d1, 0)))] = rbt + rbt2 = RBTorsionType(2, 3, 4, 5, 6, 7) + params.rb_torsion_types[get_key(d2, 1)] = rbt2 + params.rb_torsion_types[tuple(reversed(get_key(d2, 1)))] = rbt2 + + self.top.parametrize() + + self.assertEqual(d1.type, rbt) + self.assertEqual(d2.type, rbt2) + + def test_missing_impropers(self): + """ Test handling of missing impropers """ + self.top.impropers.append(Improper(*tuple(self.top.atoms[:4]))) + self.assertRaises(ParameterError, self.top.parametrize) + + def test_missing_cmaps(self): + """ Test handling of missing cmaptypes """ + self.top.cmaps.append(Cmap(*tuple(self.top.atoms[:5]))) + self.assertRaises(ParameterError, self.top.parametrize) + class TestGromacsTopHelperFunctions(FileIOTestCase): """ Test GROMACS helper functions """ @@ -535,6 +761,13 @@ def test_parse_dihedrals(self): self.assertIs(dih.atom3, self.top[2]) self.assertIs(dih.atom4, self.top[3]) self.assertIs(dih.type, None) + # Test multi-term dihedrals + dt = dict() + PMD = dict() + self.top._parse_dihedrals('1 2 3 4 9 180 50 1', dt, PMD, self.top) + self.assertIn(tuple(self.top.atoms[:4]), PMD) + self.top._parse_dihedrals('1 2 3 4 9 180 40 2', dt, PMD, self.top) + self.assertEqual(len(PMD[tuple(self.top.atoms[:4])]), 2) def test_parse_cmaps(self): """ Test GromacsTopologyFile._parse_cmaps """ @@ -573,6 +806,54 @@ def test_parse_vsite3(self): ParameterSet()) ) + def test_parse_atomtypes(self): + """ Test GromacsTopologyFile._parse_atomtypes """ + name, typ = self.top._parse_atomtypes('CX 12.01 0 A 0.1 2.0') + self.assertEqual(name, 'CX') + self.assertEqual(typ.atomic_number, 6) + self.assertEqual(typ.charge, 0) + self.assertEqual(typ.epsilon, 2.0/4.184) + self.assertEqual(typ.sigma, 1) + + def test_parse_bondtypes(self): + """ Test GromacsTopologyFile._parse_bondtypes """ + self.assertRaises(GromacsWarning, lambda: + self.top._parse_bondtypes('CA CB 2 0.1 5000')) + warnings.filterwarnings('ignore', category=GromacsWarning) + self.top._parse_bondtypes('CA CB 2 0.1 5000') + self.assertTrue(self.top.unknown_functional) + + def test_parse_angletypes(self): + """ Test GromacsTopologyFile._parse_angletypes """ + self.assertRaises(GromacsWarning, lambda: + self.top._parse_angletypes('CA CB CC 2 120 5000')) + warnings.filterwarnings('ignore', category=GromacsWarning) + self.top._parse_angletypes('CA CB CC 2 120 5000') + self.assertTrue(self.top.unknown_functional) + + def test_parse_dihedraltypes(self): + """ Test GromacsTopologyFile._parse_dihedraltypes """ + key, dtype, ptype, replace = self.top._parse_dihedraltypes( + 'CA CA 9 180 50.0 2') + self.assertEqual(key, ('X', 'CA', 'CA', 'X')) + self.assertEqual(dtype, 'normal') + self.assertFalse(replace) + self.assertEqual(ptype.phase, 180) + self.assertEqual(ptype.phi_k, 50/4.184) + self.assertEqual(ptype.per, 2) + self.assertRaises(GromacsWarning, lambda: + self.top._parse_dihedraltypes('CX CA CA CX 10 180 50.0 2')) + warnings.filterwarnings('ignore', category=GromacsWarning) + self.top._parse_dihedraltypes('CX CA CA CX 10 180 50.0 2') + self.assertTrue(self.top.unknown_functional) + + def test_parse_cmaptypes(self): + """ Test GromacsTopologyFile._parse_cmaptypes """ + self.assertRaises(GromacsError, lambda: + self.top._parse_cmaptypes('C1 C2 C3 C4 C5 1 24 24 1 2 3 4 5')) + self.assertRaises(GromacsError, lambda: + self.top._parse_cmaptypes('C1 C2 C3 C4 C5 1 2 3 1 2 3 4 5 6')) + class TestGromacsGro(FileIOTestCase): """ Tests the Gromacs GRO file parser """ From 8622815a9e34508dce989485e4547230d5d3eac4 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 09:29:24 -0500 Subject: [PATCH 39/62] Add missing test files. --- test/files/gmxtops/bad_nrexcl.top | 1002 ++++++++++++++++++++++++++++ test/files/gmxtops/bad_vsites3.top | 52 ++ 2 files changed, 1054 insertions(+) create mode 100644 test/files/gmxtops/bad_nrexcl.top create mode 100644 test/files/gmxtops/bad_vsites3.top diff --git a/test/files/gmxtops/bad_nrexcl.top b/test/files/gmxtops/bad_nrexcl.top new file mode 100644 index 000000000..52d27a75b --- /dev/null +++ b/test/files/gmxtops/bad_nrexcl.top @@ -0,0 +1,1002 @@ +; +; File 'topol.top' was generated +; By user: leeping (1000) +; On host: leeping +; At date: Thu May 14 17:29:21 2015 +; +; This is a standalone topology file +; +; It was generated using program: +; pdb2gmx - VERSION 4.6.5 +; +; Command line was: +; pdb2gmx -f ace-ALA-nme.pdb -ignh +; +; Force field was read from the standard Gromacs share directory. +; + +; Include forcefield parameters +******************************************************************** +* The original ffamber ports were written by Eric J. Sorin, * +* CSU Long Beach, Dept. of Chem & Biochem, and have now been * +* integrated with the standard gromacs distribution. * +* (Please don't blame Eric for errors we might have introduced.) * +* For the implementation/validation, please read/cite: * +* Sorin & Pande (2005). Biophys. J. 88(4), 2472-2493. * +* For related material and updates, please consult * +* http://chemistry.csulb.edu/ffamber/ * +******************************************************************** + + +[ defaults ] +; nbfunc comb-rule gen-pairs fudgeLJ fudgeQQ +1 2 yes 0.5 0.8333 + +[ atomtypes ] +; name at.num mass charge ptype sigma epsilon +Br 35 79.90 0.0000 A 0.00000e+00 0.00000e+00 +C 6 12.01 0.0000 A 3.39967e-01 3.59824e-01 +CA 6 12.01 0.0000 A 3.39967e-01 3.59824e-01 +CB 6 12.01 0.0000 A 3.39967e-01 3.59824e-01 +CC 6 12.01 0.0000 A 3.39967e-01 3.59824e-01 +CK 6 12.01 0.0000 A 3.39967e-01 3.59824e-01 +CM 6 12.01 0.0000 A 3.39967e-01 3.59824e-01 +CN 6 12.01 0.0000 A 3.39967e-01 3.59824e-01 +CQ 6 12.01 0.0000 A 3.39967e-01 3.59824e-01 +CR 6 12.01 0.0000 A 3.39967e-01 3.59824e-01 +CT 6 12.01 0.0000 A 3.39967e-01 4.57730e-01 +CV 6 12.01 0.0000 A 3.39967e-01 3.59824e-01 +CW 6 12.01 0.0000 A 3.39967e-01 3.59824e-01 +C* 6 12.01 0.0000 A 3.39967e-01 3.59824e-01 +C0 20 40.08 0.0000 A 3.05240e-01 1.92376e+00 +F 9 19.00 0.0000 A 3.11815e-01 2.55224e-01 +H 1 1.008 0.0000 A 1.06908e-01 6.56888e-02 +HC 1 1.008 0.0000 A 2.64953e-01 6.56888e-02 +H1 1 1.008 0.0000 A 2.47135e-01 6.56888e-02 +H2 1 1.008 0.0000 A 2.29317e-01 6.56888e-02 +H3 1 1.008 0.0000 A 2.11499e-01 6.56888e-02 +HA 1 1.008 0.0000 A 2.59964e-01 6.27600e-02 +H4 1 1.008 0.0000 A 2.51055e-01 6.27600e-02 +H5 1 1.008 0.0000 A 2.42146e-01 6.27600e-02 +HO 1 1.008 0.0000 A 0.00000e+00 0.00000e+00 +HS 1 1.008 0.0000 A 1.06908e-01 6.56888e-02 +HW 1 1.008 0.0000 A 0.00000e+00 0.00000e+00 +HP 1 1.008 0.0000 A 1.95998e-01 6.56888e-02 +I 53 126.9 0.0000 A 4.18722e-01 1.67360e+00 +Cl 17 35.45 0.0000 A 4.40104e-01 4.18400e-01 +Na 11 22.99 0.0000 A 3.32840e-01 1.15897e-02 +IB 0 131.0 0.0000 A 8.90899e-01 4.18400e-01 +MG 12 24.305 0.0000 A 1.41225e-01 3.74342e+00 +N 7 14.01 0.0000 A 3.25000e-01 7.11280e-01 +NA 7 14.01 0.0000 A 3.25000e-01 7.11280e-01 +NB 7 14.01 0.0000 A 3.25000e-01 7.11280e-01 +NC 7 14.01 0.0000 A 3.25000e-01 7.11280e-01 +N2 7 14.01 0.0000 A 3.25000e-01 7.11280e-01 +N3 7 14.01 0.0000 A 3.25000e-01 7.11280e-01 +N* 7 14.01 0.0000 A 3.25000e-01 7.11280e-01 +O 8 16.00 0.0000 A 2.95992e-01 8.78640e-01 +OW 8 16.00 0.0000 A 3.15061e-01 6.36386e-01 +OH 8 16.00 0.0000 A 3.06647e-01 8.80314e-01 +OS 8 16.00 0.0000 A 3.00001e-01 7.11280e-01 +O2 8 16.00 0.0000 A 2.95992e-01 8.78640e-01 +P 15 30.97 0.0000 A 3.74177e-01 8.36800e-01 +S 16 32.06 0.0000 A 3.56359e-01 1.04600e+00 +SH 16 32.06 0.0000 A 3.56359e-01 1.04600e+00 +CU 29 63.55 0.0000 A 3.39967e-01 3.59824e-01 +FE 26 55.00 0.0000 A 0.00000e+00 0.00000e+00 +K 19 39.10 0.0000 A 4.73602e-01 1.37235e-03 +Rb 37 85.47 0.0000 A 5.26699e-01 7.11280e-04 +Cs 55 132.91 0.0000 A 6.04920e-01 3.37230e-04 +; spc water - use only with spc.itp & settles +OW_spc 8 15.9994 0.0000 A 3.16557e-01 6.50629e-01 +HW_spc 1 1.0080 0.0000 A 0.00000e+00 0.00000e+00 +Li 3 6.94 0.0000 A 2.02590e-01 7.65672e-02 +Zn 30 65.4 0.0000 A 1.95998e-01 5.23000e-02 +;tip4p-EW +HW_tip4pew 1 1.008 0.0000 A 0.00000e+00 0.00000e+00 +OW_tip4pew 8 16.00 0.0000 A 3.16435e-01 6.80946e-01 +; tip4p +HW_tip4p 1 1.008 0.0000 A 0.00000e+00 0.00000e+00 +OW_tip4p 8 16.00 0.0000 A 3.15365e-01 6.48520e-01 +;tip5p +HW_tip5p 1 1.008 0.0000 A 0.00000e+00 0.00000e+00 +OW_tip5p 8 16.00 0.0000 A 3.12000e-01 6.69440e-01 +; dummy defs +; MW=Dummy mass for tip4p/EW/5p water extra point charge +MW 0 0.0000 0.0000 D 0.00000e+00 0.00000e+00 +; Dummy masses for rigid CH3 and NH3 groups +MCH3 0 0.0000 0.0000 A 0.00000e+00 0.00000e+00 +MNH3 0 0.0000 0.0000 A 0.00000e+00 0.00000e+00 +[ bondtypes ] +; i j func b0 kb + C C 1 0.1525 259408.0 ; new99 + C OS 1 0.1323 376560.0 ; new99 + C H4 1 0.1080 307105.6 ; new99 + C H5 1 0.1080 307105.6 ; new99 + CA OH 1 0.1364 376560.0 ; new99 + CM OS 1 0.1240 401664.0 ; new99 + Cl CT 1 0.1766 194137.6 ; new99 + Br CT 1 0.1944 133051.2 ; new99 + I CT 1 0.2166 123846.4 ; new99 + F CA 1 0.1359 323004.8 ; new99 + Cl CA 1 0.1727 161502.4 ; new99 + I CA 1 0.2075 143092.8 ; new99 + Br CA 1 0.1890 143929.6 ; new99 + OW HW 1 0.09572 462750.4 ; P water + HW HW 1 0.15136 462750.4 ; P water + C CA 1 0.14090 392459.2 ; 7,(1986),230; TYR + C CB 1 0.14190 374049.6 ; 7,(1986),230; GUA + C CM 1 0.14440 343088.0 ; 7,(1986),230; THY,URA + C CT 1 0.15220 265265.6 ; 7,(1986),230; AA + C N* 1 0.13830 354803.2 ; 7,(1986),230; CYT,URA + C NA 1 0.13880 349782.4 ; 7,(1986),230; GUA.URA + C NC 1 0.13580 382417.6 ; 7,(1986),230; CYT + C O 1 0.12290 476976.0 ; 7,(1986),230; AA,CYT,GUA,THY,URA + C O2 1 0.12500 548940.8 ; 7,(1986),230; GLU,ASP + C OH 1 0.13640 376560.0 ; 7,(1986),230; TYR + CA CA 1 0.14000 392459.2 ; 7,(1986),230; BENZENE,PHE,TRP,TYR + CA CB 1 0.14040 392459.2 ; 7,(1986),230; ADE,TRP + CA CM 1 0.14330 357313.6 ; 7,(1986),230; CYT + CA CT 1 0.15100 265265.6 ; 7,(1986),230; PHE,TYR + CA HA 1 0.10800 307105.6 ; ged from 340. bsd on C6H6 nmodes; PHE,TRP,TYR + CA H4 1 0.10800 307105.6 ; ged from 340. bsd on C6H6 nmodes; no assigned + CA N2 1 0.13400 402500.8 ; 7,(1986),230; ARG,CYT,GUA + CA NA 1 0.13810 357313.6 ; 7,(1986),230; GUA + CA NC 1 0.13390 404174.4 ; 7,(1986),230; ADE,CYT,GUA + CB CB 1 0.13700 435136.0 ; 7,(1986),230; ADE,GUA + CB N* 1 0.13740 364844.8 ; 7,(1986),230; ADE,GUA + CB NB 1 0.13910 346435.2 ; 7,(1986),230; ADE,GUA + CB NC 1 0.13540 385764.8 ; 7,(1986),230; ADE,GUA + CK H5 1 0.10800 307105.6 ; ged from 340. bsd on C6H6 nmodes; ADE,GUA + CK N* 1 0.13710 368192.0 ; 7,(1986),230; ADE,GUA + CK NB 1 0.13040 442667.2 ; 7,(1986),230; ADE,GUA + CM CM 1 0.13500 459403.2 ; 7,(1986),230; CYT,THY,URA + CM CT 1 0.15100 265265.6 ; 7,(1986),230; THY + CM HA 1 0.10800 307105.6 ; ged from 340. bsd on C6H6 nmodes; CYT,URA + CM H4 1 0.10800 307105.6 ; ged from 340. bsd on C6H6 nmodes; CYT,URA + CM H5 1 0.10800 307105.6 ; ged from 340. bsd on C6H6 nmodes; not assigned + CM N* 1 0.13650 374886.4 ; 7,(1986),230; CYT,THY,URA + CQ H5 1 0.10800 307105.6 ; ged from 340. bsd on C6H6 nmodes; ADE + CQ NC 1 0.13240 420073.6 ; 7,(1986),230; ADE + CT CT 1 0.15260 259408.0 ; 7,(1986),230; AA, SUGARS + CT HC 1 0.10900 284512.0 ; ged from 331 bsd on NMA nmodes; AA, SUGARS + CT H1 1 0.10900 284512.0 ; ged from 331 bsd on NMA nmodes; AA, RIBOSE + CT H2 1 0.10900 284512.0 ; ged from 331 bsd on NMA nmodes; SUGARS + CT H3 1 0.10900 284512.0 ; ged from 331 bsd on NMA nmodes; not assigned + CT HP 1 0.10900 284512.0 ; nged from 331; AA-lysine, methyl ammonium cation + CT N* 1 0.14750 282001.6 ; 7,(1986),230; ADE,CYT,GUA,THY,URA + CT N2 1 0.14630 282001.6 ; 7,(1986),230; ARG + CT OH 1 0.14100 267776.0 ; 7,(1986),230; SUGARS + CT OS 1 0.14100 267776.0 ; 7,(1986),230; NUCLEIC ACIDS + H N2 1 0.10100 363171.2 ; 7,(1986),230; ADE,CYT,GUA,ARG + H N* 1 0.10100 363171.2 ; plain unmethylated bases ADE,CYT,GUA,ARG + H NA 1 0.10100 363171.2 ; 7,(1986),230; GUA,URA,HIS + HO OH 1 0.09600 462750.4 ; 7,(1986),230; SUGARS,SER,TYR + HO OS 1 0.09600 462750.4 ; 7,(1986),230; NUCLEOTIDE ENDS + O2 P 1 0.14800 439320.0 ; 7,(1986),230; NA PHOSPHATES + OH P 1 0.16100 192464.0 ; 7,(1986),230; NA PHOSPHATES + OS P 1 0.16100 192464.0 ; 7,(1986),230; NA PHOSPHATES + C* HC 1 0.10800 307105.6 ; ged from 340. bsd on C6H6 nmodes, not needed AA + C N 1 0.13350 410032.0 ; 7,(1986),230; AA + C* CB 1 0.14590 324678.4 ; 7,(1986),230; TRP + C* CT 1 0.14950 265265.6 ; 7,(1986),230; TRP + C* CW 1 0.13520 456892.8 ; 7,(1986),230; TRP + CA CN 1 0.14000 392459.2 ; 7,(1986),230; TRP + CB CN 1 0.14190 374049.6 ; 7,(1986),230; TRP + CC CT 1 0.15040 265265.6 ; 7,(1986),230; HIS + CC CV 1 0.13750 428441.6 ; 7,(1986),230; HIS(delta) + CC CW 1 0.13710 433462.4 ; 7,(1986),230; HIS(epsilon) + CC NA 1 0.13850 353129.6 ; 7,(1986),230; HIS + CC NB 1 0.13940 343088.0 ; 7,(1986),230; HIS + CN NA 1 0.13800 358150.4 ; 7,(1986),230; TRP + CR H5 1 0.10800 307105.6 ; ged from 340. bsd on C6H6 nmodes;HIS + CR NA 1 0.13430 399153.6 ; 7,(1986),230; HIS + CR NB 1 0.13350 408358.4 ; 7,(1986),230; HIS + CT N 1 0.14490 282001.6 ; 7,(1986),230; AA + CT N3 1 0.14710 307105.6 ; 7,(1986),230; LYS + CT S 1 0.18100 189953.6 ; ged from 222.0 based on dimethylS nmodes + CT SH 1 0.18100 198321.6 ; ged from 222.0 based on methanethiol nmodes + CV H4 1 0.10800 307105.6 ; ged from 340. bsd on C6H6 nmodes; HIS + CV NB 1 0.13940 343088.0 ; 7,(1986),230; HIS + CW H4 1 0.10800 307105.6 ; ged from 340. bsd on C6H6 nmodes;HIS(epsilon,+) + CW NA 1 0.13810 357313.6 ; 7,(1986),230; HIS,TRP + H N 1 0.10100 363171.2 ; 7,(1986),230; AA + H N3 1 0.10100 363171.2 ; 7,(1986),230; LYS + HS SH 1 0.13360 229283.2 ; 7,(1986),230; CYS + S S 1 0.20380 138908.8 ; 7,(1986),230; CYX (SCHERAGA) + CT F 1 0.13800 307105.6 ; 13,(1992),963;CF4; R0=1.332 FOR CHF3 + + + +[ constrainttypes ] +; this section is implemented manually from bond & angle values + +; constraints for rigid CH3 groups + MCH3 CT 2 0.166426 + MCH3 S 2 0.193875 + MCH3 MCH3 2 0.092163 +; constraints for rigid NH3 groups + MNH3 CT 2 0.158254 + MNH3 MNH3 2 0.080229 + +; angle-derived constraints for OH and SH groups in proteins +; The constraint A-C is calculated from the angle A-B-C and bonds A-B, B-C. + C HO 2 0.195074 + CA HO 2 0.195074 + CT HO 2 0.194132 + CT HS 2 0.235935 + + + +[ angletypes ] +; i j k func th0 cth +HW OW HW 1 104.520 836.800 ; TIP3P water +HW HW OW 1 127.740 0.000 ; (found in crystallographic water with 3 bonds) +C C O 1 120.000 669.440 ; new99 +C C OH 1 120.000 669.440 ; new99 +CT C CT 1 117.000 527.184 ; new99 +CT C OS 1 115.000 669.440 ; new99 +O C OS 1 125.000 669.440 ; new99 +H4 C C 1 120.000 418.400 ; new99 +H4 C CM 1 115.000 418.400 ; new99 +H4 C CT 1 115.000 418.400 ; new99 +H4 C O 1 120.000 418.400 ; new99 +H4 C OH 1 120.000 418.400 ; new99 +H5 C N 1 120.000 418.400 ; new99 +H5 C O 1 119.000 418.400 ; new99 +H5 C OH 1 107.000 418.400 ; new99 +H5 C OS 1 107.000 418.400 ; new99 +CA CA OH 1 120.000 585.760 ; new99 +CA OH HO 1 113.000 418.400 ; new99 +F CA CA 1 121.000 585.760 ; new99 +Cl CA CA 1 118.800 585.760 ; new99 +Br CA CA 1 118.800 585.760 ; new99 +I CA CA 1 118.800 585.760 ; new99 +CM CM OS 1 125.000 669.440 ; new99 +H4 CM OS 1 113.000 418.400 ; new99 +HA CM HA 1 120.000 292.880 ; new99 +HA CM CT 1 120.000 418.400 ; new99 +H1 CT CM 1 109.500 418.400 ; new99 +HC CT CM 1 109.500 418.400 ; new99 +C CT OS 1 109.500 502.080 ; new99 +CM CT CT 1 111.000 527.184 ; new99 +CM CT OS 1 109.500 418.400 ; new99 +CT CT CA 1 114.000 527.184 ; new99 +OS CT OS 1 101.000 502.080 ; new99 +F CT CT 1 109.000 418.400 ; new99 +F CT H2 1 109.500 418.400 ; new99 +Cl CT CT 1 108.500 418.400 ; new99 +Cl CT H1 1 108.500 418.400 ; new99 +Br CT CT 1 108.000 418.400 ; new99 +Br CT H1 1 106.500 418.400 ; new99 +I CT CT 1 106.000 418.400 ; new99 +CB C NA 1 111.300 585.760 ; NA +CB C O 1 128.800 669.440 ; +CM C NA 1 114.100 585.760 ; +CM C O 1 125.300 669.440 ; +CT C O 1 120.400 669.440 ; +CT C O2 1 117.000 585.760 ; +CT C OH 1 110.000 669.440 ; new99 +N* C NA 1 115.400 585.760 ; +N* C NC 1 118.600 585.760 ; +N* C O 1 120.900 669.440 ; +NA C O 1 120.600 669.440 ; +NC C O 1 122.500 669.440 ; +CT C N 1 116.600 585.760 ; AA general +N C O 1 122.900 669.440 ; AA general +O C O 1 126.000 669.440 ; AA COO- terminal residues +O2 C O2 1 126.000 669.440 ; AA GLU (SCH JPC 79,2379) +O C OH 1 120.000 669.440 ; +CA C CA 1 120.000 527.184 ; changed from 85.0 bsd on C6H6 nmodes; AA tyr +CA C OH 1 120.000 585.760 ; AA tyr +C CA CA 1 120.000 527.184 ; changed from 85.0 bsd on C6H6 nmodes +CA CA CA 1 120.000 527.184 ; changed from 85.0 bsd on C6H6 nmodes +CA CA CB 1 120.000 527.184 ; changed from 85.0 bsd on C6H6 nmodes +CA CA CT 1 120.000 585.760 ; +CA CA HA 1 120.000 418.400 ; new99 +CA CA H4 1 120.000 418.400 ; new99 +CB CA HA 1 120.000 418.400 ; new99 +CB CA H4 1 120.000 418.400 ; new99 +CB CA N2 1 123.500 585.760 ; +CB CA NC 1 117.300 585.760 ; +CM CA N2 1 120.100 585.760 ; +CM CA NC 1 121.500 585.760 ; +N2 CA NA 1 116.000 585.760 ; +N2 CA NC 1 119.300 585.760 ; +NA CA NC 1 123.300 585.760 ; +C CA HA 1 120.000 418.400 ; new99 tyr +N2 CA N2 1 120.000 585.760 ; AA arg +CN CA HA 1 120.000 418.400 ; new99 trp +CA CA CN 1 120.000 527.184 ; changed from 85.0 bsd on C6H6 nmodes; AA trp +C CB CB 1 119.200 527.184 ; changed from 85.0 bsd on C6H6 nmodes; NA gua +C CB NB 1 130.000 585.760 ; +CA CB CB 1 117.300 527.184 ; changed from 85.0 bsd on C6H6 nmodes; NA ade +CA CB NB 1 132.400 585.760 ; +CB CB N* 1 106.200 585.760 ; +CB CB NB 1 110.400 585.760 ; +CB CB NC 1 127.700 585.760 ; +N* CB NC 1 126.200 585.760 ; +C* CB CA 1 134.900 527.184 ; changed from 85.0 bsd on C6H6 nmodes; AA trp +C* CB CN 1 108.800 527.184 ; changed from 85.0 bsd on C6H6 nmodes; AA trp +CA CB CN 1 116.200 527.184 ; changed from 85.0 bsd on C6H6 nmodes; AA trp +H5 CK N* 1 123.050 418.400 ; new99 +H5 CK NB 1 123.050 418.400 ; new99 +N* CK NB 1 113.900 585.760 ; +C CM CM 1 120.700 527.184 ; changed from 85.0 bsd on C6H6 nmodes; NA thy +C CM CT 1 119.700 585.760 ; +C CM HA 1 119.700 418.400 ; new99 +C CM H4 1 119.700 418.400 ; new99 +CA CM CM 1 117.000 527.184 ; changed from 85.0 bsd on C6H6 nmodes; NA cyt +CA CM HA 1 123.300 418.400 ; new99 +CA CM H4 1 123.300 418.400 ; new99 +CM CM CT 1 119.700 585.760 ; +CM CM HA 1 119.700 418.400 ; new99 +CM CM H4 1 119.700 418.400 ; new99 +CM CM N* 1 121.200 585.760 ; +H4 CM N* 1 119.100 418.400 ; new99 +H5 CQ NC 1 115.450 418.400 ; new99 +NC CQ NC 1 129.100 585.760 ; +CM CT HC 1 109.500 418.400 ; changed based on NMA nmodes +CT CT CT 1 109.500 334.720 ; +CT CT HC 1 109.500 418.400 ; changed based on NMA nmodes +CT CT H1 1 109.500 418.400 ; changed based on NMA nmodes +CT CT H2 1 109.500 418.400 ; changed based on NMA nmodes +CT CT HP 1 109.500 418.400 ; changed based on NMA nmodes +CT CT N* 1 109.500 418.400 ; +CT CT OH 1 109.500 418.400 ; +CT CT OS 1 109.500 418.400 ; +HC CT HC 1 109.500 292.880 ; +H1 CT H1 1 109.500 292.880 ; +HP CT HP 1 109.500 292.880 ; AA lys, ch3nh4+ +H2 CT N* 1 109.500 418.400 ; changed based on NMA nmodes +H1 CT N* 1 109.500 418.400 ; changed based on NMA nmodes +H1 CT OH 1 109.500 418.400 ; changed based on NMA nmodes +H1 CT OS 1 109.500 418.400 ; changed based on NMA nmodes +H2 CT OS 1 109.500 418.400 ; changed based on NMA nmodes +N* CT OS 1 109.500 418.400 ; +H1 CT N 1 109.500 418.400 ; AA general changed based on NMA nmodes +C CT H1 1 109.500 418.400 ; AA general changed based on NMA nmodes +C CT HP 1 109.500 418.400 ; AA zwitterion changed based on NMA nmodes +H1 CT S 1 109.500 418.400 ; AA cys changed based on NMA nmodes +H1 CT SH 1 109.500 418.400 ; AA cyx changed based on NMA nmodes +CT CT S 1 114.700 418.400 ; AA cyx (SCHERAGA JPC 79,1428) +CT CT SH 1 108.600 418.400 ; AA cys +H2 CT H2 1 109.500 292.880 ; AA lys +H1 CT N2 1 109.500 418.400 ; AA arg changed based on NMA nmodes +HP CT N3 1 109.500 418.400 ; AA lys, ch3nh3+, changed based on NMA nmodes +CA CT CT 1 114.000 527.184 ; AA phe tyr (SCH JPC 79,2379) +C CT HC 1 109.500 418.400 ; AA gln changed based on NMA nmodes +C CT N 1 110.100 527.184 ; AA general +CT CT N2 1 111.200 669.440 ; AA arg (JCP 76, 1439) +CT CT N 1 109.700 669.440 ; AA ala, general (JACS 94, 2657) +C CT CT 1 111.100 527.184 ; AA general +CA CT HC 1 109.500 418.400 ; AA tyr changed based on NMA nmodes +CT CT N3 1 111.200 669.440 ; AA lys (JCP 76, 1439) +CC CT CT 1 113.100 527.184 ; AA his +CC CT HC 1 109.500 418.400 ; AA his changed based on NMA nmodes +C CT N3 1 111.200 669.440 ; AA amino terminal residues +C* CT CT 1 115.600 527.184 ; AA trp +C* CT HC 1 109.500 418.400 ; AA trp changed based on NMA nmodes +CT CC NA 1 120.000 585.760 ; AA his +CT CC CV 1 120.000 585.760 ; AA his +CT CC NB 1 120.000 585.760 ; AA his +CV CC NA 1 120.000 585.760 ; AA his +CW CC NA 1 120.000 585.760 ; AA his +CW CC NB 1 120.000 585.760 ; AA his +CT CC CW 1 120.000 585.760 ; AA his +H5 CR NA 1 120.000 418.400 ; new99 his +H5 CR NB 1 120.000 418.400 ; new99 his +NA CR NA 1 120.000 585.760 ; AA his +NA CR NB 1 120.000 585.760 ; AA his +CC CV H4 1 120.000 418.400 ; new99 his +CC CV NB 1 120.000 585.760 ; AA his +H4 CV NB 1 120.000 418.400 ; new99 his +CC CW H4 1 120.000 418.400 ; new99 his +CC CW NA 1 120.000 585.760 ; AA his +H4 CW NA 1 120.000 418.400 ; new99 his +C* CW H4 1 120.000 418.400 ; new99 trp +C* CW NA 1 108.700 585.760 ; AA trp +CT C* CW 1 125.000 585.760 ; AA trp +CB C* CT 1 128.600 585.760 ; AA trp +CB C* CW 1 106.400 527.184 ; changed from 85.0 bsd on C6H6 nmodes; AA trp +CA CN NA 1 132.800 585.760 ; AA trp +CB CN NA 1 104.400 585.760 ; AA trp +CA CN CB 1 122.700 527.184 ; changed from 85.0 bsd on C6H6 nmodes; AA trp +C N CT 1 121.900 418.400 ; AA general +C N H 1 120.000 418.400 ; new99 general, gln, asn,changed based on NMA nmodes +CT N H 1 118.040 418.400 ; new99 general, changed based on NMA nmodes +CT N CT 1 118.000 418.400 ; AA pro (DETAR JACS 99,1232) +H N H 1 120.000 292.880 ; ade,cyt,gua,gln,asn ** +C N* CM 1 121.600 585.760 ; +C N* CT 1 117.600 585.760 ; +C N* H 1 119.200 418.400 ; new99 +CB N* CK 1 105.400 585.760 ; +CB N* CT 1 125.800 585.760 ; +CB N* H 1 125.800 418.400 ; new99 +CK N* CT 1 128.800 585.760 ; +CK N* H 1 128.800 418.400 ; new99 for unmethylated n.a. bases,chngd bsd NMA nmodes +CM N* CT 1 121.200 585.760 ; +CM N* H 1 121.200 418.400 ; new99 for unmethylated n.a. bases,chngd bsd NMA nmodes +CA N2 H 1 120.000 418.400 ; new99 +H N2 H 1 120.000 292.880 ; +CT N2 H 1 118.400 418.400 ; new99 arg +CA N2 CT 1 123.200 418.400 ; AA arg +CT N3 H 1 109.500 418.400 ; AA lys, changed based on NMA nmodes +CT N3 CT 1 109.500 418.400 ; AA pro/nt +H N3 H 1 109.500 292.880 ; AA lys, AA(end) +C NA C 1 126.400 585.760 ; +C NA CA 1 125.200 585.760 ; +C NA H 1 116.800 418.400 ; new99 +CA NA H 1 118.000 418.400 ; new99 +CC NA CR 1 120.000 585.760 ; AA his +CC NA H 1 120.000 418.400 ; new99 his +CR NA CW 1 120.000 585.760 ; AA his +CR NA H 1 120.000 418.400 ; new99 his +CW NA H 1 120.000 418.400 ; new99 his +CN NA CW 1 111.600 585.760 ; AA trp +CN NA H 1 123.100 418.400 ; new99 trp +CB NB CK 1 103.800 585.760 ; +CC NB CR 1 117.000 585.760 ; AA his +CR NB CV 1 117.000 585.760 ; AA his +C NC CA 1 120.500 585.760 ; +CA NC CB 1 112.200 585.760 ; +CA NC CQ 1 118.600 585.760 ; +CB NC CQ 1 111.000 585.760 ; +C OH HO 1 113.000 418.400 ; new99 +CT OH HO 1 108.500 460.240 ; +HO OH P 1 108.500 376.560 ; +CT OS CT 1 109.500 502.080 ; +CT OS P 1 120.500 836.800 ; +P OS P 1 120.500 836.800 ; +O2 P OH 1 108.230 376.560 ; +O2 P O2 1 119.900 1171.520 ; +O2 P OS 1 108.230 836.800 ; +OH P OS 1 102.600 376.560 ; +OS P OS 1 102.600 376.560 ; +CT S CT 1 98.900 518.816 ; AA met +CT S S 1 103.700 569.024 ; AA cyx (SCHERAGA JPC 79,1428) +CT SH HS 1 96.000 359.824 ; changed from 44.0 based on methanethiol nmodes +HS SH HS 1 92.070 292.880 ; AA cys +F CT F 1 109.100 644.336 ; JCC,13,(1992),963; +F CT H1 1 109.500 418.400 ; new99 +N C N 1 120.000 585.760 ; Added for Urea (same as N2-CA-N2) - EJS + +[ dihedraltypes ] +;i j k l func phase kd pn +CA CA CA OH 4 180.00 4.60240 2 ; new99 +H5 O C OH 4 180.00 4.60240 2 ; new99 +H5 O C OS 4 180.00 4.60240 2 ; new99 +CM CT CM HA 4 180.00 4.60240 2 ; new99 +CA CA CA Br 4 180.00 4.60240 2 ; new99 +CM H4 C O 4 180.00 4.60240 2 ; new99 +C CT N H 4 180.00 4.60240 2 ; new99 +C CT N O 4 180.00 4.60240 2 ; new99 +CB CK N* CT 4 180.00 4.18400 2 ; +CK CB N* CT 4 180.00 4.18400 2 ; +C CM N* CT 4 180.00 4.18400 2 ; dac guess, 9/94 +CT N* C CM 4 180.00 4.18400 2 ; +CM C CM CT 4 180.00 4.60240 2 ; +CT O C OH 4 180.00 43.93200 2 ; +NA CV CC CT 4 180.00 4.60240 2 ; +NB CW CC CT 4 180.00 4.60240 2 ; +NA CW CC CT 4 180.00 4.60240 2 ; +CW CB C* CT 4 180.00 4.60240 2 ; +CA CA CA CT 4 180.00 4.60240 2 ; +C CM CM CT 4 180.00 4.60240 2 ; dac guess, 9/94 +NC CM CA N2 4 180.00 4.60240 2 ; dac guess, 9/94 +CB NC CA N2 4 180.00 4.60240 2 ; dac, 10/94 +NA NC CA N2 4 180.00 4.60240 2 ; dac, 10/94 +CA CA C OH 4 180.00 4.60240 2 ; +CT CV CC NA 4 180.00 4.60240 2 ; +CT CW CC NB 4 180.00 4.60240 2 ; +CT CW CC NA 4 180.00 4.60240 2 ; +CB CT C* CW 4 180.00 4.60240 2 ; +CM N2 CA NC 4 180.00 4.60240 2 ; +CB N2 CA NC 4 180.00 4.60240 2 ; +N2 NA CA NC 4 180.00 4.60240 2 ; +N N C O 4 180.00 43.93200 2 ; urea +X O2 C O2 4 180.00 43.93200 2 ; JCC,7,(1986),230 +X N2 CA N2 4 180.00 43.93200 2 ; JCC,7,(1986),230 +X CT N CT 4 180.00 4.18400 2 ; JCC,7,(1986),230 +X X C O 4 180.00 43.93200 2 ; JCC,7,(1986),230 +X X N H 4 180.00 4.18400 2 ; JCC,7,(1986),230 +X X N2 H 4 180.00 4.18400 2 ; JCC,7,(1986),230 +X X NA H 4 180.00 4.18400 2 ; JCC,7,(1986),230 +X X CA HA 4 180.00 4.60240 2 ; bsd.on C6H6 nmodes +X X CW H4 4 180.00 4.60240 2 ; +X X CR H5 4 180.00 4.60240 2 ; +X X CV H4 4 180.00 4.60240 2 ; +X X CQ H5 4 180.00 4.60240 2 ; +X X CK H5 4 180.00 4.60240 2 ; +X X CM H4 4 180.00 4.60240 2 ; +X X CM HA 4 180.00 4.60240 2 ; +X X CA H4 4 180.00 4.60240 2 ; bsd.on C6H6 nmodes +X X CA H5 4 180.00 4.60240 2 ; bsd.on C6H6 nmodes + + +[ dihedraltypes ] +;i j k l func + CT CT OS CT 9 0.0 1.60247 3 ; + CT CT OS CT 9 180.0 0.41840 2 ; + C N CT C 9 0.0 1.12968 2 ; new for 99sb + C N CT C 9 0.0 1.75728 3 ; new for 99sb + N CT C N 9 180.0 1.88280 1 ; new for 99sb + N CT C N 9 180.0 6.61072 2 ; new for 99sb + N CT C N 9 180.0 2.30120 3 ; new for 99sb + CT CT N C 9 0.0 8.36800 1 ; new for 99sb + CT CT N C 9 0.0 8.36800 2 ; new for 99sb + CT CT N C 9 0.0 1.67360 3 ; new for 99sb + CT CT C N 9 0.0 0.83680 1 ; new for 99sb + CT CT C N 9 0.0 0.83680 2 ; new for 99sb + CT CT C N 9 0.0 1.67360 3 ; new for 99sb + H N C O 9 180.0 10.46000 2 ; JCC,7,(1986),230 + H N C O 9 0.0 8.36800 1 ; J.C.cistrans-NMA DE + CT S S CT 9 0.0 14.64400 2 ; JCC,7,(1986),230 + CT S S CT 9 0.0 2.51040 3 ; JCC,7,(1986),230 + OS CT CT OS 9 0.0 0.60250 3 ; parm98, TC,PC,PAK + OS CT CT OS 9 0.0 4.91620 2 ; Piotr et al. + OS CT CT OH 9 0.0 0.60250 3 ; parm98, TC,PC,PAK + OS CT CT OH 9 0.0 4.91620 2 ; parm98, TC,PC,PAK + OH CT CT OH 9 0.0 0.60250 3 ; parm98, TC,PC,PAK + OH CT CT OH 9 0.0 4.91620 2 ; parm98, TC,PC,PAK + OH P OS CT 9 0.0 1.04600 3 ; JCC,7,(1986),230 + OH P OS CT 9 0.0 5.02080 2 ; gg> ene.631g*/mp2 + OS P OS CT 9 0.0 1.04600 3 ; JCC,7,(1986),230 + OS P OS CT 9 0.0 5.02080 2 ; gg> ene.631g*/mp2 + OS CT N* CK 9 0.0 10.46000 1 ; parm98, TC,PC,PAK + OS CT N* CM 9 0.0 10.46000 1 ; parm98, TC,PC,PAK + H1 CT C O 9 0.0 3.34720 1 ; Junmei et al, 1999 + H1 CT C O 9 180.0 0.33472 3 ; Junmei et al, 1999 + HC CT C O 9 0.0 3.34720 1 ; Junmei et al, 1999 + HC CT C O 9 180.0 0.33472 3 ; Junmei et al, 1999 + HC CT CT HC 9 0.0 0.62760 3 ; Junmei et al, 1999 + HC CT CT CT 9 0.0 0.66944 3 ; Junmei et al, 1999 + HC CT CM CM 9 180.0 1.58992 3 ; Junmei et al, 1999 + HC CT CM CM 9 0.0 4.81160 1 ; Junmei et al, 1999 + HO OH CT CT 9 0.0 0.66944 3 ; Junmei et al, 1999 + HO OH CT CT 9 0.0 1.04600 1 ; Junmei et al, 1999 + HO OH C O 9 180.0 9.62320 2 ; Junmei et al, 1999 + HO OH C O 9 0.0 7.94960 1 ; Junmei et al, 1999 + CM CM C O 9 180.0 9.10020 2 ; Junmei et al, 1999 + CM CM C O 9 0.0 1.25520 3 ; Junmei et al, 1999 + CT CM CM CT 9 180.0 27.82360 2 ; Junmei et al, 1999 + CT CM CM CT 9 180.0 7.94960 1 ; Junmei et al, 1999 + CT CT CT CT 9 0.0 0.75312 3 ; Junmei et al, 1999 + CT CT CT CT 9 180.0 1.04600 2 ; Junmei et al, 1999 + CT CT CT CT 9 180.0 0.83680 1 ; Junmei et al, 1999 + CT CT OS C 9 0.0 1.60247 3 ; Junmei et al, 1999 + CT CT OS C 9 180.0 3.34720 1 ; Junmei et al, 1999 + CT OS CT OS 9 0.0 0.41840 3 ; Junmei et al, 1999 + CT OS CT OS 9 180.0 3.55640 2 ; Junmei et al, 1999 + CT OS CT OS 9 180.0 5.64840 1 ; Junmei et al, 1999 + O C OS CT 9 180.0 11.29680 2 ; Junmei et al, 1999 + O C OS CT 9 180.0 5.85760 1 ; Junmei et al, 1999 + F CT CT F 9 180.0 5.02080 1 ; Junmei et al, 1999 + Cl CT CT Cl 9 180.0 1.88280 1 ; Junmei et al, 1999 + Br CT CT Br 9 0.0 0.00000 0 ; Junmei et al, 1999 + H1 CT CT OS 9 0.0 1.04600 1 ; Junmei et al, 1999 + H1 CT CT OH 9 0.0 1.04600 1 ; Junmei et al, 1999 + H1 CT CT F 9 0.0 0.79496 1 ; Junmei et al, 1999 + H1 CT CT Cl 9 0.0 1.04600 1 ; Junmei et al, 1999 + H1 CT CT Br 9 0.0 2.30120 1 ; Junmei et al, 1999 + HC CT CT OS 9 0.0 1.04600 1 ; Junmei et al, 1999 + HC CT CT OH 9 0.0 1.04600 1 ; Junmei et al, 1999 + HC CT CT F 9 0.0 0.79496 1 ; Junmei et al, 1999 + HC CT CT Cl 9 0.0 1.04600 1 ; Junmei et al, 1999 + HC CT CT Br 9 0.0 2.30120 1 ; Junmei et al, 1999 + CT OS CT N* 9 0.0 1.60247 3 ; parm98.dat, TC,PC,PAK + CT OS CT N* 9 0.0 2.71960 2 ; Piotr et al. + X C C X 9 180.0 15.16700 2 ; Junmei et al, 1999 + X C O X 9 180.0 11.71520 2 ; Junmei et al, 1999 + X C OS X 9 180.0 11.29680 2 ; Junmei et al, 1999 + X CA OH X 9 180.0 3.76560 2 ; Junmei et al, 99 + X CM OS X 9 180.0 4.39320 2 ; Junmei et al, 1999 + X C CA X 9 180.0 15.16700 2 ; intrpol.bsd.on C6H6 + X C CB X 9 180.0 12.55200 2 ; intrpol.bsd.on C6H6 + X C CM X 9 180.0 9.10020 2 ; intrpol.bsd.on C6H6 + X C N* X 9 180.0 6.06680 2 ; JCC,7,(1986),230 + X C NA X 9 180.0 5.64840 2 ; JCC,7,(1986),230 + X C NC X 9 180.0 16.73600 2 ; JCC,7,(1986),230 + X C OH X 9 180.0 9.62320 2 ; Junmei et al, 1999 + X C CT X 9 0.0 0.00000 0 ; JCC,7,(1986),230 + X CA CA X 9 180.0 15.16700 2 ; intrpol.bsd.on C6H6 + X CA CB X 9 180.0 14.64400 2 ; intrpol.bsd.on C6H6 + X CA CM X 9 180.0 10.66920 2 ; intrpol.bsd.on C6H6 + X CA CT X 9 0.0 0.00000 0 ; JCC,7,(1986),230 + X CA N2 X 9 180.0 10.04160 2 ; reinterpolated 93' + X CA NA X 9 180.0 6.27600 2 ; JCC,7,(1986),230 + X CA NC X 9 180.0 20.08320 2 ; JCC,7,(1986),230 + X CB CB X 9 180.0 22.80280 2 ; intrpol.bsd.on C6H6 + X CB N* X 9 180.0 6.90360 2 ; JCC,7,(1986),230 + X CB NB X 9 180.0 10.66920 2 ; JCC,7,(1986),230 + X CB NC X 9 180.0 17.36360 2 ; JCC,7,(1986),230 + X CK N* X 9 180.0 7.11280 2 ; JCC,7,(1986),230 + X CK NB X 9 180.0 41.84000 2 ; JCC,7,(1986),230 + X CM CM X 9 180.0 27.82360 2 ; intrpol.bsd.on C6H6 + X CM CT X 9 0.0 0.00000 0 ; JCC,7,(1986),230 + X CM N* X 9 180.0 7.74040 2 ; JCC,7,(1986),230 + X CQ NC X 9 180.0 28.45120 2 ; JCC,7,(1986),230 + X CT CT X 9 0.0 0.65084 3 ; JCC,7,(1986),230 + X CT N X 9 0.0 0.00000 0 ; JCC,7,(1986),230 + X CT N* X 9 0.0 0.00000 0 ; JCC,7,(1986),230 + X CT N2 X 9 0.0 0.00000 0 ; JCC,7,(1986),230 + X CT OH X 9 0.0 0.69733 3 ; JCC,7,(1986),230 + X CT OS X 9 0.0 1.60387 3 ; JCC,7,(1986),230 + X OH P X 9 0.0 1.04600 3 ; JCC,7,(1986),230 + X OS P X 9 0.0 1.04600 3 ; JCC,7,(1986),230 + X C N X 9 180.0 10.46000 2 ; AA,NMA + X CT N3 X 9 0.0 0.65084 3 ; JCC,7,(1986),230 + X CT S X 9 0.0 1.39467 3 ; JCC,7,(1986),230 + X CT SH X 9 0.0 1.04600 3 ; JCC,7,(1986),230 + X C* CB X 9 180.0 7.00820 2 ; intrpol.bsd.onC6H6aa + X C* CT X 9 0.0 0.00000 0 ; JCC,7,(1986),230 + X C* CW X 9 180.0 27.30060 2 ; intrpol.bsd.on C6H6 + X CA CN X 9 180.0 15.16700 2 ; reinterpolated 93' + X CB CN X 9 180.0 12.55200 2 ; reinterpolated 93' + X CC CT X 9 0.0 0.00000 0 ; JCC,7,(1986),230 + X CC CV X 9 180.0 21.54760 2 ; intrpol.bsd.on C6H6 + X CC CW X 9 180.0 22.48900 2 ; intrpol.bsd.on C6H6 + X CC NA X 9 180.0 5.85760 2 ; JCC,7,(1986),230 + X CC NB X 9 180.0 10.04160 2 ; JCC,7,(1986),230 + X CN NA X 9 180.0 6.38060 2 ; reinterpolated 93' + X CR NA X 9 180.0 9.72780 2 ; JCC,7,(1986),230 + X CR NB X 9 180.0 20.92000 2 ; JCC,7,(1986),230 + X CV NB X 9 180.0 10.04160 2 ; JCC,7,(1986),230 + X CW NA X 9 180.0 6.27600 2 ; JCC,7,(1986),230 + + + +[ implicit_genborn_params ] +; atype sar st pi gbr hct +;Br 0.1 1 1 0.125 0.85 ; H +C 0.172 1 1.554 0.17 0.72 ; C +CA 0.18 1 1.037 0.17 0.72 ; C +CB 0.172 0.012 1.554 0.17 0.72 ; C +CC 0.172 1 1.554 0.17 0.72 ; C +CN 0.172 0.012 1.554 0.17 0.72 ; C +CR 0.18 1 1.073 0.17 0.72 ; C +CT 0.18 1 1.276 0.17 0.72 ; C +CV 0.18 1 1.073 0.17 0.72 ; C +CW 0.18 1 1.073 0.17 0.72 ; C +C* 0.172 0.012 1.554 0.17 0.72 ; C +H 0.1 1 1 0.13 0.85 ; H +HC 0.1 1 1 0.12 0.85 ; H +H1 0.1 1 1 0.12 0.85 ; H +HA 0.1 1 1 0.12 0.85 ; H +H4 0.1 1 1 0.12 0.85 ; H +H5 0.1 1 1 0.12 0.85 ; H +HO 0.1 1 1 0.12 0.85 ; H +HS 0.1 1 1 0.12 0.85 ; H +HP 0.1 1 1 0.12 0.85 ; H +N 0.155 1 1.028 0.155 0.79 ; N +NA 0.155 1 1.028 0.155 0.79 ; N +NB 0.155 1 1.215 0.155 0.79 ; N +N2 0.16 1 1.215 0.155 0.79 ; N +N3 0.16 1 1.215 0.155 0.79 ; N +O 0.15 1 0.926 0.15 0.85 ; O +OH 0.152 1 1.080 0.15 0.85 ; O +O2 0.17 1 0.922 0.15 0.85 ; O +S 0.18 1 1.121 0.18 0.96 ; S +SH 0.18 1 1.121 0.18 0.96 ; S +; masscenters for vsites do not have gbsa parameters +MNH3 0 0 0 0 0 +MCH3 0 0 0 0 0 + + + +[ moleculetype ] +; Name nrexcl +#ifdef SMALL_NREXCL +Protein_chain_1 2 +#else +Protein_chain_1 4 +#endif + +[ atoms ] +; nr type resnr residue atom cgnr charge mass typeB chargeB massB +; residue 1 ACE rtp ACE q 0.0 + 1 CT 1 ACE CH3 1 -0.3662 12.01 ; qtot -0.3662 + 2 HC 1 ACE HH31 2 0.1123 1.008 ; qtot -0.2539 + 3 HC 1 ACE HH32 3 0.1123 1.008 ; qtot -0.1416 + 4 HC 1 ACE HH33 4 0.1123 1.008 ; qtot -0.0293 + 5 C 1 ACE C 5 0.5972 12.01 ; qtot 0.5679 + 6 O 1 ACE O 6 -0.5679 16 ; qtot 0 +; residue 2 ALA rtp ALA q 0.0 + 7 N 2 ALA N 7 -0.4157 14.01 ; qtot -0.4157 + 8 H 2 ALA H 8 0.2719 1.008 ; qtot -0.1438 + 9 CT 2 ALA CA 9 0.0337 12.01 ; qtot -0.1101 + 10 H1 2 ALA HA 10 0.0823 1.008 ; qtot -0.0278 + 11 CT 2 ALA CB 11 -0.1825 12.01 ; qtot -0.2103 + 12 HC 2 ALA HB1 12 0.0603 1.008 ; qtot -0.15 + 13 HC 2 ALA HB2 13 0.0603 1.008 ; qtot -0.0897 + 14 HC 2 ALA HB3 14 0.0603 1.008 ; qtot -0.0294 + 15 C 2 ALA C 15 0.5973 12.01 ; qtot 0.5679 + 16 O 2 ALA O 16 -0.5679 16 ; qtot 0 +; residue 3 NME rtp NME q 0.0 + 17 N 3 NME N 17 -0.4157 14.01 ; qtot -0.4157 + 18 H 3 NME H 18 0.2719 1.008 ; qtot -0.1438 + 19 CT 3 NME CH3 19 -0.149 12.01 ; qtot -0.2928 + 20 H1 3 NME HH31 20 0.0976 1.008 ; qtot -0.1952 + 21 H1 3 NME HH32 21 0.0976 1.008 ; qtot -0.0976 + 22 H1 3 NME HH33 22 0.0976 1.008 ; qtot 0 + +[ bonds ] +; ai aj funct c0 c1 c2 c3 + 1 2 1 + 1 3 1 + 1 4 1 + 1 5 1 + 5 6 1 + 5 7 1 + 7 8 1 + 7 9 1 + 9 10 1 + 9 11 1 + 9 15 1 + 11 12 1 + 11 13 1 + 11 14 1 + 15 16 1 + 15 17 1 + 17 18 1 + 17 19 1 + 19 20 1 + 19 21 1 + 19 22 1 + +[ pairs ] +; ai aj funct c0 c1 c2 c3 + 1 8 1 + 1 9 1 + 2 6 1 + 2 7 1 + 3 6 1 + 3 7 1 + 4 6 1 + 4 7 1 + 5 10 1 + 5 11 1 + 5 15 1 + 6 8 1 + 6 9 1 + 7 12 1 + 7 13 1 + 7 14 1 + 7 16 1 + 7 17 1 + 8 10 1 + 8 11 1 + 8 15 1 + 9 18 1 + 9 19 1 + 10 12 1 + 10 13 1 + 10 14 1 + 10 16 1 + 10 17 1 + 11 16 1 + 11 17 1 + 12 15 1 + 13 15 1 + 14 15 1 + 15 20 1 + 15 21 1 + 15 22 1 + 16 18 1 + 16 19 1 + 18 20 1 + 18 21 1 + 18 22 1 + +[ angles ] +; ai aj ak funct c0 c1 c2 c3 + 2 1 3 1 + 2 1 4 1 + 2 1 5 1 + 3 1 4 1 + 3 1 5 1 + 4 1 5 1 + 1 5 6 1 + 1 5 7 1 + 6 5 7 1 + 5 7 8 1 + 5 7 9 1 + 8 7 9 1 + 7 9 10 1 + 7 9 11 1 + 7 9 15 1 + 10 9 11 1 + 10 9 15 1 + 11 9 15 1 + 9 11 12 1 + 9 11 13 1 + 9 11 14 1 + 12 11 13 1 + 12 11 14 1 + 13 11 14 1 + 9 15 16 1 + 9 15 17 1 + 16 15 17 1 + 15 17 18 1 + 15 17 19 1 + 18 17 19 1 + 17 19 20 1 + 17 19 21 1 + 17 19 22 1 + 20 19 21 1 + 20 19 22 1 + 21 19 22 1 + +[ dihedrals ] +; ai aj ak al funct c0 c1 c2 c3 c4 c5 + 2 1 5 6 9 + 2 1 5 7 9 + 3 1 5 6 9 + 3 1 5 7 9 + 4 1 5 6 9 + 4 1 5 7 9 + 1 5 7 8 9 + 1 5 7 9 9 + 6 5 7 8 9 + 6 5 7 9 9 + 5 7 9 10 9 + 5 7 9 11 9 + 5 7 9 15 9 + 8 7 9 10 9 + 8 7 9 11 9 + 8 7 9 15 9 + 7 9 11 12 9 + 7 9 11 13 9 + 7 9 11 14 9 + 10 9 11 12 9 + 10 9 11 13 9 + 10 9 11 14 9 + 15 9 11 12 9 + 15 9 11 13 9 + 15 9 11 14 9 + 7 9 15 16 9 + 7 9 15 17 9 + 10 9 15 16 9 + 10 9 15 17 9 + 11 9 15 16 9 + 11 9 15 17 9 + 9 15 17 18 9 + 9 15 17 19 9 + 16 15 17 18 9 + 16 15 17 19 9 + 15 17 19 20 9 + 15 17 19 21 9 + 15 17 19 22 9 + 18 17 19 20 9 + 18 17 19 21 9 + 18 17 19 22 9 + +[ dihedrals ] +; ai aj ak al funct c0 c1 c2 c3 + 1 7 5 6 4 + 5 9 7 8 4 + 9 17 15 16 4 + 15 19 17 18 4 + +; Include Position restraint file + +; Include water topology +[ moleculetype ] +; molname nrexcl +SOL 2 + +[ atoms ] +; id at type res nr res name at name cg nr charge mass + 1 OW 1 SOL OW 1 -0.834 16.00000 + 2 HW 1 SOL HW1 1 0.417 1.00800 + 3 HW 1 SOL HW2 1 0.417 1.00800 + + +[ settles ] +; OW funct doh dhh +1 1 0.09572 0.15139 + +[ exclusions ] +1 2 3 +2 1 3 +3 1 2 + + + +; Include topology for ions +[ moleculetype ] +; molname nrexcl +IB+ 1 ; big positive ion + +[ atoms ] +; id at type res nr residu name at name cg nr charge +1 IB 1 IB+ IB 1 1.00000 + + +[ moleculetype ] +; molname nrexcl +CA 1 + +[ atoms ] +; id at type res nr residu name at name cg nr charge +1 C0 1 CA CA 1 2.00000 + + +[ moleculetype ] +; molname nrexcl +CL 1 + +[ atoms ] +; id at type res nr residu name at name cg nr charge +1 Cl 1 CL CL 1 -1.00000 + + +[ moleculetype ] +; molname nrexcl +NA 1 + +[ atoms ] +; id at type res nr residu name at name cg nr charge +1 Na 1 NA NA 1 1.00000 + + +[ moleculetype ] +; molname nrexcl +MG 1 + +[ atoms ] +; id at type res nr residu name at name cg nr charge +1 MG 1 MG MG 1 2.00000 + + +[ moleculetype ] +; molname nrexcl +K 1 + +[ atoms ] +; id at type res nr residu name at name cg nr charge +1 K 1 K K 1 1.00000 + + +[ moleculetype ] +; molname nrexcl +RB 1 + +[ atoms ] +; id at type res nr residu name at name cg nr charge +1 Rb 1 RB RB 1 1.00000 + + +[ moleculetype ] +; molname nrexcl +CS 1 + +[ atoms ] +; id at type res nr residu name at name cg nr charge +1 Cs 1 CS CS 1 1.00000 + + +[ moleculetype ] +; molname nrexcl +LI 1 + +[ atoms ] +; id at type res nr residu name at name cg nr charge +1 Li 1 LI LI 1 1.00000 + + +[ moleculetype ] +; molname nrexcl +ZN 1 + +[ atoms ] +; id at type res nr residu name at name cg nr charge +1 Zn 1 ZN ZN 1 2.00000 + +[ system ] +; Name +Protein + +[ molecules ] +; Compound #mols +Protein_chain_1 1 diff --git a/test/files/gmxtops/bad_vsites3.top b/test/files/gmxtops/bad_vsites3.top new file mode 100644 index 000000000..0642e3cce --- /dev/null +++ b/test/files/gmxtops/bad_vsites3.top @@ -0,0 +1,52 @@ +[ moleculetype ] +; molname nrexcl +SOL 2 + +[ atoms ] +; id at type res nr res name at name cg nr charge mass + 1 OW_tip4pew 1 SOL OW 1 0 16.00000 + 2 HW_tip4pew 1 SOL HW1 1 0.52422 1.00800 + 3 HW_tip4pew 1 SOL HW2 1 0.52422 1.00800 + 4 MW 1 SOL MW 1 -1.04844 0.00000 + +#ifndef FLEXIBLE + +#else +[ bonds ] +; i j funct length force.c. +1 2 1 +1 3 1 + +[ angles ] +; i j k funct angle force.c. +2 1 3 1 + +#endif + + +[ virtual_sites3 ] +; Vsite from funct a b +4 1 2 3 1 0.106676721 0.106676721 + + +[ exclusions ] +1 2 3 4 +2 1 3 4 +3 1 2 4 +4 1 2 3 + + +; The position of the virtual site is computed as follows: +; +; O +; +; V +; +; H H +; +; Ewald tip4p: +; const = distance (OV) / [ cos (angle(VOH)) * distance (OH) ] +; 0.0125 nm / [ cos (52.26 deg) * 0.09572 nm ] +; then a = b = 0.5 * const = 0.106676721 +; +; Vsite pos x4 = x1 + a*(x2-x1) + b*(x3-x1) From 0b70743b99fb47d99d516ff142e42ae6ec4a7251 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 09:51:41 -0500 Subject: [PATCH 40/62] Fix box assignment in copy. --- parmed/structure.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parmed/structure.py b/parmed/structure.py index 0f30ee6ce..dcf23784a 100644 --- a/parmed/structure.py +++ b/parmed/structure.py @@ -647,7 +647,7 @@ def copy(self, cls, split_dihedrals=False): ) for g in self.groups: c.groups.append(Group(atoms[g.atom.idx], g.type, g.move)) - c._box = copy(self.box).reshape(-1, 6) + c._box = copy(self._box) c._coordinates = copy(self._coordinates) c.combining_rule = self.combining_rule return c From 61af476ca889a8d5b748713ba8115fb6d84ae3d8 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 09:54:36 -0500 Subject: [PATCH 41/62] Have test script exit with error if any command inside exits with error --- devtools/travis-ci/runtest.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/devtools/travis-ci/runtest.sh b/devtools/travis-ci/runtest.sh index 2318e7c14..1f2fd0d08 100644 --- a/devtools/travis-ci/runtest.sh +++ b/devtools/travis-ci/runtest.sh @@ -1,4 +1,5 @@ #!/bin/sh +set -e echo "Checking parmed source with pyflakes linter" if [ "$PYTHON_VERSION" = "pypy" ]; then From e9c3470fc58a3d74e9a73fa80527994a0b66b396 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 09:56:08 -0500 Subject: [PATCH 42/62] Swap out Python 3.3 for Python 3.5 in testing matrix. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index edd29e950..0d73f8f23 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,10 +12,10 @@ addons: matrix: include: - { os: linux, env: PYTHON_VERSION=2.7 } - - { os: linux, env: PYTHON_VERSION=3.3 MINIMAL_PACKAGES=yes } - { os: linux, env: PYTHON_VERSION=3.4 } + - { os: linux, env: PYTHON_VERSION=3.5 MINIMAL_PACKAGES=yes } - { os: linux, env: PYTHON_VERSION=pypy } - - { os: osx, env: PYTHON_VERSION=3.4 MINIMAL_PACKAGES=yes } + - { os: osx, env: PYTHON_VERSION=3.5 MINIMAL_PACKAGES=yes } install: - source devtools/travis-ci/install.sh From ada149906093f03c6b74faa3a3982bd025c5381d Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 10:01:17 -0500 Subject: [PATCH 43/62] Remove unused import. --- parmed/structure.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/parmed/structure.py b/parmed/structure.py index dcf23784a..4de563a51 100644 --- a/parmed/structure.py +++ b/parmed/structure.py @@ -38,11 +38,11 @@ box_vectors_to_lengths_and_angles) from parmed.residue import SOLVENT_NAMES from parmed.topologyobjects import (AtomList, ResidueList, TrackedList, - DihedralTypeList, DihedralType, Bond, Angle, Dihedral, UreyBradley, - Improper, Cmap, TrigonalAngle, OutOfPlaneBend, PiTorsion, StretchBend, - TorsionTorsion, NonbondedException, AcceptorDonor, Group, ExtraPoint, - TwoParticleExtraPointFrame, ChiralFrame, MultipoleFrame, NoUreyBradley, - ThreeParticleExtraPointFrame, OutOfPlaneExtraPointFrame, Atom) + DihedralTypeList, Bond, Angle, Dihedral, UreyBradley, Improper, Cmap, + TrigonalAngle, OutOfPlaneBend, PiTorsion, StretchBend, TorsionTorsion, + NonbondedException, AcceptorDonor, Group, ExtraPoint, ChiralFrame, + TwoParticleExtraPointFrame, MultipoleFrame, NoUreyBradley, Atom, + ThreeParticleExtraPointFrame, OutOfPlaneExtraPointFrame) from parmed import unit as u from parmed.utils import tag_molecules, PYPY from parmed.utils.decorators import needs_openmm From 1429c9e0b20a1a611576b6f6c96135e4229fc0e7 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 11:01:49 -0500 Subject: [PATCH 44/62] Fix up GROMACS parameter assignment with angles and urey-bradleys --- parmed/gromacs/gromacstop.py | 11 +++++------ test/test_parmed_gromacs.py | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/parmed/gromacs/gromacstop.py b/parmed/gromacs/gromacstop.py index 98c6b9e71..f9ea1f5be 100644 --- a/parmed/gromacs/gromacstop.py +++ b/parmed/gromacs/gromacstop.py @@ -533,8 +533,6 @@ def _parse_angles(self, line, angle_types, ub_types, atoms): self.unknown_functional = True angt = ub = ubt = None ang = Angle(atoms[i], atoms[j], atoms[k]) - if funct == 5: - ub = UreyBradley(atoms[i], atoms[k]) ang.funct = funct if (funct == 1 and len(words) >= 6) or (funct == 5 and len(words) >= 8): theteq, k = (float(x) for x in words[4:6]) @@ -547,6 +545,7 @@ def _parse_angles(self, line, angle_types, ub_types, atoms): if funct == 5 and len(words) >= 8: ubreq, ubk = (float(x) for x in words[6:8]) if ubreq > 0 and ubk > 0: + ub = UreyBradley(ang.atom1, ang.atom3) if (ubreq, ubk) in ub_types: ub.type = ub_types[(ubreq, ubk)] else: @@ -555,8 +554,6 @@ def _parse_angles(self, line, angle_types, ub_types, atoms): ubreq*u.nanometer, ) ub_types[(ubreq, ubk)] = ub.type = ubt - else: - ub.type = NoUreyBradley return ang, ub, angt, ubt def _parse_dihedrals(self, line, dihedral_types, PMD, molecule): @@ -1258,7 +1255,8 @@ def from_structure(cls, struct, copy=False): if gmxtop.combining_rule == 'geometric': gmxtop.defaults.comb_rule = 3 - gmxtop.parameterset = ParameterSet.from_structure(struct) + gmxtop.parameterset = ParameterSet.from_structure(struct, + allow_unequal_duplicates=True) return gmxtop #=================================================== @@ -1292,7 +1290,8 @@ def write(self, dest, combine=None, parameters='inline'): from parmed import __version__ own_handle = False fname = '' - params = self.parameterset or ParameterSet.from_structure(self) + params = self.parameterset or ParameterSet.from_structure(self, + allow_unequal_duplicates=True) if isinstance(dest, string_types): fname = '%s ' % dest dest = genopen(dest, 'w') diff --git a/test/test_parmed_gromacs.py b/test/test_parmed_gromacs.py index 68592de85..d4209d06a 100644 --- a/test/test_parmed_gromacs.py +++ b/test/test_parmed_gromacs.py @@ -436,7 +436,7 @@ def test_molecule_combine(self): parm.write(fname, combine=[[1, 3]])) self.assertRaises(ValueError, lambda: parm.write(fname, combine='joey')) - self.assertRaises(ValueError, lambda: + self.assertRaises(TypeError, lambda: parm.write(fname, combine=[1, 2, 3])) self.assertRaises(TypeError, lambda: parm.write(fname, combine=1)) From dc9d6df29ed78f0c71a8919838026dd2cb23803d Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 11:13:24 -0500 Subject: [PATCH 45/62] Empty writes directory in test setup. --- test/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/utils.py b/test/utils.py index df1c4840f..f7d7c684e 100644 --- a/test/utils.py +++ b/test/utils.py @@ -58,6 +58,7 @@ def assertRelativeEqual(self, val1, val2, places=7, delta=None): class FileIOTestCase(unittest.TestCase): def setUp(self): + self._empty_writes() try: os.makedirs(get_fn('writes')) except OSError: From 00b7a25954e11e18433509db1e2cff28c8c2cd7c Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 12:43:13 -0500 Subject: [PATCH 46/62] Fix processing of Urey-Bradley types --- parmed/gromacs/gromacstop.py | 7 +++++-- parmed/structure.py | 4 ++++ test/test_format_conversions.py | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/parmed/gromacs/gromacstop.py b/parmed/gromacs/gromacstop.py index f9ea1f5be..d7f0b7228 100644 --- a/parmed/gromacs/gromacstop.py +++ b/parmed/gromacs/gromacstop.py @@ -534,6 +534,8 @@ def _parse_angles(self, line, angle_types, ub_types, atoms): angt = ub = ubt = None ang = Angle(atoms[i], atoms[j], atoms[k]) ang.funct = funct + if funct == 5: + ub = UreyBradley(atoms[i], atoms[k]) if (funct == 1 and len(words) >= 6) or (funct == 5 and len(words) >= 8): theteq, k = (float(x) for x in words[4:6]) if (theteq, k) in angle_types: @@ -544,8 +546,7 @@ def _parse_angles(self, line, angle_types, ub_types, atoms): angle_types[(theteq, k)] = ang.type = angt if funct == 5 and len(words) >= 8: ubreq, ubk = (float(x) for x in words[6:8]) - if ubreq > 0 and ubk > 0: - ub = UreyBradley(ang.atom1, ang.atom3) + if ubk > 0: if (ubreq, ubk) in ub_types: ub.type = ub_types[(ubreq, ubk)] else: @@ -554,6 +555,8 @@ def _parse_angles(self, line, angle_types, ub_types, atoms): ubreq*u.nanometer, ) ub_types[(ubreq, ubk)] = ub.type = ubt + else: + ub.type = NoUreyBradley return ang, ub, angt, ubt def _parse_dihedrals(self, line, dihedral_types, PMD, molecule): diff --git a/parmed/structure.py b/parmed/structure.py index 4de563a51..8f655e560 100644 --- a/parmed/structure.py +++ b/parmed/structure.py @@ -3284,6 +3284,8 @@ def copy_valence_terms(oval, otyp, sval, styp, attrlist): kws = dict() if otypcp and val.type is not None: kws['type'] = otypcp[val.type.idx] + elif val.type is NoUreyBradley: # special-case singleton + kws['type'] = NoUreyBradley sval.append(type(val)(*ats, **kws)) if hasattr(val, 'funct'): sval[-1].funct = val.funct @@ -3379,6 +3381,8 @@ def copy_valence_terms(oval, aoffset, sval, styp, attrlist): kws = dict() if styp and val.type is not None: kws['type'] = styp[val.type.idx] + elif val.type is NoUreyBradley: # special-case singleton + kws['type'] = NoUreyBradley sval.append(type(val)(*ats, **kws)) if hasattr(val, 'funct'): sval[-1].funct = val.funct diff --git a/test/test_format_conversions.py b/test/test_format_conversions.py index 54fb8b31f..d6cdf2d4b 100644 --- a/test/test_format_conversions.py +++ b/test/test_format_conversions.py @@ -103,6 +103,8 @@ def test_chamber(self): fn = get_fn('1aki.charmm27_fromgmx.parm7', written=True) top = load_file(get_fn('1aki.charmm27.solv.top'), xyz=get_fn('1aki.charmm27.solv.gro')) + self.assertGreater(len(top.urey_bradleys), 0) + self.assertGreater(len(top.urey_bradley_types), 0) parm = amber.ChamberParm.from_structure(top) parm.write_parm(fn) self.assertTrue( From 9c9a59ebfc8b96f5c428d94562f2e1a22e69316a Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 12:59:15 -0500 Subject: [PATCH 47/62] Fix possible AttributeError's --- parmed/structure.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/parmed/structure.py b/parmed/structure.py index 8f655e560..afa24638b 100644 --- a/parmed/structure.py +++ b/parmed/structure.py @@ -3284,8 +3284,8 @@ def copy_valence_terms(oval, otyp, sval, styp, attrlist): kws = dict() if otypcp and val.type is not None: kws['type'] = otypcp[val.type.idx] - elif val.type is NoUreyBradley: # special-case singleton - kws['type'] = NoUreyBradley + elif hasattr(val, 'type') and val.type is NoUreyBradley: + kws['type'] = NoUreyBradley # special-case singleton sval.append(type(val)(*ats, **kws)) if hasattr(val, 'funct'): sval[-1].funct = val.funct @@ -3381,8 +3381,8 @@ def copy_valence_terms(oval, aoffset, sval, styp, attrlist): kws = dict() if styp and val.type is not None: kws['type'] = styp[val.type.idx] - elif val.type is NoUreyBradley: # special-case singleton - kws['type'] = NoUreyBradley + elif hasattr(val, 'type') and val.type is NoUreyBradley: + kws['type'] = NoUreyBradley # special-case singleton sval.append(type(val)(*ats, **kws)) if hasattr(val, 'funct'): sval[-1].funct = val.funct From a2cd784e7e1f4aad35e8f5b4a66ba7d5f700c6e8 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 13:33:31 -0500 Subject: [PATCH 48/62] Add appropriate skip --- test/test_parmed_gromacs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_parmed_gromacs.py b/test/test_parmed_gromacs.py index d4209d06a..42c257c4d 100644 --- a/test/test_parmed_gromacs.py +++ b/test/test_parmed_gromacs.py @@ -548,6 +548,7 @@ def setter(idx, val): _equal_atoms = utils.equal_atoms +@unittest.skipUnless(HAS_GROMACS, "Cannot run GROMACS tests without Gromacs") class TestGromacsMissingParameters(FileIOTestCase): """ Test handling of missing parameters """ From 2c5d26cba3ff4da29389802cd68a2d1567130aa8 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 15:16:46 -0500 Subject: [PATCH 49/62] Update some tests and gromacs writing when gen_pairs = no --- parmed/gromacs/gromacstop.py | 13 +++++-- test/test_parmed_gromacs.py | 73 ++++++++++++++++++++++++++++++++---- 2 files changed, 74 insertions(+), 12 deletions(-) diff --git a/parmed/gromacs/gromacstop.py b/parmed/gromacs/gromacstop.py index d7f0b7228..05f4cbdcd 100644 --- a/parmed/gromacs/gromacstop.py +++ b/parmed/gromacs/gromacstop.py @@ -1314,9 +1314,6 @@ def write(self, dest, combine=None, parameters='inline'): own_parfile_handle = True parfile = genopen(parameters, 'w') include_parfile = parameters - elif parameters is dest: - # This is also OK -- we'll just write to the same file object - pass elif hasattr(parameters, 'write'): parfile = parameters else: @@ -1765,12 +1762,20 @@ def _write_molecule(struct, dest, title, params, writeparams): dest.write(';%6s %6s %5s %10s %10s %10s %10s\n' % ('ai', 'aj', 'funct', 'c0', 'c1', 'c2', 'c3')) # Get the 1-4 pairs from the dihedral list + struct.update_dihedral_exclusions() + econv = u.kilocalories.conversion_factor_to(u.kilojoules) + lconv = u.angstroms.conversion_factor_to(u.nanometer) for dihed in struct.dihedrals: if dihed.ignore_end or dihed.improper: continue a1, a2 = dihed.atom1, dihed.atom4 if a1 in a2.bond_partners or a1 in a2.angle_partners: continue - dest.write('%7d %6d %5d\n' % (a1.idx+1, a2.idx+1, 1)) + dest.write('%7d %6d %5d' % (a1.idx+1, a2.idx+1, 1)) + if struct.defaults.gen_pairs == 'no': + dest.write(' %.5f %.5f' % + (0.5*(a1.sigma_14+a2.sigma_14)*lconv, + math.sqrt(a1.epsilon_14*a2.epsilon_14)*econv)) + dest.write('\n') dest.write('\n') # Angles if struct.angles: diff --git a/test/test_parmed_gromacs.py b/test/test_parmed_gromacs.py index 42c257c4d..c134dbec2 100644 --- a/test/test_parmed_gromacs.py +++ b/test/test_parmed_gromacs.py @@ -6,7 +6,8 @@ import os from parmed import (load_file, Structure, ExtraPoint, DihedralTypeList, Atom, ParameterSet, Bond, NonbondedException, DihedralType, - RBTorsionType, Improper, Cmap) + RBTorsionType, Improper, Cmap, UreyBradley, + NonbondedExceptionType) from parmed.exceptions import GromacsWarning, GromacsError, ParameterError from parmed.gromacs import GromacsTopologyFile, GromacsGroFile from parmed.gromacs._gromacsfile import GromacsFile @@ -376,6 +377,11 @@ def test_bad_top_loads(self): def test_top_parsing_missing_types(self): """ Test GROMACS topology files with missing types """ + warnings.filterwarnings('error', category=GromacsWarning) + self.assertRaises(GromacsWarning, lambda: + GromacsTopologyFile(os.path.join(get_fn('gmxtops'), + 'missing_atomtype.top'), parametrize=False) + ) warnings.filterwarnings('ignore', category=GromacsWarning) top = GromacsTopologyFile(os.path.join(get_fn('gmxtops'), 'missing_atomtype.top'), parametrize=False) @@ -387,12 +393,6 @@ def test_top_parsing_missing_types(self): self.assertEqual(top[-1].charge, 0) # removed self.assertEqual(top.bonds[0].funct, 2) self.assertTrue(top.unknown_functional) - warnings.filterwarnings('error', category=GromacsWarning) - self.assertRaises(GromacsWarning, lambda: - GromacsTopologyFile(os.path.join(get_fn('gmxtops'), - 'missing_atomtype.top'), parametrize=False) - ) - warnings.filterwarnings('always', category=GromacsWarning) def test_molecule_ordering(self): """ Tests non-contiguous atoms in Gromacs topology file writes """ @@ -478,7 +478,56 @@ def total_diheds(dlist): f = StringIO() self.assertRaises(ValueError, lambda: top.write(f, parameters=10)) # Write parameters and topology to same filename - fn = get_fn('test.top')#, written=True) + fn = get_fn('test.top', written=True) + top.write(fn, parameters=fn) + top2 = load_file(fn) + self.assertEqual(len(top2.atoms), len(top.atoms)) + self.assertEqual(len(top2.bonds), len(top.bonds)) + self.assertEqual(len(top2.angles), len(top.angles)) + self.assertEqual(total_diheds(top2.dihedrals), total_diheds(top.dihedrals)) + for a1, a2 in zip(top2.atoms, top.atoms): + self.assertAlmostEqual(a1.atom_type.sigma, a2.atom_type.sigma, places=3) + self.assertAlmostEqual(a1.atom_type.epsilon, a2.atom_type.epsilon, places=3) + self.assertEqual(a1.atom_type.name, a2.atom_type.name) + self.assertEqual(a1.name, a2.name) + self.assertEqual(a1.type, a2.type) + self.assertEqual(set(a.name for a in a1.bond_partners), + set(a.name for a in a2.bond_partners)) + # Now try passing open files + with open(fn, 'w') as f: + top.write(f, parameters=f) + top2 = load_file(fn) + self.assertEqual(len(top2.atoms), len(top.atoms)) + self.assertEqual(len(top2.bonds), len(top.bonds)) + self.assertEqual(len(top2.angles), len(top.angles)) + self.assertEqual(total_diheds(top2.dihedrals), total_diheds(top.dihedrals)) + for a1, a2 in zip(top2.atoms, top.atoms): + self.assertAlmostEqual(a1.atom_type.sigma, a2.atom_type.sigma, places=3) + self.assertAlmostEqual(a1.atom_type.epsilon, a2.atom_type.epsilon, places=3) + self.assertEqual(a1.atom_type.name, a2.atom_type.name) + self.assertEqual(a1.name, a2.name) + self.assertEqual(a1.type, a2.type) + self.assertEqual(set(a.name for a in a1.bond_partners), + set(a.name for a in a2.bond_partners)) + # Now try separate parameter/topology file + fn2 = get_fn('test.itp', written=True) + top.write(fn, parameters=fn2) + top2 = load_file(fn) + self.assertEqual(len(top2.atoms), len(top.atoms)) + self.assertEqual(len(top2.bonds), len(top.bonds)) + self.assertEqual(len(top2.angles), len(top.angles)) + self.assertEqual(total_diheds(top2.dihedrals), total_diheds(top.dihedrals)) + for a1, a2 in zip(top2.atoms, top.atoms): + self.assertAlmostEqual(a1.atom_type.sigma, a2.atom_type.sigma, places=3) + self.assertAlmostEqual(a1.atom_type.epsilon, a2.atom_type.epsilon, places=3) + self.assertEqual(a1.atom_type.name, a2.atom_type.name) + self.assertEqual(a1.name, a2.name) + self.assertEqual(a1.type, a2.type) + self.assertEqual(set(a.name for a in a1.bond_partners), + set(a.name for a in a2.bond_partners)) + # Now force writing pair types... but first we have to provide pair + # types + top.defaults.gen_pairs = 'no' top.write(fn, parameters=fn) top2 = load_file(fn) self.assertEqual(len(top2.atoms), len(top.atoms)) @@ -714,6 +763,14 @@ def test_missing_cmaps(self): self.top.cmaps.append(Cmap(*tuple(self.top.atoms[:5]))) self.assertRaises(ParameterError, self.top.parametrize) + def test_missing_ureybradleys(self): + """ Test handling of missing Urey-Bradley types """ + self.top.angles[0].funct = 5 + self.top.urey_bradleys.append( + UreyBradley(self.top.angles[0].atom1, self.top.angles[0].atom3) + ) + self.assertRaises(ParameterError, self.top.parametrize) + class TestGromacsTopHelperFunctions(FileIOTestCase): """ Test GROMACS helper functions """ From 1ae7cc15d3d54be89b16b6a9c4bd8ea059354c5a Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 19:45:15 -0500 Subject: [PATCH 50/62] Attempt to run coveralls --- .coveragerc | 14 ++++++++++++++ devtools/travis-ci/install.sh | 5 +++-- devtools/travis-ci/runtest.sh | 4 ++-- 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 000000000..c66977f8e --- /dev/null +++ b/.coveragerc @@ -0,0 +1,14 @@ +[run] + source = parmed + +[report] + show_missing = True + skip_covered = True + omit = + */parmed/utils/fortranformat/* + */parmed/utils/six.py + */parmed/format/pdbx/* + */parmed/vec3.py + */parmed/utils/netcdf.py + */parmed/tinker/* + */parmed/rosetta/* diff --git a/devtools/travis-ci/install.sh b/devtools/travis-ci/install.sh index bc2b834a0..27544937e 100755 --- a/devtools/travis-ci/install.sh +++ b/devtools/travis-ci/install.sh @@ -25,12 +25,13 @@ else # Otherwise, CPython... go through conda if [ -z "$MINIMAL_PACKAGES" ]; then conda create -y -n myenv python=$PYTHON_VERSION \ - numpy scipy pandas nose openmm pyflakes coverage nose-timer + numpy scipy pandas nose openmm pyflakes coverage nose-timer \ + coveralls conda update -y -n myenv --all else # Do not install the full numpy/scipy stack conda create -y -n myenv python=$PYTHON_VERSION numpy nose pyflakes \ - coverage nose-timer + coverage nose-timer coveralls fi source activate myenv diff --git a/devtools/travis-ci/runtest.sh b/devtools/travis-ci/runtest.sh index 1f2fd0d08..d7088fe34 100644 --- a/devtools/travis-ci/runtest.sh +++ b/devtools/travis-ci/runtest.sh @@ -10,7 +10,7 @@ fi sh devtools/travis-ci/pyflakes_check.sh cd test echo "Using nosetests...:" -which nosetests +./run_scripts.sh if [ "$PYTHON_VERSION" = "pypy" ]; then # Disable coverage with pyflakes, since it multiplies the time taken by 6 or # something ridiculous like that @@ -21,5 +21,5 @@ else --timer-filter=warning,error --with-coverage \ --cover-package=parmed . fi -./run_scripts.sh test -z `which coverage 2>/dev/null` || coverage report -m +test -z `which coveralls` || coveralls From 5850e87059768412f229c782187f102ff26fef62 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 19:45:56 -0500 Subject: [PATCH 51/62] Version bump. --- parmed/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parmed/__init__.py b/parmed/__init__.py index 4bc371a18..dd4c6c7fc 100644 --- a/parmed/__init__.py +++ b/parmed/__init__.py @@ -6,7 +6,7 @@ # Version format should be "major.minor.patch". For beta releases, attach # "-beta#" to the end. The beta number will be turned into another number in the # version tuple -__version__ = '2.1.10' +__version__ = '2.1.11' __author__ = 'Jason Swails' __all__ = ['exceptions', 'periodic_table', 'residue', 'unit', 'utils', From d0e06d3d5b3d5d3a89aefaa710e839f5c1876e63 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 21:06:31 -0500 Subject: [PATCH 52/62] Fix coveralls install --- devtools/travis-ci/install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/devtools/travis-ci/install.sh b/devtools/travis-ci/install.sh index 27544937e..b8fdad322 100755 --- a/devtools/travis-ci/install.sh +++ b/devtools/travis-ci/install.sh @@ -26,12 +26,12 @@ else # Otherwise, CPython... go through conda if [ -z "$MINIMAL_PACKAGES" ]; then conda create -y -n myenv python=$PYTHON_VERSION \ numpy scipy pandas nose openmm pyflakes coverage nose-timer \ - coveralls + python-coveralls conda update -y -n myenv --all else # Do not install the full numpy/scipy stack conda create -y -n myenv python=$PYTHON_VERSION numpy nose pyflakes \ - coverage nose-timer coveralls + coverage nose-timer python-coveralls fi source activate myenv From 5c9bf24bd37dd4127a669b3f27f7d320ba376cf4 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 21:49:00 -0500 Subject: [PATCH 53/62] Move .coveragerc and install a specific numpypy branch compatible with the latest pypy release --- devtools/travis-ci/install.sh | 2 +- .coveragerc => test/.coveragerc | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename .coveragerc => test/.coveragerc (100%) diff --git a/devtools/travis-ci/install.sh b/devtools/travis-ci/install.sh index b8fdad322..dd8bf10b8 100755 --- a/devtools/travis-ci/install.sh +++ b/devtools/travis-ci/install.sh @@ -9,7 +9,7 @@ if [ "$PYTHON_VERSION" = "pypy" ]; then pypy -m pip install nose pyflakes nose-timer which pyflakes - pypy -m pip install --user git+https://bitbucket.org/pypy/numpy.git + pypy -m pip install --user git+https://bitbucket.org/pypy/numpy.git@pypy-4.0.1 else # Otherwise, CPython... go through conda if [ "$TRAVIS_OS_NAME" = "osx" ]; then wget http://repo.continuum.io/miniconda/Miniconda-3.7.0-MacOSX-x86_64.sh -O miniconda.sh; diff --git a/.coveragerc b/test/.coveragerc similarity index 100% rename from .coveragerc rename to test/.coveragerc From af2ecb7fbf87538f02dbec9c1254699cc410183f Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Mon, 25 Jan 2016 22:03:54 -0500 Subject: [PATCH 54/62] Move omit to run --- test/.coveragerc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test/.coveragerc b/test/.coveragerc index c66977f8e..d097868a2 100644 --- a/test/.coveragerc +++ b/test/.coveragerc @@ -1,14 +1,14 @@ [run] - source = parmed +source = parmed +omit = + */parmed/utils/fortranformat/* + */parmed/utils/six.py + */parmed/format/pdbx/* + */parmed/vec3.py + */parmed/utils/netcdf.py + */parmed/tinker/* + */parmed/rosetta/* [report] show_missing = True skip_covered = True - omit = - */parmed/utils/fortranformat/* - */parmed/utils/six.py - */parmed/format/pdbx/* - */parmed/vec3.py - */parmed/utils/netcdf.py - */parmed/tinker/* - */parmed/rosetta/* From dc6138977e5b4cea95f958a357d2bd1889d77673 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 26 Jan 2016 11:46:48 -0500 Subject: [PATCH 55/62] Update MANIFEST.in file, and updates to hopefully get coverage/coveralls working. --- MANIFEST.in | 2 +- devtools/travis-ci/runtest.sh | 17 ++++++++++++----- test/.coveragerc | 4 ---- test/run_scripts.sh | 5 ----- 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index ac9bfb92f..1d0f112c0 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,3 @@ graft examples graft src -graft test +graft parmed diff --git a/devtools/travis-ci/runtest.sh b/devtools/travis-ci/runtest.sh index d7088fe34..300e0739b 100644 --- a/devtools/travis-ci/runtest.sh +++ b/devtools/travis-ci/runtest.sh @@ -1,6 +1,11 @@ #!/bin/sh set -e +do_coverage() { + coverage combine . + coverage report -m +} + echo "Checking parmed source with pyflakes linter" if [ "$PYTHON_VERSION" = "pypy" ]; then export PYENV_ROOT="${HOME}/.pyenv" @@ -12,14 +17,16 @@ cd test echo "Using nosetests...:" ./run_scripts.sh if [ "$PYTHON_VERSION" = "pypy" ]; then - # Disable coverage with pyflakes, since it multiplies the time taken by 6 or + # Disable coverage with pypy, since it multiplies the time taken by 6 or # something ridiculous like that nosetests -vs --with-timer --timer-ok=5s --timer-warning=12s \ --timer-filter=warning,error . else - nosetests -vs --with-timer --timer-ok=5s --timer-warning=12s \ - --timer-filter=warning,error --with-coverage \ - --cover-package=parmed . + # Run nose under coverage, since that allows getting the full flexibility of + # the coverage package without sacrificing nose functionality + coverage run --source=parmed --parallel-mode -m \ + nose -vs --with-timer --timer-ok=5s --timer-warning=12s \ + --timer-filter=warning,error . fi -test -z `which coverage 2>/dev/null` || coverage report -m +test -z `which coverage 2>/dev/null` || do_coverage test -z `which coveralls` || coveralls diff --git a/test/.coveragerc b/test/.coveragerc index d097868a2..efbc02b15 100644 --- a/test/.coveragerc +++ b/test/.coveragerc @@ -8,7 +8,3 @@ omit = */parmed/utils/netcdf.py */parmed/tinker/* */parmed/rosetta/* - -[report] - show_missing = True - skip_covered = True diff --git a/test/run_scripts.sh b/test/run_scripts.sh index bb5fa2d92..1dc291616 100755 --- a/test/run_scripts.sh +++ b/test/run_scripts.sh @@ -47,11 +47,6 @@ $run_cmd -m parmed.gromacs._cpp -i - < files/pptest1/pptest1.h \ evaluate_test $? cpptest1 ###### END TESTS ###### -if [ "$has_coverage" = "yes" ]; then - coverage combine .coverage* - echo "Coverage data combined. Run 'coverage report' to get the report" -fi - # Clean up if everything passed if [ $failures -eq 0 ]; then /bin/rm -fr files/writes From 4926ed5b3553aeca6511696212ca6d29a247ed57 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 26 Jan 2016 11:50:13 -0500 Subject: [PATCH 56/62] More tweaks. --- test/run_scripts.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/run_scripts.sh b/test/run_scripts.sh index 1dc291616..c3f76f92d 100755 --- a/test/run_scripts.sh +++ b/test/run_scripts.sh @@ -5,7 +5,7 @@ if [ -z "`which coverage 2>/dev/null`" ]; then has_coverage="no" echo "No coverage module found..." else - run_cmd="coverage run --parallel-mode --source=parmed" + run_cmd="coverage run --parallel-mode" has_coverage="yes" echo "coverage found and will be used..." fi From 27f4d53ced1067c5a0723c94a4c826aa6cf19940 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 26 Jan 2016 12:42:35 -0500 Subject: [PATCH 57/62] Add more logging printout to Travis script --- devtools/travis-ci/runtest.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/devtools/travis-ci/runtest.sh b/devtools/travis-ci/runtest.sh index 300e0739b..35b3c349a 100644 --- a/devtools/travis-ci/runtest.sh +++ b/devtools/travis-ci/runtest.sh @@ -2,6 +2,7 @@ set -e do_coverage() { + echo "Combining coverage data and reporting" coverage combine . coverage report -m } @@ -29,4 +30,6 @@ else --timer-filter=warning,error . fi test -z `which coverage 2>/dev/null` || do_coverage +echo "Running coveralls" test -z `which coveralls` || coveralls +echo "Done!" From a5dff17648334898be7642ed778c8c75d4594358 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 26 Jan 2016 13:44:15 -0500 Subject: [PATCH 58/62] More splitting. --- devtools/travis-ci/runtest.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/devtools/travis-ci/runtest.sh b/devtools/travis-ci/runtest.sh index 35b3c349a..015c0bf0b 100644 --- a/devtools/travis-ci/runtest.sh +++ b/devtools/travis-ci/runtest.sh @@ -2,8 +2,9 @@ set -e do_coverage() { - echo "Combining coverage data and reporting" + echo "Combining coverage data" coverage combine . + echo "Reporting..." coverage report -m } From 1fc466b285175e35a29c239d18645eaffc5b2c8d Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 26 Jan 2016 15:04:03 -0500 Subject: [PATCH 59/62] Not sure why this would cause problems... --- devtools/travis-ci/runtest.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devtools/travis-ci/runtest.sh b/devtools/travis-ci/runtest.sh index 015c0bf0b..c2ec2eafc 100644 --- a/devtools/travis-ci/runtest.sh +++ b/devtools/travis-ci/runtest.sh @@ -3,7 +3,7 @@ set -e do_coverage() { echo "Combining coverage data" - coverage combine . + coverage combine echo "Reporting..." coverage report -m } From 9b9c20ad79964dcaa32f35a2060c4825531ffea1 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 26 Jan 2016 15:40:56 -0500 Subject: [PATCH 60/62] Fix up .coveragerc --- test/.coveragerc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/.coveragerc b/test/.coveragerc index efbc02b15..3d57d6ee2 100644 --- a/test/.coveragerc +++ b/test/.coveragerc @@ -3,8 +3,9 @@ source = parmed omit = */parmed/utils/fortranformat/* */parmed/utils/six.py - */parmed/format/pdbx/* + */parmed/formats/pdbx/* */parmed/vec3.py */parmed/utils/netcdf.py */parmed/tinker/* */parmed/rosetta/* + */parmed/unit/* From a857b93c1dcbbc5950d257d5c6c7ab6bbe8e65f3 Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 26 Jan 2016 17:24:05 -0500 Subject: [PATCH 61/62] Don't care where files are stored, just which modules they are. --- test/.coveragerc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/.coveragerc b/test/.coveragerc index 3d57d6ee2..52a6b0330 100644 --- a/test/.coveragerc +++ b/test/.coveragerc @@ -9,3 +9,6 @@ omit = */parmed/tinker/* */parmed/rosetta/* */parmed/unit/* +[paths] +source = + */site-packages/ From 1a737b1a53b735c8d1e1e8f1de897c739bfa231a Mon Sep 17 00:00:00 2001 From: Jason Swails Date: Tue, 26 Jan 2016 21:23:01 -0500 Subject: [PATCH 62/62] Oops -- resolved the conflict the wrong way... --- parmed/gromacs/gromacstop.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/parmed/gromacs/gromacstop.py b/parmed/gromacs/gromacstop.py index 2b57bc81f..1fffc4c02 100644 --- a/parmed/gromacs/gromacstop.py +++ b/parmed/gromacs/gromacstop.py @@ -402,8 +402,8 @@ def read(self, fname, defines=None, parametrize=True): params.rb_torsion_types[rkey] = t elif current_section == 'cmaptypes': a1, a2, a3, a4, a5, t = self._parse_cmaptypes(line) - params.cmap_types[(a1, a2, a3, a4, a5)] = t - params.cmap_types[(a5, a4, a3, a2, a1)] = t + params.cmap_types[(a1, a2, a3, a4, a2, a3, a4, a5)] = t + params.cmap_types[(a5, a4, a3, a2, a4, a3, a2, a1)] = t elif current_section == 'pairtypes': a, b, t = self._parse_pairtypes(line) params.pair_types[(a, b)] = params.pair_types[(b, a)] = t