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

Changeset 0:0f270722aca6 (2020-08-24)
Next changeset 1:631b2a62d500 (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
hbonds.py
macros.xml
pca_cosine.py
ramachandran_auto_protein.py
ramachandran_auto_protein.xml
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 0f270722aca6 angle.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/angle.py Mon Aug 24 16:27:56 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 0f270722aca6 dihedrals.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dihedrals.py Mon Aug 24 16:27:56 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 0f270722aca6 distance_multiple.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/distance_multiple.py Mon Aug 24 16:27:56 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 0f270722aca6 distance_single.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/distance_single.py Mon Aug 24 16:27:56 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 0f270722aca6 end-to-end.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/end-to-end.py Mon Aug 24 16:27:56 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 0f270722aca6 extract_rmsd.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/extract_rmsd.py Mon Aug 24 16:27:56 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 0f270722aca6 hbonds.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hbonds.py Mon Aug 24 16:27:56 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 0f270722aca6 macros.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/macros.xml Mon Aug 24 16:27:56 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 0f270722aca6 pca_cosine.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pca_cosine.py Mon Aug 24 16:27:56 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 0f270722aca6 ramachandran_auto_protein.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ramachandran_auto_protein.py Mon Aug 24 16:27:56 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 0f270722aca6 ramachandran_auto_protein.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ramachandran_auto_protein.xml Mon Aug 24 16:27:56 2020 -0400
[
@@ -0,0 +1,127 @@
+<tool id="mdanalysis_ramachandran_protein" name="Ramachandran Analysis" version="@TOOL_VERSION@+galaxy@GALAXY_VERSION@">
+    <description>- Ramachandran plot for proteins</description>
+    <macros>
+        <import>macros.xml</import>
+        <token name="@GALAXY_VERSION@">0</token>
+    </macros>
+    <expand macro="requirements">
+        <requirement type="package" version="0.10.0">seaborn</requirement>
+        <requirement type="package" version="2.10.0">h5py</requirement>
+        <requirement type="package" version="2.11.1">jinja2</requirement>
+    </expand>
+    <command detect_errors="exit_code"><![CDATA[
+        python '$__tool_directory__/ramachandran_auto_protein.py'
+            --itraj '$trajin'
+            --istr '$strin'
+            --itrajext '$trajin.ext'
+            --istrext '$strin.ext'
+            --isegid1 '$segid1'
+            #if $resid1 and $resid2:
+                --iresid1 '$resid1'
+                --iresid2 '$resid2'
+            #end if
+            #if $resname:
+                --iresname '$resname'
+            #end if
+            --itemplatepath '$__tool_directory__'
+            #if $groupby:
+                --igroupby '$groupby'
+            #end if
+            --o_plot1 '$o_plot1'
+            --o_plot2 '$o_plot2'
+            --o_data1 '$o_data1'
+            --o_html1 '$o_html1'
+        2>&1
+]]></command>
+    <inputs>
+        <expand macro="analysis_inputs" />
+        <param name="segid1" type="text" value="PROA" label="Segment ID of the protein" help="A valid segment ID selection for the current molecular system">
+            <validator type="regex" message="Maximum of 8 characters allowed.">^[a-zA-Z0-9]{1,8}$</validator>
+        </param>
+        <param name="groupby" type="select" optional="true" label="Groupby analysis" help="Optional, create a groupby of the selection using residue name or id">
+            <option value="name">ResidueName</option>
+            <option value="id">ResidueID</option>
+        </param>
+        <param name="resname" optional="true" type="text" label="Residue Name" help="Optional, choose a residue name to refine the selection, e.g. ALA">
+            <validator type="regex" message="Maximum of 8 characters allowed.">^[a-zA-Z0-9]{1,8}$</validator>
+        </param>
+        <param name="resid1" optional="true" type="text" label="start Residue ID" help="Optional, choose a residue ID to refine the selection, e.g. 5">
+            <validator type="regex" message="Maximum of 6 digits allowed.">^[0-9]{1,6}$</validator>
+        </param>
+        <param name="resid2" optional="true" type="text" label="end Residue ID" help="Optional, choose a residue ID to refine the selection, e.g. 10">
+            <validator type="regex" message="Maximum of 6 digits allowed.">^[0-9]{1,6}$</validator>
+        </param>
+    </inputs>
+    <outputs>
+        <data format="png" name="o_plot1" label="MDAnalysis Ramachandran plot" />
+        <data format="png" name="o_plot2" label="Seaborn Ramachandran plot" />
+        <data format="h5" name="o_data1" label="Ramachandran in HDF5 format" />
+        <data format="html" name="o_html1" label="Ramachandran plot summary" />
+    </outputs>
+    <tests>
+        <test>
+            <param name="trajin" value="test.dcd" ftype="dcd" />
+            <param name="strin" value="test.pdb" ftype="pdb" />
+            <param name="segid1" value="PRO" />
+            <param name="groupby" value="name" />
+            <output name="o_html1">
+                <assert_contents>
+                    <has_text text="table" />
+                    <has_text text="(segid PRO) and resname MET" />
+                    <has_text text="(segid PRO) and resname VAL" />
+                </assert_contents>
+            </output>
+            <output name="o_plot1">
+                <assert_contents>
+                    <has_size value="53682" delta="3000" />
+                </assert_contents>
+            </output>
+            <output name="o_plot2">
+                <assert_contents>
+                    <has_size value="31740" delta="3000" />
+                </assert_contents>
+            </output>
+            <output name="o_data1">
+                <assert_contents>
+                    <has_size value="293824" delta="3000" />
+                </assert_contents>
+            </output>
+        </test>
+    </tests>
+    <help><![CDATA[
+.. class:: infomark
+
+**What it does**
+
+Creates a Ramachandran plot for proteins. All protein [φ,ψ] angles for a given segment ID are automatically selected for an entire trajectory and an averaged Ramachandran plot is returned. Optionally the selection can be refined by residue ID or residue name. Optionally the average Ramachandran plot can be deconvoluted and returned grouped by residue name or residue ID.
+
+
+_____
+
+
+.. class:: infomark
+
+**Input**
+
+       - Structure file (PDB)
+       - Trajectory file (DCD).
+       - Segment ID
+       - Optionally: Group data by residue name or residue ID
+       - Optionally: refine selection by residue ID range or residue name (e.g. ALA)
+
+Note that a MDAnalysis 'segment' is a larger organizational unit, for example one protein or all the solvent molecules or simply the whole system.
+
+_____
+
+
+.. class:: infomark
+
+**Output**
+
+       - Image (as png) of the Ramachandran from MDanalyis with the allowed regions as a background.
+       - Image (as png) of the Ramachandran plot as a distribution.
+       - Data (H5 format). All phi, psi timeseries raw data in HDF5 format.
+       - All plot images tabulated (in html). To view the HTML in Galaxy this tool must be added to the allowlist by a Galaxy Admin.
+    ]]></help>
+    <expand macro="citations" />
+</tool>
b
diff -r 000000000000 -r 0f270722aca6 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:27:56 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 0f270722aca6 ramachandran_plots.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ramachandran_plots.py Mon Aug 24 16:27:56 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 0f270722aca6 rdf.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/rdf.py Mon Aug 24 16:27:56 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 0f270722aca6 test-data/Angle_Analysis_Plot.png
b
Binary file test-data/Angle_Analysis_Plot.png has changed
b
diff -r 000000000000 -r 0f270722aca6 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:27:56 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 0f270722aca6 test-data/Dihedral_Analysis_Plot.png
b
Binary file test-data/Dihedral_Analysis_Plot.png has changed
b
diff -r 000000000000 -r 0f270722aca6 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:27:56 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 0f270722aca6 test-data/Distance_Analysis_Plot.png
b
Binary file test-data/Distance_Analysis_Plot.png has changed
b
diff -r 000000000000 -r 0f270722aca6 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:27:56 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 0f270722aca6 test-data/RDF_Analysis_Plot.png
b
Binary file test-data/RDF_Analysis_Plot.png has changed
b
diff -r 000000000000 -r 0f270722aca6 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:27:56 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 0f270722aca6 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:27:56 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 0f270722aca6 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:27:56 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 0f270722aca6 test-data/list1.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/list1.txt Mon Aug 24 16:27:56 2020 -0400
b
@@ -0,0 +1,1 @@
+resid 212 and name OE2
b
diff -r 000000000000 -r 0f270722aca6 test-data/list2.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/list2.txt Mon Aug 24 16:27:56 2020 -0400
b
@@ -0,0 +1,1 @@
+resid 3 and name C1
b
diff -r 000000000000 -r 0f270722aca6 test-data/test.dcd
b
Binary file test-data/test.dcd has changed
b
diff -r 000000000000 -r 0f270722aca6 test-data/test.gro
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/test.gro Mon Aug 24 16:27:56 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 0f270722aca6 test-data/test.pdb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/test.pdb Mon Aug 24 16:27:56 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 0f270722aca6 test-data/test.xtc
b
Binary file test-data/test.xtc has changed
b
diff -r 000000000000 -r 0f270722aca6 test-data/test.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/test.yml Mon Aug 24 16:27:56 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.