Commit 0a4cc0cf authored by Studer Gabriel's avatar Studer Gabriel
Browse files

build models and model evaluation

parent 41838203
......@@ -7,6 +7,7 @@ The whole benchmark is a three step process:
3. Evaluation
Fetch Benchmark Set
-------------------
We suggest to use the already provided benchmark set as you need a running
SWISS-MODEL instance which is not publicly available. The steps are nevertheless
......@@ -17,19 +18,46 @@ documented here for internal reference.
Adapt the **eval_dir**, **start_date** and **end_date** variables in
fetch_cameo_targets.py and run the script:
`python fetch_cameo_targets.py`
- Templates, alignments and sequence profiles are fetched from SWISS-MODEL.
- Templates, alignments and sequence profiles are fetched from a SWISS-MODEL
server which was registered to CAMEO in the relevant time range and performed
template searches accordingly.
Adapt the **sm_project_dir** variable in fetch_templates.py and run the script
using the SWISS-MODEL executable:
`sm fetch_templates.py`
Modelling with ProMod3 and MODELLER
-----------------------------------
- Given a working ProMod3 installation (i.e. pm executable in your path),
you can execute build_promod_models.py with the ProMod3 executable and the
created models are saved in the promod_models directory.
`pm build_promod_models.py`
- You need your own MODELLER installation to build the according models. Make
sure that you can execute `from modeller import *` with your python
executable. build_modeller_models.py builds and saves models to the
modeller_models directory:
`python build_modeller_models.py`
Evaluation
----------
- You need to score all models using lDDT for the general model accuracy
as well as Molprobity to assess stereochemistry. Given a working ProMod3
installation, you also have a working ost executable to calculate lDDT.
The ost executable needs to be in your path.
The biggest challenge here is to get a working Molprobity installation
using the information on https://github.com/rlabduke/MolProbity. In case of
trouble, get in touch with the people from the Richardson Lab at Duke.
Alternatively, get in touch with the Schwede lab at the Biozentrum as they
can provide you a Singularity container running Molprobity.
Whatever your installation is, you need to adapt the command to call
Molprobity in score_models.py. Running score_models.py will fetch the models
in promod_models/modeller_models and evaluate them given the references in
cameo_benchmark. The results are dumped as
promod_scores.json/modeller_scores.json:
`python score_models.py`
- Plots and some key values based on the score json files are generated with:
`python do_plots.py`
import os
import time
from ost import io
from ost import seq
from modeller import *
from modeller.automodel import *
in_dir = 'cameo_benchmark'
out_dir = "modeller_models"
scratch_dir = "scratch"
if not os.path.exists(out_dir):
os.makedirs(out_dir)
if not os.path.exists(scratch_dir):
os.makedirs(scratch_dir)
targets = set([f[:6] for f in os.listdir(in_dir)])
# Calling MODELLER requires some preparation, e.g. prepare alignment in PIR
# format, cut alignment to avoid unrealistic terminal tails etc.
# What we're interested in is raw modelling time by MODELLER.
# This is returned by the ExecuteModeller function.
modelling_time = 0.0
def ExecuteModeller(aln, out_path, scratch_dir):
# we first go into the modeller_scratch directory as we need to dump some
# files
orig_cwd = os.getcwd()
os.chdir(scratch_dir)
tpl_view = aln.GetSequence(1).GetAttachedView()
# let's chop the alignment, so we enforce modelling of only the stretch
# covered by the template...
start_idx = None
start_rnum = 1
end_idx = None
for i, c in enumerate(aln):
if c[1] != "-":
start_idx = i
break
if c[0] != '-':
start_rnum += 1
for i in range(len(aln)):
current_idx = len(aln) - 1 - i
c = aln[current_idx]
if c[1] != "-":
end_idx = current_idx
break
target_seq = str(aln.GetSequence(0))[start_idx : end_idx + 1]
template_seq = str(aln.GetSequence(1))[start_idx : end_idx + 1]
target_seq = seq.CreateSequence("A", target_seq)
template_seq = seq.CreateSequence("A", template_seq)
template_seq.AttachView(tpl_view)
sub_aln = seq.CreateAlignment()
sub_aln.AddSequence(target_seq)
sub_aln.AddSequence(template_seq)
# write template and PIR alignment for MODELLER
io.SavePDB(tpl_view, "template.pdb")
with open("aln.ali", "w") as fh:
fh.write(">P1;template")
fh.write("\n")
temp = ["structureX", "template",
str(tpl_view.residues[0].GetNumber().GetNum()),
tpl_view.chains[0].GetName(),
str(tpl_view.residues[-1].GetNumber().GetNum()),
tpl_view.chains[0].GetName(), "undefined", "undefined", "-1.0",
"-1.0"]
fh.write(":".join(temp))
fh.write("\n")
fh.write(sub_aln.GetSequence(1).GetString())
fh.write("*")
fh.write("\n")
fh.write(">P1;target")
fh.write("\n")
temp = ["sequence", "target", str(1), "A",
str(len(sub_aln.GetSequence(0).GetGaplessString())), "A", " ",
" ", "0.0", "0.0"]
fh.write(":".join(temp))
fh.write("\n")
fh.write(sub_aln.GetSequence(0).GetString())
fh.write("*")
# GOGOGO
modelling_start_time = time.time()
env = environ()
a = automodel(env, alnfile="aln.ali", knowns="template", sequence="target")
a.starting_model = 1
a.ending_model = 1
a.make()
modeller_out = a.outputs[0]
modelling_time = time.time() - modelling_start_time
# the model requires renumbering to match the initial target sequence
model = io.LoadPDB(modeller_out["name"])
ed = model.EditXCS()
ed.RenumberChain(model.chains[0], start_rnum, True)
# go back to original working dir and dump model
os.chdir(orig_cwd)
io.SavePDB(model, out_path)
return modelling_time
for t in targets:
tpl_path = os.path.join(in_dir, t + "_tpl.pdb")
aln_path = os.path.join(in_dir, t + "_aln.fasta")
out_path = os.path.join(out_dir, t + ".pdb")
if os.path.exists(tpl_path) and os.path.exists(aln_path):
aln = io.LoadAlignment(aln_path)
template = io.LoadPDB(tpl_path).CreateFullView()
aln.AttachView(1, template)
modelling_time += ExecuteModeller(aln, out_path, scratch_dir)
print("full modelling time: ", modelling_time)
import os
import time
import subprocess
in_dir = 'cameo_benchmark'
out_dir = 'promod_models'
if not os.path.exists(out_dir):
os.makedirs(out_dir)
targets = set([f[:6] for f in os.listdir(in_dir)])
start_time = time.time()
for t in targets:
tpl_path = os.path.join(in_dir, t + "_tpl.pdb")
aln_path = os.path.join(in_dir, t + "_aln.fasta")
prof_path = os.path.join(in_dir, t + "_profile.hhm")
out_path = os.path.join(out_dir, t + ".pdb")
if os.path.exists(tpl_path) and os.path.exists(aln_path) and \
os.path.exists(prof_path):
cmd = ['pm', 'build-model', '-p', tpl_path, '-f', aln_path,
'-s', prof_path, '-o', out_path]
subprocess.run(cmd)
print("full modelling time: ", time.time() - start_time)
import matplotlib.pyplot as plt
import json
import numpy as np
promod_label = 'ProMod3'
modeller_label = 'Modeller'
promod_data_file = 'promod_scores.json'
modeller_data_file = 'modeller_scores.json'
hist_plot_name = 'promod3_vs_modeller_histplot.png'
molprobity_plot_name = 'promod3_vs_modeller_molprobity_scores.png'
cred = (128.0/255,0.0,0.0)
cblue = (102.0/255,153.0/255,204.0/255)
cgreen = (102.0/255,148.0/255,0.0)
cpurple = (100.0/255,0.0,200.0/255)
corange = (255.0/255,123.0/255,0.0)
with open(promod_data_file) as fh:
promod_data = json.load(fh)
with open(modeller_data_file) as fh:
modeller_data = json.load(fh)
lddt_values_promod = list()
lddt_values_modeller = list()
probity_values_promod = list()
probity_values_modeller = list()
lddt_diffs = list()
probity_diffs = list()
keys = list()
for key in promod_data:
if key in modeller_data:
lddt_values_promod.append(promod_data[key]['lddt'] * 100)
lddt_values_modeller.append(modeller_data[key]['lddt'] * 100)
lddt_diffs.append(lddt_values_promod[-1] - lddt_values_modeller[-1])
probity_values_promod.append(promod_data[key]['MolProbity score'])
probity_values_modeller.append(modeller_data[key]['MolProbity score'])
probity_diffs.append(probity_values_promod[-1] - probity_values_modeller[-1])
keys.append(key)
for a,b in zip(keys, lddt_diffs):
print(a,b)
# plot both in the same plot
xs = np.linspace(-7.0, 7.0, 300)
n_lddt, bins_lddt, patches_lddt = plt.hist(lddt_diffs, 50, range=(-7.0,7.0),
facecolor=cred, alpha=0.75,
label='lDDT score', linewidth=2.0, edgecolor='k')
n_probity, bins_probity, patches_probity = plt.hist(probity_diffs, 50,
range=(-7.0,7.0),
facecolor=cblue, alpha=0.75,
label='Molprobity score',
linewidth=2.0,
edgecolor='k')
plt.axvline(x=0.0, linewidth=2, color='k', linestyle='--')
plt.xlabel(r'$\Delta$ score (ProMod3 - Modeller)',fontsize='x-large')
plt.ylabel('N',fontsize='x-large')
plt.legend(frameon=False)
plt.savefig(hist_plot_name)
probity_clash_promod = list()
probity_clash_modeller = list()
probity_rotamer_outliers_promod = list()
probity_rotamer_outliers_modeller = list()
probity_ramachandran_outliers_promod = list()
probity_ramachandran_outliers_modeller = list()
keys = list()
for key in promod_data:
if key in modeller_data:
probity_clash_promod.append(promod_data[key]['Clashscore'])
probity_clash_modeller.append(modeller_data[key]['Clashscore'])
probity_rotamer_outliers_promod.append(promod_data[key]['Rotamer outliers'])
probity_rotamer_outliers_modeller.append(modeller_data[key]['Rotamer outliers'])
probity_ramachandran_outliers_promod.append(promod_data[key]['Ramachandran outliers'])
probity_ramachandran_outliers_modeller.append(modeller_data[key]['Ramachandran outliers'])
keys.append(key)
#plt.clf()
fig, axs = plt.subplots(2, 2)
probity_overall_ax = axs[0, 0]
probity_clash_ax = axs[0, 1]
probity_rotamer_ax = axs[1, 0]
probity_ramachandran_ax = axs[1, 1]
probity_overall_ax.plot(probity_values_promod, probity_values_modeller,'.', color = cred)
# plot zero line
probity_overall_ax.plot([0.0,5.0], [0.0,5.0], '.', color = 'k',linestyle='--')
probity_overall_ax.set_title('a) Overall Score', loc='left', y=1.05)
probity_overall_ax.set_xlabel(promod_label)
probity_overall_ax.set_ylabel(modeller_label)
probity_clash_ax.plot(probity_clash_promod, probity_clash_modeller,'.', color = cred)
# plot zero line
probity_clash_ax.plot([0.0,180.0], [0.0,180.0], color = 'k',linestyle='--')
probity_clash_ax.set_title('b) Clash Score', loc='left', y=1.05)
probity_clash_ax.set_xlabel(promod_label)
probity_clash_ax.set_ylabel(modeller_label)
probity_rotamer_ax.plot(probity_rotamer_outliers_promod, probity_rotamer_outliers_modeller,
'.', color = cred)
# plot zero line
probity_rotamer_ax.plot([0.0,20.0], [0.0,20.0], color = 'k',linestyle='--')
probity_rotamer_ax.set_title('c) Rotamer Outliers', loc='left', y=1.05)
probity_rotamer_ax.set_xlabel(promod_label)
probity_rotamer_ax.set_ylabel(modeller_label)
probity_ramachandran_ax.plot(probity_ramachandran_outliers_promod,
probity_ramachandran_outliers_modeller, '.', color = cred)
# plot zero line
probity_ramachandran_ax.plot([0.0,30.0], [0.0,30.0], color = 'k',linestyle='--')
probity_ramachandran_ax.set_title('d) Ramachandran Outliers', loc='left', y=1.05)
probity_ramachandran_ax.set_xlabel(promod_label)
probity_ramachandran_ax.set_ylabel(modeller_label)
plt.tight_layout(pad=1.2, h_pad=1.5, w_pad=1.5, rect=None)
plt.savefig(molprobity_plot_name)
print('avg. lddt value', promod_label, np.mean(lddt_values_promod))
print('avg. lddt value', modeller_label, np.mean(lddt_values_modeller))
print('diff avg lddt value',np.mean(lddt_values_promod)-np.mean(lddt_values_modeller))
print('avg. probity value', promod_label, np.mean(probity_values_promod))
print('avg. probity value', modeller_label, np.mean(probity_values_modeller))
print('diff avg probity value', np.mean(probity_values_promod)-np.mean(probity_values_modeller))
print('avg. Molprobity clash', promod_label, np.mean(probity_clash_promod))
print('avg. Molprobity clash', modeller_label, np.mean(probity_clash_modeller))
print('avg. Molprobity rotamer outliers', promod_label,
np.mean(probity_rotamer_outliers_promod))
print('avg. Molprobity rotamer outliers', modeller_label,
np.mean(probity_rotamer_outliers_modeller))
print('avg. Ramachandran outliers', promod_label,
np.mean(probity_ramachandran_outliers_promod))
print('avg. Ramachandran outliers', modeller_label,
np.mean(probity_ramachandran_outliers_modeller))
This diff is collapsed.
This diff is collapsed.
ATOM 1 N LEU 86 1.293 21.890 17.703 1.00139.59 N
ATOM 2 CA LEU 86 2.695 22.079 18.149 1.00139.59 C
ATOM 3 C LEU 86 3.628 21.873 17.002 1.00139.59 C
ATOM 4 O LEU 86 4.547 21.057 17.060 1.00139.59 O
ATOM 5 CB LEU 86 3.047 21.079 19.260 1.00139.59 C
ATOM 6 CG LEU 86 2.235 21.280 20.553 1.00139.59 C
ATOM 7 CD1 LEU 86 2.738 20.351 21.672 1.00139.59 C
ATOM 8 CD2 LEU 86 2.211 22.754 20.982 1.00139.59 C
ATOM 9 N ASP 87 3.385 22.618 15.912 1.00109.58 N
ATOM 10 CA ASP 87 4.162 22.593 14.705 1.00109.58 C
ATOM 11 C ASP 87 5.452 23.306 14.942 1.00109.58 C
ATOM 12 O ASP 87 6.411 23.150 14.188 1.00109.58 O
ATOM 13 CB ASP 87 3.504 23.328 13.525 1.00109.58 C
ATOM 14 CG ASP 87 3.535 24.821 13.819 1.00109.58 C
ATOM 15 OD1 ASP 87 3.080 25.232 14.918 1.00109.58 O
ATOM 16 OD2 ASP 87 4.055 25.570 12.949 1.00109.58 O
ATOM 17 N LEU 88 5.503 24.117 16.009 1.00157.46 N
ATOM 18 CA LEU 88 6.550 25.080 16.191 1.00157.46 C
ATOM 19 C LEU 88 7.933 24.516 16.145 1.00157.46 C
ATOM 20 O LEU 88 8.808 25.185 15.598 1.00157.46 O
ATOM 21 CB LEU 88 6.423 25.905 17.482 1.00157.46 C
ATOM 22 CG LEU 88 7.580 26.911 17.610 1.00157.46 C
ATOM 23 CD1 LEU 88 7.704 27.767 16.341 1.00157.46 C
ATOM 24 CD2 LEU 88 7.438 27.780 18.868 1.00157.46 C
ATOM 25 N LEU 89 8.211 23.330 16.733 1.00167.01 N
ATOM 26 CA LEU 89 9.566 22.860 16.611 1.00167.01 C
ATOM 27 C LEU 89 9.820 22.704 15.153 1.00167.01 C
ATOM 28 O LEU 89 10.728 23.322 14.606 1.00167.01 O
ATOM 29 CB LEU 89 9.791 21.486 17.260 1.00167.01 C
ATOM 30 CG LEU 89 9.720 21.506 18.793 1.00167.01 C
ATOM 31 CD1 LEU 89 8.369 22.043 19.288 1.00167.01 C
ATOM 32 CD2 LEU 89 10.057 20.120 19.371 1.00167.01 C
ATOM 33 N THR 90 8.973 21.892 14.506 1.00184.70 N
ATOM 34 CA THR 90 8.875 21.704 13.091 1.00184.70 C
ATOM 35 C THR 90 7.860 20.620 13.007 1.00184.70 C
ATOM 36 O THR 90 7.899 19.699 13.817 1.00184.70 O
ATOM 37 CB THR 90 10.079 21.150 12.368 1.00184.70 C
ATOM 38 OG1 THR 90 11.250 21.936 12.535 1.00184.70 O
ATOM 39 CG2 THR 90 9.691 21.144 10.881 1.00184.70 C
ATOM 40 N TYR 91 6.914 20.669 12.056 1.00 83.05 N
ATOM 41 CA TYR 91 6.020 19.554 12.080 1.00 83.05 C
ATOM 42 C TYR 91 6.834 18.370 11.668 1.00 83.05 C
ATOM 43 O TYR 91 6.771 17.300 12.272 1.00 83.05 O
ATOM 44 CB TYR 91 4.808 19.668 11.134 1.00 83.05 C
ATOM 45 CG TYR 91 3.920 18.541 11.538 1.00 83.05 C
ATOM 46 CD1 TYR 91 3.083 18.662 12.625 1.00 83.05 C
ATOM 47 CD2 TYR 91 3.937 17.355 10.846 1.00 83.05 C
ATOM 48 CE1 TYR 91 2.268 17.624 13.014 1.00 83.05 C
ATOM 49 CE2 TYR 91 3.125 16.310 11.225 1.00 83.05 C
ATOM 50 CZ TYR 91 2.287 16.446 12.308 1.00 83.05 C
ATOM 51 OH TYR 91 1.452 15.378 12.701 1.00 83.05 O
ATOM 52 N THR 92 7.673 18.575 10.639 1.00110.81 N
ATOM 53 CA THR 92 8.458 17.530 10.062 1.00110.81 C
ATOM 54 C THR 92 9.374 16.985 11.109 1.00110.81 C
ATOM 55 O THR 92 9.521 15.770 11.240 1.00110.81 O
ATOM 56 CB THR 92 9.317 18.016 8.927 1.00110.81 C
ATOM 57 OG1 THR 92 10.336 18.886 9.398 1.00110.81 O
ATOM 58 CG2 THR 92 8.412 18.769 7.939 1.00110.81 C
ATOM 59 N ASP 93 9.985 17.875 11.910 1.00 81.38 N
ATOM 60 CA ASP 93 10.987 17.460 12.847 1.00 81.38 C
ATOM 61 C ASP 93 10.416 16.515 13.859 1.00 81.38 C
ATOM 62 O ASP 93 11.023 15.486 14.159 1.00 81.38 O
ATOM 63 CB ASP 93 11.587 18.644 13.627 1.00 81.38 C
ATOM 64 CG ASP 93 12.904 18.154 14.205 1.00 81.38 C
ATOM 65 OD1 ASP 93 13.377 17.090 13.724 1.00 81.38 O
ATOM 66 OD2 ASP 93 13.468 18.836 15.103 1.00 81.38 O
ATOM 67 N LEU 94 9.222 16.825 14.401 1.00173.02 N
ATOM 68 CA LEU 94 8.676 16.039 15.473 1.00173.02 C
ATOM 69 C LEU 94 8.471 14.643 14.996 1.00173.02 C
ATOM 70 O LEU 94 8.971 13.680 15.578 1.00173.02 O
ATOM 71 CB LEU 94 7.269 16.508 15.893 1.00173.02 C
ATOM 72 CG LEU 94 7.172 17.993 16.286 1.00173.02 C
ATOM 73 CD1 LEU 94 5.787 18.314 16.880 1.00173.02 C
ATOM 74 CD2 LEU 94 8.340 18.413 17.189 1.00173.02 C
ATOM 75 N GLU 95 7.732 14.519 13.884 1.00111.62 N
ATOM 76 CA GLU 95 7.382 13.244 13.347 1.00111.62 C
ATOM 77 C GLU 95 8.595 12.556 12.830 1.00111.62 C
ATOM 78 O GLU 95 8.747 11.349 13.003 1.00111.62 O
ATOM 79 CB GLU 95 6.365 13.338 12.203 1.00111.62 C
ATOM 80 CG GLU 95 4.949 13.627 12.698 1.00111.62 C
ATOM 81 CD GLU 95 4.371 12.296 13.159 1.00111.62 C
ATOM 82 OE1 GLU 95 4.211 11.404 12.285 1.00111.62 O
ATOM 83 OE2 GLU 95 4.090 12.146 14.378 1.00111.62 O
ATOM 84 N SER 96 9.501 13.315 12.190 1.00 69.42 N
ATOM 85 CA SER 96 10.649 12.713 11.581 1.00 69.42 C
ATOM 86 C SER 96 11.468 12.046 12.634 1.00 69.42 C
ATOM 87 O SER 96 11.929 10.922 12.445 1.00 69.42 O
ATOM 88 CB SER 96 11.575 13.730 10.890 1.00 69.42 C
ATOM 89 OG SER 96 12.681 13.061 10.300 1.00 69.42 O
ATOM 90 N LEU 97 11.662 12.706 13.790 1.00 89.04 N
ATOM 91 CA LEU 97 12.534 12.132 14.769 1.00 89.04 C
ATOM 92 C LEU 97 11.983 10.823 15.232 1.00 89.04 C
ATOM 93 O LEU 97 12.672 9.810 15.173 1.00 89.04 O
ATOM 94 CB LEU 97 12.749 13.086 15.965 1.00 89.04 C
ATOM 95 CG LEU 97 13.672 12.582 17.097 1.00 89.04 C
ATOM 96 CD1 LEU 97 14.061 13.741 18.030 1.00 89.04 C
ATOM 97 CD2 LEU 97 13.040 11.436 17.903 1.00 89.04 C
ATOM 98 N ARG 98 10.706 10.793 15.658 1.00104.70 N
ATOM 99 CA ARG 98 10.179 9.558 16.159 1.00104.70 C
ATOM 100 C ARG 98 10.144 8.568 15.043 1.00104.70 C
ATOM 101 O ARG 98 10.507 7.405 15.216 1.00104.70 O
ATOM 102 CB ARG 98 8.732 9.658 16.675 1.00104.70 C
ATOM 103 CG ARG 98 8.539 10.576 17.879 1.00104.70 C
ATOM 104 CD ARG 98 7.126 10.488 18.457 1.00104.70 C
ATOM 105 NE ARG 98 7.207 9.895 19.823 1.00104.70 N
ATOM 106 CZ ARG 98 7.510 8.577 20.007 1.00104.70 C
ATOM 107 NH1 ARG 98 7.891 7.790 18.958 1.00104.70 N
ATOM 108 NH2 ARG 98 7.474 8.053 21.269 1.00104.70 N
ATOM 109 N ASN 99 9.725 9.036 13.853 1.00 79.63 N
ATOM 110 CA ASN 99 9.482 8.183 12.730 1.00 79.63 C
ATOM 111 C ASN 99 10.729 7.484 12.305 1.00 79.63 C
ATOM 112 O ASN 99 10.714 6.278 12.061 1.00 79.63 O
ATOM 113 CB ASN 99 8.939 8.964 11.520 1.00 79.63 C
ATOM 114 CG ASN 99 8.615 7.974 10.414 1.00 79.63 C
ATOM 115 OD1 ASN 99 7.515 7.434 10.345 1.00 79.63 O
ATOM 116 ND2 ASN 99 9.603 7.737 9.509 1.00 79.63 N
ATOM 117 N ARG 100 11.855 8.205 12.199 1.00116.70 N
ATOM 118 CA ARG 100 12.999 7.491 11.727 1.00116.70 C
ATOM 119 C ARG 100 14.238 8.017 12.429 1.00116.70 C
ATOM 120 O ARG 100 14.182 8.271 13.662 1.00116.70 O
ATOM 121 CB ARG 100 13.223 7.690 10.226 1.00116.70 C
ATOM 122 CG ARG 100 13.427 9.166 9.902 1.00116.70 C
ATOM 123 CD ARG 100 13.631 9.480 8.424 1.00116.70 C
ATOM 124 NE ARG 100 14.025 10.912 8.369 1.00116.70 N
ATOM 125 CZ ARG 100 15.325 11.248 8.607 1.00116.70 C
ATOM 126 NH1 ARG 100 16.249 10.263 8.822 1.00116.70 N
ATOM 127 NH2 ARG 100 15.697 12.559 8.642 1.00116.70 N
ATOM 128 OXT ARG 100 15.269 8.165 11.724 1.00116.70 O
TER 129 ARG 100
END
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment