diff --git a/.github/workflows/pypi_deploy.yml b/.github/workflows/pypi_deploy.yml index 6ea81d90..8db5f050 100644 --- a/.github/workflows/pypi_deploy.yml +++ b/.github/workflows/pypi_deploy.yml @@ -36,7 +36,6 @@ jobs: token: ${{ secrets.CODECOV_TOKEN }} files: ./coverage.xml fail_ci_if_error: true - verbose: true deploy: needs: test diff --git a/LIBRARY.md b/LIBRARY.md index db215154..00e98e0d 100644 --- a/LIBRARY.md +++ b/LIBRARY.md @@ -21,7 +21,9 @@ |Polystyrene sulfonate |PSS | |[martini2](polyply/data/martini2/PSS.martini.2.itp) | | | | |[martini3](polyply/data/martini3/PSS.martini3.ff) | |Poly(para-phenylene ethynylene)|PPE | |[martini3](polyply/data/martini3/PPE.martini3.ff) | -|Poly(TEMPO methacrylate) |PTMA |[oplsaaLigParGen](polyply/data/oplsaaLigParGen/PTMA.oplsaa.LigParGen.ff)]|[martini3](polyply/data/martini3/PTMA.martini3.ff) | +|Poly(TEMPO methacrylate) |PTMA |[oplsaaLigParGen](polyply/data/oplsaaLigParGen/PTMA.oplsaa.LigParGen.ff)|[martini3](polyply/data/martini3/PTMA.martini3.ff) | +| | | |[ibi_cgm3](polyply/data/ibi_cmg3/PTMA.cgm3.ibi.ff) | +| | | |[ibi_gbcg](polyply/data/ibi_gbcg/PTMA.gbno2.ibi.ff) | |Dextran |DEX | |[martini3](polyply/data/martini3/dextran.martini3.ff) | |DNA nucleobases |Dx, Tx5, Dx3 w/ x=T,G,A,C|[parmbsc1](polyply/data/parmbsc1/dna_final.ff) |[martini2](polyply/data/martini2/DNA_M2.ff) | |Aminoacids |3 letter code | |[martini3](polyply/data/martini3/aminoacids.ff) | diff --git a/README.md b/README.md index d7533250..7dab01bd 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ force-field, molecule parameters and this program. - (Feb 8, 22') **Featured Research Article in Nature Communcations.** Our article on the polyply software suite is now featured on the [Editors' Highlights](https://www.nature.com/collections/hhfigaahch) for Structural biology, biochemistry and biophysics in Nature Communications. The Editors’ Highlights pages aims to showcase the 50 best papers recently published in an area. The development team is beyond happy to receive this honor. - (May 23, 22') **Fighting Cancer with polyply.** Dane et al. used polyply to setup simulations of vesicles and lipid nanodiscs (LNDs) containing PEGylated lipids, which are used as nanocarriers for cancer therapeutics. They find that LNDs are more effective in delivery likely due to their higher flexibility. Check it out in [Nature Materials](https://www.nature.com/articles/s41563-022-01251-z). - (Jan 18, 23') **Towards whole cell simulations with polyply.** In [a perspective on whole-cell simulations](https://www.frontiersin.org/articles/10.3389/fchem.2023.1106495/full) using the Martini force field, Stevens *et al.* utilize polyply to construct the full 0.5 Mio bp chromosome of the Syn3A minimal cell. This impressive task is a good example of the power of the upcoming DNA implementation into polyply and the role of polyply in the Martini Ecosystem. +- (May 11, 23') **Electronic coarse-grained models in polyply.** Curious about simulating non-conjugated radical-containing polymers for all-organic batteries? The models developed [in this work](https://doi.org/10.1021/acs.macromol.3c00141) for PTMA, or poly(TEMPO acrylamide), are avaiable in polyply. There is an all-atom model and different coarse-grained model (Martini 3, iterative Boltzmann inversion), all of which can be flexibly handled by polyply. ## Contributions & Support We are happy to accept submissions of polymer parameters to the polyply library. To submit parameters simply diff --git a/bin/polyply b/bin/polyply index dfb2f193..7901838b 100755 --- a/bin/polyply +++ b/bin/polyply @@ -74,6 +74,9 @@ def main(): # pylint: disable=too-many-locals,too-many-statements help='A linear sequence of residue names.') seq_group.add_argument('-seqf', dest='seq_file', type=Path, help='A graph input file (JSON|TXT|FASTA|IG)') + dna_group = parser_gen_itp.add_argument_group('DNA specifc options') + dna_group.add_argument('-dsdna', dest='dsdna', action='store_true', + help='complement single sequence to dsDNA sequence') parser_gen_itp.set_defaults(func=gen_itp) diff --git a/polyply/__init__.py b/polyply/__init__.py index 9ef7d384..7f7e4d1a 100644 --- a/polyply/__init__.py +++ b/polyply/__init__.py @@ -19,16 +19,23 @@ # Find the data directory once. try: - import pkg_resources + from importlib.resources import files, as_file + import atexit + from contextlib import ExitStack except ImportError: - import os - DATA_PATH = os.path.join(os.path.dirname(__file__), 'data') - TEST_DATA = os.path.join(os.path.dirname(__file__), 'tests/test_data') - del os + from pathlib import Path + DATA_PATH = Path(__file__).parent / 'data' + TEST_DATA = Path(__file__).parent / 'tests/test_data' + del Path else: - DATA_PATH = pkg_resources.resource_filename('polyply', 'data') - TEST_DATA = pkg_resources.resource_filename('polyply', 'tests/test_data') - del pkg_resources + ref_data = files('polyply') / 'data' + ref_test = files('polyply') / 'tests'/ 'test_data' + file_manager = ExitStack() + atexit.register(file_manager.close) + DATA_PATH = file_manager.enter_context(as_file(ref_data)) + TEST_DATA = file_manager.enter_context(as_file(ref_test)) + + del files, as_file, atexit, ExitStack del pbr diff --git a/polyply/data/ibi_cgm3/PTMA.cgm3.ibi.ff b/polyply/data/ibi_cgm3/PTMA.cgm3.ibi.ff new file mode 100644 index 00000000..1b8f9070 --- /dev/null +++ b/polyply/data/ibi_cgm3/PTMA.cgm3.ibi.ff @@ -0,0 +1,68 @@ +[ moleculetype ] +; name nexcl. +PTMA 2 + +[ info ] +Nonbonded interaction potentials (and example run) can be found at: https://doi.org/10.5281/zenodo.8287521 + +[ atoms ] +; id type resnr residu atom cgnr charge mass + 1 VNL 1 PTMA VNL 1 0.0 54 + 2 EST 1 PTMA EST 2 0.0 54 + 3 C1 1 PTMA C1 3 0.0 54 + 4 C2 1 PTMA C2 4 0.0 54 + 5 C2 1 PTMA C3 5 0.0 54 + 6 N4 1 PTMA N4 6 0.0 36 + +[ bonds ] +; i j funct length + 1 2 1 0.262 15000 { "comment": "M3 PMMA model [10.1038/s41467-021-27627-4] shortened"} + 2 3 1 0.253 15000 { "comment": "PMMA-TEMPO connection"} + 3 4 1 0.326 25000 { "comment": "cog (TEMPO)"} + 3 5 1 0.326 25000 { "comment": "cog (TEMPO)"} + 3 6 1 0.310 100000 {"ifdef": "FLEXIBLE", "comment": "cog (TEMPO)"} + 4 6 1 0.238 100000 {"ifdef": "FLEXIBLE", "comment": "cog (TEMPO)"} + 5 6 1 0.238 100000 {"ifdef": "FLEXIBLE", "comment": "cog (TEMPO)"} + +[constraints] +; i j funct length + 3 6 1 0.310 {"ifndef": "FLEXIBLE", "comment": "cog (TEMPO)"} + 4 6 1 0.238 {"ifndef": "FLEXIBLE", "comment": "cog (TEMPO)"} + 5 6 1 0.238 {"ifndef": "FLEXIBLE", "comment": "cog (TEMPO)"} + +[ angles ] +; i j k funct length force k + 1 2 3 2 132.9 70 { "comment": "PMMA-TEMPO connection"} + 2 3 4 2 129.0 60 { "comment": "PMMA-TEMPO connection"} + 2 3 5 2 121.9 95 { "comment": "PMMA-TEMPO connection"} + +[dihedrals] +; i j k l funct ref.angle force_k + 3 4 5 6 2 140.00 20 { "comment": "cog (TEMPO)"} + 2 4 5 6 2 150.00 80 { "comment": "PMMA-TEMPO connection"} + +[exclusions] + 1 2 3 4 5 6 + 2 3 4 5 6 + 3 4 5 6 + 4 5 6 + 5 6 + +[ link ] +resname "PTMA" +[ bonds ] +VNL +VNL 1 0.315 4000 {"group": "vinyl backbone"} + +[ link ] +resname "PTMA" +[ angles ] +VNL +VNL ++VNL 2 115 35 {"group": "vinyl backbone"} + +[ link ] +resname "PTMA" +[ angles ] +EST VNL +VNL 2 70 20 + +[ citation ] +2023RAlessandri-Macromolecules +polyply diff --git a/polyply/data/ibi_cgm3/citations.bib b/polyply/data/ibi_cgm3/citations.bib new file mode 100644 index 00000000..1ba4a6f0 --- /dev/null +++ b/polyply/data/ibi_cgm3/citations.bib @@ -0,0 +1,22 @@ + +@article{2023RAlessandri-Macromolecules, + title={Prediction of Electronic Properties of Radical-Containing Polymers at Coarse-Grained Resolutions}, + author={Alessandri, Riccardo and de Pablo, Juan J}, + journal={Macromolecules}, + volume={56}, + number={10}, + pages={3574-3584}, + doi={10.1021/acs.macromol.3c00141}, + year={2023} +} + + +@article{polyply, + title={Polyply; a python suite for facilitating simulations of (bio-) macromolecules and nanomaterials}, + author={Grunewald, Fabian and Alessandri, Riccardo and Kroon, Peter C and Monticelli, Luca and Souza, Paulo CT and Marrink, Siewert J}, + journal={Nature Communications}, + doi={10.1038/s41467-021-27627-4}, + year={2022}, + volume={13}, + pages={68} +} diff --git a/polyply/data/ibi_gbcg/PTMA.gbno2.ibi.ff b/polyply/data/ibi_gbcg/PTMA.gbno2.ibi.ff new file mode 100644 index 00000000..44e97799 --- /dev/null +++ b/polyply/data/ibi_gbcg/PTMA.gbno2.ibi.ff @@ -0,0 +1,75 @@ +[ moleculetype ] +; name nexcl. +PTMA 2 + +[ info ] +Nonbonded interaction potentials (and example run) can be found at: https://doi.org/10.5281/zenodo.8287521 + +[ atoms ] +; id type resnr residu atom cgnr charge mass + 1 VNL 1 PTMA VNL 1 0 71.099 + 2 EST 1 PTMA EST 2 0 29.018 + 3 C1 1 PTMA C1 3 0 56.108 + 4 U 1 PTMA NN 4 0 0.000 + 5 U 1 PTMA OO 5 0 0.000 + 6 C1 1 PTMA C2 6 0 56.108 + 7 NO 1 PTMA NO 7 0 30.006 + +[ bonds ] +; i j funct length + 1 2 1 0.35337 12500 + 2 3 1 0.32325 32000 + 2 6 1 0.32369 32000 + 3 6 1 0.38838 32000 + 3 7 1 0.23794 1000000 {"ifdef": "FLEXIBLE"} + 6 7 1 0.23793 1000000 {"ifdef": "FLEXIBLE"} + +[constraints] +; i j funct length + 3 7 1 0.23794 {"ifndef": "FLEXIBLE"} + 6 7 1 0.23793 {"ifndef": "FLEXIBLE"} + +[ angles ] +; i j k funct length force k + 1 2 3 2 130.000 90 + 1 2 6 2 130.000 75 + +[dihedrals] +; i j k l funct ref.angle force_k + 1 3 6 7 2 165.98 50 + 2 3 6 7 2 179.20 80 + 3 7 5 6 2 170.723 50 + +[virtual_sites3] +; 3fd sites +; site positioned as a linear combination of 3 atoms; the site is in the same plane +; site from funct a b + 4 3 2 7 2 0.834 0.210 + 5 3 2 7 2 1.180 0.276 + +[exclusions] + 1 2 3 4 5 6 7 + 2 3 4 5 6 7 + 3 4 5 6 7 + 4 5 6 7 + 5 6 7 + 6 7 + +[ link ] +resname "PTMA" +[ bonds ] +VNL +VNL 1 0.305 12000 {"group": "vinyl backbone"} + +[ link ] +resname "PTMA" +[ angles ] +VNL +VNL ++VNL 2 126 40 {"group": "vinyl backbone"} + +[ link ] +resname "PTMA" +[ angles ] +EST VNL +VNL 2 90 20 + +[ citation ] +2023RAlessandri-Macromolecules +polyply diff --git a/polyply/data/ibi_gbcg/citations.bib b/polyply/data/ibi_gbcg/citations.bib new file mode 100644 index 00000000..1ba4a6f0 --- /dev/null +++ b/polyply/data/ibi_gbcg/citations.bib @@ -0,0 +1,22 @@ + +@article{2023RAlessandri-Macromolecules, + title={Prediction of Electronic Properties of Radical-Containing Polymers at Coarse-Grained Resolutions}, + author={Alessandri, Riccardo and de Pablo, Juan J}, + journal={Macromolecules}, + volume={56}, + number={10}, + pages={3574-3584}, + doi={10.1021/acs.macromol.3c00141}, + year={2023} +} + + +@article{polyply, + title={Polyply; a python suite for facilitating simulations of (bio-) macromolecules and nanomaterials}, + author={Grunewald, Fabian and Alessandri, Riccardo and Kroon, Peter C and Monticelli, Luca and Souza, Paulo CT and Marrink, Siewert J}, + journal={Nature Communications}, + doi={10.1038/s41467-021-27627-4}, + year={2022}, + volume={13}, + pages={68} +} diff --git a/polyply/data/martini2/DNA_M2.ff b/polyply/data/martini2/DNA_M2.ff index 723b5e0d..a74976bf 100644 --- a/polyply/data/martini2/DNA_M2.ff +++ b/polyply/data/martini2/DNA_M2.ff @@ -566,3 +566,28 @@ BB3 +BB2 BB2 BB3 +BB1 +BB2 1 180.00000 2 3 {"group": "link"} BB3 +BB1 +BB2 +BB3 9 85.00000 2 2 {"group": "link", "version": "1"} BB3 +BB1 +BB2 +BB3 9 160.00000 2 3 {"group": "link", "version": "2"} + +; +; CIRCULAR MARTINI DNA +; + +[ link ] +resname "DT|DG|DA|DC" +[ atoms ] +BB3 { } +>BB1 { } +[ bonds ] +BB3 >BB1 1 0.35300 10000 {"group": "link-circle", "edge": false} +[ angles ] +BB2 BB3 >BB1 2 102.00000 150 {"group": "backbone-circle", "edge": false} +BB3 >BB1 >BB2 2 106.00000 75 {"group": "backbone-circle", "edge": false} +[ exclusions ] +#meta {"edge": false} +BB2 >BB1 +BB3 >BB2 +[ dihedrals ] +BB2 BB3 >BB1 >BB2 1 180.00000 2 3 {"group": "link-circle", "edge": false} +BB3 >BB1 >BB2 >BB3 9 85.00000 2 2 {"group": "link-circle", "version": "1", "edge": false} +BB3 >BB1 >BB2 >BB3 9 160.00000 2 3 {"group": "link-circle", "version": "2", "edge": false} +[ edges ] +BB3 >BB1 {"linktype": "circle"} diff --git a/polyply/data/martini3/PTMA.martini3.ff b/polyply/data/martini3/PTMA.martini3.ff index 4c313728..aed16b19 100644 --- a/polyply/data/martini3/PTMA.martini3.ff +++ b/polyply/data/martini3/PTMA.martini3.ff @@ -55,6 +55,6 @@ resname "PTMA" EST VNL +VNL 2 70 20 [ citation ] -2022RAlessandri-arXiv +2023RAlessandri-Macromolecules Martini3 polyply diff --git a/polyply/data/martini3/citations.bib b/polyply/data/martini3/citations.bib index 1b0c8061..0cf586ae 100644 --- a/polyply/data/martini3/citations.bib +++ b/polyply/data/martini3/citations.bib @@ -31,14 +31,16 @@ @article{PPEs publisher={The Royal Society of Chemistry}, url={http://dx.doi.org/10.1039/D1CP04237H}, } -@article{2022RAlessandri-arXiv, - title={Predicting Electronic Properties of Radical-Containing Polymers at Coarse-Grained Resolutions}, - author={Alessandri, Riccardo and de Pablo, Juan J.}, - journal={arXiv}, - year={2022}, - eprint={2209.02072}, - primaryClass={cond-mat.soft}, - doi={https://doi.org/10.48550/arXiv.2209.02072}} +@article{2023RAlessandri-Macromolecules, + title={Prediction of Electronic Properties of Radical-Containing Polymers at Coarse-Grained Resolutions}, + author={Alessandri, Riccardo and de Pablo, Juan J}, + journal={Macromolecules}, + volume={56}, + number={10}, + pages={3574-3584}, + doi={10.1021/acs.macromol.3c00141}, + year={2023} +} @article{M3_sugars, title={Martini 3 Coarse-Grained Force Field for Carbohydrates}, author={Fabian, Grünewald and Mats H., Punt and Elizabeth E., Jefferys and Petteri A., Vainikka and Melanie, König and Valtteri, Virtanen and Travis A., Meyer and Weria, Pezeshkian and Adam J., Gormley and Maarit, Karonen and Mark S. P., Sansom and Paulo C. T, Souza and Siewert J., Marrink}, diff --git a/polyply/src/apply_links.py b/polyply/src/apply_links.py index e27aea56..2653d0cf 100644 --- a/polyply/src/apply_links.py +++ b/polyply/src/apply_links.py @@ -489,7 +489,12 @@ def run_molecule(self, meta_molecule): # take care to remove nodes if there are any scheduled for removal # we do this here becuase that's more efficent - molecule.remove_nodes_from(self.nodes_to_remove) + if self.nodes_to_remove: + molecule.remove_nodes_from(self.nodes_to_remove) + # make sure the residue graph is updated; this takes care that + # nodes are also removed from the fragment graphs in the + # meta_molecule.nodes['graph'] attribute + meta_molecule.relabel_and_redo_res_graph(mapping={}) # now we add all interactions but not the ones that contain the removed # nodes for inter_type in self.applied_links: diff --git a/polyply/src/gen_coords.py b/polyply/src/gen_coords.py index ae74915d..b13526fe 100644 --- a/polyply/src/gen_coords.py +++ b/polyply/src/gen_coords.py @@ -239,6 +239,23 @@ def gen_coords(toppath, LOGGER.info("loading grid", type="step") grid = np.loadtxt(grid) + # where to get the box size from + if box is not None and topology.box is not None\ + and not np.array_equal(topology.box, box): + msg = ("A box is provided via the -box command line " + "and the starting coordinates. We consider the " + "the box of starting coordinates as correct. ") + LOGGER.warning(msg, type="warning") + box = topology.box + elif topology.box is not None: + box = topology.box + if density is not None: + msg = ("A density is provided via the command line, " + "but the starting coordinates define a box." + "Will try to pack all molecules in the box " + "provided with starting coordinates.") + LOGGER.warning(msg, type="warning") + # do a sanity check LOGGER.info("checking residue integrity", type="step") check_residue_equivalence(topology) diff --git a/polyply/src/gen_dna.py b/polyply/src/gen_dna.py new file mode 100644 index 00000000..2648b847 --- /dev/null +++ b/polyply/src/gen_dna.py @@ -0,0 +1,106 @@ +# Copyright 2022 University of Groningen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import networkx as nx +from tqdm import tqdm + +BASE_LIBRARY = {"DA": "DT", "DT": "DA", "DG": "DC", "DC": "DG", + "DA5": "DT3", "DT5": "DA3", "DG5": "DC3", "DC5": "DG3", + "DA3": "DT5", "DT3": "DA5", "DG3": "DC5", "DC3": "DG5" + } + +def _dna_edge_iterator(meta_molecule, source): + """ + Traversal method for DNA specifc meta-molecule. + Should become obsolete once vermouth commits to + directed graphs. + """ + first_node = source + count = 0 + while True: + neighbors = meta_molecule.neighbors(source) + src_resid = meta_molecule.nodes[source]["resid"] + for next_node in neighbors: + next_resid = meta_molecule.nodes[next_node]["resid"] + diff = src_resid - next_resid + if diff == 1 : + yield (source, next_node) + source = next_node + break + + if next_resid > src_resid and next_node == first_node: + yield (source, next_node) + return + else: + return + +def complement_dsDNA(meta_molecule): + """ + Given a meta-molecule, which represents the residue graph + of a single strand of dsDNA add the complementray strand + to get a meta-molecule with two disconnected strands. The + update of the meta_molecule is done in place. + + By convention the other strand is generate 5'-> 3' end, + meaning that the last residue of the first strand aligns + with the first residue of the second strand. + + Parameters + ---------- + meta_molecule: :class:`polyply.src.meta_molecule.MetaMolecule` + + Raises + ------ + IOError + when the resname does not match any of the know base-pair + names an error is raised. + """ + last_node = list(meta_molecule.nodes)[-1] + resname = BASE_LIBRARY[meta_molecule.nodes[last_node]["resname"]] + meta_molecule.add_monomer(last_node+1, resname, []) + + correspondance = {last_node: last_node+1} + total = last_node+1 + + pbar = tqdm(total=len(meta_molecule.nodes)) + for prev_node, next_node in _dna_edge_iterator(meta_molecule, source=last_node): + try: + resname = BASE_LIBRARY[meta_molecule.nodes[next_node]["resname"]] + except KeyError: + msg = ("Trying to complete a dsDNA strand. However, resname {resname} with resid {resid} " + "does not match any of the known base-pair resnames. Note that polyply " + "at the moment only allows base-pair completion for molecules that only " + "consist of dsDNA. Please conact the developers if you whish to create a " + "more complicated molecule.") + + resname = meta_molecule.nodes[next_node]["resname"] + resid = meta_molecule.nodes[next_node]["resid"] + raise IOError(msg.format(resname=resname, resid=resid)) + + if next_node not in correspondance: + new_node = total + 1 + meta_molecule.add_monomer(new_node, resname, [(correspondance[prev_node], new_node)]) + correspondance[next_node] = new_node + else: + new_node = correspondance[next_node] + meta_molecule.add_edge(correspondance[prev_node], new_node) + + # make sure that edge attributes are carried over + for attr, value in meta_molecule.edges[(prev_node, next_node)].items(): + meta_molecule.edges[(correspondance[prev_node], new_node)][attr] = value + + total += 1 + pbar.update(1) + pbar.close() + return meta_molecule + diff --git a/polyply/src/gen_itp.py b/polyply/src/gen_itp.py index 2bfc3173..395afeda 100644 --- a/polyply/src/gen_itp.py +++ b/polyply/src/gen_itp.py @@ -33,6 +33,7 @@ from polyply import (MetaMolecule, ApplyLinks, Monomer, MapToMolecule) from polyply.src.graph_utils import find_missing_edges from .load_library import load_ff_library +from .gen_dna import complement_dsDNA LOGGER = StyleAdapter(get_logger(__name__)) @@ -59,7 +60,7 @@ def split_seq_string(sequence): monomers.append(Monomer(resname=resname, n_blocks=n_blocks)) return monomers -def gen_params(name="polymer", outpath=Path("polymer.itp"), inpath=[], lib=None, seq=None, seq_file=None): +def gen_params(name="polymer", outpath=Path("polymer.itp"), inpath=[], lib=None, seq=None, seq_file=None, dsdna=False): """ Top level function for running the polyply parameter generation. Parameters seq and seq_file are mutually exclusive. Set the other @@ -96,6 +97,10 @@ def gen_params(name="polymer", outpath=Path("polymer.itp"), inpath=[], lib=None, LOGGER.info("reading sequence from file", type="step") meta_molecule = MetaMolecule.from_sequence_file(force_field, seq_file, name) + # Generate complementary DNA strand + if dsdna: + complement_dsDNA(meta_molecule) + # Do transformationa and apply link LOGGER.info("mapping sequence to molecule", type="step") meta_molecule = MapToMolecule(force_field).run_molecule(meta_molecule) @@ -103,12 +108,9 @@ def gen_params(name="polymer", outpath=Path("polymer.itp"), inpath=[], lib=None, meta_molecule = ApplyLinks().run_molecule(meta_molecule) # Raise warning if molecule is disconnected - if not nx.is_connected(meta_molecule.molecule): - LOGGER.warning("Your molecule consists of disjoint parts." - "Perhaps links were not applied correctly.") - msg = "Missing link between residue {idxA} {resA} and residue {idxB} {resB}" - for missing in find_missing_edges(meta_molecule, meta_molecule.molecule): - LOGGER.warning(msg, **missing) + msg = "Missing a link between residue {idxA} {resA} and residue {idxB} {resB}." + for missing in find_missing_edges(meta_molecule, meta_molecule.molecule): + LOGGER.warning(msg, **missing) with deferred_open(outpath, 'w') as outfile: header = [ ' '.join(sys.argv) + "\n" ] diff --git a/polyply/src/meta_molecule.py b/polyply/src/meta_molecule.py index 31bbc2e4..5ce58edf 100644 --- a/polyply/src/meta_molecule.py +++ b/polyply/src/meta_molecule.py @@ -104,6 +104,7 @@ def __init__(self, *args, **kwargs): self.__search_tree = None self.root = None self.dfs = False + self.max_resid = 0 # add resids to polyply meta-molecule nodes if they are not # present. All algorithms rely on proper resids @@ -117,6 +118,13 @@ def __init__(self, *args, **kwargs): msg = "Couldn't add 1 to node. Either provide resids or use integers as node keys." raise IOError(msg) + if self.max_resid < self.nodes[node]["resid"]: + self.max_resid = self.nodes[node]["resid"] + + def add_node(self, *args, **kwargs): + self.max_resid += 1 + kwargs["resid"] = self.max_resid + super().add_node(*args, **kwargs) def add_monomer(self, current, resname, connections): """ @@ -125,14 +133,7 @@ def add_monomer(self, current, resname, connections): that matches may only refer to already existing nodes. But connections can be an empty list. """ - resids = nx.get_node_attributes(self, "resid") - - if resids: - resid = max(resids.values()) + 1 - else: - resid = 1 - - self.add_node(current, resname=resname, resid=resid, build=True, backmap=True) + self.add_node(current, resname=resname, build=True, backmap=True) for edge in connections: if self.has_node(edge[0]) and self.has_node(edge[1]): self.add_edge(edge[0], edge[1]) @@ -155,7 +156,7 @@ def relabel_and_redo_res_graph(self, mapping): mapping of node-key to new residue name """ # find the maximum resiude id - max_resid = max(nx.get_node_attributes(self.molecule, "resid").values()) + max_resid = self.max_resid # resname the residues and increase with pseudo-resid for node, resname in mapping.items(): self.molecule.nodes[node]["resname"] = resname diff --git a/polyply/src/simple_seq_parsers.py b/polyply/src/simple_seq_parsers.py index 3ebd29e8..fb4b0968 100644 --- a/polyply/src/simple_seq_parsers.py +++ b/polyply/src/simple_seq_parsers.py @@ -191,7 +191,7 @@ def _identify_residues(comments): if "RNA" in comment: RNA = True - + if "PROTEIN" in comment: AA = True @@ -253,6 +253,9 @@ def parse_ig(filepath): raise FileFormatError(msg) DNA, RNA, AA = _identify_residues(comments) + if set(clean_lines[0]).issubset(set(['A', 'C', 'G', 'T'])): + LOGGER.warning("Found only the letters A, C, G, T on first line. Are you missing the title line in your .ig file?") + seq_graph = _parse_plain(clean_lines[1:], DNA=DNA, RNA=RNA, AA=AA) if ter_char == '2': diff --git a/polyply/src/topology.py b/polyply/src/topology.py index 78e5a030..c0e3d307 100644 --- a/polyply/src/topology.py +++ b/polyply/src/topology.py @@ -46,8 +46,10 @@ def _coord_parser(path, extension): molecule.merge_molecule(new_mol) else: molecule = molecules + + box = molecule.box positions = np.array(list(nx.get_node_attributes(molecule, "position").values())) - return positions + return positions, box def replace_defined_interaction(interaction, defines): @@ -217,6 +219,8 @@ class Topology(System): Volume constants for meta-models bending: dict Sequence dependent bending constants for meta-model + box: np.array(3,1) + Box vectors as a, b, c in nanometers """ def __init__(self, force_field, name=None): @@ -233,6 +237,7 @@ def __init__(self, force_field, name=None): self.distance_restraints = defaultdict(dict) self.volumes = {} self.bending = {} + self.box = None def preprocess(self): """ @@ -430,7 +435,7 @@ def add_positions_from_file(self, path, skip_res=[], resolution='mol'): """ path = Path(path) extension = path.suffix.casefold()[1:] - positions = _coord_parser(path, extension) + positions, self.box = _coord_parser(path, extension) max_coords = len(positions) total = 0 for meta_mol in self.molecules: diff --git a/polyply/tests/test_data/gen_params/output/P3HT_out.itp b/polyply/tests/test_data/gen_params/output/P3HT_out.itp deleted file mode 100644 index d02b73c1..00000000 --- a/polyply/tests/test_data/gen_params/output/P3HT_out.itp +++ /dev/null @@ -1,241 +0,0 @@ -; /coarse/fabian/current-projects/polymer_itp_builder/vermouth_dev/venvv/bin/pytest test_gen_params.py - -; Please cite the following papers: - -[ moleculetype ] -P3HT 1 - -[ atoms ] - 1 SC5 1 P3HT S1 1 0.0 45.0 - 2 SC5 1 P3HT C2 2 0.0 45.0 - 3 SC5 1 P3HT C3 3 0.0 45.0 - 4 VS 1 P3HT V4 4 0.0 0.0 - 5 SC3 1 P3HT C5 5 0.0 45.0 - 6 SC3 1 P3HT C6 6 0.0 45.0 - 7 SC5 2 P3HT S1 7 0.0 45.0 - 8 SC5 2 P3HT C2 8 0.0 45.0 - 9 SC5 2 P3HT C3 9 0.0 45.0 -10 VS 2 P3HT V4 10 0.0 0.0 -11 SC3 2 P3HT C5 11 0.0 45.0 -12 SC3 2 P3HT C6 12 0.0 45.0 -13 SC5 3 P3HT S1 13 0.0 45.0 -14 SC5 3 P3HT C2 14 0.0 45.0 -15 SC5 3 P3HT C3 15 0.0 45.0 -16 VS 3 P3HT V4 16 0.0 0.0 -17 SC3 3 P3HT C5 17 0.0 45.0 -18 SC3 3 P3HT C6 18 0.0 45.0 -19 SC5 4 P3HT S1 19 0.0 45.0 -20 SC5 4 P3HT C2 20 0.0 45.0 -21 SC5 4 P3HT C3 21 0.0 45.0 -22 VS 4 P3HT V4 22 0.0 0.0 -23 SC3 4 P3HT C5 23 0.0 45.0 -24 SC3 4 P3HT C6 24 0.0 45.0 -25 SC5 5 P3HT S1 25 0.0 45.0 -26 SC5 5 P3HT C2 26 0.0 45.0 -27 SC5 5 P3HT C3 27 0.0 45.0 -28 VS 5 P3HT V4 28 0.0 0.0 -29 SC3 5 P3HT C5 29 0.0 45.0 -30 SC3 5 P3HT C6 30 0.0 45.0 -31 SC5 6 P3HT S1 31 0.0 45.0 -32 SC5 6 P3HT C2 32 0.0 45.0 -33 SC5 6 P3HT C3 33 0.0 45.0 -34 VS 6 P3HT V4 34 0.0 0.0 -35 SC3 6 P3HT C5 35 0.0 45.0 -36 SC3 6 P3HT C6 36 0.0 45.0 -37 SC5 7 P3HT S1 37 0.0 45.0 -38 SC5 7 P3HT C2 38 0.0 45.0 -39 SC5 7 P3HT C3 39 0.0 45.0 -40 VS 7 P3HT V4 40 0.0 0.0 -41 SC3 7 P3HT C5 41 0.0 45.0 -42 SC3 7 P3HT C6 42 0.0 45.0 -43 SC5 8 P3HT S1 43 0.0 45.0 -44 SC5 8 P3HT C2 44 0.0 45.0 -45 SC5 8 P3HT C3 45 0.0 45.0 -46 VS 8 P3HT V4 46 0.0 0.0 -47 SC3 8 P3HT C5 47 0.0 45.0 -48 SC3 8 P3HT C6 48 0.0 45.0 -49 SC5 9 P3HT S1 49 0.0 45.0 -50 SC5 9 P3HT C2 50 0.0 45.0 -51 SC5 9 P3HT C3 51 0.0 45.0 -52 VS 9 P3HT V4 52 0.0 0.0 -53 SC3 9 P3HT C5 53 0.0 45.0 -54 SC3 9 P3HT C6 54 0.0 45.0 -55 SC5 10 P3HT S1 55 0.0 45.0 -56 SC5 10 P3HT C2 56 0.0 45.0 -57 SC5 10 P3HT C3 57 0.0 45.0 -58 VS 10 P3HT V4 58 0.0 0.0 -59 SC3 10 P3HT C5 59 0.0 45.0 -60 SC3 10 P3HT C6 60 0.0 45.0 - -[ bonds ] - 5 6 1 0.360 5000 -11 12 1 0.360 5000 -17 18 1 0.360 5000 -23 24 1 0.360 5000 -29 30 1 0.360 5000 -35 36 1 0.360 5000 -41 42 1 0.360 5000 -47 48 1 0.360 5000 -53 54 1 0.360 5000 -59 60 1 0.360 5000 - 4 10 1 0.380 50000 -10 16 1 0.380 50000 -16 22 1 0.380 50000 -22 28 1 0.380 50000 -28 34 1 0.380 50000 -34 40 1 0.380 50000 -40 46 1 0.380 50000 -46 52 1 0.380 50000 -52 58 1 0.380 50000 - -[ constraints ] - 1 2 1 0.240 - 1 3 1 0.240 - 2 3 1 0.240 - 3 5 1 0.285 - 7 8 1 0.240 - 7 9 1 0.240 - 8 9 1 0.240 - 9 11 1 0.285 -13 14 1 0.240 -13 15 1 0.240 -14 15 1 0.240 -15 17 1 0.285 -19 20 1 0.240 -19 21 1 0.240 -20 21 1 0.240 -21 23 1 0.285 -25 26 1 0.240 -25 27 1 0.240 -26 27 1 0.240 -27 29 1 0.285 -31 32 1 0.240 -31 33 1 0.240 -32 33 1 0.240 -33 35 1 0.285 -37 38 1 0.240 -37 39 1 0.240 -38 39 1 0.240 -39 41 1 0.285 -43 44 1 0.240 -43 45 1 0.240 -44 45 1 0.240 -45 47 1 0.285 -49 50 1 0.240 -49 51 1 0.240 -50 51 1 0.240 -51 53 1 0.285 -55 56 1 0.240 -55 57 1 0.240 -56 57 1 0.240 -57 59 1 0.285 - -[ angles ] - 1 3 5 2 180 250 - 3 5 6 1 155 25 - 7 9 11 2 180 250 - 9 11 12 1 155 25 -13 15 17 2 180 250 -15 17 18 1 155 25 -19 21 23 2 180 250 -21 23 24 1 155 25 -25 27 29 2 180 250 -27 29 30 1 155 25 -31 33 35 2 180 250 -33 35 36 1 155 25 -37 39 41 2 180 250 -39 41 42 1 155 25 -43 45 47 2 180 250 -45 47 48 1 155 25 -49 51 53 2 180 250 -51 53 54 1 155 25 -55 57 59 2 180 250 -57 59 60 1 155 25 - 2 3 10 1 160 180 - 8 9 16 1 160 180 -14 15 22 1 160 180 -20 21 28 1 160 180 -26 27 34 1 160 180 -32 33 40 1 160 180 -38 39 46 1 160 180 -44 45 52 1 160 180 -50 51 58 1 160 180 - 4 8 9 1 160 180 -10 14 15 1 160 180 -16 20 21 1 160 180 -22 26 27 1 160 180 -28 32 33 1 160 180 -34 38 39 1 160 180 -40 44 45 1 160 180 -46 50 51 1 160 180 -52 56 57 1 160 180 - 4 10 16 1 158 180 -10 16 22 1 158 180 -16 22 28 1 158 180 -22 28 34 1 158 180 -28 34 40 1 158 180 -34 40 46 1 158 180 -40 46 52 1 158 180 -46 52 58 1 158 180 - -[ dihedrals ] - 1 4 10 7 9 0.0 1.8 1 - 1 4 10 7 9 0.0 -9.5 2 - 7 10 16 13 9 0.0 1.8 1 - 7 10 16 13 9 0.0 -9.5 2 -13 16 22 19 9 0.0 1.8 1 -13 16 22 19 9 0.0 -9.5 2 -19 22 28 25 9 0.0 1.8 1 -19 22 28 25 9 0.0 -9.5 2 -25 28 34 31 9 0.0 1.8 1 -25 28 34 31 9 0.0 -9.5 2 -31 34 40 37 9 0.0 1.8 1 -31 34 40 37 9 0.0 -9.5 2 -37 40 46 43 9 0.0 1.8 1 -37 40 46 43 9 0.0 -9.5 2 -43 46 52 49 9 0.0 1.8 1 -43 46 52 49 9 0.0 -9.5 2 -49 52 58 55 9 0.0 1.8 1 -49 52 58 55 9 0.0 -9.5 2 - -[ exclusions ] - 1 7 8 9 - 7 13 14 15 -13 19 20 21 -19 25 26 27 -25 31 32 33 -31 37 38 39 -37 43 44 45 -43 49 50 51 -49 55 56 57 - 2 7 8 9 - 8 13 14 15 -14 19 20 21 -20 25 26 27 -26 31 32 33 -32 37 38 39 -38 43 44 45 -44 49 50 51 -50 55 56 57 - 3 7 8 9 - 9 13 14 15 -15 19 20 21 -21 25 26 27 -27 31 32 33 -33 37 38 39 -39 43 44 45 -45 49 50 51 -51 55 56 57 - -[ virtual_sitesn ] - 4 2 1 2 3 -10 2 7 8 9 -16 2 13 14 15 -22 2 19 20 21 -28 2 25 26 27 -34 2 31 32 33 -40 2 37 38 39 -46 2 43 44 45 -52 2 49 50 51 -58 2 55 56 57 - diff --git a/polyply/tests/test_data/gen_params/output/PEO_out.itp b/polyply/tests/test_data/gen_params/output/PEO_out.itp deleted file mode 100644 index 9ff56220..00000000 --- a/polyply/tests/test_data/gen_params/output/PEO_out.itp +++ /dev/null @@ -1,78 +0,0 @@ -; /coarse/fabian/current-projects/polymer_itp_builder/vermouth_dev/venvv/bin/pytest test_gen_params.py - -; Please cite the following papers: - -[ moleculetype ] -PEO 1 - -[ atoms ] - 1 SN1a 1 PEO EO 1 0.0 45.0 - 2 SN1a 2 PEO EO 2 0.0 45.0 - 3 SN1a 3 PEO EO 3 0.0 45.0 - 4 SN1a 4 PEO EO 4 0.0 45.0 - 5 SN1a 5 PEO EO 5 0.0 45.0 - 6 SN1a 6 PEO EO 6 0.0 45.0 - 7 SN1a 7 PEO EO 7 0.0 45.0 - 8 SN1a 8 PEO EO 8 0.0 45.0 - 9 SN1a 9 PEO EO 9 0.0 45.0 -10 SN1a 10 PEO EO 10 0.0 45.0 - -[ bonds ] - 1 2 1 0.37 7000 - 2 3 1 0.37 7000 - 3 4 1 0.37 7000 - 4 5 1 0.37 7000 - 5 6 1 0.37 7000 - 6 7 1 0.37 7000 - 7 8 1 0.37 7000 - 8 9 1 0.37 7000 - 9 10 1 0.37 7000 - -[ angles ] - 1 2 3 2 135.00 50 - 1 2 3 10 135.00 75 - 2 3 4 2 135.00 50 - 2 3 4 10 135.00 75 - 3 4 5 2 135.00 50 - 3 4 5 10 135.00 75 - 4 5 6 2 135.00 50 - 4 5 6 10 135.00 75 - 5 6 7 2 135.00 50 - 5 6 7 10 135.00 75 - 6 7 8 2 135.00 50 - 6 7 8 10 135.00 75 - 7 8 9 2 135.00 50 - 7 8 9 10 135.00 75 - 8 9 10 2 135.00 50 - 8 9 10 10 135.00 75 - -[ dihedrals ] - 1 2 3 4 1 180.00 1.96 1 - 1 2 3 4 1 0 0.18 2 - 1 2 3 4 1 0 0.33 3 - 1 2 3 4 1 0 0.12 4 - 2 3 4 5 1 180.00 1.96 1 - 2 3 4 5 1 0 0.18 2 - 2 3 4 5 1 0 0.33 3 - 2 3 4 5 1 0 0.12 4 - 3 4 5 6 1 180.00 1.96 1 - 3 4 5 6 1 0 0.18 2 - 3 4 5 6 1 0 0.33 3 - 3 4 5 6 1 0 0.12 4 - 4 5 6 7 1 180.00 1.96 1 - 4 5 6 7 1 0 0.18 2 - 4 5 6 7 1 0 0.33 3 - 4 5 6 7 1 0 0.12 4 - 5 6 7 8 1 180.00 1.96 1 - 5 6 7 8 1 0 0.18 2 - 5 6 7 8 1 0 0.33 3 - 5 6 7 8 1 0 0.12 4 - 6 7 8 9 1 180.00 1.96 1 - 6 7 8 9 1 0 0.18 2 - 6 7 8 9 1 0 0.33 3 - 6 7 8 9 1 0 0.12 4 - 7 8 9 10 1 180.00 1.96 1 - 7 8 9 10 1 0 0.18 2 - 7 8 9 10 1 0 0.33 3 - 7 8 9 10 1 0 0.12 4 - diff --git a/polyply/tests/test_data/gen_params/output/PPI_out.itp b/polyply/tests/test_data/gen_params/output/PPI_out.itp deleted file mode 100644 index 68d0a041..00000000 --- a/polyply/tests/test_data/gen_params/output/PPI_out.itp +++ /dev/null @@ -1,41 +0,0 @@ -; /coarse/fabian/current-projects/polymer_itp_builder/vermouth_dev/venvv/bin/pytest test_gen_params.py - -; Please cite the following papers: - -[ moleculetype ] -PPI 1 - -[ atoms ] - 1 N1 1 N1 BB 1 0.0 - 2 N1 2 N1 BB 2 0.0 - 3 N2 3 N2 BB 3 0.0 - 4 N2 4 N2 BB 4 0.0 - 5 N2 5 N2 BB 5 0.0 - 6 N2 6 N2 BB 6 0.0 - 7 N3 7 N3 BB 7 0.0 - 8 N3 8 N3 BB 8 0.0 - 9 N3 9 N3 BB 9 0.0 -10 N3 10 N3 BB 10 0.0 -11 N3 11 N3 BB 11 0.0 -12 N3 12 N3 BB 12 0.0 -13 N3 13 N3 BB 13 0.0 -14 N3 14 N3 BB 14 0.0 - -[ bonds ] -; inner - 2 5 1 0.350 1250 - 1 2 1 0.350 1250 - 1 3 1 0.350 1250 - 1 4 1 0.350 1250 - 2 6 1 0.350 1250 - -; outer - 3 7 1 0.250 1250 - 3 8 1 0.250 1250 - 4 9 1 0.250 1250 - 4 10 1 0.250 1250 - 5 11 1 0.250 1250 - 5 12 1 0.250 1250 - 6 13 1 0.250 1250 - 6 14 1 0.250 1250 - diff --git a/polyply/tests/test_data/gen_params/output/PS_out.itp b/polyply/tests/test_data/gen_params/output/PS_out.itp deleted file mode 100644 index b7701178..00000000 --- a/polyply/tests/test_data/gen_params/output/PS_out.itp +++ /dev/null @@ -1,320 +0,0 @@ -; /coarse/fabian/current-projects/polymer_itp_builder/vermouth_dev/venvv/bin/pytest test_gen_params.py - -; Please cite the following papers: - -[ moleculetype ] -PS 1 - -[ atoms ] - 1 STY 1 PS R1 1 0.0 45.0 - 2 STY 1 PS R2 2 0.0 45.0 - 3 STY 1 PS R3 3 0.0 45.0 - 4 SCY 1 PS B 4 0.0 45.0 - 5 STY 2 PS R1 5 0.0 45.0 - 6 STY 2 PS R2 6 0.0 45.0 - 7 STY 2 PS R3 7 0.0 45.0 - 8 SCY 2 PS B 8 0.0 45.0 - 9 STY 3 PS R1 9 0.0 45.0 -10 STY 3 PS R2 10 0.0 45.0 -11 STY 3 PS R3 11 0.0 45.0 -12 SCY 3 PS B 12 0.0 45.0 -13 STY 4 PS R1 13 0.0 45.0 -14 STY 4 PS R2 14 0.0 45.0 -15 STY 4 PS R3 15 0.0 45.0 -16 SCY 4 PS B 16 0.0 45.0 -17 STY 5 PS R1 17 0.0 45.0 -18 STY 5 PS R2 18 0.0 45.0 -19 STY 5 PS R3 19 0.0 45.0 -20 SCY 5 PS B 20 0.0 45.0 -21 STY 6 PS R1 21 0.0 45.0 -22 STY 6 PS R2 22 0.0 45.0 -23 STY 6 PS R3 23 0.0 45.0 -24 SCY 6 PS B 24 0.0 45.0 -25 STY 7 PS R1 25 0.0 45.0 -26 STY 7 PS R2 26 0.0 45.0 -27 STY 7 PS R3 27 0.0 45.0 -28 SCY 7 PS B 28 0.0 45.0 -29 STY 8 PS R1 29 0.0 45.0 -30 STY 8 PS R2 30 0.0 45.0 -31 STY 8 PS R3 31 0.0 45.0 -32 SCY 8 PS B 32 0.0 45.0 -33 STY 9 PS R1 33 0.0 45.0 -34 STY 9 PS R2 34 0.0 45.0 -35 STY 9 PS R3 35 0.0 45.0 -36 SCY 9 PS B 36 0.0 45.0 -37 STY 10 PS R1 37 0.0 45.0 -38 STY 10 PS R2 38 0.0 45.0 -39 STY 10 PS R3 39 0.0 45.0 -40 SCY 10 PS B 40 0.0 45.0 - -[ bonds ] - 1 4 1 0.270000 8000.000000 - 5 8 1 0.270000 8000.000000 - 9 12 1 0.270000 8000.000000 -13 16 1 0.270000 8000.000000 -17 20 1 0.270000 8000.000000 -21 24 1 0.270000 8000.000000 -25 28 1 0.270000 8000.000000 -29 32 1 0.270000 8000.000000 -33 36 1 0.270000 8000.000000 -37 40 1 0.270000 8000.000000 - 4 5 1 0.270000 8000.000000 - 8 9 1 0.270000 8000.000000 -12 13 1 0.270000 8000.000000 -16 17 1 0.270000 8000.000000 -20 21 1 0.270000 8000.000000 -24 25 1 0.270000 8000.000000 -28 29 1 0.270000 8000.000000 -32 33 1 0.270000 8000.000000 -36 37 1 0.270000 8000.000000 - -[ constraints ] - 2 3 1 0.270000 - 3 1 1 0.270000 - 1 2 1 0.270000 - 6 7 1 0.270000 - 7 5 1 0.270000 - 5 6 1 0.270000 -10 11 1 0.270000 -11 9 1 0.270000 - 9 10 1 0.270000 -14 15 1 0.270000 -15 13 1 0.270000 -13 14 1 0.270000 -18 19 1 0.270000 -19 17 1 0.270000 -17 18 1 0.270000 -22 23 1 0.270000 -23 21 1 0.270000 -21 22 1 0.270000 -26 27 1 0.270000 -27 25 1 0.270000 -25 26 1 0.270000 -30 31 1 0.270000 -31 29 1 0.270000 -29 30 1 0.270000 -34 35 1 0.270000 -35 33 1 0.270000 -33 34 1 0.270000 -38 39 1 0.270000 -39 37 1 0.270000 -37 38 1 0.270000 - -[ exclusions ] - 1 2 - 1 3 - 1 4 - 2 3 - 2 4 - 3 4 - 5 6 - 5 7 - 5 8 - 6 7 - 6 8 - 7 8 - 9 10 - 9 11 - 9 12 -10 11 -10 12 -11 12 -13 14 -13 15 -13 16 -14 15 -14 16 -15 16 -17 18 -17 19 -17 20 -18 19 -18 20 -19 20 -21 22 -21 23 -21 24 -22 23 -22 24 -23 24 -25 26 -25 27 -25 28 -26 27 -26 28 -27 28 -29 30 -29 31 -29 32 -30 31 -30 32 -31 32 -33 34 -33 35 -33 36 -34 35 -34 36 -35 36 -37 38 -37 39 -37 40 -38 39 -38 40 -39 40 - 1 5 - 5 9 - 9 13 -13 17 -17 21 -21 25 -25 29 -29 33 -33 37 - 1 6 - 5 10 - 9 14 -13 18 -17 22 -21 26 -25 30 -29 34 -33 38 - 1 7 - 5 11 - 9 15 -13 19 -17 23 -21 27 -25 31 -29 35 -33 39 - 1 8 - 5 12 - 9 16 -13 20 -17 24 -21 28 -25 32 -29 36 -33 40 - 2 5 - 6 9 -10 13 -14 17 -18 21 -22 25 -26 29 -30 33 -34 37 - 3 5 - 7 9 -11 13 -15 17 -19 21 -23 25 -27 29 -31 33 -35 37 - 4 5 - 8 9 -12 13 -16 17 -20 21 -24 25 -28 29 -32 33 -36 37 - 4 6 - 8 10 -12 14 -16 18 -20 22 -24 26 -28 30 -32 34 -36 38 - 4 7 - 8 11 -12 15 -16 19 -20 23 -24 27 -28 31 -32 35 -36 39 - 4 8 - 8 12 -12 16 -16 20 -20 24 -24 28 -28 32 -32 36 -36 40 - 4 9 - 8 13 -12 17 -16 21 -20 25 -24 29 -28 33 -32 37 - -[ angles ] - 4 1 2 1 136.000000 100.000000 - 4 1 3 1 136.000000 100.000000 - 8 5 6 1 136.000000 100.000000 - 8 5 7 1 136.000000 100.000000 -12 9 10 1 136.000000 100.000000 -12 9 11 1 136.000000 100.000000 -16 13 14 1 136.000000 100.000000 -16 13 15 1 136.000000 100.000000 -20 17 18 1 136.000000 100.000000 -20 17 19 1 136.000000 100.000000 -24 21 22 1 136.000000 100.000000 -24 21 23 1 136.000000 100.000000 -28 25 26 1 136.000000 100.000000 -28 25 27 1 136.000000 100.000000 -32 29 30 1 136.000000 100.000000 -32 29 31 1 136.000000 100.000000 -36 33 34 1 136.000000 100.000000 -36 33 35 1 136.000000 100.000000 -40 37 38 1 136.000000 100.000000 -40 37 39 1 136.000000 100.000000 - 4 5 6 1 136.000000 100.000000 - 8 9 10 1 136.000000 100.000000 -12 13 14 1 136.000000 100.000000 -16 17 18 1 136.000000 100.000000 -20 21 22 1 136.000000 100.000000 -24 25 26 1 136.000000 100.000000 -28 29 30 1 136.000000 100.000000 -32 33 34 1 136.000000 100.000000 -36 37 38 1 136.000000 100.000000 - 4 5 7 1 136.000000 100.000000 - 8 9 11 1 136.000000 100.000000 -12 13 15 1 136.000000 100.000000 -16 17 19 1 136.000000 100.000000 -20 21 23 1 136.000000 100.000000 -24 25 27 1 136.000000 100.000000 -28 29 31 1 136.000000 100.000000 -32 33 35 1 136.000000 100.000000 -36 37 39 1 136.000000 100.000000 - 1 4 5 1 120.000000 25.000000 - 5 8 9 1 120.000000 25.000000 - 9 12 13 1 120.000000 25.000000 -13 16 17 1 120.000000 25.000000 -17 20 21 1 120.000000 25.000000 -21 24 25 1 120.000000 25.000000 -25 28 29 1 120.000000 25.000000 -29 32 33 1 120.000000 25.000000 -33 36 37 1 120.000000 25.000000 - 4 5 8 1 52.000000 550.000000 - 8 9 12 1 52.000000 550.000000 -12 13 16 1 52.000000 550.000000 -16 17 20 1 52.000000 550.000000 -20 21 24 1 52.000000 550.000000 -24 25 28 1 52.000000 550.000000 -28 29 32 1 52.000000 550.000000 -32 33 36 1 52.000000 550.000000 -36 37 40 1 52.000000 550.000000 - diff --git a/polyply/tests/test_data/gen_params/output/removal.itp b/polyply/tests/test_data/gen_params/output/removal.itp deleted file mode 100644 index 69c2c5fd..00000000 --- a/polyply/tests/test_data/gen_params/output/removal.itp +++ /dev/null @@ -1,20 +0,0 @@ -; /Users/fabian/ProgramDev/dev_env/bin/pytest test_gen_params.py - -; Please cite the following papers: - -[ moleculetype ] -test 1 - -[ atoms ] -1 SN1a 1 PEO EO 1 0.0 45.0 -2 SN2a 1 PEO EP 1 0.0 45.0 -3 SN1a 2 PEO EO 2 0.0 45.0 -4 SN2a 2 PEO EP 2 0.0 45.0 -5 SN1a 3 PEO EO 3 0.0 45.0 - -[ bonds ] -1 2 1 0.44 7000 -3 4 1 0.44 7000 -2 3 1 0.37 7000 -4 5 1 0.37 7000 - diff --git a/polyply/tests/test_data/gen_params/output/test_edge_attr_out.itp b/polyply/tests/test_data/gen_params/output/test_edge_attr_out.itp deleted file mode 100644 index 61ba8ac8..00000000 --- a/polyply/tests/test_data/gen_params/output/test_edge_attr_out.itp +++ /dev/null @@ -1,64 +0,0 @@ -; /coarse/fabian/current-projects/polymer_itp_builder/vermouth_dev/venvv/bin/pytest test_gen_params.py - -; Please cite the following papers: - -[ moleculetype ] -test 3 - -[ atoms ] - 1 SP3 1 GLC A 1 0.0 - 2 SP3 1 GLC B 2 0.0 - 3 SP1 1 GLC C 3 0.0 - 4 TP3 2 GLC A 4 0.0 - 5 SP2 2 GLC B 5 0.0 - 6 SP1 2 GLC C 6 0.0 - 7 TP3 3 GLC A 7 0.0 - 8 SP3 3 GLC B 8 0.0 - 9 SP2 3 GLC C 9 0.0 -10 TP3 4 GLC A 10 0.0 -11 SP3 4 GLC B 11 0.0 -12 SP1 4 GLC C 12 0.0 -13 TP3 5 GLC A 13 0.0 -14 SP2 5 GLC B 14 0.0 -15 SP1 5 GLC C 15 0.0 -16 TP3 6 GLC A 16 0.0 -17 SP3 6 GLC B 17 0.0 -18 SP2 6 GLC C 18 0.0 -19 TP3 7 GLC A 19 0.0 -20 SP3 7 GLC B 20 0.0 -21 SP2 7 GLC C 21 0.0 - -[ bonds ] -; a13 - 5 7 1 0.32 5500 -14 19 1 0.32 5500 - -; a16 - 3 4 1 0.37 6500 - 6 10 1 0.37 6500 -12 13 1 0.37 6500 -15 16 1 0.37 6500 - -[ constraints ] - 1 2 1 0.336 - 1 3 1 0.311 - 2 3 1 0.405 - 4 5 1 0.336 - 4 6 1 0.311 - 5 6 1 0.405 - 7 8 1 0.336 - 7 9 1 0.311 - 8 9 1 0.405 -10 11 1 0.336 -10 12 1 0.311 -11 12 1 0.405 -13 14 1 0.336 -13 15 1 0.311 -14 15 1 0.405 -16 17 1 0.336 -16 18 1 0.311 -17 18 1 0.405 -19 20 1 0.336 -19 21 1 0.311 -20 21 1 0.405 - diff --git a/polyply/tests/test_data/gen_params/output/test_out.itp b/polyply/tests/test_data/gen_params/output/test_out.itp deleted file mode 100644 index 46b33e94..00000000 --- a/polyply/tests/test_data/gen_params/output/test_out.itp +++ /dev/null @@ -1,23 +0,0 @@ -; /coarse/fabian/current-projects/polymer_itp_builder/vermouth_dev/venvv/bin/pytest test_gen_params.py - -; Please cite the following papers: - -[ moleculetype ] -test 1 - -[ atoms ] -1 N1 1 N1 BB 1 0.0 -2 N2 2 N2 BB 2 0.0 -3 N1 3 N1 BB 3 0.0 -4 N2 4 N2 BB 4 0.0 -5 N3 5 N3 BB 5 0.0 - -[ bonds ] -; inner -1 2 1 0.350 1250 -2 3 1 0.350 1250 -3 4 1 0.350 1250 - -; outer -4 5 1 0.250 1250 - diff --git a/polyply/tests/test_data/library_tests/ibi_cgm3/PTMA/polyply/PTMA.itp b/polyply/tests/test_data/library_tests/ibi_cgm3/PTMA/polyply/PTMA.itp new file mode 100644 index 00000000..1e31b986 --- /dev/null +++ b/polyply/tests/test_data/library_tests/ibi_cgm3/PTMA/polyply/PTMA.itp @@ -0,0 +1,316 @@ +; /Users/alessandri/miniconda3/envs/polyplyRA/bin/polyply gen_params -lib ibi_cgm3 -seq PTMA:10 -o PTMA.itp -name PTMA + +; Please cite the following papers: +; Alessandri, R; de Pablo, J J; Macromolecules 2023; 10.1021/acs.macromol.3c00141 +; Grunewald, F; Alessandri, R; Kroon, P C; Monticelli, L; Souza, P C; Marrink, S J; Nature Communications 2022; 10.1038/s41467-021-27627-4 + +[ moleculetype ] +PTMA 2 + +[ atoms ] + 1 VNL 1 PTMA VNL 1 0.0 54.0 + 2 EST 1 PTMA EST 2 0.0 54.0 + 3 C1 1 PTMA C1 3 0.0 54.0 + 4 C2 1 PTMA C2 4 0.0 54.0 + 5 C2 1 PTMA C3 5 0.0 54.0 + 6 N4 1 PTMA N4 6 0.0 36.0 + 7 VNL 2 PTMA VNL 7 0.0 54.0 + 8 EST 2 PTMA EST 8 0.0 54.0 + 9 C1 2 PTMA C1 9 0.0 54.0 +10 C2 2 PTMA C2 10 0.0 54.0 +11 C2 2 PTMA C3 11 0.0 54.0 +12 N4 2 PTMA N4 12 0.0 36.0 +13 VNL 3 PTMA VNL 13 0.0 54.0 +14 EST 3 PTMA EST 14 0.0 54.0 +15 C1 3 PTMA C1 15 0.0 54.0 +16 C2 3 PTMA C2 16 0.0 54.0 +17 C2 3 PTMA C3 17 0.0 54.0 +18 N4 3 PTMA N4 18 0.0 36.0 +19 VNL 4 PTMA VNL 19 0.0 54.0 +20 EST 4 PTMA EST 20 0.0 54.0 +21 C1 4 PTMA C1 21 0.0 54.0 +22 C2 4 PTMA C2 22 0.0 54.0 +23 C2 4 PTMA C3 23 0.0 54.0 +24 N4 4 PTMA N4 24 0.0 36.0 +25 VNL 5 PTMA VNL 25 0.0 54.0 +26 EST 5 PTMA EST 26 0.0 54.0 +27 C1 5 PTMA C1 27 0.0 54.0 +28 C2 5 PTMA C2 28 0.0 54.0 +29 C2 5 PTMA C3 29 0.0 54.0 +30 N4 5 PTMA N4 30 0.0 36.0 +31 VNL 6 PTMA VNL 31 0.0 54.0 +32 EST 6 PTMA EST 32 0.0 54.0 +33 C1 6 PTMA C1 33 0.0 54.0 +34 C2 6 PTMA C2 34 0.0 54.0 +35 C2 6 PTMA C3 35 0.0 54.0 +36 N4 6 PTMA N4 36 0.0 36.0 +37 VNL 7 PTMA VNL 37 0.0 54.0 +38 EST 7 PTMA EST 38 0.0 54.0 +39 C1 7 PTMA C1 39 0.0 54.0 +40 C2 7 PTMA C2 40 0.0 54.0 +41 C2 7 PTMA C3 41 0.0 54.0 +42 N4 7 PTMA N4 42 0.0 36.0 +43 VNL 8 PTMA VNL 43 0.0 54.0 +44 EST 8 PTMA EST 44 0.0 54.0 +45 C1 8 PTMA C1 45 0.0 54.0 +46 C2 8 PTMA C2 46 0.0 54.0 +47 C2 8 PTMA C3 47 0.0 54.0 +48 N4 8 PTMA N4 48 0.0 36.0 +49 VNL 9 PTMA VNL 49 0.0 54.0 +50 EST 9 PTMA EST 50 0.0 54.0 +51 C1 9 PTMA C1 51 0.0 54.0 +52 C2 9 PTMA C2 52 0.0 54.0 +53 C2 9 PTMA C3 53 0.0 54.0 +54 N4 9 PTMA N4 54 0.0 36.0 +55 VNL 10 PTMA VNL 55 0.0 54.0 +56 EST 10 PTMA EST 56 0.0 54.0 +57 C1 10 PTMA C1 57 0.0 54.0 +58 C2 10 PTMA C2 58 0.0 54.0 +59 C2 10 PTMA C3 59 0.0 54.0 +60 N4 10 PTMA N4 60 0.0 36.0 + +[ bonds ] + 1 2 1 0.262 15000 ; M3 PMMA model [10.1038/s41467-021-27627-4] shortened + 2 3 1 0.253 15000 ; PMMA-TEMPO connection + 3 4 1 0.326 25000 ; cog (TEMPO) + 3 5 1 0.326 25000 ; cog (TEMPO) + 7 8 1 0.262 15000 ; M3 PMMA model [10.1038/s41467-021-27627-4] shortened + 8 9 1 0.253 15000 ; PMMA-TEMPO connection + 9 10 1 0.326 25000 ; cog (TEMPO) + 9 11 1 0.326 25000 ; cog (TEMPO) +13 14 1 0.262 15000 ; M3 PMMA model [10.1038/s41467-021-27627-4] shortened +14 15 1 0.253 15000 ; PMMA-TEMPO connection +15 16 1 0.326 25000 ; cog (TEMPO) +15 17 1 0.326 25000 ; cog (TEMPO) +19 20 1 0.262 15000 ; M3 PMMA model [10.1038/s41467-021-27627-4] shortened +20 21 1 0.253 15000 ; PMMA-TEMPO connection +21 22 1 0.326 25000 ; cog (TEMPO) +21 23 1 0.326 25000 ; cog (TEMPO) +25 26 1 0.262 15000 ; M3 PMMA model [10.1038/s41467-021-27627-4] shortened +26 27 1 0.253 15000 ; PMMA-TEMPO connection +27 28 1 0.326 25000 ; cog (TEMPO) +27 29 1 0.326 25000 ; cog (TEMPO) +31 32 1 0.262 15000 ; M3 PMMA model [10.1038/s41467-021-27627-4] shortened +32 33 1 0.253 15000 ; PMMA-TEMPO connection +33 34 1 0.326 25000 ; cog (TEMPO) +33 35 1 0.326 25000 ; cog (TEMPO) +37 38 1 0.262 15000 ; M3 PMMA model [10.1038/s41467-021-27627-4] shortened +38 39 1 0.253 15000 ; PMMA-TEMPO connection +39 40 1 0.326 25000 ; cog (TEMPO) +39 41 1 0.326 25000 ; cog (TEMPO) +43 44 1 0.262 15000 ; M3 PMMA model [10.1038/s41467-021-27627-4] shortened +44 45 1 0.253 15000 ; PMMA-TEMPO connection +45 46 1 0.326 25000 ; cog (TEMPO) +45 47 1 0.326 25000 ; cog (TEMPO) +49 50 1 0.262 15000 ; M3 PMMA model [10.1038/s41467-021-27627-4] shortened +50 51 1 0.253 15000 ; PMMA-TEMPO connection +51 52 1 0.326 25000 ; cog (TEMPO) +51 53 1 0.326 25000 ; cog (TEMPO) +55 56 1 0.262 15000 ; M3 PMMA model [10.1038/s41467-021-27627-4] shortened +56 57 1 0.253 15000 ; PMMA-TEMPO connection +57 58 1 0.326 25000 ; cog (TEMPO) +57 59 1 0.326 25000 ; cog (TEMPO) + +; vinyl backbone + 1 7 1 0.315 4000 + 7 13 1 0.315 4000 +13 19 1 0.315 4000 +19 25 1 0.315 4000 +25 31 1 0.315 4000 +31 37 1 0.315 4000 +37 43 1 0.315 4000 +43 49 1 0.315 4000 +49 55 1 0.315 4000 + +#ifdef FLEXIBLE + 3 6 1 0.310 100000 ; cog (TEMPO) + 4 6 1 0.238 100000 ; cog (TEMPO) + 5 6 1 0.238 100000 ; cog (TEMPO) + 9 12 1 0.310 100000 ; cog (TEMPO) +10 12 1 0.238 100000 ; cog (TEMPO) +11 12 1 0.238 100000 ; cog (TEMPO) +15 18 1 0.310 100000 ; cog (TEMPO) +16 18 1 0.238 100000 ; cog (TEMPO) +17 18 1 0.238 100000 ; cog (TEMPO) +21 24 1 0.310 100000 ; cog (TEMPO) +22 24 1 0.238 100000 ; cog (TEMPO) +23 24 1 0.238 100000 ; cog (TEMPO) +27 30 1 0.310 100000 ; cog (TEMPO) +28 30 1 0.238 100000 ; cog (TEMPO) +29 30 1 0.238 100000 ; cog (TEMPO) +33 36 1 0.310 100000 ; cog (TEMPO) +34 36 1 0.238 100000 ; cog (TEMPO) +35 36 1 0.238 100000 ; cog (TEMPO) +39 42 1 0.310 100000 ; cog (TEMPO) +40 42 1 0.238 100000 ; cog (TEMPO) +41 42 1 0.238 100000 ; cog (TEMPO) +45 48 1 0.310 100000 ; cog (TEMPO) +46 48 1 0.238 100000 ; cog (TEMPO) +47 48 1 0.238 100000 ; cog (TEMPO) +51 54 1 0.310 100000 ; cog (TEMPO) +52 54 1 0.238 100000 ; cog (TEMPO) +53 54 1 0.238 100000 ; cog (TEMPO) +57 60 1 0.310 100000 ; cog (TEMPO) +58 60 1 0.238 100000 ; cog (TEMPO) +59 60 1 0.238 100000 ; cog (TEMPO) +#endif + +[ constraints ] +#ifndef FLEXIBLE + 3 6 1 0.310 ; cog (TEMPO) + 4 6 1 0.238 ; cog (TEMPO) + 5 6 1 0.238 ; cog (TEMPO) + 9 12 1 0.310 ; cog (TEMPO) +10 12 1 0.238 ; cog (TEMPO) +11 12 1 0.238 ; cog (TEMPO) +15 18 1 0.310 ; cog (TEMPO) +16 18 1 0.238 ; cog (TEMPO) +17 18 1 0.238 ; cog (TEMPO) +21 24 1 0.310 ; cog (TEMPO) +22 24 1 0.238 ; cog (TEMPO) +23 24 1 0.238 ; cog (TEMPO) +27 30 1 0.310 ; cog (TEMPO) +28 30 1 0.238 ; cog (TEMPO) +29 30 1 0.238 ; cog (TEMPO) +33 36 1 0.310 ; cog (TEMPO) +34 36 1 0.238 ; cog (TEMPO) +35 36 1 0.238 ; cog (TEMPO) +39 42 1 0.310 ; cog (TEMPO) +40 42 1 0.238 ; cog (TEMPO) +41 42 1 0.238 ; cog (TEMPO) +45 48 1 0.310 ; cog (TEMPO) +46 48 1 0.238 ; cog (TEMPO) +47 48 1 0.238 ; cog (TEMPO) +51 54 1 0.310 ; cog (TEMPO) +52 54 1 0.238 ; cog (TEMPO) +53 54 1 0.238 ; cog (TEMPO) +57 60 1 0.310 ; cog (TEMPO) +58 60 1 0.238 ; cog (TEMPO) +59 60 1 0.238 ; cog (TEMPO) +#endif + +[ angles ] + 1 2 3 2 132.9 70 ; PMMA-TEMPO connection + 2 3 4 2 129.0 60 ; PMMA-TEMPO connection + 2 3 5 2 121.9 95 ; PMMA-TEMPO connection + 7 8 9 2 132.9 70 ; PMMA-TEMPO connection + 8 9 10 2 129.0 60 ; PMMA-TEMPO connection + 8 9 11 2 121.9 95 ; PMMA-TEMPO connection +13 14 15 2 132.9 70 ; PMMA-TEMPO connection +14 15 16 2 129.0 60 ; PMMA-TEMPO connection +14 15 17 2 121.9 95 ; PMMA-TEMPO connection +19 20 21 2 132.9 70 ; PMMA-TEMPO connection +20 21 22 2 129.0 60 ; PMMA-TEMPO connection +20 21 23 2 121.9 95 ; PMMA-TEMPO connection +25 26 27 2 132.9 70 ; PMMA-TEMPO connection +26 27 28 2 129.0 60 ; PMMA-TEMPO connection +26 27 29 2 121.9 95 ; PMMA-TEMPO connection +31 32 33 2 132.9 70 ; PMMA-TEMPO connection +32 33 34 2 129.0 60 ; PMMA-TEMPO connection +32 33 35 2 121.9 95 ; PMMA-TEMPO connection +37 38 39 2 132.9 70 ; PMMA-TEMPO connection +38 39 40 2 129.0 60 ; PMMA-TEMPO connection +38 39 41 2 121.9 95 ; PMMA-TEMPO connection +43 44 45 2 132.9 70 ; PMMA-TEMPO connection +44 45 46 2 129.0 60 ; PMMA-TEMPO connection +44 45 47 2 121.9 95 ; PMMA-TEMPO connection +49 50 51 2 132.9 70 ; PMMA-TEMPO connection +50 51 52 2 129.0 60 ; PMMA-TEMPO connection +50 51 53 2 121.9 95 ; PMMA-TEMPO connection +55 56 57 2 132.9 70 ; PMMA-TEMPO connection +56 57 58 2 129.0 60 ; PMMA-TEMPO connection +56 57 59 2 121.9 95 ; PMMA-TEMPO connection + 2 1 7 2 70 20 + 8 7 13 2 70 20 +14 13 19 2 70 20 +20 19 25 2 70 20 +26 25 31 2 70 20 +32 31 37 2 70 20 +38 37 43 2 70 20 +44 43 49 2 70 20 +50 49 55 2 70 20 + +; vinyl backbone + 1 7 13 2 115 35 + 7 13 19 2 115 35 +13 19 25 2 115 35 +19 25 31 2 115 35 +25 31 37 2 115 35 +31 37 43 2 115 35 +37 43 49 2 115 35 +43 49 55 2 115 35 + +[ dihedrals ] + 3 4 5 6 2 140.00 20 ; cog (TEMPO) + 2 4 5 6 2 150.00 80 ; PMMA-TEMPO connection + 9 10 11 12 2 140.00 20 ; cog (TEMPO) + 8 10 11 12 2 150.00 80 ; PMMA-TEMPO connection +15 16 17 18 2 140.00 20 ; cog (TEMPO) +14 16 17 18 2 150.00 80 ; PMMA-TEMPO connection +21 22 23 24 2 140.00 20 ; cog (TEMPO) +20 22 23 24 2 150.00 80 ; PMMA-TEMPO connection +27 28 29 30 2 140.00 20 ; cog (TEMPO) +26 28 29 30 2 150.00 80 ; PMMA-TEMPO connection +33 34 35 36 2 140.00 20 ; cog (TEMPO) +32 34 35 36 2 150.00 80 ; PMMA-TEMPO connection +39 40 41 42 2 140.00 20 ; cog (TEMPO) +38 40 41 42 2 150.00 80 ; PMMA-TEMPO connection +45 46 47 48 2 140.00 20 ; cog (TEMPO) +44 46 47 48 2 150.00 80 ; PMMA-TEMPO connection +51 52 53 54 2 140.00 20 ; cog (TEMPO) +50 52 53 54 2 150.00 80 ; PMMA-TEMPO connection +57 58 59 60 2 140.00 20 ; cog (TEMPO) +56 58 59 60 2 150.00 80 ; PMMA-TEMPO connection + +[ exclusions ] + 1 2 3 4 5 6 + 2 3 4 5 6 + 3 4 5 6 + 4 5 6 + 5 6 + 7 8 9 10 11 12 + 8 9 10 11 12 + 9 10 11 12 +10 11 12 +11 12 +13 14 15 16 17 18 +14 15 16 17 18 +15 16 17 18 +16 17 18 +17 18 +19 20 21 22 23 24 +20 21 22 23 24 +21 22 23 24 +22 23 24 +23 24 +25 26 27 28 29 30 +26 27 28 29 30 +27 28 29 30 +28 29 30 +29 30 +31 32 33 34 35 36 +32 33 34 35 36 +33 34 35 36 +34 35 36 +35 36 +37 38 39 40 41 42 +38 39 40 41 42 +39 40 41 42 +40 41 42 +41 42 +43 44 45 46 47 48 +44 45 46 47 48 +45 46 47 48 +46 47 48 +47 48 +49 50 51 52 53 54 +50 51 52 53 54 +51 52 53 54 +52 53 54 +53 54 +55 56 57 58 59 60 +56 57 58 59 60 +57 58 59 60 +58 59 60 +59 60 + diff --git a/polyply/tests/test_data/library_tests/ibi_cgm3/PTMA/polyply/command b/polyply/tests/test_data/library_tests/ibi_cgm3/PTMA/polyply/command new file mode 100644 index 00000000..7cfea0c6 --- /dev/null +++ b/polyply/tests/test_data/library_tests/ibi_cgm3/PTMA/polyply/command @@ -0,0 +1 @@ +polyply gen_params -lib ibi_cgm3 -seq PTMA:10 -o PTMA.itp -name PTMA diff --git a/polyply/tests/test_data/library_tests/ibi_gbcg/PTMA/polyply/PTMA.itp b/polyply/tests/test_data/library_tests/ibi_gbcg/PTMA/polyply/PTMA.itp new file mode 100644 index 00000000..69dfbaad --- /dev/null +++ b/polyply/tests/test_data/library_tests/ibi_gbcg/PTMA/polyply/PTMA.itp @@ -0,0 +1,338 @@ +; /Users/alessandri/miniconda3/envs/polyplyRA/bin/polyply gen_params -lib ibi_gbcg -seq PTMA:10 -o PTMA.itp -name PTMA + +; Please cite the following papers: +; Grunewald, F; Alessandri, R; Kroon, P C; Monticelli, L; Souza, P C; Marrink, S J; Nature Communications 2022; 10.1038/s41467-021-27627-4 +; Alessandri, R; de Pablo, J J; Macromolecules 2023; 10.1021/acs.macromol.3c00141 + +[ moleculetype ] +PTMA 2 + +[ atoms ] + 1 VNL 1 PTMA VNL 1 0.0 71.099 + 2 EST 1 PTMA EST 2 0.0 29.018 + 3 C1 1 PTMA C1 3 0.0 56.108 + 4 U 1 PTMA NN 4 0.0 0.0 + 5 U 1 PTMA OO 5 0.0 0.0 + 6 C1 1 PTMA C2 6 0.0 56.108 + 7 NO 1 PTMA NO 7 0.0 30.006 + 8 VNL 2 PTMA VNL 8 0.0 71.099 + 9 EST 2 PTMA EST 9 0.0 29.018 +10 C1 2 PTMA C1 10 0.0 56.108 +11 U 2 PTMA NN 11 0.0 0.0 +12 U 2 PTMA OO 12 0.0 0.0 +13 C1 2 PTMA C2 13 0.0 56.108 +14 NO 2 PTMA NO 14 0.0 30.006 +15 VNL 3 PTMA VNL 15 0.0 71.099 +16 EST 3 PTMA EST 16 0.0 29.018 +17 C1 3 PTMA C1 17 0.0 56.108 +18 U 3 PTMA NN 18 0.0 0.0 +19 U 3 PTMA OO 19 0.0 0.0 +20 C1 3 PTMA C2 20 0.0 56.108 +21 NO 3 PTMA NO 21 0.0 30.006 +22 VNL 4 PTMA VNL 22 0.0 71.099 +23 EST 4 PTMA EST 23 0.0 29.018 +24 C1 4 PTMA C1 24 0.0 56.108 +25 U 4 PTMA NN 25 0.0 0.0 +26 U 4 PTMA OO 26 0.0 0.0 +27 C1 4 PTMA C2 27 0.0 56.108 +28 NO 4 PTMA NO 28 0.0 30.006 +29 VNL 5 PTMA VNL 29 0.0 71.099 +30 EST 5 PTMA EST 30 0.0 29.018 +31 C1 5 PTMA C1 31 0.0 56.108 +32 U 5 PTMA NN 32 0.0 0.0 +33 U 5 PTMA OO 33 0.0 0.0 +34 C1 5 PTMA C2 34 0.0 56.108 +35 NO 5 PTMA NO 35 0.0 30.006 +36 VNL 6 PTMA VNL 36 0.0 71.099 +37 EST 6 PTMA EST 37 0.0 29.018 +38 C1 6 PTMA C1 38 0.0 56.108 +39 U 6 PTMA NN 39 0.0 0.0 +40 U 6 PTMA OO 40 0.0 0.0 +41 C1 6 PTMA C2 41 0.0 56.108 +42 NO 6 PTMA NO 42 0.0 30.006 +43 VNL 7 PTMA VNL 43 0.0 71.099 +44 EST 7 PTMA EST 44 0.0 29.018 +45 C1 7 PTMA C1 45 0.0 56.108 +46 U 7 PTMA NN 46 0.0 0.0 +47 U 7 PTMA OO 47 0.0 0.0 +48 C1 7 PTMA C2 48 0.0 56.108 +49 NO 7 PTMA NO 49 0.0 30.006 +50 VNL 8 PTMA VNL 50 0.0 71.099 +51 EST 8 PTMA EST 51 0.0 29.018 +52 C1 8 PTMA C1 52 0.0 56.108 +53 U 8 PTMA NN 53 0.0 0.0 +54 U 8 PTMA OO 54 0.0 0.0 +55 C1 8 PTMA C2 55 0.0 56.108 +56 NO 8 PTMA NO 56 0.0 30.006 +57 VNL 9 PTMA VNL 57 0.0 71.099 +58 EST 9 PTMA EST 58 0.0 29.018 +59 C1 9 PTMA C1 59 0.0 56.108 +60 U 9 PTMA NN 60 0.0 0.0 +61 U 9 PTMA OO 61 0.0 0.0 +62 C1 9 PTMA C2 62 0.0 56.108 +63 NO 9 PTMA NO 63 0.0 30.006 +64 VNL 10 PTMA VNL 64 0.0 71.099 +65 EST 10 PTMA EST 65 0.0 29.018 +66 C1 10 PTMA C1 66 0.0 56.108 +67 U 10 PTMA NN 67 0.0 0.0 +68 U 10 PTMA OO 68 0.0 0.0 +69 C1 10 PTMA C2 69 0.0 56.108 +70 NO 10 PTMA NO 70 0.0 30.006 + +[ bonds ] + 1 2 1 0.35337 12500 + 2 3 1 0.32325 32000 + 2 6 1 0.32369 32000 + 3 6 1 0.38838 32000 + 8 9 1 0.35337 12500 + 9 10 1 0.32325 32000 + 9 13 1 0.32369 32000 +10 13 1 0.38838 32000 +15 16 1 0.35337 12500 +16 17 1 0.32325 32000 +16 20 1 0.32369 32000 +17 20 1 0.38838 32000 +22 23 1 0.35337 12500 +23 24 1 0.32325 32000 +23 27 1 0.32369 32000 +24 27 1 0.38838 32000 +29 30 1 0.35337 12500 +30 31 1 0.32325 32000 +30 34 1 0.32369 32000 +31 34 1 0.38838 32000 +36 37 1 0.35337 12500 +37 38 1 0.32325 32000 +37 41 1 0.32369 32000 +38 41 1 0.38838 32000 +43 44 1 0.35337 12500 +44 45 1 0.32325 32000 +44 48 1 0.32369 32000 +45 48 1 0.38838 32000 +50 51 1 0.35337 12500 +51 52 1 0.32325 32000 +51 55 1 0.32369 32000 +52 55 1 0.38838 32000 +57 58 1 0.35337 12500 +58 59 1 0.32325 32000 +58 62 1 0.32369 32000 +59 62 1 0.38838 32000 +64 65 1 0.35337 12500 +65 66 1 0.32325 32000 +65 69 1 0.32369 32000 +66 69 1 0.38838 32000 + +; vinyl backbone + 1 8 1 0.305 12000 + 8 15 1 0.305 12000 +15 22 1 0.305 12000 +22 29 1 0.305 12000 +29 36 1 0.305 12000 +36 43 1 0.305 12000 +43 50 1 0.305 12000 +50 57 1 0.305 12000 +57 64 1 0.305 12000 + +#ifdef FLEXIBLE + 3 7 1 0.23794 1000000 + 6 7 1 0.23793 1000000 +10 14 1 0.23794 1000000 +13 14 1 0.23793 1000000 +17 21 1 0.23794 1000000 +20 21 1 0.23793 1000000 +24 28 1 0.23794 1000000 +27 28 1 0.23793 1000000 +31 35 1 0.23794 1000000 +34 35 1 0.23793 1000000 +38 42 1 0.23794 1000000 +41 42 1 0.23793 1000000 +45 49 1 0.23794 1000000 +48 49 1 0.23793 1000000 +52 56 1 0.23794 1000000 +55 56 1 0.23793 1000000 +59 63 1 0.23794 1000000 +62 63 1 0.23793 1000000 +66 70 1 0.23794 1000000 +69 70 1 0.23793 1000000 +#endif + +[ constraints ] +#ifndef FLEXIBLE + 3 7 1 0.23794 + 6 7 1 0.23793 +10 14 1 0.23794 +13 14 1 0.23793 +17 21 1 0.23794 +20 21 1 0.23793 +24 28 1 0.23794 +27 28 1 0.23793 +31 35 1 0.23794 +34 35 1 0.23793 +38 42 1 0.23794 +41 42 1 0.23793 +45 49 1 0.23794 +48 49 1 0.23793 +52 56 1 0.23794 +55 56 1 0.23793 +59 63 1 0.23794 +62 63 1 0.23793 +66 70 1 0.23794 +69 70 1 0.23793 +#endif + +[ angles ] + 1 2 3 2 130.000 90 + 1 2 6 2 130.000 75 + 8 9 10 2 130.000 90 + 8 9 13 2 130.000 75 +15 16 17 2 130.000 90 +15 16 20 2 130.000 75 +22 23 24 2 130.000 90 +22 23 27 2 130.000 75 +29 30 31 2 130.000 90 +29 30 34 2 130.000 75 +36 37 38 2 130.000 90 +36 37 41 2 130.000 75 +43 44 45 2 130.000 90 +43 44 48 2 130.000 75 +50 51 52 2 130.000 90 +50 51 55 2 130.000 75 +57 58 59 2 130.000 90 +57 58 62 2 130.000 75 +64 65 66 2 130.000 90 +64 65 69 2 130.000 75 + 2 1 8 2 90 20 + 9 8 15 2 90 20 +16 15 22 2 90 20 +23 22 29 2 90 20 +30 29 36 2 90 20 +37 36 43 2 90 20 +44 43 50 2 90 20 +51 50 57 2 90 20 +58 57 64 2 90 20 + +; vinyl backbone + 1 8 15 2 126 40 + 8 15 22 2 126 40 +15 22 29 2 126 40 +22 29 36 2 126 40 +29 36 43 2 126 40 +36 43 50 2 126 40 +43 50 57 2 126 40 +50 57 64 2 126 40 + +[ dihedrals ] + 1 3 6 7 2 165.98 50 + 2 3 6 7 2 179.20 80 + 3 7 5 6 2 170.723 50 + 8 10 13 14 2 165.98 50 + 9 10 13 14 2 179.20 80 +10 14 12 13 2 170.723 50 +15 17 20 21 2 165.98 50 +16 17 20 21 2 179.20 80 +17 21 19 20 2 170.723 50 +22 24 27 28 2 165.98 50 +23 24 27 28 2 179.20 80 +24 28 26 27 2 170.723 50 +29 31 34 35 2 165.98 50 +30 31 34 35 2 179.20 80 +31 35 33 34 2 170.723 50 +36 38 41 42 2 165.98 50 +37 38 41 42 2 179.20 80 +38 42 40 41 2 170.723 50 +43 45 48 49 2 165.98 50 +44 45 48 49 2 179.20 80 +45 49 47 48 2 170.723 50 +50 52 55 56 2 165.98 50 +51 52 55 56 2 179.20 80 +52 56 54 55 2 170.723 50 +57 59 62 63 2 165.98 50 +58 59 62 63 2 179.20 80 +59 63 61 62 2 170.723 50 +64 66 69 70 2 165.98 50 +65 66 69 70 2 179.20 80 +66 70 68 69 2 170.723 50 + +[ virtual_sites3 ] + 4 3 2 7 2 0.834 0.210 + 5 3 2 7 2 1.180 0.276 +11 10 9 14 2 0.834 0.210 +12 10 9 14 2 1.180 0.276 +18 17 16 21 2 0.834 0.210 +19 17 16 21 2 1.180 0.276 +25 24 23 28 2 0.834 0.210 +26 24 23 28 2 1.180 0.276 +32 31 30 35 2 0.834 0.210 +33 31 30 35 2 1.180 0.276 +39 38 37 42 2 0.834 0.210 +40 38 37 42 2 1.180 0.276 +46 45 44 49 2 0.834 0.210 +47 45 44 49 2 1.180 0.276 +53 52 51 56 2 0.834 0.210 +54 52 51 56 2 1.180 0.276 +60 59 58 63 2 0.834 0.210 +61 59 58 63 2 1.180 0.276 +67 66 65 70 2 0.834 0.210 +68 66 65 70 2 1.180 0.276 + +[ exclusions ] + 1 2 3 4 5 6 7 + 2 3 4 5 6 7 + 3 4 5 6 7 + 4 5 6 7 + 5 6 7 + 6 7 + 8 9 10 11 12 13 14 + 9 10 11 12 13 14 +10 11 12 13 14 +11 12 13 14 +12 13 14 +13 14 +15 16 17 18 19 20 21 +16 17 18 19 20 21 +17 18 19 20 21 +18 19 20 21 +19 20 21 +20 21 +22 23 24 25 26 27 28 +23 24 25 26 27 28 +24 25 26 27 28 +25 26 27 28 +26 27 28 +27 28 +29 30 31 32 33 34 35 +30 31 32 33 34 35 +31 32 33 34 35 +32 33 34 35 +33 34 35 +34 35 +36 37 38 39 40 41 42 +37 38 39 40 41 42 +38 39 40 41 42 +39 40 41 42 +40 41 42 +41 42 +43 44 45 46 47 48 49 +44 45 46 47 48 49 +45 46 47 48 49 +46 47 48 49 +47 48 49 +48 49 +50 51 52 53 54 55 56 +51 52 53 54 55 56 +52 53 54 55 56 +53 54 55 56 +54 55 56 +55 56 +57 58 59 60 61 62 63 +58 59 60 61 62 63 +59 60 61 62 63 +60 61 62 63 +61 62 63 +62 63 +64 65 66 67 68 69 70 +65 66 67 68 69 70 +66 67 68 69 70 +67 68 69 70 +68 69 70 +69 70 + diff --git a/polyply/tests/test_data/library_tests/ibi_gbcg/PTMA/polyply/command b/polyply/tests/test_data/library_tests/ibi_gbcg/PTMA/polyply/command new file mode 100644 index 00000000..dcf827fc --- /dev/null +++ b/polyply/tests/test_data/library_tests/ibi_gbcg/PTMA/polyply/command @@ -0,0 +1 @@ +polyply gen_params -lib ibi_gbcg -seq PTMA:10 -o PTMA.itp -name PTMA diff --git a/polyply/tests/test_data/library_tests/parmbsc1/dsDNA/polyply/DNA.itp b/polyply/tests/test_data/library_tests/parmbsc1/dsDNA/polyply/DNA.itp new file mode 100644 index 00000000..03b97c79 --- /dev/null +++ b/polyply/tests/test_data/library_tests/parmbsc1/dsDNA/polyply/DNA.itp @@ -0,0 +1,5672 @@ +; +; File 'topol.top' was generated +; By user: fabian (23086) +; On host: md26 +; At date: Wed Mar 9 15:33:49 2022 +; +; This is a standalone topology file +; +; Created by: +; :-) GROMACS - gmx pdb2gmx, 2021.3 (-: +; +; Executable: /usr/local/gromacs-2021.3/bin/gmx +; Data prefix: /usr/local/gromacs-2021.3 +; Working dir: /coarse/fabian/current-projects/polymer_itp_builder/examples_for_paper/DNA +; Command line: +; gmx pdb2gmx -f ref_dsDNA/19706361ABD.pdb -merge all +; Force field was read from current directory or a relative path - path added. +; + +; Include forcefield parameters + +[ moleculetype ] +; Name nrexcl +DNA 3 + +[ atoms ] +; nr type resnr residue atom cgnr charge mass typeB chargeB massB +; residue 1 DA rtp DA5 q -0.3 + 1 HO 1 DA H5T 1 0.4422 + 2 OH 1 DA O5' 2 -0.6318 + 3 CI 1 DA C5' 3 -0.0069 + 4 H1 1 DA H5'1 4 0.0754 + 5 H1 1 DA H5'2 5 0.0754 + 6 CT 1 DA C4' 6 0.1629 + 7 H1 1 DA H4' 7 0.1176 + 8 OS 1 DA O4' 8 -0.3691 + 9 CT 1 DA C1' 9 0.0431 + 10 H2 1 DA H1' 10 0.1838 + 11 N* 1 DA N9 11 -0.0268 + 12 C1 1 DA C8 12 0.1607 + 13 H5 1 DA H8 13 0.1877 + 14 NB 1 DA N7 14 -0.6175 + 15 CB 1 DA C5 15 0.0725 + 16 CA 1 DA C6 16 0.6897 + 17 N2 1 DA N6 17 -0.9123 + 18 H 1 DA H61 18 0.4167 + 19 H 1 DA H62 19 0.4167 + 20 NC 1 DA N1 20 -0.7624 + 21 CQ 1 DA C2 21 0.5716 + 22 H5 1 DA H2 22 0.0598 + 23 NC 1 DA N3 23 -0.7417 + 24 CB 1 DA C4 24 0.38 + 25 CE 1 DA C3' 25 0.0713 + 26 H1 1 DA H3' 26 0.0985 + 27 CT 1 DA C2' 27 -0.0854 + 28 HC 1 DA H2'1 28 0.0718 + 29 HC 1 DA H2'2 29 0.0718 + 30 OS 1 DA O3' 30 -0.5232 ; qtot -0.3079 +; residue 2 DA rtp DA q -1.0 + 31 P 2 DA P 31 1.1659 + 32 O2 2 DA O1P 32 -0.7761 + 33 O2 2 DA O2P 33 -0.7761 + 34 OS 2 DA O5' 34 -0.4954 + 35 CI 2 DA C5' 35 -0.0069 + 36 H1 2 DA H5'1 36 0.0754 + 37 H1 2 DA H5'2 37 0.0754 + 38 CT 2 DA C4' 38 0.1629 + 39 H1 2 DA H4' 39 0.1176 + 40 OS 2 DA O4' 40 -0.3691 + 41 CT 2 DA C1' 41 0.0431 + 42 H2 2 DA H1' 42 0.1838 + 43 N* 2 DA N9 43 -0.0268 + 44 C1 2 DA C8 44 0.1607 + 45 H5 2 DA H8 45 0.1877 + 46 NB 2 DA N7 46 -0.6175 + 47 CB 2 DA C5 47 0.0725 + 48 CA 2 DA C6 48 0.6897 + 49 N2 2 DA N6 49 -0.9123 + 50 H 2 DA H61 50 0.4167 + 51 H 2 DA H62 51 0.4167 + 52 NC 2 DA N1 52 -0.7624 + 53 CQ 2 DA C2 53 0.5716 + 54 H5 2 DA H2 54 0.0598 + 55 NC 2 DA N3 55 -0.7417 + 56 CB 2 DA C4 56 0.38 + 57 CE 2 DA C3' 57 0.0713 + 58 H1 2 DA H3' 58 0.0985 + 59 CT 2 DA C2' 59 -0.0854 + 60 HC 2 DA H2'1 60 0.0718 + 61 HC 2 DA H2'2 61 0.0718 + 62 OS 2 DA O3' 62 -0.5232 ; qtot -1.308 +; residue 3 DA rtp DA q -1.0 + 63 P 3 DA P 63 1.1659 + 64 O2 3 DA O1P 64 -0.7761 + 65 O2 3 DA O2P 65 -0.7761 + 66 OS 3 DA O5' 66 -0.4954 + 67 CI 3 DA C5' 67 -0.0069 + 68 H1 3 DA H5'1 68 0.0754 + 69 H1 3 DA H5'2 69 0.0754 + 70 CT 3 DA C4' 70 0.1629 + 71 H1 3 DA H4' 71 0.1176 + 72 OS 3 DA O4' 72 -0.3691 + 73 CT 3 DA C1' 73 0.0431 + 74 H2 3 DA H1' 74 0.1838 + 75 N* 3 DA N9 75 -0.0268 + 76 C1 3 DA C8 76 0.1607 + 77 H5 3 DA H8 77 0.1877 + 78 NB 3 DA N7 78 -0.6175 + 79 CB 3 DA C5 79 0.0725 + 80 CA 3 DA C6 80 0.6897 + 81 N2 3 DA N6 81 -0.9123 + 82 H 3 DA H61 82 0.4167 + 83 H 3 DA H62 83 0.4167 + 84 NC 3 DA N1 84 -0.7624 + 85 CQ 3 DA C2 85 0.5716 + 86 H5 3 DA H2 86 0.0598 + 87 NC 3 DA N3 87 -0.7417 + 88 CB 3 DA C4 88 0.38 + 89 CE 3 DA C3' 89 0.0713 + 90 H1 3 DA H3' 90 0.0985 + 91 CT 3 DA C2' 91 -0.0854 + 92 HC 3 DA H2'1 92 0.0718 + 93 HC 3 DA H2'2 93 0.0718 + 94 OS 3 DA O3' 94 -0.5232 ; qtot -2.308 +; residue 4 DG rtp DG q -1.0 + 95 P 4 DG P 95 1.1659 + 96 O2 4 DG O1P 96 -0.7761 + 97 O2 4 DG O2P 97 -0.7761 + 98 OS 4 DG O5' 98 -0.4954 + 99 CI 4 DG C5' 99 -0.0069 + 100 H1 4 DG H5'1 100 0.0754 + 101 H1 4 DG H5'2 101 0.0754 + 102 CT 4 DG C4' 102 0.1629 + 103 H1 4 DG H4' 103 0.1176 + 104 OS 4 DG O4' 104 -0.3691 + 105 CT 4 DG C1' 105 0.0358 + 106 H2 4 DG H1' 106 0.1746 + 107 N* 4 DG N9 107 0.0577 + 108 CK 4 DG C8 108 0.0736 + 109 H5 4 DG H8 109 0.1997 + 110 NB 4 DG N7 110 -0.5725 + 111 CB 4 DG C5 111 0.1991 + 112 C 4 DG C6 112 0.4918 + 113 O 4 DG O6 113 -0.5699 + 114 NA 4 DG N1 114 -0.5053 + 115 H 4 DG H1 115 0.352 + 116 CA 4 DG C2 116 0.7432 + 117 N2 4 DG N2 117 -0.923 + 118 H 4 DG H21 118 0.4235 + 119 H 4 DG H22 119 0.4235 + 120 NC 4 DG N3 120 -0.6636 + 121 CB 4 DG C4 121 0.1814 + 122 CE 4 DG C3' 122 0.0713 + 123 H1 4 DG H3' 123 0.0985 + 124 CT 4 DG C2' 124 -0.0854 + 125 HC 4 DG H2'1 125 0.0718 + 126 HC 4 DG H2'2 126 0.0718 + 127 OS 4 DG O3' 127 -0.5232 ; qtot -3.308 +; residue 5 DG rtp DG q -1.0 + 128 P 5 DG P 128 1.1659 + 129 O2 5 DG O1P 129 -0.7761 + 130 O2 5 DG O2P 130 -0.7761 + 131 OS 5 DG O5' 131 -0.4954 + 132 CI 5 DG C5' 132 -0.0069 + 133 H1 5 DG H5'1 133 0.0754 + 134 H1 5 DG H5'2 134 0.0754 + 135 CT 5 DG C4' 135 0.1629 + 136 H1 5 DG H4' 136 0.1176 + 137 OS 5 DG O4' 137 -0.3691 + 138 CT 5 DG C1' 138 0.0358 + 139 H2 5 DG H1' 139 0.1746 + 140 N* 5 DG N9 140 0.0577 + 141 CK 5 DG C8 141 0.0736 + 142 H5 5 DG H8 142 0.1997 + 143 NB 5 DG N7 143 -0.5725 + 144 CB 5 DG C5 144 0.1991 + 145 C 5 DG C6 145 0.4918 + 146 O 5 DG O6 146 -0.5699 + 147 NA 5 DG N1 147 -0.5053 + 148 H 5 DG H1 148 0.352 + 149 CA 5 DG C2 149 0.7432 + 150 N2 5 DG N2 150 -0.923 + 151 H 5 DG H21 151 0.4235 + 152 H 5 DG H22 152 0.4235 + 153 NC 5 DG N3 153 -0.6636 + 154 CB 5 DG C4 154 0.1814 + 155 CE 5 DG C3' 155 0.0713 + 156 H1 5 DG H3' 156 0.0985 + 157 CT 5 DG C2' 157 -0.0854 + 158 HC 5 DG H2'1 158 0.0718 + 159 HC 5 DG H2'2 159 0.0718 + 160 OS 5 DG O3' 160 -0.5232 ; qtot -4.308 +; residue 6 DC rtp DC q -1.0 + 161 P 6 DC P 161 1.1659 + 162 O2 6 DC O1P 162 -0.7761 + 163 O2 6 DC O2P 163 -0.7761 + 164 OS 6 DC O5' 164 -0.4954 + 165 CI 6 DC C5' 165 -0.0069 + 166 H1 6 DC H5'1 166 0.0754 + 167 H1 6 DC H5'2 167 0.0754 + 168 CT 6 DC C4' 168 0.1629 + 169 H1 6 DC H4' 169 0.1176 + 170 OS 6 DC O4' 170 -0.3691 + 171 CT 6 DC C1' 171 -0.0116 + 172 H2 6 DC H1' 172 0.1963 + 173 N* 6 DC N1 173 -0.0339 + 174 CM 6 DC C6 174 -0.0183 + 175 H4 6 DC H6 175 0.2293 + 176 CM 6 DC C5 176 -0.5222 + 177 HA 6 DC H5 177 0.1863 + 178 CA 6 DC C4 178 0.8439 + 179 N2 6 DC N4 179 -0.9773 + 180 H 6 DC H41 180 0.4314 + 181 H 6 DC H42 181 0.4314 + 182 NC 6 DC N3 182 -0.7748 + 183 C 6 DC C2 183 0.7959 + 184 O 6 DC O2 184 -0.6548 + 185 CE 6 DC C3' 185 0.0713 + 186 H1 6 DC H3' 186 0.0985 + 187 CT 6 DC C2' 187 -0.0854 + 188 HC 6 DC H2'1 188 0.0718 + 189 HC 6 DC H2'2 189 0.0718 + 190 OS 6 DC O3' 190 -0.5232 ; qtot -5.308 +; residue 7 DC rtp DC q -1.0 + 191 P 7 DC P 191 1.1659 + 192 O2 7 DC O1P 192 -0.7761 + 193 O2 7 DC O2P 193 -0.7761 + 194 OS 7 DC O5' 194 -0.4954 + 195 CI 7 DC C5' 195 -0.0069 + 196 H1 7 DC H5'1 196 0.0754 + 197 H1 7 DC H5'2 197 0.0754 + 198 CT 7 DC C4' 198 0.1629 + 199 H1 7 DC H4' 199 0.1176 + 200 OS 7 DC O4' 200 -0.3691 + 201 CT 7 DC C1' 201 -0.0116 + 202 H2 7 DC H1' 202 0.1963 + 203 N* 7 DC N1 203 -0.0339 + 204 CM 7 DC C6 204 -0.0183 + 205 H4 7 DC H6 205 0.2293 + 206 CM 7 DC C5 206 -0.5222 + 207 HA 7 DC H5 207 0.1863 + 208 CA 7 DC C4 208 0.8439 + 209 N2 7 DC N4 209 -0.9773 + 210 H 7 DC H41 210 0.4314 + 211 H 7 DC H42 211 0.4314 + 212 NC 7 DC N3 212 -0.7748 + 213 C 7 DC C2 213 0.7959 + 214 O 7 DC O2 214 -0.6548 + 215 CE 7 DC C3' 215 0.0713 + 216 H1 7 DC H3' 216 0.0985 + 217 CT 7 DC C2' 217 -0.0854 + 218 HC 7 DC H2'1 218 0.0718 + 219 HC 7 DC H2'2 219 0.0718 + 220 OS 7 DC O3' 220 -0.5232 ; qtot -6.308 +; residue 8 DT rtp DT q -1.0 + 221 P 8 DT P 221 1.1659 + 222 O2 8 DT O1P 222 -0.7761 + 223 O2 8 DT O2P 223 -0.7761 + 224 OS 8 DT O5' 224 -0.4954 + 225 CI 8 DT C5' 225 -0.0069 + 226 H1 8 DT H5'1 226 0.0754 + 227 H1 8 DT H5'2 227 0.0754 + 228 CT 8 DT C4' 228 0.1629 + 229 H1 8 DT H4' 229 0.1176 + 230 OS 8 DT O4' 230 -0.3691 + 231 CT 8 DT C1' 231 0.068 + 232 H2 8 DT H1' 232 0.1804 + 233 N* 8 DT N1 233 -0.0239 + 234 C2 8 DT C6 234 -0.2209 + 235 H4 8 DT H6 235 0.2607 + 236 C2 8 DT C5 236 0.0025 + 237 CT 8 DT C7 237 -0.2269 + 238 HC 8 DT H71 238 0.077 + 239 HC 8 DT H72 239 0.077 + 240 HC 8 DT H73 240 0.077 + 241 C 8 DT C4 241 0.5194 + 242 O 8 DT O4 242 -0.5563 + 243 NA 8 DT N3 243 -0.434 + 244 H 8 DT H3 244 0.342 + 245 C 8 DT C2 245 0.5677 + 246 O 8 DT O2 246 -0.5881 + 247 CE 8 DT C3' 247 0.0713 + 248 H1 8 DT H3' 248 0.0985 + 249 CT 8 DT C2' 249 -0.0854 + 250 HC 8 DT H2'1 250 0.0718 + 251 HC 8 DT H2'2 251 0.0718 + 252 OS 8 DT O3' 252 -0.5232 ; qtot -7.308 +; residue 9 DT rtp DT3 q -0.7 + 253 P 9 DT P 253 1.1659 + 254 O2 9 DT O1P 254 -0.7761 + 255 O2 9 DT O2P 255 -0.7761 + 256 OS 9 DT O5' 256 -0.4954 + 257 CI 9 DT C5' 257 -0.0069 + 258 H1 9 DT H5'1 258 0.0754 + 259 H1 9 DT H5'2 259 0.0754 + 260 CT 9 DT C4' 260 0.1629 + 261 H1 9 DT H4' 261 0.1176 + 262 OS 9 DT O4' 262 -0.3691 + 263 CT 9 DT C1' 263 0.068 + 264 H2 9 DT H1' 264 0.1804 + 265 N* 9 DT N1 265 -0.0239 + 266 C2 9 DT C6 266 -0.2209 + 267 H4 9 DT H6 267 0.2607 + 268 C2 9 DT C5 268 0.0025 + 269 CT 9 DT C7 269 -0.2269 + 270 HC 9 DT H71 270 0.077 + 271 HC 9 DT H72 271 0.077 + 272 HC 9 DT H73 272 0.077 + 273 C 9 DT C4 273 0.5194 + 274 O 9 DT O4 274 -0.5563 + 275 NA 9 DT N3 275 -0.434 + 276 H 9 DT H3 276 0.342 + 277 C 9 DT C2 277 0.5677 + 278 O 9 DT O2 278 -0.5881 + 279 CE 9 DT C3' 279 0.0713 + 280 H1 9 DT H3' 280 0.0985 + 281 CT 9 DT C2' 281 -0.0854 + 282 HC 9 DT H2'1 282 0.0718 + 283 HC 9 DT H2'2 283 0.0718 + 284 OH 9 DT O3' 284 -0.6549 + 285 HO 9 DT H3T 285 0.4396 ; qtot -8 +; residue 10 DA rtp DA5 q -0.3 + 286 HO 10 DA H5T 286 0.4422 + 287 OH 10 DA O5' 287 -0.6318 + 288 CI 10 DA C5' 288 -0.0069 + 289 H1 10 DA H5'1 289 0.0754 + 290 H1 10 DA H5'2 290 0.0754 + 291 CT 10 DA C4' 291 0.1629 + 292 H1 10 DA H4' 292 0.1176 + 293 OS 10 DA O4' 293 -0.3691 + 294 CT 10 DA C1' 294 0.0431 + 295 H2 10 DA H1' 295 0.1838 + 296 N* 10 DA N9 296 -0.0268 + 297 C1 10 DA C8 297 0.1607 + 298 H5 10 DA H8 298 0.1877 + 299 NB 10 DA N7 299 -0.6175 + 300 CB 10 DA C5 300 0.0725 + 301 CA 10 DA C6 301 0.6897 + 302 N2 10 DA N6 302 -0.9123 + 303 H 10 DA H61 303 0.4167 + 304 H 10 DA H62 304 0.4167 + 305 NC 10 DA N1 305 -0.7624 + 306 CQ 10 DA C2 306 0.5716 + 307 H5 10 DA H2 307 0.0598 + 308 NC 10 DA N3 308 -0.7417 + 309 CB 10 DA C4 309 0.38 + 310 CE 10 DA C3' 310 0.0713 + 311 H1 10 DA H3' 311 0.0985 + 312 CT 10 DA C2' 312 -0.0854 + 313 HC 10 DA H2'1 313 0.0718 + 314 HC 10 DA H2'2 314 0.0718 + 315 OS 10 DA O3' 315 -0.5232 ; qtot -8.308 +; residue 11 DA rtp DA q -1.0 + 316 P 11 DA P 316 1.1659 + 317 O2 11 DA O1P 317 -0.7761 + 318 O2 11 DA O2P 318 -0.7761 + 319 OS 11 DA O5' 319 -0.4954 + 320 CI 11 DA C5' 320 -0.0069 + 321 H1 11 DA H5'1 321 0.0754 + 322 H1 11 DA H5'2 322 0.0754 + 323 CT 11 DA C4' 323 0.1629 + 324 H1 11 DA H4' 324 0.1176 + 325 OS 11 DA O4' 325 -0.3691 + 326 CT 11 DA C1' 326 0.0431 + 327 H2 11 DA H1' 327 0.1838 + 328 N* 11 DA N9 328 -0.0268 + 329 C1 11 DA C8 329 0.1607 + 330 H5 11 DA H8 330 0.1877 + 331 NB 11 DA N7 331 -0.6175 + 332 CB 11 DA C5 332 0.0725 + 333 CA 11 DA C6 333 0.6897 + 334 N2 11 DA N6 334 -0.9123 + 335 H 11 DA H61 335 0.4167 + 336 H 11 DA H62 336 0.4167 + 337 NC 11 DA N1 337 -0.7624 + 338 CQ 11 DA C2 338 0.5716 + 339 H5 11 DA H2 339 0.0598 + 340 NC 11 DA N3 340 -0.7417 + 341 CB 11 DA C4 341 0.38 + 342 CE 11 DA C3' 342 0.0713 + 343 H1 11 DA H3' 343 0.0985 + 344 CT 11 DA C2' 344 -0.0854 + 345 HC 11 DA H2'1 345 0.0718 + 346 HC 11 DA H2'2 346 0.0718 + 347 OS 11 DA O3' 347 -0.5232 ; qtot -9.308 +; residue 12 DG rtp DG q -1.0 + 348 P 12 DG P 348 1.1659 + 349 O2 12 DG O1P 349 -0.7761 + 350 O2 12 DG O2P 350 -0.7761 + 351 OS 12 DG O5' 351 -0.4954 + 352 CI 12 DG C5' 352 -0.0069 + 353 H1 12 DG H5'1 353 0.0754 + 354 H1 12 DG H5'2 354 0.0754 + 355 CT 12 DG C4' 355 0.1629 + 356 H1 12 DG H4' 356 0.1176 + 357 OS 12 DG O4' 357 -0.3691 + 358 CT 12 DG C1' 358 0.0358 + 359 H2 12 DG H1' 359 0.1746 + 360 N* 12 DG N9 360 0.0577 + 361 CK 12 DG C8 361 0.0736 + 362 H5 12 DG H8 362 0.1997 + 363 NB 12 DG N7 363 -0.5725 + 364 CB 12 DG C5 364 0.1991 + 365 C 12 DG C6 365 0.4918 + 366 O 12 DG O6 366 -0.5699 + 367 NA 12 DG N1 367 -0.5053 + 368 H 12 DG H1 368 0.352 + 369 CA 12 DG C2 369 0.7432 + 370 N2 12 DG N2 370 -0.923 + 371 H 12 DG H21 371 0.4235 + 372 H 12 DG H22 372 0.4235 + 373 NC 12 DG N3 373 -0.6636 + 374 CB 12 DG C4 374 0.1814 + 375 CE 12 DG C3' 375 0.0713 + 376 H1 12 DG H3' 376 0.0985 + 377 CT 12 DG C2' 377 -0.0854 + 378 HC 12 DG H2'1 378 0.0718 + 379 HC 12 DG H2'2 379 0.0718 + 380 OS 12 DG O3' 380 -0.5232 ; qtot -10.31 +; residue 13 DG rtp DG q -1.0 + 381 P 13 DG P 381 1.1659 + 382 O2 13 DG O1P 382 -0.7761 + 383 O2 13 DG O2P 383 -0.7761 + 384 OS 13 DG O5' 384 -0.4954 + 385 CI 13 DG C5' 385 -0.0069 + 386 H1 13 DG H5'1 386 0.0754 + 387 H1 13 DG H5'2 387 0.0754 + 388 CT 13 DG C4' 388 0.1629 + 389 H1 13 DG H4' 389 0.1176 + 390 OS 13 DG O4' 390 -0.3691 + 391 CT 13 DG C1' 391 0.0358 + 392 H2 13 DG H1' 392 0.1746 + 393 N* 13 DG N9 393 0.0577 + 394 CK 13 DG C8 394 0.0736 + 395 H5 13 DG H8 395 0.1997 + 396 NB 13 DG N7 396 -0.5725 + 397 CB 13 DG C5 397 0.1991 + 398 C 13 DG C6 398 0.4918 + 399 O 13 DG O6 399 -0.5699 + 400 NA 13 DG N1 400 -0.5053 + 401 H 13 DG H1 401 0.352 + 402 CA 13 DG C2 402 0.7432 + 403 N2 13 DG N2 403 -0.923 + 404 H 13 DG H21 404 0.4235 + 405 H 13 DG H22 405 0.4235 + 406 NC 13 DG N3 406 -0.6636 + 407 CB 13 DG C4 407 0.1814 + 408 CE 13 DG C3' 408 0.0713 + 409 H1 13 DG H3' 409 0.0985 + 410 CT 13 DG C2' 410 -0.0854 + 411 HC 13 DG H2'1 411 0.0718 + 412 HC 13 DG H2'2 412 0.0718 + 413 OS 13 DG O3' 413 -0.5232 ; qtot -11.31 +; residue 14 DC rtp DC q -1.0 + 414 P 14 DC P 414 1.1659 + 415 O2 14 DC O1P 415 -0.7761 + 416 O2 14 DC O2P 416 -0.7761 + 417 OS 14 DC O5' 417 -0.4954 + 418 CI 14 DC C5' 418 -0.0069 + 419 H1 14 DC H5'1 419 0.0754 + 420 H1 14 DC H5'2 420 0.0754 + 421 CT 14 DC C4' 421 0.1629 + 422 H1 14 DC H4' 422 0.1176 + 423 OS 14 DC O4' 423 -0.3691 + 424 CT 14 DC C1' 424 -0.0116 + 425 H2 14 DC H1' 425 0.1963 + 426 N* 14 DC N1 426 -0.0339 + 427 CM 14 DC C6 427 -0.0183 + 428 H4 14 DC H6 428 0.2293 + 429 CM 14 DC C5 429 -0.5222 + 430 HA 14 DC H5 430 0.1863 + 431 CA 14 DC C4 431 0.8439 + 432 N2 14 DC N4 432 -0.9773 + 433 H 14 DC H41 433 0.4314 + 434 H 14 DC H42 434 0.4314 + 435 NC 14 DC N3 435 -0.7748 + 436 C 14 DC C2 436 0.7959 + 437 O 14 DC O2 437 -0.6548 + 438 CE 14 DC C3' 438 0.0713 + 439 H1 14 DC H3' 439 0.0985 + 440 CT 14 DC C2' 440 -0.0854 + 441 HC 14 DC H2'1 441 0.0718 + 442 HC 14 DC H2'2 442 0.0718 + 443 OS 14 DC O3' 443 -0.5232 ; qtot -12.31 +; residue 15 DC rtp DC q -1.0 + 444 P 15 DC P 444 1.1659 + 445 O2 15 DC O1P 445 -0.7761 + 446 O2 15 DC O2P 446 -0.7761 + 447 OS 15 DC O5' 447 -0.4954 + 448 CI 15 DC C5' 448 -0.0069 + 449 H1 15 DC H5'1 449 0.0754 + 450 H1 15 DC H5'2 450 0.0754 + 451 CT 15 DC C4' 451 0.1629 + 452 H1 15 DC H4' 452 0.1176 + 453 OS 15 DC O4' 453 -0.3691 + 454 CT 15 DC C1' 454 -0.0116 + 455 H2 15 DC H1' 455 0.1963 + 456 N* 15 DC N1 456 -0.0339 + 457 CM 15 DC C6 457 -0.0183 + 458 H4 15 DC H6 458 0.2293 + 459 CM 15 DC C5 459 -0.5222 + 460 HA 15 DC H5 460 0.1863 + 461 CA 15 DC C4 461 0.8439 + 462 N2 15 DC N4 462 -0.9773 + 463 H 15 DC H41 463 0.4314 + 464 H 15 DC H42 464 0.4314 + 465 NC 15 DC N3 465 -0.7748 + 466 C 15 DC C2 466 0.7959 + 467 O 15 DC O2 467 -0.6548 + 468 CE 15 DC C3' 468 0.0713 + 469 H1 15 DC H3' 469 0.0985 + 470 CT 15 DC C2' 470 -0.0854 + 471 HC 15 DC H2'1 471 0.0718 + 472 HC 15 DC H2'2 472 0.0718 + 473 OS 15 DC O3' 473 -0.5232 ; qtot -13.31 +; residue 16 DT rtp DT q -1.0 + 474 P 16 DT P 474 1.1659 + 475 O2 16 DT O1P 475 -0.7761 + 476 O2 16 DT O2P 476 -0.7761 + 477 OS 16 DT O5' 477 -0.4954 + 478 CI 16 DT C5' 478 -0.0069 + 479 H1 16 DT H5'1 479 0.0754 + 480 H1 16 DT H5'2 480 0.0754 + 481 CT 16 DT C4' 481 0.1629 + 482 H1 16 DT H4' 482 0.1176 + 483 OS 16 DT O4' 483 -0.3691 + 484 CT 16 DT C1' 484 0.068 + 485 H2 16 DT H1' 485 0.1804 + 486 N* 16 DT N1 486 -0.0239 + 487 C2 16 DT C6 487 -0.2209 + 488 H4 16 DT H6 488 0.2607 + 489 C2 16 DT C5 489 0.0025 + 490 CT 16 DT C7 490 -0.2269 + 491 HC 16 DT H71 491 0.077 + 492 HC 16 DT H72 492 0.077 + 493 HC 16 DT H73 493 0.077 + 494 C 16 DT C4 494 0.5194 + 495 O 16 DT O4 495 -0.5563 + 496 NA 16 DT N3 496 -0.434 + 497 H 16 DT H3 497 0.342 + 498 C 16 DT C2 498 0.5677 + 499 O 16 DT O2 499 -0.5881 + 500 CE 16 DT C3' 500 0.0713 + 501 H1 16 DT H3' 501 0.0985 + 502 CT 16 DT C2' 502 -0.0854 + 503 HC 16 DT H2'1 503 0.0718 + 504 HC 16 DT H2'2 504 0.0718 + 505 OS 16 DT O3' 505 -0.5232 ; qtot -14.31 +; residue 17 DT rtp DT q -1.0 + 506 P 17 DT P 506 1.1659 + 507 O2 17 DT O1P 507 -0.7761 + 508 O2 17 DT O2P 508 -0.7761 + 509 OS 17 DT O5' 509 -0.4954 + 510 CI 17 DT C5' 510 -0.0069 + 511 H1 17 DT H5'1 511 0.0754 + 512 H1 17 DT H5'2 512 0.0754 + 513 CT 17 DT C4' 513 0.1629 + 514 H1 17 DT H4' 514 0.1176 + 515 OS 17 DT O4' 515 -0.3691 + 516 CT 17 DT C1' 516 0.068 + 517 H2 17 DT H1' 517 0.1804 + 518 N* 17 DT N1 518 -0.0239 + 519 C2 17 DT C6 519 -0.2209 + 520 H4 17 DT H6 520 0.2607 + 521 C2 17 DT C5 521 0.0025 + 522 CT 17 DT C7 522 -0.2269 + 523 HC 17 DT H71 523 0.077 + 524 HC 17 DT H72 524 0.077 + 525 HC 17 DT H73 525 0.077 + 526 C 17 DT C4 526 0.5194 + 527 O 17 DT O4 527 -0.5563 + 528 NA 17 DT N3 528 -0.434 + 529 H 17 DT H3 529 0.342 + 530 C 17 DT C2 530 0.5677 + 531 O 17 DT O2 531 -0.5881 + 532 CE 17 DT C3' 532 0.0713 + 533 H1 17 DT H3' 533 0.0985 + 534 CT 17 DT C2' 534 -0.0854 + 535 HC 17 DT H2'1 535 0.0718 + 536 HC 17 DT H2'2 536 0.0718 + 537 OS 17 DT O3' 537 -0.5232 ; qtot -15.31 +; residue 18 DT rtp DT3 q -0.7 + 538 P 18 DT P 538 1.1659 + 539 O2 18 DT O1P 539 -0.7761 + 540 O2 18 DT O2P 540 -0.7761 + 541 OS 18 DT O5' 541 -0.4954 + 542 CI 18 DT C5' 542 -0.0069 + 543 H1 18 DT H5'1 543 0.0754 + 544 H1 18 DT H5'2 544 0.0754 + 545 CT 18 DT C4' 545 0.1629 + 546 H1 18 DT H4' 546 0.1176 + 547 OS 18 DT O4' 547 -0.3691 + 548 CT 18 DT C1' 548 0.068 + 549 H2 18 DT H1' 549 0.1804 + 550 N* 18 DT N1 550 -0.0239 + 551 C2 18 DT C6 551 -0.2209 + 552 H4 18 DT H6 552 0.2607 + 553 C2 18 DT C5 553 0.0025 + 554 CT 18 DT C7 554 -0.2269 + 555 HC 18 DT H71 555 0.077 + 556 HC 18 DT H72 556 0.077 + 557 HC 18 DT H73 557 0.077 + 558 C 18 DT C4 558 0.5194 + 559 O 18 DT O4 559 -0.5563 + 560 NA 18 DT N3 560 -0.434 + 561 H 18 DT H3 561 0.342 + 562 C 18 DT C2 562 0.5677 + 563 O 18 DT O2 563 -0.5881 + 564 CE 18 DT C3' 564 0.0713 + 565 H1 18 DT H3' 565 0.0985 + 566 CT 18 DT C2' 566 -0.0854 + 567 HC 18 DT H2'1 567 0.0718 + 568 HC 18 DT H2'2 568 0.0718 + 569 OH 18 DT O3' 569 -0.6549 + 570 HO 18 DT H3T 570 0.4396 ; qtot -16 + +[ bonds ] +; ai aj funct c0 c1 c2 c3 + 1 2 1 + 2 3 1 + 3 4 1 + 3 5 1 + 3 6 1 + 6 7 1 + 6 8 1 + 6 25 1 + 8 9 1 + 9 10 1 + 9 11 1 + 9 27 1 + 11 12 1 + 11 24 1 + 12 13 1 + 12 14 1 + 14 15 1 + 15 16 1 + 15 24 1 + 16 17 1 + 16 20 1 + 17 18 1 + 17 19 1 + 20 21 1 + 21 22 1 + 21 23 1 + 23 24 1 + 25 26 1 + 25 27 1 + 25 30 1 + 27 28 1 + 27 29 1 + 30 31 1 + 31 32 1 + 31 33 1 + 31 34 1 + 34 35 1 + 35 36 1 + 35 37 1 + 35 38 1 + 38 39 1 + 38 40 1 + 38 57 1 + 40 41 1 + 41 42 1 + 41 43 1 + 41 59 1 + 43 44 1 + 43 56 1 + 44 45 1 + 44 46 1 + 46 47 1 + 47 48 1 + 47 56 1 + 48 49 1 + 48 52 1 + 49 50 1 + 49 51 1 + 52 53 1 + 53 54 1 + 53 55 1 + 55 56 1 + 57 58 1 + 57 59 1 + 57 62 1 + 59 60 1 + 59 61 1 + 62 63 1 + 63 64 1 + 63 65 1 + 63 66 1 + 66 67 1 + 67 68 1 + 67 69 1 + 67 70 1 + 70 71 1 + 70 72 1 + 70 89 1 + 72 73 1 + 73 74 1 + 73 75 1 + 73 91 1 + 75 76 1 + 75 88 1 + 76 77 1 + 76 78 1 + 78 79 1 + 79 80 1 + 79 88 1 + 80 81 1 + 80 84 1 + 81 82 1 + 81 83 1 + 84 85 1 + 85 86 1 + 85 87 1 + 87 88 1 + 89 90 1 + 89 91 1 + 89 94 1 + 91 92 1 + 91 93 1 + 94 95 1 + 95 96 1 + 95 97 1 + 95 98 1 + 98 99 1 + 99 100 1 + 99 101 1 + 99 102 1 + 102 103 1 + 102 104 1 + 102 122 1 + 104 105 1 + 105 106 1 + 105 107 1 + 105 124 1 + 107 108 1 + 107 121 1 + 108 109 1 + 108 110 1 + 110 111 1 + 111 112 1 + 111 121 1 + 112 113 1 + 112 114 1 + 114 115 1 + 114 116 1 + 116 117 1 + 116 120 1 + 117 118 1 + 117 119 1 + 120 121 1 + 122 123 1 + 122 124 1 + 122 127 1 + 124 125 1 + 124 126 1 + 127 128 1 + 128 129 1 + 128 130 1 + 128 131 1 + 131 132 1 + 132 133 1 + 132 134 1 + 132 135 1 + 135 136 1 + 135 137 1 + 135 155 1 + 137 138 1 + 138 139 1 + 138 140 1 + 138 157 1 + 140 141 1 + 140 154 1 + 141 142 1 + 141 143 1 + 143 144 1 + 144 145 1 + 144 154 1 + 145 146 1 + 145 147 1 + 147 148 1 + 147 149 1 + 149 150 1 + 149 153 1 + 150 151 1 + 150 152 1 + 153 154 1 + 155 156 1 + 155 157 1 + 155 160 1 + 157 158 1 + 157 159 1 + 160 161 1 + 161 162 1 + 161 163 1 + 161 164 1 + 164 165 1 + 165 166 1 + 165 167 1 + 165 168 1 + 168 169 1 + 168 170 1 + 168 185 1 + 170 171 1 + 171 172 1 + 171 173 1 + 171 187 1 + 173 174 1 + 173 183 1 + 174 175 1 + 174 176 1 + 176 177 1 + 176 178 1 + 178 179 1 + 178 182 1 + 179 180 1 + 179 181 1 + 182 183 1 + 183 184 1 + 185 186 1 + 185 187 1 + 185 190 1 + 187 188 1 + 187 189 1 + 190 191 1 + 191 192 1 + 191 193 1 + 191 194 1 + 194 195 1 + 195 196 1 + 195 197 1 + 195 198 1 + 198 199 1 + 198 200 1 + 198 215 1 + 200 201 1 + 201 202 1 + 201 203 1 + 201 217 1 + 203 204 1 + 203 213 1 + 204 205 1 + 204 206 1 + 206 207 1 + 206 208 1 + 208 209 1 + 208 212 1 + 209 210 1 + 209 211 1 + 212 213 1 + 213 214 1 + 215 216 1 + 215 217 1 + 215 220 1 + 217 218 1 + 217 219 1 + 220 221 1 + 221 222 1 + 221 223 1 + 221 224 1 + 224 225 1 + 225 226 1 + 225 227 1 + 225 228 1 + 228 229 1 + 228 230 1 + 228 247 1 + 230 231 1 + 231 232 1 + 231 233 1 + 231 249 1 + 233 234 1 + 233 245 1 + 234 235 1 + 234 236 1 + 236 237 1 + 236 241 1 + 237 238 1 + 237 239 1 + 237 240 1 + 241 242 1 + 241 243 1 + 243 244 1 + 243 245 1 + 245 246 1 + 247 248 1 + 247 249 1 + 247 252 1 + 249 250 1 + 249 251 1 + 252 253 1 + 253 254 1 + 253 255 1 + 253 256 1 + 256 257 1 + 257 258 1 + 257 259 1 + 257 260 1 + 260 261 1 + 260 262 1 + 260 279 1 + 262 263 1 + 263 264 1 + 263 265 1 + 263 281 1 + 265 266 1 + 265 277 1 + 266 267 1 + 266 268 1 + 268 269 1 + 268 273 1 + 269 270 1 + 269 271 1 + 269 272 1 + 273 274 1 + 273 275 1 + 275 276 1 + 275 277 1 + 277 278 1 + 279 280 1 + 279 281 1 + 279 284 1 + 281 282 1 + 281 283 1 + 284 285 1 + 286 287 1 + 287 288 1 + 288 289 1 + 288 290 1 + 288 291 1 + 291 292 1 + 291 293 1 + 291 310 1 + 293 294 1 + 294 295 1 + 294 296 1 + 294 312 1 + 296 297 1 + 296 309 1 + 297 298 1 + 297 299 1 + 299 300 1 + 300 301 1 + 300 309 1 + 301 302 1 + 301 305 1 + 302 303 1 + 302 304 1 + 305 306 1 + 306 307 1 + 306 308 1 + 308 309 1 + 310 311 1 + 310 312 1 + 310 315 1 + 312 313 1 + 312 314 1 + 315 316 1 + 316 317 1 + 316 318 1 + 316 319 1 + 319 320 1 + 320 321 1 + 320 322 1 + 320 323 1 + 323 324 1 + 323 325 1 + 323 342 1 + 325 326 1 + 326 327 1 + 326 328 1 + 326 344 1 + 328 329 1 + 328 341 1 + 329 330 1 + 329 331 1 + 331 332 1 + 332 333 1 + 332 341 1 + 333 334 1 + 333 337 1 + 334 335 1 + 334 336 1 + 337 338 1 + 338 339 1 + 338 340 1 + 340 341 1 + 342 343 1 + 342 344 1 + 342 347 1 + 344 345 1 + 344 346 1 + 347 348 1 + 348 349 1 + 348 350 1 + 348 351 1 + 351 352 1 + 352 353 1 + 352 354 1 + 352 355 1 + 355 356 1 + 355 357 1 + 355 375 1 + 357 358 1 + 358 359 1 + 358 360 1 + 358 377 1 + 360 361 1 + 360 374 1 + 361 362 1 + 361 363 1 + 363 364 1 + 364 365 1 + 364 374 1 + 365 366 1 + 365 367 1 + 367 368 1 + 367 369 1 + 369 370 1 + 369 373 1 + 370 371 1 + 370 372 1 + 373 374 1 + 375 376 1 + 375 377 1 + 375 380 1 + 377 378 1 + 377 379 1 + 380 381 1 + 381 382 1 + 381 383 1 + 381 384 1 + 384 385 1 + 385 386 1 + 385 387 1 + 385 388 1 + 388 389 1 + 388 390 1 + 388 408 1 + 390 391 1 + 391 392 1 + 391 393 1 + 391 410 1 + 393 394 1 + 393 407 1 + 394 395 1 + 394 396 1 + 396 397 1 + 397 398 1 + 397 407 1 + 398 399 1 + 398 400 1 + 400 401 1 + 400 402 1 + 402 403 1 + 402 406 1 + 403 404 1 + 403 405 1 + 406 407 1 + 408 409 1 + 408 410 1 + 408 413 1 + 410 411 1 + 410 412 1 + 413 414 1 + 414 415 1 + 414 416 1 + 414 417 1 + 417 418 1 + 418 419 1 + 418 420 1 + 418 421 1 + 421 422 1 + 421 423 1 + 421 438 1 + 423 424 1 + 424 425 1 + 424 426 1 + 424 440 1 + 426 427 1 + 426 436 1 + 427 428 1 + 427 429 1 + 429 430 1 + 429 431 1 + 431 432 1 + 431 435 1 + 432 433 1 + 432 434 1 + 435 436 1 + 436 437 1 + 438 439 1 + 438 440 1 + 438 443 1 + 440 441 1 + 440 442 1 + 443 444 1 + 444 445 1 + 444 446 1 + 444 447 1 + 447 448 1 + 448 449 1 + 448 450 1 + 448 451 1 + 451 452 1 + 451 453 1 + 451 468 1 + 453 454 1 + 454 455 1 + 454 456 1 + 454 470 1 + 456 457 1 + 456 466 1 + 457 458 1 + 457 459 1 + 459 460 1 + 459 461 1 + 461 462 1 + 461 465 1 + 462 463 1 + 462 464 1 + 465 466 1 + 466 467 1 + 468 469 1 + 468 470 1 + 468 473 1 + 470 471 1 + 470 472 1 + 473 474 1 + 474 475 1 + 474 476 1 + 474 477 1 + 477 478 1 + 478 479 1 + 478 480 1 + 478 481 1 + 481 482 1 + 481 483 1 + 481 500 1 + 483 484 1 + 484 485 1 + 484 486 1 + 484 502 1 + 486 487 1 + 486 498 1 + 487 488 1 + 487 489 1 + 489 490 1 + 489 494 1 + 490 491 1 + 490 492 1 + 490 493 1 + 494 495 1 + 494 496 1 + 496 497 1 + 496 498 1 + 498 499 1 + 500 501 1 + 500 502 1 + 500 505 1 + 502 503 1 + 502 504 1 + 505 506 1 + 506 507 1 + 506 508 1 + 506 509 1 + 509 510 1 + 510 511 1 + 510 512 1 + 510 513 1 + 513 514 1 + 513 515 1 + 513 532 1 + 515 516 1 + 516 517 1 + 516 518 1 + 516 534 1 + 518 519 1 + 518 530 1 + 519 520 1 + 519 521 1 + 521 522 1 + 521 526 1 + 522 523 1 + 522 524 1 + 522 525 1 + 526 527 1 + 526 528 1 + 528 529 1 + 528 530 1 + 530 531 1 + 532 533 1 + 532 534 1 + 532 537 1 + 534 535 1 + 534 536 1 + 537 538 1 + 538 539 1 + 538 540 1 + 538 541 1 + 541 542 1 + 542 543 1 + 542 544 1 + 542 545 1 + 545 546 1 + 545 547 1 + 545 564 1 + 547 548 1 + 548 549 1 + 548 550 1 + 548 566 1 + 550 551 1 + 550 562 1 + 551 552 1 + 551 553 1 + 553 554 1 + 553 558 1 + 554 555 1 + 554 556 1 + 554 557 1 + 558 559 1 + 558 560 1 + 560 561 1 + 560 562 1 + 562 563 1 + 564 565 1 + 564 566 1 + 564 569 1 + 566 567 1 + 566 568 1 + 569 570 1 + +[ pairs ] +; ai aj funct c0 c1 c2 c3 + 1 4 1 + 1 5 1 + 1 6 1 + 2 7 1 + 2 8 1 + 2 25 1 + 3 9 1 + 3 26 1 + 3 27 1 + 3 30 1 + 4 7 1 + 4 8 1 + 4 25 1 + 5 7 1 + 5 8 1 + 5 25 1 + 6 10 1 + 6 11 1 + 6 28 1 + 6 29 1 + 6 31 1 + 7 9 1 + 7 26 1 + 7 27 1 + 7 30 1 + 8 12 1 + 8 24 1 + 8 26 1 + 8 28 1 + 8 29 1 + 8 30 1 + 9 13 1 + 9 14 1 + 9 15 1 + 9 23 1 + 9 26 1 + 9 30 1 + 10 12 1 + 10 24 1 + 10 25 1 + 10 28 1 + 10 29 1 + 11 16 1 + 11 21 1 + 11 25 1 + 11 28 1 + 11 29 1 + 12 16 1 + 12 23 1 + 12 27 1 + 13 15 1 + 13 24 1 + 14 17 1 + 14 20 1 + 14 23 1 + 15 18 1 + 15 19 1 + 15 21 1 + 16 22 1 + 16 23 1 + 17 21 1 + 17 24 1 + 18 20 1 + 19 20 1 + 20 24 1 + 22 24 1 + 24 27 1 + 25 32 1 + 25 33 1 + 25 34 1 + 26 28 1 + 26 29 1 + 26 31 1 + 27 31 1 + 28 30 1 + 29 30 1 + 30 35 1 + 31 36 1 + 31 37 1 + 31 38 1 + 32 35 1 + 33 35 1 + 34 39 1 + 34 40 1 + 34 57 1 + 35 41 1 + 35 58 1 + 35 59 1 + 35 62 1 + 36 39 1 + 36 40 1 + 36 57 1 + 37 39 1 + 37 40 1 + 37 57 1 + 38 42 1 + 38 43 1 + 38 60 1 + 38 61 1 + 38 63 1 + 39 41 1 + 39 58 1 + 39 59 1 + 39 62 1 + 40 44 1 + 40 56 1 + 40 58 1 + 40 60 1 + 40 61 1 + 40 62 1 + 41 45 1 + 41 46 1 + 41 47 1 + 41 55 1 + 41 58 1 + 41 62 1 + 42 44 1 + 42 56 1 + 42 57 1 + 42 60 1 + 42 61 1 + 43 48 1 + 43 53 1 + 43 57 1 + 43 60 1 + 43 61 1 + 44 48 1 + 44 55 1 + 44 59 1 + 45 47 1 + 45 56 1 + 46 49 1 + 46 52 1 + 46 55 1 + 47 50 1 + 47 51 1 + 47 53 1 + 48 54 1 + 48 55 1 + 49 53 1 + 49 56 1 + 50 52 1 + 51 52 1 + 52 56 1 + 54 56 1 + 56 59 1 + 57 64 1 + 57 65 1 + 57 66 1 + 58 60 1 + 58 61 1 + 58 63 1 + 59 63 1 + 60 62 1 + 61 62 1 + 62 67 1 + 63 68 1 + 63 69 1 + 63 70 1 + 64 67 1 + 65 67 1 + 66 71 1 + 66 72 1 + 66 89 1 + 67 73 1 + 67 90 1 + 67 91 1 + 67 94 1 + 68 71 1 + 68 72 1 + 68 89 1 + 69 71 1 + 69 72 1 + 69 89 1 + 70 74 1 + 70 75 1 + 70 92 1 + 70 93 1 + 70 95 1 + 71 73 1 + 71 90 1 + 71 91 1 + 71 94 1 + 72 76 1 + 72 88 1 + 72 90 1 + 72 92 1 + 72 93 1 + 72 94 1 + 73 77 1 + 73 78 1 + 73 79 1 + 73 87 1 + 73 90 1 + 73 94 1 + 74 76 1 + 74 88 1 + 74 89 1 + 74 92 1 + 74 93 1 + 75 80 1 + 75 85 1 + 75 89 1 + 75 92 1 + 75 93 1 + 76 80 1 + 76 87 1 + 76 91 1 + 77 79 1 + 77 88 1 + 78 81 1 + 78 84 1 + 78 87 1 + 79 82 1 + 79 83 1 + 79 85 1 + 80 86 1 + 80 87 1 + 81 85 1 + 81 88 1 + 82 84 1 + 83 84 1 + 84 88 1 + 86 88 1 + 88 91 1 + 89 96 1 + 89 97 1 + 89 98 1 + 90 92 1 + 90 93 1 + 90 95 1 + 91 95 1 + 92 94 1 + 93 94 1 + 94 99 1 + 95 100 1 + 95 101 1 + 95 102 1 + 96 99 1 + 97 99 1 + 98 103 1 + 98 104 1 + 98 122 1 + 99 105 1 + 99 123 1 + 99 124 1 + 99 127 1 + 100 103 1 + 100 104 1 + 100 122 1 + 101 103 1 + 101 104 1 + 101 122 1 + 102 106 1 + 102 107 1 + 102 125 1 + 102 126 1 + 102 128 1 + 103 105 1 + 103 123 1 + 103 124 1 + 103 127 1 + 104 108 1 + 104 121 1 + 104 123 1 + 104 125 1 + 104 126 1 + 104 127 1 + 105 109 1 + 105 110 1 + 105 111 1 + 105 120 1 + 105 123 1 + 105 127 1 + 106 108 1 + 106 121 1 + 106 122 1 + 106 125 1 + 106 126 1 + 107 112 1 + 107 116 1 + 107 122 1 + 107 125 1 + 107 126 1 + 108 112 1 + 108 120 1 + 108 124 1 + 109 111 1 + 109 121 1 + 110 113 1 + 110 114 1 + 110 120 1 + 111 115 1 + 111 116 1 + 112 117 1 + 112 120 1 + 113 115 1 + 113 116 1 + 113 121 1 + 114 118 1 + 114 119 1 + 114 121 1 + 115 117 1 + 115 120 1 + 117 121 1 + 118 120 1 + 119 120 1 + 121 124 1 + 122 129 1 + 122 130 1 + 122 131 1 + 123 125 1 + 123 126 1 + 123 128 1 + 124 128 1 + 125 127 1 + 126 127 1 + 127 132 1 + 128 133 1 + 128 134 1 + 128 135 1 + 129 132 1 + 130 132 1 + 131 136 1 + 131 137 1 + 131 155 1 + 132 138 1 + 132 156 1 + 132 157 1 + 132 160 1 + 133 136 1 + 133 137 1 + 133 155 1 + 134 136 1 + 134 137 1 + 134 155 1 + 135 139 1 + 135 140 1 + 135 158 1 + 135 159 1 + 135 161 1 + 136 138 1 + 136 156 1 + 136 157 1 + 136 160 1 + 137 141 1 + 137 154 1 + 137 156 1 + 137 158 1 + 137 159 1 + 137 160 1 + 138 142 1 + 138 143 1 + 138 144 1 + 138 153 1 + 138 156 1 + 138 160 1 + 139 141 1 + 139 154 1 + 139 155 1 + 139 158 1 + 139 159 1 + 140 145 1 + 140 149 1 + 140 155 1 + 140 158 1 + 140 159 1 + 141 145 1 + 141 153 1 + 141 157 1 + 142 144 1 + 142 154 1 + 143 146 1 + 143 147 1 + 143 153 1 + 144 148 1 + 144 149 1 + 145 150 1 + 145 153 1 + 146 148 1 + 146 149 1 + 146 154 1 + 147 151 1 + 147 152 1 + 147 154 1 + 148 150 1 + 148 153 1 + 150 154 1 + 151 153 1 + 152 153 1 + 154 157 1 + 155 162 1 + 155 163 1 + 155 164 1 + 156 158 1 + 156 159 1 + 156 161 1 + 157 161 1 + 158 160 1 + 159 160 1 + 160 165 1 + 161 166 1 + 161 167 1 + 161 168 1 + 162 165 1 + 163 165 1 + 164 169 1 + 164 170 1 + 164 185 1 + 165 171 1 + 165 186 1 + 165 187 1 + 165 190 1 + 166 169 1 + 166 170 1 + 166 185 1 + 167 169 1 + 167 170 1 + 167 185 1 + 168 172 1 + 168 173 1 + 168 188 1 + 168 189 1 + 168 191 1 + 169 171 1 + 169 186 1 + 169 187 1 + 169 190 1 + 170 174 1 + 170 183 1 + 170 186 1 + 170 188 1 + 170 189 1 + 170 190 1 + 171 175 1 + 171 176 1 + 171 182 1 + 171 184 1 + 171 186 1 + 171 190 1 + 172 174 1 + 172 183 1 + 172 185 1 + 172 188 1 + 172 189 1 + 173 177 1 + 173 178 1 + 173 185 1 + 173 188 1 + 173 189 1 + 174 179 1 + 174 182 1 + 174 184 1 + 174 187 1 + 175 177 1 + 175 178 1 + 175 183 1 + 176 180 1 + 176 181 1 + 176 183 1 + 177 179 1 + 177 182 1 + 178 184 1 + 179 183 1 + 180 182 1 + 181 182 1 + 183 187 1 + 185 192 1 + 185 193 1 + 185 194 1 + 186 188 1 + 186 189 1 + 186 191 1 + 187 191 1 + 188 190 1 + 189 190 1 + 190 195 1 + 191 196 1 + 191 197 1 + 191 198 1 + 192 195 1 + 193 195 1 + 194 199 1 + 194 200 1 + 194 215 1 + 195 201 1 + 195 216 1 + 195 217 1 + 195 220 1 + 196 199 1 + 196 200 1 + 196 215 1 + 197 199 1 + 197 200 1 + 197 215 1 + 198 202 1 + 198 203 1 + 198 218 1 + 198 219 1 + 198 221 1 + 199 201 1 + 199 216 1 + 199 217 1 + 199 220 1 + 200 204 1 + 200 213 1 + 200 216 1 + 200 218 1 + 200 219 1 + 200 220 1 + 201 205 1 + 201 206 1 + 201 212 1 + 201 214 1 + 201 216 1 + 201 220 1 + 202 204 1 + 202 213 1 + 202 215 1 + 202 218 1 + 202 219 1 + 203 207 1 + 203 208 1 + 203 215 1 + 203 218 1 + 203 219 1 + 204 209 1 + 204 212 1 + 204 214 1 + 204 217 1 + 205 207 1 + 205 208 1 + 205 213 1 + 206 210 1 + 206 211 1 + 206 213 1 + 207 209 1 + 207 212 1 + 208 214 1 + 209 213 1 + 210 212 1 + 211 212 1 + 213 217 1 + 215 222 1 + 215 223 1 + 215 224 1 + 216 218 1 + 216 219 1 + 216 221 1 + 217 221 1 + 218 220 1 + 219 220 1 + 220 225 1 + 221 226 1 + 221 227 1 + 221 228 1 + 222 225 1 + 223 225 1 + 224 229 1 + 224 230 1 + 224 247 1 + 225 231 1 + 225 248 1 + 225 249 1 + 225 252 1 + 226 229 1 + 226 230 1 + 226 247 1 + 227 229 1 + 227 230 1 + 227 247 1 + 228 232 1 + 228 233 1 + 228 250 1 + 228 251 1 + 228 253 1 + 229 231 1 + 229 248 1 + 229 249 1 + 229 252 1 + 230 234 1 + 230 245 1 + 230 248 1 + 230 250 1 + 230 251 1 + 230 252 1 + 231 235 1 + 231 236 1 + 231 243 1 + 231 246 1 + 231 248 1 + 231 252 1 + 232 234 1 + 232 245 1 + 232 247 1 + 232 250 1 + 232 251 1 + 233 237 1 + 233 241 1 + 233 244 1 + 233 247 1 + 233 250 1 + 233 251 1 + 234 238 1 + 234 239 1 + 234 240 1 + 234 242 1 + 234 243 1 + 234 246 1 + 234 249 1 + 235 237 1 + 235 241 1 + 235 245 1 + 236 244 1 + 236 245 1 + 237 242 1 + 237 243 1 + 238 241 1 + 239 241 1 + 240 241 1 + 241 246 1 + 242 244 1 + 242 245 1 + 244 246 1 + 245 249 1 + 247 254 1 + 247 255 1 + 247 256 1 + 248 250 1 + 248 251 1 + 248 253 1 + 249 253 1 + 250 252 1 + 251 252 1 + 252 257 1 + 253 258 1 + 253 259 1 + 253 260 1 + 254 257 1 + 255 257 1 + 256 261 1 + 256 262 1 + 256 279 1 + 257 263 1 + 257 280 1 + 257 281 1 + 257 284 1 + 258 261 1 + 258 262 1 + 258 279 1 + 259 261 1 + 259 262 1 + 259 279 1 + 260 264 1 + 260 265 1 + 260 282 1 + 260 283 1 + 260 285 1 + 261 263 1 + 261 280 1 + 261 281 1 + 261 284 1 + 262 266 1 + 262 277 1 + 262 280 1 + 262 282 1 + 262 283 1 + 262 284 1 + 263 267 1 + 263 268 1 + 263 275 1 + 263 278 1 + 263 280 1 + 263 284 1 + 264 266 1 + 264 277 1 + 264 279 1 + 264 282 1 + 264 283 1 + 265 269 1 + 265 273 1 + 265 276 1 + 265 279 1 + 265 282 1 + 265 283 1 + 266 270 1 + 266 271 1 + 266 272 1 + 266 274 1 + 266 275 1 + 266 278 1 + 266 281 1 + 267 269 1 + 267 273 1 + 267 277 1 + 268 276 1 + 268 277 1 + 269 274 1 + 269 275 1 + 270 273 1 + 271 273 1 + 272 273 1 + 273 278 1 + 274 276 1 + 274 277 1 + 276 278 1 + 277 281 1 + 280 282 1 + 280 283 1 + 280 285 1 + 281 285 1 + 282 284 1 + 283 284 1 + 286 289 1 + 286 290 1 + 286 291 1 + 287 292 1 + 287 293 1 + 287 310 1 + 288 294 1 + 288 311 1 + 288 312 1 + 288 315 1 + 289 292 1 + 289 293 1 + 289 310 1 + 290 292 1 + 290 293 1 + 290 310 1 + 291 295 1 + 291 296 1 + 291 313 1 + 291 314 1 + 291 316 1 + 292 294 1 + 292 311 1 + 292 312 1 + 292 315 1 + 293 297 1 + 293 309 1 + 293 311 1 + 293 313 1 + 293 314 1 + 293 315 1 + 294 298 1 + 294 299 1 + 294 300 1 + 294 308 1 + 294 311 1 + 294 315 1 + 295 297 1 + 295 309 1 + 295 310 1 + 295 313 1 + 295 314 1 + 296 301 1 + 296 306 1 + 296 310 1 + 296 313 1 + 296 314 1 + 297 301 1 + 297 308 1 + 297 312 1 + 298 300 1 + 298 309 1 + 299 302 1 + 299 305 1 + 299 308 1 + 300 303 1 + 300 304 1 + 300 306 1 + 301 307 1 + 301 308 1 + 302 306 1 + 302 309 1 + 303 305 1 + 304 305 1 + 305 309 1 + 307 309 1 + 309 312 1 + 310 317 1 + 310 318 1 + 310 319 1 + 311 313 1 + 311 314 1 + 311 316 1 + 312 316 1 + 313 315 1 + 314 315 1 + 315 320 1 + 316 321 1 + 316 322 1 + 316 323 1 + 317 320 1 + 318 320 1 + 319 324 1 + 319 325 1 + 319 342 1 + 320 326 1 + 320 343 1 + 320 344 1 + 320 347 1 + 321 324 1 + 321 325 1 + 321 342 1 + 322 324 1 + 322 325 1 + 322 342 1 + 323 327 1 + 323 328 1 + 323 345 1 + 323 346 1 + 323 348 1 + 324 326 1 + 324 343 1 + 324 344 1 + 324 347 1 + 325 329 1 + 325 341 1 + 325 343 1 + 325 345 1 + 325 346 1 + 325 347 1 + 326 330 1 + 326 331 1 + 326 332 1 + 326 340 1 + 326 343 1 + 326 347 1 + 327 329 1 + 327 341 1 + 327 342 1 + 327 345 1 + 327 346 1 + 328 333 1 + 328 338 1 + 328 342 1 + 328 345 1 + 328 346 1 + 329 333 1 + 329 340 1 + 329 344 1 + 330 332 1 + 330 341 1 + 331 334 1 + 331 337 1 + 331 340 1 + 332 335 1 + 332 336 1 + 332 338 1 + 333 339 1 + 333 340 1 + 334 338 1 + 334 341 1 + 335 337 1 + 336 337 1 + 337 341 1 + 339 341 1 + 341 344 1 + 342 349 1 + 342 350 1 + 342 351 1 + 343 345 1 + 343 346 1 + 343 348 1 + 344 348 1 + 345 347 1 + 346 347 1 + 347 352 1 + 348 353 1 + 348 354 1 + 348 355 1 + 349 352 1 + 350 352 1 + 351 356 1 + 351 357 1 + 351 375 1 + 352 358 1 + 352 376 1 + 352 377 1 + 352 380 1 + 353 356 1 + 353 357 1 + 353 375 1 + 354 356 1 + 354 357 1 + 354 375 1 + 355 359 1 + 355 360 1 + 355 378 1 + 355 379 1 + 355 381 1 + 356 358 1 + 356 376 1 + 356 377 1 + 356 380 1 + 357 361 1 + 357 374 1 + 357 376 1 + 357 378 1 + 357 379 1 + 357 380 1 + 358 362 1 + 358 363 1 + 358 364 1 + 358 373 1 + 358 376 1 + 358 380 1 + 359 361 1 + 359 374 1 + 359 375 1 + 359 378 1 + 359 379 1 + 360 365 1 + 360 369 1 + 360 375 1 + 360 378 1 + 360 379 1 + 361 365 1 + 361 373 1 + 361 377 1 + 362 364 1 + 362 374 1 + 363 366 1 + 363 367 1 + 363 373 1 + 364 368 1 + 364 369 1 + 365 370 1 + 365 373 1 + 366 368 1 + 366 369 1 + 366 374 1 + 367 371 1 + 367 372 1 + 367 374 1 + 368 370 1 + 368 373 1 + 370 374 1 + 371 373 1 + 372 373 1 + 374 377 1 + 375 382 1 + 375 383 1 + 375 384 1 + 376 378 1 + 376 379 1 + 376 381 1 + 377 381 1 + 378 380 1 + 379 380 1 + 380 385 1 + 381 386 1 + 381 387 1 + 381 388 1 + 382 385 1 + 383 385 1 + 384 389 1 + 384 390 1 + 384 408 1 + 385 391 1 + 385 409 1 + 385 410 1 + 385 413 1 + 386 389 1 + 386 390 1 + 386 408 1 + 387 389 1 + 387 390 1 + 387 408 1 + 388 392 1 + 388 393 1 + 388 411 1 + 388 412 1 + 388 414 1 + 389 391 1 + 389 409 1 + 389 410 1 + 389 413 1 + 390 394 1 + 390 407 1 + 390 409 1 + 390 411 1 + 390 412 1 + 390 413 1 + 391 395 1 + 391 396 1 + 391 397 1 + 391 406 1 + 391 409 1 + 391 413 1 + 392 394 1 + 392 407 1 + 392 408 1 + 392 411 1 + 392 412 1 + 393 398 1 + 393 402 1 + 393 408 1 + 393 411 1 + 393 412 1 + 394 398 1 + 394 406 1 + 394 410 1 + 395 397 1 + 395 407 1 + 396 399 1 + 396 400 1 + 396 406 1 + 397 401 1 + 397 402 1 + 398 403 1 + 398 406 1 + 399 401 1 + 399 402 1 + 399 407 1 + 400 404 1 + 400 405 1 + 400 407 1 + 401 403 1 + 401 406 1 + 403 407 1 + 404 406 1 + 405 406 1 + 407 410 1 + 408 415 1 + 408 416 1 + 408 417 1 + 409 411 1 + 409 412 1 + 409 414 1 + 410 414 1 + 411 413 1 + 412 413 1 + 413 418 1 + 414 419 1 + 414 420 1 + 414 421 1 + 415 418 1 + 416 418 1 + 417 422 1 + 417 423 1 + 417 438 1 + 418 424 1 + 418 439 1 + 418 440 1 + 418 443 1 + 419 422 1 + 419 423 1 + 419 438 1 + 420 422 1 + 420 423 1 + 420 438 1 + 421 425 1 + 421 426 1 + 421 441 1 + 421 442 1 + 421 444 1 + 422 424 1 + 422 439 1 + 422 440 1 + 422 443 1 + 423 427 1 + 423 436 1 + 423 439 1 + 423 441 1 + 423 442 1 + 423 443 1 + 424 428 1 + 424 429 1 + 424 435 1 + 424 437 1 + 424 439 1 + 424 443 1 + 425 427 1 + 425 436 1 + 425 438 1 + 425 441 1 + 425 442 1 + 426 430 1 + 426 431 1 + 426 438 1 + 426 441 1 + 426 442 1 + 427 432 1 + 427 435 1 + 427 437 1 + 427 440 1 + 428 430 1 + 428 431 1 + 428 436 1 + 429 433 1 + 429 434 1 + 429 436 1 + 430 432 1 + 430 435 1 + 431 437 1 + 432 436 1 + 433 435 1 + 434 435 1 + 436 440 1 + 438 445 1 + 438 446 1 + 438 447 1 + 439 441 1 + 439 442 1 + 439 444 1 + 440 444 1 + 441 443 1 + 442 443 1 + 443 448 1 + 444 449 1 + 444 450 1 + 444 451 1 + 445 448 1 + 446 448 1 + 447 452 1 + 447 453 1 + 447 468 1 + 448 454 1 + 448 469 1 + 448 470 1 + 448 473 1 + 449 452 1 + 449 453 1 + 449 468 1 + 450 452 1 + 450 453 1 + 450 468 1 + 451 455 1 + 451 456 1 + 451 471 1 + 451 472 1 + 451 474 1 + 452 454 1 + 452 469 1 + 452 470 1 + 452 473 1 + 453 457 1 + 453 466 1 + 453 469 1 + 453 471 1 + 453 472 1 + 453 473 1 + 454 458 1 + 454 459 1 + 454 465 1 + 454 467 1 + 454 469 1 + 454 473 1 + 455 457 1 + 455 466 1 + 455 468 1 + 455 471 1 + 455 472 1 + 456 460 1 + 456 461 1 + 456 468 1 + 456 471 1 + 456 472 1 + 457 462 1 + 457 465 1 + 457 467 1 + 457 470 1 + 458 460 1 + 458 461 1 + 458 466 1 + 459 463 1 + 459 464 1 + 459 466 1 + 460 462 1 + 460 465 1 + 461 467 1 + 462 466 1 + 463 465 1 + 464 465 1 + 466 470 1 + 468 475 1 + 468 476 1 + 468 477 1 + 469 471 1 + 469 472 1 + 469 474 1 + 470 474 1 + 471 473 1 + 472 473 1 + 473 478 1 + 474 479 1 + 474 480 1 + 474 481 1 + 475 478 1 + 476 478 1 + 477 482 1 + 477 483 1 + 477 500 1 + 478 484 1 + 478 501 1 + 478 502 1 + 478 505 1 + 479 482 1 + 479 483 1 + 479 500 1 + 480 482 1 + 480 483 1 + 480 500 1 + 481 485 1 + 481 486 1 + 481 503 1 + 481 504 1 + 481 506 1 + 482 484 1 + 482 501 1 + 482 502 1 + 482 505 1 + 483 487 1 + 483 498 1 + 483 501 1 + 483 503 1 + 483 504 1 + 483 505 1 + 484 488 1 + 484 489 1 + 484 496 1 + 484 499 1 + 484 501 1 + 484 505 1 + 485 487 1 + 485 498 1 + 485 500 1 + 485 503 1 + 485 504 1 + 486 490 1 + 486 494 1 + 486 497 1 + 486 500 1 + 486 503 1 + 486 504 1 + 487 491 1 + 487 492 1 + 487 493 1 + 487 495 1 + 487 496 1 + 487 499 1 + 487 502 1 + 488 490 1 + 488 494 1 + 488 498 1 + 489 497 1 + 489 498 1 + 490 495 1 + 490 496 1 + 491 494 1 + 492 494 1 + 493 494 1 + 494 499 1 + 495 497 1 + 495 498 1 + 497 499 1 + 498 502 1 + 500 507 1 + 500 508 1 + 500 509 1 + 501 503 1 + 501 504 1 + 501 506 1 + 502 506 1 + 503 505 1 + 504 505 1 + 505 510 1 + 506 511 1 + 506 512 1 + 506 513 1 + 507 510 1 + 508 510 1 + 509 514 1 + 509 515 1 + 509 532 1 + 510 516 1 + 510 533 1 + 510 534 1 + 510 537 1 + 511 514 1 + 511 515 1 + 511 532 1 + 512 514 1 + 512 515 1 + 512 532 1 + 513 517 1 + 513 518 1 + 513 535 1 + 513 536 1 + 513 538 1 + 514 516 1 + 514 533 1 + 514 534 1 + 514 537 1 + 515 519 1 + 515 530 1 + 515 533 1 + 515 535 1 + 515 536 1 + 515 537 1 + 516 520 1 + 516 521 1 + 516 528 1 + 516 531 1 + 516 533 1 + 516 537 1 + 517 519 1 + 517 530 1 + 517 532 1 + 517 535 1 + 517 536 1 + 518 522 1 + 518 526 1 + 518 529 1 + 518 532 1 + 518 535 1 + 518 536 1 + 519 523 1 + 519 524 1 + 519 525 1 + 519 527 1 + 519 528 1 + 519 531 1 + 519 534 1 + 520 522 1 + 520 526 1 + 520 530 1 + 521 529 1 + 521 530 1 + 522 527 1 + 522 528 1 + 523 526 1 + 524 526 1 + 525 526 1 + 526 531 1 + 527 529 1 + 527 530 1 + 529 531 1 + 530 534 1 + 532 539 1 + 532 540 1 + 532 541 1 + 533 535 1 + 533 536 1 + 533 538 1 + 534 538 1 + 535 537 1 + 536 537 1 + 537 542 1 + 538 543 1 + 538 544 1 + 538 545 1 + 539 542 1 + 540 542 1 + 541 546 1 + 541 547 1 + 541 564 1 + 542 548 1 + 542 565 1 + 542 566 1 + 542 569 1 + 543 546 1 + 543 547 1 + 543 564 1 + 544 546 1 + 544 547 1 + 544 564 1 + 545 549 1 + 545 550 1 + 545 567 1 + 545 568 1 + 545 570 1 + 546 548 1 + 546 565 1 + 546 566 1 + 546 569 1 + 547 551 1 + 547 562 1 + 547 565 1 + 547 567 1 + 547 568 1 + 547 569 1 + 548 552 1 + 548 553 1 + 548 560 1 + 548 563 1 + 548 565 1 + 548 569 1 + 549 551 1 + 549 562 1 + 549 564 1 + 549 567 1 + 549 568 1 + 550 554 1 + 550 558 1 + 550 561 1 + 550 564 1 + 550 567 1 + 550 568 1 + 551 555 1 + 551 556 1 + 551 557 1 + 551 559 1 + 551 560 1 + 551 563 1 + 551 566 1 + 552 554 1 + 552 558 1 + 552 562 1 + 553 561 1 + 553 562 1 + 554 559 1 + 554 560 1 + 555 558 1 + 556 558 1 + 557 558 1 + 558 563 1 + 559 561 1 + 559 562 1 + 561 563 1 + 562 566 1 + 565 567 1 + 565 568 1 + 565 570 1 + 566 570 1 + 567 569 1 + 568 569 1 + +[ angles ] +; ai aj ak funct c0 c1 c2 c3 + 1 2 3 1 + 2 3 4 1 + 2 3 5 1 + 2 3 6 1 + 4 3 5 1 + 4 3 6 1 + 5 3 6 1 + 3 6 7 1 + 3 6 8 1 + 3 6 25 1 + 7 6 8 1 + 7 6 25 1 + 8 6 25 1 + 6 8 9 1 + 8 9 10 1 + 8 9 11 1 + 8 9 27 1 + 10 9 11 1 + 10 9 27 1 + 11 9 27 1 + 9 11 12 1 + 9 11 24 1 + 12 11 24 1 + 11 12 13 1 + 11 12 14 1 + 13 12 14 1 + 12 14 15 1 + 14 15 16 1 + 14 15 24 1 + 16 15 24 1 + 15 16 17 1 + 15 16 20 1 + 17 16 20 1 + 16 17 18 1 + 16 17 19 1 + 18 17 19 1 + 16 20 21 1 + 20 21 22 1 + 20 21 23 1 + 22 21 23 1 + 21 23 24 1 + 11 24 15 1 + 11 24 23 1 + 15 24 23 1 + 6 25 26 1 + 6 25 27 1 + 6 25 30 1 + 26 25 27 1 + 26 25 30 1 + 27 25 30 1 + 9 27 25 1 + 9 27 28 1 + 9 27 29 1 + 25 27 28 1 + 25 27 29 1 + 28 27 29 1 + 25 30 31 1 + 30 31 32 1 + 30 31 33 1 + 30 31 34 1 + 32 31 33 1 + 32 31 34 1 + 33 31 34 1 + 31 34 35 1 + 34 35 36 1 + 34 35 37 1 + 34 35 38 1 + 36 35 37 1 + 36 35 38 1 + 37 35 38 1 + 35 38 39 1 + 35 38 40 1 + 35 38 57 1 + 39 38 40 1 + 39 38 57 1 + 40 38 57 1 + 38 40 41 1 + 40 41 42 1 + 40 41 43 1 + 40 41 59 1 + 42 41 43 1 + 42 41 59 1 + 43 41 59 1 + 41 43 44 1 + 41 43 56 1 + 44 43 56 1 + 43 44 45 1 + 43 44 46 1 + 45 44 46 1 + 44 46 47 1 + 46 47 48 1 + 46 47 56 1 + 48 47 56 1 + 47 48 49 1 + 47 48 52 1 + 49 48 52 1 + 48 49 50 1 + 48 49 51 1 + 50 49 51 1 + 48 52 53 1 + 52 53 54 1 + 52 53 55 1 + 54 53 55 1 + 53 55 56 1 + 43 56 47 1 + 43 56 55 1 + 47 56 55 1 + 38 57 58 1 + 38 57 59 1 + 38 57 62 1 + 58 57 59 1 + 58 57 62 1 + 59 57 62 1 + 41 59 57 1 + 41 59 60 1 + 41 59 61 1 + 57 59 60 1 + 57 59 61 1 + 60 59 61 1 + 57 62 63 1 + 62 63 64 1 + 62 63 65 1 + 62 63 66 1 + 64 63 65 1 + 64 63 66 1 + 65 63 66 1 + 63 66 67 1 + 66 67 68 1 + 66 67 69 1 + 66 67 70 1 + 68 67 69 1 + 68 67 70 1 + 69 67 70 1 + 67 70 71 1 + 67 70 72 1 + 67 70 89 1 + 71 70 72 1 + 71 70 89 1 + 72 70 89 1 + 70 72 73 1 + 72 73 74 1 + 72 73 75 1 + 72 73 91 1 + 74 73 75 1 + 74 73 91 1 + 75 73 91 1 + 73 75 76 1 + 73 75 88 1 + 76 75 88 1 + 75 76 77 1 + 75 76 78 1 + 77 76 78 1 + 76 78 79 1 + 78 79 80 1 + 78 79 88 1 + 80 79 88 1 + 79 80 81 1 + 79 80 84 1 + 81 80 84 1 + 80 81 82 1 + 80 81 83 1 + 82 81 83 1 + 80 84 85 1 + 84 85 86 1 + 84 85 87 1 + 86 85 87 1 + 85 87 88 1 + 75 88 79 1 + 75 88 87 1 + 79 88 87 1 + 70 89 90 1 + 70 89 91 1 + 70 89 94 1 + 90 89 91 1 + 90 89 94 1 + 91 89 94 1 + 73 91 89 1 + 73 91 92 1 + 73 91 93 1 + 89 91 92 1 + 89 91 93 1 + 92 91 93 1 + 89 94 95 1 + 94 95 96 1 + 94 95 97 1 + 94 95 98 1 + 96 95 97 1 + 96 95 98 1 + 97 95 98 1 + 95 98 99 1 + 98 99 100 1 + 98 99 101 1 + 98 99 102 1 + 100 99 101 1 + 100 99 102 1 + 101 99 102 1 + 99 102 103 1 + 99 102 104 1 + 99 102 122 1 + 103 102 104 1 + 103 102 122 1 + 104 102 122 1 + 102 104 105 1 + 104 105 106 1 + 104 105 107 1 + 104 105 124 1 + 106 105 107 1 + 106 105 124 1 + 107 105 124 1 + 105 107 108 1 + 105 107 121 1 + 108 107 121 1 + 107 108 109 1 + 107 108 110 1 + 109 108 110 1 + 108 110 111 1 + 110 111 112 1 + 110 111 121 1 + 112 111 121 1 + 111 112 113 1 + 111 112 114 1 + 113 112 114 1 + 112 114 115 1 + 112 114 116 1 + 115 114 116 1 + 114 116 117 1 + 114 116 120 1 + 117 116 120 1 + 116 117 118 1 + 116 117 119 1 + 118 117 119 1 + 116 120 121 1 + 107 121 111 1 + 107 121 120 1 + 111 121 120 1 + 102 122 123 1 + 102 122 124 1 + 102 122 127 1 + 123 122 124 1 + 123 122 127 1 + 124 122 127 1 + 105 124 122 1 + 105 124 125 1 + 105 124 126 1 + 122 124 125 1 + 122 124 126 1 + 125 124 126 1 + 122 127 128 1 + 127 128 129 1 + 127 128 130 1 + 127 128 131 1 + 129 128 130 1 + 129 128 131 1 + 130 128 131 1 + 128 131 132 1 + 131 132 133 1 + 131 132 134 1 + 131 132 135 1 + 133 132 134 1 + 133 132 135 1 + 134 132 135 1 + 132 135 136 1 + 132 135 137 1 + 132 135 155 1 + 136 135 137 1 + 136 135 155 1 + 137 135 155 1 + 135 137 138 1 + 137 138 139 1 + 137 138 140 1 + 137 138 157 1 + 139 138 140 1 + 139 138 157 1 + 140 138 157 1 + 138 140 141 1 + 138 140 154 1 + 141 140 154 1 + 140 141 142 1 + 140 141 143 1 + 142 141 143 1 + 141 143 144 1 + 143 144 145 1 + 143 144 154 1 + 145 144 154 1 + 144 145 146 1 + 144 145 147 1 + 146 145 147 1 + 145 147 148 1 + 145 147 149 1 + 148 147 149 1 + 147 149 150 1 + 147 149 153 1 + 150 149 153 1 + 149 150 151 1 + 149 150 152 1 + 151 150 152 1 + 149 153 154 1 + 140 154 144 1 + 140 154 153 1 + 144 154 153 1 + 135 155 156 1 + 135 155 157 1 + 135 155 160 1 + 156 155 157 1 + 156 155 160 1 + 157 155 160 1 + 138 157 155 1 + 138 157 158 1 + 138 157 159 1 + 155 157 158 1 + 155 157 159 1 + 158 157 159 1 + 155 160 161 1 + 160 161 162 1 + 160 161 163 1 + 160 161 164 1 + 162 161 163 1 + 162 161 164 1 + 163 161 164 1 + 161 164 165 1 + 164 165 166 1 + 164 165 167 1 + 164 165 168 1 + 166 165 167 1 + 166 165 168 1 + 167 165 168 1 + 165 168 169 1 + 165 168 170 1 + 165 168 185 1 + 169 168 170 1 + 169 168 185 1 + 170 168 185 1 + 168 170 171 1 + 170 171 172 1 + 170 171 173 1 + 170 171 187 1 + 172 171 173 1 + 172 171 187 1 + 173 171 187 1 + 171 173 174 1 + 171 173 183 1 + 174 173 183 1 + 173 174 175 1 + 173 174 176 1 + 175 174 176 1 + 174 176 177 1 + 174 176 178 1 + 177 176 178 1 + 176 178 179 1 + 176 178 182 1 + 179 178 182 1 + 178 179 180 1 + 178 179 181 1 + 180 179 181 1 + 178 182 183 1 + 173 183 182 1 + 173 183 184 1 + 182 183 184 1 + 168 185 186 1 + 168 185 187 1 + 168 185 190 1 + 186 185 187 1 + 186 185 190 1 + 187 185 190 1 + 171 187 185 1 + 171 187 188 1 + 171 187 189 1 + 185 187 188 1 + 185 187 189 1 + 188 187 189 1 + 185 190 191 1 + 190 191 192 1 + 190 191 193 1 + 190 191 194 1 + 192 191 193 1 + 192 191 194 1 + 193 191 194 1 + 191 194 195 1 + 194 195 196 1 + 194 195 197 1 + 194 195 198 1 + 196 195 197 1 + 196 195 198 1 + 197 195 198 1 + 195 198 199 1 + 195 198 200 1 + 195 198 215 1 + 199 198 200 1 + 199 198 215 1 + 200 198 215 1 + 198 200 201 1 + 200 201 202 1 + 200 201 203 1 + 200 201 217 1 + 202 201 203 1 + 202 201 217 1 + 203 201 217 1 + 201 203 204 1 + 201 203 213 1 + 204 203 213 1 + 203 204 205 1 + 203 204 206 1 + 205 204 206 1 + 204 206 207 1 + 204 206 208 1 + 207 206 208 1 + 206 208 209 1 + 206 208 212 1 + 209 208 212 1 + 208 209 210 1 + 208 209 211 1 + 210 209 211 1 + 208 212 213 1 + 203 213 212 1 + 203 213 214 1 + 212 213 214 1 + 198 215 216 1 + 198 215 217 1 + 198 215 220 1 + 216 215 217 1 + 216 215 220 1 + 217 215 220 1 + 201 217 215 1 + 201 217 218 1 + 201 217 219 1 + 215 217 218 1 + 215 217 219 1 + 218 217 219 1 + 215 220 221 1 + 220 221 222 1 + 220 221 223 1 + 220 221 224 1 + 222 221 223 1 + 222 221 224 1 + 223 221 224 1 + 221 224 225 1 + 224 225 226 1 + 224 225 227 1 + 224 225 228 1 + 226 225 227 1 + 226 225 228 1 + 227 225 228 1 + 225 228 229 1 + 225 228 230 1 + 225 228 247 1 + 229 228 230 1 + 229 228 247 1 + 230 228 247 1 + 228 230 231 1 + 230 231 232 1 + 230 231 233 1 + 230 231 249 1 + 232 231 233 1 + 232 231 249 1 + 233 231 249 1 + 231 233 234 1 + 231 233 245 1 + 234 233 245 1 + 233 234 235 1 + 233 234 236 1 + 235 234 236 1 + 234 236 237 1 + 234 236 241 1 + 237 236 241 1 + 236 237 238 1 + 236 237 239 1 + 236 237 240 1 + 238 237 239 1 + 238 237 240 1 + 239 237 240 1 + 236 241 242 1 + 236 241 243 1 + 242 241 243 1 + 241 243 244 1 + 241 243 245 1 + 244 243 245 1 + 233 245 243 1 + 233 245 246 1 + 243 245 246 1 + 228 247 248 1 + 228 247 249 1 + 228 247 252 1 + 248 247 249 1 + 248 247 252 1 + 249 247 252 1 + 231 249 247 1 + 231 249 250 1 + 231 249 251 1 + 247 249 250 1 + 247 249 251 1 + 250 249 251 1 + 247 252 253 1 + 252 253 254 1 + 252 253 255 1 + 252 253 256 1 + 254 253 255 1 + 254 253 256 1 + 255 253 256 1 + 253 256 257 1 + 256 257 258 1 + 256 257 259 1 + 256 257 260 1 + 258 257 259 1 + 258 257 260 1 + 259 257 260 1 + 257 260 261 1 + 257 260 262 1 + 257 260 279 1 + 261 260 262 1 + 261 260 279 1 + 262 260 279 1 + 260 262 263 1 + 262 263 264 1 + 262 263 265 1 + 262 263 281 1 + 264 263 265 1 + 264 263 281 1 + 265 263 281 1 + 263 265 266 1 + 263 265 277 1 + 266 265 277 1 + 265 266 267 1 + 265 266 268 1 + 267 266 268 1 + 266 268 269 1 + 266 268 273 1 + 269 268 273 1 + 268 269 270 1 + 268 269 271 1 + 268 269 272 1 + 270 269 271 1 + 270 269 272 1 + 271 269 272 1 + 268 273 274 1 + 268 273 275 1 + 274 273 275 1 + 273 275 276 1 + 273 275 277 1 + 276 275 277 1 + 265 277 275 1 + 265 277 278 1 + 275 277 278 1 + 260 279 280 1 + 260 279 281 1 + 260 279 284 1 + 280 279 281 1 + 280 279 284 1 + 281 279 284 1 + 263 281 279 1 + 263 281 282 1 + 263 281 283 1 + 279 281 282 1 + 279 281 283 1 + 282 281 283 1 + 279 284 285 1 + 286 287 288 1 + 287 288 289 1 + 287 288 290 1 + 287 288 291 1 + 289 288 290 1 + 289 288 291 1 + 290 288 291 1 + 288 291 292 1 + 288 291 293 1 + 288 291 310 1 + 292 291 293 1 + 292 291 310 1 + 293 291 310 1 + 291 293 294 1 + 293 294 295 1 + 293 294 296 1 + 293 294 312 1 + 295 294 296 1 + 295 294 312 1 + 296 294 312 1 + 294 296 297 1 + 294 296 309 1 + 297 296 309 1 + 296 297 298 1 + 296 297 299 1 + 298 297 299 1 + 297 299 300 1 + 299 300 301 1 + 299 300 309 1 + 301 300 309 1 + 300 301 302 1 + 300 301 305 1 + 302 301 305 1 + 301 302 303 1 + 301 302 304 1 + 303 302 304 1 + 301 305 306 1 + 305 306 307 1 + 305 306 308 1 + 307 306 308 1 + 306 308 309 1 + 296 309 300 1 + 296 309 308 1 + 300 309 308 1 + 291 310 311 1 + 291 310 312 1 + 291 310 315 1 + 311 310 312 1 + 311 310 315 1 + 312 310 315 1 + 294 312 310 1 + 294 312 313 1 + 294 312 314 1 + 310 312 313 1 + 310 312 314 1 + 313 312 314 1 + 310 315 316 1 + 315 316 317 1 + 315 316 318 1 + 315 316 319 1 + 317 316 318 1 + 317 316 319 1 + 318 316 319 1 + 316 319 320 1 + 319 320 321 1 + 319 320 322 1 + 319 320 323 1 + 321 320 322 1 + 321 320 323 1 + 322 320 323 1 + 320 323 324 1 + 320 323 325 1 + 320 323 342 1 + 324 323 325 1 + 324 323 342 1 + 325 323 342 1 + 323 325 326 1 + 325 326 327 1 + 325 326 328 1 + 325 326 344 1 + 327 326 328 1 + 327 326 344 1 + 328 326 344 1 + 326 328 329 1 + 326 328 341 1 + 329 328 341 1 + 328 329 330 1 + 328 329 331 1 + 330 329 331 1 + 329 331 332 1 + 331 332 333 1 + 331 332 341 1 + 333 332 341 1 + 332 333 334 1 + 332 333 337 1 + 334 333 337 1 + 333 334 335 1 + 333 334 336 1 + 335 334 336 1 + 333 337 338 1 + 337 338 339 1 + 337 338 340 1 + 339 338 340 1 + 338 340 341 1 + 328 341 332 1 + 328 341 340 1 + 332 341 340 1 + 323 342 343 1 + 323 342 344 1 + 323 342 347 1 + 343 342 344 1 + 343 342 347 1 + 344 342 347 1 + 326 344 342 1 + 326 344 345 1 + 326 344 346 1 + 342 344 345 1 + 342 344 346 1 + 345 344 346 1 + 342 347 348 1 + 347 348 349 1 + 347 348 350 1 + 347 348 351 1 + 349 348 350 1 + 349 348 351 1 + 350 348 351 1 + 348 351 352 1 + 351 352 353 1 + 351 352 354 1 + 351 352 355 1 + 353 352 354 1 + 353 352 355 1 + 354 352 355 1 + 352 355 356 1 + 352 355 357 1 + 352 355 375 1 + 356 355 357 1 + 356 355 375 1 + 357 355 375 1 + 355 357 358 1 + 357 358 359 1 + 357 358 360 1 + 357 358 377 1 + 359 358 360 1 + 359 358 377 1 + 360 358 377 1 + 358 360 361 1 + 358 360 374 1 + 361 360 374 1 + 360 361 362 1 + 360 361 363 1 + 362 361 363 1 + 361 363 364 1 + 363 364 365 1 + 363 364 374 1 + 365 364 374 1 + 364 365 366 1 + 364 365 367 1 + 366 365 367 1 + 365 367 368 1 + 365 367 369 1 + 368 367 369 1 + 367 369 370 1 + 367 369 373 1 + 370 369 373 1 + 369 370 371 1 + 369 370 372 1 + 371 370 372 1 + 369 373 374 1 + 360 374 364 1 + 360 374 373 1 + 364 374 373 1 + 355 375 376 1 + 355 375 377 1 + 355 375 380 1 + 376 375 377 1 + 376 375 380 1 + 377 375 380 1 + 358 377 375 1 + 358 377 378 1 + 358 377 379 1 + 375 377 378 1 + 375 377 379 1 + 378 377 379 1 + 375 380 381 1 + 380 381 382 1 + 380 381 383 1 + 380 381 384 1 + 382 381 383 1 + 382 381 384 1 + 383 381 384 1 + 381 384 385 1 + 384 385 386 1 + 384 385 387 1 + 384 385 388 1 + 386 385 387 1 + 386 385 388 1 + 387 385 388 1 + 385 388 389 1 + 385 388 390 1 + 385 388 408 1 + 389 388 390 1 + 389 388 408 1 + 390 388 408 1 + 388 390 391 1 + 390 391 392 1 + 390 391 393 1 + 390 391 410 1 + 392 391 393 1 + 392 391 410 1 + 393 391 410 1 + 391 393 394 1 + 391 393 407 1 + 394 393 407 1 + 393 394 395 1 + 393 394 396 1 + 395 394 396 1 + 394 396 397 1 + 396 397 398 1 + 396 397 407 1 + 398 397 407 1 + 397 398 399 1 + 397 398 400 1 + 399 398 400 1 + 398 400 401 1 + 398 400 402 1 + 401 400 402 1 + 400 402 403 1 + 400 402 406 1 + 403 402 406 1 + 402 403 404 1 + 402 403 405 1 + 404 403 405 1 + 402 406 407 1 + 393 407 397 1 + 393 407 406 1 + 397 407 406 1 + 388 408 409 1 + 388 408 410 1 + 388 408 413 1 + 409 408 410 1 + 409 408 413 1 + 410 408 413 1 + 391 410 408 1 + 391 410 411 1 + 391 410 412 1 + 408 410 411 1 + 408 410 412 1 + 411 410 412 1 + 408 413 414 1 + 413 414 415 1 + 413 414 416 1 + 413 414 417 1 + 415 414 416 1 + 415 414 417 1 + 416 414 417 1 + 414 417 418 1 + 417 418 419 1 + 417 418 420 1 + 417 418 421 1 + 419 418 420 1 + 419 418 421 1 + 420 418 421 1 + 418 421 422 1 + 418 421 423 1 + 418 421 438 1 + 422 421 423 1 + 422 421 438 1 + 423 421 438 1 + 421 423 424 1 + 423 424 425 1 + 423 424 426 1 + 423 424 440 1 + 425 424 426 1 + 425 424 440 1 + 426 424 440 1 + 424 426 427 1 + 424 426 436 1 + 427 426 436 1 + 426 427 428 1 + 426 427 429 1 + 428 427 429 1 + 427 429 430 1 + 427 429 431 1 + 430 429 431 1 + 429 431 432 1 + 429 431 435 1 + 432 431 435 1 + 431 432 433 1 + 431 432 434 1 + 433 432 434 1 + 431 435 436 1 + 426 436 435 1 + 426 436 437 1 + 435 436 437 1 + 421 438 439 1 + 421 438 440 1 + 421 438 443 1 + 439 438 440 1 + 439 438 443 1 + 440 438 443 1 + 424 440 438 1 + 424 440 441 1 + 424 440 442 1 + 438 440 441 1 + 438 440 442 1 + 441 440 442 1 + 438 443 444 1 + 443 444 445 1 + 443 444 446 1 + 443 444 447 1 + 445 444 446 1 + 445 444 447 1 + 446 444 447 1 + 444 447 448 1 + 447 448 449 1 + 447 448 450 1 + 447 448 451 1 + 449 448 450 1 + 449 448 451 1 + 450 448 451 1 + 448 451 452 1 + 448 451 453 1 + 448 451 468 1 + 452 451 453 1 + 452 451 468 1 + 453 451 468 1 + 451 453 454 1 + 453 454 455 1 + 453 454 456 1 + 453 454 470 1 + 455 454 456 1 + 455 454 470 1 + 456 454 470 1 + 454 456 457 1 + 454 456 466 1 + 457 456 466 1 + 456 457 458 1 + 456 457 459 1 + 458 457 459 1 + 457 459 460 1 + 457 459 461 1 + 460 459 461 1 + 459 461 462 1 + 459 461 465 1 + 462 461 465 1 + 461 462 463 1 + 461 462 464 1 + 463 462 464 1 + 461 465 466 1 + 456 466 465 1 + 456 466 467 1 + 465 466 467 1 + 451 468 469 1 + 451 468 470 1 + 451 468 473 1 + 469 468 470 1 + 469 468 473 1 + 470 468 473 1 + 454 470 468 1 + 454 470 471 1 + 454 470 472 1 + 468 470 471 1 + 468 470 472 1 + 471 470 472 1 + 468 473 474 1 + 473 474 475 1 + 473 474 476 1 + 473 474 477 1 + 475 474 476 1 + 475 474 477 1 + 476 474 477 1 + 474 477 478 1 + 477 478 479 1 + 477 478 480 1 + 477 478 481 1 + 479 478 480 1 + 479 478 481 1 + 480 478 481 1 + 478 481 482 1 + 478 481 483 1 + 478 481 500 1 + 482 481 483 1 + 482 481 500 1 + 483 481 500 1 + 481 483 484 1 + 483 484 485 1 + 483 484 486 1 + 483 484 502 1 + 485 484 486 1 + 485 484 502 1 + 486 484 502 1 + 484 486 487 1 + 484 486 498 1 + 487 486 498 1 + 486 487 488 1 + 486 487 489 1 + 488 487 489 1 + 487 489 490 1 + 487 489 494 1 + 490 489 494 1 + 489 490 491 1 + 489 490 492 1 + 489 490 493 1 + 491 490 492 1 + 491 490 493 1 + 492 490 493 1 + 489 494 495 1 + 489 494 496 1 + 495 494 496 1 + 494 496 497 1 + 494 496 498 1 + 497 496 498 1 + 486 498 496 1 + 486 498 499 1 + 496 498 499 1 + 481 500 501 1 + 481 500 502 1 + 481 500 505 1 + 501 500 502 1 + 501 500 505 1 + 502 500 505 1 + 484 502 500 1 + 484 502 503 1 + 484 502 504 1 + 500 502 503 1 + 500 502 504 1 + 503 502 504 1 + 500 505 506 1 + 505 506 507 1 + 505 506 508 1 + 505 506 509 1 + 507 506 508 1 + 507 506 509 1 + 508 506 509 1 + 506 509 510 1 + 509 510 511 1 + 509 510 512 1 + 509 510 513 1 + 511 510 512 1 + 511 510 513 1 + 512 510 513 1 + 510 513 514 1 + 510 513 515 1 + 510 513 532 1 + 514 513 515 1 + 514 513 532 1 + 515 513 532 1 + 513 515 516 1 + 515 516 517 1 + 515 516 518 1 + 515 516 534 1 + 517 516 518 1 + 517 516 534 1 + 518 516 534 1 + 516 518 519 1 + 516 518 530 1 + 519 518 530 1 + 518 519 520 1 + 518 519 521 1 + 520 519 521 1 + 519 521 522 1 + 519 521 526 1 + 522 521 526 1 + 521 522 523 1 + 521 522 524 1 + 521 522 525 1 + 523 522 524 1 + 523 522 525 1 + 524 522 525 1 + 521 526 527 1 + 521 526 528 1 + 527 526 528 1 + 526 528 529 1 + 526 528 530 1 + 529 528 530 1 + 518 530 528 1 + 518 530 531 1 + 528 530 531 1 + 513 532 533 1 + 513 532 534 1 + 513 532 537 1 + 533 532 534 1 + 533 532 537 1 + 534 532 537 1 + 516 534 532 1 + 516 534 535 1 + 516 534 536 1 + 532 534 535 1 + 532 534 536 1 + 535 534 536 1 + 532 537 538 1 + 537 538 539 1 + 537 538 540 1 + 537 538 541 1 + 539 538 540 1 + 539 538 541 1 + 540 538 541 1 + 538 541 542 1 + 541 542 543 1 + 541 542 544 1 + 541 542 545 1 + 543 542 544 1 + 543 542 545 1 + 544 542 545 1 + 542 545 546 1 + 542 545 547 1 + 542 545 564 1 + 546 545 547 1 + 546 545 564 1 + 547 545 564 1 + 545 547 548 1 + 547 548 549 1 + 547 548 550 1 + 547 548 566 1 + 549 548 550 1 + 549 548 566 1 + 550 548 566 1 + 548 550 551 1 + 548 550 562 1 + 551 550 562 1 + 550 551 552 1 + 550 551 553 1 + 552 551 553 1 + 551 553 554 1 + 551 553 558 1 + 554 553 558 1 + 553 554 555 1 + 553 554 556 1 + 553 554 557 1 + 555 554 556 1 + 555 554 557 1 + 556 554 557 1 + 553 558 559 1 + 553 558 560 1 + 559 558 560 1 + 558 560 561 1 + 558 560 562 1 + 561 560 562 1 + 550 562 560 1 + 550 562 563 1 + 560 562 563 1 + 545 564 565 1 + 545 564 566 1 + 545 564 569 1 + 565 564 566 1 + 565 564 569 1 + 566 564 569 1 + 548 566 564 1 + 548 566 567 1 + 548 566 568 1 + 564 566 567 1 + 564 566 568 1 + 567 566 568 1 + 564 569 570 1 + +[ dihedrals ] +; ai aj ak al funct c0 c1 c2 c3 c4 c5 + 1 2 3 4 9 + 1 2 3 5 9 + 1 2 3 6 9 + 2 3 6 7 9 + 2 3 6 8 9 + 2 3 6 25 9 + 4 3 6 7 9 + 4 3 6 8 9 + 4 3 6 25 9 + 5 3 6 7 9 + 5 3 6 8 9 + 5 3 6 25 9 + 3 6 8 9 9 + 7 6 8 9 9 + 25 6 8 9 9 + 3 6 25 26 9 + 3 6 25 27 9 + 3 6 25 30 9 + 7 6 25 26 9 + 7 6 25 27 9 + 7 6 25 30 9 + 8 6 25 26 9 + 8 6 25 27 9 + 8 6 25 30 9 + 6 8 9 10 9 + 6 8 9 11 9 + 6 8 9 27 9 + 8 9 11 12 9 + 8 9 11 24 9 + 10 9 11 12 9 + 10 9 11 24 9 + 27 9 11 12 9 + 27 9 11 24 9 + 8 9 27 25 9 + 8 9 27 28 9 + 8 9 27 29 9 + 10 9 27 25 9 + 10 9 27 28 9 + 10 9 27 29 9 + 11 9 27 25 9 + 11 9 27 28 9 + 11 9 27 29 9 + 9 11 12 13 9 + 9 11 12 14 9 + 24 11 12 13 9 + 24 11 12 14 9 + 9 11 24 15 9 + 9 11 24 23 9 + 12 11 24 15 9 + 12 11 24 23 9 + 11 12 14 15 9 + 13 12 14 15 9 + 12 14 15 16 9 + 12 14 15 24 9 + 14 15 16 17 9 + 14 15 16 20 9 + 24 15 16 17 9 + 24 15 16 20 9 + 14 15 24 11 9 + 14 15 24 23 9 + 16 15 24 11 9 + 16 15 24 23 9 + 15 16 17 18 9 + 15 16 17 19 9 + 20 16 17 18 9 + 20 16 17 19 9 + 15 16 20 21 9 + 17 16 20 21 9 + 16 20 21 22 9 + 16 20 21 23 9 + 20 21 23 24 9 + 22 21 23 24 9 + 21 23 24 11 9 + 21 23 24 15 9 + 6 25 27 9 9 + 6 25 27 28 9 + 6 25 27 29 9 + 26 25 27 9 9 + 26 25 27 28 9 + 26 25 27 29 9 + 30 25 27 9 9 + 30 25 27 28 9 + 30 25 27 29 9 + 6 25 30 31 9 + 26 25 30 31 9 + 27 25 30 31 9 + 25 30 31 32 9 + 25 30 31 33 9 + 25 30 31 34 9 + 30 31 34 35 9 + 32 31 34 35 9 + 33 31 34 35 9 + 31 34 35 36 9 + 31 34 35 37 9 + 31 34 35 38 9 + 34 35 38 39 9 + 34 35 38 40 9 + 34 35 38 57 9 + 36 35 38 39 9 + 36 35 38 40 9 + 36 35 38 57 9 + 37 35 38 39 9 + 37 35 38 40 9 + 37 35 38 57 9 + 35 38 40 41 9 + 39 38 40 41 9 + 57 38 40 41 9 + 35 38 57 58 9 + 35 38 57 59 9 + 35 38 57 62 9 + 39 38 57 58 9 + 39 38 57 59 9 + 39 38 57 62 9 + 40 38 57 58 9 + 40 38 57 59 9 + 40 38 57 62 9 + 38 40 41 42 9 + 38 40 41 43 9 + 38 40 41 59 9 + 40 41 43 44 9 + 40 41 43 56 9 + 42 41 43 44 9 + 42 41 43 56 9 + 59 41 43 44 9 + 59 41 43 56 9 + 40 41 59 57 9 + 40 41 59 60 9 + 40 41 59 61 9 + 42 41 59 57 9 + 42 41 59 60 9 + 42 41 59 61 9 + 43 41 59 57 9 + 43 41 59 60 9 + 43 41 59 61 9 + 41 43 44 45 9 + 41 43 44 46 9 + 56 43 44 45 9 + 56 43 44 46 9 + 41 43 56 47 9 + 41 43 56 55 9 + 44 43 56 47 9 + 44 43 56 55 9 + 43 44 46 47 9 + 45 44 46 47 9 + 44 46 47 48 9 + 44 46 47 56 9 + 46 47 48 49 9 + 46 47 48 52 9 + 56 47 48 49 9 + 56 47 48 52 9 + 46 47 56 43 9 + 46 47 56 55 9 + 48 47 56 43 9 + 48 47 56 55 9 + 47 48 49 50 9 + 47 48 49 51 9 + 52 48 49 50 9 + 52 48 49 51 9 + 47 48 52 53 9 + 49 48 52 53 9 + 48 52 53 54 9 + 48 52 53 55 9 + 52 53 55 56 9 + 54 53 55 56 9 + 53 55 56 43 9 + 53 55 56 47 9 + 38 57 59 41 9 + 38 57 59 60 9 + 38 57 59 61 9 + 58 57 59 41 9 + 58 57 59 60 9 + 58 57 59 61 9 + 62 57 59 41 9 + 62 57 59 60 9 + 62 57 59 61 9 + 38 57 62 63 9 + 58 57 62 63 9 + 59 57 62 63 9 + 57 62 63 64 9 + 57 62 63 65 9 + 57 62 63 66 9 + 62 63 66 67 9 + 64 63 66 67 9 + 65 63 66 67 9 + 63 66 67 68 9 + 63 66 67 69 9 + 63 66 67 70 9 + 66 67 70 71 9 + 66 67 70 72 9 + 66 67 70 89 9 + 68 67 70 71 9 + 68 67 70 72 9 + 68 67 70 89 9 + 69 67 70 71 9 + 69 67 70 72 9 + 69 67 70 89 9 + 67 70 72 73 9 + 71 70 72 73 9 + 89 70 72 73 9 + 67 70 89 90 9 + 67 70 89 91 9 + 67 70 89 94 9 + 71 70 89 90 9 + 71 70 89 91 9 + 71 70 89 94 9 + 72 70 89 90 9 + 72 70 89 91 9 + 72 70 89 94 9 + 70 72 73 74 9 + 70 72 73 75 9 + 70 72 73 91 9 + 72 73 75 76 9 + 72 73 75 88 9 + 74 73 75 76 9 + 74 73 75 88 9 + 91 73 75 76 9 + 91 73 75 88 9 + 72 73 91 89 9 + 72 73 91 92 9 + 72 73 91 93 9 + 74 73 91 89 9 + 74 73 91 92 9 + 74 73 91 93 9 + 75 73 91 89 9 + 75 73 91 92 9 + 75 73 91 93 9 + 73 75 76 77 9 + 73 75 76 78 9 + 88 75 76 77 9 + 88 75 76 78 9 + 73 75 88 79 9 + 73 75 88 87 9 + 76 75 88 79 9 + 76 75 88 87 9 + 75 76 78 79 9 + 77 76 78 79 9 + 76 78 79 80 9 + 76 78 79 88 9 + 78 79 80 81 9 + 78 79 80 84 9 + 88 79 80 81 9 + 88 79 80 84 9 + 78 79 88 75 9 + 78 79 88 87 9 + 80 79 88 75 9 + 80 79 88 87 9 + 79 80 81 82 9 + 79 80 81 83 9 + 84 80 81 82 9 + 84 80 81 83 9 + 79 80 84 85 9 + 81 80 84 85 9 + 80 84 85 86 9 + 80 84 85 87 9 + 84 85 87 88 9 + 86 85 87 88 9 + 85 87 88 75 9 + 85 87 88 79 9 + 70 89 91 73 9 + 70 89 91 92 9 + 70 89 91 93 9 + 90 89 91 73 9 + 90 89 91 92 9 + 90 89 91 93 9 + 94 89 91 73 9 + 94 89 91 92 9 + 94 89 91 93 9 + 70 89 94 95 9 + 90 89 94 95 9 + 91 89 94 95 9 + 89 94 95 96 9 + 89 94 95 97 9 + 89 94 95 98 9 + 94 95 98 99 9 + 96 95 98 99 9 + 97 95 98 99 9 + 95 98 99 100 9 + 95 98 99 101 9 + 95 98 99 102 9 + 98 99 102 103 9 + 98 99 102 104 9 + 98 99 102 122 9 + 100 99 102 103 9 + 100 99 102 104 9 + 100 99 102 122 9 + 101 99 102 103 9 + 101 99 102 104 9 + 101 99 102 122 9 + 99 102 104 105 9 + 103 102 104 105 9 + 122 102 104 105 9 + 99 102 122 123 9 + 99 102 122 124 9 + 99 102 122 127 9 + 103 102 122 123 9 + 103 102 122 124 9 + 103 102 122 127 9 + 104 102 122 123 9 + 104 102 122 124 9 + 104 102 122 127 9 + 102 104 105 106 9 + 102 104 105 107 9 + 102 104 105 124 9 + 104 105 107 108 9 + 104 105 107 121 9 + 106 105 107 108 9 + 106 105 107 121 9 + 124 105 107 108 9 + 124 105 107 121 9 + 104 105 124 122 9 + 104 105 124 125 9 + 104 105 124 126 9 + 106 105 124 122 9 + 106 105 124 125 9 + 106 105 124 126 9 + 107 105 124 122 9 + 107 105 124 125 9 + 107 105 124 126 9 + 105 107 108 109 9 + 105 107 108 110 9 + 121 107 108 109 9 + 121 107 108 110 9 + 105 107 121 111 9 + 105 107 121 120 9 + 108 107 121 111 9 + 108 107 121 120 9 + 107 108 110 111 9 + 109 108 110 111 9 + 108 110 111 112 9 + 108 110 111 121 9 + 110 111 112 113 9 + 110 111 112 114 9 + 121 111 112 113 9 + 121 111 112 114 9 + 110 111 121 107 9 + 110 111 121 120 9 + 112 111 121 107 9 + 112 111 121 120 9 + 111 112 114 115 9 + 111 112 114 116 9 + 113 112 114 115 9 + 113 112 114 116 9 + 112 114 116 117 9 + 112 114 116 120 9 + 115 114 116 117 9 + 115 114 116 120 9 + 114 116 117 118 9 + 114 116 117 119 9 + 120 116 117 118 9 + 120 116 117 119 9 + 114 116 120 121 9 + 117 116 120 121 9 + 116 120 121 107 9 + 116 120 121 111 9 + 102 122 124 105 9 + 102 122 124 125 9 + 102 122 124 126 9 + 123 122 124 105 9 + 123 122 124 125 9 + 123 122 124 126 9 + 127 122 124 105 9 + 127 122 124 125 9 + 127 122 124 126 9 + 102 122 127 128 9 + 123 122 127 128 9 + 124 122 127 128 9 + 122 127 128 129 9 + 122 127 128 130 9 + 122 127 128 131 9 + 127 128 131 132 9 + 129 128 131 132 9 + 130 128 131 132 9 + 128 131 132 133 9 + 128 131 132 134 9 + 128 131 132 135 9 + 131 132 135 136 9 + 131 132 135 137 9 + 131 132 135 155 9 + 133 132 135 136 9 + 133 132 135 137 9 + 133 132 135 155 9 + 134 132 135 136 9 + 134 132 135 137 9 + 134 132 135 155 9 + 132 135 137 138 9 + 136 135 137 138 9 + 155 135 137 138 9 + 132 135 155 156 9 + 132 135 155 157 9 + 132 135 155 160 9 + 136 135 155 156 9 + 136 135 155 157 9 + 136 135 155 160 9 + 137 135 155 156 9 + 137 135 155 157 9 + 137 135 155 160 9 + 135 137 138 139 9 + 135 137 138 140 9 + 135 137 138 157 9 + 137 138 140 141 9 + 137 138 140 154 9 + 139 138 140 141 9 + 139 138 140 154 9 + 157 138 140 141 9 + 157 138 140 154 9 + 137 138 157 155 9 + 137 138 157 158 9 + 137 138 157 159 9 + 139 138 157 155 9 + 139 138 157 158 9 + 139 138 157 159 9 + 140 138 157 155 9 + 140 138 157 158 9 + 140 138 157 159 9 + 138 140 141 142 9 + 138 140 141 143 9 + 154 140 141 142 9 + 154 140 141 143 9 + 138 140 154 144 9 + 138 140 154 153 9 + 141 140 154 144 9 + 141 140 154 153 9 + 140 141 143 144 9 + 142 141 143 144 9 + 141 143 144 145 9 + 141 143 144 154 9 + 143 144 145 146 9 + 143 144 145 147 9 + 154 144 145 146 9 + 154 144 145 147 9 + 143 144 154 140 9 + 143 144 154 153 9 + 145 144 154 140 9 + 145 144 154 153 9 + 144 145 147 148 9 + 144 145 147 149 9 + 146 145 147 148 9 + 146 145 147 149 9 + 145 147 149 150 9 + 145 147 149 153 9 + 148 147 149 150 9 + 148 147 149 153 9 + 147 149 150 151 9 + 147 149 150 152 9 + 153 149 150 151 9 + 153 149 150 152 9 + 147 149 153 154 9 + 150 149 153 154 9 + 149 153 154 140 9 + 149 153 154 144 9 + 135 155 157 138 9 + 135 155 157 158 9 + 135 155 157 159 9 + 156 155 157 138 9 + 156 155 157 158 9 + 156 155 157 159 9 + 160 155 157 138 9 + 160 155 157 158 9 + 160 155 157 159 9 + 135 155 160 161 9 + 156 155 160 161 9 + 157 155 160 161 9 + 155 160 161 162 9 + 155 160 161 163 9 + 155 160 161 164 9 + 160 161 164 165 9 + 162 161 164 165 9 + 163 161 164 165 9 + 161 164 165 166 9 + 161 164 165 167 9 + 161 164 165 168 9 + 164 165 168 169 9 + 164 165 168 170 9 + 164 165 168 185 9 + 166 165 168 169 9 + 166 165 168 170 9 + 166 165 168 185 9 + 167 165 168 169 9 + 167 165 168 170 9 + 167 165 168 185 9 + 165 168 170 171 9 + 169 168 170 171 9 + 185 168 170 171 9 + 165 168 185 186 9 + 165 168 185 187 9 + 165 168 185 190 9 + 169 168 185 186 9 + 169 168 185 187 9 + 169 168 185 190 9 + 170 168 185 186 9 + 170 168 185 187 9 + 170 168 185 190 9 + 168 170 171 172 9 + 168 170 171 173 9 + 168 170 171 187 9 + 170 171 173 174 9 + 170 171 173 183 9 + 172 171 173 174 9 + 172 171 173 183 9 + 187 171 173 174 9 + 187 171 173 183 9 + 170 171 187 185 9 + 170 171 187 188 9 + 170 171 187 189 9 + 172 171 187 185 9 + 172 171 187 188 9 + 172 171 187 189 9 + 173 171 187 185 9 + 173 171 187 188 9 + 173 171 187 189 9 + 171 173 174 175 9 + 171 173 174 176 9 + 183 173 174 175 9 + 183 173 174 176 9 + 171 173 183 182 9 + 171 173 183 184 9 + 174 173 183 182 9 + 174 173 183 184 9 + 173 174 176 177 9 + 173 174 176 178 9 + 175 174 176 177 9 + 175 174 176 178 9 + 174 176 178 179 9 + 174 176 178 182 9 + 177 176 178 179 9 + 177 176 178 182 9 + 176 178 179 180 9 + 176 178 179 181 9 + 182 178 179 180 9 + 182 178 179 181 9 + 176 178 182 183 9 + 179 178 182 183 9 + 178 182 183 173 9 + 178 182 183 184 9 + 168 185 187 171 9 + 168 185 187 188 9 + 168 185 187 189 9 + 186 185 187 171 9 + 186 185 187 188 9 + 186 185 187 189 9 + 190 185 187 171 9 + 190 185 187 188 9 + 190 185 187 189 9 + 168 185 190 191 9 + 186 185 190 191 9 + 187 185 190 191 9 + 185 190 191 192 9 + 185 190 191 193 9 + 185 190 191 194 9 + 190 191 194 195 9 + 192 191 194 195 9 + 193 191 194 195 9 + 191 194 195 196 9 + 191 194 195 197 9 + 191 194 195 198 9 + 194 195 198 199 9 + 194 195 198 200 9 + 194 195 198 215 9 + 196 195 198 199 9 + 196 195 198 200 9 + 196 195 198 215 9 + 197 195 198 199 9 + 197 195 198 200 9 + 197 195 198 215 9 + 195 198 200 201 9 + 199 198 200 201 9 + 215 198 200 201 9 + 195 198 215 216 9 + 195 198 215 217 9 + 195 198 215 220 9 + 199 198 215 216 9 + 199 198 215 217 9 + 199 198 215 220 9 + 200 198 215 216 9 + 200 198 215 217 9 + 200 198 215 220 9 + 198 200 201 202 9 + 198 200 201 203 9 + 198 200 201 217 9 + 200 201 203 204 9 + 200 201 203 213 9 + 202 201 203 204 9 + 202 201 203 213 9 + 217 201 203 204 9 + 217 201 203 213 9 + 200 201 217 215 9 + 200 201 217 218 9 + 200 201 217 219 9 + 202 201 217 215 9 + 202 201 217 218 9 + 202 201 217 219 9 + 203 201 217 215 9 + 203 201 217 218 9 + 203 201 217 219 9 + 201 203 204 205 9 + 201 203 204 206 9 + 213 203 204 205 9 + 213 203 204 206 9 + 201 203 213 212 9 + 201 203 213 214 9 + 204 203 213 212 9 + 204 203 213 214 9 + 203 204 206 207 9 + 203 204 206 208 9 + 205 204 206 207 9 + 205 204 206 208 9 + 204 206 208 209 9 + 204 206 208 212 9 + 207 206 208 209 9 + 207 206 208 212 9 + 206 208 209 210 9 + 206 208 209 211 9 + 212 208 209 210 9 + 212 208 209 211 9 + 206 208 212 213 9 + 209 208 212 213 9 + 208 212 213 203 9 + 208 212 213 214 9 + 198 215 217 201 9 + 198 215 217 218 9 + 198 215 217 219 9 + 216 215 217 201 9 + 216 215 217 218 9 + 216 215 217 219 9 + 220 215 217 201 9 + 220 215 217 218 9 + 220 215 217 219 9 + 198 215 220 221 9 + 216 215 220 221 9 + 217 215 220 221 9 + 215 220 221 222 9 + 215 220 221 223 9 + 215 220 221 224 9 + 220 221 224 225 9 + 222 221 224 225 9 + 223 221 224 225 9 + 221 224 225 226 9 + 221 224 225 227 9 + 221 224 225 228 9 + 224 225 228 229 9 + 224 225 228 230 9 + 224 225 228 247 9 + 226 225 228 229 9 + 226 225 228 230 9 + 226 225 228 247 9 + 227 225 228 229 9 + 227 225 228 230 9 + 227 225 228 247 9 + 225 228 230 231 9 + 229 228 230 231 9 + 247 228 230 231 9 + 225 228 247 248 9 + 225 228 247 249 9 + 225 228 247 252 9 + 229 228 247 248 9 + 229 228 247 249 9 + 229 228 247 252 9 + 230 228 247 248 9 + 230 228 247 249 9 + 230 228 247 252 9 + 228 230 231 232 9 + 228 230 231 233 9 + 228 230 231 249 9 + 230 231 233 234 9 + 230 231 233 245 9 + 232 231 233 234 9 + 232 231 233 245 9 + 249 231 233 234 9 + 249 231 233 245 9 + 230 231 249 247 9 + 230 231 249 250 9 + 230 231 249 251 9 + 232 231 249 247 9 + 232 231 249 250 9 + 232 231 249 251 9 + 233 231 249 247 9 + 233 231 249 250 9 + 233 231 249 251 9 + 231 233 234 235 9 + 231 233 234 236 9 + 245 233 234 235 9 + 245 233 234 236 9 + 231 233 245 243 9 + 231 233 245 246 9 + 234 233 245 243 9 + 234 233 245 246 9 + 233 234 236 237 9 + 233 234 236 241 9 + 235 234 236 237 9 + 235 234 236 241 9 + 234 236 237 238 9 + 234 236 237 239 9 + 234 236 237 240 9 + 241 236 237 238 9 + 241 236 237 239 9 + 241 236 237 240 9 + 234 236 241 242 9 + 234 236 241 243 9 + 237 236 241 242 9 + 237 236 241 243 9 + 236 241 243 244 9 + 236 241 243 245 9 + 242 241 243 244 9 + 242 241 243 245 9 + 241 243 245 233 9 + 241 243 245 246 9 + 244 243 245 233 9 + 244 243 245 246 9 + 228 247 249 231 9 + 228 247 249 250 9 + 228 247 249 251 9 + 248 247 249 231 9 + 248 247 249 250 9 + 248 247 249 251 9 + 252 247 249 231 9 + 252 247 249 250 9 + 252 247 249 251 9 + 228 247 252 253 9 + 248 247 252 253 9 + 249 247 252 253 9 + 247 252 253 254 9 + 247 252 253 255 9 + 247 252 253 256 9 + 252 253 256 257 9 + 254 253 256 257 9 + 255 253 256 257 9 + 253 256 257 258 9 + 253 256 257 259 9 + 253 256 257 260 9 + 256 257 260 261 9 + 256 257 260 262 9 + 256 257 260 279 9 + 258 257 260 261 9 + 258 257 260 262 9 + 258 257 260 279 9 + 259 257 260 261 9 + 259 257 260 262 9 + 259 257 260 279 9 + 257 260 262 263 9 + 261 260 262 263 9 + 279 260 262 263 9 + 257 260 279 280 9 + 257 260 279 281 9 + 257 260 279 284 9 + 261 260 279 280 9 + 261 260 279 281 9 + 261 260 279 284 9 + 262 260 279 280 9 + 262 260 279 281 9 + 262 260 279 284 9 + 260 262 263 264 9 + 260 262 263 265 9 + 260 262 263 281 9 + 262 263 265 266 9 + 262 263 265 277 9 + 264 263 265 266 9 + 264 263 265 277 9 + 281 263 265 266 9 + 281 263 265 277 9 + 262 263 281 279 9 + 262 263 281 282 9 + 262 263 281 283 9 + 264 263 281 279 9 + 264 263 281 282 9 + 264 263 281 283 9 + 265 263 281 279 9 + 265 263 281 282 9 + 265 263 281 283 9 + 263 265 266 267 9 + 263 265 266 268 9 + 277 265 266 267 9 + 277 265 266 268 9 + 263 265 277 275 9 + 263 265 277 278 9 + 266 265 277 275 9 + 266 265 277 278 9 + 265 266 268 269 9 + 265 266 268 273 9 + 267 266 268 269 9 + 267 266 268 273 9 + 266 268 269 270 9 + 266 268 269 271 9 + 266 268 269 272 9 + 273 268 269 270 9 + 273 268 269 271 9 + 273 268 269 272 9 + 266 268 273 274 9 + 266 268 273 275 9 + 269 268 273 274 9 + 269 268 273 275 9 + 268 273 275 276 9 + 268 273 275 277 9 + 274 273 275 276 9 + 274 273 275 277 9 + 273 275 277 265 9 + 273 275 277 278 9 + 276 275 277 265 9 + 276 275 277 278 9 + 260 279 281 263 9 + 260 279 281 282 9 + 260 279 281 283 9 + 280 279 281 263 9 + 280 279 281 282 9 + 280 279 281 283 9 + 284 279 281 263 9 + 284 279 281 282 9 + 284 279 281 283 9 + 260 279 284 285 9 + 280 279 284 285 9 + 281 279 284 285 9 + 286 287 288 289 9 + 286 287 288 290 9 + 286 287 288 291 9 + 287 288 291 292 9 + 287 288 291 293 9 + 287 288 291 310 9 + 289 288 291 292 9 + 289 288 291 293 9 + 289 288 291 310 9 + 290 288 291 292 9 + 290 288 291 293 9 + 290 288 291 310 9 + 288 291 293 294 9 + 292 291 293 294 9 + 310 291 293 294 9 + 288 291 310 311 9 + 288 291 310 312 9 + 288 291 310 315 9 + 292 291 310 311 9 + 292 291 310 312 9 + 292 291 310 315 9 + 293 291 310 311 9 + 293 291 310 312 9 + 293 291 310 315 9 + 291 293 294 295 9 + 291 293 294 296 9 + 291 293 294 312 9 + 293 294 296 297 9 + 293 294 296 309 9 + 295 294 296 297 9 + 295 294 296 309 9 + 312 294 296 297 9 + 312 294 296 309 9 + 293 294 312 310 9 + 293 294 312 313 9 + 293 294 312 314 9 + 295 294 312 310 9 + 295 294 312 313 9 + 295 294 312 314 9 + 296 294 312 310 9 + 296 294 312 313 9 + 296 294 312 314 9 + 294 296 297 298 9 + 294 296 297 299 9 + 309 296 297 298 9 + 309 296 297 299 9 + 294 296 309 300 9 + 294 296 309 308 9 + 297 296 309 300 9 + 297 296 309 308 9 + 296 297 299 300 9 + 298 297 299 300 9 + 297 299 300 301 9 + 297 299 300 309 9 + 299 300 301 302 9 + 299 300 301 305 9 + 309 300 301 302 9 + 309 300 301 305 9 + 299 300 309 296 9 + 299 300 309 308 9 + 301 300 309 296 9 + 301 300 309 308 9 + 300 301 302 303 9 + 300 301 302 304 9 + 305 301 302 303 9 + 305 301 302 304 9 + 300 301 305 306 9 + 302 301 305 306 9 + 301 305 306 307 9 + 301 305 306 308 9 + 305 306 308 309 9 + 307 306 308 309 9 + 306 308 309 296 9 + 306 308 309 300 9 + 291 310 312 294 9 + 291 310 312 313 9 + 291 310 312 314 9 + 311 310 312 294 9 + 311 310 312 313 9 + 311 310 312 314 9 + 315 310 312 294 9 + 315 310 312 313 9 + 315 310 312 314 9 + 291 310 315 316 9 + 311 310 315 316 9 + 312 310 315 316 9 + 310 315 316 317 9 + 310 315 316 318 9 + 310 315 316 319 9 + 315 316 319 320 9 + 317 316 319 320 9 + 318 316 319 320 9 + 316 319 320 321 9 + 316 319 320 322 9 + 316 319 320 323 9 + 319 320 323 324 9 + 319 320 323 325 9 + 319 320 323 342 9 + 321 320 323 324 9 + 321 320 323 325 9 + 321 320 323 342 9 + 322 320 323 324 9 + 322 320 323 325 9 + 322 320 323 342 9 + 320 323 325 326 9 + 324 323 325 326 9 + 342 323 325 326 9 + 320 323 342 343 9 + 320 323 342 344 9 + 320 323 342 347 9 + 324 323 342 343 9 + 324 323 342 344 9 + 324 323 342 347 9 + 325 323 342 343 9 + 325 323 342 344 9 + 325 323 342 347 9 + 323 325 326 327 9 + 323 325 326 328 9 + 323 325 326 344 9 + 325 326 328 329 9 + 325 326 328 341 9 + 327 326 328 329 9 + 327 326 328 341 9 + 344 326 328 329 9 + 344 326 328 341 9 + 325 326 344 342 9 + 325 326 344 345 9 + 325 326 344 346 9 + 327 326 344 342 9 + 327 326 344 345 9 + 327 326 344 346 9 + 328 326 344 342 9 + 328 326 344 345 9 + 328 326 344 346 9 + 326 328 329 330 9 + 326 328 329 331 9 + 341 328 329 330 9 + 341 328 329 331 9 + 326 328 341 332 9 + 326 328 341 340 9 + 329 328 341 332 9 + 329 328 341 340 9 + 328 329 331 332 9 + 330 329 331 332 9 + 329 331 332 333 9 + 329 331 332 341 9 + 331 332 333 334 9 + 331 332 333 337 9 + 341 332 333 334 9 + 341 332 333 337 9 + 331 332 341 328 9 + 331 332 341 340 9 + 333 332 341 328 9 + 333 332 341 340 9 + 332 333 334 335 9 + 332 333 334 336 9 + 337 333 334 335 9 + 337 333 334 336 9 + 332 333 337 338 9 + 334 333 337 338 9 + 333 337 338 339 9 + 333 337 338 340 9 + 337 338 340 341 9 + 339 338 340 341 9 + 338 340 341 328 9 + 338 340 341 332 9 + 323 342 344 326 9 + 323 342 344 345 9 + 323 342 344 346 9 + 343 342 344 326 9 + 343 342 344 345 9 + 343 342 344 346 9 + 347 342 344 326 9 + 347 342 344 345 9 + 347 342 344 346 9 + 323 342 347 348 9 + 343 342 347 348 9 + 344 342 347 348 9 + 342 347 348 349 9 + 342 347 348 350 9 + 342 347 348 351 9 + 347 348 351 352 9 + 349 348 351 352 9 + 350 348 351 352 9 + 348 351 352 353 9 + 348 351 352 354 9 + 348 351 352 355 9 + 351 352 355 356 9 + 351 352 355 357 9 + 351 352 355 375 9 + 353 352 355 356 9 + 353 352 355 357 9 + 353 352 355 375 9 + 354 352 355 356 9 + 354 352 355 357 9 + 354 352 355 375 9 + 352 355 357 358 9 + 356 355 357 358 9 + 375 355 357 358 9 + 352 355 375 376 9 + 352 355 375 377 9 + 352 355 375 380 9 + 356 355 375 376 9 + 356 355 375 377 9 + 356 355 375 380 9 + 357 355 375 376 9 + 357 355 375 377 9 + 357 355 375 380 9 + 355 357 358 359 9 + 355 357 358 360 9 + 355 357 358 377 9 + 357 358 360 361 9 + 357 358 360 374 9 + 359 358 360 361 9 + 359 358 360 374 9 + 377 358 360 361 9 + 377 358 360 374 9 + 357 358 377 375 9 + 357 358 377 378 9 + 357 358 377 379 9 + 359 358 377 375 9 + 359 358 377 378 9 + 359 358 377 379 9 + 360 358 377 375 9 + 360 358 377 378 9 + 360 358 377 379 9 + 358 360 361 362 9 + 358 360 361 363 9 + 374 360 361 362 9 + 374 360 361 363 9 + 358 360 374 364 9 + 358 360 374 373 9 + 361 360 374 364 9 + 361 360 374 373 9 + 360 361 363 364 9 + 362 361 363 364 9 + 361 363 364 365 9 + 361 363 364 374 9 + 363 364 365 366 9 + 363 364 365 367 9 + 374 364 365 366 9 + 374 364 365 367 9 + 363 364 374 360 9 + 363 364 374 373 9 + 365 364 374 360 9 + 365 364 374 373 9 + 364 365 367 368 9 + 364 365 367 369 9 + 366 365 367 368 9 + 366 365 367 369 9 + 365 367 369 370 9 + 365 367 369 373 9 + 368 367 369 370 9 + 368 367 369 373 9 + 367 369 370 371 9 + 367 369 370 372 9 + 373 369 370 371 9 + 373 369 370 372 9 + 367 369 373 374 9 + 370 369 373 374 9 + 369 373 374 360 9 + 369 373 374 364 9 + 355 375 377 358 9 + 355 375 377 378 9 + 355 375 377 379 9 + 376 375 377 358 9 + 376 375 377 378 9 + 376 375 377 379 9 + 380 375 377 358 9 + 380 375 377 378 9 + 380 375 377 379 9 + 355 375 380 381 9 + 376 375 380 381 9 + 377 375 380 381 9 + 375 380 381 382 9 + 375 380 381 383 9 + 375 380 381 384 9 + 380 381 384 385 9 + 382 381 384 385 9 + 383 381 384 385 9 + 381 384 385 386 9 + 381 384 385 387 9 + 381 384 385 388 9 + 384 385 388 389 9 + 384 385 388 390 9 + 384 385 388 408 9 + 386 385 388 389 9 + 386 385 388 390 9 + 386 385 388 408 9 + 387 385 388 389 9 + 387 385 388 390 9 + 387 385 388 408 9 + 385 388 390 391 9 + 389 388 390 391 9 + 408 388 390 391 9 + 385 388 408 409 9 + 385 388 408 410 9 + 385 388 408 413 9 + 389 388 408 409 9 + 389 388 408 410 9 + 389 388 408 413 9 + 390 388 408 409 9 + 390 388 408 410 9 + 390 388 408 413 9 + 388 390 391 392 9 + 388 390 391 393 9 + 388 390 391 410 9 + 390 391 393 394 9 + 390 391 393 407 9 + 392 391 393 394 9 + 392 391 393 407 9 + 410 391 393 394 9 + 410 391 393 407 9 + 390 391 410 408 9 + 390 391 410 411 9 + 390 391 410 412 9 + 392 391 410 408 9 + 392 391 410 411 9 + 392 391 410 412 9 + 393 391 410 408 9 + 393 391 410 411 9 + 393 391 410 412 9 + 391 393 394 395 9 + 391 393 394 396 9 + 407 393 394 395 9 + 407 393 394 396 9 + 391 393 407 397 9 + 391 393 407 406 9 + 394 393 407 397 9 + 394 393 407 406 9 + 393 394 396 397 9 + 395 394 396 397 9 + 394 396 397 398 9 + 394 396 397 407 9 + 396 397 398 399 9 + 396 397 398 400 9 + 407 397 398 399 9 + 407 397 398 400 9 + 396 397 407 393 9 + 396 397 407 406 9 + 398 397 407 393 9 + 398 397 407 406 9 + 397 398 400 401 9 + 397 398 400 402 9 + 399 398 400 401 9 + 399 398 400 402 9 + 398 400 402 403 9 + 398 400 402 406 9 + 401 400 402 403 9 + 401 400 402 406 9 + 400 402 403 404 9 + 400 402 403 405 9 + 406 402 403 404 9 + 406 402 403 405 9 + 400 402 406 407 9 + 403 402 406 407 9 + 402 406 407 393 9 + 402 406 407 397 9 + 388 408 410 391 9 + 388 408 410 411 9 + 388 408 410 412 9 + 409 408 410 391 9 + 409 408 410 411 9 + 409 408 410 412 9 + 413 408 410 391 9 + 413 408 410 411 9 + 413 408 410 412 9 + 388 408 413 414 9 + 409 408 413 414 9 + 410 408 413 414 9 + 408 413 414 415 9 + 408 413 414 416 9 + 408 413 414 417 9 + 413 414 417 418 9 + 415 414 417 418 9 + 416 414 417 418 9 + 414 417 418 419 9 + 414 417 418 420 9 + 414 417 418 421 9 + 417 418 421 422 9 + 417 418 421 423 9 + 417 418 421 438 9 + 419 418 421 422 9 + 419 418 421 423 9 + 419 418 421 438 9 + 420 418 421 422 9 + 420 418 421 423 9 + 420 418 421 438 9 + 418 421 423 424 9 + 422 421 423 424 9 + 438 421 423 424 9 + 418 421 438 439 9 + 418 421 438 440 9 + 418 421 438 443 9 + 422 421 438 439 9 + 422 421 438 440 9 + 422 421 438 443 9 + 423 421 438 439 9 + 423 421 438 440 9 + 423 421 438 443 9 + 421 423 424 425 9 + 421 423 424 426 9 + 421 423 424 440 9 + 423 424 426 427 9 + 423 424 426 436 9 + 425 424 426 427 9 + 425 424 426 436 9 + 440 424 426 427 9 + 440 424 426 436 9 + 423 424 440 438 9 + 423 424 440 441 9 + 423 424 440 442 9 + 425 424 440 438 9 + 425 424 440 441 9 + 425 424 440 442 9 + 426 424 440 438 9 + 426 424 440 441 9 + 426 424 440 442 9 + 424 426 427 428 9 + 424 426 427 429 9 + 436 426 427 428 9 + 436 426 427 429 9 + 424 426 436 435 9 + 424 426 436 437 9 + 427 426 436 435 9 + 427 426 436 437 9 + 426 427 429 430 9 + 426 427 429 431 9 + 428 427 429 430 9 + 428 427 429 431 9 + 427 429 431 432 9 + 427 429 431 435 9 + 430 429 431 432 9 + 430 429 431 435 9 + 429 431 432 433 9 + 429 431 432 434 9 + 435 431 432 433 9 + 435 431 432 434 9 + 429 431 435 436 9 + 432 431 435 436 9 + 431 435 436 426 9 + 431 435 436 437 9 + 421 438 440 424 9 + 421 438 440 441 9 + 421 438 440 442 9 + 439 438 440 424 9 + 439 438 440 441 9 + 439 438 440 442 9 + 443 438 440 424 9 + 443 438 440 441 9 + 443 438 440 442 9 + 421 438 443 444 9 + 439 438 443 444 9 + 440 438 443 444 9 + 438 443 444 445 9 + 438 443 444 446 9 + 438 443 444 447 9 + 443 444 447 448 9 + 445 444 447 448 9 + 446 444 447 448 9 + 444 447 448 449 9 + 444 447 448 450 9 + 444 447 448 451 9 + 447 448 451 452 9 + 447 448 451 453 9 + 447 448 451 468 9 + 449 448 451 452 9 + 449 448 451 453 9 + 449 448 451 468 9 + 450 448 451 452 9 + 450 448 451 453 9 + 450 448 451 468 9 + 448 451 453 454 9 + 452 451 453 454 9 + 468 451 453 454 9 + 448 451 468 469 9 + 448 451 468 470 9 + 448 451 468 473 9 + 452 451 468 469 9 + 452 451 468 470 9 + 452 451 468 473 9 + 453 451 468 469 9 + 453 451 468 470 9 + 453 451 468 473 9 + 451 453 454 455 9 + 451 453 454 456 9 + 451 453 454 470 9 + 453 454 456 457 9 + 453 454 456 466 9 + 455 454 456 457 9 + 455 454 456 466 9 + 470 454 456 457 9 + 470 454 456 466 9 + 453 454 470 468 9 + 453 454 470 471 9 + 453 454 470 472 9 + 455 454 470 468 9 + 455 454 470 471 9 + 455 454 470 472 9 + 456 454 470 468 9 + 456 454 470 471 9 + 456 454 470 472 9 + 454 456 457 458 9 + 454 456 457 459 9 + 466 456 457 458 9 + 466 456 457 459 9 + 454 456 466 465 9 + 454 456 466 467 9 + 457 456 466 465 9 + 457 456 466 467 9 + 456 457 459 460 9 + 456 457 459 461 9 + 458 457 459 460 9 + 458 457 459 461 9 + 457 459 461 462 9 + 457 459 461 465 9 + 460 459 461 462 9 + 460 459 461 465 9 + 459 461 462 463 9 + 459 461 462 464 9 + 465 461 462 463 9 + 465 461 462 464 9 + 459 461 465 466 9 + 462 461 465 466 9 + 461 465 466 456 9 + 461 465 466 467 9 + 451 468 470 454 9 + 451 468 470 471 9 + 451 468 470 472 9 + 469 468 470 454 9 + 469 468 470 471 9 + 469 468 470 472 9 + 473 468 470 454 9 + 473 468 470 471 9 + 473 468 470 472 9 + 451 468 473 474 9 + 469 468 473 474 9 + 470 468 473 474 9 + 468 473 474 475 9 + 468 473 474 476 9 + 468 473 474 477 9 + 473 474 477 478 9 + 475 474 477 478 9 + 476 474 477 478 9 + 474 477 478 479 9 + 474 477 478 480 9 + 474 477 478 481 9 + 477 478 481 482 9 + 477 478 481 483 9 + 477 478 481 500 9 + 479 478 481 482 9 + 479 478 481 483 9 + 479 478 481 500 9 + 480 478 481 482 9 + 480 478 481 483 9 + 480 478 481 500 9 + 478 481 483 484 9 + 482 481 483 484 9 + 500 481 483 484 9 + 478 481 500 501 9 + 478 481 500 502 9 + 478 481 500 505 9 + 482 481 500 501 9 + 482 481 500 502 9 + 482 481 500 505 9 + 483 481 500 501 9 + 483 481 500 502 9 + 483 481 500 505 9 + 481 483 484 485 9 + 481 483 484 486 9 + 481 483 484 502 9 + 483 484 486 487 9 + 483 484 486 498 9 + 485 484 486 487 9 + 485 484 486 498 9 + 502 484 486 487 9 + 502 484 486 498 9 + 483 484 502 500 9 + 483 484 502 503 9 + 483 484 502 504 9 + 485 484 502 500 9 + 485 484 502 503 9 + 485 484 502 504 9 + 486 484 502 500 9 + 486 484 502 503 9 + 486 484 502 504 9 + 484 486 487 488 9 + 484 486 487 489 9 + 498 486 487 488 9 + 498 486 487 489 9 + 484 486 498 496 9 + 484 486 498 499 9 + 487 486 498 496 9 + 487 486 498 499 9 + 486 487 489 490 9 + 486 487 489 494 9 + 488 487 489 490 9 + 488 487 489 494 9 + 487 489 490 491 9 + 487 489 490 492 9 + 487 489 490 493 9 + 494 489 490 491 9 + 494 489 490 492 9 + 494 489 490 493 9 + 487 489 494 495 9 + 487 489 494 496 9 + 490 489 494 495 9 + 490 489 494 496 9 + 489 494 496 497 9 + 489 494 496 498 9 + 495 494 496 497 9 + 495 494 496 498 9 + 494 496 498 486 9 + 494 496 498 499 9 + 497 496 498 486 9 + 497 496 498 499 9 + 481 500 502 484 9 + 481 500 502 503 9 + 481 500 502 504 9 + 501 500 502 484 9 + 501 500 502 503 9 + 501 500 502 504 9 + 505 500 502 484 9 + 505 500 502 503 9 + 505 500 502 504 9 + 481 500 505 506 9 + 501 500 505 506 9 + 502 500 505 506 9 + 500 505 506 507 9 + 500 505 506 508 9 + 500 505 506 509 9 + 505 506 509 510 9 + 507 506 509 510 9 + 508 506 509 510 9 + 506 509 510 511 9 + 506 509 510 512 9 + 506 509 510 513 9 + 509 510 513 514 9 + 509 510 513 515 9 + 509 510 513 532 9 + 511 510 513 514 9 + 511 510 513 515 9 + 511 510 513 532 9 + 512 510 513 514 9 + 512 510 513 515 9 + 512 510 513 532 9 + 510 513 515 516 9 + 514 513 515 516 9 + 532 513 515 516 9 + 510 513 532 533 9 + 510 513 532 534 9 + 510 513 532 537 9 + 514 513 532 533 9 + 514 513 532 534 9 + 514 513 532 537 9 + 515 513 532 533 9 + 515 513 532 534 9 + 515 513 532 537 9 + 513 515 516 517 9 + 513 515 516 518 9 + 513 515 516 534 9 + 515 516 518 519 9 + 515 516 518 530 9 + 517 516 518 519 9 + 517 516 518 530 9 + 534 516 518 519 9 + 534 516 518 530 9 + 515 516 534 532 9 + 515 516 534 535 9 + 515 516 534 536 9 + 517 516 534 532 9 + 517 516 534 535 9 + 517 516 534 536 9 + 518 516 534 532 9 + 518 516 534 535 9 + 518 516 534 536 9 + 516 518 519 520 9 + 516 518 519 521 9 + 530 518 519 520 9 + 530 518 519 521 9 + 516 518 530 528 9 + 516 518 530 531 9 + 519 518 530 528 9 + 519 518 530 531 9 + 518 519 521 522 9 + 518 519 521 526 9 + 520 519 521 522 9 + 520 519 521 526 9 + 519 521 522 523 9 + 519 521 522 524 9 + 519 521 522 525 9 + 526 521 522 523 9 + 526 521 522 524 9 + 526 521 522 525 9 + 519 521 526 527 9 + 519 521 526 528 9 + 522 521 526 527 9 + 522 521 526 528 9 + 521 526 528 529 9 + 521 526 528 530 9 + 527 526 528 529 9 + 527 526 528 530 9 + 526 528 530 518 9 + 526 528 530 531 9 + 529 528 530 518 9 + 529 528 530 531 9 + 513 532 534 516 9 + 513 532 534 535 9 + 513 532 534 536 9 + 533 532 534 516 9 + 533 532 534 535 9 + 533 532 534 536 9 + 537 532 534 516 9 + 537 532 534 535 9 + 537 532 534 536 9 + 513 532 537 538 9 + 533 532 537 538 9 + 534 532 537 538 9 + 532 537 538 539 9 + 532 537 538 540 9 + 532 537 538 541 9 + 537 538 541 542 9 + 539 538 541 542 9 + 540 538 541 542 9 + 538 541 542 543 9 + 538 541 542 544 9 + 538 541 542 545 9 + 541 542 545 546 9 + 541 542 545 547 9 + 541 542 545 564 9 + 543 542 545 546 9 + 543 542 545 547 9 + 543 542 545 564 9 + 544 542 545 546 9 + 544 542 545 547 9 + 544 542 545 564 9 + 542 545 547 548 9 + 546 545 547 548 9 + 564 545 547 548 9 + 542 545 564 565 9 + 542 545 564 566 9 + 542 545 564 569 9 + 546 545 564 565 9 + 546 545 564 566 9 + 546 545 564 569 9 + 547 545 564 565 9 + 547 545 564 566 9 + 547 545 564 569 9 + 545 547 548 549 9 + 545 547 548 550 9 + 545 547 548 566 9 + 547 548 550 551 9 + 547 548 550 562 9 + 549 548 550 551 9 + 549 548 550 562 9 + 566 548 550 551 9 + 566 548 550 562 9 + 547 548 566 564 9 + 547 548 566 567 9 + 547 548 566 568 9 + 549 548 566 564 9 + 549 548 566 567 9 + 549 548 566 568 9 + 550 548 566 564 9 + 550 548 566 567 9 + 550 548 566 568 9 + 548 550 551 552 9 + 548 550 551 553 9 + 562 550 551 552 9 + 562 550 551 553 9 + 548 550 562 560 9 + 548 550 562 563 9 + 551 550 562 560 9 + 551 550 562 563 9 + 550 551 553 554 9 + 550 551 553 558 9 + 552 551 553 554 9 + 552 551 553 558 9 + 551 553 554 555 9 + 551 553 554 556 9 + 551 553 554 557 9 + 558 553 554 555 9 + 558 553 554 556 9 + 558 553 554 557 9 + 551 553 558 559 9 + 551 553 558 560 9 + 554 553 558 559 9 + 554 553 558 560 9 + 553 558 560 561 9 + 553 558 560 562 9 + 559 558 560 561 9 + 559 558 560 562 9 + 558 560 562 550 9 + 558 560 562 563 9 + 561 560 562 550 9 + 561 560 562 563 9 + 545 564 566 548 9 + 545 564 566 567 9 + 545 564 566 568 9 + 565 564 566 548 9 + 565 564 566 567 9 + 565 564 566 568 9 + 569 564 566 548 9 + 569 564 566 567 9 + 569 564 566 568 9 + 545 564 569 570 9 + 565 564 569 570 9 + 566 564 569 570 9 + +[ dihedrals ] +; ai aj ak al funct c0 c1 c2 c3 + 9 11 12 24 4 + 11 14 12 13 4 + 15 17 16 20 4 + 16 18 17 19 4 + 20 23 21 22 4 + 41 43 44 56 4 + 43 46 44 45 4 + 47 49 48 52 4 + 48 50 49 51 4 + 52 55 53 54 4 + 73 75 76 88 4 + 75 78 76 77 4 + 79 81 80 84 4 + 80 82 81 83 4 + 84 87 85 86 4 + 105 107 108 121 4 + 107 110 108 109 4 + 111 114 112 113 4 + 112 116 114 115 4 + 116 118 117 119 4 + 117 114 116 120 4 + 138 140 141 154 4 + 140 143 141 142 4 + 144 147 145 146 4 + 145 149 147 148 4 + 149 151 150 152 4 + 150 147 149 153 4 + 171 173 174 183 4 + 173 176 174 175 4 + 173 182 183 184 4 + 174 178 176 177 4 + 176 179 178 182 4 + 178 180 179 181 4 + 201 203 204 213 4 + 203 206 204 205 4 + 203 212 213 214 4 + 204 208 206 207 4 + 206 209 208 212 4 + 208 210 209 211 4 + 231 233 234 245 4 + 233 236 234 235 4 + 233 243 245 246 4 + 236 243 241 242 4 + 237 236 234 241 4 + 241 245 243 244 4 + 263 265 266 277 4 + 265 268 266 267 4 + 265 275 277 278 4 + 268 275 273 274 4 + 269 268 266 273 4 + 273 277 275 276 4 + 294 296 297 309 4 + 296 299 297 298 4 + 300 302 301 305 4 + 301 303 302 304 4 + 305 308 306 307 4 + 326 328 329 341 4 + 328 331 329 330 4 + 332 334 333 337 4 + 333 335 334 336 4 + 337 340 338 339 4 + 358 360 361 374 4 + 360 363 361 362 4 + 364 367 365 366 4 + 365 369 367 368 4 + 369 371 370 372 4 + 370 367 369 373 4 + 391 393 394 407 4 + 393 396 394 395 4 + 397 400 398 399 4 + 398 402 400 401 4 + 402 404 403 405 4 + 403 400 402 406 4 + 424 426 427 436 4 + 426 429 427 428 4 + 426 435 436 437 4 + 427 431 429 430 4 + 429 432 431 435 4 + 431 433 432 434 4 + 454 456 457 466 4 + 456 459 457 458 4 + 456 465 466 467 4 + 457 461 459 460 4 + 459 462 461 465 4 + 461 463 462 464 4 + 484 486 487 498 4 + 486 489 487 488 4 + 486 496 498 499 4 + 489 496 494 495 4 + 490 489 487 494 4 + 494 498 496 497 4 + 516 518 519 530 4 + 518 521 519 520 4 + 518 528 530 531 4 + 521 528 526 527 4 + 522 521 519 526 4 + 526 530 528 529 4 + 548 550 551 562 4 + 550 553 551 552 4 + 550 560 562 563 4 + 553 560 558 559 4 + 554 553 551 558 4 + 558 562 560 561 4 + +#ifdef eq_polyply +; chiral-center C1' + 9 27 11 8 2 3.5264390e+01 3.3484625e+03 + 41 59 43 40 2 3.5264390e+01 3.3484625e+03 + 73 91 75 72 2 3.5264390e+01 3.3484625e+03 +294 312 296 293 2 3.5264390e+01 3.3484625e+03 +326 344 328 325 2 3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center C3' + 25 30 6 27 2 3.5264390e+01 3.3484625e+03 + 57 62 38 59 2 3.5264390e+01 3.3484625e+03 + 89 94 70 91 2 3.5264390e+01 3.3484625e+03 +310 315 291 312 2 3.5264390e+01 3.3484625e+03 +342 347 323 344 2 3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center DCC1' +171 187 173 170 2 3.5264390e+01 3.3484625e+03 +201 217 203 200 2 3.5264390e+01 3.3484625e+03 +424 440 426 423 2 3.5264390e+01 3.3484625e+03 +454 470 456 453 2 3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center DCC3' +185 190 168 187 2 3.5264390e+01 3.3484625e+03 +215 220 198 217 2 3.5264390e+01 3.3484625e+03 +438 443 421 440 2 3.5264390e+01 3.3484625e+03 +468 473 451 470 2 3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center DCO4' +168 165 185 170 2 3.5264390e+01 3.3484625e+03 +198 195 215 200 2 3.5264390e+01 3.3484625e+03 +421 418 438 423 2 3.5264390e+01 3.3484625e+03 +451 448 468 453 2 3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center DGC1' +105 124 107 104 2 3.5264390e+01 3.3484625e+03 +138 157 140 137 2 3.5264390e+01 3.3484625e+03 +358 377 360 357 2 3.5264390e+01 3.3484625e+03 +391 410 393 390 2 3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center DGC3' +122 127 102 124 2 3.5264390e+01 3.3484625e+03 +155 160 135 157 2 3.5264390e+01 3.3484625e+03 +375 380 355 377 2 3.5264390e+01 3.3484625e+03 +408 413 388 410 2 3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center DGO4' +102 99 122 104 2 3.5264390e+01 3.3484625e+03 +135 132 155 137 2 3.5264390e+01 3.3484625e+03 +355 352 375 357 2 3.5264390e+01 3.3484625e+03 +388 385 408 390 2 3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center DTC1' +231 249 233 230 2 3.5264390e+01 3.3484625e+03 +263 281 265 262 2 3.5264390e+01 3.3484625e+03 +484 502 486 483 2 3.5264390e+01 3.3484625e+03 +516 534 518 515 2 3.5264390e+01 3.3484625e+03 +548 566 550 547 2 3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center DTC3' +247 252 228 249 2 3.5264390e+01 3.3484625e+03 +279 284 260 281 2 3.5264390e+01 3.3484625e+03 +500 505 481 502 2 3.5264390e+01 3.3484625e+03 +532 537 513 534 2 3.5264390e+01 3.3484625e+03 +564 569 545 566 2 3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center DTO4' +228 225 247 230 2 3.5264390e+01 3.3484625e+03 +260 257 279 262 2 3.5264390e+01 3.3484625e+03 +481 478 500 483 2 3.5264390e+01 3.3484625e+03 +513 510 532 515 2 3.5264390e+01 3.3484625e+03 +545 542 564 547 2 3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center HC1' + 9 27 11 10 2 -3.5264390e+01 3.3484625e+03 + 41 59 43 42 2 -3.5264390e+01 3.3484625e+03 + 73 91 75 74 2 -3.5264390e+01 3.3484625e+03 +105 124 107 106 2 -3.5264390e+01 3.3484625e+03 +138 157 140 139 2 -3.5264390e+01 3.3484625e+03 +171 187 173 172 2 -3.5264390e+01 3.3484625e+03 +201 217 203 202 2 -3.5264390e+01 3.3484625e+03 +231 249 233 232 2 -3.5264390e+01 3.3484625e+03 +263 281 265 264 2 -3.5264390e+01 3.3484625e+03 +294 312 296 295 2 -3.5264390e+01 3.3484625e+03 +326 344 328 327 2 -3.5264390e+01 3.3484625e+03 +358 377 360 359 2 -3.5264390e+01 3.3484625e+03 +391 410 393 392 2 -3.5264390e+01 3.3484625e+03 +424 440 426 425 2 -3.5264390e+01 3.3484625e+03 +454 470 456 455 2 -3.5264390e+01 3.3484625e+03 +484 502 486 485 2 -3.5264390e+01 3.3484625e+03 +516 534 518 517 2 -3.5264390e+01 3.3484625e+03 +548 566 550 549 2 -3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center HC3' + 25 30 6 26 2 -3.5264390e+01 3.3484625e+03 + 57 62 38 58 2 -3.5264390e+01 3.3484625e+03 + 89 94 70 90 2 -3.5264390e+01 3.3484625e+03 +122 127 102 123 2 -3.5264390e+01 3.3484625e+03 +155 160 135 156 2 -3.5264390e+01 3.3484625e+03 +185 190 168 186 2 -3.5264390e+01 3.3484625e+03 +215 220 198 216 2 -3.5264390e+01 3.3484625e+03 +247 252 228 248 2 -3.5264390e+01 3.3484625e+03 +279 284 260 280 2 -3.5264390e+01 3.3484625e+03 +310 315 291 311 2 -3.5264390e+01 3.3484625e+03 +342 347 323 343 2 -3.5264390e+01 3.3484625e+03 +375 380 355 376 2 -3.5264390e+01 3.3484625e+03 +408 413 388 409 2 -3.5264390e+01 3.3484625e+03 +438 443 421 439 2 -3.5264390e+01 3.3484625e+03 +468 473 451 469 2 -3.5264390e+01 3.3484625e+03 +500 505 481 501 2 -3.5264390e+01 3.3484625e+03 +532 537 513 533 2 -3.5264390e+01 3.3484625e+03 +564 569 545 565 2 -3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center HO4' + 6 3 25 7 2 -3.5264390e+01 3.3484625e+03 + 38 35 57 39 2 -3.5264390e+01 3.3484625e+03 + 70 67 89 71 2 -3.5264390e+01 3.3484625e+03 +102 99 122 103 2 -3.5264390e+01 3.3484625e+03 +135 132 155 136 2 -3.5264390e+01 3.3484625e+03 +168 165 185 169 2 -3.5264390e+01 3.3484625e+03 +198 195 215 199 2 -3.5264390e+01 3.3484625e+03 +228 225 247 229 2 -3.5264390e+01 3.3484625e+03 +260 257 279 261 2 -3.5264390e+01 3.3484625e+03 +291 288 310 292 2 -3.5264390e+01 3.3484625e+03 +323 320 342 324 2 -3.5264390e+01 3.3484625e+03 +355 352 375 356 2 -3.5264390e+01 3.3484625e+03 +388 385 408 389 2 -3.5264390e+01 3.3484625e+03 +421 418 438 422 2 -3.5264390e+01 3.3484625e+03 +451 448 468 452 2 -3.5264390e+01 3.3484625e+03 +481 478 500 482 2 -3.5264390e+01 3.3484625e+03 +513 510 532 514 2 -3.5264390e+01 3.3484625e+03 +545 542 564 546 2 -3.5264390e+01 3.3484625e+03 +#endif + +#ifdef eq_polyply +; chiral-center O4' + 6 3 25 8 2 3.5264390e+01 3.3484625e+03 + 38 35 57 40 2 3.5264390e+01 3.3484625e+03 + 70 67 89 72 2 3.5264390e+01 3.3484625e+03 +291 288 310 293 2 3.5264390e+01 3.3484625e+03 +323 320 342 325 2 3.5264390e+01 3.3484625e+03 +#endif + diff --git a/polyply/tests/test_data/library_tests/parmbsc1/dsDNA/polyply/command b/polyply/tests/test_data/library_tests/parmbsc1/dsDNA/polyply/command new file mode 100644 index 00000000..085e825c --- /dev/null +++ b/polyply/tests/test_data/library_tests/parmbsc1/dsDNA/polyply/command @@ -0,0 +1 @@ +polyply gen_params -lib parmbsc1 -seqf ../ref.json -name DNA -o DNA.itp -dsdna diff --git a/polyply/tests/test_data/library_tests/parmbsc1/dsDNA/ref.json b/polyply/tests/test_data/library_tests/parmbsc1/dsDNA/ref.json new file mode 100644 index 00000000..7b169a4c --- /dev/null +++ b/polyply/tests/test_data/library_tests/parmbsc1/dsDNA/ref.json @@ -0,0 +1,86 @@ +{ + "directed": false, + "multigraph": false, + "graph": {}, + "nodes": [ + { + "resname": "DA5", + "resid": 1, + "id": 0 + }, + { + "resname": "DA", + "resid": 2, + "id": 1 + }, + { + "resname": "DA", + "resid": 3, + "id": 2 + }, + { + "resname": "DG", + "resid": 4, + "id": 3 + }, + { + "resname": "DG", + "resid": 5, + "id": 4 + }, + { + "resname": "DC", + "resid": 6, + "id": 5 + }, + { + "resname": "DC", + "resid": 7, + "id": 6 + }, + { + "resname": "DT", + "resid": 8, + "id": 7 + }, + { + "resname": "DT3", + "resid": 9, + "id": 8 + } + ], + "links": [ + { + "source": 0, + "target": 1 + }, + { + "source": 1, + "target": 2 + }, + { + "source": 2, + "target": 3 + }, + { + "source": 3, + "target": 4 + }, + { + "source": 4, + "target": 5 + }, + { + "source": 5, + "target": 6 + }, + { + "source": 6, + "target": 7 + }, + { + "source": 7, + "target": 8 + } + ] +} diff --git a/polyply/tests/test_data/simple_seq_files/test_ig_warning.ig b/polyply/tests/test_data/simple_seq_files/test_ig_warning.ig new file mode 100644 index 00000000..c91cbcd7 --- /dev/null +++ b/polyply/tests/test_data/simple_seq_files/test_ig_warning.ig @@ -0,0 +1,4 @@ +; here we have no title line +; here we say DNA +ATTAACACT +ATCGTACAT1 diff --git a/polyply/tests/test_data/topology_test/meta.gro b/polyply/tests/test_data/topology_test/meta.gro index aa20030b..d12e4c30 100644 --- a/polyply/tests/test_data/topology_test/meta.gro +++ b/polyply/tests/test_data/topology_test/meta.gro @@ -2,4 +2,4 @@ PMMA test file 2 1PMMA C1 1 -0.024 -0.125 0.104 1PMMA C2 2 -0.089 -0.100 -0.028 - 10.00000 10.00000 10.00000 + 10.00000 11.00000 12.00000 diff --git a/polyply/tests/test_data/topology_test/test.gro b/polyply/tests/test_data/topology_test/test.gro index f4458eec..9fa4900b 100644 --- a/polyply/tests/test_data/topology_test/test.gro +++ b/polyply/tests/test_data/topology_test/test.gro @@ -14,4 +14,4 @@ PMMA test file 2PMMA O1 12 4.482 6.483 9.965 2PMMA O2 13 4.579 6.512 9.772 2PMMA C5 14 4.632 6.624 9.842 - 10.00000 10.00000 10.00000 + 10.00000 11.00000 12.00000 diff --git a/polyply/tests/test_data/topology_test/test.pdb b/polyply/tests/test_data/topology_test/test.pdb index 04debb01..10f2fc05 100644 --- a/polyply/tests/test_data/topology_test/test.pdb +++ b/polyply/tests/test_data/topology_test/test.pdb @@ -1,3 +1,4 @@ +CRYST1 118.249 120.688 110.944 90.00 90.00 90.00 P 1 1 ATOM 1 BB MET A 1 17.193 61.796 62.315 1.00 0.00 ATOM 2 SC1 MET A 1 20.670 62.642 62.148 1.00 0.00 ATOM 3 BB TYR A 2 16.691 62.571 65.956 1.00 0.00 diff --git a/polyply/tests/test_gen_coords_logic.py b/polyply/tests/test_gen_coords_logic.py index 9f544c85..9412ac1c 100644 --- a/polyply/tests/test_gen_coords_logic.py +++ b/polyply/tests/test_gen_coords_logic.py @@ -32,8 +32,8 @@ def test_no_positions_generated(tmp_path, monkeypatch): errors and preserve all positions given in the input to rounding accuracy. """ monkeypatch.chdir(tmp_path) - top_file = TEST_DATA + "/topology_test/system.top" - pos_file = TEST_DATA + "/topology_test/complete.gro" + top_file = TEST_DATA / "topology_test/system.top" + pos_file = TEST_DATA / "topology_test/complete.gro" out_file = tmp_path / "out.gro" gen_coords(toppath=top_file, coordpath=pos_file, @@ -47,6 +47,67 @@ def test_no_positions_generated(tmp_path, monkeypatch): assert np.all(molecule_out.nodes[node]['position'] == molecule_in.nodes[node]['position']) +@pytest.mark.parametrize('box_input, box_ref, density, warning, incoords', [ + # box from input coordinates + (None, np.array([11.0, 11.0, 11.0]), + None, None, True), + # box from input coordinates overwrites + (np.array([5.0, 5.0, 5.0]), np.array([11.0, 11.0, 11.0]), + None, "warn1", True), + # box from input coordinates and density from CLI + (None, np.array([11.0, 11.0, 11.0]), + 1000, "warn2", True), + # box only from CLI + (np.array([8.0, 11.0, 11.0]), np.array([8.0, 11.0, 11.0]), + None, None, False), + # only density + (None, np.array([0.79273, 0.79273, 0.79273]), + 1000, None, False), + ]) +def test_box_input(tmp_path, caplog, box_input, box_ref, density, warning, incoords): + """ + Here we test that the correct box is chosen, in case there + are conflicting inputs. + """ + warnings = {"warn1": ("A box is provided via the -box command line " + "and the starting coordinates. We consider the " + "the box of starting coordinates as correct. "), + "warn2": ("A density is provided via the command line, " + "but the starting coordinates define a box." + "Will try to pack all molecules in the box " + "provided with starting coordinates."),} + + top_file = TEST_DATA / "topology_test/system.top" + if incoords: + pos_file = TEST_DATA / "topology_test/complete.gro" + else: + # no input coordiante provided + pos_file = None + + out_file = tmp_path / "out.gro" + + with caplog.at_level(logging.WARNING): + gen_coords(toppath=top_file, + coordpath=pos_file, + outpath=out_file, + name="test", + box=box_input, + density=density,) + + molecule_out = read_gro(out_file, exclude=()) + assert np.array_equal(molecule_out.box, box_ref) + if warning: + for record in caplog.records: + if record.levelname == "WARNING": + assert str(record.msg) == warnings[warning] + break + else: + assert False + else: + for record in caplog.records: + if record.levelname == "WARNING": + assert False + def test_backmap_only(tmp_path, monkeypatch): """ Only meta_mol positions are defined so others have to be backmapped. @@ -54,8 +115,8 @@ def test_backmap_only(tmp_path, monkeypatch): same as they have been put in. """ monkeypatch.chdir(tmp_path) - top_file = TEST_DATA + "/topology_test/system.top" - pos_file = TEST_DATA + "/topology_test/cog.gro" + top_file = TEST_DATA / "topology_test" / "system.top" + pos_file = TEST_DATA / "topology_test" / "cog.gro" out_file = tmp_path / "out.gro" gen_coords(toppath=top_file, coordpath_meta=pos_file, @@ -78,9 +139,9 @@ def test_backmap_only(tmp_path, monkeypatch): assert np.allclose(res_pos, ref_pos, atol=0.0009) def test_warning_partial_metamol_coords(tmp_path, monkeypatch, caplog): - caplog.set_level(logging.WARNING) - top_file = TEST_DATA + "/topology_test/system.top" - pos_file = TEST_DATA + "/topology_test/cog_missing.gro" + caplog.set_level(logging.WARNING) + top_file = TEST_DATA / "topology_test" / "system.top" + pos_file = TEST_DATA / "topology_test" / "cog_missing.gro" out_file = tmp_path / "out.gro" with caplog.at_level(logging.WARNING): diff --git a/polyply/tests/test_gen_dna.py b/polyply/tests/test_gen_dna.py new file mode 100644 index 00000000..6b75fc6c --- /dev/null +++ b/polyply/tests/test_gen_dna.py @@ -0,0 +1,89 @@ +# Copyright 2022 University of Groningen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Test DNA related functions. +""" +import pytest +import networkx as nx +from polyply.src.meta_molecule import MetaMolecule +from polyply.src.gen_dna import complement_dsDNA + +@pytest.mark.parametrize('extra_edges, termini, expect_ter', ( + # regular DNA strand + ( + [], + {0: "DC5", 5: "DG3"}, + {6: "DC5", 11: "DG3"} + ), + # circular DNA strand + ( + [(5, 0)], + {0: "DC", 5: "DG"}, + {6: "DC", 11: "DG"} + ) + )) +def test_complement_dsDNA(extra_edges, termini, expect_ter): + test_DNA_mol = MetaMolecule() + nodes = range(0, 6) + test_DNA_mol.add_edges_from(zip(nodes[:-1], nodes[1:])) + test_DNA_mol.add_edges_from(extra_edges) + resnames = {1: "DG", 2: "DT", 3: "DC", 4: "DA"} + resnames.update(termini) + nx.set_node_attributes(test_DNA_mol, resnames, "resname") + nx.set_node_attributes(test_DNA_mol, dict(zip(nodes, range(1, 7))), "resid") + edge_attr = dict(zip(zip(nodes[:-1], nodes[1:]), ["A", "B", "C", "D"])) + nx.set_edge_attributes(test_DNA_mol, edge_attr, "test") + + complement_dsDNA(test_DNA_mol) + + resnames.update({7: "DT", 8: "DG", 9: "DA", 10: "DC"}) + resnames.update(expect_ter) + new_edge_attrs = {(7, 8): "D", (8, 9): "C", (9, 10): "B", (10, 11): "A"} + edge_attr.update(new_edge_attrs) + + new_resnames = nx.get_node_attributes(test_DNA_mol, "resname") + assert new_resnames == resnames + + new_edge_attrs = nx.get_edge_attributes(test_DNA_mol, "test") + for idx, jdx in new_edge_attrs: + if (idx, jdx) in edge_attr: + assert new_edge_attrs[(idx, jdx)] == edge_attr[(idx, jdx)] + else: + assert new_edge_attrs[(idx, jdx)] == edge_attr[(jdx, idx)] + assert len(list(nx.connected_components(test_DNA_mol))) == 2 + + +def test_complement_dsDNA_error(): + """ + Test that an unkown residue generates an error when + passed to gen_dna processor. + """ + test_DNA_mol = MetaMolecule() + nodes = range(0, 6) + test_DNA_mol.add_edges_from(zip(nodes[:-1], nodes[1:])) + resnames = {0: "DA", 1: "DG", 2: "DT", 3: "DC", 4: "XX", 5: "DT"} + nx.set_node_attributes(test_DNA_mol, resnames, "resname") + nx.set_node_attributes(test_DNA_mol, dict(zip(nodes, range(1, 7))), "resid") + edge_attr = dict(zip(zip(nodes[:-1], nodes[1:]), ["A", "B", "C", "D"])) + nx.set_edge_attributes(test_DNA_mol, edge_attr, "test") + + with pytest.raises(IOError) as context: + complement_dsDNA(test_DNA_mol) + + msg = ("Trying to complete a dsDNA strand. However, resname XX with resid 5 " + "does not match any of the known base-pair resnames. Note that polyply " + "at the moment only allows base-pair completion for molecules that only " + "consist of dsDNA. Please conact the developers if you whish to create a " + "more complicated molecule.") + assert str(context.value) == msg diff --git a/polyply/tests/test_gen_params.py b/polyply/tests/test_gen_params.py index 3740702e..bf4eee3d 100644 --- a/polyply/tests/test_gen_params.py +++ b/polyply/tests/test_gen_params.py @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - +import os from pathlib import Path import textwrap import argparse @@ -25,96 +25,76 @@ from polyply.src.graph_utils import find_missing_edges from polyply.src.logging import LOGGER -class TestGenParams(): - @staticmethod - @pytest.mark.parametrize('args_in, ref_file', ( - (["-f", TEST_DATA + "/gen_params/input/PEO.martini.3.itp" - ,"-seq", "PEO:10", "-name", "PEO", "-o", - TEST_DATA + "/gen_params/output/PEO_out.itp"], - TEST_DATA + "/gen_params/ref/PEO_10.itp"), - (["-f", TEST_DATA + "/gen_params/input/PS.martini.2.itp", - "-seqf", TEST_DATA + "/gen_params/input/PS.json", - "-name", "PS", - "-o", TEST_DATA + "/gen_params/output/PS_out.itp"] - , - TEST_DATA + "/gen_params/ref/PS_10.itp"), - (["-f", TEST_DATA + "/gen_params/input/P3HT.martini.2.itp", - "-seq", "P3HT:10", - "-name", "P3HT", - "-o", TEST_DATA + "/gen_params/output/P3HT_out.itp"], - TEST_DATA + "/gen_params/ref/P3HT_10.itp"), - (["-f", TEST_DATA + "/gen_params/input/PPI.ff", - "-seqf", TEST_DATA + "/gen_params/input/PPI.json", - "-name", "PPI", - "-o", TEST_DATA + "/gen_params/output/PPI_out.itp"], - TEST_DATA + "/gen_params/ref/G3.itp"), - (["-f", TEST_DATA + "/gen_params/input/test.ff", - "-seq", "N1:1", "N2:1", "N1:1", "N2:1", "N3:1", - "-name", "test", - "-o", TEST_DATA + "/gen_params/output/test_out.itp"], - TEST_DATA + "/gen_params/ref/test_rev.itp"), - # check if edge attributes are parsed and properly applied - (["-f", TEST_DATA+"/gen_params/input/test_edge_attr.ff", - "-seqf", TEST_DATA + "/gen_params/input/test_edge_attr.json", - "-name", "test", - "-o", TEST_DATA + "/gen_params/output/test_edge_attr_out.itp"], - TEST_DATA + "/gen_params/ref/test_edge_attr_ref.itp"), - # check if nodes can be removed - (["-f", TEST_DATA+"/gen_params/input/removal.ff", - "-seq", "PEO:3", - "-name", "test", - "-o", TEST_DATA + "/gen_params/output/removal.itp"], - TEST_DATA + "/gen_params/ref/removal.itp") - )) - def test_gen_params(args_in, ref_file): - parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - ) - parser.add_argument('-name', required=True, type=str, dest="name", - help="name of the final molecule") - file_group = parser.add_argument_group('Input and output files') - file_group.add_argument('-f', dest='inpath', required=False, type=Path, - help='Input file (ITP|FF)', nargs="*") - file_group.add_argument('-o', dest='outpath', type=Path, - help='Output ITP (ITP)') - file_group.add_argument('-seq', dest='seq', required=False, nargs='+', - type=str, help='linear sequence') - file_group.add_argument('-seqf', dest='seq_file', required=False, type=Path, - help='linear sequence') - ff_group = parser.add_argument_group('Force field selection') - ff_group.add_argument('-lib', dest='lib', required=False, type=str, - help='force-fields to include from library', nargs='*') - - args = parser.parse_args(args_in) - gen_params(**vars(args)) +@pytest.mark.parametrize('inpath, seq, seqf, name, ref_file', ( + ([TEST_DATA / "gen_params" / "input" / "PEO.martini.3.itp"], + ["PEO:10"], + None, + "PEO", + TEST_DATA / "gen_params" / "ref" / "PEO_10.itp"), + ([TEST_DATA / "gen_params"/ "input"/"PS.martini.2.itp"], + None, + TEST_DATA / "gen_params" / "input" / "PS.json", + "PS", + TEST_DATA / "gen_params" / "ref" / "PS_10.itp"), + ([TEST_DATA / "gen_params" / "input" / "P3HT.martini.2.itp"], + ["P3HT:10"], + None, + "P3HT", + TEST_DATA / "gen_params" / "ref" / "P3HT_10.itp"), + ([TEST_DATA / "gen_params" / "input" / "PPI.ff"], + None, + TEST_DATA / "gen_params" / "input" / "PPI.json", + "PPI", + TEST_DATA / "gen_params" / "ref" / "G3.itp"), + ([TEST_DATA / "gen_params" / "input" / "test.ff"], + ["N1:1", "N2:1", "N1:1", "N2:1", "N3:1"], + None, + "test", + TEST_DATA / "gen_params" / "ref" / "test_rev.itp"), + # check if edge attributes are parsed and properly applied + ([TEST_DATA / "gen_params" / "input" / "test_edge_attr.ff"], + None, + TEST_DATA / "gen_params" / "input" / "test_edge_attr.json", + "test", + TEST_DATA / "gen_params" / "ref" / "test_edge_attr_ref.itp"), + # check if nodes can be removed + ([TEST_DATA / "gen_params" / "input" / "removal.ff"], + ["PEO:3"], + None, + "test", + TEST_DATA / "gen_params" / "ref" / "removal.itp") + )) +def test_gen_params(tmp_path, inpath, seq, seqf, name, ref_file): + os.chdir(tmp_path) + gen_params(inpath=inpath, seq=seq, seq_file=seqf, name=name) - force_field = vermouth.forcefield.ForceField(name='test_ff') + force_field = vermouth.forcefield.ForceField(name='test_ff') - for path_name in [args.outpath, ref_file]: - with open(path_name, 'r') as _file: - lines = _file.readlines() - vermouth.gmx.itp_read.read_itp(lines, force_field) + for path_name in [tmp_path / "polymer.itp", ref_file]: + with open(path_name, 'r') as _file: + lines = _file.readlines() + vermouth.gmx.itp_read.read_itp(lines, force_field) - ref_name = args.name + "ref" + ref_name = name + "ref" - #1. Check that all nodes and attributes are the same - assert set(force_field.blocks[ref_name].nodes) == set(force_field.blocks[args.name].nodes) - for node in force_field.blocks[ref_name].nodes: - ref_attrs = nx.get_node_attributes(force_field.blocks[ref_name], node) - new_attrs = nx.get_node_attributes(force_field.blocks[args.name], node) - assert new_attrs == ref_attrs + #1. Check that all nodes and attributes are the same + assert set(force_field.blocks[ref_name].nodes) == set(force_field.blocks[name].nodes) + for node in force_field.blocks[ref_name].nodes: + ref_attrs = nx.get_node_attributes(force_field.blocks[ref_name], node) + new_attrs = nx.get_node_attributes(force_field.blocks[name], node) + assert new_attrs == ref_attrs - #2. Check that all interactions are the same - int_types_ref = force_field.blocks[ref_name].interactions.keys() - int_types_new = force_field.blocks[args.name].interactions.keys() - assert int_types_ref == int_types_new + #2. Check that all interactions are the same + int_types_ref = force_field.blocks[ref_name].interactions.keys() + int_types_new = force_field.blocks[name].interactions.keys() + assert int_types_ref == int_types_new - for key in force_field.blocks[ref_name].interactions: - for term in force_field.blocks[ref_name].interactions[key]: - assert term in force_field.blocks[args.name].interactions[key] + for key in force_field.blocks[ref_name].interactions: + for term in force_field.blocks[ref_name].interactions[key]: + assert term in force_field.blocks[name].interactions[key] def test_find_missing_links(): - fname = TEST_DATA + "/gen_params/ref/P3HT_10.itp" + fname = TEST_DATA / "gen_params" / "ref" / "P3HT_10.itp" ff = vermouth.forcefield.ForceField("test") meta_mol = MetaMolecule.from_itp(ff, fname, "P3HTref") meta_mol.molecule.remove_edge(39, 45) # resid 7,8 diff --git a/polyply/tests/test_gen_seq.py b/polyply/tests/test_gen_seq.py index d573e371..da050033 100644 --- a/polyply/tests/test_gen_seq.py +++ b/polyply/tests/test_gen_seq.py @@ -11,6 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import os import json from pathlib import Path import networkx as nx @@ -168,36 +169,52 @@ def test_tag_nodes(tags, expected, seed): _tag_nodes(graph, tags, seed) assert nx.get_node_attributes(graph, "chiral") == expected -@pytest.mark.parametrize('args, ref_file', ( - (dict(outpath=TEST_DATA + "/gen_seq/output/PPI.json", - macro_strings=["A:3:2:N1-1.0"], - seq=["A", "A"], - name="test", - connects=["0:1:0-0"]), - TEST_DATA + "/gen_seq/ref/PPI_ref.json"), - (dict(outpath=TEST_DATA + "/gen_seq/output/PEO_PS.json", - macro_strings=["A:11:1:PEO-1", "B:11:1:PS-1"], - connects=["0:1:10-0"], - name="test", - seq=["A", "B"]), - TEST_DATA + "/gen_seq/ref/PEO_PS_ref.json"), - (dict(outpath=TEST_DATA + "/gen_seq/output/lysoPEG.json", - inpath=[Path(TEST_DATA + "/gen_seq/input/molecule_0.itp")], - macro_strings=["A:5:1:PEG-1.0"], - from_file=["PROT:molecule_0"], - name="test", - seq=["PROT", "A"], - connects=["0:1:0-0"]), - TEST_DATA + "/gen_seq/ref/lyso_PEG.json") +@pytest.mark.parametrize('inpath, macro_strings, seq, name, from_file, connects, ref_file', ( + ([], + ["A:3:2:N1-1.0"], + ["A", "A"], + "test", + None, + ["0:1:0-0"], + TEST_DATA / "gen_seq" / "ref" / "PPI_ref.json"), + ([], + ["A:11:1:PEO-1", "B:11:1:PS-1"], + ["A", "B"], + "test", + None, + ["0:1:10-0"], + TEST_DATA / "gen_seq" / "ref" / "PEO_PS_ref.json"), + ([Path(TEST_DATA / "gen_seq" / "input" / "molecule_0.itp")], + ["A:5:1:PEG-1.0"], + ["PROT", "A"], + "test", + ["PROT:molecule_0"], + ["0:1:0-0"], + TEST_DATA / "gen_seq" / "ref" / "lyso_PEG.json") )) -def test_gen_seq(args, ref_file): - gen_seq(**args) +def test_gen_seq(tmp_path, + inpath, + macro_strings, + seq, name, + from_file, + connects, + ref_file): + + os.chdir(tmp_path) + outpath = Path("new_seq.json") + gen_seq(inpath=inpath, + outpath=outpath, + macro_strings=macro_strings, + seq=seq, + name=name, + from_file=from_file, + connects=connects) with open(ref_file) as _file: js_graph = json.load(_file) ref_graph = json_graph.node_link_graph(js_graph) - with open(args["outpath"]) as _file: + with open(outpath) as _file: js_graph = json.load(_file) out_graph = json_graph.node_link_graph(js_graph) diff --git a/polyply/tests/test_generate_templates.py b/polyply/tests/test_generate_templates.py index ff4bd11f..b48f78fd 100644 --- a/polyply/tests/test_generate_templates.py +++ b/polyply/tests/test_generate_templates.py @@ -178,7 +178,7 @@ def test_extract_block(): @staticmethod def test_run_molecule(): - top = polyply.src.topology.Topology.from_gmx_topfile(TEST_DATA + "/topology_test/system.top", "test") + top = polyply.src.topology.Topology.from_gmx_topfile(TEST_DATA / "topology_test" / "system.top", "test") top.gen_pairs() top.convert_nonbond_to_sig_eps() GenerateTemplates(topology=top, max_opt=10).run_molecule(top.molecules[0]) diff --git a/polyply/tests/test_lib_files.py b/polyply/tests/test_lib_files.py index a74189e9..3bfda94a 100644 --- a/polyply/tests/test_lib_files.py +++ b/polyply/tests/test_lib_files.py @@ -30,7 +30,7 @@ from polyply import TEST_DATA from vermouth.tests.helper_functions import find_in_path -INTEGRATION_DATA = Path(TEST_DATA + '/library_tests') +INTEGRATION_DATA = TEST_DATA / 'library_tests' PATTERN = '{path}/{library}/{polymer}/polyply' @@ -189,12 +189,15 @@ def _interaction_equal(interaction1, interaction2, inter_type): ['martini3', 'P3HT'], ['martini3', 'PPE'], ['martini3', 'PTMA'], + ['ibi_cgm3', 'PTMA'], + ['ibi_gbcg', 'PTMA'], ['martini2', 'PEO'], ['martini2', 'PS'], ['martini2', 'PEL'], ['martini2', 'PEO_PE'], ['martini2', 'ssDNA'], ['parmbsc1', 'DNA'], + ['parmbsc1', 'dsDNA'], # -> proteins? ]) def test_integration_protein(tmp_path, monkeypatch, library, polymer): diff --git a/polyply/tests/test_meta_molecule.py b/polyply/tests/test_meta_molecule.py index 492cb69f..9cd948bb 100644 --- a/polyply/tests/test_meta_molecule.py +++ b/polyply/tests/test_meta_molecule.py @@ -94,26 +94,26 @@ def test_from_monomer_seq_linear(monomers, edges, nodes, attrs): @staticmethod @pytest.mark.parametrize('file_name, edges, nodes, attrs', ( # multiple blocks from single monomer - (TEST_DATA + "/json/linear.json", + (TEST_DATA / "json" / "linear.json", [(0,1), (1,2)], [0,1,2], {0: 'PEO', 1: 'PEO', 2: 'PEO'} ), # two blocks from two monomers - (TEST_DATA + "/json/single_branch.json", + (TEST_DATA / "json" / "single_branch.json", [(1,2),(2,3),(3,4),(2,5)], [1,2,3,4,5], {1: 'PEO', 2: 'PEO', 3: 'PS', 4: 'PS', 5:'PEO'} ), # two blocks from two monomers - (TEST_DATA + "/json/double_branch.json", + (TEST_DATA / "json" / "double_branch.json", [(1,2),(2,3),(2,4),(4,5),(5,6),(5,8),(6,7)], [1,2,3,4,5,6,7,8], {1: 'PEO', 2: 'PEO', 3: 'PS', 4: 'PEO', 5:'PEO', 6: 'PS', 7: 'PS', 8: 'PEO'} ), # Hyperbranched - (TEST_DATA + "/json/hyperbranched.json", + (TEST_DATA / "json" / "hyperbranched.json", [(0, 1), (0, 2), (0, 3), (1, 4), (1, 5), (2, 6), (2, 7), (3, 8), (3, 9), (4, 10), (4, 11), (5, 12), (5, 13)], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], @@ -121,7 +121,7 @@ def test_from_monomer_seq_linear(monomers, edges, nodes, attrs): 7: 'N1', 8: 'N2', 9: 'N3', 10: 'N3', 11: 'N2', 12: 'N3', 13: 'N3'} ), # check that ordering is restored - (TEST_DATA + "/json/linear_rev.json", + (TEST_DATA / "json" / "linear_rev.json", [(0, 1), (1, 2)], [0, 1, 2], {0: 'PEO', 1: 'PEO', 2: 'PEO'} @@ -130,7 +130,7 @@ def test_from_monomer_seq_linear(monomers, edges, nodes, attrs): def test_from_seq_file(file_name, edges, nodes, attrs): ff = vermouth.forcefield.ForceField(name='test_ff') name = "test" - meta_mol = MetaMolecule.from_sequence_file(ff, Path(file_name), name) + meta_mol = MetaMolecule.from_sequence_file(ff, file_name, name) assert len(nx.get_node_attributes(meta_mol, "resid")) == len(nodes) assert set(meta_mol.nodes) == set(nodes) @@ -146,7 +146,7 @@ def test_resid_assignment_error(): @staticmethod def test_from_itp(): - file_name = TEST_DATA + "/itp/PEO.itp" + file_name = TEST_DATA / "itp" / "PEO.itp" edges = [(0,1), (1,2)] nodes = [0, 1, 2] attrs = {0: 'PEO', 1: 'PEO', 2: 'PEO'} @@ -160,7 +160,7 @@ def test_from_itp(): @staticmethod def test_from_block(): - file_name = TEST_DATA + "/itp/PEO.itp" + file_name = TEST_DATA / "itp" / "PEO.itp" edges = [(0,1), (1,2)] nodes = [0, 1, 2] attrs = {0: 'PEO', 1: 'PEO', 2: 'PEO'} diff --git a/polyply/tests/test_random_walk.py b/polyply/tests/test_random_walk.py index b4639a39..61fcfbc3 100644 --- a/polyply/tests/test_random_walk.py +++ b/polyply/tests/test_random_walk.py @@ -132,7 +132,7 @@ def test__take_step(): @pytest.fixture def nonbond_matrix(): - toppath = TEST_DATA + "/struc_build/system.top" + toppath = TEST_DATA / "struc_build" / "system.top" topology = Topology.from_gmx_topfile(name="test", path=toppath) topology.preprocess() topology.volumes = {"PEO":0.43} @@ -141,7 +141,7 @@ def nonbond_matrix(): box=np.array([10., 10., 10.])) @pytest.fixture def molecule(): - toppath = TEST_DATA + "/struc_build/system.top" + toppath = TEST_DATA / "struc_build" / "system.top" topology = Topology.from_gmx_topfile(name="test", path=toppath) return topology.molecules[0] diff --git a/polyply/tests/test_simple_seq_parsers.py b/polyply/tests/test_simple_seq_parsers.py index 3cf9e174..a0b5827f 100644 --- a/polyply/tests/test_simple_seq_parsers.py +++ b/polyply/tests/test_simple_seq_parsers.py @@ -15,6 +15,7 @@ Test that sequence files are properly read. """ from pathlib import Path +import logging import pytest import networkx as nx from polyply import TEST_DATA @@ -95,14 +96,15 @@ def test_monomers_to_linear_nx_graph(example_meta_molecule): "fasta" )) def test_sequence_parses(extension): - filepath = Path(TEST_DATA + "/simple_seq_files/test."+ extension) + part_path = Path("simple_seq_files") / ("test." + extension) + filepath = TEST_DATA / part_path seq_graph = MetaMolecule.parsers[extension](filepath) monomers = ["DA5", "DT", "DC", "DG", "DT", "DA", "DC", "DA", "DT3"] ref_graph = _monomers_to_linear_nx_graph(monomers) assert nx.is_isomorphic(seq_graph, ref_graph, node_match=_node_match) def test_ig_cirle(): - filepath = Path(TEST_DATA + "/simple_seq_files/test_circle.ig") + filepath = TEST_DATA / "simple_seq_files" / "test_circle.ig" seq_graph = MetaMolecule.parsers["ig"](filepath) monomers = ["DA", "DT", "DC", "DG", "DT", "DA", "DC", "DA", "DT"] ref_graph = _monomers_to_linear_nx_graph(monomers) @@ -113,7 +115,7 @@ def test_ig_cirle(): node_match=_node_match) def test_ig_termination_fail(): - filepath = Path(TEST_DATA + "/simple_seq_files/test_fail.ig") + filepath = Path(TEST_DATA / "simple_seq_files" / "test_fail.ig") with pytest.raises(FileFormatError): seq_graph = MetaMolecule.parsers["ig"](filepath) @@ -122,20 +124,34 @@ def test_ig_termination_fail(): "fasta" )) def test_sequence_parses_RNA(extension): - filepath = Path(TEST_DATA + "/simple_seq_files/test_RNA."+ extension) + part_path = Path("simple_seq_files") / ("test_RNA." + extension) + filepath = TEST_DATA / part_path seq_graph = MetaMolecule.parsers[extension](filepath) monomers = ["A5", "U", "C", "G", "U", "A", "C", "A", "U3"] ref_graph = _monomers_to_linear_nx_graph(monomers) assert nx.is_isomorphic(seq_graph, ref_graph, node_match=_node_match) def test_sequence_parses_PROTEIN(): - filepath = Path(TEST_DATA + "/simple_seq_files/test_protein.fasta") + filepath = Path(TEST_DATA / "simple_seq_files" / "test_protein.fasta") seq_graph = MetaMolecule.parsers["fasta"](filepath) monomers = ["GLY", "ALA", "LYS", "TRP", "ASN", "VAL", "PHE", "PRO", "SER"] ref_graph = _monomers_to_linear_nx_graph(monomers) assert nx.is_isomorphic(seq_graph, ref_graph, node_match=_node_match) - + def test_unkown_nucleotype_error(): with pytest.raises(IOError): lines = ["AABBBCCTG"] _parse_plain(lines, DNA=True, RNA=False) + +def test_ig_warning(caplog): + ref_msg = ("Found only the letters A, C, G, T on first line." + " Are you missing the title line in your .ig file?") + filepath = Path(TEST_DATA / "simple_seq_files/test_ig_warning.ig") + with caplog.at_level(logging.WARNING): + seq_graph = MetaMolecule.parsers["ig"](filepath) + for record in caplog.records: + assert str(record.msg) == ref_msg + assert record.levelname == "WARNING" + break + else: + assert False diff --git a/polyply/tests/test_topology.py b/polyply/tests/test_topology.py index a4d7fd21..b7cba2ea 100644 --- a/polyply/tests/test_topology.py +++ b/polyply/tests/test_topology.py @@ -31,7 +31,7 @@ class TestTopology: @staticmethod def test_from_gmx_topfile(): - top = Topology.from_gmx_topfile(TEST_DATA+"/topology_test/system.top", "test") + top = Topology.from_gmx_topfile(TEST_DATA / "topology_test" / "system.top", "test") assert len(top.molecules) == 1 @staticmethod @@ -44,8 +44,12 @@ def test_add_positions_from_gro(): no coordinates defined and require the build and backmap attribute to be True. In all other cases they need to be False. """ - top = Topology.from_gmx_topfile(TEST_DATA + "/topology_test/system.top", "test") - top.add_positions_from_file(TEST_DATA + "/topology_test/test.gro") + top = Topology.from_gmx_topfile(TEST_DATA / "topology_test" / "system.top", "test") + top.add_positions_from_file(TEST_DATA / "topology_test" / "test.gro") + + # check that the box is correctly read + assert np.allclose(top.box, np.array([10.0, 11.0, 12.0])) + for node in top.molecules[0].molecule.nodes: if node < 14: assert "position" in top.molecules[0].molecule.nodes[node].keys() @@ -68,8 +72,12 @@ def test_add_meta_positions_from_gro(): have no coordinates defined at either level and require the build and backmap attribute to be True. In all other cases the build attribute is False and backmap is True. """ - top = Topology.from_gmx_topfile(TEST_DATA + "/topology_test/system.top", "test") - top.add_positions_from_file(TEST_DATA + "/topology_test/meta.gro", resolution="meta_mol") + top = Topology.from_gmx_topfile(TEST_DATA / "topology_test" / "system.top", "test") + top.add_positions_from_file(TEST_DATA / "topology_test" / "meta.gro", resolution="meta_mol") + + # check that the box is correctly read + assert np.allclose(top.box, np.array([10.0, 11.0, 12.0])) + for node in top.molecules[0].nodes: if node != 2: assert "position" in top.molecules[0].nodes[node].keys() @@ -87,10 +95,13 @@ def test_add_positions_from_pdb(): the meta_molecule positions are defined as well. In addition all build and backmap attributes have to be False. """ - top = Topology.from_gmx_topfile(TEST_DATA + "/topology_test/pdb.top", "test") - top.add_positions_from_file(TEST_DATA + "/topology_test/test.pdb") + top = Topology.from_gmx_topfile(TEST_DATA / "topology_test" / "pdb.top", "test") + top.add_positions_from_file(TEST_DATA / "topology_test" / "test.pdb") + + # check that the box is correctly read + assert np.allclose(top.box, np.array([11.8249, 12.0688, 11.0944])) - pdb_mols = read_pdb(TEST_DATA + "/topology_test/test.pdb") + pdb_mols = read_pdb(TEST_DATA / "topology_test" / "test.pdb") for idx, meta_mol in enumerate(top.molecules): for node in meta_mol.molecule.nodes: ref_pos = pdb_mols[idx].nodes[node]['position'] @@ -108,13 +119,13 @@ def test_add_positions_from_file_fail(): This test checks if coordinates for a residue at the molecule level are incomplete the appropiate error is raised. """ - top = Topology.from_gmx_topfile(TEST_DATA + "/topology_test/system.top", "test") + top = Topology.from_gmx_topfile(TEST_DATA / "topology_test" / "system.top", "test") with pytest.raises(IOError): - top.add_positions_from_file(TEST_DATA + "/topology_test/fail.gro") + top.add_positions_from_file(TEST_DATA / "topology_test" / "fail.gro") @staticmethod def test_convert_to_vermouth_system(): - top = Topology.from_gmx_topfile(TEST_DATA + "/topology_test/system.top", "test") + top = Topology.from_gmx_topfile(TEST_DATA / "topology_test" / "system.top", "test") system = top.convert_to_vermouth_system() assert isinstance(system, vermouth.system.System) assert len(system.molecules) == 1 diff --git a/setup.cfg b/setup.cfg index 9f671339..e0bd44c8 100644 --- a/setup.cfg +++ b/setup.cfg @@ -34,8 +34,8 @@ install-requires = # ?? requires-dist? pbr numpy decorator == 4.4.2 - networkx ~= 2.0 - vermouth >= 0.9.1 + networkx >= 2.0 + vermouth >= 0.9.6 scipy >= 1.6.0 tqdm zip-safe = False