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

Changeset 0:743bd6aa3c7a (2020-08-24)
Next changeset 1:8f6ad93973cb (2020-10-28)
Commit message:
"planemo upload for repository https://github.com/galaxycomputationalchemistry/galaxy-tools-compchem/ commit 1b23e024af45cc0999d9142d07de6897d4189ec2"
added:
angle.py
dihedrals.py
distance_multiple.py
distance_single.py
end-to-end.py
extract_rmsd.py
extract_rmsd.xml
hbonds.py
macros.xml
pca_cosine.py
ramachandran_auto_protein.py
ramachandran_auto_protein_html.j2
ramachandran_plots.py
rdf.py
test-data/Angle_Analysis_Plot.png
test-data/Angle_Analysis_raw_data.tabular
test-data/Dihedral_Analysis_Plot.png
test-data/Dihedral_analysis_raw_data.tabular
test-data/Distance_Analysis_Plot.png
test-data/Distance_Analysis_raw_data.tabular
test-data/RDF_Analysis_Plot.png
test-data/RDF_raw_data.tabular
test-data/Ramachandran_Plot_raw_data.tabular
test-data/Ramachandran_Plot_raw_data_gmx.tabular
test-data/list1.txt
test-data/list2.txt
test-data/test.dcd
test-data/test.gro
test-data/test.pdb
test-data/test.xtc
test-data/test.yml
b
diff -r 000000000000 -r 743bd6aa3c7a angle.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/angle.py Mon Aug 24 16:41:41 2020 -0400
[
@@ -0,0 +1,75 @@
+#!/usr/bin/env python
+
+import argparse
+import csv
+import sys
+
+import MDAnalysis as mda
+
+import matplotlib
+import matplotlib.pyplot as plt
+
+import numpy as np
+from numpy.linalg import norm
+
+matplotlib.use('Agg')  # noqa
+
+
+def parse_command_line(argv):
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--itraj', help='input traj')
+    parser.add_argument('--istr', help='input str')
+    parser.add_argument('--itrajext', help='input traj ext')
+    parser.add_argument('--istrext', help='input str ext')
+    parser.add_argument('--isegid1', help='segid 1')
+    parser.add_argument('--iresid1', help='resid 1')
+    parser.add_argument('--iname1', help='name 1')
+    parser.add_argument('--isegid2', help='segid 2')
+    parser.add_argument('--iresid2', help='resid 2')
+    parser.add_argument('--iname2', help='name 2')
+    parser.add_argument('--isegid3', help='segid 3')
+    parser.add_argument('--iresid3', help='resid 3')
+    parser.add_argument('--iname3', help='name 3')
+    parser.add_argument('--output', help='output')
+    parser.add_argument('--oangle_plot', help='angle plot')
+    return parser.parse_args()
+
+
+args = parse_command_line(sys.argv)
+
+atom1 = "(segid %s and resid %s and name %s)" % \
+    (args.isegid1, args.iresid1, args.iname1)
+atom2 = "(segid %s and resid %s and name %s)" % \
+    (args.isegid2, args.iresid2, args.iname2)
+atom3 = "(segid %s and resid %s and name %s)" % \
+    (args.isegid3, args.iresid3, args.iname3)
+
+
+def theta(u):
+    A = u.select_atoms(atom1).center_of_geometry()
+    B = u.select_atoms(atom2).center_of_geometry()
+    C = u.select_atoms(atom3).center_of_geometry()
+    BA = A - B
+    BC = C - B
+    theta = np.arccos(np.dot(BA, BC)/(norm(BA)*norm(BC)))
+    return np.rad2deg(theta)
+
+
+u = mda.Universe(args.istr, args.itraj,
+                 topology_format=args.istrext, format=args.itrajext)
+data = np.array([(u.trajectory.frame, theta(u)) for ts in u.trajectory])
+frame, theta = data.T
+
+with open(args.output, 'w') as f:
+    writer = csv.writer(f, delimiter='\t')
+    writer.writerows(zip(frame, theta))
+
+with open(args.output) as f:
+    g = [xtmp.strip() for xtmp in f]
+    data = [tuple(map(float, xtmp.split())) for xtmp in g[0:]]
+    time = [xtmp[0] for xtmp in data]
+    angle = [xtmp[1] for xtmp in data]
+    plt.plot(time, angle)
+    plt.xlabel('Frame No.')
+    plt.ylabel('Angle (degrees)')
+    plt.savefig(args.oangle_plot, format='png')
b
diff -r 000000000000 -r 743bd6aa3c7a dihedrals.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dihedrals.py Mon Aug 24 16:41:41 2020 -0400
[
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+
+import argparse
+import csv
+import sys
+
+import MDAnalysis as mda
+from MDAnalysis.lib.distances import calc_dihedrals
+
+import matplotlib
+import matplotlib.pyplot as plt
+
+import numpy as np
+
+matplotlib.use('Agg')  # noqa
+
+
+def parse_command_line(argv):
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--itraj', help='input traj')
+    parser.add_argument('--istr', help='input str')
+    parser.add_argument('--itrajext', help='input traj ext')
+    parser.add_argument('--istrext', help='input str ext')
+    parser.add_argument('--isegid1', help='segid 1')
+    parser.add_argument('--iresid1', help='resid 1')
+    parser.add_argument('--iname1', help='name 1')
+    parser.add_argument('--isegid2', help='segid 2')
+    parser.add_argument('--iresid2', help='resid 2')
+    parser.add_argument('--iname2', help='name 2')
+    parser.add_argument('--isegid3', help='segid 3')
+    parser.add_argument('--iresid3', help='resid 3')
+    parser.add_argument('--iname3', help='name 3')
+    parser.add_argument('--isegid4', help='segid 4')
+    parser.add_argument('--iresid4', help='resid 4')
+    parser.add_argument('--iname4', help='name 4')
+    parser.add_argument('--output', help='output')
+    parser.add_argument('--odihedral_plot', help='dihedral plot')
+    return parser.parse_args()
+
+
+args = parse_command_line(sys.argv)
+
+atom1 = "(segid %s and resid %s and name %s)" % \
+    (args.isegid1, args.iresid1, args.iname1)
+atom2 = "(segid %s and resid %s and name %s)" % \
+    (args.isegid2, args.iresid2, args.iname2)
+atom3 = "(segid %s and resid %s and name %s)" % \
+    (args.isegid3, args.iresid3, args.iname3)
+atom4 = "(segid %s and resid %s and name %s)" % \
+    (args.isegid4, args.iresid4, args.iname4)
+
+
+def psi(u):
+    A = u.select_atoms(atom1).positions
+    B = u.select_atoms(atom2).positions
+    C = u.select_atoms(atom3).positions
+    D = u.select_atoms(atom4).positions
+    psi = calc_dihedrals(A, B, C, D)
+    return np.rad2deg(psi)
+
+
+u = mda.Universe(args.istr, args.itraj,
+                 topology_format=args.istrext, format=args.itrajext)
+data = np.array([(u.trajectory.frame, psi(u)) for ts in u.trajectory])
+frame, psi = data.T
+PSI = np.concatenate(psi, axis=0)
+
+zip(frame, PSI)
+
+with open(args.output, 'w') as f:
+    writer = csv.writer(f, delimiter='\t')
+    writer.writerows(zip(frame, PSI))
+
+with open(args.output) as f:
+    g = [xtmp.strip() for xtmp in f]
+    data = [tuple(map(float, xtmp.split())) for xtmp in g[0:]]
+    time = [xtmp[0] for xtmp in data]
+    dihedral = [xtmp[1] for xtmp in data]
+    plt.plot(time, dihedral)
+    plt.xlabel('Frame No.')
+    plt.ylabel('Dihedral (degrees)')
+    plt.savefig(args.odihedral_plot, format='png')
b
diff -r 000000000000 -r 743bd6aa3c7a distance_multiple.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/distance_multiple.py Mon Aug 24 16:41:41 2020 -0400
[
@@ -0,0 +1,56 @@
+import argparse
+import sys
+
+import MDAnalysis as mda
+from MDAnalysis.analysis import distances
+
+import numpy as np
+
+
+def parse_command_line(argv):
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--itraj', help='input traj')
+    parser.add_argument('--istr', help='input str')
+    parser.add_argument('--itrajext', help='input traj ext')
+    parser.add_argument('--istrext', help='input str ext')
+    parser.add_argument('--list1', help='list 2')
+    parser.add_argument('--list2', help='list 2')
+    parser.add_argument('--output', help='output')
+    parser.add_argument('--header', dest='header', action='store_true')
+    return parser.parse_args()
+
+
+args = parse_command_line(sys.argv)
+
+u = mda.Universe(args.istr, args.itraj,
+                 topology_format=args.istrext, format=args.itrajext)
+
+list1 = np.loadtxt(args.list1, dtype=str, delimiter="\t", ndmin=1)
+list2 = np.loadtxt(args.list2, dtype=str, delimiter="\t", ndmin=1)
+
+sel1 = [u.select_atoms(selection) for selection in list1]
+sel2 = [u.select_atoms(selection) for selection in list2]
+
+d = np.empty((u.trajectory.n_frames, list1.shape[0], list2.shape[0]),)
+
+for ts in u.trajectory:
+    c_o_m1 = np.array([selection.center_of_mass() for selection in sel1])
+    c_o_m2 = np.array([selection.center_of_mass() for selection in sel2])
+    distances.distance_array(c_o_m1, c_o_m2, result=d[ts.frame])
+
+d = np.hstack((
+    np.array(np.reshape(np.arange(
+        0, d.shape[0]), (d.shape[0], 1)), dtype=int),  # add column w frame
+    np.reshape(d, (d.shape[0], d.shape[1] * d.shape[2]))
+))
+
+if args.header:
+    header = 'Frame\t' + '\t'.join(
+        ['-'.join(pair) for pair in zip(
+            sum([[n, ] * len(list2) for n in list1], []),
+            list(list2) * len(list1),)]).replace(' ', '_')
+else:
+    header = ''
+
+np.savetxt(args.output, d, header=header, comments='',
+           fmt=['%d'] + ['%f'] * (d.shape[1] - 1), delimiter='\t')
b
diff -r 000000000000 -r 743bd6aa3c7a distance_single.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/distance_single.py Mon Aug 24 16:41:41 2020 -0400
[
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+
+import argparse
+import sys
+
+import MDAnalysis as mda
+
+import matplotlib
+import matplotlib.pyplot as plt
+
+import numpy as np
+
+matplotlib.use('Agg')  # noqa
+
+
+def parse_command_line(argv):
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--itraj', help='input traj')
+    parser.add_argument('--istr', help='input str')
+    parser.add_argument('--itrajext', help='input traj ext')
+    parser.add_argument('--istrext', help='input str ext')
+    parser.add_argument('--isegid1', help='segid 1')
+    parser.add_argument('--iresid1', help='resid 1')
+    parser.add_argument('--iname1', help='name 1')
+    parser.add_argument('--isegid2', help='segid 2')
+    parser.add_argument('--iresid2', help='resid 2')
+    parser.add_argument('--iname2', help='name 2')
+    parser.add_argument('--output', help='output')
+    parser.add_argument('--odistance_plot', help='odistance plot')
+    parser.add_argument('--header',  dest='header', action='store_true')
+    return parser.parse_args()
+
+
+args = parse_command_line(sys.argv)
+
+atom1 = "(segid %s and resid %s and name %s)" % \
+    (args.isegid1, args.iresid1, args.iname1)
+atom2 = "(segid %s and resid %s and name %s)" % \
+    (args.isegid2, args.iresid2, args.iname2)
+
+u = mda.Universe(args.istr, args.itraj,
+                 topology_format=args.istrext, format=args.itrajext)
+x = u.select_atoms(atom1)
+y = u.select_atoms(atom2)
+
+with open(args.output, 'w') as f:
+    if args.header:
+        f.write('Frame\tDistance')
+    for t in u.trajectory:
+        r = x.positions - y.positions
+        d = np.linalg.norm(r)
+        f.write(str(t.frame) + '\t ')
+        f.write(str(d) + '\n')
+
+with open(args.output) as f:
+    g = [xtmp.strip() for xtmp in f]
+    data = [tuple(map(float, xtmp.split())) for xtmp in g[0:]]
+    time = [xtmp[0] for xtmp in data]
+    distance = [xtmp[1] for xtmp in data]
+    plt.plot(time, distance)
+    plt.xlabel('Frame No.')
+    plt.ylabel(r'Distance ($\AA$)')
+    plt.savefig(args.odistance_plot, format='png')
b
diff -r 000000000000 -r 743bd6aa3c7a end-to-end.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/end-to-end.py Mon Aug 24 16:41:41 2020 -0400
[
@@ -0,0 +1,96 @@
+#!/usr/bin/env python
+
+import argparse
+import itertools
+import sys
+
+import MDAnalysis as mda
+
+import matplotlib
+import matplotlib.pyplot as plt
+
+import numpy as np
+import numpy.linalg
+
+matplotlib.use('Agg')  # noqa
+
+
+def parse_command_line(argv):
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--itraj', help='input traj')
+    parser.add_argument('--istr', help='input str')
+    parser.add_argument('--itrajext', help='input traj ext')
+    parser.add_argument('--istrext', help='input str ext')
+    parser.add_argument('--isegid1', help='segid 1')
+    parser.add_argument('--ilabel', help='plot label')
+    parser.add_argument('--ititle1', help='plot title')
+    parser.add_argument('--output1', help='output1 - timeseries')
+    parser.add_argument('--o_plot', help='End to End plot')
+    return parser.parse_args()
+
+
+args = parse_command_line(sys.argv)
+
+
+u = mda.Universe(args.istr, args.itraj,
+                 topology_format=args.istrext, format=args.itrajext)
+
+ntermatoms = "(segid %s and name N)" % \
+    (args.isegid1)
+ctermatoms = "(segid %s and name C)" % \
+    (args.isegid1)
+# not sure how robust this selection really is
+nterm = u.select_atoms(ntermatoms)[0]  # first atom named N
+cterm = u.select_atoms(ctermatoms)[-1]  # takes the last atom named 'C'
+
+enddist = []
+
+for ts in u.trajectory:  # iterate through all frames
+    r = cterm.position - nterm.position  # e-to-e vector from atom positions
+    d = numpy.linalg.norm(r)   # end-to-end distance
+    enddist.append((ts.frame, d))
+
+enddist = np.array(enddist)
+
+
+color = itertools.cycle(['r', 'b', 'gold'])
+
+fig, axs = plt.subplots(1, 2, sharex=False, sharey=False, tight_layout=True)
+
+params = {
+    'axes.labelsize': 8,
+    'legend.fontsize': 10,
+    'xtick.labelsize': 10,
+    'ytick.labelsize': 10,
+    'text.usetex': False,
+    'figure.figsize': [4.5, 4.5],
+    'figure.dpi': 300
+}
+plt.rcParams.update(params)
+
+axs[0].plot(enddist[:, 0], enddist[:, 1], 'r-', lw=2, label=args.ilabel)
+axs[0].set_xlabel("number of frames")
+axs[0].set_ylabel(r"End to end distance  ($\AA$)")
+axs[0].legend()
+
+n, bins, patches = axs[1].hist(enddist[:, 1], color=next(
+    color), label=args.ilabel, alpha=0.5, density=True, stacked=True)
+
+axs[1].legend()
+axs[1].set_ylabel('Density Normalised Frequency')
+axs[1].set_xlabel(r'End to end distance ($\AA$)')
+fig.suptitle(args.ititle1, fontsize=12, fontweight='bold')
+fig.subplots_adjust(top=0.45)
+
+print(
+    " \n".join(
+        [
+            'The End to End distance is measured between the following atoms:',
+            str(nterm),
+            str(cterm)]))
+
+# svg is better but sticking with png for now
+plt.savefig(args.o_plot, format='png')
+
+
+np.savetxt(args.output1, enddist, delimiter='\t')
b
diff -r 000000000000 -r 743bd6aa3c7a extract_rmsd.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/extract_rmsd.py Mon Aug 24 16:41:41 2020 -0400
[
@@ -0,0 +1,129 @@
+import argparse
+import json
+
+import MDAnalysis as m
+from MDAnalysis.analysis import align, rms
+from MDAnalysis.analysis.base import AnalysisFromFunction
+from MDAnalysis.coordinates.memory import MemoryReader
+
+import numpy as np
+
+
+def calc_rmsd(str_files, traj_files, ref_str, str_format, traj_format,
+              ref_str_format, filepath_out, group, start, end, step,
+              fitting_atoms):
+    """
+    the function will cycle through range 0 to no_t and load all files found.
+
+    str_files: text file with filepaths for structures, one on each line
+    traj_files: text file with filepaths for trajectories, one on each line
+    ref_str: reference structure for fitting
+    filepath_in: directory where the files are located
+    filepath_out: pickle file where results (3D matrix) should be saved to
+
+    group: atoms for which RMSD should be calculated;
+        use the MDAnalysis selection language
+    fitting_atoms: atoms used for str alignment prior to RMSD calculation;
+        use the MDAnalysis selection language
+
+    start: first trajectory frame to calculate RMSD
+    end: last trajectory frame to calculate RMSD
+    step: how frequently frames are sampled between start and end; obviously,
+        the larger the step, the quicker the script finishes
+    """
+
+    # open list of files
+    with open(str_files) as f1, open(traj_files) as f2:
+        str_file_list = f1.read().strip().split('\n')
+        traj_file_list = f2.read().strip().split('\n')
+
+        if sum(1 for line in f1) != sum(1 for line in f2):
+            raise IOError('Number of structure and trajectory files unequal.')
+
+    no_t = len(traj_file_list)
+
+    data = np.zeros((no_t, no_t,
+                    int((end - start)/step + ((end - start) % step > 0))))
+
+    # load files
+    universes = {}
+
+    for traj in range(no_t):
+        mobile = m.Universe(str_file_list[traj], traj_file_list[traj],
+                            format=traj_format, topology_format=str_format)
+        ref = m.Universe(ref_str, topology_format=ref_str_format)
+
+        mobile.trajectory[-1]  # set mobile trajectory to last frame
+        ref.trajectory[0]  # set reference trajectory to first frame
+
+        # perform alignment
+        align.AlignTraj(mobile, ref, select=fitting_atoms,
+                        in_memory=True).run()
+
+        grp = mobile.select_atoms(group)
+        universes[traj] = m.core.universe.Merge(grp)  # create Universe w grp
+        coordinates = AnalysisFromFunction(lambda ag: ag.positions.copy(),
+                                           grp).run().results  # write to uv
+        universes[traj].load_new(coordinates, format=MemoryReader)
+
+    print("All trajs loaded by MDAnalysis")
+
+    # calculate differences
+    for traj1 in range(no_t):
+        print("Calculating differences for traj {}".format(traj1))
+        for traj2 in range(traj1):
+
+            u1 = universes[traj1]
+            u2 = universes[traj2]
+
+            l1 = u1.select_atoms(group)
+            l2 = u2.select_atoms(group)
+
+            rmsd = rms.RMSD(l1, l2)
+
+            rmsd.run()
+
+            data[traj1, traj2] = rmsd.rmsd[:, 2]
+            data[traj2, traj1] = rmsd.rmsd[:, 2]
+
+    with open(filepath_out, 'w') as f:
+        json.dump(data.tolist(), f, indent=4, sort_keys=True)
+
+    print("Done!")
+    return
+
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--trajs', required=True,
+                        help='File containing trajectory filepaths.')
+    parser.add_argument("--strs",
+                        help='File containing structure filepaths.')
+    parser.add_argument("--ref-str",
+                        help='File containing reference structure.')
+    parser.add_argument('--traj-format', required=True,
+                        help='Trajectory format.')
+    parser.add_argument("--str-format", help='Structure format.')
+    parser.add_argument("--ref-str-format",
+                        help='Reference structure format.')
+    parser.add_argument('-o', '--outfile',
+                        help="Path to the output JSON file")
+    parser.add_argument('--group', help="Atoms for which RMSD should be"
+                        "calculated in MDAnalysis selection language")
+    parser.add_argument('--fitting', help="Fitting atoms for alignment"
+                        "prior to RMSD calculation")
+    parser.add_argument('--start', type=int,
+                        help="First trajectory frame to calculate RMSD")
+    parser.add_argument('--end', type=int,
+                        help="Last trajectory frame to calculate RMSD")
+    parser.add_argument('--step', type=int,
+                        help="Frame sampling frequency for RMSD calculation")
+    args = parser.parse_args()
+
+    calc_rmsd(args.strs, args.trajs, args.ref_str, args.str_format,
+              args.traj_format, args.ref_str_format, args.outfile,
+              args.group, args.start, args.end, args.step, args.fitting)
+
+
+if __name__ == "__main__":
+    main()
b
diff -r 000000000000 -r 743bd6aa3c7a extract_rmsd.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/extract_rmsd.xml Mon Aug 24 16:41:41 2020 -0400
[
@@ -0,0 +1,109 @@
+<tool id="mdanalysis_extract_rmsd" name="Extract RMSD distance matrix data" version="@TOOL_VERSION@+galaxy@GALAXY_VERSION@">
+    <description>from MD ensemble with MDAnalysis</description>
+    <macros>
+        <import>macros.xml</import>
+        <token name="@GALAXY_VERSION@">0</token>
+    </macros>
+    <expand macro="requirements"/>
+    <command detect_errors="exit_code"><![CDATA[
+        #for t in $strs:
+            echo $t &>> ./strs.txt &&
+        #end for
+        #for t in $trajs:
+            echo $t &>> ./trajs.txt &&
+        #end for
+        
+        python '$__tool_directory__/extract_rmsd.py'
+            --trajs trajs.txt
+            --strs strs.txt
+            --ref-str '$refstr'
+            --traj-format '$trajs[0].ext'
+            --str-format '$strs[0].ext'
+            --ref-str-format '${refstr.ext}'
+            --outfile '$output'
+            --group '$group'
+            --fitting '$fitting'
+            --start '$start'
+            --end '$end'
+            --step '$step'
+
+]]></command>
+    <inputs>
+        <param type="data_collection" name="strs" label="Input structures" format="pdb,gro"/>
+        <param type="data_collection" name="trajs" label="Input trajectories" format="xtc,dcd,trr"/>
+        <param name="refstr" type="data" format="pdb,gro" label="Reference structure" help="Structure for aligning all trajectories against."/>
+        <param name='group' type='text' label='Group for RMSD calculation' />
+        <param name='fitting' type='text' label='Group for alignment prior to RMSD calculation' />
+        <param name="start" type="integer" min="0" value="0" label="First trajectory frame for RMSD calculation" />
+        <param name="end" type="integer"  min="0" value="0" label="End trajectory frame for RMSD calculation" />
+        <param name="step" type="integer"  min="1" value="1" label="Frequency of trajectory frame sampling for RMSD calculation" />
+    </inputs>
+    <outputs>
+        <data name="output" format="json" />
+    </outputs>
+    <tests>
+        <test>
+            <param name="strs">
+                <collection type="list">
+                    <element name="str1" ftype="gro" value="test.gro" />
+                    <element name="str2" ftype="gro" value="test.gro" />
+                </collection>
+            </param>
+            <param name="trajs">
+                <collection type="list">
+                    <element name="traj1" ftype="xtc" value="test.xtc" />
+                    <element name="traj2" ftype="xtc" value="test.xtc" />
+                </collection>
+            </param>
+
+            <param name="refstr" ftype="pdb" value="test.pdb" />
+            <param name="fitting" value="protein" />
+            <param name="group" value="resname BGLC" />
+            <param name="start" value="0" />
+            <param name="end" value="15" />
+            <param name="step" value="1" />
+            <output name="output"> 
+                <assert_contents>
+                    <has_text text="0.0" n="20"/>
+                    <has_size value="1588" />
+                    <has_n_lines n="74" />
+                </assert_contents>
+            </output>
+        </test>
+    </tests>
+    <help><![CDATA[
+.. class:: infomark
+
+**What it does**
+
+This tool takes collections of MD structures and trajectories and inputs and performs the following steps:
+  - aligns them to a reference structure
+  - calculates RMSD differences for a selected group of atoms between all possible pairs of trajectories at all time points
+  - returns RMSD data as a three-dimensional tensor.
+
+_____
+
+
+.. class:: infomark
+
+**Input**
+
+       - Collection of structure files  (PDB, GRO).
+       - Collection of trajectory files  (DCD, XTC, TRR).
+       - Single structure file for alignment.
+       - User selection of fitting group, alignment group, start and end frames of the trajectory, and a frame step for the calculation.
+
+_____
+
+
+.. class:: infomark
+
+**Output**
+
+The output consists of a three-dimensional numpy array saved in JSON format, with dimensions N x N x t, where N is the number of trajectories and t is the number of time frames. Thus, the file effectively contains multiple distance matrices (one for each time step) representing the RMSD between all pairs of trajectories for a chosen group of atoms.
+
+It may be more useful to flatten the tensor to a two-dimensional matrix by averaging or slicing on the time axis; this can be achieved using the 'Hierarchical clustering' tool.
+
+    ]]></help>
+    <expand macro="citations" />
+</tool>
\ No newline at end of file
b
diff -r 000000000000 -r 743bd6aa3c7a hbonds.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hbonds.py Mon Aug 24 16:41:41 2020 -0400
b
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+
+import argparse
+import csv
+import sys
+
+import MDAnalysis as mda
+import MDAnalysis.analysis.hbonds
+
+import pandas as pd
+
+
+def parse_command_line(argv):
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--itraj', help='input traj')
+    parser.add_argument('--istr', help='input str')
+    parser.add_argument('--itrajext', help='input traj ext')
+    parser.add_argument('--istrext', help='input str ext')
+    parser.add_argument('--isegid1', help='segid 1')
+    parser.add_argument('--isegid2', help='segid 2')
+    parser.add_argument('--idistance', help='cutoff distance')
+    parser.add_argument('--iangle', help='ctoff angle')
+    parser.add_argument('--output', help='output')
+    parser.add_argument('--ofreq_output', help='frequency output')
+    parser.add_argument('--onumber_output', help='number of hbond output')
+    parser.add_argument('--otime_output', help='time steps output')
+    return parser.parse_args()
+
+
+args = parse_command_line(sys.argv)
+
+selection1 = "segid %s" % args.isegid1
+selection2 = "segid %s" % args.isegid2
+distance = float(args.idistance)
+angle = float(args.iangle)
+
+u = mda.Universe(args.istr, args.itraj,
+                 topology_format=args.istrext, format=args.itrajext)
+
+h = MDAnalysis.analysis.hbonds.HydrogenBondAnalysis(
+    u, selection1, selection2, distance=distance, angle=angle)
+h.run()
+h.generate_table()
+
+df = pd.DataFrame.from_records(h.table)
+df.to_csv(args.output, sep='\t')
+
+t1 = list(h.count_by_type())
+t2 = list(h.count_by_time())
+t3 = list(h.timesteps_by_type())
+
+with open(args.ofreq_output, 'w') as f:
+    f.write("donor_index\tacceptor_index\t\
+            donor_resname\tdonor_resid\tdonor_atom\t\
+            hydrogen_atom\tacceptor_reansme\tacceptor_resid\t\
+            acceptor_atom\tfrequency\n")
+    writer = csv.writer(f, delimiter='\t')
+    writer.writerows(t1)
+
+
+with open(args.onumber_output, 'w') as f1:
+    f1.write("time_step\tno_of_h_bonds\n")
+    writer = csv.writer(f1, delimiter='\t')
+    writer.writerows(t2)
+
+with open(args.otime_output, 'w') as f2:
+    f2.write("donor_index\tacceptor_index\t\
+             donor_resname\tdonor_resid\tdonor_atom\t\
+             hydrogen_atom\tacceptor_reansme\tacceptor_resid\t\
+             acceptor_atom\ttime_step\n")
+    writer = csv.writer(f2, delimiter='\t')
+    writer.writerows(t3)
b
diff -r 000000000000 -r 743bd6aa3c7a macros.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/macros.xml Mon Aug 24 16:41:41 2020 -0400
b
@@ -0,0 +1,43 @@
+<macros>
+    <token name="@TOOL_VERSION@">1.0.0</token>
+    <xml name="requirements">
+        <requirements>
+            <requirement type="package" version="@TOOL_VERSION@">mdanalysis</requirement>
+            <yield/>
+        </requirements>
+    </xml>
+    <xml name="analysis_inputs">
+        <param format="dcd,xtc" name="trajin" type="data" label="DCD/XTC trajectory input" />
+        <param format="pdb,gro" name="strin" type="data" label="PDB/GRO input" />
+        <yield/>
+    </xml>
+    <xml name="sanitizer">
+        <sanitizer invalid_char="">
+            <valid initial="string.ascii_letters,string.digits" />
+        </sanitizer>
+        <yield/>
+    </xml>
+    <xml name="sanitizer_resids">
+        <sanitizer invalid_char="">
+            <valid initial="string.digits" />
+        </sanitizer>
+        <yield/>
+    </xml>
+    <xml name="tests_inputs">
+        <param name="trajin" value="test.dcd" ftype="dcd" />
+        <param name="strin" value="test.pdb" ftype="pdb" />
+        <yield/>
+    </xml>
+    <xml name="tests_inputs_gmx">
+        <param name="trajin" value="test.xtc" ftype="xtc" />
+        <param name="strin" value="test.gro" ftype="gro" />
+        <yield/>
+    </xml>
+    <xml name="citations">
+        <citations>
+            <citation type="doi">10.1093/bioinformatics/btz107</citation>
+            <citation type="doi">10.1002/jcc.21787</citation>
+            <yield/>
+        </citations>
+    </xml>
+</macros>
b
diff -r 000000000000 -r 743bd6aa3c7a pca_cosine.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pca_cosine.py Mon Aug 24 16:41:41 2020 -0400
[
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+
+import argparse
+import csv
+import sys
+
+import MDAnalysis as mda
+import MDAnalysis.analysis.pca as pca
+
+import numpy as np
+
+
+def parse_command_line(argv):
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--itraj', help='input traj')
+    parser.add_argument('--istr', help='input str')
+    parser.add_argument('--itrajext', help='input traj ext')
+    parser.add_argument('--istrext', help='input str ext')
+    parser.add_argument('--icomponents', help='number of principle components')
+    parser.add_argument('--iindex', help='index of the PC')
+    parser.add_argument('--output', help='output')
+    parser.add_argument('--cosout', help='cosine output')
+    return parser.parse_args()
+
+
+args = parse_command_line(sys.argv)
+
+u = mda.Universe(args.istr, args.itraj,
+                 topology_format=args.istrext, format=args.itrajext)
+
+components = int(args.icomponents)
+pca_index = int(args.iindex)
+
+PSF_pca = pca.PCA(u, select='backbone')
+PSF_pca.run()
+n_pcs = np.where(PSF_pca.cumulated_variance > 0.95)[0][0]
+atomgroup = u.select_atoms('backbone')
+
+pca_space = PSF_pca.transform(atomgroup, n_components=components)
+cosine = mda.analysis.pca.cosine_content(pca_space, pca_index)
+
+PCA = list(pca_space)
+
+with open(args.output, 'w') as f:
+    writer = csv.writer(f, delimiter='\t')
+    writer.writerows(PCA)
+
+with open(args.cosout, 'w') as f1:
+    f1.write(str(cosine))
b
diff -r 000000000000 -r 743bd6aa3c7a ramachandran_auto_protein.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ramachandran_auto_protein.py Mon Aug 24 16:41:41 2020 -0400
[
@@ -0,0 +1,163 @@
+#!/usr/bin/env python
+
+import argparse
+import base64
+import importlib
+import sys
+
+import MDAnalysis as mda
+from MDAnalysis.analysis.dihedrals import Ramachandran
+
+import h5py
+
+from jinja2 import Environment, FileSystemLoader
+
+import matplotlib
+import matplotlib.pyplot as plt
+import matplotlib.ticker as ticker
+
+import numpy as np
+import numpy.linalg
+
+import seaborn as sns
+
+
+matplotlib.use('Agg')  # noqa
+
+
+def parse_command_line(argv):
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--itraj', help='input traj')
+    parser.add_argument('--istr', help='input str')
+    parser.add_argument('--itrajext', help='input traj ext')
+    parser.add_argument('--istrext', help='input str ext')
+    parser.add_argument('--isegid1', help='segid 1')
+    parser.add_argument('--iresid1', help='resid start')
+    parser.add_argument('--iresid2', help='resid end')
+    parser.add_argument('--iresname', help='resname e.g. ALA')
+    parser.add_argument('--igroupby', help='groupby names or ids')
+    parser.add_argument('--itemplatepath', help='template path')
+    parser.add_argument('--o_plot1', help='MDA Ramachandran plot')
+    parser.add_argument('--o_plot2', help='Seaborn Ramachandran plot')
+    parser.add_argument('--o_data1', help='Timeseries in HDF5 format')
+    parser.add_argument('--o_html1', help='Html overview output of all plots')
+    return parser.parse_args()
+
+
+args = parse_command_line(sys.argv)
+
+currentpath = "."
+if args.itemplatepath is not None:
+    currentpath = args.itemplatepath
+
+
+u = mda.Universe(args.istr, args.itraj,
+                 topology_format=args.istrext, format=args.itrajext)
+selection = "(segid %s)" % \
+    (args.isegid1)
+
+if args.iresname is not None:
+    selection = "(segid %s and resname %s)" % \
+        (args.isegid1, args.iresname)
+
+if args.iresid1 is not None and args.iresid2 is not None:
+    assert(int(args.iresid1) > 0), "ResID numbering starts at 1 for this tool."
+    assert(int(args.iresid2) > 0), "ResID numbering starts at 1 for this tool."
+    assert(int(args.iresid2) > int(args.iresid1)
+           ), "ResID2 must be at least ResID1+1"
+    selection = "(segid %s and resid %s-%s)" % \
+        (args.isegid1, int(args.iresid1), int(args.iresid2))
+    if args.iresname is not None:
+        selection = "(segid %s and resid %s-%s and resname %s)" % \
+            (args.isegid1, int(args.iresid1), int(args.iresid2), args.iresname)
+
+r = u.select_atoms(selection)
+
+assert(r != u.select_atoms('name thiscannotpossiblyexist')
+       ), \
+               """The selection you specified returns an empty result.
+               Check segment names and residue ID's. Also check the
+                structure and trajectory file selected are the correct ones"""
+
+if args.igroupby is not None:
+    group_selections = {}  # dictionary of selections
+    if args.igroupby == 'name':
+        groupby = sorted(list(set(r.resnames)))
+        for e in groupby:
+            s = r & u.select_atoms("resname %s" % e)
+            this_sel = "%s and resname %s" % (selection, e)
+            group_selections[this_sel] = s
+    elif args.igroupby == 'id':
+        groupby = sorted(list(set(r.resids)))
+        for e in groupby:
+            s = r & u.select_atoms("resid %s" % e)
+            this_sel = "%s and resid %s" % (selection, e)
+            group_selections[this_sel] = s
+    else:
+        assert False, ("Invalid argument for igroupby. "
+                       "Only name and id are valid options.")
+
+
+def ramachandran_plot(atomgroup, selection, outputfile1, outputfile2,
+                      image_format='png'):
+    # plot standard mdanalysis and seaborn 2D with kde
+    R = Ramachandran(atomgroup).run()
+    fig, ax = plt.subplots(figsize=plt.figaspect(1))
+    R.plot(ax=ax, color='k', marker='.', ref=True)
+
+    a = R.angles.reshape(np.prod(R.angles.shape[:2]), 2)
+    # open hdf file
+    with h5py.File(args.o_data1, 'a') as f:
+        setname = "%s" % (selection)
+        f["/" + setname + "/ramachandran/phi"] = a[:, 0]
+        f["/" + setname + "/ramachandran/psi"] = a[:, 1]
+    plt.tight_layout()
+    # svg is better but sticking with png for now
+    plt.savefig(outputfile1, format=image_format)
+
+    sns.reset_defaults()
+    importlib.reload(plt)
+    importlib.reload(sns)
+    with sns.axes_style("white"):
+        h = sns.jointplot(x=a[:, 0], y=a[:, 1],
+                          kind="kde", space=0)
+        h.set_axis_labels(r'$\phi$ (deg)', r'$\psi$ (deg)')
+        h.ax_joint.set_xlim(-180, 180)
+        h.ax_joint.set_ylim(-180, 180)
+        h.ax_joint.xaxis.set_major_locator(ticker.MultipleLocator(60))
+        h.ax_joint.yaxis.set_major_locator(ticker.MultipleLocator(60))
+        plt.savefig(outputfile2, format=image_format, bbox_inches='tight')
+
+
+def get_base64_encoded_image(image_path):
+    """  encode image to string for use in html later"""
+    with open(image_path, "rb") as img_file:
+        return base64.b64encode(img_file.read()).decode('utf-8')
+
+
+plots = []
+if args.igroupby is not None:
+    for k, v in group_selections.items():
+        print(k, v)
+        try:
+            ramachandran_plot(v, str(k), "ramachandran1" +
+                              str(k), "ramachandran2" + str(k))
+            plots.append({'Name': "%s" % (k), 'plot1':
+                         get_base64_encoded_image("ramachandran1" + str(k)),
+                         'plot2': get_base64_encoded_image("ramachandran2"
+                          + str(k))})
+        except Exception as einstance:
+            print(type(einstance))
+            print(einstance.args)
+            print(einstance)
+
+ramachandran_plot(r, selection, args.o_plot1, args.o_plot2)
+plots.insert(0, {'Name': selection, 'plot1': get_base64_encoded_image(
+    args.o_plot1), 'plot2': get_base64_encoded_image(args.o_plot2)})
+
+template_environment = Environment(loader=FileSystemLoader(
+    currentpath), lstrip_blocks=True, trim_blocks=True)
+template = template_environment.get_template(
+    'ramachandran_auto_protein_html.j2')
+with open(args.o_html1, 'w+') as f:
+    f.write(template.render(title="Ramachandran Plots", plots=plots))
b
diff -r 000000000000 -r 743bd6aa3c7a ramachandran_auto_protein_html.j2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ramachandran_auto_protein_html.j2 Mon Aug 24 16:41:41 2020 -0400
[
@@ -0,0 +1,25 @@
+<html>
+
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+  <title>{{ title }}</title>
+</head>
+
+<body>
+  <table>
+    <tr>
+      <th>Selection</th>
+      <th>Ramachandran scatter plot</th>
+      <th>Ramachandran histogram </th>
+    </tr>
+    {% for plot in plots %}
+    <tr>
+      <td>{{ plot['Name'] }}</td>
+      <td style="vertical-align:center"><img src="data:image/png;base64,{{plot['plot1']}}" /> </td>
+      <td style="vertical-align:center"><img src="data:image/png;base64,{{plot['plot2']}}" /> </td>
+    </tr>
+    {% endfor %}
+  </table>
+</body>
+
+</html>
b
diff -r 000000000000 -r 743bd6aa3c7a ramachandran_plots.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ramachandran_plots.py Mon Aug 24 16:41:41 2020 -0400
[
@@ -0,0 +1,112 @@
+#!/usr/bin/env python
+
+import argparse
+import csv
+import sys
+from collections import namedtuple
+
+import MDAnalysis as mda
+from MDAnalysis.lib.distances import calc_dihedrals
+
+import matplotlib
+import matplotlib.pyplot as plt
+import matplotlib.ticker as ticker
+
+
+import numpy as np
+
+import seaborn as sns
+
+
+import yaml
+
+matplotlib.use('Agg')  # noqa
+
+
+def parse_command_line(argv):
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--itraj', help='input traj')
+    parser.add_argument('--istr', help='input str')
+    parser.add_argument('--itrajext', help='input traj ext')
+    parser.add_argument('--istrext', help='input str ext')
+    parser.add_argument('--iyml', help='input in yml format')
+    parser.add_argument('--output', help='output')
+    parser.add_argument('--oramachandran_plot', help='dihedral plot')
+    return parser.parse_args()
+
+
+args = parse_command_line(sys.argv)
+
+with open(args.iyml) as file:
+    params = yaml.load(file, Loader=yaml.FullLoader)
+
+Dihedral = namedtuple(
+    'Dihedral', ['atom1', 'atom2', 'atom3', 'atom4'])
+
+for k, v in params.items():
+    for a in ['phi', 'psi']:
+        assert (a in v), "Key %s is missing in inputs: %s " % (a, k)
+        atoms = []
+        for b in ['atom1', 'atom2', 'atom3', 'atom4']:
+            assert (b in v[a]), "Key %s is missing in inputs: %s %s" % (
+                b, k, a)
+            for c in ['segid', 'resid', 'name']:
+                assert (c in v[a][b]), \
+                        "Key %s is missing in inputs: %s %s %s " % (c, k, a, b)
+            atoms.append("(segid %s and resid %s and name %s)" %
+                         (v[a][b]['segid'], v[a][b]['resid'], v[a][b]['name']))
+        print(atoms)
+        if a == 'phi':
+            dihe_phi = Dihedral(atoms[0], atoms[1], atoms[2], atoms[3])
+        if a == 'psi':
+            dihe_psi = Dihedral(atoms[0], atoms[1], atoms[2], atoms[3])
+
+# order of dihedral atom is the crystallographic definition
+# (see glycanstructure.org)
+
+assert(dihe_phi), "phi dihedral doesn't exist"
+assert(dihe_psi), "psi dihedral doesn't exist"
+
+
+def calc_torsion(dihedral):
+    """atom 1 -4 are valid atom selections. torsion in degrees is returned"""
+    A = u.select_atoms(dihedral.atom1).positions
+    B = u.select_atoms(dihedral.atom2).positions
+    C = u.select_atoms(dihedral.atom3).positions
+    D = u.select_atoms(dihedral.atom4).positions
+
+    dihe = calc_dihedrals(A, B, C, D)
+    return np.rad2deg(dihe)
+
+
+u = mda.Universe(args.istr, args.itraj,
+                 topology_format=args.istrext, format=args.itrajext)
+
+phi_trajdata = np.array(
+    [(u.trajectory.frame, calc_torsion(dihe_phi)) for ts in u.trajectory])
+psi_trajdata = np.array(
+    [(u.trajectory.frame, calc_torsion(dihe_psi)) for ts in u.trajectory])
+
+print(phi_trajdata, psi_trajdata)
+
+phi_frame, phi_series = phi_trajdata.T
+psi_frame, psi_series = psi_trajdata.T
+
+phi_series = np.concatenate(phi_series, axis=0)
+psi_series = np.concatenate(psi_series, axis=0)
+
+zip(phi_frame, phi_series, psi_series)
+
+with open(args.output, 'w') as f:
+    writer = csv.writer(f, delimiter='\t')
+    writer.writerows(zip(phi_frame, phi_series, psi_series))
+
+with sns.axes_style("white"):
+    h = sns.jointplot(x=phi_series, y=psi_series,
+                      kind="kde", space=0, legend=True)
+    h.set_axis_labels(r'$\phi$ (degrees)', r'$\psi$ (degrees)')
+    h.ax_joint.set_xlim(-180, 180)
+    h.ax_joint.set_ylim(-180, 180)
+    h.ax_joint.xaxis.set_major_locator(ticker.MultipleLocator(60))
+    h.ax_joint.yaxis.set_major_locator(ticker.MultipleLocator(60))
+    plt.savefig(args.oramachandran_plot, format='png', bbox_inches='tight')
b
diff -r 000000000000 -r 743bd6aa3c7a rdf.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/rdf.py Mon Aug 24 16:41:41 2020 -0400
[
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+
+import argparse
+import csv
+import sys
+
+import MDAnalysis as mda
+from MDAnalysis.analysis.rdf import InterRDF
+
+import matplotlib
+import matplotlib.pyplot as plt
+
+import numpy as np
+
+matplotlib.use('Agg')  # noqa
+
+
+def parse_command_line(argv):
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--itraj', help='input traj')
+    parser.add_argument('--istr', help='input str')
+    parser.add_argument('--itrajext', help='input traj ext')
+    parser.add_argument('--istrext', help='input str ext')
+    parser.add_argument('--isegid1', help='segid 1')
+    parser.add_argument('--iresid1', help='resid 1')
+    parser.add_argument('--iname1', help='name 1')
+    parser.add_argument('--isegid2', help='segid 2')
+    parser.add_argument('--iresid2', help='resid 2')
+    parser.add_argument('--iname2', help='name 2')
+    parser.add_argument('--inbins', help='Number of bins in the histogram')
+    parser.add_argument('--istart', help='Starting Point')
+    parser.add_argument('--iend', help='End point')
+    parser.add_argument('--output', help='output')
+    parser.add_argument('--ordf_plot', help='RDF plot')
+    return parser.parse_args()
+
+
+args = parse_command_line(sys.argv)
+
+atom1 = "(segid %s and resid %s and name %s)" % \
+    (args.isegid1, args.iresid1, args.iname1)
+atom2 = "(segid %s and resid %s and name %s)" % \
+    (args.isegid2, args.iresid2, args.iname2)
+bins = int(args.inbins)
+start = float(args.istart)
+end = float(args.iend)
+
+u = mda.Universe(args.istr, args.itraj,
+                 topology_format=args.istrext, format=args.itrajext)
+x = u.select_atoms(atom1)
+y = u.select_atoms(atom2)
+
+rdf = InterRDF(x, y, nbins=bins, range=(start, end))
+rdf.run()
+bins = rdf.bins
+bins = np.around(bins, decimals=3)
+RDF = rdf.rdf
+zip(bins, RDF)
+
+with open(args.output, 'w') as f:
+    writer = csv.writer(f, delimiter='\t')
+    writer.writerows(zip(bins, RDF))
+
+with open(args.output) as f:
+    g = [xtmp.strip() for xtmp in f]
+    data = [tuple(map(float, xtmp.split())) for xtmp in g[0:]]
+    time = [xtmp[0] for xtmp in data]
+    rdf = [xtmp[1] for xtmp in data]
+    plt.plot(time, rdf)
+    plt.xlabel(r'r ($\AA$)')
+    plt.ylabel('g(r)')
+    plt.savefig(args.ordf_plot, format='png')
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/Angle_Analysis_Plot.png
b
Binary file test-data/Angle_Analysis_Plot.png has changed
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/Angle_Analysis_raw_data.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Angle_Analysis_raw_data.tabular Mon Aug 24 16:41:41 2020 -0400
b
@@ -0,0 +1,15 @@
+0.0 70.84919180880273
+1.0 70.97155495136695
+2.0 70.37097279938007
+3.0 70.12692388497567
+4.0 71.15946406922332
+5.0 71.91362565497833
+6.0 71.91268728348935
+7.0 71.97418402125982
+8.0 72.1521609490865
+9.0 72.3083065219282
+10.0 71.5291313235259
+11.0 81.56576116363512
+12.0 73.46330915394758
+13.0 67.04185741201445
+14.0 70.0710549275429
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/Dihedral_Analysis_Plot.png
b
Binary file test-data/Dihedral_Analysis_Plot.png has changed
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/Dihedral_analysis_raw_data.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Dihedral_analysis_raw_data.tabular Mon Aug 24 16:41:41 2020 -0400
b
@@ -0,0 +1,15 @@
+0 -61.75347431106646
+1 -63.57940223575045
+2 -64.3468375822089
+3 -64.2932006449013
+4 -66.17815780069928
+5 -64.57418410935712
+6 -63.95470182210953
+7 -63.215898370961455
+8 -63.05227933072821
+9 -63.350881174296354
+10 -64.12889787645014
+11 -59.11099982465991
+12 -76.10678081593274
+13 -74.55530125465415
+14 -71.01850912317343
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/Distance_Analysis_Plot.png
b
Binary file test-data/Distance_Analysis_Plot.png has changed
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/Distance_Analysis_raw_data.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Distance_Analysis_raw_data.tabular Mon Aug 24 16:41:41 2020 -0400
b
@@ -0,0 +1,15 @@
+0  3.8900816
+1  3.7835152
+2  3.7693398
+3  3.7851014
+4  3.6331043
+5  3.6525042
+6  3.684632
+7  3.7285593
+8  3.7090275
+9  3.6880326
+10  3.7261977
+11  3.4300115
+12  3.3902843
+13  3.3456264
+14  3.2583153
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/RDF_Analysis_Plot.png
b
Binary file test-data/RDF_Analysis_Plot.png has changed
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/RDF_raw_data.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/RDF_raw_data.tabular Mon Aug 24 16:41:41 2020 -0400
b
@@ -0,0 +1,100 @@
+0.025 0.0
+0.075 0.0
+0.125 0.0
+0.175 0.0
+0.225 0.0
+0.275 0.0
+0.325 0.0
+0.375 0.0
+0.425 0.0
+0.475 0.0
+0.525 0.0
+0.575 0.0
+0.625 0.0
+0.675 0.0
+0.725 0.0
+0.775 0.0
+0.825 0.0
+0.875 0.0
+0.925 0.0
+0.975 0.0
+1.025 0.0
+1.075 0.0
+1.125 0.0
+1.175 0.0
+1.225 0.0
+1.275 0.0
+1.325 0.0
+1.375 0.0
+1.425 0.0
+1.475 0.0
+1.525 0.0
+1.575 0.0
+1.625 0.0
+1.675 0.0
+1.725 0.0
+1.775 0.0
+1.825 0.0
+1.875 0.0
+1.925 0.0
+1.975 0.0
+2.025 0.0
+2.075 0.0
+2.125 0.0
+2.175 0.0
+2.225 0.0
+2.275 0.0
+2.325 0.0
+2.375 0.0
+2.425 0.0
+2.475 0.0
+2.525 0.0
+2.575 0.0
+2.625 0.0
+2.675 0.0
+2.725 0.0
+2.775 0.0
+2.825 0.0
+2.875 0.0
+2.925 0.0
+2.975 0.0
+3.025 0.0
+3.075 0.0
+3.125 0.0
+3.175 0.0
+3.225 0.0
+3.275 6336.434022284689
+3.325 6147.300995012225
+3.375 5966.511251797981
+3.425 5793.58118212878
+3.475 0.0
+3.525 0.0
+3.575 0.0
+3.625 5171.934954710286
+3.675 15096.484661102078
+3.725 14693.935913907942
+3.775 14307.27600154838
+3.825 0.0
+3.875 4526.124773895681
+3.925 0.0
+3.975 0.0
+4.025 0.0
+4.075 0.0
+4.125 0.0
+4.175 0.0
+4.225 0.0
+4.275 0.0
+4.325 0.0
+4.375 0.0
+4.425 0.0
+4.475 0.0
+4.525 0.0
+4.575 0.0
+4.625 0.0
+4.675 0.0
+4.725 0.0
+4.775 0.0
+4.825 0.0
+4.875 0.0
+4.925 0.0
+4.975 0.0
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/Ramachandran_Plot_raw_data.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Ramachandran_Plot_raw_data.tabular Mon Aug 24 16:41:41 2020 -0400
b
@@ -0,0 +1,15 @@
+0 -144.50369390751567 97.28315803510958
+1 -140.8182020539229 98.03359173250509
+2 -140.72994628351444 97.24540656140032
+3 -139.74848490172678 96.50804547826581
+4 -134.87886646306 95.11565955448816
+5 -133.72523437825183 98.27907111162767
+6 -132.95986510869454 98.00598700434969
+7 -132.83978048218802 97.90284983563569
+8 -132.446606581017 97.95362964393432
+9 -132.8171707044048 98.22639981540117
+10 -129.18708154562577 93.19031937895272
+11 -138.70826130463465 99.35902431554985
+12 -134.31372026825582 86.39732109628024
+13 -135.62845675103858 89.17557531169159
+14 -151.1966272020228 101.09732806451846
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/Ramachandran_Plot_raw_data_gmx.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Ramachandran_Plot_raw_data_gmx.tabular Mon Aug 24 16:41:41 2020 -0400
b
@@ -0,0 +1,15 @@
+0 -144.6049403672638 97.68547741778757
+1 -141.28378752267525 97.77436430526272
+2 -140.5507581701893 96.64897577753301
+3 -139.80360840706982 96.77167935748881
+4 -134.73236008867292 95.35031471736332
+5 -133.2788812847167 97.90764978970712
+6 -132.85758534848696 97.74270020478778
+7 -132.92861986639113 98.03936669749623
+8 -132.36160579612704 97.75307833579126
+9 -133.24942867028537 98.47767719548273
+10 -129.07281864740457 93.50325320406353
+11 -138.52555276641212 98.65922847590556
+12 -134.17197735904452 86.3334209333448
+13 -135.7743412592041 89.34890663035344
+14 -151.15173106037906 101.47282449338631
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/list1.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/list1.txt Mon Aug 24 16:41:41 2020 -0400
b
@@ -0,0 +1,1 @@
+resid 212 and name OE2
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/list2.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/list2.txt Mon Aug 24 16:41:41 2020 -0400
b
@@ -0,0 +1,1 @@
+resid 3 and name C1
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/test.dcd
b
Binary file test-data/test.dcd has changed
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/test.gro
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/test.gro Mon Aug 24 16:41:41 2020 -0400
b
b'@@ -0,0 +1,61652 @@\n+Glycine aRginine prOline Methionine Alanine Cystine Serine\n+61649\n+    2SER      N    1   2.371   0.440   0.529\n+    2SER    HT1    2   2.277   0.401   0.505\n+    2SER    HT2    3   2.399   0.406   0.623\n+    2SER    HT3    4   2.441   0.402   0.461\n+    2SER     CA    5   2.369   0.591   0.523\n+    2SER     HA    6   2.305   0.626   0.603\n+    2SER     CB    7   2.513   0.648   0.547\n+    2SER    HB1    8   2.550   0.611   0.645\n+    2SER    HB2    9   2.511   0.759   0.552\n+    2SER     OG   10   2.603   0.606   0.444\n+    2SER    HG1   11   2.693   0.638   0.465\n+    2SER      C   12   2.309   0.645   0.394\n+    2SER      O   13   2.229   0.574   0.331\n+    3ALA      N   14   2.342   0.767   0.352\n+    3ALA     HN   15   2.411   0.824   0.396\n+    3ALA     CA   16   2.294   0.828   0.229\n+    3ALA     HA   17   2.242   0.755   0.168\n+    3ALA     CB   18   2.201   0.948   0.258\n+    3ALA    HB1   19   2.251   1.022   0.324\n+    3ALA    HB2   20   2.109   0.913   0.308\n+    3ALA    HB3   21   2.172   0.998   0.164\n+    3ALA      C   22   2.415   0.875   0.151\n+    3ALA      O   23   2.517   0.908   0.207\n+    4CYS      N   24   2.401   0.875   0.017\n+    4CYS     HN   25   2.314   0.848  -0.026\n+    4CYS     CA   26   2.503   0.915  -0.077\n+    4CYS     HA   27   2.577   0.976  -0.027\n+    4CYS     CB   28   2.570   0.795  -0.148\n+    4CYS    HB1   29   2.626   0.829  -0.238\n+    4CYS    HB2   30   2.491   0.726  -0.185\n+    4CYS     SG   31   2.689   0.708  -0.041\n+    4CYS      C   32   2.434   1.003  -0.177\n+    4CYS      O   33   2.310   1.011  -0.185\n+    5THR      N   34   2.513   1.082  -0.251\n+    5THR     HN   35   2.612   1.073  -0.243\n+    5THR     CA   36   2.463   1.189  -0.334\n+    5THR     HA   37   2.359   1.168  -0.361\n+    5THR     CB   38   2.471   1.327  -0.267\n+    5THR     HB   39   2.436   1.406  -0.337\n+    5THR    OG1   40   2.605   1.358  -0.227\n+    5THR    HG1   41   2.654   1.352  -0.310\n+    5THR    CG2   42   2.379   1.330  -0.145\n+    5THR   HG21   43   2.413   1.259  -0.066\n+    5THR   HG22   44   2.276   1.300  -0.175\n+    5THR   HG23   45   2.375   1.431  -0.100\n+    5THR      C   46   2.539   1.190  -0.465\n+    5THR      O   47   2.581   1.296  -0.511\n+    6LEU      N   48   2.559   1.072  -0.527\n+    6LEU     HN   49   2.522   0.985  -0.489\n+    6LEU     CA   50   2.613   1.064  -0.662\n+    6LEU     HA   51   2.693   1.135  -0.673\n+    6LEU     CB   52   2.664   0.921  -0.694\n+    6LEU    HB1   53   2.704   0.919  -0.798\n+    6LEU    HB2   54   2.578   0.850  -0.687\n+    6LEU     CG   55   2.774   0.867  -0.600\n+    6LEU     HG   56   2.733   0.865  -0.496\n+    6LEU    CD1   57   2.810   0.722  -0.638\n+    6LEU   HD11   58   2.849   0.716  -0.741\n+    6LEU   HD12   59   2.718   0.658  -0.631\n+    6LEU   HD13   60   2.885   0.680  -0.568\n+    6LEU    CD2   61   2.900   0.954  -0.602\n+    6LEU   HD21   62   2.877   1.056  -0.564\n+    6LEU   HD22   63   2.939   0.964  -0.705\n+    6LEU   HD23   64   2.979   0.910  -0.538\n+    6LEU      C   65   2.505   1.102  -0.763\n+    6LEU      O   66   2.529   1.158  -0.868\n+    7GLN      N   67   2.378   1.075  -0.725\n+    7GLN     HN   68   2.357   1.024  -0.641\n+    7GLN     CA   69   2.262   1.113  -0.801\n+    7GLN     HA   70   2.291   1.166  -0.890\n+    7GLN     CB   71   2.178   0.990  -0.840\n+    7GLN    HB1   72   2.098   1.021  -0.910\n+    7GLN    HB2   73   2.128   0.948  -0.749\n+    7GLN     CG   74   2.265   0.878  -0.901\n+    7GLN    HG1   75   2.333   0.834  -0.825\n+    7GLN    HG2   76   2.327   0.921  -0.984\n+    7GLN     CD   77   2.181   0.767  -0.962\n+    7GLN    OE1   78   2.190   0.744  -1.082\n+    7GLN    NE2   79   2.097   0.701  -0.879\n+    7GLN   HE21   80   2.085   0.731  -0.785\n+    7GLN   HE22   81   2.035   0.634  -0.921\n+    7GLN      C   82   2.183   1.207  -0.712\n+    7GLN      O   83   2.176   1.194  -0.590\n+    8SER      N   84   2.125   1.313  -0.770\n+    8SER     HN   85   2.120   1.326  -0.868\n+ '..b'68   1.454\n+   42SOD    SOD61564  -0.047   2.795  -1.594\n+   43SOD    SOD61565  -3.119   1.785  -0.175\n+   44SOD    SOD61566   3.692   3.565   2.568\n+   45SOD    SOD61567   1.160  -2.677   0.405\n+   46SOD    SOD61568   2.182   2.098  -4.358\n+   47SOD    SOD61569   2.499  -3.552   3.622\n+   48SOD    SOD61570  -3.150   2.637   2.545\n+   49SOD    SOD61571  -3.611  -1.369  -0.304\n+   50SOD    SOD61572   3.179   4.217  -1.914\n+   51SOD    SOD61573  -1.544   3.385   3.985\n+   52SOD    SOD61574   3.906   3.226   3.286\n+   53SOD    SOD61575  -1.400   1.258  -2.542\n+   54SOD    SOD61576   0.624   4.043   2.421\n+   55SOD    SOD61577  -0.572  -3.952   2.807\n+   56SOD    SOD61578  -2.287   2.496  -1.486\n+   57SOD    SOD61579  -4.296  -1.353   4.117\n+   58SOD    SOD61580   4.009   2.333  -1.543\n+   59SOD    SOD61581   3.981   3.781  -3.393\n+   60SOD    SOD61582  -2.801  -0.902   2.131\n+   61SOD    SOD61583   0.054   2.141  -3.123\n+   62SOD    SOD61584   1.742  -1.695  -3.684\n+   63SOD    SOD61585  -1.328   3.677   3.172\n+   64SOD    SOD61586   2.023  -1.550   1.871\n+   65SOD    SOD61587  -3.781   1.811   2.706\n+   66SOD    SOD61588  -1.564   0.724   2.624\n+   67SOD    SOD61589  -1.457  -1.438   1.916\n+   68SOD    SOD61590   3.938  -1.495  -0.104\n+   69SOD    SOD61591  -4.177   0.685  -3.156\n+   70SOD    SOD61592  -3.475  -2.557   3.364\n+   71SOD    SOD61593   3.843  -1.704   1.945\n+   72SOD    SOD61594  -3.065   1.131  -3.142\n+   73SOD    SOD61595   2.911   3.091   3.254\n+   74SOD    SOD61596  -0.146  -3.447  -3.468\n+   75SOD    SOD61597   4.142   1.150   2.128\n+    1CLA    CLA61598   3.723   3.931  -0.432\n+    2CLA    CLA61599   0.598  -3.410  -1.411\n+    3CLA    CLA61600   0.305  -4.033   0.027\n+    4CLA    CLA61601  -2.918  -1.991  -2.129\n+    5CLA    CLA61602   3.212   2.681  -1.461\n+    6CLA    CLA61603  -1.276   3.890   3.970\n+    7CLA    CLA61604  -4.135  -0.631  -2.109\n+    8CLA    CLA61605  -4.010   1.992   2.188\n+    9CLA    CLA61606  -3.787  -1.064  -2.665\n+   10CLA    CLA61607  -2.251   4.155   1.278\n+   11CLA    CLA61608   3.522   3.373  -3.509\n+   12CLA    CLA61609  -4.010   0.565  -0.240\n+   13CLA    CLA61610   3.902  -1.240  -4.037\n+   14CLA    CLA61611   1.826  -3.945   2.374\n+   15CLA    CLA61612   0.618   4.143  -3.510\n+   16CLA    CLA61613   2.436   1.511   3.939\n+   17CLA    CLA61614   0.689   2.163  -1.864\n+   18CLA    CLA61615   2.174   0.614   3.695\n+   19CLA    CLA61616   3.731  -0.836   3.639\n+   20CLA    CLA61617  -0.300  -2.083   2.310\n+   21CLA    CLA61618   0.286   1.863  -2.782\n+   22CLA    CLA61619   0.444  -1.592   4.280\n+   23CLA    CLA61620  -3.682  -0.965   2.751\n+   24CLA    CLA61621   3.059  -2.653  -1.385\n+   25CLA    CLA61622   0.268   1.480   3.096\n+   26CLA    CLA61623   2.985  -1.145  -1.289\n+   27CLA    CLA61624   4.257  -1.638   3.915\n+   28CLA    CLA61625   2.109   2.268   2.707\n+   29CLA    CLA61626   3.148   2.184  -0.946\n+   30CLA    CLA61627  -4.279   3.311  -4.200\n+   31CLA    CLA61628   4.121   2.646   2.804\n+   32CLA    CLA61629   3.133  -2.321   3.087\n+   33CLA    CLA61630  -1.188   2.475   1.768\n+   34CLA    CLA61631   4.251   4.197   2.967\n+   35CLA    CLA61632  -2.115  -2.591   4.099\n+   36CLA    CLA61633  -1.664   3.340  -2.049\n+   37CLA    CLA61634   2.401   1.685   0.376\n+   38CLA    CLA61635  -0.304  -2.623  -0.695\n+   39CLA    CLA61636  -2.524  -2.953  -1.453\n+   40CLA    CLA61637   3.494  -2.888  -3.669\n+   41CLA    CLA61638  -3.591  -0.671   0.327\n+   42CLA    CLA61639  -3.097   0.461  -3.295\n+   43CLA    CLA61640  -0.581   1.524   4.242\n+   44CLA    CLA61641   3.940   1.881  -1.383\n+   45CLA    CLA61642  -1.581   2.921  -3.738\n+   46CLA    CLA61643   0.009  -3.649  -3.486\n+   47CLA    CLA61644  -1.288  -4.010   3.837\n+   48CLA    CLA61645  -2.419   1.919   3.696\n+   49CLA    CLA61646   1.622  -1.819  -2.941\n+   50CLA    CLA61647   3.465  -0.771  -3.287\n+   51CLA    CLA61648  -2.032  -3.900   0.685\n+   52CLA    CLA61649  -2.845   0.061  -2.584\n+   0.00000   0.00000   0.00000\n'
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/test.pdb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/test.pdb Mon Aug 24 16:41:41 2020 -0400
b
b'@@ -0,0 +1,61655 @@\n+REMARK  FILENAME: MINIMIZE.INP                                                        \n+REMARK  PURPOSE:  SETUP PERIODIC BOUNDARY CONDITIONS AND ENERGY MINIMIZATION          \n+REMARK  AUTHOR:   THARINDU SENAPATHI                                                  \n+REMARK   DATE:     9/25/18     11:16:58      CREATED BY USER: galaxy                  \n+ATOM      1  N   SER     2      23.711   4.396   5.292  1.00  0.00      PRO \n+ATOM      2  HT1 SER     2      22.774   4.012   5.048  1.00  0.00      PRO \n+ATOM      3  HT2 SER     2      23.993   4.056   6.233  1.00  0.00      PRO \n+ATOM      4  HT3 SER     2      24.412   4.016   4.606  1.00  0.00      PRO \n+ATOM      5  CA  SER     2      23.692   5.909   5.232  1.00  0.00      PRO \n+ATOM      6  HA  SER     2      23.045   6.255   6.026  1.00  0.00      PRO \n+ATOM      7  CB  SER     2      25.129   6.479   5.468  1.00  0.00      PRO \n+ATOM      8  HB1 SER     2      25.502   6.112   6.451  1.00  0.00      PRO \n+ATOM      9  HB2 SER     2      25.108   7.590   5.522  1.00  0.00      PRO \n+ATOM     10  OG  SER     2      26.032   6.062   4.445  1.00  0.00      PRO \n+ATOM     11  HG1 SER     2      26.928   6.382   4.649  1.00  0.00      PRO \n+ATOM     12  C   SER     2      23.087   6.445   3.945  1.00  0.00      PRO \n+ATOM     13  O   SER     2      22.287   5.741   3.315  1.00  0.00      PRO \n+ATOM     14  N   ALA     3      23.417   7.674   3.515  1.00  0.00      PRO \n+ATOM     15  HN  ALA     3      24.112   8.236   3.961  1.00  0.00      PRO \n+ATOM     16  CA  ALA     3      22.937   8.280   2.293  1.00  0.00      PRO \n+ATOM     17  HA  ALA     3      22.421   7.554   1.681  1.00  0.00      PRO \n+ATOM     18  CB  ALA     3      22.012   9.476   2.583  1.00  0.00      PRO \n+ATOM     19  HB1 ALA     3      22.509  10.220   3.241  1.00  0.00      PRO \n+ATOM     20  HB2 ALA     3      21.086   9.125   3.082  1.00  0.00      PRO \n+ATOM     21  HB3 ALA     3      21.718   9.984   1.638  1.00  0.00      PRO \n+ATOM     22  C   ALA     3      24.147   8.753   1.509  1.00  0.00      PRO \n+ATOM     23  O   ALA     3      25.174   9.077   2.073  1.00  0.00      PRO \n+ATOM     24  N   CYS     4      24.005   8.749   0.169  1.00  0.00      PRO \n+ATOM     25  HN  CYS     4      23.142   8.478  -0.258  1.00  0.00      PRO \n+ATOM     26  CA  CYS     4      25.025   9.149  -0.766  1.00  0.00      PRO \n+ATOM     27  HA  CYS     4      25.769   9.761  -0.272  1.00  0.00      PRO \n+ATOM     28  CB  CYS     4      25.700   7.948  -1.484  1.00  0.00      PRO \n+ATOM     29  HB1 CYS     4      26.256   8.290  -2.382  1.00  0.00      PRO \n+ATOM     30  HB2 CYS     4      24.907   7.257  -1.851  1.00  0.00      PRO \n+ATOM     31  SG  CYS     4      26.887   7.076  -0.411  1.00  0.00      PRO \n+ATOM     32  C   CYS     4      24.341  10.034  -1.774  1.00  0.00      PRO \n+ATOM     33  O   CYS     4      23.104  10.106  -1.853  1.00  0.00      PRO \n+ATOM     34  N   THR     5      25.135  10.817  -2.507  1.00  0.00      PRO \n+ATOM     35  HN  THR     5      26.125  10.731  -2.426  1.00  0.00      PRO \n+ATOM     36  CA  THR     5      24.625  11.886  -3.343  1.00  0.00      PRO \n+ATOM     37  HA  THR     5      23.595  11.683  -3.608  1.00  0.00      PRO \n+ATOM     38  CB  THR     5      24.715  13.266  -2.674  1.00  0.00      PRO \n+ATOM     39  HB  THR     5      24.358  14.060  -3.371  1.00  0.00      PRO \n+ATOM     40  OG1 THR     5      26.051  13.580  -2.272  1.00  0.00      PRO \n+ATOM     41  HG1 THR     5      26.535  13.523  -3.104  1.00  0.00      PRO \n+ATOM     42  CG2 THR     5      23.787  13.298  -1.447  1.00  0.00      PRO \n+ATOM     43 HG21 THR     5      24.126  12.589  -0.663  1.00  0.00      PRO \n+ATOM     44 HG22 THR     5      22.759  13.003  -1.749  1.00  0.00      PRO \n+ATOM     45 HG23 THR     5      23.752  14.313  -1.003  1.00  0.00      PRO \n+ATOM     46  C   THR     5      25.385  11.902  -4.645  1.00  0.00      PRO \n+ATOM     47  O   THR     5      25.810'..b' CLA CLA     2       5.975 -34.097 -14.115  1.00  0.00      CLA \n+ATOM  61600  CLA CLA     3       3.049 -40.330   0.268  1.00  0.00      CLA \n+ATOM  61601  CLA CLA     4     -29.182 -19.908 -21.287  1.00  0.00      CLA \n+ATOM  61602  CLA CLA     5      32.119  26.809 -14.613  1.00  0.00      CLA \n+ATOM  61603  CLA CLA     6     -12.762  38.902  39.703  1.00  0.00      CLA \n+ATOM  61604  CLA CLA     7     -41.352  -6.310 -21.092  1.00  0.00      CLA \n+ATOM  61605  CLA CLA     8     -40.105  19.915  21.883  1.00  0.00      CLA \n+ATOM  61606  CLA CLA     9     -37.875 -10.640 -26.651  1.00  0.00      CLA \n+ATOM  61607  CLA CLA    10     -22.511  41.548  12.784  1.00  0.00      CLA \n+ATOM  61608  CLA CLA    11      35.216  33.731 -35.093  1.00  0.00      CLA \n+ATOM  61609  CLA CLA    12     -40.102   5.647  -2.397  1.00  0.00      CLA \n+ATOM  61610  CLA CLA    13      39.024 -12.398 -40.371  1.00  0.00      CLA \n+ATOM  61611  CLA CLA    14      18.261 -39.450  23.742  1.00  0.00      CLA \n+ATOM  61612  CLA CLA    15       6.178  41.435 -35.101  1.00  0.00      CLA \n+ATOM  61613  CLA CLA    16      24.358  15.109  39.388  1.00  0.00      CLA \n+ATOM  61614  CLA CLA    17       6.888  21.632 -18.643  1.00  0.00      CLA \n+ATOM  61615  CLA CLA    18      21.744   6.136  36.952  1.00  0.00      CLA \n+ATOM  61616  CLA CLA    19      37.313  -8.363  36.386  1.00  0.00      CLA \n+ATOM  61617  CLA CLA    20      -2.999 -20.832  23.104  1.00  0.00      CLA \n+ATOM  61618  CLA CLA    21       2.857  18.626 -27.815  1.00  0.00      CLA \n+ATOM  61619  CLA CLA    22       4.436 -15.917  42.798  1.00  0.00      CLA \n+ATOM  61620  CLA CLA    23     -36.824  -9.651  27.515  1.00  0.00      CLA \n+ATOM  61621  CLA CLA    24      30.595 -26.534 -13.854  1.00  0.00      CLA \n+ATOM  61622  CLA CLA    25       2.683  14.798  30.965  1.00  0.00      CLA \n+ATOM  61623  CLA CLA    26      29.848 -11.446 -12.895  1.00  0.00      CLA \n+ATOM  61624  CLA CLA    27      42.574 -16.385  39.148  1.00  0.00      CLA \n+ATOM  61625  CLA CLA    28      21.090  22.680  27.072  1.00  0.00      CLA \n+ATOM  61626  CLA CLA    29      31.477  21.841  -9.460  1.00  0.00      CLA \n+ATOM  61627  CLA CLA    30     -42.789  33.106 -42.003  1.00  0.00      CLA \n+ATOM  61628  CLA CLA    31      41.212  26.460  28.038  1.00  0.00      CLA \n+ATOM  61629  CLA CLA    32      31.330 -23.211  30.873  1.00  0.00      CLA \n+ATOM  61630  CLA CLA    33     -11.882  24.746  17.676  1.00  0.00      CLA \n+ATOM  61631  CLA CLA    34      42.509  41.966  29.673  1.00  0.00      CLA \n+ATOM  61632  CLA CLA    35     -21.155 -25.909  40.988  1.00  0.00      CLA \n+ATOM  61633  CLA CLA    36     -16.645  33.397 -20.493  1.00  0.00      CLA \n+ATOM  61634  CLA CLA    37      24.008  16.848   3.761  1.00  0.00      CLA \n+ATOM  61635  CLA CLA    38      -3.042 -26.229  -6.954  1.00  0.00      CLA \n+ATOM  61636  CLA CLA    39     -25.242 -29.525 -14.531  1.00  0.00      CLA \n+ATOM  61637  CLA CLA    40      34.942 -28.883 -36.691  1.00  0.00      CLA \n+ATOM  61638  CLA CLA    41     -35.913  -6.707   3.266  1.00  0.00      CLA \n+ATOM  61639  CLA CLA    42     -30.968   4.607 -32.953  1.00  0.00      CLA \n+ATOM  61640  CLA CLA    43      -5.809  15.242  42.418  1.00  0.00      CLA \n+ATOM  61641  CLA CLA    44      39.399  18.809 -13.827  1.00  0.00      CLA \n+ATOM  61642  CLA CLA    45     -15.805  29.210 -37.376  1.00  0.00      CLA \n+ATOM  61643  CLA CLA    46       0.091 -36.491 -34.859  1.00  0.00      CLA \n+ATOM  61644  CLA CLA    47     -12.875 -40.099  38.366  1.00  0.00      CLA \n+ATOM  61645  CLA CLA    48     -24.191  19.188  36.959  1.00  0.00      CLA \n+ATOM  61646  CLA CLA    49      16.215 -18.186 -29.406  1.00  0.00      CLA \n+ATOM  61647  CLA CLA    50      34.647  -7.708 -32.869  1.00  0.00      CLA \n+ATOM  61648  CLA CLA    51     -20.320 -38.996   6.847  1.00  0.00      CLA \n+ATOM  61649  CLA CLA    52     -28.453   0.614 -25.838  1.00  0.00      CLA \n+TER   61650      CLA     52\n+END\n'
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/test.xtc
b
Binary file test-data/test.xtc has changed
b
diff -r 000000000000 -r 743bd6aa3c7a test-data/test.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/test.yml Mon Aug 24 16:41:41 2020 -0400
b
@@ -0,0 +1,36 @@
+ramachandran1:
+  phi:
+    atom1:
+     segid: HET
+     resid: 3
+     name: O5
+    atom2:
+     segid: HET
+     resid: 3
+     name: C1
+    atom3:
+     segid: HET
+     resid: 2
+     name: O4
+    atom4:
+     segid: HET
+     resid: 2
+     name: C4
+  psi:
+    atom1:
+     segid: HET
+     resid: 3
+     name: C1
+    atom2:
+     segid: HET
+     resid: 2
+     name: O4
+    atom3:
+     segid: HET
+     resid: 2
+     name: C4
+    atom4:
+     segid: HET
+     resid: 2
+     name: C5
+  comment: pick visually using VMD using labels. Go to labels, dihedral to see the information about resname resid and atomname and then lookup the segname for ach atom.