Repository 'gromacs_modify_topology'
hg clone https://toolshed.g2.bx.psu.edu/repos/chemteam/gromacs_modify_topology

Changeset 0:5521a057ed6a (2022-01-27)
Commit message:
"planemo upload for repository https://github.com/galaxycomputationalchemistry/galaxy-tools-compchem/tree/master/tools/buildtools/topologyeditors commit ae026d4ea6fe2ebaa53611b86f9047941c7b899b"
added:
add_top.xml
gmxtras_add_newmolparam.py
gmxtras_add_restraints.py
gmxtras_extract_top.py
macros.xml
test-data/cid1_GMX.gro
test-data/cid1_GMX.top
test-data/posres_cid1.itp
test-data/water_bondedparams.itp
test-data/water_nonbondedparams.itp
b
diff -r 000000000000 -r 5521a057ed6a add_top.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/add_top.xml Thu Jan 27 18:16:37 2022 +0000
[
@@ -0,0 +1,149 @@
+<tool id="gromacs_modify_topology" name="Adding New Topology Information" version="@TOOL_VERSION@+galaxy@GALAXY_VERSION@" profile="20.09">
+    <description>to a GROMACS topology file</description>
+    <macros>
+        <import>macros.xml</import>
+        <token name="@GALAXY_VERSION@">0</token>
+    </macros>
+    <expand macro="requirements"/>
+    <command detect_errors="exit_code"><![CDATA[
+        #if $str($functionality.what2add) == "mol":
+            python3 '$__tool_directory__/gmxtras_add_newmolparam.py'
+                --top_file '$functionality.inputtopology'
+                --atom_file '$functionality.nonbondparam'
+                --mol_file '$functionality.bondparam'
+                --out '$newtop'
+        #end if
+
+        #if $str($functionality.what2add) == "restraints":
+            python3 '$__tool_directory__/gmxtras_add_restraints.py'
+                --top_file '$functionality.inputtopology'
+                --res_file '$functionality.posres'
+                --molecule '$functionality.targetmolecule'
+                --out '$newtop'
+        #end if
+
+        #if $str($functionality.what2add) == "both":
+            python3 '$__tool_directory__/gmxtras_add_restraints.py'
+                --top_file '$functionality.inputtopology'
+                --res_file '$functionality.posres'
+                --molecule '$functionality.targetmolecule'
+                --out 'odoylerules'
+            &&
+            python3 '$__tool_directory__/gmxtras_add_newmolparam.py'
+                --top_file 'odoylerules'
+                --atom_file '$functionality.nonbondparam'
+                --mol_file '$functionality.bondparam'
+                --out '$newtop'
+        #end if
+
+    ]]></command>
+    <inputs>
+        
+        <conditional name="functionality">
+             <param name="what2add" type="select" label="What new information are you adding to your topology file?">
+                 <option value="mol">A molecule's parameters</option>
+                 <option value="restraints">Position restraint information</option>
+                 <option value="both">Both a molecule's topology information and position restrain information</option>
+             </param>
+             <when value="mol">
+                 <param name="inputtopology" type="data" format="top" label="GROMACS Topology file to be modified" help="Topology file with missing information"/>
+                 <param name="nonbondparam" type="data" format="txt" label="Atom Types with Nonbonded Parameters" help="Atom types information from grep"/>
+                 <param name="bondparam" type="data" format="txt,itp" label="Molecule type information with bonded parameters" help="molecule type information"/>
+             </when>
+             <when value="restraints">
+                 <param name="inputtopology" type="data" format="top" label="GROMACS Topology file to be modified" help="Topology file with missing information"/>
+                 <param name="posres" type="data" format="itp" label="Position restraint file" help="Position restraint file created previously"/>
+  <param name="targetmolecule" type="text" label="Target molecule type" help="The molecule type name to which the restraints were applied"/>
+             </when>
+             <when value="both">
+                 <param name="inputtopology" type="data" format="top" label="GROMACS Topology file to be modified" help="Topology file with missing information"/>
+                 <param name="nonbondparam" type="data" format="txt" label="Atom Types with Nonbonded Parameters" help="Atom types information from grep"/>
+                 <param name="bondparam" type="data" format="txt,itp" label="Molecule type information with bonded parameters" help="molecule type information"/>
+                 <param name="posres" type="data" format="itp" label="Position restraint file" help="Position restraint file created previously"/>
+                 <param name="targetmolecule" type="text" label="Target molecule type" help="The molecule type name to which the restraints were applied"/>
+             </when>
+
+        </conditional>  
+    </inputs>
+    <outputs>
+        <data name="newtop" format="top" label="Modified file with new topology information ${on_string}"/>
+    </outputs>
+    <tests>
+        <test>
+            <conditional name="functionality">
+                <param name="what2add" value="mol" />
+                <param name="inputtopology" value="cid1_GMX.top" />
+                <param name="nonbondparam" value="water_nonbondedparams.itp" />
+                <param name="bondparam" value="water_bondedparams.itp" />
+            </conditional>
+            <output name="newtop">
+                <assert_contents>
+                    <has_text text="HW_tip4pew   1       1.008   0.0000  A   0.00000e+00  0.00000e+00"/>
+                    <has_text text="  2   HW_tip4pew  1       SOL       HW1      1       0.52422   1.00800"/>
+                </assert_contents>
+            </output>
+        </test>
+        <test>
+     <conditional name="functionality">
+             <param name="what2add" value="restraints" />
+             <param name="inputtopology" value="cid1_GMX.top" />
+             <param name="targetmolecule" value="cid1" />
+             <param name="posres" value="posres_cid1.itp" />
+            </conditional>
+ <output name="newtop">
+                <assert_contents>
+                    <has_text text=";  i funct       fcx        fcy        fcz"/>
+                    <has_text text="  42    1       1000       1000       1000"/>
+                </assert_contents>
+            </output>
+        </test>
+        <test>
+      <conditional name="functionality">
+             <param name="what2add" value="both" />
+             <param name="inputtopology" value="cid1_GMX.top" />
+             <param name="nonbondparam" value="water_nonbondedparams.itp" />
+             <param name="bondparam" value="water_bondedparams.itp" />
+             <param name="targetmolecule" value="cid1" />
+             <param name="posres" value="posres_cid1.itp" />
+            </conditional>
+ <output name="newtop">
+                <assert_contents>
+                    <has_text text="HW_tip4pew   1       1.008   0.0000  A   0.00000e+00  0.00000e+00"/>
+                    <has_text text="  2   HW_tip4pew  1       SOL       HW1      1       0.52422   1.00800"/>
+                    <has_text text=";  i funct       fcx        fcy        fcz"/>
+                    <has_text text="  42    1       1000       1000       1000"/>
+                </assert_contents>
+            </output>
+        </test>
+    </tests>
+    <help><![CDATA[
+
+Tool to modify and add new information to GROMACS topology files. This is particularly useful when working with systems
+that were created outside of GROMACS (for example, files created in AMBER or CHARMM and then converted over via acpype).
+This tool can also be used to complement the "gmx insert-molecules" tool, which currently only modifies the GROMACS
+structure files (gro) and requires further modification of the topology file for the newly populated system to be simulation ready.   
+
+.. class:: infomark
+
+**Input**
+
+1) The system topology file you are modifying, 
+
+2) a position restraint file (posres.itp) and specifying the name of the target molecule type you are restraining, 
+
+3) a molecule's atom types/nonbonded parameters to be inserted under the system's global [ atomtypes ], as well as
+
+4) the corresponding bonded parameters of that particular molecule found under [ moleculetype ].
+
+.. class:: infomark
+
+**Outputs**
+
+The new modified GROMACS topology file.
+
+
+    ]]></help>
+    <expand macro="citations">
+        <citation type="doi">doi:10.1186/1756-0500-5-367</citation>
+    </expand>
+</tool>
b
diff -r 000000000000 -r 5521a057ed6a gmxtras_add_newmolparam.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gmxtras_add_newmolparam.py Thu Jan 27 18:16:37 2022 +0000
[
@@ -0,0 +1,45 @@
+#!/usr/bin/env python3
+import argparse
+
+
+def __main__():
+    parser = argparse.ArgumentParser(
+        description='Adds New topologies to gromacs topology file')
+    parser.add_argument(
+                        '--top_file', default=None,
+                        help="Topology file input")
+    parser.add_argument(
+                        '--mol_file', default=None,
+                        help='molecule type and bonded parameters input')
+    parser.add_argument(
+                        '--atom_file', default=None,
+                        help='atomtype and nonbonded parameters input')
+    parser.add_argument(
+                        '--out', default=None,
+                        help='Path to output')
+    args = parser.parse_args()
+    with open(args.out, 'w') as fh_out:
+        with open(args.top_file, 'r') as fh:
+            # these two short loop takes care of
+            # adding the atom types and molecule types.
+            for line in fh:
+                fh_out.write(line)
+                if ';name   bond_type' in line:
+                    for contents in open(args.atom_file):
+                        fh_out.write(contents)
+                    break
+            for line in fh:
+                if '[ system ]' in line:
+                    fh_out.write("\n; Begin NewTopologyInfo\n")
+                    for contents in open(args.mol_file):
+                        fh_out.write(contents)
+                    fh_out.write("; end NewTopologyInfo\n\n")
+                    fh_out.write(line)
+                    break
+                fh_out.write(line)
+            for line in fh:
+                fh_out.write(line)
+
+
+if __name__ == "__main__":
+    __main__()
b
diff -r 000000000000 -r 5521a057ed6a gmxtras_add_restraints.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gmxtras_add_restraints.py Thu Jan 27 18:16:37 2022 +0000
[
@@ -0,0 +1,71 @@
+#!/usr/bin/env python3
+import argparse
+END_OF_MOL = ('[ moleculetype ]', '[ system ]')
+
+
+def __main__():
+    parser = argparse.ArgumentParser(
+        description='Add restriction to gromacs topology file')
+    parser.add_argument(
+                        '--top_file', default=None,
+                        help="Topology file input")
+    parser.add_argument(
+                        '--res_file', default=None,
+                        help='Restraint input')
+    parser.add_argument(
+                        '--molecule', default=None,
+                        help='Target Molecule Name you restrained')
+    parser.add_argument(
+                        '--out', default=None,
+                        help='Path to output')
+    args = parser.parse_args()
+    with open(args.out, 'w') as fh_out:
+        with open(args.top_file, 'r') as fh:
+            # for now, we will avoid using 'for line in fh:',
+            # since we have multiple places where we might want
+            # to read the next line
+            while True:
+                line = fh.readline()
+                if not line:
+                    # eof
+                    break
+                # always write out the line
+                fh_out.write(line)
+                # check if line matches molecule, then check if
+                # molecule name matches args.molecule
+                if line.strip().startswith('[ moleculetype ]'):
+                    not_found_molecule = True
+                    while not_found_molecule:
+                        line = fh.readline()
+                        if not line:
+                            # eof
+                            break
+                        # always write this line
+                        fh_out.write(line)
+                        if not line.strip().startswith(';') or (line.strip()
+                           and not line.strip().startswith(';')):
+                            # this line should be the name line,
+                            fields = line.strip().split()
+                            if fields[0] == args.molecule:
+                                # found our molecule!
+                                while True:
+                                    line = fh.readline()
+                                    if not line:
+                                        # eof
+                                        break
+                                    if line.strip().startswith(END_OF_MOL):
+                                        fh_out.write("\n#ifdef POSRES\n")
+                                        with open(args.res_file, 'r') as fh_re:
+                                            for line2 in fh_re:
+                                                fh_out.write(line2)
+                                        fh_out.write("#endif\n\n")
+                                        fh_out.write(line)
+                                        not_found_molecule = False
+                                        break
+                                    fh_out.write(line)
+                            else:
+                                break
+
+
+if __name__ == "__main__":
+    __main__()
b
diff -r 000000000000 -r 5521a057ed6a gmxtras_extract_top.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gmxtras_extract_top.py Thu Jan 27 18:16:37 2022 +0000
[
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+import argparse
+
+
+def __main__():
+    parser = argparse.ArgumentParser(
+        description='Adds New topologies to gromacs topology file')
+    parser.add_argument(
+                        '--top_file', default=None,
+                        help="Topologies input")
+    parser.add_argument(
+                        '--out_bondparam', default=None,
+                        help='moleculetype section')
+    parser.add_argument(
+                        '--out_nonbondparam', default=None,
+                        help='atomtypes section')
+
+    args = parser.parse_args()
+    # extracts the atom types with nonbonded terms from
+    # the new molecules and puts them in a new file
+    with open(args.top_file) as inFile:
+        with open(args.out_nonbondparam, "w") as outFile:
+            buffer = []
+            for line in inFile:
+                if line.startswith(";name   bond_type"):
+                    buffer = ['']
+                elif line.startswith("[ moleculetype ]"):
+                    outFile.write("".join(buffer))
+                    buffer = []
+                elif buffer:
+                    buffer.append(line)
+
+    # extracts the molecule types (rest of the force field parameters)
+    # with bonded terms and puts them in a new file
+    with open(args.top_file) as inFile:
+        with open(args.out_bondparam, "w") as outFile:
+            buffer = []
+            for line in inFile:
+                if line.startswith("[ moleculetype ]"):
+                    buffer = ["\n[ moleculetype ]\n"]
+                elif line.startswith("[ system ]"):
+                    outFile.write("".join(buffer))
+                    buffer = []
+                elif buffer:
+                    buffer.append(line)
+
+
+if __name__ == "__main__":
+    __main__()
b
diff -r 000000000000 -r 5521a057ed6a macros.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/macros.xml Thu Jan 27 18:16:37 2022 +0000
b
@@ -0,0 +1,15 @@
+<macros>
+    <token name="@TOOL_VERSION@">0</token>
+    <xml name="requirements">
+        <requirements>
+            <requirement type="package" version="3.9">python</requirement>
+            <yield />
+        </requirements>
+    </xml>
+    <xml name="citations">
+        <citations>
+            <citation type="doi">10.1016/j.softx.2015.06.001</citation>
+            <yield />
+        </citations>
+    </xml>
+</macros>
b
diff -r 000000000000 -r 5521a057ed6a test-data/cid1_GMX.gro
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/cid1_GMX.gro Thu Jan 27 18:16:37 2022 +0000
b
@@ -0,0 +1,45 @@
+UNL_GMX.gro created by acpype (v: 2021-02-05T22:15:50CET) on Wed Dec 15 14:23:59 2021
+ 42
+    1  UNL   C1    1  41.372  -2.389   7.399
+    1  UNL   C2    2  41.301  -2.314   7.306
+    1  UNL   C3    3  41.041  -2.283   7.776
+    1  UNL   C4    4  41.308  -2.500   7.454
+    1  UNL   C5    5  41.117  -2.462   7.333
+    1  UNL   C6    6  41.214  -2.146   7.824
+    1  UNL   C7    7  41.171  -2.350   7.272
+    1  UNL   C8    8  41.136  -2.247   7.876
+    1  UNL   C9    9  41.064  -2.202   7.667
+    1  UNL  C10   10  40.992  -2.201   7.537
+    1  UNL  C11   11  41.036  -2.061   7.071
+    1  UNL  C12   12  41.128  -2.130   6.971
+    1  UNL  C13   13  41.092  -2.270   7.171
+    1  UNL  C14   14  41.077  -2.120   7.205
+    1  UNL  C15   15  41.109  -2.380   6.943
+    1  UNL  C16   16  40.975  -2.093   7.314
+    1  UNL  N17   17  41.182  -2.538   7.424
+    1  UNL  N18   18  41.169  -2.119   7.697
+    1  UNL  N19   19  41.036  -2.108   7.442
+    1  UNL  N20   20  41.154  -2.267   7.031
+    1  UNL  O21   21  40.897  -2.277   7.520
+    1  UNL CL22   22  41.149  -2.318   8.029
+    1  UNL  H23   23  41.473  -2.363   7.427
+    1  UNL  H24   24  41.348  -2.227   7.261
+    1  UNL  H25   25  40.965  -2.359   7.784
+    1  UNL  H26   26  41.359  -2.562   7.527
+    1  UNL  H27   27  41.016  -2.495   7.310
+    1  UNL  H28   28  41.296  -2.090   7.865
+    1  UNL  H29   29  41.046  -1.952   7.068
+    1  UNL  H30   30  40.931  -2.085   7.048
+    1  UNL  H31   31  41.084  -2.140   6.872
+    1  UNL  H32   32  41.225  -2.080   6.965
+    1  UNL  H33   33  40.992  -2.317   7.160
+    1  UNL  H34   34  41.174  -2.078   7.235
+    1  UNL  H35   35  41.000  -2.372   6.932
+    1  UNL  H36   36  41.159  -2.370   6.847
+    1  UNL  H37   37  41.136  -2.474   6.993
+    1  UNL  H38   38  40.893  -2.164   7.305
+    1  UNL  H39   39  40.938  -1.991   7.304
+    1  UNL  H40   40  41.208  -2.049   7.635
+    1  UNL  H41   41  41.111  -2.044   7.468
+    1  UNL  H42   42  41.256  -2.276   7.041
+   11.59200    12.19000    23.64000
b
diff -r 000000000000 -r 5521a057ed6a test-data/cid1_GMX.top
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/cid1_GMX.top Thu Jan 27 18:16:37 2022 +0000
[
b'@@ -0,0 +1,476 @@\n+; cid1_GMX.top created by acpype (v: 2021-02-05T22:15:50CET) on Wed Dec 15 14:23:59 2021\n+\n+[ defaults ]\n+; nbfunc        comb-rule       gen-pairs       fudgeLJ fudgeQQ\n+1               2               yes             0.5     0.8333\n+\n+[ atomtypes ]\n+;name   bond_type     mass     charge   ptype   sigma         epsilon       Amb\n+ ca       ca          0.00000  0.00000   A     3.39967e-01   3.59824e-01 ; 1.91  0.0860\n+ cc       cc          0.00000  0.00000   A     3.39967e-01   3.59824e-01 ; 1.91  0.0860\n+ cd       cd          0.00000  0.00000   A     3.39967e-01   3.59824e-01 ; 1.91  0.0860\n+ c        c           0.00000  0.00000   A     3.39967e-01   3.59824e-01 ; 1.91  0.0860\n+ c3       c3          0.00000  0.00000   A     3.39967e-01   4.57730e-01 ; 1.91  0.1094\n+ nb       nb          0.00000  0.00000   A     3.25000e-01   7.11280e-01 ; 1.82  0.1700\n+ na       na          0.00000  0.00000   A     3.25000e-01   7.11280e-01 ; 1.82  0.1700\n+ n        n           0.00000  0.00000   A     3.25000e-01   7.11280e-01 ; 1.82  0.1700\n+ n4       n4          0.00000  0.00000   A     3.25000e-01   7.11280e-01 ; 1.82  0.1700\n+ o        o           0.00000  0.00000   A     2.95992e-01   8.78640e-01 ; 1.66  0.2100\n+ cl       cl          0.00000  0.00000   A     3.47094e-01   1.10876e+00 ; 1.95  0.2650\n+ ha       ha          0.00000  0.00000   A     2.59964e-01   6.27600e-02 ; 1.46  0.0150\n+ h4       h4          0.00000  0.00000   A     2.51055e-01   6.27600e-02 ; 1.41  0.0150\n+ hc       hc          0.00000  0.00000   A     2.64953e-01   6.56888e-02 ; 1.49  0.0157\n+ hx       hx          0.00000  0.00000   A     1.95998e-01   6.56888e-02 ; 1.10  0.0157\n+ h1       h1          0.00000  0.00000   A     2.47135e-01   6.56888e-02 ; 1.39  0.0157\n+ hn       hn          0.00000  0.00000   A     1.06908e-01   6.56888e-02 ; 0.60  0.0157\n+\n+[ moleculetype ]\n+;name            nrexcl\n+ cid1              3\n+\n+[ atoms ]\n+;   nr  type  resi  res  atom  cgnr     charge      mass       ; qtot   bond_type\n+     1   ca     1   cid1    C1    1    -0.236300     12.01000 ; qtot -0.236\n+     2   ca     1   cid1    C2    2    -0.079000     12.01000 ; qtot -0.315\n+     3   cc     1   cid1    C3    3    -0.068000     12.01000 ; qtot -0.383\n+     4   ca     1   cid1    C4    4     0.441200     12.01000 ; qtot 0.058\n+     5   ca     1   cid1    C5    5     0.436200     12.01000 ; qtot 0.494\n+     6   cd     1   cid1    C6    6    -0.088300     12.01000 ; qtot 0.406\n+     7   ca     1   cid1    C7    7    -0.300600     12.01000 ; qtot 0.105\n+     8   cc     1   cid1    C8    8    -0.083600     12.01000 ; qtot 0.022\n+     9   cd     1   cid1    C9    9    -0.229900     12.01000 ; qtot -0.208\n+    10    c     1   cid1   C10   10     0.721699     12.01000 ; qtot 0.513\n+    11   c3     1   cid1   C11   11    -0.099400     12.01000 ; qtot 0.414\n+    12   c3     1   cid1   C12   12     0.108800     12.01000 ; qtot 0.523\n+    13   c3     1   cid1   C13   13     0.196800     12.01000 ; qtot 0.720\n+    14   c3     1   cid1   C14   14    -0.100700     12.01000 ; qtot 0.619\n+    15   c3     1   cid1   C15   15     0.080100     12.01000 ; qtot 0.699\n+    16   c3     1   cid1   C16   16     0.099000     12.01000 ; qtot 0.798\n+    17   nb     1   cid1   N17   17    -0.641000     14.01000 ; qtot 0.157\n+    18   na     1   cid1   N18   18    -0.155100     14.01000 ; qtot 0.002\n+    19    n     1   cid1   N19   19    -0.586900     14.01000 ; qtot -0.585\n+    20   n4     1   cid1   N20   20    -0.687400     14.01000 ; qtot -1.272\n+    21    o     1   cid1   O21   21    -0.656100     16.00000 ; qtot -1.929\n+    22   cl     1   cid1  CL22   22    -0.020400     35.45000 ; qtot -1.949\n+    23   ha     1   cid1   H23   23     0.169000      1.00800 ; qtot -1.780\n+    24   ha     1   cid1   H24   24     0.138000      1.00800 ; qtot -1.642\n+    25   ha     1   cid1   H25   25     0.181000      1.00800 ; qtot -1.461\n+    26   h4     1   cid1   H26   26     0.052100      1.0080'..b'0-   O21\n+    19     16     14     34      9     0.00   0.65084   3 ;    N19-   C16-   C14-   H34\n+    20     12     11     29      9     0.00   0.65084   3 ;    N20-   C12-   C11-   H29\n+    20     12     11     30      9     0.00   0.65084   3 ;    N20-   C12-   C11-   H30\n+    20     13     14     34      9     0.00   0.65084   3 ;    N20-   C13-   C14-   H34\n+    21     10     19     41      9     0.00   8.36800   1 ;    O21-   C10-   N19-   H41\n+    21     10     19     41      9   180.00  10.46000   2 ;    O21-   C10-   N19-   H41\n+    22      8      3     25      9   180.00  16.73600   2 ;   CL22-    C8-    C3-   H25\n+    22      8      6     28      9   180.00  16.73600   2 ;   CL22-    C8-    C6-   H28\n+    23      1      2      7      9   180.00  15.16700   2 ;    H23-    C1-    C2-    C7\n+    23      1      2     24      9   180.00  15.16700   2 ;    H23-    C1-    C2-   H24\n+    23      1      4     17      9   180.00  15.16700   2 ;    H23-    C1-    C4-   N17\n+    23      1      4     26      9   180.00  15.16700   2 ;    H23-    C1-    C4-   H26\n+    28      6     18     40      9   180.00   7.11280   2 ;    H28-    C6-   N18-   H40\n+    29     11     12     31      9     0.00   0.65084   3 ;    H29-   C11-   C12-   H31\n+    29     11     12     32      9     0.00   0.65084   3 ;    H29-   C11-   C12-   H32\n+    29     11     14     34      9     0.00   0.62760   3 ;    H29-   C11-   C14-   H34\n+    30     11     12     31      9     0.00   0.65084   3 ;    H30-   C11-   C12-   H31\n+    30     11     12     32      9     0.00   0.65084   3 ;    H30-   C11-   C12-   H32\n+    30     11     14     34      9     0.00   0.62760   3 ;    H30-   C11-   C14-   H34\n+    31     12     20     42      9     0.00   0.65084   3 ;    H31-   C12-   N20-   H42\n+    32     12     20     42      9     0.00   0.65084   3 ;    H32-   C12-   N20-   H42\n+    33     13     14     34      9     0.00   0.65084   3 ;    H33-   C13-   C14-   H34\n+    33     13     20     42      9     0.00   0.65084   3 ;    H33-   C13-   N20-   H42\n+    34     14     16     38      9     0.00   0.65084   3 ;    H34-   C14-   C16-   H38\n+    34     14     16     39      9     0.00   0.65084   3 ;    H34-   C14-   C16-   H39\n+    35     15     20     42      9     0.00   0.65084   3 ;    H35-   C15-   N20-   H42\n+    36     15     20     42      9     0.00   0.65084   3 ;    H36-   C15-   N20-   H42\n+    37     15     20     42      9     0.00   0.65084   3 ;    H37-   C15-   N20-   H42\n+    38     16     19     41      9     0.00   0.00000   0 ;    H38-   C16-   N19-   H41\n+    39     16     19     41      9     0.00   0.00000   0 ;    H39-   C16-   N19-   H41\n+\n+[ dihedrals ] ; impropers\n+; treated as propers in GROMACS to use correct AMBER analytical function\n+;    i      j      k      l   func   phase     kd      pn\n+     1      7      2     24      4   180.00   4.60240   2 ;     C1-    C7-    C2-   H24\n+     1     26      4     17      4   180.00   4.60240   2 ;     C1-   H26-    C4-   N17\n+     2      5      7     13      4   180.00   4.60240   2 ;     C2-    C5-    C7-   C13\n+     3      6      8     22      4   180.00   4.60240   2 ;     C3-    C6-    C8-  CL22\n+     6      9     18     40      4   180.00   4.60240   2 ;     C6-    C9-   N18-   H40\n+     7     27      5     17      4   180.00   4.60240   2 ;     C7-   H27-    C5-   N17\n+     8      9      3     25      4   180.00   4.60240   2 ;     C8-    C9-    C3-   H25\n+     8     28      6     18      4   180.00   4.60240   2 ;     C8-   H28-    C6-   N18\n+     9     19     10     21      4   180.00  43.93200   2 ;     C9-   N19-   C10-   O21\n+    10      3      9     18      4   180.00   4.60240   2 ;    C10-    C3-    C9-   N18\n+    10     16     19     41      4   180.00   4.60240   2 ;    C10-   C16-   N19-   H41\n+    23      1      4      2      4   180.00   4.60240   2 ;    H23-    C1-    C4-    C2\n+\n+[ system ]\n+ cid1\n+\n+[ molecules ]\n+; Compound        nmols\n+ cid1              1     \n'
b
diff -r 000000000000 -r 5521a057ed6a test-data/posres_cid1.itp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/posres_cid1.itp Thu Jan 27 18:16:37 2022 +0000
[
@@ -0,0 +1,45 @@
+
+[ position_restraints ]
+;  i funct       fcx        fcy        fcz
+   1    1       1000       1000       1000
+   2    1       1000       1000       1000
+   3    1       1000       1000       1000
+   4    1       1000       1000       1000
+   5    1       1000       1000       1000
+   6    1       1000       1000       1000
+   7    1       1000       1000       1000
+   8    1       1000       1000       1000
+   9    1       1000       1000       1000
+  10    1       1000       1000       1000
+  11    1       1000       1000       1000
+  12    1       1000       1000       1000
+  13    1       1000       1000       1000
+  14    1       1000       1000       1000
+  15    1       1000       1000       1000
+  16    1       1000       1000       1000
+  17    1       1000       1000       1000
+  18    1       1000       1000       1000
+  19    1       1000       1000       1000
+  20    1       1000       1000       1000
+  21    1       1000       1000       1000
+  22    1       1000       1000       1000
+  23    1       1000       1000       1000
+  24    1       1000       1000       1000
+  25    1       1000       1000       1000
+  26    1       1000       1000       1000
+  27    1       1000       1000       1000
+  28    1       1000       1000       1000
+  29    1       1000       1000       1000
+  30    1       1000       1000       1000
+  31    1       1000       1000       1000
+  32    1       1000       1000       1000
+  33    1       1000       1000       1000
+  34    1       1000       1000       1000
+  35    1       1000       1000       1000
+  36    1       1000       1000       1000
+  37    1       1000       1000       1000
+  38    1       1000       1000       1000
+  39    1       1000       1000       1000
+  40    1       1000       1000       1000
+  41    1       1000       1000       1000
+  42    1       1000       1000       1000
b
diff -r 000000000000 -r 5521a057ed6a test-data/water_bondedparams.itp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/water_bondedparams.itp Thu Jan 27 18:16:37 2022 +0000
[
@@ -0,0 +1,61 @@
+;
+; Horn et al. (2004). J. Chem. Phys.120, 9665-9678
+;
+
+
+[ moleculetype ]
+; molname nrexcl
+SOL 2
+
+[ atoms ]
+; id  at type     res nr  res name  at name  cg nr  charge    mass
+  1   OW_tip4pew  1       SOL       OW       1       0        16.00000
+  2   HW_tip4pew  1       SOL       HW1      1       0.52422   1.00800
+  3   HW_tip4pew  1       SOL       HW2      1       0.52422   1.00800
+  4   MW          1       SOL       MW       1      -1.04844   0.00000
+
+#ifndef FLEXIBLE
+
+[ settles ]
+; i funct doh dhh
+1 1 0.09572 0.15139
+
+#else
+[ bonds ]
+; i     j       funct   length  force.c.
+1       2       1       0.09572 502416.0 0.09572        502416.0 
+1       3       1       0.09572 502416.0 0.09572        502416.0 
+        
+[ angles ]
+; i     j       k       funct   angle   force.c.
+2       1       3       1       104.52  628.02  104.52  628.02  
+
+#endif
+
+
+[ virtual_sites3 ]
+; Vsite from                    funct   a               b
+4       1       2       3       1       0.106676721     0.106676721
+
+
+[ exclusions ]
+1 2 3 4
+2 1 3 4
+3 1 2 4
+4 1 2 3
+
+
+; The position of the virtual site is computed as follows:
+;
+; O
+;         
+;      V
+;   
+; H H
+;
+; Ewald tip4p:
+; const = distance (OV) / [ cos (angle(VOH))  * distance (OH) ]
+;   0.0125 nm / [ cos (52.26 deg) * 0.09572 nm ]
+; then a = b = 0.5 * const = 0.106676721
+;
+; Vsite pos x4 = x1 + a*(x2-x1) + b*(x3-x1)
b
diff -r 000000000000 -r 5521a057ed6a test-data/water_nonbondedparams.itp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/water_nonbondedparams.itp Thu Jan 27 18:16:37 2022 +0000
b
@@ -0,0 +1,3 @@
+HW_tip4pew   1       1.008   0.0000  A   0.00000e+00  0.00000e+00
+OW_tip4pew   8      16.00    0.0000  A   3.16435e-01  6.80946e-01
+MW           0       0.0000  0.0000  D   0.00000e+00  0.00000e+00